]> git.proxmox.com Git - mirror_edk2.git/blame - AppPkg/Applications/Python/Python-2.7.2/Demo/pdist/FSProxy.py
EmbeddedPkg: Extend NvVarStoreFormattedLib LIBRARY_CLASS
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Demo / pdist / FSProxy.py
CommitLineData
4710c53d 1"""File System Proxy.\r
2\r
3Provide an OS-neutral view on a file system, locally or remotely.\r
4The functionality is geared towards implementing some sort of\r
5rdist-like utility between a Mac and a UNIX system.\r
6\r
7The module defines three classes:\r
8\r
9FSProxyLocal -- used for local access\r
10FSProxyServer -- used on the server side of remote access\r
11FSProxyClient -- used on the client side of remote access\r
12\r
13The remote classes are instantiated with an IP address and an optional\r
14verbosity flag.\r
15"""\r
16\r
17import server\r
18import client\r
19import md5\r
20import os\r
21import fnmatch\r
22from stat import *\r
23import time\r
24import fnmatch\r
25\r
26maxnamelen = 255\r
27\r
28skipnames = (os.curdir, os.pardir)\r
29\r
30\r
31class FSProxyLocal:\r
32\r
33 def __init__(self):\r
34 self._dirstack = []\r
35 self._ignore = ['*.pyc'] + self._readignore()\r
36\r
37 def _close(self):\r
38 while self._dirstack:\r
39 self.back()\r
40\r
41 def _readignore(self):\r
42 file = self._hide('ignore')\r
43 try:\r
44 f = open(file)\r
45 except IOError:\r
46 file = self._hide('synctree.ignorefiles')\r
47 try:\r
48 f = open(file)\r
49 except IOError:\r
50 return []\r
51 ignore = []\r
52 while 1:\r
53 line = f.readline()\r
54 if not line: break\r
55 if line[-1] == '\n': line = line[:-1]\r
56 ignore.append(line)\r
57 f.close()\r
58 return ignore\r
59\r
60 def _hidden(self, name):\r
61 return name[0] == '.'\r
62\r
63 def _hide(self, name):\r
64 return '.%s' % name\r
65\r
66 def visible(self, name):\r
67 if len(name) > maxnamelen: return 0\r
68 if name[-1] == '~': return 0\r
69 if name in skipnames: return 0\r
70 if self._hidden(name): return 0\r
71 head, tail = os.path.split(name)\r
72 if head or not tail: return 0\r
73 if os.path.islink(name): return 0\r
74 if '\0' in open(name, 'rb').read(512): return 0\r
75 for ign in self._ignore:\r
76 if fnmatch.fnmatch(name, ign): return 0\r
77 return 1\r
78\r
79 def check(self, name):\r
80 if not self.visible(name):\r
81 raise os.error, "protected name %s" % repr(name)\r
82\r
83 def checkfile(self, name):\r
84 self.check(name)\r
85 if not os.path.isfile(name):\r
86 raise os.error, "not a plain file %s" % repr(name)\r
87\r
88 def pwd(self):\r
89 return os.getcwd()\r
90\r
91 def cd(self, name):\r
92 self.check(name)\r
93 save = os.getcwd(), self._ignore\r
94 os.chdir(name)\r
95 self._dirstack.append(save)\r
96 self._ignore = self._ignore + self._readignore()\r
97\r
98 def back(self):\r
99 if not self._dirstack:\r
100 raise os.error, "empty directory stack"\r
101 dir, ignore = self._dirstack[-1]\r
102 os.chdir(dir)\r
103 del self._dirstack[-1]\r
104 self._ignore = ignore\r
105\r
106 def _filter(self, files, pat = None):\r
107 if pat:\r
108 def keep(name, pat = pat):\r
109 return fnmatch.fnmatch(name, pat)\r
110 files = filter(keep, files)\r
111 files = filter(self.visible, files)\r
112 files.sort()\r
113 return files\r
114\r
115 def list(self, pat = None):\r
116 files = os.listdir(os.curdir)\r
117 return self._filter(files, pat)\r
118\r
119 def listfiles(self, pat = None):\r
120 files = os.listdir(os.curdir)\r
121 files = filter(os.path.isfile, files)\r
122 return self._filter(files, pat)\r
123\r
124 def listsubdirs(self, pat = None):\r
125 files = os.listdir(os.curdir)\r
126 files = filter(os.path.isdir, files)\r
127 return self._filter(files, pat)\r
128\r
129 def exists(self, name):\r
130 return self.visible(name) and os.path.exists(name)\r
131\r
132 def isdir(self, name):\r
133 return self.visible(name) and os.path.isdir(name)\r
134\r
135 def islink(self, name):\r
136 return self.visible(name) and os.path.islink(name)\r
137\r
138 def isfile(self, name):\r
139 return self.visible(name) and os.path.isfile(name)\r
140\r
141 def sum(self, name):\r
142 self.checkfile(name)\r
143 BUFFERSIZE = 1024*8\r
144 f = open(name)\r
145 sum = md5.new()\r
146 while 1:\r
147 buffer = f.read(BUFFERSIZE)\r
148 if not buffer:\r
149 break\r
150 sum.update(buffer)\r
151 return sum.digest()\r
152\r
153 def size(self, name):\r
154 self.checkfile(name)\r
155 return os.stat(name)[ST_SIZE]\r
156\r
157 def mtime(self, name):\r
158 self.checkfile(name)\r
159 return time.localtime(os.stat(name)[ST_MTIME])\r
160\r
161 def stat(self, name):\r
162 self.checkfile(name)\r
163 size = os.stat(name)[ST_SIZE]\r
164 mtime = time.localtime(os.stat(name)[ST_MTIME])\r
165 return size, mtime\r
166\r
167 def info(self, name):\r
168 sum = self.sum(name)\r
169 size = os.stat(name)[ST_SIZE]\r
170 mtime = time.localtime(os.stat(name)[ST_MTIME])\r
171 return sum, size, mtime\r
172\r
173 def _list(self, function, list):\r
174 if list is None:\r
175 list = self.listfiles()\r
176 res = []\r
177 for name in list:\r
178 try:\r
179 res.append((name, function(name)))\r
180 except (os.error, IOError):\r
181 res.append((name, None))\r
182 return res\r
183\r
184 def sumlist(self, list = None):\r
185 return self._list(self.sum, list)\r
186\r
187 def statlist(self, list = None):\r
188 return self._list(self.stat, list)\r
189\r
190 def mtimelist(self, list = None):\r
191 return self._list(self.mtime, list)\r
192\r
193 def sizelist(self, list = None):\r
194 return self._list(self.size, list)\r
195\r
196 def infolist(self, list = None):\r
197 return self._list(self.info, list)\r
198\r
199 def _dict(self, function, list):\r
200 if list is None:\r
201 list = self.listfiles()\r
202 dict = {}\r
203 for name in list:\r
204 try:\r
205 dict[name] = function(name)\r
206 except (os.error, IOError):\r
207 pass\r
208 return dict\r
209\r
210 def sumdict(self, list = None):\r
211 return self.dict(self.sum, list)\r
212\r
213 def sizedict(self, list = None):\r
214 return self.dict(self.size, list)\r
215\r
216 def mtimedict(self, list = None):\r
217 return self.dict(self.mtime, list)\r
218\r
219 def statdict(self, list = None):\r
220 return self.dict(self.stat, list)\r
221\r
222 def infodict(self, list = None):\r
223 return self._dict(self.info, list)\r
224\r
225 def read(self, name, offset = 0, length = -1):\r
226 self.checkfile(name)\r
227 f = open(name)\r
228 f.seek(offset)\r
229 if length == 0:\r
230 data = ''\r
231 elif length < 0:\r
232 data = f.read()\r
233 else:\r
234 data = f.read(length)\r
235 f.close()\r
236 return data\r
237\r
238 def create(self, name):\r
239 self.check(name)\r
240 if os.path.exists(name):\r
241 self.checkfile(name)\r
242 bname = name + '~'\r
243 try:\r
244 os.unlink(bname)\r
245 except os.error:\r
246 pass\r
247 os.rename(name, bname)\r
248 f = open(name, 'w')\r
249 f.close()\r
250\r
251 def write(self, name, data, offset = 0):\r
252 self.checkfile(name)\r
253 f = open(name, 'r+')\r
254 f.seek(offset)\r
255 f.write(data)\r
256 f.close()\r
257\r
258 def mkdir(self, name):\r
259 self.check(name)\r
260 os.mkdir(name, 0777)\r
261\r
262 def rmdir(self, name):\r
263 self.check(name)\r
264 os.rmdir(name)\r
265\r
266\r
267class FSProxyServer(FSProxyLocal, server.Server):\r
268\r
269 def __init__(self, address, verbose = server.VERBOSE):\r
270 FSProxyLocal.__init__(self)\r
271 server.Server.__init__(self, address, verbose)\r
272\r
273 def _close(self):\r
274 server.Server._close(self)\r
275 FSProxyLocal._close(self)\r
276\r
277 def _serve(self):\r
278 server.Server._serve(self)\r
279 # Retreat into start directory\r
280 while self._dirstack: self.back()\r
281\r
282\r
283class FSProxyClient(client.Client):\r
284\r
285 def __init__(self, address, verbose = client.VERBOSE):\r
286 client.Client.__init__(self, address, verbose)\r
287\r
288\r
289def test():\r
290 import string\r
291 import sys\r
292 if sys.argv[1:]:\r
293 port = string.atoi(sys.argv[1])\r
294 else:\r
295 port = 4127\r
296 proxy = FSProxyServer(('', port))\r
297 proxy._serverloop()\r
298\r
299\r
300if __name__ == '__main__':\r
301 test()\r