##// END OF EJS Templates
refresh
joabAM -
r1292:d21a875a7d98
parent child
Show More

The requested changes are too big and content was truncated. Show full diff

1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,1008 +1,1011
1 '''
1 '''
2 @author: Daniel Suarez
2 @author: Daniel Suarez
3 '''
3 '''
4 import os
4 import os
5 import glob
5 import glob
6 import ftplib
6 import ftplib
7
7
8 try:
8 try:
9 import paramiko
9 import paramiko
10 import scp
10 import scp
11 except:
11 except:
12 print("You should install paramiko and scp libraries \nif you want to use SSH protocol to upload files to the server")
12 print("You should install paramiko and scp libraries \nif you want to use SSH protocol to upload files to the server")
13
13
14 import time
14 import time
15
15
16 import threading
16 import threading
17 Thread = threading.Thread
17 Thread = threading.Thread
18
18
19 # try:
19 # try:
20 # from gevent import sleep
20 # from gevent import sleep
21 # except:
21 # except:
22 from time import sleep
22 from time import sleep
23
23
24 from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator
24 from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator
25 @MPDecorator
25 @MPDecorator
26 class Remote(Thread):
26 class Remote(Thread):
27 """
27 """
28 Remote is a parent class used to define the behaviour of FTP and SSH class. These clases are
28 Remote is a parent class used to define the behaviour of FTP and SSH class. These clases are
29 used to upload or download files remotely.
29 used to upload or download files remotely.
30
30
31 Non-standard Python modules used:
31 Non-standard Python modules used:
32 None
32 None
33
33
34 Written by:
34 Written by:
35 "Miguel Urco":mailto:miguel.urco@jro.igp.gob.pe Jun. 03, 2015
35 "Miguel Urco":mailto:miguel.urco@jro.igp.gob.pe Jun. 03, 2015
36 """
36 """
37
37
38 server = None
38 server = None
39 username = None
39 username = None
40 password = None
40 password = None
41 remotefolder = None
41 remotefolder = None
42
42
43 period = 60
43 period = 60
44 fileList = []
44 fileList = []
45 bussy = False
45 bussy = False
46
46
47 def __init__(self, server, username, password, remotefolder, period=60):
47 def __init__(self, server, username, password, remotefolder, period=60):
48
48
49 Thread.__init__(self)
49 Thread.__init__(self)
50
50
51 self.setDaemon(True)
51 self.setDaemon(True)
52
52
53 self.status = 0
53 self.status = 0
54
54
55 self.__server = server
55 self.__server = server
56 self.__username = username
56 self.__username = username
57 self.__password = password
57 self.__password = password
58 self.__remotefolder = remotefolder
58 self.__remotefolder = remotefolder
59
59
60 self.period = period
60 self.period = period
61
61
62 self.fileList = []
62 self.fileList = []
63 self.bussy = False
63 self.bussy = False
64
64
65 self.stopFlag = False
65 self.stopFlag = False
66
66
67 print("[Remote Server] Opening server: %s" %self.__server)
67 print("[Remote Server] Opening server: %s" %self.__server)
68 if self.open(self.__server, self.__username, self.__password, self.__remotefolder):
68 if self.open(self.__server, self.__username, self.__password, self.__remotefolder):
69 print("[Remote Server] %s server was opened successfully" %self.__server)
69 print("[Remote Server] %s server was opened successfully" %self.__server)
70
70
71 self.close()
71 self.close()
72
72
73 self.mutex = threading.Lock()
73 self.mutex = threading.Lock()
74
74
75 def stop(self):
75 def stop(self):
76
76
77 self.stopFlag = True
77 self.stopFlag = True
78 self.join(10)
78 self.join(10)
79
79
80 def open(self):
80 def open(self):
81 """
81 """
82 Connect to server and create a connection class (FTP or SSH) to remote server.
82 Connect to server and create a connection class (FTP or SSH) to remote server.
83 """
83 """
84 raise NotImplementedError("Implement this method in child class")
84 raise NotImplementedError("Implement this method in child class")
85
85
86 def close(self):
86 def close(self):
87 """
87 """
88 Close connection to server
88 Close connection to server
89 """
89 """
90 raise NotImplementedError("Implement this method in child class")
90 raise NotImplementedError("Implement this method in child class")
91
91
92 def mkdir(self, remotefolder):
92 def mkdir(self, remotefolder):
93 """
93 """
94 Create a folder remotely
94 Create a folder remotely
95 """
95 """
96 raise NotImplementedError("Implement this method in child class")
96 raise NotImplementedError("Implement this method in child class")
97
97
98 def cd(self, remotefolder):
98 def cd(self, remotefolder):
99 """
99 """
100 Change working directory in remote server
100 Change working directory in remote server
101 """
101 """
102 raise NotImplementedError("Implement this method in child class")
102 raise NotImplementedError("Implement this method in child class")
103
103
104 def download(self, filename, localfolder=None):
104 def download(self, filename, localfolder=None):
105 """
105 """
106 Download a file from server to local host
106 Download a file from server to local host
107 """
107 """
108 raise NotImplementedError("Implement this method in child class")
108 raise NotImplementedError("Implement this method in child class")
109
109
110 def sendFile(self, fullfilename):
110 def sendFile(self, fullfilename):
111 """
111 """
112 sendFile method is used to upload a local file to the current directory in remote server
112 sendFile method is used to upload a local file to the current directory in remote server
113
113
114 Inputs:
114 Inputs:
115 fullfilename - full path name of local file to store in remote directory
115 fullfilename - full path name of local file to store in remote directory
116
116
117 Returns:
117 Returns:
118 0 in error case else 1
118 0 in error case else 1
119 """
119 """
120 raise NotImplementedError("Implement this method in child class")
120 raise NotImplementedError("Implement this method in child class")
121
121
122 def upload(self, fullfilename, remotefolder=None):
122 def upload(self, fullfilename, remotefolder=None):
123 """
123 """
124 upload method is used to upload a local file to remote directory. This method changes
124 upload method is used to upload a local file to remote directory. This method changes
125 working directory before sending a file.
125 working directory before sending a file.
126
126
127 Inputs:
127 Inputs:
128 fullfilename - full path name of local file to store in remote directory
128 fullfilename - full path name of local file to store in remote directory
129
129
130 remotefolder - remote directory
130 remotefolder - remote directory
131
131
132 Returns:
132 Returns:
133 0 in error case else 1
133 0 in error case else 1
134 """
134 """
135 print("[Remote Server] Uploading %s to %s:%s" %(fullfilename, self.server, self.remotefolder))
135 print("[Remote Server] Uploading %s to %s:%s" %(fullfilename, self.server, self.remotefolder))
136
136
137 if not self.status:
137 if not self.status:
138 return 0
138 return 0
139
139
140 if remotefolder == None:
140 if remotefolder == None:
141 remotefolder = self.remotefolder
141 remotefolder = self.remotefolder
142
142
143 if not self.cd(remotefolder):
143 if not self.cd(remotefolder):
144 return 0
144 return 0
145
145
146 if not self.sendFile(fullfilename):
146 if not self.sendFile(fullfilename):
147 print("[Remote Server] Error uploading file %s" %fullfilename)
147 print("[Remote Server] Error uploading file %s" %fullfilename)
148 return 0
148 return 0
149
149
150 print("[Remote Server] upload finished successfully")
150 print("[Remote Server] upload finished successfully")
151
151
152 return 1
152 return 1
153
153
154 def delete(self, filename):
154 def delete(self, filename):
155 """
155 """
156 Remove a file from remote server
156 Remove a file from remote server
157 """
157 """
158 pass
158 pass
159
159
160 def updateFileList(self, fileList):
160 def updateFileList(self, fileList):
161 """
161 """
162 Remove a file from remote server
162 Remove a file from remote server
163 """
163 """
164
164
165 if fileList == self.fileList:
165 if fileList == self.fileList:
166 return 0
166 return 0
167
167
168 self.mutex.acquire()
168 self.mutex.acquire()
169 # init = time.time()
169 # init = time.time()
170 #
170 #
171 # while(self.bussy):
171 # while(self.bussy):
172 # sleep(0.1)
172 # sleep(0.1)
173 # if time.time() - init > 2*self.period:
173 # if time.time() - init > 2*self.period:
174 # return 0
174 # return 0
175
175
176 self.fileList = fileList
176 self.fileList = fileList
177 self.mutex.release()
177 self.mutex.release()
178 return 1
178 return 1
179
179
180 def run(self):
180 def run(self):
181
181
182 if not self.status:
182 if not self.status:
183 print("Finishing FTP service")
183 print("Finishing FTP service")
184 return
184 return
185
185
186 if not self.cd(self.remotefolder):
186 if not self.cd(self.remotefolder):
187 raise ValueError("Could not access to the new remote directory: %s" %self.remotefolder)
187 raise ValueError("Could not access to the new remote directory: %s" %self.remotefolder)
188
188
189 while True:
189 while True:
190
190
191 for i in range(self.period):
191 for i in range(self.period):
192 if self.stopFlag:
192 if self.stopFlag:
193 break
193 break
194 sleep(1)
194 sleep(1)
195
195
196 if self.stopFlag:
196 if self.stopFlag:
197 break
197 break
198
198
199 # self.bussy = True
199 # self.bussy = True
200 self.mutex.acquire()
200 self.mutex.acquire()
201
201
202 print("[Remote Server] Opening %s" %self.__server)
202 print("[Remote Server] Opening %s" %self.__server)
203 if not self.open(self.__server, self.__username, self.__password, self.__remotefolder):
203 if not self.open(self.__server, self.__username, self.__password, self.__remotefolder):
204 self.mutex.release()
204 self.mutex.release()
205 continue
205 continue
206
206
207 for thisFile in self.fileList:
207 for thisFile in self.fileList:
208 self.upload(thisFile, self.remotefolder)
208 self.upload(thisFile, self.remotefolder)
209
209
210 print("[Remote Server] Closing %s" %self.__server)
210 print("[Remote Server] Closing %s" %self.__server)
211 self.close()
211 self.close()
212
212
213 self.mutex.release()
213 self.mutex.release()
214 # self.bussy = False
214 # self.bussy = False
215
215
216 print("[Remote Server] Thread stopped successfully")
216 print("[Remote Server] Thread stopped successfully")
217
217
218 class FTPClient(Remote):
218 class FTPClient(Remote):
219
219
220 __ftpClientObj = None
220 __ftpClientObj = None
221
221
222 def __init__(self, server, username, password, remotefolder, period=60):
222 def __init__(self, server, username, password, remotefolder, period=60):
223 """
223 """
224 """
224 """
225 Remote.__init__(self, server, username, password, remotefolder, period)
225 Remote.__init__(self, server, username, password, remotefolder, period)
226
226
227 def open(self, server, username, password, remotefolder):
227 def open(self, server, username, password, remotefolder):
228
228
229 """
229 """
230 This method is used to set FTP parameters and establish a connection to remote server
230 This method is used to set FTP parameters and establish a connection to remote server
231
231
232 Inputs:
232 Inputs:
233 server - remote server IP Address
233 server - remote server IP Address
234
234
235 username - remote server Username
235 username - remote server Username
236
236
237 password - remote server password
237 password - remote server password
238
238
239 remotefolder - remote server current working directory
239 remotefolder - remote server current working directory
240
240
241 Return:
241 Return:
242 Boolean - Returns 1 if a connection has been established, 0 otherwise
242 Boolean - Returns 1 if a connection has been established, 0 otherwise
243
243
244 Affects:
244 Affects:
245 self.status - in case of error or fail connection this parameter is set to 0 else 1
245 self.status - in case of error or fail connection this parameter is set to 0 else 1
246
246
247 """
247 """
248
248
249 if server == None:
249 if server == None:
250 raise ValueError("FTP server should be defined")
250 raise ValueError("FTP server should be defined")
251
251
252 if username == None:
252 if username == None:
253 raise ValueError("FTP username should be defined")
253 raise ValueError("FTP username should be defined")
254
254
255 if password == None:
255 if password == None:
256 raise ValueError("FTP password should be defined")
256 raise ValueError("FTP password should be defined")
257
257
258 if remotefolder == None:
258 if remotefolder == None:
259 raise ValueError("FTP remote folder should be defined")
259 raise ValueError("FTP remote folder should be defined")
260
260
261 try:
261 try:
262 ftpClientObj = ftplib.FTP(server)
262 ftpClientObj = ftplib.FTP(server)
263 except ftplib.all_errors as e:
263 except ftplib.all_errors as e:
264 print("[FTP Server]: FTP server connection fail: %s" %server)
264 print("[FTP Server]: FTP server connection fail: %s" %server)
265 print("[FTP Server]:", e)
265 print("[FTP Server]:", e)
266 self.status = 0
266 self.status = 0
267 return 0
267 return 0
268
268
269 try:
269 try:
270 ftpClientObj.login(username, password)
270 ftpClientObj.login(username, password)
271 except ftplib.all_errors:
271 except ftplib.all_errors:
272 print("[FTP Server]: FTP username or password are incorrect")
272 print("[FTP Server]: FTP username or password are incorrect")
273 self.status = 0
273 self.status = 0
274 return 0
274 return 0
275
275
276 if remotefolder == None:
276 if remotefolder == None:
277 remotefolder = ftpClientObj.pwd()
277 remotefolder = ftpClientObj.pwd()
278 else:
278 else:
279 try:
279 try:
280 ftpClientObj.cwd(remotefolder)
280 ftpClientObj.cwd(remotefolder)
281 except ftplib.all_errors:
281 except ftplib.all_errors:
282 print("[FTP Server]: FTP remote folder is invalid: %s" %remotefolder)
282 print("[FTP Server]: FTP remote folder is invalid: %s" %remotefolder)
283 remotefolder = ftpClientObj.pwd()
283 remotefolder = ftpClientObj.pwd()
284
284
285 self.server = server
285 self.server = server
286 self.username = username
286 self.username = username
287 self.password = password
287 self.password = password
288 self.remotefolder = remotefolder
288 self.remotefolder = remotefolder
289 self.__ftpClientObj = ftpClientObj
289 self.__ftpClientObj = ftpClientObj
290 self.status = 1
290 self.status = 1
291
291
292 return 1
292 return 1
293
293
294 def close(self):
294 def close(self):
295 """
295 """
296 Close connection to remote server
296 Close connection to remote server
297 """
297 """
298 if not self.status:
298 if not self.status:
299 return 0
299 return 0
300
300
301 self.__ftpClientObj.close()
301 self.__ftpClientObj.close()
302
302
303 def mkdir(self, remotefolder):
303 def mkdir(self, remotefolder):
304 """
304 """
305 mkdir is used to make a new directory in remote server
305 mkdir is used to make a new directory in remote server
306
306
307 Input:
307 Input:
308 remotefolder - directory name
308 remotefolder - directory name
309
309
310 Return:
310 Return:
311 0 in error case else 1
311 0 in error case else 1
312 """
312 """
313 if not self.status:
313 if not self.status:
314 return 0
314 return 0
315
315
316 try:
316 try:
317 self.__ftpClientObj.mkd(dirname)
317 self.__ftpClientObj.mkd(dirname)
318 except ftplib.all_errors:
318 except ftplib.all_errors:
319 print("[FTP Server]: Error creating remote folder: %s" %remotefolder)
319 print("[FTP Server]: Error creating remote folder: %s" %remotefolder)
320 return 0
320 return 0
321
321
322 return 1
322 return 1
323
323
324 def cd(self, remotefolder):
324 def cd(self, remotefolder):
325 """
325 """
326 cd is used to change remote working directory on server
326 cd is used to change remote working directory on server
327
327
328 Input:
328 Input:
329 remotefolder - current working directory
329 remotefolder - current working directory
330
330
331 Affects:
331 Affects:
332 self.remotefolder
332 self.remotefolder
333
333
334 Return:
334 Return:
335 0 in case of error else 1
335 0 in case of error else 1
336 """
336 """
337 if not self.status:
337 if not self.status:
338 return 0
338 return 0
339
339
340 if remotefolder == self.remotefolder:
340 if remotefolder == self.remotefolder:
341 return 1
341 return 1
342
342
343 try:
343 try:
344 self.__ftpClientObj.cwd(remotefolder)
344 self.__ftpClientObj.cwd(remotefolder)
345 except ftplib.all_errors:
345 except ftplib.all_errors:
346 print('[FTP Server]: Error changing to %s' %remotefolder)
346 print('[FTP Server]: Error changing to %s' %remotefolder)
347 print('[FTP Server]: Trying to create remote folder')
347 print('[FTP Server]: Trying to create remote folder')
348
348
349 if not self.mkdir(remotefolder):
349 if not self.mkdir(remotefolder):
350 print('[FTP Server]: Remote folder could not be created')
350 print('[FTP Server]: Remote folder could not be created')
351 return 0
351 return 0
352
352
353 try:
353 try:
354 self.__ftpClientObj.cwd(remotefolder)
354 self.__ftpClientObj.cwd(remotefolder)
355 except ftplib.all_errors:
355 except ftplib.all_errors:
356 return 0
356 return 0
357
357
358 self.remotefolder = remotefolder
358 self.remotefolder = remotefolder
359
359
360 return 1
360 return 1
361
361
362 def sendFile(self, fullfilename):
362 def sendFile(self, fullfilename):
363
363
364 if not self.status:
364 if not self.status:
365 return 0
365 return 0
366
366
367 fp = open(fullfilename, 'rb')
367 fp = open(fullfilename, 'rb')
368
368
369 filename = os.path.basename(fullfilename)
369 filename = os.path.basename(fullfilename)
370
370
371 command = "STOR %s" %filename
371 command = "STOR %s" %filename
372
372
373 try:
373 try:
374 self.__ftpClientObj.storbinary(command, fp)
374 self.__ftpClientObj.storbinary(command, fp)
375 except ftplib.all_errors as e:
375 except ftplib.all_errors as e:
376 print("[FTP Server]:", e)
376 print("[FTP Server]:", e)
377 return 0
377 return 0
378
378
379 try:
379 try:
380 self.__ftpClientObj.sendcmd('SITE CHMOD 755 ' + filename)
380 self.__ftpClientObj.sendcmd('SITE CHMOD 755 ' + filename)
381 except ftplib.all_errors as e:
381 except ftplib.all_errors as e:
382 print("[FTP Server]:", e)
382 print("[FTP Server]:", e)
383
383
384 fp.close()
384 fp.close()
385
385
386 return 1
386 return 1
387
387
388 class SSHClient(Remote):
388 class SSHClient(Remote):
389
389
390 __sshClientObj = None
390 __sshClientObj = None
391 __scpClientObj = None
391 __scpClientObj = None
392
392
393 def __init__(self, server, username, password, remotefolder, period=60):
393 def __init__(self, server, username, password, remotefolder, period=60):
394 """
394 """
395 """
395 """
396 Remote.__init__(self, server, username, password, remotefolder, period)
396 Remote.__init__(self, server, username, password, remotefolder, period)
397
397
398 def open(self, server, username, password, remotefolder, port=22):
398 def open(self, server, username, password, remotefolder, port=22):
399
399
400 """
400 """
401 This method is used to set SSH parameters and establish a connection to a remote server
401 This method is used to set SSH parameters and establish a connection to a remote server
402
402
403 Inputs:
403 Inputs:
404 server - remote server IP Address
404 server - remote server IP Address
405
405
406 username - remote server Username
406 username - remote server Username
407
407
408 password - remote server password
408 password - remote server password
409
409
410 remotefolder - remote server current working directory
410 remotefolder - remote server current working directory
411
411
412 Return: void
412 Return: void
413
413
414 Affects:
414 Affects:
415 self.status - in case of error or fail connection this parameter is set to 0 else 1
415 self.status - in case of error or fail connection this parameter is set to 0 else 1
416
416
417 """
417 """
418 import socket
418 import socket
419
419
420 if server == None:
420 if server == None:
421 raise ValueError("SSH server should be defined")
421 raise ValueError("SSH server should be defined")
422
422
423 if username == None:
423 if username == None:
424 raise ValueError("SSH username should be defined")
424 raise ValueError("SSH username should be defined")
425
425
426 if password == None:
426 if password == None:
427 raise ValueError("SSH password should be defined")
427 raise ValueError("SSH password should be defined")
428
428
429 if remotefolder == None:
429 if remotefolder == None:
430 raise ValueError("SSH remote folder should be defined")
430 raise ValueError("SSH remote folder should be defined")
431
431
432 sshClientObj = paramiko.SSHClient()
432 sshClientObj = paramiko.SSHClient()
433
433
434 sshClientObj.load_system_host_keys()
434 sshClientObj.load_system_host_keys()
435 sshClientObj.set_missing_host_key_policy(paramiko.WarningPolicy())
435 sshClientObj.set_missing_host_key_policy(paramiko.WarningPolicy())
436
436
437 self.status = 0
437 self.status = 0
438 try:
438 try:
439 sshClientObj.connect(server, username=username, password=password, port=port)
439 sshClientObj.connect(server, username=username, password=password, port=port)
440 except paramiko.AuthenticationException as e:
440 except paramiko.AuthenticationException as e:
441 # print "SSH username or password are incorrect: %s"
441 # print "SSH username or password are incorrect: %s"
442 print("[SSH Server]:", e)
442 print("[SSH Server]:", e)
443 return 0
443 return 0
444 except SSHException as e:
444 except SSHException as e:
445 print("[SSH Server]:", e)
445 print("[SSH Server]:", e)
446 return 0
446 return 0
447 except socket.error:
447 except socket.error:
448 self.status = 0
448 self.status = 0
449 print("[SSH Server]:", e)
449 print("[SSH Server]:", e)
450 return 0
450 return 0
451
451
452 self.status = 1
452 self.status = 1
453 scpClientObj = scp.SCPClient(sshClientObj.get_transport(), socket_timeout=30)
453 scpClientObj = scp.SCPClient(sshClientObj.get_transport(), socket_timeout=30)
454
454
455 if remotefolder == None:
455 if remotefolder == None:
456 remotefolder = self.pwd()
456 remotefolder = self.pwd()
457
457
458 self.server = server
458 self.server = server
459 self.username = username
459 self.username = username
460 self.password = password
460 self.password = password
461 self.__sshClientObj = sshClientObj
461 self.__sshClientObj = sshClientObj
462 self.__scpClientObj = scpClientObj
462 self.__scpClientObj = scpClientObj
463 self.status = 1
463 self.status = 1
464
464
465 if not self.cd(remotefolder):
465 if not self.cd(remotefolder):
466 raise ValueError("[SSH Server]: Could not access to remote folder: %s" %remotefolder)
466 raise ValueError("[SSH Server]: Could not access to remote folder: %s" %remotefolder)
467 return 0
467 return 0
468
468
469 self.remotefolder = remotefolder
469 self.remotefolder = remotefolder
470
470
471 return 1
471 return 1
472
472
473 def close(self):
473 def close(self):
474 """
474 """
475 Close connection to remote server
475 Close connection to remote server
476 """
476 """
477 if not self.status:
477 if not self.status:
478 return 0
478 return 0
479
479
480 self.__scpClientObj.close()
480 self.__scpClientObj.close()
481 self.__sshClientObj.close()
481 self.__sshClientObj.close()
482
482
483 def __execute(self, command):
483 def __execute(self, command):
484 """
484 """
485 __execute a command on remote server
485 __execute a command on remote server
486
486
487 Input:
487 Input:
488 command - Exmaple 'ls -l'
488 command - Exmaple 'ls -l'
489
489
490 Return:
490 Return:
491 0 in error case else 1
491 0 in error case else 1
492 """
492 """
493 if not self.status:
493 if not self.status:
494 return 0
494 return 0
495
495
496 stdin, stdout, stderr = self.__sshClientObj.exec_command(command)
496 stdin, stdout, stderr = self.__sshClientObj.exec_command(command)
497
497
498 result = stderr.readlines()
498 result = stderr.readlines()
499 if len(result) > 1:
499 if len(result) > 1:
500 return 0
500 return 0
501
501
502 result = stdout.readlines()
502 result = stdout.readlines()
503 if len(result) > 1:
503 if len(result) > 1:
504 return result[0][:-1]
504 return result[0][:-1]
505
505
506 return 1
506 return 1
507
507
508 def mkdir(self, remotefolder):
508 def mkdir(self, remotefolder):
509 """
509 """
510 mkdir is used to make a new directory in remote server
510 mkdir is used to make a new directory in remote server
511
511
512 Input:
512 Input:
513 remotefolder - directory name
513 remotefolder - directory name
514
514
515 Return:
515 Return:
516 0 in error case else 1
516 0 in error case else 1
517 """
517 """
518
518
519 command = 'mkdir %s' %remotefolder
519 command = 'mkdir %s' %remotefolder
520
520
521 return self.__execute(command)
521 return self.__execute(command)
522
522
523 def pwd(self):
523 def pwd(self):
524
524
525 command = 'pwd'
525 command = 'pwd'
526
526
527 return self.__execute(command)
527 return self.__execute(command)
528
528
529 def cd(self, remotefolder):
529 def cd(self, remotefolder):
530 """
530 """
531 cd is used to change remote working directory on server
531 cd is used to change remote working directory on server
532
532
533 Input:
533 Input:
534 remotefolder - current working directory
534 remotefolder - current working directory
535
535
536 Affects:
536 Affects:
537 self.remotefolder
537 self.remotefolder
538
538
539 Return:
539 Return:
540 0 in case of error else 1
540 0 in case of error else 1
541 """
541 """
542 if not self.status:
542 if not self.status:
543 return 0
543 return 0
544
544
545 if remotefolder == self.remotefolder:
545 if remotefolder == self.remotefolder:
546 return 1
546 return 1
547
547
548 chk_command = "cd %s; pwd" %remotefolder
548 chk_command = "cd %s; pwd" %remotefolder
549 mkdir_command = "mkdir %s" %remotefolder
549 mkdir_command = "mkdir %s" %remotefolder
550
550
551 if not self.__execute(chk_command):
551 if not self.__execute(chk_command):
552 if not self.__execute(mkdir_command):
552 if not self.__execute(mkdir_command):
553 self.remotefolder = None
553 self.remotefolder = None
554 return 0
554 return 0
555
555
556 self.remotefolder = remotefolder
556 self.remotefolder = remotefolder
557
557
558 return 1
558 return 1
559
559
560 def sendFile(self, fullfilename):
560 def sendFile(self, fullfilename):
561
561
562 if not self.status:
562 if not self.status:
563 return 0
563 return 0
564
564
565 try:
565 try:
566 self.__scpClientObj.put(fullfilename, remote_path=self.remotefolder)
566 self.__scpClientObj.put(fullfilename, remote_path=self.remotefolder)
567 except scp.ScpError as e:
567 except scp.ScpError as e:
568 print("[SSH Server]", str(e))
568 print("[SSH Server]", str(e))
569 return 0
569 return 0
570
570
571 remotefile = os.path.join(self.remotefolder, os.path.split(fullfilename)[-1])
571 remotefile = os.path.join(self.remotefolder, os.path.split(fullfilename)[-1])
572 command = 'chmod 775 %s' %remotefile
572 command = 'chmod 775 %s' %remotefile
573
573
574 return self.__execute(command)
574 return self.__execute(command)
575 @MPDecorator
575 @MPDecorator
576 class SendToServer(ProcessingUnit):
576 class SendToServer(ProcessingUnit):
577
577
578 def __init__(self, **kwargs):
578 def __init__(self, **kwargs):
579
579
580 ProcessingUnit.__init__(self, **kwargs)
580 ProcessingUnit.__init__(self, **kwargs)
581
581
582 self.isConfig = False
582 self.isConfig = False
583 self.clientObj = None
583 self.clientObj = None
584
584
585 def setup(self, server, username, password, remotefolder, localfolder, ext='.png', period=60, protocol='ftp', **kwargs):
585 def setup(self, server, username, password, remotefolder, localfolder, ext='.png', period=60, protocol='ftp', **kwargs):
586
586 self.server = server
587 self.username = username
588 self.password = password
589 self.remotefolder = remotefolder
587 self.clientObj = None
590 self.clientObj = None
588 self.localfolder = localfolder
591 self.localfolder = localfolder
589 self.ext = ext
592 self.ext = ext
590 self.period = period
593 self.period = period
591
594
592 if str.lower(protocol) == 'ftp':
595 if str.lower(protocol) == 'ftp':
593 self.clientObj = FTPClient(server, username, password, remotefolder, period)
596 self.clientObj = FTPClient(server, username, password, remotefolder, period)
594
597
595 if str.lower(protocol) == 'ssh':
598 if str.lower(protocol) == 'ssh':
596 self.clientObj = SSHClient(server, username, password, remotefolder, period)
599 self.clientObj = SSHClient(server, username, password, remotefolder, period)
597
600
598 if not self.clientObj:
601 if not self.clientObj:
599 raise ValueError("%s has been chosen as remote access protocol but it is not valid" %protocol)
602 raise ValueError("%s has been chosen as remote access protocol but it is not valid" %protocol)
600
603
601 self.clientObj.start()
604 self.clientObj.start()
602 print("ftp setup complete")
605 print("ftp setup complete")
603 def findFiles(self):
606 def findFiles(self):
604
607
605 if not type(self.localfolder) == list:
608 if not type(self.localfolder) == list:
606 folderList = [self.localfolder]
609 folderList = [self.localfolder]
607 else:
610 else:
608 folderList = self.localfolder
611 folderList = self.localfolder
609
612
610 #Remove duplicate items
613 #Remove duplicate items
611 folderList = list(set(folderList))
614 folderList = list(set(folderList))
612
615
613 fullfilenameList = []
616 fullfilenameList = []
614
617
615 for thisFolder in folderList:
618 for thisFolder in folderList:
616
619
617 print("[Remote Server]: Searching files on %s" %thisFolder)
620 print("[Remote Server]: Searching files on %s" %thisFolder)
618
621
619 filenameList = glob.glob1(thisFolder, '*%s' %self.ext)
622 filenameList = glob.glob1(thisFolder, '*%s' %self.ext)
620
623
621 if len(filenameList) < 1:
624 if len(filenameList) < 1:
622
625
623 continue
626 continue
624
627
625 for thisFile in filenameList:
628 for thisFile in filenameList:
626 fullfilename = os.path.join(thisFolder, thisFile)
629 fullfilename = os.path.join(thisFolder, thisFile)
627
630
628 if fullfilename in fullfilenameList:
631 if fullfilename in fullfilenameList:
629 continue
632 continue
630
633
631 #Only files modified in the last 30 minutes are considered
634 #Only files modified in the last 30 minutes are considered
632 if os.path.getmtime(fullfilename) < time.time() - 30*60:
635 if os.path.getmtime(fullfilename) < time.time() - 30*60:
633 continue
636 continue
634
637
635 fullfilenameList.append(fullfilename)
638 fullfilenameList.append(fullfilename)
636
639
637 return fullfilenameList
640 return fullfilenameList
638
641
639 def run(self, **kwargs):
642 def run(self, **kwargs):
640 if not self.isConfig:
643 if not self.isConfig:
641 self.init = time.time()
644 self.init = time.time()
642 self.setup(**kwargs)
645 self.setup(**kwargs)
643 self.isConfig = True
646 self.isConfig = True
644
647
645 if not self.clientObj.is_alive():
648 if not self.clientObj.is_alive():
646 print("[Remote Server]: Restarting connection ")
649 print("[Remote Server]: Restarting connection ")
647 self.setup(**kwargs)
650 self.setup(**kwargs)
648
651
649 if time.time() - self.init >= self.period:
652 if time.time() - self.init >= self.period:
650 fullfilenameList = self.findFiles()
653 fullfilenameList = self.findFiles()
651
654
652 if self.clientObj.updateFileList(fullfilenameList):
655 if self.clientObj.updateFileList(fullfilenameList):
653 print("[Remote Server]: Sending the next files ", str(fullfilenameList))
656 print("[Remote Server]: Sending the next files ", str(fullfilenameList))
654 self.init = time.time()
657 self.init = time.time()
655
658
656 def close(self):
659 def close(self):
657 print("[Remote Server] Stopping thread")
660 print("[Remote Server] Stopping thread")
658 self.clientObj.stop()
661 self.clientObj.stop()
659
662
660
663
661 class FTP(object):
664 class FTP(object):
662 """
665 """
663 Ftp is a public class used to define custom File Transfer Protocol from "ftplib" python module
666 Ftp is a public class used to define custom File Transfer Protocol from "ftplib" python module
664
667
665 Non-standard Python modules used: None
668 Non-standard Python modules used: None
666
669
667 Written by "Daniel Suarez":mailto:daniel.suarez@jro.igp.gob.pe Oct. 26, 2010
670 Written by "Daniel Suarez":mailto:daniel.suarez@jro.igp.gob.pe Oct. 26, 2010
668 """
671 """
669
672
670 def __init__(self,server = None, username=None, password=None, remotefolder=None):
673 def __init__(self,server = None, username=None, password=None, remotefolder=None):
671 """
674 """
672 This method is used to setting parameters for FTP and establishing connection to remote server
675 This method is used to setting parameters for FTP and establishing connection to remote server
673
676
674 Inputs:
677 Inputs:
675 server - remote server IP Address
678 server - remote server IP Address
676
679
677 username - remote server Username
680 username - remote server Username
678
681
679 password - remote server password
682 password - remote server password
680
683
681 remotefolder - remote server current working directory
684 remotefolder - remote server current working directory
682
685
683 Return: void
686 Return: void
684
687
685 Affects:
688 Affects:
686 self.status - in Error Case or Connection Failed this parameter is set to 1 else 0
689 self.status - in Error Case or Connection Failed this parameter is set to 1 else 0
687
690
688 self.folderList - sub-folder list of remote folder
691 self.folderList - sub-folder list of remote folder
689
692
690 self.fileList - file list of remote folder
693 self.fileList - file list of remote folder
691
694
692
695
693 """
696 """
694
697
695 if ((server == None) and (username==None) and (password==None) and (remotefolder==None)):
698 if ((server == None) and (username==None) and (password==None) and (remotefolder==None)):
696 server, username, password, remotefolder = self.parmsByDefault()
699 server, username, password, remotefolder = self.parmsByDefault()
697
700
698 self.server = server
701 self.server = server
699 self.username = username
702 self.username = username
700 self.password = password
703 self.password = password
701 self.remotefolder = remotefolder
704 self.remotefolder = remotefolder
702 self.file = None
705 self.file = None
703 self.ftp = None
706 self.ftp = None
704 self.status = 0
707 self.status = 0
705
708
706 try:
709 try:
707 self.ftp = ftplib.FTP(self.server)
710 self.ftp = ftplib.FTP(self.server)
708 self.ftp.login(self.username,self.password)
711 self.ftp.login(self.username,self.password)
709 self.ftp.cwd(self.remotefolder)
712 self.ftp.cwd(self.remotefolder)
710 # print 'Connect to FTP Server: Successfully'
713 # print 'Connect to FTP Server: Successfully'
711
714
712 except ftplib.all_errors:
715 except ftplib.all_errors:
713 print('Error FTP Service')
716 print('Error FTP Service')
714 self.status = 1
717 self.status = 1
715 return
718 return
716
719
717
720
718
721
719 self.dirList = []
722 self.dirList = []
720
723
721 try:
724 try:
722 self.dirList = self.ftp.nlst()
725 self.dirList = self.ftp.nlst()
723
726
724 except ftplib.error_perm as resp:
727 except ftplib.error_perm as resp:
725 if str(resp) == "550 No files found":
728 if str(resp) == "550 No files found":
726 print("no files in this directory")
729 print("no files in this directory")
727 self.status = 1
730 self.status = 1
728 return
731 return
729
732
730 except ftplib.all_errors:
733 except ftplib.all_errors:
731 print('Error Displaying Dir-Files')
734 print('Error Displaying Dir-Files')
732 self.status = 1
735 self.status = 1
733 return
736 return
734
737
735 self.fileList = []
738 self.fileList = []
736 self.folderList = []
739 self.folderList = []
737 #only for test
740 #only for test
738 for f in self.dirList:
741 for f in self.dirList:
739 name, ext = os.path.splitext(f)
742 name, ext = os.path.splitext(f)
740 if ext != '':
743 if ext != '':
741 self.fileList.append(f)
744 self.fileList.append(f)
742 # print 'filename: %s - size: %d'%(f,self.ftp.size(f))
745 # print 'filename: %s - size: %d'%(f,self.ftp.size(f))
743
746
744 def parmsByDefault(self):
747 def parmsByDefault(self):
745 server = 'jro-app.igp.gob.pe'
748 server = 'jro-app.igp.gob.pe'
746 username = 'wmaster'
749 username = 'wmaster'
747 password = 'mst2010vhf'
750 password = 'mst2010vhf'
748 remotefolder = '/home/wmaster/graficos'
751 remotefolder = '/home/wmaster/graficos'
749
752
750 return server, username, password, remotefolder
753 return server, username, password, remotefolder
751
754
752
755
753 def mkd(self,dirname):
756 def mkd(self,dirname):
754 """
757 """
755 mkd is used to make directory in remote server
758 mkd is used to make directory in remote server
756
759
757 Input:
760 Input:
758 dirname - directory name
761 dirname - directory name
759
762
760 Return:
763 Return:
761 1 in error case else 0
764 1 in error case else 0
762 """
765 """
763 try:
766 try:
764 self.ftp.mkd(dirname)
767 self.ftp.mkd(dirname)
765 except:
768 except:
766 print('Error creating remote folder:%s'%dirname)
769 print('Error creating remote folder:%s'%dirname)
767 return 1
770 return 1
768
771
769 return 0
772 return 0
770
773
771
774
772 def delete(self,filename):
775 def delete(self,filename):
773 """
776 """
774 delete is used to delete file in current working directory of remote server
777 delete is used to delete file in current working directory of remote server
775
778
776 Input:
779 Input:
777 filename - filename to delete in remote folder
780 filename - filename to delete in remote folder
778
781
779 Return:
782 Return:
780 1 in error case else 0
783 1 in error case else 0
781 """
784 """
782
785
783 try:
786 try:
784 self.ftp.delete(filename)
787 self.ftp.delete(filename)
785 except:
788 except:
786 print('Error deleting remote file:%s'%filename)
789 print('Error deleting remote file:%s'%filename)
787 return 1
790 return 1
788
791
789 return 0
792 return 0
790
793
791 def download(self,filename,localfolder):
794 def download(self,filename,localfolder):
792 """
795 """
793 download is used to downloading file from remote folder into local folder
796 download is used to downloading file from remote folder into local folder
794
797
795 Inputs:
798 Inputs:
796 filename - filename to donwload
799 filename - filename to donwload
797
800
798 localfolder - directory local to store filename
801 localfolder - directory local to store filename
799
802
800 Returns:
803 Returns:
801 self.status - 1 in error case else 0
804 self.status - 1 in error case else 0
802 """
805 """
803
806
804 self.status = 0
807 self.status = 0
805
808
806
809
807 if not(filename in self.fileList):
810 if not(filename in self.fileList):
808 print('filename:%s not exists'%filename)
811 print('filename:%s not exists'%filename)
809 self.status = 1
812 self.status = 1
810 return self.status
813 return self.status
811
814
812 newfilename = os.path.join(localfolder,filename)
815 newfilename = os.path.join(localfolder,filename)
813
816
814 self.file = open(newfilename, 'wb')
817 self.file = open(newfilename, 'wb')
815
818
816 try:
819 try:
817 print('Download: ' + filename)
820 print('Download: ' + filename)
818 self.ftp.retrbinary('RETR ' + filename, self.__handleDownload)
821 self.ftp.retrbinary('RETR ' + filename, self.__handleDownload)
819 print('Download Complete')
822 print('Download Complete')
820 except ftplib.all_errors:
823 except ftplib.all_errors:
821 print('Error Downloading ' + filename)
824 print('Error Downloading ' + filename)
822 self.status = 1
825 self.status = 1
823 return self.status
826 return self.status
824
827
825 self.file.close()
828 self.file.close()
826
829
827 return self.status
830 return self.status
828
831
829
832
830 def __handleDownload(self,block):
833 def __handleDownload(self,block):
831 """
834 """
832 __handleDownload is used to handle writing file
835 __handleDownload is used to handle writing file
833 """
836 """
834 self.file.write(block)
837 self.file.write(block)
835
838
836
839
837 def upload(self,filename,remotefolder=None):
840 def upload(self,filename,remotefolder=None):
838 """
841 """
839 upload is used to uploading local file to remote directory
842 upload is used to uploading local file to remote directory
840
843
841 Inputs:
844 Inputs:
842 filename - full path name of local file to store in remote directory
845 filename - full path name of local file to store in remote directory
843
846
844 remotefolder - remote directory
847 remotefolder - remote directory
845
848
846 Returns:
849 Returns:
847 self.status - 1 in error case else 0
850 self.status - 1 in error case else 0
848 """
851 """
849
852
850 if remotefolder == None:
853 if remotefolder == None:
851 remotefolder = self.remotefolder
854 remotefolder = self.remotefolder
852
855
853 self.status = 0
856 self.status = 0
854
857
855 try:
858 try:
856 self.ftp.cwd(remotefolder)
859 self.ftp.cwd(remotefolder)
857
860
858 self.file = open(filename, 'rb')
861 self.file = open(filename, 'rb')
859
862
860 (head, tail) = os.path.split(filename)
863 (head, tail) = os.path.split(filename)
861
864
862 command = "STOR " + tail
865 command = "STOR " + tail
863
866
864 print('Uploading: ' + tail)
867 print('Uploading: ' + tail)
865 self.ftp.storbinary(command, self.file)
868 self.ftp.storbinary(command, self.file)
866 print('Upload Completed')
869 print('Upload Completed')
867
870
868 except ftplib.all_errors:
871 except ftplib.all_errors:
869 print('Error Uploading ' + tail)
872 print('Error Uploading ' + tail)
870 self.status = 1
873 self.status = 1
871 return self.status
874 return self.status
872
875
873 self.file.close()
876 self.file.close()
874
877
875 #back to initial directory in __init__()
878 #back to initial directory in __init__()
876 self.ftp.cwd(self.remotefolder)
879 self.ftp.cwd(self.remotefolder)
877
880
878 return self.status
881 return self.status
879
882
880
883
881 def dir(self,remotefolder):
884 def dir(self,remotefolder):
882 """
885 """
883 dir is used to change working directory of remote server and get folder and file list
886 dir is used to change working directory of remote server and get folder and file list
884
887
885 Input:
888 Input:
886 remotefolder - current working directory
889 remotefolder - current working directory
887
890
888 Affects:
891 Affects:
889 self.fileList - file list of working directory
892 self.fileList - file list of working directory
890
893
891 Return:
894 Return:
892 infoList - list with filenames and size of file in bytes
895 infoList - list with filenames and size of file in bytes
893
896
894 self.folderList - folder list
897 self.folderList - folder list
895 """
898 """
896
899
897 self.remotefolder = remotefolder
900 self.remotefolder = remotefolder
898 print('Change to ' + self.remotefolder)
901 print('Change to ' + self.remotefolder)
899 try:
902 try:
900 self.ftp.cwd(remotefolder)
903 self.ftp.cwd(remotefolder)
901 except ftplib.all_errors:
904 except ftplib.all_errors:
902 print('Error Change to ' + self.remotefolder)
905 print('Error Change to ' + self.remotefolder)
903 infoList = None
906 infoList = None
904 self.folderList = None
907 self.folderList = None
905 return infoList,self.folderList
908 return infoList,self.folderList
906
909
907 self.dirList = []
910 self.dirList = []
908
911
909 try:
912 try:
910 self.dirList = self.ftp.nlst()
913 self.dirList = self.ftp.nlst()
911
914
912 except ftplib.error_perm as resp:
915 except ftplib.error_perm as resp:
913 if str(resp) == "550 No files found":
916 if str(resp) == "550 No files found":
914 print("no files in this directory")
917 print("no files in this directory")
915 infoList = None
918 infoList = None
916 self.folderList = None
919 self.folderList = None
917 return infoList,self.folderList
920 return infoList,self.folderList
918 except ftplib.all_errors:
921 except ftplib.all_errors:
919 print('Error Displaying Dir-Files')
922 print('Error Displaying Dir-Files')
920 infoList = None
923 infoList = None
921 self.folderList = None
924 self.folderList = None
922 return infoList,self.folderList
925 return infoList,self.folderList
923
926
924 infoList = []
927 infoList = []
925 self.fileList = []
928 self.fileList = []
926 self.folderList = []
929 self.folderList = []
927 for f in self.dirList:
930 for f in self.dirList:
928 name,ext = os.path.splitext(f)
931 name,ext = os.path.splitext(f)
929 if ext != '':
932 if ext != '':
930 self.fileList.append(f)
933 self.fileList.append(f)
931 value = (f,self.ftp.size(f))
934 value = (f,self.ftp.size(f))
932 infoList.append(value)
935 infoList.append(value)
933
936
934 if ext == '':
937 if ext == '':
935 self.folderList.append(f)
938 self.folderList.append(f)
936
939
937 return infoList,self.folderList
940 return infoList,self.folderList
938
941
939
942
940 def close(self):
943 def close(self):
941 """
944 """
942 close is used to close and end FTP connection
945 close is used to close and end FTP connection
943
946
944 Inputs: None
947 Inputs: None
945
948
946 Return: void
949 Return: void
947
950
948 """
951 """
949 self.ftp.close()
952 self.ftp.close()
950
953 @MPDecorator
951 class SendByFTP(Operation):
954 class SendByFTP(Operation):
952
955
953 def __init__(self, **kwargs):
956 def __init__(self, **kwargs):
954 Operation.__init__(self, **kwargs)
957 Operation.__init__(self, **kwargs)
955 self.status = 1
958 self.status = 1
956 self.counter = 0
959 self.counter = 0
957
960
958 def error_print(self, ValueError):
961 def error_print(self, ValueError):
959
962
960 print(ValueError, 'Error FTP')
963 print(ValueError, 'Error FTP')
961 print("don't worry the program is running...")
964 print("don't worry the program is running...")
962
965
963 def worker_ftp(self, server, username, password, remotefolder, filenameList):
966 def worker_ftp(self, server, username, password, remotefolder, filenameList):
964
967
965 self.ftpClientObj = FTP(server, username, password, remotefolder)
968 self.ftpClientObj = FTP(server, username, password, remotefolder)
966 for filename in filenameList:
969 for filename in filenameList:
967 self.ftpClientObj.upload(filename)
970 self.ftpClientObj.upload(filename)
968 self.ftpClientObj.close()
971 self.ftpClientObj.close()
969
972
970 def ftp_thread(self, server, username, password, remotefolder):
973 def ftp_thread(self, server, username, password, remotefolder):
971 if not(self.status):
974 if not(self.status):
972 return
975 return
973
976
974 import multiprocessing
977 import multiprocessing
975
978
976 p = multiprocessing.Process(target=self.worker_ftp, args=(server, username, password, remotefolder, self.filenameList,))
979 p = multiprocessing.Process(target=self.worker_ftp, args=(server, username, password, remotefolder, self.filenameList,))
977 p.start()
980 p.start()
978
981
979 p.join(3)
982 p.join(3)
980
983
981 if p.is_alive():
984 if p.is_alive():
982 p.terminate()
985 p.terminate()
983 p.join()
986 p.join()
984 print('killing ftp process...')
987 print('killing ftp process...')
985 self.status = 0
988 self.status = 0
986 return
989 return
987
990
988 self.status = 1
991 self.status = 1
989 return
992 return
990
993
991 def filterByExt(self, ext, localfolder):
994 def filterByExt(self, ext, localfolder):
992 fnameList = glob.glob1(localfolder,ext)
995 fnameList = glob.glob1(localfolder,ext)
993 self.filenameList = [os.path.join(localfolder,x) for x in fnameList]
996 self.filenameList = [os.path.join(localfolder,x) for x in fnameList]
994
997
995 if len(self.filenameList) == 0:
998 if len(self.filenameList) == 0:
996 self.status = 0
999 self.status = 0
997
1000
998 def run(self, dataOut, ext, localfolder, remotefolder, server, username, password, period=1):
1001 def run(self, dataOut, ext, localfolder, remotefolder, server, username, password, period=1):
999
1002
1000 self.counter += 1
1003 self.counter += 1
1001 if self.counter >= period:
1004 if self.counter >= period:
1002 self.filterByExt(ext, localfolder)
1005 self.filterByExt(ext, localfolder)
1003
1006
1004 self.ftp_thread(server, username, password, remotefolder)
1007 self.ftp_thread(server, username, password, remotefolder)
1005
1008
1006 self.counter = 0
1009 self.counter = 0
1007
1010
1008 self.status = 1
1011 self.status = 1
General Comments 0
You need to be logged in to leave comments. Login now