Sun, 11 Feb 2024 18:35:44 +0100
Implemented (most) of the eric-ide server debugging functionality.
10539 | 1 | # -*- coding: utf-8 -*- |
2 | ||
3 | # Copyright (c) 2024 Detlev Offenbach <detlev@die-offenbachs.de> | |
4 | # | |
5 | ||
6 | """ | |
7 | Module implementing the file system request handler of the eric-ide server. | |
8 | """ | |
9 | ||
10546
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
10 | import base64 |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
11 | import contextlib |
10539 | 12 | import os |
13 | import stat | |
14 | import time | |
15 | ||
16 | from .EricRequestCategory import EricRequestCategory | |
17 | ||
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10555
diff
changeset
|
18 | |
10539 | 19 | class EricServerFileSystemRequestHandler: |
20 | """ | |
21 | Class implementing the file system request handler of the eric-ide server. | |
22 | """ | |
23 | ||
24 | def __init__(self, server): | |
25 | """ | |
26 | Constructor | |
27 | ||
28 | @param server reference to the eric-ide server object | |
29 | @type EricServer | |
30 | """ | |
31 | self.__server = server | |
10555
08e853c0c77b
Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
32 | |
10539 | 33 | self.__requestMethodMapping = { |
34 | "Chdir": self.__chdir, | |
35 | "Getcwd": self.__getcwd, | |
36 | "Listdir": self.__listdir, | |
37 | "Mkdir": self.__mkdir, | |
38 | "Rmdir": self.__rmdir, | |
39 | "Replace": self.__replace, | |
40 | "Remove": self.__remove, | |
10546
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
41 | "Stat": self.__stat, |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
42 | "Exists": self.__exists, |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
43 | "Access": self.__access, |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
44 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
45 | "ReadFile": self.__readFile, |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
46 | "WriteFile": self.__writeFile, |
10539 | 47 | } |
48 | ||
49 | def handleRequest(self, request, params, reqestUuid): | |
50 | """ | |
51 | Public method handling the received file system requests. | |
52 | ||
53 | @param request request name | |
54 | @type str | |
55 | @param params dictionary containing the request parameters | |
56 | @type dict | |
57 | @param reqestUuid UUID of the associated request as sent by the eric IDE | |
58 | @type str | |
59 | """ | |
60 | try: | |
61 | result = self.__requestMethodMapping[request](params) | |
62 | self.__server.sendJson( | |
63 | category=EricRequestCategory.FileSystem, | |
64 | reply=request, | |
65 | params=result, | |
66 | reqestUuid=reqestUuid, | |
67 | ) | |
68 | ||
69 | except KeyError: | |
70 | self.__server.sendJson( | |
71 | category=EricRequestCategory.FileSystem, | |
72 | reply=request, | |
73 | params={"Error": f"Request type '{request}' is not supported."}, | |
74 | ) | |
75 | ||
76 | def __chdir(self, params): | |
77 | """ | |
78 | Private method to change the current working directory. | |
79 | ||
80 | @param params dictionary containing the request data | |
81 | @type dict | |
82 | @return dictionary containing the reply data | |
83 | @rtype dict | |
84 | """ | |
85 | directory = params["directory"] | |
86 | try: | |
87 | os.chdir(directory) | |
88 | return {"ok": True} | |
89 | except OSError as err: | |
90 | return { | |
91 | "ok": False, | |
92 | "error": str(err), | |
93 | } | |
94 | ||
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10555
diff
changeset
|
95 | def __getcwd(self, params): # noqa: U100 |
10539 | 96 | """ |
97 | Private method to report the current working directory. | |
98 | ||
99 | @param params dictionary containing the request data | |
100 | @type dict | |
101 | @return dictionary containing the reply data | |
102 | @rtype dict | |
103 | """ | |
104 | return {"directory": os.getcwd()} | |
105 | ||
106 | def __listdir(self, params): | |
107 | """ | |
108 | Private method to report a directory listing. | |
109 | ||
110 | @param params dictionary containing the request data | |
111 | @type dict | |
112 | @return dictionary containing the reply data | |
113 | @rtype dict | |
114 | """ | |
115 | directory = params["directory"] | |
116 | if not directory: | |
117 | directory = os.getcwd() | |
118 | ||
10548
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
119 | try: |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
120 | listing = [] |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
121 | for dirEntry in os.scandir(directory): |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
122 | filestat = dirEntry.stat() |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
123 | entry = { |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
124 | "name": dirEntry.name, |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
125 | "path": dirEntry.path, |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
126 | "is_dir": dirEntry.is_dir(), |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
127 | "is_file": dirEntry.is_file(), |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
128 | "is_link": dirEntry.is_symlink(), |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
129 | "mode": filestat.st_mode, |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
130 | "mode_str": stat.filemode(filestat.st_mode), |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
131 | "size": filestat.st_size, |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
132 | "mtime": time.strftime( |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
133 | "%Y-%m-%d %H:%M:%S", time.localtime(filestat.st_mtime) |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
134 | ), |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
135 | } |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
136 | listing.append(entry) |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
137 | |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
138 | return { |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
139 | "ok": True, |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
140 | "directory": directory, |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
141 | "listing": listing, |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
142 | "separator": os.sep, |
10539 | 143 | } |
10548
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
144 | except OSError as err: |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
145 | return { |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
146 | "ok": False, |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
147 | "error": str(err), |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
148 | } |
10539 | 149 | |
10546
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
150 | def __stat(self, params): |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
151 | """ |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
152 | Private method to get the status of a file. |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
153 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
154 | @param params dictionary containing the request data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
155 | @type dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
156 | @return dictionary containing the reply data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
157 | @rtype dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
158 | """ |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
159 | filename = params["filename"] |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
160 | statItems = params["st_names"] |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
161 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
162 | try: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
163 | result = os.stat(filename) |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
164 | resultDict = {st: getattr(result, st) for st in statItems} |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
165 | return {"ok": True, "result": resultDict} |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
166 | except OSError as err: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
167 | return { |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
168 | "ok": False, |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
169 | "error": str(err), |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
170 | } |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
171 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
172 | def __exists(self, params): |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
173 | """ |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
174 | Private method to check if a file or directory of the given name exists. |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
175 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
176 | @param params dictionary containing the request data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
177 | @type dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
178 | @return dictionary containing the reply data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
179 | @rtype dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
180 | """ |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
181 | return {"exists": os.path.exists(params["name"])} |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
182 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
183 | def __access(self, params): |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
184 | """ |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
185 | Private method to test, if the eric-ide server has the given access rights |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
186 | to a file or directory.. |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
187 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
188 | @param params dictionary containing the request data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
189 | @type dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
190 | @return dictionary containing the reply data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
191 | @rtype dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
192 | """ |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
193 | mode = os.F_OK |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
194 | for modeStr in params["modes"]: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
195 | if modeStr == "read": |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
196 | mode |= os.R_OK |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
197 | elif modeStr == "write": |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
198 | mode |= os.W_OK |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
199 | elif modeStr == "execute": |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
200 | mode |= os.X_OK |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
201 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
202 | return {"ok": os.access(params["name"], mode)} |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
203 | |
10539 | 204 | def __mkdir(self, params): |
205 | """ | |
206 | Private method to create a new directory. | |
207 | ||
208 | @param params dictionary containing the request data | |
209 | @type dict | |
210 | @return dictionary containing the reply data | |
211 | @rtype dict | |
212 | """ | |
213 | directory = params["directory"] | |
214 | ||
215 | try: | |
216 | os.makedirs(directory) | |
217 | return {"ok": True} | |
218 | except OSError as err: | |
219 | return { | |
220 | "ok": False, | |
221 | "error": str(err), | |
222 | } | |
223 | ||
224 | def __rmdir(self, params): | |
225 | """ | |
226 | Private method to delete a directory. | |
227 | ||
228 | @param params dictionary containing the request data | |
229 | @type dict | |
230 | @return dictionary containing the reply data | |
231 | @rtype dict | |
232 | """ | |
233 | directory = params["directory"] | |
234 | ||
235 | try: | |
236 | os.rmdir(directory) | |
237 | return {"ok": True} | |
238 | except OSError as err: | |
239 | return { | |
240 | "ok": False, | |
241 | "error": str(err), | |
242 | } | |
243 | ||
244 | def __replace(self, params): | |
245 | """ | |
246 | Private method to replace (rename) a file or directory. | |
247 | ||
248 | ||
249 | @param params dictionary containing the request data | |
250 | @type dict | |
251 | @return dictionary containing the reply data | |
252 | @rtype dict | |
253 | """ | |
254 | oldName = params["old_name"] | |
255 | newName = params["new_name"] | |
256 | ||
257 | try: | |
258 | os.replace(oldName, newName) | |
259 | return {"ok": True} | |
260 | except OSError as err: | |
261 | return { | |
262 | "ok": False, | |
263 | "error": str(err), | |
264 | } | |
265 | ||
266 | def __remove(self, params): | |
267 | """ | |
10546
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
268 | Private method to delete a file. |
10539 | 269 | |
270 | @param params dictionary containing the request data | |
271 | @type dict | |
272 | @return dictionary containing the reply data | |
273 | @rtype dict | |
274 | """ | |
275 | filename = params["filename"] | |
276 | ||
277 | try: | |
278 | os.remove(filename) | |
279 | return {"ok": True} | |
280 | except OSError as err: | |
281 | return { | |
282 | "ok": False, | |
283 | "error": str(err), | |
284 | } | |
10546
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
285 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
286 | def __readFile(self, params): |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
287 | """ |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
288 | Private method to read the contents of a file. |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
289 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
290 | @param params dictionary containing the request data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
291 | @type dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
292 | @return dictionary containing the reply data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
293 | @rtype dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
294 | """ |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
295 | filename = params["filename"] |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
296 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
297 | if params["create"] and not os.path.exists(filename): |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
298 | with open(filename, "wb"): |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
299 | pass |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
300 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
301 | try: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
302 | with open(filename, "rb") as f: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
303 | data = f.read() |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
304 | return { |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
305 | "ok": True, |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
306 | "filedata": str(base64.b85encode(data), encoding="ascii") |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
307 | } |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
308 | except OSError as err: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
309 | return { |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
310 | "ok": False, |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
311 | "error": str(err), |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
312 | } |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
313 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
314 | def __writeFile(self, params): |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
315 | """ |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
316 | Private method to write data into a file. |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
317 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
318 | @param params dictionary containing the request data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
319 | @type dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
320 | @return dictionary containing the reply data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
321 | @rtype dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
322 | """ |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
323 | filename = params["filename"] |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
324 | data = base64.b85decode(bytes(params["filedata"], encoding="ascii")) |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
325 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
326 | # 1. create backup file if asked for |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
327 | if params["with_backup"]: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
328 | if os.path.islink(filename): |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
329 | filename = os.path.realpath(filename) |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
330 | backupFilename = "{0}~".format(filename) |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
331 | try: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
332 | permissions = os.stat(filename).st_mode |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
333 | perms_valid = True |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
334 | except OSError: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
335 | # if there was an error, ignore it |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
336 | perms_valid = False |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
337 | with contextlib.suppress(OSError): |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
338 | os.remove(backupFilename) |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
339 | with contextlib.suppress(OSError): |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
340 | os.rename(filename, backupFilename) |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
341 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
342 | # 2. write the data to the file and reset the permissions |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
343 | try: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
344 | with open(filename, "wb") as f: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
345 | f.write(data) |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
346 | if params["with_backup"] and perms_valid: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
347 | os.chmod(filename, permissions) |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
348 | return {"ok": True} |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
349 | except OSError as err: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
350 | return { |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
351 | "ok": False, |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
352 | "error": str(err), |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
353 | } |