Thu, 22 Feb 2024 16:34:43 +0100
Corrected a few formatting and style issues.
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 | ||
10576
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
16 | from eric7.SystemUtilities import FileSystemUtilities |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
17 | |
10539 | 18 | from .EricRequestCategory import EricRequestCategory |
19 | ||
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10555
diff
changeset
|
20 | |
10539 | 21 | class EricServerFileSystemRequestHandler: |
22 | """ | |
23 | Class implementing the file system request handler of the eric-ide server. | |
24 | """ | |
25 | ||
26 | def __init__(self, server): | |
27 | """ | |
28 | Constructor | |
29 | ||
30 | @param server reference to the eric-ide server object | |
31 | @type EricServer | |
32 | """ | |
33 | self.__server = server | |
10555
08e853c0c77b
Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
34 | |
10539 | 35 | self.__requestMethodMapping = { |
10584
a596cf392291
Adapted the Imports diagram to support the 'eric-ide' server.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10583
diff
changeset
|
36 | "GetPathSep": self.__getPathSeparator, |
10539 | 37 | "Chdir": self.__chdir, |
38 | "Getcwd": self.__getcwd, | |
39 | "Listdir": self.__listdir, | |
40 | "Mkdir": self.__mkdir, | |
10596
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
41 | "MakeDirs": self.__makedirs, |
10539 | 42 | "Rmdir": self.__rmdir, |
43 | "Replace": self.__replace, | |
44 | "Remove": self.__remove, | |
10546
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
45 | "Stat": self.__stat, |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
46 | "Exists": self.__exists, |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
47 | "Access": self.__access, |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
48 | "ReadFile": self.__readFile, |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
49 | "WriteFile": self.__writeFile, |
10576
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
50 | "DirEntries": self.__dirEntries, |
10539 | 51 | } |
52 | ||
53 | def handleRequest(self, request, params, reqestUuid): | |
54 | """ | |
55 | Public method handling the received file system requests. | |
56 | ||
57 | @param request request name | |
58 | @type str | |
59 | @param params dictionary containing the request parameters | |
60 | @type dict | |
61 | @param reqestUuid UUID of the associated request as sent by the eric IDE | |
62 | @type str | |
63 | """ | |
64 | try: | |
65 | result = self.__requestMethodMapping[request](params) | |
66 | self.__server.sendJson( | |
67 | category=EricRequestCategory.FileSystem, | |
68 | reply=request, | |
69 | params=result, | |
70 | reqestUuid=reqestUuid, | |
71 | ) | |
72 | ||
73 | except KeyError: | |
74 | self.__server.sendJson( | |
75 | category=EricRequestCategory.FileSystem, | |
76 | reply=request, | |
10596
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
77 | params={ |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
78 | "ok": False, |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
79 | "error": f"Request type '{request}' is not supported.", |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
80 | "info": list(self.__requestMethodMapping.keys()), |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
81 | }, |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
82 | reqestUuid=reqestUuid, |
10539 | 83 | ) |
84 | ||
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10596
diff
changeset
|
85 | def __getPathSeparator(self, params): # noqa: U100 |
10584
a596cf392291
Adapted the Imports diagram to support the 'eric-ide' server.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10583
diff
changeset
|
86 | """ |
a596cf392291
Adapted the Imports diagram to support the 'eric-ide' server.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10583
diff
changeset
|
87 | Private method to report the path separator. |
a596cf392291
Adapted the Imports diagram to support the 'eric-ide' server.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10583
diff
changeset
|
88 | |
a596cf392291
Adapted the Imports diagram to support the 'eric-ide' server.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10583
diff
changeset
|
89 | @param params dictionary containing the request data |
a596cf392291
Adapted the Imports diagram to support the 'eric-ide' server.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10583
diff
changeset
|
90 | @type dict |
a596cf392291
Adapted the Imports diagram to support the 'eric-ide' server.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10583
diff
changeset
|
91 | @return dictionary containing the reply data |
a596cf392291
Adapted the Imports diagram to support the 'eric-ide' server.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10583
diff
changeset
|
92 | @rtype dict |
a596cf392291
Adapted the Imports diagram to support the 'eric-ide' server.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10583
diff
changeset
|
93 | """ |
a596cf392291
Adapted the Imports diagram to support the 'eric-ide' server.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10583
diff
changeset
|
94 | return {"separator": os.sep} |
a596cf392291
Adapted the Imports diagram to support the 'eric-ide' server.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10583
diff
changeset
|
95 | |
10539 | 96 | def __chdir(self, params): |
97 | """ | |
98 | Private method to change the current working directory. | |
99 | ||
100 | @param params dictionary containing the request data | |
101 | @type dict | |
102 | @return dictionary containing the reply data | |
103 | @rtype dict | |
104 | """ | |
105 | try: | |
10596
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
106 | os.chdir(params["directory"]) |
10539 | 107 | return {"ok": True} |
108 | except OSError as err: | |
109 | return { | |
110 | "ok": False, | |
111 | "error": str(err), | |
112 | } | |
113 | ||
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10555
diff
changeset
|
114 | def __getcwd(self, params): # noqa: U100 |
10539 | 115 | """ |
116 | Private method to report the current working directory. | |
117 | ||
118 | @param params dictionary containing the request data | |
119 | @type dict | |
120 | @return dictionary containing the reply data | |
121 | @rtype dict | |
122 | """ | |
123 | return {"directory": os.getcwd()} | |
124 | ||
125 | def __listdir(self, params): | |
126 | """ | |
127 | Private method to report a directory listing. | |
128 | ||
129 | @param params dictionary containing the request data | |
130 | @type dict | |
131 | @return dictionary containing the reply data | |
132 | @rtype dict | |
133 | """ | |
134 | directory = params["directory"] | |
135 | if not directory: | |
136 | directory = os.getcwd() | |
137 | ||
10548
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
138 | try: |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
139 | listing = [] |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
140 | 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
|
141 | 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
|
142 | entry = { |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
143 | "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
|
144 | "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
|
145 | "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
|
146 | "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
|
147 | "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
|
148 | "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
|
149 | "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
|
150 | "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
|
151 | "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
|
152 | "%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
|
153 | ), |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
154 | } |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
155 | 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
|
156 | |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
157 | return { |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
158 | "ok": True, |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
159 | "directory": directory, |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
160 | "listing": listing, |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
161 | "separator": os.sep, |
10539 | 162 | } |
10548
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
163 | 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
|
164 | return { |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
165 | "ok": False, |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10546
diff
changeset
|
166 | "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
|
167 | } |
10539 | 168 | |
10546
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
169 | def __stat(self, params): |
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 | Private method to get the status of a file. |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
172 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
173 | @param params dictionary containing the request data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
174 | @type dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
175 | @return dictionary containing the reply data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
176 | @rtype dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
177 | """ |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
178 | try: |
10596
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
179 | result = os.stat(params["filename"]) |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
180 | resultDict = {st: getattr(result, st) for st in params["st_names"]} |
10546
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
181 | return {"ok": True, "result": resultDict} |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
182 | except OSError as err: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
183 | return { |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
184 | "ok": False, |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
185 | "error": str(err), |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
186 | } |
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 | def __exists(self, params): |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
189 | """ |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
190 | 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
|
191 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
192 | @param params dictionary containing the request data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
193 | @type dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
194 | @return dictionary containing the reply data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
195 | @rtype dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
196 | """ |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
197 | return {"exists": os.path.exists(params["name"])} |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
198 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
199 | def __access(self, params): |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
200 | """ |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
201 | 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
|
202 | to a file or directory.. |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
203 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
204 | @param params dictionary containing the request data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
205 | @type dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
206 | @return dictionary containing the reply data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
207 | @rtype dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
208 | """ |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
209 | mode = os.F_OK |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
210 | for modeStr in params["modes"]: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
211 | if modeStr == "read": |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
212 | mode |= os.R_OK |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
213 | elif modeStr == "write": |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
214 | mode |= os.W_OK |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
215 | elif modeStr == "execute": |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
216 | mode |= os.X_OK |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
217 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
218 | return {"ok": os.access(params["name"], mode)} |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
219 | |
10539 | 220 | def __mkdir(self, params): |
221 | """ | |
222 | Private method to create a new directory. | |
223 | ||
224 | @param params dictionary containing the request data | |
225 | @type dict | |
226 | @return dictionary containing the reply data | |
227 | @rtype dict | |
228 | """ | |
10596
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
229 | try: |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
230 | os.mkdir(params["directory"]) |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
231 | return {"ok": True} |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
232 | except OSError as err: |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
233 | return { |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
234 | "ok": False, |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
235 | "error": str(err), |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
236 | } |
10539 | 237 | |
10596
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
238 | def __makedirs(self, params): |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
239 | """ |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
240 | Private method to create a new directory. |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
241 | |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
242 | @param params dictionary containing the request data |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
243 | @type dict |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
244 | @return dictionary containing the reply data |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
245 | @rtype dict |
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
246 | """ |
10539 | 247 | try: |
10596
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
248 | os.makedirs(params["directory"], exist_ok=params["exist_ok"]) |
10539 | 249 | return {"ok": True} |
250 | except OSError as err: | |
251 | return { | |
252 | "ok": False, | |
253 | "error": str(err), | |
254 | } | |
255 | ||
256 | def __rmdir(self, params): | |
257 | """ | |
258 | Private method to delete a directory. | |
259 | ||
260 | @param params dictionary containing the request data | |
261 | @type dict | |
262 | @return dictionary containing the reply data | |
263 | @rtype dict | |
264 | """ | |
265 | try: | |
10596
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
266 | os.rmdir(params["directory"]) |
10539 | 267 | return {"ok": True} |
268 | except OSError as err: | |
269 | return { | |
270 | "ok": False, | |
271 | "error": str(err), | |
272 | } | |
273 | ||
274 | def __replace(self, params): | |
275 | """ | |
276 | Private method to replace (rename) a file or directory. | |
277 | ||
278 | ||
279 | @param params dictionary containing the request data | |
280 | @type dict | |
281 | @return dictionary containing the reply data | |
282 | @rtype dict | |
283 | """ | |
284 | try: | |
10596
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
285 | os.replace(params["old_name"], params["new_name"]) |
10539 | 286 | return {"ok": True} |
287 | except OSError as err: | |
288 | return { | |
289 | "ok": False, | |
290 | "error": str(err), | |
291 | } | |
292 | ||
293 | def __remove(self, params): | |
294 | """ | |
10546
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
295 | Private method to delete a file. |
10539 | 296 | |
297 | @param params dictionary containing the request data | |
298 | @type dict | |
299 | @return dictionary containing the reply data | |
300 | @rtype dict | |
301 | """ | |
302 | try: | |
10596
ea35c92a3c7c
Implemented first stage of remote project support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10584
diff
changeset
|
303 | os.remove(params["filename"]) |
10539 | 304 | return {"ok": True} |
305 | except OSError as err: | |
306 | return { | |
307 | "ok": False, | |
308 | "error": str(err), | |
309 | } | |
10546
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
310 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
311 | def __readFile(self, params): |
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 | Private method to read the contents of a file. |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
314 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
315 | @param params dictionary containing the request data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
316 | @type dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
317 | @return dictionary containing the reply data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
318 | @rtype dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
319 | """ |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
320 | filename = params["filename"] |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
321 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
322 | if params["create"] and not os.path.exists(filename): |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
323 | with open(filename, "wb"): |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
324 | pass |
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 | try: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
327 | with open(filename, "rb") as f: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
328 | data = f.read() |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
329 | return { |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
330 | "ok": True, |
10576
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
331 | "filedata": str(base64.b85encode(data), encoding="ascii"), |
10546
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
332 | } |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
333 | except OSError as err: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
334 | return { |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
335 | "ok": False, |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
336 | "error": str(err), |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
337 | } |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
338 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
339 | def __writeFile(self, params): |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
340 | """ |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
341 | Private method to write data into a file. |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
342 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
343 | @param params dictionary containing the request data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
344 | @type dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
345 | @return dictionary containing the reply data |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
346 | @rtype dict |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
347 | """ |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
348 | filename = params["filename"] |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
349 | data = base64.b85decode(bytes(params["filedata"], encoding="ascii")) |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
350 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
351 | # 1. create backup file if asked for |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
352 | if params["with_backup"]: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
353 | if os.path.islink(filename): |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
354 | filename = os.path.realpath(filename) |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
355 | backupFilename = "{0}~".format(filename) |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
356 | try: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
357 | permissions = os.stat(filename).st_mode |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
358 | perms_valid = True |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
359 | except OSError: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
360 | # if there was an error, ignore it |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
361 | perms_valid = False |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
362 | with contextlib.suppress(OSError): |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
363 | os.remove(backupFilename) |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
364 | with contextlib.suppress(OSError): |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
365 | os.rename(filename, backupFilename) |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
366 | |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
367 | # 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
|
368 | try: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
369 | with open(filename, "wb") as f: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
370 | f.write(data) |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
371 | if params["with_backup"] and perms_valid: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
372 | os.chmod(filename, permissions) |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
373 | return {"ok": True} |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
374 | except OSError as err: |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
375 | return { |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
376 | "ok": False, |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
377 | "error": str(err), |
300487f5f517
eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
378 | } |
10576
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
379 | |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
380 | def __dirEntries(self, params): |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
381 | """ |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
382 | Private method to get a list of all files and directories of a given directory. |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
383 | |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
384 | @param params dictionary containing the request data |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
385 | @type dict |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
386 | @return dictionary containing the reply data |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
387 | @rtype dict |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
388 | """ |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
389 | directory = params["directory"] |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
390 | result = FileSystemUtilities.direntries( |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
391 | directory, |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
392 | filesonly=params["files_only"], |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
393 | pattern=params["pattern"], |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
394 | followsymlinks=params["follow_symlinks"], |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
395 | ignore=params["ignore"], |
10583
2114cc7275e8
Adapted the UML Class diagram and the Package diagram to support the 'eric-ide' server.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10576
diff
changeset
|
396 | recursive=params["recursive"], |
2114cc7275e8
Adapted the UML Class diagram and the Package diagram to support the 'eric-ide' server.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10576
diff
changeset
|
397 | dirsonly=params["dirs_only"], |
10576
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
398 | ) |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
399 | return { |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
400 | "ok": True, |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
401 | "result": result, |
0cf5ebf17411
Adapted the Code Metrics dialog to support remote files and directories.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
402 | } |