@@ -0,0 +1,27 | |||||
|
1 | ''' | |||
|
2 | @author: roj-idl71 | |||
|
3 | ''' | |||
|
4 | #USED IN jroplot_spectra.py | |||
|
5 | RTI_CODE = 0 #Range time intensity (RTI). | |||
|
6 | SPEC_CODE = 1 #Spectra (and Cross-spectra) information. | |||
|
7 | CROSS_CODE = 2 #Cross-Correlation information. | |||
|
8 | COH_CODE = 3 #Coherence map. | |||
|
9 | BASE_CODE = 4 #Base lines graphic. | |||
|
10 | ROW_CODE = 5 #Row Spectra. | |||
|
11 | TOTAL_CODE = 6 #Total Power. | |||
|
12 | DRIFT_CODE = 7 #Drifts graphics. | |||
|
13 | HEIGHT_CODE = 8 #Height profile. | |||
|
14 | PHASE_CODE = 9 #Signal Phase. | |||
|
15 | ||||
|
16 | POWER_CODE = 16 | |||
|
17 | NOISE_CODE = 17 | |||
|
18 | BEACON_CODE = 18 | |||
|
19 | ||||
|
20 | #USED IN jroplot_parameters.py | |||
|
21 | ||||
|
22 | MOMENTS_CODE = 20 | |||
|
23 | SKYMAP_CODE = 21 | |||
|
24 | WIND_CODE = 22 | |||
|
25 | PARMS_CODE = 23 | |||
|
26 | SPECFIT_CODE = 24 | |||
|
27 | EWDRIFT_CODE = 25 |
@@ -0,0 +1,464 | |||||
|
1 | # scp.py | |||
|
2 | # Copyright (C) 2008 James Bardin <j.bardin@gmail.com> | |||
|
3 | ||||
|
4 | """ | |||
|
5 | Utilities for sending files over ssh using the scp1 protocol. | |||
|
6 | """ | |||
|
7 | ||||
|
8 | __version__ = '0.10.0' | |||
|
9 | ||||
|
10 | import locale | |||
|
11 | import os | |||
|
12 | import re | |||
|
13 | from socket import timeout as SocketTimeout | |||
|
14 | ||||
|
15 | ||||
|
16 | # this is quote from the shlex module, added in py3.3 | |||
|
17 | _find_unsafe = re.compile(br'[^\w@%+=:,./~-]').search | |||
|
18 | ||||
|
19 | ||||
|
20 | def _sh_quote(s): | |||
|
21 | """Return a shell-escaped version of the string `s`.""" | |||
|
22 | if not s: | |||
|
23 | return b"" | |||
|
24 | if _find_unsafe(s) is None: | |||
|
25 | return s | |||
|
26 | ||||
|
27 | # use single quotes, and put single quotes into double quotes | |||
|
28 | # the string $'b is then quoted as '$'"'"'b' | |||
|
29 | return b"'" + s.replace(b"'", b"'\"'\"'") + b"'" | |||
|
30 | ||||
|
31 | ||||
|
32 | # Unicode conversion functions; assume UTF-8 | |||
|
33 | ||||
|
34 | def asbytes(s): | |||
|
35 | """Turns unicode into bytes, if needed. | |||
|
36 | Assumes UTF-8. | |||
|
37 | """ | |||
|
38 | if isinstance(s, bytes): | |||
|
39 | return s | |||
|
40 | else: | |||
|
41 | return s.encode('utf-8') | |||
|
42 | ||||
|
43 | ||||
|
44 | def asunicode(s): | |||
|
45 | """Turns bytes into unicode, if needed. | |||
|
46 | Uses UTF-8. | |||
|
47 | """ | |||
|
48 | if isinstance(s, bytes): | |||
|
49 | return s.decode('utf-8', 'replace') | |||
|
50 | else: | |||
|
51 | return s | |||
|
52 | ||||
|
53 | ||||
|
54 | # os.path.sep is unicode on Python 3, no matter the platform | |||
|
55 | bytes_sep = asbytes(os.path.sep) | |||
|
56 | ||||
|
57 | ||||
|
58 | # Unicode conversion function for Windows | |||
|
59 | # Used to convert local paths if the local machine is Windows | |||
|
60 | ||||
|
61 | def asunicode_win(s): | |||
|
62 | """Turns bytes into unicode, if needed. | |||
|
63 | """ | |||
|
64 | if isinstance(s, bytes): | |||
|
65 | return s.decode(locale.getpreferredencoding()) | |||
|
66 | else: | |||
|
67 | return s | |||
|
68 | ||||
|
69 | ||||
|
70 | class SCPClient(object): | |||
|
71 | """ | |||
|
72 | An scp1 implementation, compatible with openssh scp. | |||
|
73 | Raises SCPException for all transport related errors. Local filesystem | |||
|
74 | and OS errors pass through. | |||
|
75 | Main public methods are .put and .get | |||
|
76 | The get method is controlled by the remote scp instance, and behaves | |||
|
77 | accordingly. This means that symlinks are resolved, and the transfer is | |||
|
78 | halted after too many levels of symlinks are detected. | |||
|
79 | The put method uses os.walk for recursion, and sends files accordingly. | |||
|
80 | Since scp doesn't support symlinks, we send file symlinks as the file | |||
|
81 | (matching scp behaviour), but we make no attempt at symlinked directories. | |||
|
82 | """ | |||
|
83 | def __init__(self, transport, buff_size=16384, socket_timeout=5.0, | |||
|
84 | progress=None, sanitize=_sh_quote): | |||
|
85 | """ | |||
|
86 | Create an scp1 client. | |||
|
87 | @param transport: an existing paramiko L{Transport} | |||
|
88 | @type transport: L{Transport} | |||
|
89 | @param buff_size: size of the scp send buffer. | |||
|
90 | @type buff_size: int | |||
|
91 | @param socket_timeout: channel socket timeout in seconds | |||
|
92 | @type socket_timeout: float | |||
|
93 | @param progress: callback - called with (filename, size, sent) during | |||
|
94 | transfers | |||
|
95 | @param sanitize: function - called with filename, should return | |||
|
96 | safe or escaped string. Uses _sh_quote by default. | |||
|
97 | @type progress: function(string, int, int) | |||
|
98 | """ | |||
|
99 | self.transport = transport | |||
|
100 | self.buff_size = buff_size | |||
|
101 | self.socket_timeout = socket_timeout | |||
|
102 | self.channel = None | |||
|
103 | self.preserve_times = False | |||
|
104 | self._progress = progress | |||
|
105 | self._recv_dir = b'' | |||
|
106 | self._rename = False | |||
|
107 | self._utime = None | |||
|
108 | self.sanitize = sanitize | |||
|
109 | self._dirtimes = {} | |||
|
110 | ||||
|
111 | def __enter__(self): | |||
|
112 | self.channel = self._open() | |||
|
113 | return self | |||
|
114 | ||||
|
115 | def __exit__(self, type, value, traceback): | |||
|
116 | self.close() | |||
|
117 | ||||
|
118 | def put(self, files, remote_path=b'.', | |||
|
119 | recursive=False, preserve_times=False): | |||
|
120 | """ | |||
|
121 | Transfer files to remote host. | |||
|
122 | @param files: A single path, or a list of paths to be transfered. | |||
|
123 | recursive must be True to transfer directories. | |||
|
124 | @type files: string OR list of strings | |||
|
125 | @param remote_path: path in which to receive the files on the remote | |||
|
126 | host. defaults to '.' | |||
|
127 | @type remote_path: str | |||
|
128 | @param recursive: transfer files and directories recursively | |||
|
129 | @type recursive: bool | |||
|
130 | @param preserve_times: preserve mtime and atime of transfered files | |||
|
131 | and directories. | |||
|
132 | @type preserve_times: bool | |||
|
133 | """ | |||
|
134 | self.preserve_times = preserve_times | |||
|
135 | self.channel = self._open() | |||
|
136 | self._pushed = 0 | |||
|
137 | self.channel.settimeout(self.socket_timeout) | |||
|
138 | scp_command = (b'scp -t ', b'scp -r -t ')[recursive] | |||
|
139 | self.channel.exec_command(scp_command + | |||
|
140 | self.sanitize(asbytes(remote_path))) | |||
|
141 | self._recv_confirm() | |||
|
142 | ||||
|
143 | if not isinstance(files, (list, tuple)): | |||
|
144 | files = [files] | |||
|
145 | ||||
|
146 | if recursive: | |||
|
147 | self._send_recursive(files) | |||
|
148 | else: | |||
|
149 | self._send_files(files) | |||
|
150 | ||||
|
151 | self.close() | |||
|
152 | ||||
|
153 | def get(self, remote_path, local_path='', | |||
|
154 | recursive=False, preserve_times=False): | |||
|
155 | """ | |||
|
156 | Transfer files from remote host to localhost | |||
|
157 | @param remote_path: path to retreive from remote host. since this is | |||
|
158 | evaluated by scp on the remote host, shell wildcards and | |||
|
159 | environment variables may be used. | |||
|
160 | @type remote_path: str | |||
|
161 | @param local_path: path in which to receive files locally | |||
|
162 | @type local_path: str | |||
|
163 | @param recursive: transfer files and directories recursively | |||
|
164 | @type recursive: bool | |||
|
165 | @param preserve_times: preserve mtime and atime of transfered files | |||
|
166 | and directories. | |||
|
167 | @type preserve_times: bool | |||
|
168 | """ | |||
|
169 | if not isinstance(remote_path, (list, tuple)): | |||
|
170 | remote_path = [remote_path] | |||
|
171 | remote_path = [self.sanitize(asbytes(r)) for r in remote_path] | |||
|
172 | self._recv_dir = local_path or os.getcwd() | |||
|
173 | self._rename = (len(remote_path) == 1 and | |||
|
174 | not os.path.isdir(os.path.abspath(local_path))) | |||
|
175 | if len(remote_path) > 1: | |||
|
176 | if not os.path.exists(self._recv_dir): | |||
|
177 | raise SCPException("Local path '%s' does not exist" % | |||
|
178 | asunicode(self._recv_dir)) | |||
|
179 | elif not os.path.isdir(self._recv_dir): | |||
|
180 | raise SCPException("Local path '%s' is not a directory" % | |||
|
181 | asunicode(self._recv_dir)) | |||
|
182 | rcsv = (b'', b' -r')[recursive] | |||
|
183 | prsv = (b'', b' -p')[preserve_times] | |||
|
184 | self.channel = self._open() | |||
|
185 | self._pushed = 0 | |||
|
186 | self.channel.settimeout(self.socket_timeout) | |||
|
187 | self.channel.exec_command(b"scp" + | |||
|
188 | rcsv + | |||
|
189 | prsv + | |||
|
190 | b" -f " + | |||
|
191 | b' '.join(remote_path)) | |||
|
192 | self._recv_all() | |||
|
193 | self.close() | |||
|
194 | ||||
|
195 | def _open(self): | |||
|
196 | """open a scp channel""" | |||
|
197 | if self.channel is None: | |||
|
198 | self.channel = self.transport.open_session() | |||
|
199 | ||||
|
200 | return self.channel | |||
|
201 | ||||
|
202 | def close(self): | |||
|
203 | """close scp channel""" | |||
|
204 | if self.channel is not None: | |||
|
205 | self.channel.close() | |||
|
206 | self.channel = None | |||
|
207 | ||||
|
208 | def _read_stats(self, name): | |||
|
209 | """return just the file stats needed for scp""" | |||
|
210 | if os.name == 'nt': | |||
|
211 | name = asunicode(name) | |||
|
212 | stats = os.stat(name) | |||
|
213 | mode = oct(stats.st_mode)[-4:] | |||
|
214 | size = stats.st_size | |||
|
215 | atime = int(stats.st_atime) | |||
|
216 | mtime = int(stats.st_mtime) | |||
|
217 | return (mode, size, mtime, atime) | |||
|
218 | ||||
|
219 | def _send_files(self, files): | |||
|
220 | for name in files: | |||
|
221 | basename = asbytes(os.path.basename(name)) | |||
|
222 | (mode, size, mtime, atime) = self._read_stats(name) | |||
|
223 | if self.preserve_times: | |||
|
224 | self._send_time(mtime, atime) | |||
|
225 | file_hdl = open(name, 'rb') | |||
|
226 | ||||
|
227 | # The protocol can't handle \n in the filename. | |||
|
228 | # Quote them as the control sequence \^J for now, | |||
|
229 | # which is how openssh handles it. | |||
|
230 | self.channel.sendall(("C%s %d " % (mode, size)).encode('ascii') + | |||
|
231 | basename.replace(b'\n', b'\\^J') + b"\n") | |||
|
232 | self._recv_confirm() | |||
|
233 | file_pos = 0 | |||
|
234 | if self._progress: | |||
|
235 | if size == 0: | |||
|
236 | # avoid divide-by-zero | |||
|
237 | self._progress(basename, 1, 1) | |||
|
238 | else: | |||
|
239 | self._progress(basename, size, 0) | |||
|
240 | buff_size = self.buff_size | |||
|
241 | chan = self.channel | |||
|
242 | while file_pos < size: | |||
|
243 | chan.sendall(file_hdl.read(buff_size)) | |||
|
244 | file_pos = file_hdl.tell() | |||
|
245 | if self._progress: | |||
|
246 | self._progress(basename, size, file_pos) | |||
|
247 | chan.sendall('\x00') | |||
|
248 | file_hdl.close() | |||
|
249 | self._recv_confirm() | |||
|
250 | ||||
|
251 | def _chdir(self, from_dir, to_dir): | |||
|
252 | # Pop until we're one level up from our next push. | |||
|
253 | # Push *once* into to_dir. | |||
|
254 | # This is dependent on the depth-first traversal from os.walk | |||
|
255 | ||||
|
256 | # add path.sep to each when checking the prefix, so we can use | |||
|
257 | # path.dirname after | |||
|
258 | common = os.path.commonprefix([from_dir + bytes_sep, | |||
|
259 | to_dir + bytes_sep]) | |||
|
260 | # now take the dirname, since commonprefix is character based, | |||
|
261 | # and we either have a seperator, or a partial name | |||
|
262 | common = os.path.dirname(common) | |||
|
263 | cur_dir = from_dir.rstrip(bytes_sep) | |||
|
264 | while cur_dir != common: | |||
|
265 | cur_dir = os.path.split(cur_dir)[0] | |||
|
266 | self._send_popd() | |||
|
267 | # now we're in our common base directory, so on | |||
|
268 | self._send_pushd(to_dir) | |||
|
269 | ||||
|
270 | def _send_recursive(self, files): | |||
|
271 | for base in files: | |||
|
272 | if not os.path.isdir(base): | |||
|
273 | # filename mixed into the bunch | |||
|
274 | self._send_files([base]) | |||
|
275 | continue | |||
|
276 | last_dir = asbytes(base) | |||
|
277 | for root, dirs, fls in os.walk(base): | |||
|
278 | self._chdir(last_dir, asbytes(root)) | |||
|
279 | self._send_files([os.path.join(root, f) for f in fls]) | |||
|
280 | last_dir = asbytes(root) | |||
|
281 | # back out of the directory | |||
|
282 | while self._pushed > 0: | |||
|
283 | self._send_popd() | |||
|
284 | ||||
|
285 | def _send_pushd(self, directory): | |||
|
286 | (mode, size, mtime, atime) = self._read_stats(directory) | |||
|
287 | basename = asbytes(os.path.basename(directory)) | |||
|
288 | if self.preserve_times: | |||
|
289 | self._send_time(mtime, atime) | |||
|
290 | self.channel.sendall(('D%s 0 ' % mode).encode('ascii') + | |||
|
291 | basename.replace(b'\n', b'\\^J') + b'\n') | |||
|
292 | self._recv_confirm() | |||
|
293 | self._pushed += 1 | |||
|
294 | ||||
|
295 | def _send_popd(self): | |||
|
296 | self.channel.sendall('E\n') | |||
|
297 | self._recv_confirm() | |||
|
298 | self._pushed -= 1 | |||
|
299 | ||||
|
300 | def _send_time(self, mtime, atime): | |||
|
301 | self.channel.sendall(('T%d 0 %d 0\n' % (mtime, atime)).encode('ascii')) | |||
|
302 | self._recv_confirm() | |||
|
303 | ||||
|
304 | def _recv_confirm(self): | |||
|
305 | # read scp response | |||
|
306 | msg = b'' | |||
|
307 | try: | |||
|
308 | msg = self.channel.recv(512) | |||
|
309 | except SocketTimeout: | |||
|
310 | raise SCPException('Timout waiting for scp response') | |||
|
311 | # slice off the first byte, so this compare will work in py2 and py3 | |||
|
312 | if msg and msg[0:1] == b'\x00': | |||
|
313 | return | |||
|
314 | elif msg and msg[0:1] == b'\x01': | |||
|
315 | raise SCPException(asunicode(msg[1:])) | |||
|
316 | elif self.channel.recv_stderr_ready(): | |||
|
317 | msg = self.channel.recv_stderr(512) | |||
|
318 | raise SCPException(asunicode(msg)) | |||
|
319 | elif not msg: | |||
|
320 | raise SCPException('No response from server') | |||
|
321 | else: | |||
|
322 | raise SCPException('Invalid response from server', msg) | |||
|
323 | ||||
|
324 | def _recv_all(self): | |||
|
325 | # loop over scp commands, and receive as necessary | |||
|
326 | command = {b'C': self._recv_file, | |||
|
327 | b'T': self._set_time, | |||
|
328 | b'D': self._recv_pushd, | |||
|
329 | b'E': self._recv_popd} | |||
|
330 | while not self.channel.closed: | |||
|
331 | # wait for command as long as we're open | |||
|
332 | self.channel.sendall('\x00') | |||
|
333 | msg = self.channel.recv(1024) | |||
|
334 | if not msg: # chan closed while recving | |||
|
335 | break | |||
|
336 | assert msg[-1:] == b'\n' | |||
|
337 | msg = msg[:-1] | |||
|
338 | code = msg[0:1] | |||
|
339 | try: | |||
|
340 | command[code](msg[1:]) | |||
|
341 | except KeyError: | |||
|
342 | raise SCPException(asunicode(msg[1:])) | |||
|
343 | # directory times can't be set until we're done writing files | |||
|
344 | self._set_dirtimes() | |||
|
345 | ||||
|
346 | def _set_time(self, cmd): | |||
|
347 | try: | |||
|
348 | times = cmd.split(b' ') | |||
|
349 | mtime = int(times[0]) | |||
|
350 | atime = int(times[2]) or mtime | |||
|
351 | except: | |||
|
352 | self.channel.send(b'\x01') | |||
|
353 | raise SCPException('Bad time format') | |||
|
354 | # save for later | |||
|
355 | self._utime = (atime, mtime) | |||
|
356 | ||||
|
357 | def _recv_file(self, cmd): | |||
|
358 | chan = self.channel | |||
|
359 | parts = cmd.strip().split(b' ', 2) | |||
|
360 | ||||
|
361 | try: | |||
|
362 | mode = int(parts[0], 8) | |||
|
363 | size = int(parts[1]) | |||
|
364 | if self._rename: | |||
|
365 | path = self._recv_dir | |||
|
366 | self._rename = False | |||
|
367 | elif os.name == 'nt': | |||
|
368 | path = os.path.join(asunicode_win(self._recv_dir), | |||
|
369 | parts[2].decode('utf-8')) | |||
|
370 | else: | |||
|
371 | path = os.path.join(asbytes(self._recv_dir), | |||
|
372 | parts[2]) | |||
|
373 | except: | |||
|
374 | chan.send('\x01') | |||
|
375 | chan.close() | |||
|
376 | raise SCPException('Bad file format') | |||
|
377 | ||||
|
378 | try: | |||
|
379 | file_hdl = open(path, 'wb') | |||
|
380 | except IOError as e: | |||
|
381 | chan.send(b'\x01' + str(e).encode('utf-8')) | |||
|
382 | chan.close() | |||
|
383 | raise | |||
|
384 | ||||
|
385 | if self._progress: | |||
|
386 | if size == 0: | |||
|
387 | # avoid divide-by-zero | |||
|
388 | self._progress(path, 1, 1) | |||
|
389 | else: | |||
|
390 | self._progress(path, size, 0) | |||
|
391 | buff_size = self.buff_size | |||
|
392 | pos = 0 | |||
|
393 | chan.send(b'\x00') | |||
|
394 | try: | |||
|
395 | while pos < size: | |||
|
396 | # we have to make sure we don't read the final byte | |||
|
397 | if size - pos <= buff_size: | |||
|
398 | buff_size = size - pos | |||
|
399 | file_hdl.write(chan.recv(buff_size)) | |||
|
400 | pos = file_hdl.tell() | |||
|
401 | if self._progress: | |||
|
402 | self._progress(path, size, pos) | |||
|
403 | ||||
|
404 | msg = chan.recv(512) | |||
|
405 | if msg and msg[0:1] != b'\x00': | |||
|
406 | raise SCPException(asunicode(msg[1:])) | |||
|
407 | except SocketTimeout: | |||
|
408 | chan.close() | |||
|
409 | raise SCPException('Error receiving, socket.timeout') | |||
|
410 | ||||
|
411 | file_hdl.truncate() | |||
|
412 | try: | |||
|
413 | os.utime(path, self._utime) | |||
|
414 | self._utime = None | |||
|
415 | os.chmod(path, mode) | |||
|
416 | # should we notify the other end? | |||
|
417 | finally: | |||
|
418 | file_hdl.close() | |||
|
419 | # '\x00' confirmation sent in _recv_all | |||
|
420 | ||||
|
421 | def _recv_pushd(self, cmd): | |||
|
422 | parts = cmd.split(b' ', 2) | |||
|
423 | try: | |||
|
424 | mode = int(parts[0], 8) | |||
|
425 | if self._rename: | |||
|
426 | path = self._recv_dir | |||
|
427 | self._rename = False | |||
|
428 | elif os.name == 'nt': | |||
|
429 | path = os.path.join(asunicode_win(self._recv_dir), | |||
|
430 | parts[2].decode('utf-8')) | |||
|
431 | else: | |||
|
432 | path = os.path.join(asbytes(self._recv_dir), | |||
|
433 | parts[2]) | |||
|
434 | except: | |||
|
435 | self.channel.send(b'\x01') | |||
|
436 | raise SCPException('Bad directory format') | |||
|
437 | try: | |||
|
438 | if not os.path.exists(path): | |||
|
439 | os.mkdir(path, mode) | |||
|
440 | elif os.path.isdir(path): | |||
|
441 | os.chmod(path, mode) | |||
|
442 | else: | |||
|
443 | raise SCPException('%s: Not a directory' % path) | |||
|
444 | self._dirtimes[path] = (self._utime) | |||
|
445 | self._utime = None | |||
|
446 | self._recv_dir = path | |||
|
447 | except (OSError, SCPException) as e: | |||
|
448 | self.channel.send(b'\x01' + asbytes(str(e))) | |||
|
449 | raise | |||
|
450 | ||||
|
451 | def _recv_popd(self, *cmd): | |||
|
452 | self._recv_dir = os.path.split(self._recv_dir)[0] | |||
|
453 | ||||
|
454 | def _set_dirtimes(self): | |||
|
455 | try: | |||
|
456 | for d in self._dirtimes: | |||
|
457 | os.utime(d, self._dirtimes[d]) | |||
|
458 | finally: | |||
|
459 | self._dirtimes = {} | |||
|
460 | ||||
|
461 | ||||
|
462 | class SCPException(Exception): | |||
|
463 | """SCP exception class""" | |||
|
464 | pass No newline at end of file |
@@ -378,15 +378,6 class ProcUnitConf(): | |||||
378 | self.name = upElement.get('name') |
|
378 | self.name = upElement.get('name') | |
379 | self.datatype = upElement.get('datatype') |
|
379 | self.datatype = upElement.get('datatype') | |
380 | self.inputId = upElement.get('inputId') |
|
380 | self.inputId = upElement.get('inputId') | |
381 |
|
||||
382 | #Compatible with old signal chain version |
|
|||
383 | if self.ELEMENTNAME == ReadUnitConf().getElementName(): |
|
|||
384 | if 'Reader' not in self.name: |
|
|||
385 | self.name += 'Reader' |
|
|||
386 |
|
||||
387 | if self.ELEMENTNAME == ProcUnitConf().getElementName(): |
|
|||
388 | if 'Proc' not in self.name: |
|
|||
389 | self.name += 'Proc' |
|
|||
390 |
|
381 | |||
391 | self.opConfObjList = [] |
|
382 | self.opConfObjList = [] | |
392 |
|
383 | |||
@@ -445,7 +436,13 class ProcUnitConf(): | |||||
445 | finalSts = finalSts or sts |
|
436 | finalSts = finalSts or sts | |
446 |
|
437 | |||
447 | return finalSts |
|
438 | return finalSts | |
448 |
|
439 | |||
|
440 | def close(self): | |||
|
441 | ||||
|
442 | self.procUnitObj.close() | |||
|
443 | ||||
|
444 | return | |||
|
445 | ||||
449 | class ReadUnitConf(ProcUnitConf): |
|
446 | class ReadUnitConf(ProcUnitConf): | |
450 |
|
447 | |||
451 | path = None |
|
448 | path = None | |
@@ -559,7 +556,7 class Project(): | |||||
559 |
|
556 | |||
560 | return readUnitConfObj |
|
557 | return readUnitConfObj | |
561 |
|
558 | |||
562 | def addProcUnit(self, inputId, datatype=None, name=None): |
|
559 | def addProcUnit(self, inputId=0, datatype=None, name=None): | |
563 |
|
560 | |||
564 | #Compatible with old signal chain version |
|
561 | #Compatible with old signal chain version | |
565 | if datatype==None and name==None: |
|
562 | if datatype==None and name==None: | |
@@ -707,7 +704,21 class Project(): | |||||
707 | if not(finalSts): |
|
704 | if not(finalSts): | |
708 | print "Every process unit have finished" |
|
705 | print "Every process unit have finished" | |
709 | break |
|
706 | break | |
710 |
|
707 | |||
|
708 | #Closing every process | |||
|
709 | for procKey in keyList: | |||
|
710 | procUnitConfObj = self.procUnitConfObjDict[procKey] | |||
|
711 | procUnitConfObj.close() | |||
|
712 | ||||
|
713 | def start(self, filename): | |||
|
714 | ||||
|
715 | self.writeXml(filename) | |||
|
716 | self.readXml(filename) | |||
|
717 | ||||
|
718 | self.createObjects() | |||
|
719 | self.connectObjects() | |||
|
720 | self.run() | |||
|
721 | ||||
711 | if __name__ == '__main__': |
|
722 | if __name__ == '__main__': | |
712 |
|
723 | |||
713 | desc = "Segundo Test" |
|
724 | desc = "Segundo Test" |
@@ -39,6 +39,10 class Figure: | |||||
39 | xmin = None |
|
39 | xmin = None | |
40 | xmax = None |
|
40 | xmax = None | |
41 |
|
41 | |||
|
42 | counter_imagwr = 0 | |||
|
43 | ||||
|
44 | figfile = None | |||
|
45 | ||||
42 | def __init__(self): |
|
46 | def __init__(self): | |
43 |
|
47 | |||
44 | raise ValueError, "This method is not implemented" |
|
48 | raise ValueError, "This method is not implemented" | |
@@ -175,6 +179,7 class Figure: | |||||
175 | show=show) |
|
179 | show=show) | |
176 |
|
180 | |||
177 | self.axesObjList = [] |
|
181 | self.axesObjList = [] | |
|
182 | self.counter_imagwr = 0 | |||
178 |
|
183 | |||
179 |
|
184 | |||
180 | def setDriver(self, driver=mpldriver): |
|
185 | def setDriver(self, driver=mpldriver): | |
@@ -224,8 +229,45 class Figure: | |||||
224 |
|
229 | |||
225 | self.__driver.saveFigure(self.fig, filename, *args) |
|
230 | self.__driver.saveFigure(self.fig, filename, *args) | |
226 |
|
231 | |||
227 |
|
232 | def save(self, figpath, figfile=None, save=True, ftp=False, wr_period=1, thisDatetime=None, update_figfile=True): | ||
228 |
|
233 | |||
|
234 | if not save: | |||
|
235 | return | |||
|
236 | ||||
|
237 | if figfile == None: | |||
|
238 | ||||
|
239 | if not thisDatetime: | |||
|
240 | raise ValueError, "Saving figure: figfile or thisDatetime should be defined" | |||
|
241 | return | |||
|
242 | ||||
|
243 | str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") | |||
|
244 | figfile = self.getFilename(name = str_datetime) | |||
|
245 | ||||
|
246 | if self.figfile == None: | |||
|
247 | self.figfile = figfile | |||
|
248 | ||||
|
249 | if update_figfile: | |||
|
250 | self.figfile = figfile | |||
|
251 | ||||
|
252 | self.counter_imagwr += 1 | |||
|
253 | ||||
|
254 | if self.counter_imagwr<wr_period: | |||
|
255 | return | |||
|
256 | ||||
|
257 | # store png plot to local folder | |||
|
258 | self.saveFigure(figpath, self.figfile) | |||
|
259 | self.counter_imagwr = 0 | |||
|
260 | ||||
|
261 | if not ftp: | |||
|
262 | return | |||
|
263 | ||||
|
264 | if not thisDatetime: | |||
|
265 | return | |||
|
266 | ||||
|
267 | # store png plot to FTP server according to RT-Web format | |||
|
268 | name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) | |||
|
269 | ftp_filename = os.path.join(figpath, name) | |||
|
270 | self.saveFigure(figpath, ftp_filename) | |||
229 |
|
271 | |||
230 | def getNameToFtp(self, thisDatetime, FTP_WEI, EXP_CODE, SUB_EXP_CODE, PLOT_CODE, PLOT_POS): |
|
272 | def getNameToFtp(self, thisDatetime, FTP_WEI, EXP_CODE, SUB_EXP_CODE, PLOT_CODE, PLOT_POS): | |
231 | YEAR_STR = '%4.4d'%thisDatetime.timetuple().tm_year |
|
273 | YEAR_STR = '%4.4d'%thisDatetime.timetuple().tm_year |
@@ -180,19 +180,9 class CorrelationPlot(Figure): | |||||
180 |
|
180 | |||
181 | self.draw() |
|
181 | self.draw() | |
182 |
|
182 | |||
183 | if save: |
|
183 | self.save(figpath=figpath, | |
184 |
|
184 | figfile=figfile, | ||
185 | if figfile == None: |
|
185 | save=save, | |
186 | str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") |
|
186 | ftp=ftp, | |
187 | figfile = self.getFilename(name = str_datetime) |
|
187 | wr_period=wr_period, | |
188 |
|
188 | thisDatetime=thisDatetime) | ||
189 | self.counter_imagwr += 1 |
|
|||
190 | if (self.counter_imagwr>=wr_period): |
|
|||
191 | # store png plot to local folder |
|
|||
192 | self.saveFigure(figpath, figfile) |
|
|||
193 | # store png plot to FTP server according to RT-Web format |
|
|||
194 | if ftp: |
|
|||
195 | name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) |
|
|||
196 | ftp_filename = os.path.join(figpath, name) |
|
|||
197 | self.saveFigure(figpath, ftp_filename) |
|
|||
198 | self.counter_imagwr = 0 |
|
@@ -156,21 +156,12 class SpectraHeisScope(Figure): | |||||
156 |
|
156 | |||
157 | self.draw() |
|
157 | self.draw() | |
158 |
|
158 | |||
159 | if save: |
|
159 | self.save(figpath=figpath, | |
160 |
|
160 | figfile=figfile, | ||
161 | if figfile == None: |
|
161 | save=save, | |
162 | str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") |
|
162 | ftp=ftp, | |
163 | figfile = self.getFilename(name = str_datetime) |
|
163 | wr_period=wr_period, | |
164 |
|
164 | thisDatetime=thisDatetime) | ||
165 | self.counter_imagwr += 1 |
|
|||
166 | if (self.counter_imagwr>=wr_period): |
|
|||
167 | # store png plot to local folder |
|
|||
168 | self.saveFigure(figpath, figfile) |
|
|||
169 | # store png plot to FTP server according to RT-Web format |
|
|||
170 | #name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) |
|
|||
171 | #ftp_filename = os.path.join(figpath, name) |
|
|||
172 | #self.saveFigure(figpath, ftp_filename) |
|
|||
173 | self.counter_imagwr = 0 |
|
|||
174 |
|
165 | |||
175 | class RTIfromSpectraHeis(Figure): |
|
166 | class RTIfromSpectraHeis(Figure): | |
176 |
|
167 | |||
@@ -310,19 +301,12 class RTIfromSpectraHeis(Figure): | |||||
310 | del self.xdata |
|
301 | del self.xdata | |
311 | del self.ydata |
|
302 | del self.ydata | |
312 | self.__isConfig = False |
|
303 | self.__isConfig = False | |
313 |
|
304 | self.figfile = None | ||
314 | if save: |
|
|||
315 |
|
305 | |||
316 | if self.figfile == None: |
|
306 | self.save(figpath=figpath, | |
317 | str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") |
|
307 | figfile=figfile, | |
318 | self.figfile = self.getFilename(name = str_datetime) |
|
308 | save=save, | |
319 |
|
309 | ftp=ftp, | ||
320 | self.counter_imagwr += 1 |
|
310 | wr_period=wr_period, | |
321 | if (self.counter_imagwr>=wr_period): |
|
311 | thisDatetime=thisDatetime, | |
322 | # store png plot to local folder |
|
312 | update_figfile=False) | |
323 | self.saveFigure(figpath, self.figfile) |
|
|||
324 | # store png plot to FTP server according to RT-Web format |
|
|||
325 | #name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) |
|
|||
326 | #ftp_filename = os.path.join(figpath, name) |
|
|||
327 | #self.saveFigure(figpath, ftp_filename) |
|
|||
328 | self.counter_imagwr = 0 |
|
@@ -3,6 +3,7 import datetime | |||||
3 | import numpy |
|
3 | import numpy | |
4 |
|
4 | |||
5 | from figure import Figure, isRealtime |
|
5 | from figure import Figure, isRealtime | |
|
6 | from plotting_codes import * | |||
6 |
|
7 | |||
7 | class MomentsPlot(Figure): |
|
8 | class MomentsPlot(Figure): | |
8 |
|
9 | |||
@@ -24,7 +25,8 class MomentsPlot(Figure): | |||||
24 | self.HEIGHTPROF = 0 |
|
25 | self.HEIGHTPROF = 0 | |
25 | self.counter_imagwr = 0 |
|
26 | self.counter_imagwr = 0 | |
26 |
|
27 | |||
27 |
self.PLOT_CODE = |
|
28 | self.PLOT_CODE = MOMENTS_CODE | |
|
29 | ||||
28 | self.FTP_WEI = None |
|
30 | self.FTP_WEI = None | |
29 | self.EXP_CODE = None |
|
31 | self.EXP_CODE = None | |
30 | self.SUB_EXP_CODE = None |
|
32 | self.SUB_EXP_CODE = None | |
@@ -179,23 +181,13 class MomentsPlot(Figure): | |||||
179 | axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2) |
|
181 | axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2) | |
180 |
|
182 | |||
181 | self.draw() |
|
183 | self.draw() | |
182 |
|
||||
183 | if save: |
|
|||
184 |
|
||||
185 | if figfile == None: |
|
|||
186 | str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") |
|
|||
187 | figfile = self.getFilename(name = str_datetime) |
|
|||
188 |
|
184 | |||
189 | self.counter_imagwr += 1 |
|
185 | self.save(figpath=figpath, | |
190 | if (self.counter_imagwr>=wr_period): |
|
186 | figfile=figfile, | |
191 | # store png plot to local folder |
|
187 | save=save, | |
192 | self.saveFigure(figpath, figfile) |
|
188 | ftp=ftp, | |
193 | self.counter_imagwr = 0 |
|
189 | wr_period=wr_period, | |
194 | # store png plot to FTP server according to RT-Web format |
|
190 | thisDatetime=thisDatetime) | |
195 | if ftp: |
|
|||
196 | name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) |
|
|||
197 | ftp_filename = os.path.join(figpath, name) |
|
|||
198 | self.saveFigure(figpath, ftp_filename) |
|
|||
199 |
|
191 | |||
200 |
|
192 | |||
201 |
|
193 | |||
@@ -221,7 +213,8 class SkyMapPlot(Figure): | |||||
221 | self.HEIGHTPROF = 0 |
|
213 | self.HEIGHTPROF = 0 | |
222 | self.counter_imagwr = 0 |
|
214 | self.counter_imagwr = 0 | |
223 |
|
215 | |||
224 |
self.PLOT_CODE = |
|
216 | self.PLOT_CODE = SKYMAP_CODE | |
|
217 | ||||
225 | self.FTP_WEI = None |
|
218 | self.FTP_WEI = None | |
226 | self.EXP_CODE = None |
|
219 | self.EXP_CODE = None | |
227 | self.SUB_EXP_CODE = None |
|
220 | self.SUB_EXP_CODE = None | |
@@ -324,35 +317,13 class SkyMapPlot(Figure): | |||||
324 | ticksize=9, cblabel='') |
|
317 | ticksize=9, cblabel='') | |
325 |
|
318 | |||
326 | self.draw() |
|
319 | self.draw() | |
327 |
|
||||
328 | if save: |
|
|||
329 |
|
320 | |||
330 | self.counter_imagwr += 1 |
|
321 | self.save(figpath=figpath, | |
331 | if (self.counter_imagwr==wr_period): |
|
322 | figfile=figfile, | |
332 |
|
323 | save=save, | ||
333 |
|
|
324 | ftp=ftp, | |
334 | figfile = self.getFilename(name = self.name) |
|
325 | wr_period=wr_period, | |
335 |
|
326 | thisDatetime=thisDatetime) | ||
336 | self.saveFigure(figpath, figfile) |
|
|||
337 | self.counter_imagwr = 0 |
|
|||
338 |
|
||||
339 | if ftp: |
|
|||
340 | #provisionalmente envia archivos en el formato de la web en tiempo real |
|
|||
341 | name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) |
|
|||
342 | path = '%s%03d' %(self.PREFIX, self.id) |
|
|||
343 | ftp_file = os.path.join(path,'ftp','%s.png'%name) |
|
|||
344 | self.saveFigure(figpath, ftp_file) |
|
|||
345 | ftp_filename = os.path.join(figpath,ftp_file) |
|
|||
346 |
|
||||
347 |
|
||||
348 | try: |
|
|||
349 | self.sendByFTP(ftp_filename, server, folder, username, password) |
|
|||
350 | except: |
|
|||
351 | self.counter_imagwr = 0 |
|
|||
352 | raise ValueError, 'Error FTP' |
|
|||
353 |
|
||||
354 |
|
||||
355 |
|
||||
356 |
|
327 | |||
357 | class WindProfilerPlot(Figure): |
|
328 | class WindProfilerPlot(Figure): | |
358 |
|
329 | |||
@@ -375,7 +346,8 class WindProfilerPlot(Figure): | |||||
375 | self.HEIGHTPROF = 0 |
|
346 | self.HEIGHTPROF = 0 | |
376 | self.counter_imagwr = 0 |
|
347 | self.counter_imagwr = 0 | |
377 |
|
348 | |||
378 |
self.PLOT_CODE = |
|
349 | self.PLOT_CODE = WIND_CODE | |
|
350 | ||||
379 | self.FTP_WEI = None |
|
351 | self.FTP_WEI = None | |
380 | self.EXP_CODE = None |
|
352 | self.EXP_CODE = None | |
381 | self.SUB_EXP_CODE = None |
|
353 | self.SUB_EXP_CODE = None | |
@@ -559,32 +531,19 class WindProfilerPlot(Figure): | |||||
559 |
|
531 | |||
560 | self.draw() |
|
532 | self.draw() | |
561 |
|
533 | |||
562 | if save: |
|
|||
563 |
|
||||
564 | if self.figfile == None: |
|
|||
565 | str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") |
|
|||
566 | self.figfile = self.getFilename(name = str_datetime) |
|
|||
567 |
|
||||
568 | self.counter_imagwr += 1 |
|
|||
569 |
|
||||
570 | if (self.counter_imagwr>=wr_period): |
|
|||
571 | # store png plot to local folder |
|
|||
572 | self.saveFigure(figpath, self.figfile) |
|
|||
573 | self.counter_imagwr = 0 |
|
|||
574 |
|
||||
575 | if ftp: |
|
|||
576 | # store png plot to FTP server according to RT-Web format |
|
|||
577 | name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) |
|
|||
578 | ftp_filename = os.path.join(figpath, name) |
|
|||
579 | self.saveFigure(figpath, ftp_filename) |
|
|||
580 |
|
||||
581 |
|
||||
582 |
|
||||
583 | if x[1] >= self.axesList[0].xmax: |
|
534 | if x[1] >= self.axesList[0].xmax: | |
584 | self.counter_imagwr = wr_period |
|
535 | self.counter_imagwr = wr_period | |
585 | self.__isConfig = False |
|
536 | self.__isConfig = False | |
586 | self.figfile = None |
|
537 | self.figfile = None | |
587 |
|
538 | |||
|
539 | self.save(figpath=figpath, | |||
|
540 | figfile=figfile, | |||
|
541 | save=save, | |||
|
542 | ftp=ftp, | |||
|
543 | wr_period=wr_period, | |||
|
544 | thisDatetime=thisDatetime, | |||
|
545 | update_figfile=False) | |||
|
546 | ||||
588 |
|
547 | |||
589 | class ParametersPlot(Figure): |
|
548 | class ParametersPlot(Figure): | |
590 |
|
549 | |||
@@ -607,7 +566,8 class ParametersPlot(Figure): | |||||
607 | self.HEIGHTPROF = 0 |
|
566 | self.HEIGHTPROF = 0 | |
608 | self.counter_imagwr = 0 |
|
567 | self.counter_imagwr = 0 | |
609 |
|
568 | |||
610 |
self.PLOT_CODE = |
|
569 | self.PLOT_CODE = PARMS_CODE | |
|
570 | ||||
611 | self.FTP_WEI = None |
|
571 | self.FTP_WEI = None | |
612 | self.EXP_CODE = None |
|
572 | self.EXP_CODE = None | |
613 | self.SUB_EXP_CODE = None |
|
573 | self.SUB_EXP_CODE = None | |
@@ -786,31 +746,19 class ParametersPlot(Figure): | |||||
786 |
|
746 | |||
787 | self.draw() |
|
747 | self.draw() | |
788 |
|
748 | |||
789 | if save: |
|
|||
790 |
|
||||
791 | if self.figfile == None: |
|
|||
792 | str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") |
|
|||
793 | self.figfile = self.getFilename(name = str_datetime) |
|
|||
794 |
|
||||
795 | self.counter_imagwr += 1 |
|
|||
796 |
|
||||
797 | if (self.counter_imagwr>=wr_period): |
|
|||
798 | # store png plot to local folder |
|
|||
799 | self.saveFigure(figpath, self.figfile) |
|
|||
800 | self.counter_imagwr = 0 |
|
|||
801 |
|
||||
802 | if ftp: |
|
|||
803 | # store png plot to FTP server according to RT-Web format |
|
|||
804 | name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) |
|
|||
805 | ftp_filename = os.path.join(figpath, name) |
|
|||
806 | self.saveFigure(figpath, ftp_filename) |
|
|||
807 |
|
||||
808 | if x[1] >= self.axesList[0].xmax: |
|
749 | if x[1] >= self.axesList[0].xmax: | |
809 | self.counter_imagwr = wr_period |
|
750 | self.counter_imagwr = wr_period | |
810 | self.__isConfig = False |
|
751 | self.__isConfig = False | |
811 | self.figfile = None |
|
752 | self.figfile = None | |
812 |
|
753 | |||
813 |
|
754 | self.save(figpath=figpath, | ||
|
755 | figfile=figfile, | |||
|
756 | save=save, | |||
|
757 | ftp=ftp, | |||
|
758 | wr_period=wr_period, | |||
|
759 | thisDatetime=thisDatetime, | |||
|
760 | update_figfile=False) | |||
|
761 | ||||
814 | class SpectralFittingPlot(Figure): |
|
762 | class SpectralFittingPlot(Figure): | |
815 |
|
763 | |||
816 | __isConfig = None |
|
764 | __isConfig = None | |
@@ -828,6 +776,8 class SpectralFittingPlot(Figure): | |||||
828 | self.__isConfig = False |
|
776 | self.__isConfig = False | |
829 | self.__nsubplots = 1 |
|
777 | self.__nsubplots = 1 | |
830 |
|
778 | |||
|
779 | self.PLOT_CODE = SPECFIT_CODE | |||
|
780 | ||||
831 | self.WIDTH = 450 |
|
781 | self.WIDTH = 450 | |
832 | self.HEIGHT = 250 |
|
782 | self.HEIGHT = 250 | |
833 | self.WIDTHPROF = 0 |
|
783 | self.WIDTHPROF = 0 | |
@@ -977,13 +927,13 class SpectralFittingPlot(Figure): | |||||
977 | linestyle='solid', grid='both') |
|
927 | linestyle='solid', grid='both') | |
978 |
|
928 | |||
979 | self.draw() |
|
929 | self.draw() | |
980 |
|
930 | |||
981 | if save: |
|
931 | self.save(figpath=figpath, | |
982 | date = thisDatetime.strftime("%Y%m%d_%H%M%S") |
|
932 | figfile=figfile, | |
983 | if figfile == None: |
|
933 | save=save, | |
984 | figfile = self.getFilename(name = date) |
|
934 | ftp=ftp, | |
985 |
|
935 | wr_period=wr_period, | ||
986 | self.saveFigure(figpath, figfile) |
|
936 | thisDatetime=thisDatetime) | |
987 |
|
937 | |||
988 |
|
938 | |||
989 | class EWDriftsPlot(Figure): |
|
939 | class EWDriftsPlot(Figure): | |
@@ -1007,7 +957,8 class EWDriftsPlot(Figure): | |||||
1007 | self.HEIGHTPROF = 0 |
|
957 | self.HEIGHTPROF = 0 | |
1008 | self.counter_imagwr = 0 |
|
958 | self.counter_imagwr = 0 | |
1009 |
|
959 | |||
1010 |
self.PLOT_CODE = |
|
960 | self.PLOT_CODE = EWDRIFT_CODE | |
|
961 | ||||
1011 | self.FTP_WEI = None |
|
962 | self.FTP_WEI = None | |
1012 | self.EXP_CODE = None |
|
963 | self.EXP_CODE = None | |
1013 | self.SUB_EXP_CODE = None |
|
964 | self.SUB_EXP_CODE = None | |
@@ -1183,26 +1134,15 class EWDriftsPlot(Figure): | |||||
1183 |
|
1134 | |||
1184 | self.draw() |
|
1135 | self.draw() | |
1185 |
|
1136 | |||
1186 | if save: |
|
|||
1187 |
|
||||
1188 | if self.figfile == None: |
|
|||
1189 | str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") |
|
|||
1190 | self.figfile = self.getFilename(name = str_datetime) |
|
|||
1191 |
|
||||
1192 | self.counter_imagwr += 1 |
|
|||
1193 |
|
||||
1194 | if (self.counter_imagwr>=wr_period): |
|
|||
1195 | # store png plot to local folder |
|
|||
1196 | self.saveFigure(figpath, self.figfile) |
|
|||
1197 | self.counter_imagwr = 0 |
|
|||
1198 |
|
||||
1199 | if ftp: |
|
|||
1200 | # store png plot to FTP server according to RT-Web format |
|
|||
1201 | name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) |
|
|||
1202 | ftp_filename = os.path.join(figpath, name) |
|
|||
1203 | self.saveFigure(figpath, ftp_filename) |
|
|||
1204 |
|
||||
1205 | if x[1] >= self.axesList[0].xmax: |
|
1137 | if x[1] >= self.axesList[0].xmax: | |
1206 | self.counter_imagwr = wr_period |
|
1138 | self.counter_imagwr = wr_period | |
1207 | self.__isConfig = False |
|
1139 | self.__isConfig = False | |
1208 | self.figfile = None No newline at end of file |
|
1140 | self.figfile = None | |
|
1141 | ||||
|
1142 | self.save(figpath=figpath, | |||
|
1143 | figfile=figfile, | |||
|
1144 | save=save, | |||
|
1145 | ftp=ftp, | |||
|
1146 | wr_period=wr_period, | |||
|
1147 | thisDatetime=thisDatetime, | |||
|
1148 | update_figfile=False) No newline at end of file |
@@ -8,6 +8,7 import datetime | |||||
8 | import numpy |
|
8 | import numpy | |
9 |
|
9 | |||
10 | from figure import Figure, isRealtime |
|
10 | from figure import Figure, isRealtime | |
|
11 | from plotting_codes import * | |||
11 |
|
12 | |||
12 | class SpectraPlot(Figure): |
|
13 | class SpectraPlot(Figure): | |
13 |
|
14 | |||
@@ -29,7 +30,8 class SpectraPlot(Figure): | |||||
29 | self.HEIGHTPROF = 0 |
|
30 | self.HEIGHTPROF = 0 | |
30 | self.counter_imagwr = 0 |
|
31 | self.counter_imagwr = 0 | |
31 |
|
32 | |||
32 |
self.PLOT_CODE = |
|
33 | self.PLOT_CODE = SPEC_CODE | |
|
34 | ||||
33 | self.FTP_WEI = None |
|
35 | self.FTP_WEI = None | |
34 | self.EXP_CODE = None |
|
36 | self.EXP_CODE = None | |
35 | self.SUB_EXP_CODE = None |
|
37 | self.SUB_EXP_CODE = None | |
@@ -188,31 +190,20 class SpectraPlot(Figure): | |||||
188 | axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2) |
|
190 | axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2) | |
189 |
|
191 | |||
190 | self.draw() |
|
192 | self.draw() | |
191 |
|
|
193 | ||
192 |
if |
|
194 | if figfile == None: | |
193 |
|
195 | str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") | ||
194 | if figfile == None: |
|
196 | name = str_datetime | |
195 | str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") |
|
197 | if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)): | |
196 | figfile = self.getFilename(name = str_datetime) |
|
198 | name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith) | |
197 | name = str_datetime |
|
199 | figfile = self.getFilename(name) | |
198 | if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)): |
|
|||
199 | name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith) |
|
|||
200 | figfile = self.getFilename(name) |
|
|||
201 |
|
||||
202 | self.counter_imagwr += 1 |
|
|||
203 |
|
||||
204 | if (self.counter_imagwr>=wr_period): |
|
|||
205 | # store png plot to local folder |
|
|||
206 | self.saveFigure(figpath, figfile) |
|
|||
207 | self.counter_imagwr = 0 |
|
|||
208 |
|
200 | |||
209 | if ftp: |
|
201 | self.save(figpath=figpath, | |
210 | # store png plot to FTP server according to RT-Web format |
|
202 | figfile=figfile, | |
211 | name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) |
|
203 | save=save, | |
212 | ftp_filename = os.path.join(figpath, name) |
|
204 | ftp=ftp, | |
213 | self.saveFigure(figpath, ftp_filename) |
|
205 | wr_period=wr_period, | |
214 |
|
206 | thisDatetime=thisDatetime) | ||
215 |
|
||||
216 |
|
207 | |||
217 | class CrossSpectraPlot(Figure): |
|
208 | class CrossSpectraPlot(Figure): | |
218 |
|
209 | |||
@@ -235,7 +226,7 class CrossSpectraPlot(Figure): | |||||
235 | self.WIDTHPROF = 0 |
|
226 | self.WIDTHPROF = 0 | |
236 | self.HEIGHTPROF = 0 |
|
227 | self.HEIGHTPROF = 0 | |
237 |
|
228 | |||
238 |
self.PLOT_CODE = |
|
229 | self.PLOT_CODE = CROSS_CODE | |
239 | self.FTP_WEI = None |
|
230 | self.FTP_WEI = None | |
240 | self.EXP_CODE = None |
|
231 | self.EXP_CODE = None | |
241 | self.SUB_EXP_CODE = None |
|
232 | self.SUB_EXP_CODE = None | |
@@ -397,24 +388,12 class CrossSpectraPlot(Figure): | |||||
397 |
|
388 | |||
398 | self.draw() |
|
389 | self.draw() | |
399 |
|
390 | |||
400 | if save != '': |
|
391 | self.save(figpath=figpath, | |
401 |
|
392 | figfile=figfile, | ||
402 | if figfile == None: |
|
393 | save=save, | |
403 | str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") |
|
394 | ftp=ftp, | |
404 | figfile = self.getFilename(name = str_datetime) |
|
395 | wr_period=wr_period, | |
405 |
|
396 | thisDatetime=thisDatetime) | ||
406 | self.counter_imagwr += 1 |
|
|||
407 |
|
||||
408 | if (self.counter_imagwr>=wr_period): |
|
|||
409 | # store png plot to local folder |
|
|||
410 | self.saveFigure(figpath, figfile) |
|
|||
411 | self.counter_imagwr = 0 |
|
|||
412 |
|
||||
413 | if ftp: |
|
|||
414 | # store png plot to FTP server according to RT-Web format |
|
|||
415 | name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) |
|
|||
416 | ftp_filename = os.path.join(figpath, name) |
|
|||
417 | self.saveFigure(figpath, ftp_filename) |
|
|||
418 |
|
397 | |||
419 |
|
398 | |||
420 | class RTIPlot(Figure): |
|
399 | class RTIPlot(Figure): | |
@@ -438,7 +417,8 class RTIPlot(Figure): | |||||
438 | self.HEIGHTPROF = 0 |
|
417 | self.HEIGHTPROF = 0 | |
439 | self.counter_imagwr = 0 |
|
418 | self.counter_imagwr = 0 | |
440 |
|
419 | |||
441 |
self.PLOT_CODE = |
|
420 | self.PLOT_CODE = RTI_CODE | |
|
421 | ||||
442 | self.FTP_WEI = None |
|
422 | self.FTP_WEI = None | |
443 | self.EXP_CODE = None |
|
423 | self.EXP_CODE = None | |
444 | self.SUB_EXP_CODE = None |
|
424 | self.SUB_EXP_CODE = None | |
@@ -603,30 +583,19 class RTIPlot(Figure): | |||||
603 | grid='x') |
|
583 | grid='x') | |
604 |
|
584 | |||
605 | self.draw() |
|
585 | self.draw() | |
606 |
|
||||
607 | if save: |
|
|||
608 |
|
586 | |||
609 | if self.figfile == None: |
|
|||
610 | str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") |
|
|||
611 | self.figfile = self.getFilename(name = str_datetime) |
|
|||
612 |
|
||||
613 | self.counter_imagwr += 1 |
|
|||
614 |
|
||||
615 | if (self.counter_imagwr>=wr_period): |
|
|||
616 | # store png plot to local folder |
|
|||
617 | self.saveFigure(figpath, self.figfile) |
|
|||
618 | self.counter_imagwr = 0 |
|
|||
619 |
|
||||
620 | if ftp: |
|
|||
621 | # store png plot to FTP server according to RT-Web format |
|
|||
622 | name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) |
|
|||
623 | ftp_filename = os.path.join(figpath, name) |
|
|||
624 | self.saveFigure(figpath, ftp_filename) |
|
|||
625 |
|
||||
626 | if x[1] >= self.axesList[0].xmax: |
|
587 | if x[1] >= self.axesList[0].xmax: | |
627 | self.counter_imagwr = wr_period |
|
588 | self.counter_imagwr = wr_period | |
628 | self.__isConfig = False |
|
589 | self.__isConfig = False | |
629 | self.figfile = None |
|
590 | self.figfile = None | |
|
591 | ||||
|
592 | self.save(figpath=figpath, | |||
|
593 | figfile=figfile, | |||
|
594 | save=save, | |||
|
595 | ftp=ftp, | |||
|
596 | wr_period=wr_period, | |||
|
597 | thisDatetime=thisDatetime, | |||
|
598 | update_figfile=False) | |||
630 |
|
599 | |||
631 | class CoherenceMap(Figure): |
|
600 | class CoherenceMap(Figure): | |
632 | isConfig = None |
|
601 | isConfig = None | |
@@ -647,7 +616,8 class CoherenceMap(Figure): | |||||
647 | self.HEIGHTPROF = 0 |
|
616 | self.HEIGHTPROF = 0 | |
648 | self.counter_imagwr = 0 |
|
617 | self.counter_imagwr = 0 | |
649 |
|
618 | |||
650 |
self.PLOT_CODE = |
|
619 | self.PLOT_CODE = COH_CODE | |
|
620 | ||||
651 | self.FTP_WEI = None |
|
621 | self.FTP_WEI = None | |
652 | self.EXP_CODE = None |
|
622 | self.EXP_CODE = None | |
653 | self.SUB_EXP_CODE = None |
|
623 | self.SUB_EXP_CODE = None | |
@@ -815,27 +785,18 class CoherenceMap(Figure): | |||||
815 | if x[1] >= self.axesList[0].xmax: |
|
785 | if x[1] >= self.axesList[0].xmax: | |
816 | self.counter_imagwr = wr_period |
|
786 | self.counter_imagwr = wr_period | |
817 | self.__isConfig = False |
|
787 | self.__isConfig = False | |
818 |
|
788 | self.figfile = None | ||
819 | if save: |
|
|||
820 |
|
||||
821 | if figfile == None: |
|
|||
822 | str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") |
|
|||
823 | figfile = self.getFilename(name = str_datetime) |
|
|||
824 |
|
||||
825 | self.counter_imagwr += 1 |
|
|||
826 |
|
789 | |||
827 | if (self.counter_imagwr>=wr_period): |
|
790 | self.save(figpath=figpath, | |
828 | # store png plot to local folder |
|
791 | figfile=figfile, | |
829 | self.saveFigure(figpath, figfile) |
|
792 | save=save, | |
830 | self.counter_imagwr = 0 |
|
793 | ftp=ftp, | |
831 |
|
794 | wr_period=wr_period, | ||
832 | if ftp: |
|
795 | thisDatetime=thisDatetime, | |
833 | # store png plot to FTP server according to RT-Web format |
|
796 | update_figfile=False) | |
834 | name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) |
|
|||
835 | ftp_filename = os.path.join(figpath, name) |
|
|||
836 | self.saveFigure(figpath, ftp_filename) |
|
|||
837 |
|
797 | |||
838 | class PowerProfile(Figure): |
|
798 | class PowerProfile(Figure): | |
|
799 | ||||
839 | isConfig = None |
|
800 | isConfig = None | |
840 | __nsubplots = None |
|
801 | __nsubplots = None | |
841 |
|
802 | |||
@@ -847,6 +808,8 class PowerProfile(Figure): | |||||
847 | self.isConfig = False |
|
808 | self.isConfig = False | |
848 | self.__nsubplots = 1 |
|
809 | self.__nsubplots = 1 | |
849 |
|
810 | |||
|
811 | self.PLOT_CODE = POWER_CODE | |||
|
812 | ||||
850 | self.WIDTH = 300 |
|
813 | self.WIDTH = 300 | |
851 | self.HEIGHT = 500 |
|
814 | self.HEIGHT = 500 | |
852 | self.counter_imagwr = 0 |
|
815 | self.counter_imagwr = 0 | |
@@ -948,18 +911,12 class PowerProfile(Figure): | |||||
948 |
|
911 | |||
949 | self.draw() |
|
912 | self.draw() | |
950 |
|
913 | |||
951 | if save: |
|
914 | self.save(figpath=figpath, | |
952 |
|
915 | figfile=figfile, | ||
953 | if figfile == None: |
|
916 | save=save, | |
954 | str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") |
|
917 | ftp=ftp, | |
955 | figfile = self.getFilename(name = str_datetime) |
|
918 | wr_period=wr_period, | |
956 |
|
919 | thisDatetime=thisDatetime) | ||
957 | self.counter_imagwr += 1 |
|
|||
958 |
|
||||
959 | if (self.counter_imagwr>=wr_period): |
|
|||
960 | # store png plot to local folder |
|
|||
961 | self.saveFigure(figpath, figfile) |
|
|||
962 | self.counter_imagwr = 0 |
|
|||
963 |
|
920 | |||
964 | class Noise(Figure): |
|
921 | class Noise(Figure): | |
965 |
|
922 | |||
@@ -981,7 +938,8 class Noise(Figure): | |||||
981 | self.xdata = None |
|
938 | self.xdata = None | |
982 | self.ydata = None |
|
939 | self.ydata = None | |
983 |
|
940 | |||
984 |
self.PLOT_CODE = |
|
941 | self.PLOT_CODE = NOISE_CODE | |
|
942 | ||||
985 | self.FTP_WEI = None |
|
943 | self.FTP_WEI = None | |
986 | self.EXP_CODE = None |
|
944 | self.EXP_CODE = None | |
987 | self.SUB_EXP_CODE = None |
|
945 | self.SUB_EXP_CODE = None | |
@@ -1137,25 +1095,15 class Noise(Figure): | |||||
1137 | del self.xdata |
|
1095 | del self.xdata | |
1138 | del self.ydata |
|
1096 | del self.ydata | |
1139 | self.__isConfig = False |
|
1097 | self.__isConfig = False | |
1140 |
|
1098 | self.figfile = None | ||
1141 | if save != '': |
|
|||
1142 |
|
||||
1143 | if self.figfile == None: |
|
|||
1144 | str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") |
|
|||
1145 | self.figfile = self.getFilename(name = str_datetime) |
|
|||
1146 |
|
||||
1147 | self.counter_imagwr += 1 |
|
|||
1148 |
|
1099 | |||
1149 | if (self.counter_imagwr>=wr_period): |
|
1100 | self.save(figpath=figpath, | |
1150 | # store png plot to local folder |
|
1101 | figfile=figfile, | |
1151 | self.saveFigure(figpath, self.figfile) |
|
1102 | save=save, | |
1152 | self.counter_imagwr = 0 |
|
1103 | ftp=ftp, | |
1153 |
|
1104 | wr_period=wr_period, | ||
1154 | if ftp: |
|
1105 | thisDatetime=thisDatetime, | |
1155 | # store png plot to FTP server according to RT-Web format |
|
1106 | update_figfile=False) | |
1156 | name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) |
|
|||
1157 | ftp_filename = os.path.join(figpath, name) |
|
|||
1158 | self.saveFigure(figpath, ftp_filename) |
|
|||
1159 |
|
1107 | |||
1160 |
|
1108 | |||
1161 | class BeaconPhase(Figure): |
|
1109 | class BeaconPhase(Figure): | |
@@ -1178,7 +1126,8 class BeaconPhase(Figure): | |||||
1178 | self.xdata = None |
|
1126 | self.xdata = None | |
1179 | self.ydata = None |
|
1127 | self.ydata = None | |
1180 |
|
1128 | |||
1181 |
self.PLOT_CODE = |
|
1129 | self.PLOT_CODE = BEACON_CODE | |
|
1130 | ||||
1182 | self.FTP_WEI = None |
|
1131 | self.FTP_WEI = None | |
1183 | self.EXP_CODE = None |
|
1132 | self.EXP_CODE = None | |
1184 | self.SUB_EXP_CODE = None |
|
1133 | self.SUB_EXP_CODE = None | |
@@ -1354,22 +1303,12 class BeaconPhase(Figure): | |||||
1354 | del self.xdata |
|
1303 | del self.xdata | |
1355 | del self.ydata |
|
1304 | del self.ydata | |
1356 | self.__isConfig = False |
|
1305 | self.__isConfig = False | |
1357 |
|
1306 | self.figfile = None | ||
1358 | if save: |
|
|||
1359 |
|
||||
1360 | if self.figfile == None: |
|
|||
1361 | str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") |
|
|||
1362 | self.figfile = self.getFilename(name = str_datetime) |
|
|||
1363 |
|
||||
1364 | self.counter_imagwr += 1 |
|
|||
1365 |
|
1307 | |||
1366 | if (self.counter_imagwr>=wr_period): |
|
1308 | self.save(figpath=figpath, | |
1367 | # store png plot to local folder |
|
1309 | figfile=figfile, | |
1368 | self.saveFigure(figpath, self.figfile) |
|
1310 | save=save, | |
1369 | self.counter_imagwr = 0 |
|
1311 | ftp=ftp, | |
1370 |
|
1312 | wr_period=wr_period, | ||
1371 | if ftp: |
|
1313 | thisDatetime=thisDatetime, | |
1372 | # store png plot to FTP server according to RT-Web format |
|
1314 | update_figfile=False) | |
1373 | name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) |
|
|||
1374 | ftp_filename = os.path.join(figpath, name) |
|
|||
1375 | self.saveFigure(figpath, ftp_filename) |
|
@@ -172,15 +172,9 class Scope(Figure): | |||||
172 |
|
172 | |||
173 | self.draw() |
|
173 | self.draw() | |
174 |
|
174 | |||
175 | if save: |
|
175 | self.save(figpath=figpath, | |
176 | date = thisDatetime.strftime("%Y%m%d_%H%M%S") |
|
176 | figfile=figfile, | |
177 | if figfile == None: |
|
177 | save=save, | |
178 | figfile = self.getFilename(name = date) |
|
178 | ftp=ftp, | |
179 |
|
179 | wr_period=wr_period, | ||
180 | self.saveFigure(figpath, figfile) |
|
180 | thisDatetime=thisDatetime) | |
181 |
|
||||
182 | self.counter_imagwr += 1 |
|
|||
183 | if (ftp and (self.counter_imagwr==wr_period)): |
|
|||
184 | ftp_filename = os.path.join(figpath,figfile) |
|
|||
185 | self.sendByFTP_Thread(ftp_filename, server, folder, username, password) |
|
|||
186 | self.counter_imagwr = 0 |
|
@@ -598,7 +598,7 class JRODataReader(JRODataIO): | |||||
598 | self.fileSize = fileSize |
|
598 | self.fileSize = fileSize | |
599 | self.fp = fp |
|
599 | self.fp = fp | |
600 |
|
600 | |||
601 | print "Setting the file: %s"%self.filename |
|
601 | print "[Reading] Setting the file: %s"%self.filename | |
602 |
|
602 | |||
603 | return 1 |
|
603 | return 1 | |
604 |
|
604 | |||
@@ -681,14 +681,14 class JRODataReader(JRODataIO): | |||||
681 | if self.fp != None: self.fp.close() |
|
681 | if self.fp != None: self.fp.close() | |
682 | self.fp = open(fullfilename, 'rb') |
|
682 | self.fp = open(fullfilename, 'rb') | |
683 | self.flagNoMoreFiles = 0 |
|
683 | self.flagNoMoreFiles = 0 | |
684 | print 'Setting the file: %s' % fullfilename |
|
684 | print '[Reading] Setting the file: %s' % fullfilename | |
685 | else: |
|
685 | else: | |
686 | self.fileSize = 0 |
|
686 | self.fileSize = 0 | |
687 | self.filename = None |
|
687 | self.filename = None | |
688 | self.flagIsNewFile = 0 |
|
688 | self.flagIsNewFile = 0 | |
689 | self.fp = None |
|
689 | self.fp = None | |
690 | self.flagNoMoreFiles = 1 |
|
690 | self.flagNoMoreFiles = 1 | |
691 |
print 'No more |
|
691 | print '[Reading] No more files to read' | |
692 |
|
692 | |||
693 | return fileOk_flag |
|
693 | return fileOk_flag | |
694 |
|
694 | |||
@@ -959,7 +959,7 class JRODataReader(JRODataIO): | |||||
959 | sleep( self.delay ) |
|
959 | sleep( self.delay ) | |
960 |
|
960 | |||
961 | if not(fullpath): |
|
961 | if not(fullpath): | |
962 | print "There 'isn't any valid file in %s" % path |
|
962 | print "[Reading] There 'isn't any valid file in %s" % path | |
963 | return None |
|
963 | return None | |
964 |
|
964 | |||
965 | self.year = year |
|
965 | self.year = year |
@@ -105,7 +105,7 class USRPReaderAPI(USRPReader, threading.Thread): | |||||
105 | def run(self): |
|
105 | def run(self): | |
106 |
|
106 | |||
107 | ''' |
|
107 | ''' | |
108 |
This method will be called |
|
108 | This method will be called once when start() is called | |
109 | ''' |
|
109 | ''' | |
110 |
|
110 | |||
111 | if not self.isConfig: |
|
111 | if not self.isConfig: |
@@ -32,7 +32,7 class ProcessingUnit(object): | |||||
32 | self.dataIn = None |
|
32 | self.dataIn = None | |
33 | self.dataInList = [] |
|
33 | self.dataInList = [] | |
34 |
|
34 | |||
35 |
self.dataOut = |
|
35 | self.dataOut = None | |
36 |
|
36 | |||
37 | self.operations2RunDict = {} |
|
37 | self.operations2RunDict = {} | |
38 |
|
38 | |||
@@ -108,7 +108,10 class ProcessingUnit(object): | |||||
108 | # |
|
108 | # | |
109 | # if name != 'run': |
|
109 | # if name != 'run': | |
110 | # return True |
|
110 | # return True | |
111 |
|
|
111 | ||
|
112 | if self.dataOut == None: | |||
|
113 | return False | |||
|
114 | ||||
112 | if self.dataOut.isEmpty(): |
|
115 | if self.dataOut.isEmpty(): | |
113 | return False |
|
116 | return False | |
114 |
|
117 | |||
@@ -218,7 +221,11 class ProcessingUnit(object): | |||||
218 | def run(self): |
|
221 | def run(self): | |
219 |
|
222 | |||
220 | raise ValueError, "Not implemented" |
|
223 | raise ValueError, "Not implemented" | |
221 |
|
|
224 | ||
|
225 | def close(self): | |||
|
226 | #Close every thread, queue or any other object here is it is neccesary. | |||
|
227 | return | |||
|
228 | ||||
222 | class Operation(object): |
|
229 | class Operation(object): | |
223 |
|
230 | |||
224 | """ |
|
231 | """ |
This diff has been collapsed as it changes many lines, (565 lines changed) Show them Hide them | |||||
@@ -4,9 +4,565 | |||||
4 | import os |
|
4 | import os | |
5 | import glob |
|
5 | import glob | |
6 | import ftplib |
|
6 | import ftplib | |
|
7 | ||||
|
8 | try: | |||
|
9 | import paramiko | |||
|
10 | import scp | |||
|
11 | except: | |||
|
12 | print "You should install paramiko if you will use SSH protocol to upload files to a server" | |||
|
13 | ||||
7 | import multiprocessing |
|
14 | import multiprocessing | |
|
15 | ||||
|
16 | import time | |||
|
17 | import threading | |||
|
18 | ||||
|
19 | ||||
|
20 | try: | |||
|
21 | from gevent import sleep | |||
|
22 | except: | |||
|
23 | from time import sleep | |||
|
24 | ||||
8 | from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation |
|
25 | from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation | |
9 |
|
26 | |||
|
27 | class Remote(threading.Thread): | |||
|
28 | """ | |||
|
29 | Remote is a parent class used to define the behaviour of FTP and SSH class. These clases are | |||
|
30 | used to upload or download files remotely. | |||
|
31 | ||||
|
32 | Non-standard Python modules used: | |||
|
33 | None | |||
|
34 | ||||
|
35 | Written by: | |||
|
36 | ||||
|
37 | "Miguel Urco":mailto:miguel.urco@jro.igp.gob.pe Jun. 03, 2015 | |||
|
38 | ||||
|
39 | """ | |||
|
40 | ||||
|
41 | server = None | |||
|
42 | username = None | |||
|
43 | password = None | |||
|
44 | remotefolder = None | |||
|
45 | ||||
|
46 | period = 60 | |||
|
47 | fileList = [] | |||
|
48 | bussy = False | |||
|
49 | ||||
|
50 | def __init__(self, server, username, password, remotefolder, period=60): | |||
|
51 | ||||
|
52 | threading.Thread.__init__(self) | |||
|
53 | self._stop = threading.Event() | |||
|
54 | ||||
|
55 | self.status = 0 | |||
|
56 | ||||
|
57 | self.period = period | |||
|
58 | self.fileList = [] | |||
|
59 | self.bussy = False | |||
|
60 | ||||
|
61 | self.stopFlag = False | |||
|
62 | ||||
|
63 | print "[Remote Server] Opening server: %s" %server | |||
|
64 | if self.open(server, username, password, remotefolder): | |||
|
65 | print "[Remote Server] %s server was opened successfully" %server | |||
|
66 | ||||
|
67 | def stop(self): | |||
|
68 | ||||
|
69 | self.stopFlag = True | |||
|
70 | ||||
|
71 | def open(self): | |||
|
72 | """ | |||
|
73 | Connect to server and create a connection class (FTP or SSH) to remote server. | |||
|
74 | """ | |||
|
75 | raise NotImplementedError, "Implement this method in child class" | |||
|
76 | ||||
|
77 | def close(self): | |||
|
78 | """ | |||
|
79 | Close connection to server | |||
|
80 | """ | |||
|
81 | raise NotImplementedError, "Implement this method in child class" | |||
|
82 | ||||
|
83 | def mkdir(self, remotefolder): | |||
|
84 | """ | |||
|
85 | Create a folder remotely | |||
|
86 | """ | |||
|
87 | raise NotImplementedError, "Implement this method in child class" | |||
|
88 | ||||
|
89 | def cd(self, remotefolder): | |||
|
90 | """ | |||
|
91 | Change working directory in remote server | |||
|
92 | """ | |||
|
93 | raise NotImplementedError, "Implement this method in child class" | |||
|
94 | ||||
|
95 | def download(self, filename, localfolder=None): | |||
|
96 | """ | |||
|
97 | Download a file from server to local host | |||
|
98 | """ | |||
|
99 | raise NotImplementedError, "Implement this method in child class" | |||
|
100 | ||||
|
101 | def sendFile(self, fullfilename): | |||
|
102 | """ | |||
|
103 | sendFile method is used to upload a local file to the current directory in remote server | |||
|
104 | ||||
|
105 | Inputs: | |||
|
106 | fullfilename - full path name of local file to store in remote directory | |||
|
107 | ||||
|
108 | Returns: | |||
|
109 | 0 in error case else 1 | |||
|
110 | """ | |||
|
111 | raise NotImplementedError, "Implement this method in child class" | |||
|
112 | ||||
|
113 | def upload(self, fullfilename, remotefolder=None): | |||
|
114 | """ | |||
|
115 | upload method is used to upload a local file to remote directory. This method changes | |||
|
116 | working directory before sending a file. | |||
|
117 | ||||
|
118 | Inputs: | |||
|
119 | fullfilename - full path name of local file to store in remote directory | |||
|
120 | ||||
|
121 | remotefolder - remote directory | |||
|
122 | ||||
|
123 | Returns: | |||
|
124 | 0 in error case else 1 | |||
|
125 | """ | |||
|
126 | print "[Remote Server] Uploading %s to %s:%s" %(fullfilename, self.server, self.remotefolder) | |||
|
127 | ||||
|
128 | if not self.status: | |||
|
129 | return 0 | |||
|
130 | ||||
|
131 | if remotefolder == None: | |||
|
132 | remotefolder = self.remotefolder | |||
|
133 | ||||
|
134 | if not self.cd(remotefolder): | |||
|
135 | return 0 | |||
|
136 | ||||
|
137 | if not self.sendFile(fullfilename): | |||
|
138 | print "[Remote Server] Error uploading file %s" %fullfilename | |||
|
139 | return 0 | |||
|
140 | ||||
|
141 | print "[Remote Server] upload finished successfully" | |||
|
142 | ||||
|
143 | return 1 | |||
|
144 | ||||
|
145 | def delete(self, filename): | |||
|
146 | """ | |||
|
147 | Remove a file from remote server | |||
|
148 | """ | |||
|
149 | pass | |||
|
150 | ||||
|
151 | def updateFileList(self, fileList): | |||
|
152 | """ | |||
|
153 | Remove a file from remote server | |||
|
154 | """ | |||
|
155 | ||||
|
156 | if fileList == self.fileList: | |||
|
157 | return 1 | |||
|
158 | ||||
|
159 | init = time.time() | |||
|
160 | ||||
|
161 | while(self.bussy): | |||
|
162 | sleep(0.1) | |||
|
163 | if time.time() - init > 2*self.period: | |||
|
164 | return 0 | |||
|
165 | ||||
|
166 | self.fileList = fileList | |||
|
167 | ||||
|
168 | return 1 | |||
|
169 | ||||
|
170 | def run(self): | |||
|
171 | ||||
|
172 | if not self.cd(self.remotefolder): | |||
|
173 | raise ValueError, "It could not change to the new remote directory: %s" %remotefolder | |||
|
174 | ||||
|
175 | while True: | |||
|
176 | ||||
|
177 | sleep(self.period) | |||
|
178 | ||||
|
179 | self.bussy = True | |||
|
180 | ||||
|
181 | for thisFile in self.fileList: | |||
|
182 | self.upload(thisFile, self.remotefolder) | |||
|
183 | ||||
|
184 | self.bussy = False | |||
|
185 | ||||
|
186 | if self.stopFlag: | |||
|
187 | break | |||
|
188 | ||||
|
189 | print "[Remote Server] Thread stopped successfully" | |||
|
190 | ||||
|
191 | class FTPClient(Remote): | |||
|
192 | ||||
|
193 | __ftpClientObj = None | |||
|
194 | ||||
|
195 | def __init__(self, server, username, password, remotefolder, period=60): | |||
|
196 | """ | |||
|
197 | """ | |||
|
198 | Remote.__init__(self, server, username, password, remotefolder, period) | |||
|
199 | ||||
|
200 | def open(self, server, username, password, remotefolder): | |||
|
201 | ||||
|
202 | """ | |||
|
203 | This method is used to set FTP parameters and establish a connection to remote server | |||
|
204 | ||||
|
205 | Inputs: | |||
|
206 | server - remote server IP Address | |||
|
207 | ||||
|
208 | username - remote server Username | |||
|
209 | ||||
|
210 | password - remote server password | |||
|
211 | ||||
|
212 | remotefolder - remote server current working directory | |||
|
213 | ||||
|
214 | Return: void | |||
|
215 | ||||
|
216 | Affects: | |||
|
217 | self.status - in case of error or fail connection this parameter is set to 0 else 1 | |||
|
218 | ||||
|
219 | """ | |||
|
220 | ||||
|
221 | if server == None: | |||
|
222 | raise ValueError, "FTP server should be defined" | |||
|
223 | ||||
|
224 | if username == None: | |||
|
225 | raise ValueError, "FTP username should be defined" | |||
|
226 | ||||
|
227 | if password == None: | |||
|
228 | raise ValueError, "FTP password should be defined" | |||
|
229 | ||||
|
230 | if remotefolder == None: | |||
|
231 | raise ValueError, "FTP remote folder should be defined" | |||
|
232 | ||||
|
233 | try: | |||
|
234 | ftpClientObj = ftplib.FTP(server) | |||
|
235 | except ftplib.all_errors: | |||
|
236 | print "FTP server connection fail: %s" %server | |||
|
237 | self.status = 0 | |||
|
238 | return 0 | |||
|
239 | ||||
|
240 | try: | |||
|
241 | ftpClientObj.login(username, password) | |||
|
242 | except ftplib.all_errors: | |||
|
243 | print "FTP username or password are incorrect" | |||
|
244 | self.status = 0 | |||
|
245 | return 0 | |||
|
246 | ||||
|
247 | if remotefolder == None: | |||
|
248 | remotefolder = ftpClientObj.pwd() | |||
|
249 | else: | |||
|
250 | try: | |||
|
251 | ftpClientObj.cwd(remotefolder) | |||
|
252 | except ftplib.all_errors: | |||
|
253 | print "FTP remote folder is invalid: %s" %remotefolder | |||
|
254 | remotefolder = ftpClientObj.pwd() | |||
|
255 | ||||
|
256 | self.server = server | |||
|
257 | self.username = username | |||
|
258 | self.password = password | |||
|
259 | self.remotefolder = remotefolder | |||
|
260 | self.__ftpClientObj = ftpClientObj | |||
|
261 | self.status = 1 | |||
|
262 | ||||
|
263 | return 1 | |||
|
264 | ||||
|
265 | def close(self): | |||
|
266 | """ | |||
|
267 | Close connection to remote server | |||
|
268 | """ | |||
|
269 | if not self.status: | |||
|
270 | return 0 | |||
|
271 | ||||
|
272 | self.__ftpClientObj.close() | |||
|
273 | ||||
|
274 | def mkdir(self, remotefolder): | |||
|
275 | """ | |||
|
276 | mkdir is used to make a new directory in remote server | |||
|
277 | ||||
|
278 | Input: | |||
|
279 | remotefolder - directory name | |||
|
280 | ||||
|
281 | Return: | |||
|
282 | 0 in error case else 1 | |||
|
283 | """ | |||
|
284 | if not self.status: | |||
|
285 | return 0 | |||
|
286 | ||||
|
287 | try: | |||
|
288 | self.__ftpClientObj.mkd(dirname) | |||
|
289 | except ftplib.all_errors: | |||
|
290 | print "Error creating remote folder: %s" %remotefolder | |||
|
291 | return 0 | |||
|
292 | ||||
|
293 | return 1 | |||
|
294 | ||||
|
295 | def cd(self, remotefolder): | |||
|
296 | """ | |||
|
297 | cd is used to change remote working directory on server | |||
|
298 | ||||
|
299 | Input: | |||
|
300 | remotefolder - current working directory | |||
|
301 | ||||
|
302 | Affects: | |||
|
303 | self.remotefolder | |||
|
304 | ||||
|
305 | Return: | |||
|
306 | 0 in case of error else 1 | |||
|
307 | """ | |||
|
308 | if not self.status: | |||
|
309 | return 0 | |||
|
310 | ||||
|
311 | if remotefolder == self.remotefolder: | |||
|
312 | return 1 | |||
|
313 | ||||
|
314 | try: | |||
|
315 | self.__ftpClientObj.cwd(remotefolder) | |||
|
316 | except ftplib.all_errors: | |||
|
317 | print 'Error changing to %s' %remotefolder | |||
|
318 | print 'Trying to create remote folder' | |||
|
319 | ||||
|
320 | if not self.mkdir(remotefolder): | |||
|
321 | print 'Remote folder could not be created' | |||
|
322 | return 0 | |||
|
323 | ||||
|
324 | try: | |||
|
325 | self.__ftpClientObj.cwd(remotefolder) | |||
|
326 | except ftplib.all_errors: | |||
|
327 | return 0 | |||
|
328 | ||||
|
329 | self.remotefolder = remotefolder | |||
|
330 | ||||
|
331 | return 1 | |||
|
332 | ||||
|
333 | def sendFile(self, fullfilename): | |||
|
334 | ||||
|
335 | if not self.status: | |||
|
336 | return 0 | |||
|
337 | ||||
|
338 | file = open(fullfilename, 'rb') | |||
|
339 | ||||
|
340 | filename = os.path.split(fullfilename)[-1] | |||
|
341 | ||||
|
342 | command = "STOR %s" %filename | |||
|
343 | ||||
|
344 | try: | |||
|
345 | self.__ftpClientObj.storbinary(command, file) | |||
|
346 | except ftplib.all_errors: | |||
|
347 | return 0 | |||
|
348 | ||||
|
349 | try: | |||
|
350 | self.__ftpClientObj.sendcmd('SITE CHMOD 755 ' + filename) | |||
|
351 | except ftplib.all_errors, e: | |||
|
352 | print e | |||
|
353 | ||||
|
354 | file.close() | |||
|
355 | ||||
|
356 | return 1 | |||
|
357 | ||||
|
358 | class SSHClient(Remote): | |||
|
359 | ||||
|
360 | __sshClientObj = None | |||
|
361 | __scpClientObj = None | |||
|
362 | ||||
|
363 | def __init__(self, server, username, password, remotefolder, period=60): | |||
|
364 | """ | |||
|
365 | """ | |||
|
366 | Remote.__init__(self, server, username, password, remotefolder, period) | |||
|
367 | ||||
|
368 | def open(self, server, username, password, remotefolder, port=22): | |||
|
369 | ||||
|
370 | """ | |||
|
371 | This method is used to set SSH parameters and establish a connection to a remote server | |||
|
372 | ||||
|
373 | Inputs: | |||
|
374 | server - remote server IP Address | |||
|
375 | ||||
|
376 | username - remote server Username | |||
|
377 | ||||
|
378 | password - remote server password | |||
|
379 | ||||
|
380 | remotefolder - remote server current working directory | |||
|
381 | ||||
|
382 | Return: void | |||
|
383 | ||||
|
384 | Affects: | |||
|
385 | self.status - in case of error or fail connection this parameter is set to 0 else 1 | |||
|
386 | ||||
|
387 | """ | |||
|
388 | ||||
|
389 | if server == None: | |||
|
390 | raise ValueError, "SSH server should be defined" | |||
|
391 | ||||
|
392 | if username == None: | |||
|
393 | raise ValueError, "SSH username should be defined" | |||
|
394 | ||||
|
395 | if password == None: | |||
|
396 | raise ValueError, "SSH password should be defined" | |||
|
397 | ||||
|
398 | if remotefolder == None: | |||
|
399 | raise ValueError, "SSH remote folder should be defined" | |||
|
400 | ||||
|
401 | try: | |||
|
402 | sshClientObj = paramiko.SSHClient() | |||
|
403 | except: | |||
|
404 | print "SSH server connection fail: %s" %server | |||
|
405 | self.status = 0 | |||
|
406 | return 0 | |||
|
407 | ||||
|
408 | sshClientObj.load_system_host_keys() | |||
|
409 | sshClientObj.set_missing_host_key_policy(paramiko.WarningPolicy()) | |||
|
410 | ||||
|
411 | try: | |||
|
412 | sshClientObj.connect(server, username=username, password=password, port=port) | |||
|
413 | except : | |||
|
414 | print "SSH username or password are incorrect: %s" | |||
|
415 | self.status = 0 | |||
|
416 | return 0 | |||
|
417 | ||||
|
418 | scpClientObj = scp.SCPClient(sshClientObj.get_transport(), socket_timeout=30) | |||
|
419 | ||||
|
420 | if remotefolder == None: | |||
|
421 | remotefolder = self.pwd() | |||
|
422 | ||||
|
423 | self.server = server | |||
|
424 | self.username = username | |||
|
425 | self.password = password | |||
|
426 | self.remotefolder = remotefolder | |||
|
427 | self.__sshClientObj = sshClientObj | |||
|
428 | self.__scpClientObj = scpClientObj | |||
|
429 | self.status = 1 | |||
|
430 | ||||
|
431 | return 1 | |||
|
432 | ||||
|
433 | def close(self): | |||
|
434 | """ | |||
|
435 | Close connection to remote server | |||
|
436 | """ | |||
|
437 | if not self.status: | |||
|
438 | return 0 | |||
|
439 | ||||
|
440 | self.__sshObj.close() | |||
|
441 | ||||
|
442 | def mkdir(self, remotefolder): | |||
|
443 | """ | |||
|
444 | mkdir is used to make a new directory in remote server | |||
|
445 | ||||
|
446 | Input: | |||
|
447 | remotefolder - directory name | |||
|
448 | ||||
|
449 | Return: | |||
|
450 | 0 in error case else 1 | |||
|
451 | """ | |||
|
452 | if not self.status: | |||
|
453 | return 0 | |||
|
454 | ||||
|
455 | stdin, stdout, stderr = self.__sshClientObj.exec_command('mkdir %s' %remotefolder) | |||
|
456 | result = stderr.readlines()[0] | |||
|
457 | ||||
|
458 | if len(result) > 1: | |||
|
459 | return 0 | |||
|
460 | ||||
|
461 | return 1 | |||
|
462 | ||||
|
463 | def pwd(self): | |||
|
464 | ||||
|
465 | if not self.status: | |||
|
466 | return None | |||
|
467 | ||||
|
468 | stdin, stdout, stderr = self.__sshClientObj.exec_command('pwd') | |||
|
469 | result = stdout.readlines()[0] | |||
|
470 | ||||
|
471 | if len(result) < 1: | |||
|
472 | return None | |||
|
473 | ||||
|
474 | return result[:-1] | |||
|
475 | ||||
|
476 | def cd(self, remotefolder): | |||
|
477 | """ | |||
|
478 | cd is used to change remote working directory on server | |||
|
479 | ||||
|
480 | Input: | |||
|
481 | remotefolder - current working directory | |||
|
482 | ||||
|
483 | Affects: | |||
|
484 | self.remotefolder | |||
|
485 | ||||
|
486 | Return: | |||
|
487 | 0 in case of error else 1 | |||
|
488 | """ | |||
|
489 | if not self.status: | |||
|
490 | return 0 | |||
|
491 | ||||
|
492 | if remotefolder == self.remotefolder: | |||
|
493 | return 1 | |||
|
494 | ||||
|
495 | self.remotefolder = remotefolder | |||
|
496 | ||||
|
497 | return 1 | |||
|
498 | ||||
|
499 | def sendFile(self, fullfilename): | |||
|
500 | ||||
|
501 | if not self.status: | |||
|
502 | return 0 | |||
|
503 | ||||
|
504 | try: | |||
|
505 | self.__scpClientObj.put(fullfilename, remote_path=self.remotefolder) | |||
|
506 | except: | |||
|
507 | return 0 | |||
|
508 | ||||
|
509 | return 1 | |||
|
510 | ||||
|
511 | class SendToServer(ProcessingUnit): | |||
|
512 | ||||
|
513 | def __init__(self): | |||
|
514 | ||||
|
515 | ProcessingUnit.__init__(self) | |||
|
516 | ||||
|
517 | self.isConfig = False | |||
|
518 | self.clientObj = None | |||
|
519 | ||||
|
520 | def setup(self, server, username, password, remotefolder, localfolder, ext='.png', period=60, protocol='ftp'): | |||
|
521 | ||||
|
522 | self.clientObj = None | |||
|
523 | self.localfolder = localfolder | |||
|
524 | self.ext = ext | |||
|
525 | self.period = period | |||
|
526 | ||||
|
527 | if str.lower(protocol) == 'ftp': | |||
|
528 | self.clientObj = FTPClient(server, username, password, remotefolder, period) | |||
|
529 | ||||
|
530 | if str.lower(protocol) == 'ssh': | |||
|
531 | self.clientObj = SSHClient(server, username, password, remotefolder, period) | |||
|
532 | ||||
|
533 | if not self.clientObj: | |||
|
534 | raise ValueError, "%s has been chosen as remote access protocol but it is not valid" %protocol | |||
|
535 | ||||
|
536 | self.clientObj.start() | |||
|
537 | ||||
|
538 | def findFiles(self): | |||
|
539 | ||||
|
540 | filenameList = glob.glob1(self.localfolder, '*%s' %self.ext) | |||
|
541 | ||||
|
542 | if len(filenameList) < 1: | |||
|
543 | return [] | |||
|
544 | ||||
|
545 | fullfilenameList = [os.path.join(self.localfolder, thisFile) for thisFile in filenameList] | |||
|
546 | ||||
|
547 | return fullfilenameList | |||
|
548 | ||||
|
549 | def run(self, **kwargs): | |||
|
550 | ||||
|
551 | if not self.isConfig: | |||
|
552 | self.init = time.time() | |||
|
553 | self.setup(**kwargs) | |||
|
554 | self.isConfig = True | |||
|
555 | ||||
|
556 | if time.time() - self.init >= self.period: | |||
|
557 | fullfilenameList = self.findFiles() | |||
|
558 | self.clientObj.updateFileList(fullfilenameList) | |||
|
559 | self.init = time.time() | |||
|
560 | ||||
|
561 | def close(self): | |||
|
562 | print "[Remote Server] Stopping thread" | |||
|
563 | self.clientObj.stop() | |||
|
564 | ||||
|
565 | ||||
10 | class FTP(object): |
|
566 | class FTP(object): | |
11 | """ |
|
567 | """ | |
12 | Ftp is a public class used to define custom File Transfer Protocol from "ftplib" python module |
|
568 | Ftp is a public class used to define custom File Transfer Protocol from "ftplib" python module | |
@@ -298,20 +854,23 class FTP(object): | |||||
298 | self.ftp.close() |
|
854 | self.ftp.close() | |
299 |
|
855 | |||
300 | class SendByFTP(Operation): |
|
856 | class SendByFTP(Operation): | |
|
857 | ||||
301 | def __init__(self): |
|
858 | def __init__(self): | |
|
859 | ||||
302 | self.status = 1 |
|
860 | self.status = 1 | |
303 | self.counter = 0 |
|
861 | self.counter = 0 | |
304 |
|
862 | |||
305 | def error_print(self, ValueError): |
|
863 | def error_print(self, ValueError): | |
|
864 | ||||
306 | print ValueError, 'Error FTP' |
|
865 | print ValueError, 'Error FTP' | |
307 | print "don't worry the program is running..." |
|
866 | print "don't worry the program is running..." | |
308 |
|
867 | |||
309 | def worker_ftp(self, server, username, password, remotefolder, filenameList): |
|
868 | def worker_ftp(self, server, username, password, remotefolder, filenameList): | |
310 |
|
869 | |||
311 | self.ftpObj = FTP(server, username, password, remotefolder) |
|
870 | self.ftpClientObj = FTP(server, username, password, remotefolder) | |
312 | for filename in filenameList: |
|
871 | for filename in filenameList: | |
313 | self.ftpObj.upload(filename) |
|
872 | self.ftpClientObj.upload(filename) | |
314 | self.ftpObj.close() |
|
873 | self.ftpClientObj.close() | |
315 |
|
874 | |||
316 | def ftp_thread(self, server, username, password, remotefolder): |
|
875 | def ftp_thread(self, server, username, password, remotefolder): | |
317 | if not(self.status): |
|
876 | if not(self.status): |
1 | NO CONTENT: file was removed |
|
NO CONTENT: file was removed |
General Comments 0
You need to be logged in to leave comments.
Login now