##// END OF EJS Templates
included new update scripts for winds
joabAM -
r1281:ee878771644c
parent child
Show More
@@ -1,1008 +1,1008
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
24 from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator
25
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
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
587 self.clientObj = None
587 self.clientObj = None
588 self.localfolder = localfolder
588 self.localfolder = localfolder
589 self.ext = ext
589 self.ext = ext
590 self.period = period
590 self.period = period
591
591
592 if str.lower(protocol) == 'ftp':
592 if str.lower(protocol) == 'ftp':
593 self.clientObj = FTPClient(server, username, password, remotefolder, period)
593 self.clientObj = FTPClient(server, username, password, remotefolder, period)
594
594
595 if str.lower(protocol) == 'ssh':
595 if str.lower(protocol) == 'ssh':
596 self.clientObj = SSHClient(server, username, password, remotefolder, period)
596 self.clientObj = SSHClient(server, username, password, remotefolder, period)
597
597
598 if not self.clientObj:
598 if not self.clientObj:
599 raise ValueError("%s has been chosen as remote access protocol but it is not valid" %protocol)
599 raise ValueError("%s has been chosen as remote access protocol but it is not valid" %protocol)
600
600
601 self.clientObj.start()
601 self.clientObj.start()
602
602 print("ftp setup complete")
603 def findFiles(self):
603 def findFiles(self):
604
604
605 if not type(self.localfolder) == list:
605 if not type(self.localfolder) == list:
606 folderList = [self.localfolder]
606 folderList = [self.localfolder]
607 else:
607 else:
608 folderList = self.localfolder
608 folderList = self.localfolder
609
609
610 #Remove duplicate items
610 #Remove duplicate items
611 folderList = list(set(folderList))
611 folderList = list(set(folderList))
612
612
613 fullfilenameList = []
613 fullfilenameList = []
614
614
615 for thisFolder in folderList:
615 for thisFolder in folderList:
616
616
617 print("[Remote Server]: Searching files on %s" %thisFolder)
617 print("[Remote Server]: Searching files on %s" %thisFolder)
618
618
619 filenameList = glob.glob1(thisFolder, '*%s' %self.ext)
619 filenameList = glob.glob1(thisFolder, '*%s' %self.ext)
620
620
621 if len(filenameList) < 1:
621 if len(filenameList) < 1:
622
622
623 continue
623 continue
624
624
625 for thisFile in filenameList:
625 for thisFile in filenameList:
626 fullfilename = os.path.join(thisFolder, thisFile)
626 fullfilename = os.path.join(thisFolder, thisFile)
627
627
628 if fullfilename in fullfilenameList:
628 if fullfilename in fullfilenameList:
629 continue
629 continue
630
630
631 #Only files modified in the last 30 minutes are considered
631 #Only files modified in the last 30 minutes are considered
632 if os.path.getmtime(fullfilename) < time.time() - 30*60:
632 if os.path.getmtime(fullfilename) < time.time() - 30*60:
633 continue
633 continue
634
634
635 fullfilenameList.append(fullfilename)
635 fullfilenameList.append(fullfilename)
636
636
637 return fullfilenameList
637 return fullfilenameList
638
638
639 def run(self, **kwargs):
639 def run(self, **kwargs):
640 if not self.isConfig:
640 if not self.isConfig:
641 self.init = time.time()
641 self.init = time.time()
642 self.setup(**kwargs)
642 self.setup(**kwargs)
643 self.isConfig = True
643 self.isConfig = True
644
644
645 if not self.clientObj.is_alive():
645 if not self.clientObj.is_alive():
646 print("[Remote Server]: Restarting connection ")
646 print("[Remote Server]: Restarting connection ")
647 self.setup(**kwargs)
647 self.setup(**kwargs)
648
648
649 if time.time() - self.init >= self.period:
649 if time.time() - self.init >= self.period:
650 fullfilenameList = self.findFiles()
650 fullfilenameList = self.findFiles()
651
651
652 if self.clientObj.updateFileList(fullfilenameList):
652 if self.clientObj.updateFileList(fullfilenameList):
653 print("[Remote Server]: Sending the next files ", str(fullfilenameList))
653 print("[Remote Server]: Sending the next files ", str(fullfilenameList))
654 self.init = time.time()
654 self.init = time.time()
655
655
656 def close(self):
656 def close(self):
657 print("[Remote Server] Stopping thread")
657 print("[Remote Server] Stopping thread")
658 self.clientObj.stop()
658 self.clientObj.stop()
659
659
660
660
661 class FTP(object):
661 class FTP(object):
662 """
662 """
663 Ftp is a public class used to define custom File Transfer Protocol from "ftplib" python module
663 Ftp is a public class used to define custom File Transfer Protocol from "ftplib" python module
664
664
665 Non-standard Python modules used: None
665 Non-standard Python modules used: None
666
666
667 Written by "Daniel Suarez":mailto:daniel.suarez@jro.igp.gob.pe Oct. 26, 2010
667 Written by "Daniel Suarez":mailto:daniel.suarez@jro.igp.gob.pe Oct. 26, 2010
668 """
668 """
669
669
670 def __init__(self,server = None, username=None, password=None, remotefolder=None):
670 def __init__(self,server = None, username=None, password=None, remotefolder=None):
671 """
671 """
672 This method is used to setting parameters for FTP and establishing connection to remote server
672 This method is used to setting parameters for FTP and establishing connection to remote server
673
673
674 Inputs:
674 Inputs:
675 server - remote server IP Address
675 server - remote server IP Address
676
676
677 username - remote server Username
677 username - remote server Username
678
678
679 password - remote server password
679 password - remote server password
680
680
681 remotefolder - remote server current working directory
681 remotefolder - remote server current working directory
682
682
683 Return: void
683 Return: void
684
684
685 Affects:
685 Affects:
686 self.status - in Error Case or Connection Failed this parameter is set to 1 else 0
686 self.status - in Error Case or Connection Failed this parameter is set to 1 else 0
687
687
688 self.folderList - sub-folder list of remote folder
688 self.folderList - sub-folder list of remote folder
689
689
690 self.fileList - file list of remote folder
690 self.fileList - file list of remote folder
691
691
692
692
693 """
693 """
694
694
695 if ((server == None) and (username==None) and (password==None) and (remotefolder==None)):
695 if ((server == None) and (username==None) and (password==None) and (remotefolder==None)):
696 server, username, password, remotefolder = self.parmsByDefault()
696 server, username, password, remotefolder = self.parmsByDefault()
697
697
698 self.server = server
698 self.server = server
699 self.username = username
699 self.username = username
700 self.password = password
700 self.password = password
701 self.remotefolder = remotefolder
701 self.remotefolder = remotefolder
702 self.file = None
702 self.file = None
703 self.ftp = None
703 self.ftp = None
704 self.status = 0
704 self.status = 0
705
705
706 try:
706 try:
707 self.ftp = ftplib.FTP(self.server)
707 self.ftp = ftplib.FTP(self.server)
708 self.ftp.login(self.username,self.password)
708 self.ftp.login(self.username,self.password)
709 self.ftp.cwd(self.remotefolder)
709 self.ftp.cwd(self.remotefolder)
710 # print 'Connect to FTP Server: Successfully'
710 # print 'Connect to FTP Server: Successfully'
711
711
712 except ftplib.all_errors:
712 except ftplib.all_errors:
713 print('Error FTP Service')
713 print('Error FTP Service')
714 self.status = 1
714 self.status = 1
715 return
715 return
716
716
717
717
718
718
719 self.dirList = []
719 self.dirList = []
720
720
721 try:
721 try:
722 self.dirList = self.ftp.nlst()
722 self.dirList = self.ftp.nlst()
723
723
724 except ftplib.error_perm as resp:
724 except ftplib.error_perm as resp:
725 if str(resp) == "550 No files found":
725 if str(resp) == "550 No files found":
726 print("no files in this directory")
726 print("no files in this directory")
727 self.status = 1
727 self.status = 1
728 return
728 return
729
729
730 except ftplib.all_errors:
730 except ftplib.all_errors:
731 print('Error Displaying Dir-Files')
731 print('Error Displaying Dir-Files')
732 self.status = 1
732 self.status = 1
733 return
733 return
734
734
735 self.fileList = []
735 self.fileList = []
736 self.folderList = []
736 self.folderList = []
737 #only for test
737 #only for test
738 for f in self.dirList:
738 for f in self.dirList:
739 name, ext = os.path.splitext(f)
739 name, ext = os.path.splitext(f)
740 if ext != '':
740 if ext != '':
741 self.fileList.append(f)
741 self.fileList.append(f)
742 # print 'filename: %s - size: %d'%(f,self.ftp.size(f))
742 # print 'filename: %s - size: %d'%(f,self.ftp.size(f))
743
743
744 def parmsByDefault(self):
744 def parmsByDefault(self):
745 server = 'jro-app.igp.gob.pe'
745 server = 'jro-app.igp.gob.pe'
746 username = 'wmaster'
746 username = 'wmaster'
747 password = 'mst2010vhf'
747 password = 'mst2010vhf'
748 remotefolder = '/home/wmaster/graficos'
748 remotefolder = '/home/wmaster/graficos'
749
749
750 return server, username, password, remotefolder
750 return server, username, password, remotefolder
751
751
752
752
753 def mkd(self,dirname):
753 def mkd(self,dirname):
754 """
754 """
755 mkd is used to make directory in remote server
755 mkd is used to make directory in remote server
756
756
757 Input:
757 Input:
758 dirname - directory name
758 dirname - directory name
759
759
760 Return:
760 Return:
761 1 in error case else 0
761 1 in error case else 0
762 """
762 """
763 try:
763 try:
764 self.ftp.mkd(dirname)
764 self.ftp.mkd(dirname)
765 except:
765 except:
766 print('Error creating remote folder:%s'%dirname)
766 print('Error creating remote folder:%s'%dirname)
767 return 1
767 return 1
768
768
769 return 0
769 return 0
770
770
771
771
772 def delete(self,filename):
772 def delete(self,filename):
773 """
773 """
774 delete is used to delete file in current working directory of remote server
774 delete is used to delete file in current working directory of remote server
775
775
776 Input:
776 Input:
777 filename - filename to delete in remote folder
777 filename - filename to delete in remote folder
778
778
779 Return:
779 Return:
780 1 in error case else 0
780 1 in error case else 0
781 """
781 """
782
782
783 try:
783 try:
784 self.ftp.delete(filename)
784 self.ftp.delete(filename)
785 except:
785 except:
786 print('Error deleting remote file:%s'%filename)
786 print('Error deleting remote file:%s'%filename)
787 return 1
787 return 1
788
788
789 return 0
789 return 0
790
790
791 def download(self,filename,localfolder):
791 def download(self,filename,localfolder):
792 """
792 """
793 download is used to downloading file from remote folder into local folder
793 download is used to downloading file from remote folder into local folder
794
794
795 Inputs:
795 Inputs:
796 filename - filename to donwload
796 filename - filename to donwload
797
797
798 localfolder - directory local to store filename
798 localfolder - directory local to store filename
799
799
800 Returns:
800 Returns:
801 self.status - 1 in error case else 0
801 self.status - 1 in error case else 0
802 """
802 """
803
803
804 self.status = 0
804 self.status = 0
805
805
806
806
807 if not(filename in self.fileList):
807 if not(filename in self.fileList):
808 print('filename:%s not exists'%filename)
808 print('filename:%s not exists'%filename)
809 self.status = 1
809 self.status = 1
810 return self.status
810 return self.status
811
811
812 newfilename = os.path.join(localfolder,filename)
812 newfilename = os.path.join(localfolder,filename)
813
813
814 self.file = open(newfilename, 'wb')
814 self.file = open(newfilename, 'wb')
815
815
816 try:
816 try:
817 print('Download: ' + filename)
817 print('Download: ' + filename)
818 self.ftp.retrbinary('RETR ' + filename, self.__handleDownload)
818 self.ftp.retrbinary('RETR ' + filename, self.__handleDownload)
819 print('Download Complete')
819 print('Download Complete')
820 except ftplib.all_errors:
820 except ftplib.all_errors:
821 print('Error Downloading ' + filename)
821 print('Error Downloading ' + filename)
822 self.status = 1
822 self.status = 1
823 return self.status
823 return self.status
824
824
825 self.file.close()
825 self.file.close()
826
826
827 return self.status
827 return self.status
828
828
829
829
830 def __handleDownload(self,block):
830 def __handleDownload(self,block):
831 """
831 """
832 __handleDownload is used to handle writing file
832 __handleDownload is used to handle writing file
833 """
833 """
834 self.file.write(block)
834 self.file.write(block)
835
835
836
836
837 def upload(self,filename,remotefolder=None):
837 def upload(self,filename,remotefolder=None):
838 """
838 """
839 upload is used to uploading local file to remote directory
839 upload is used to uploading local file to remote directory
840
840
841 Inputs:
841 Inputs:
842 filename - full path name of local file to store in remote directory
842 filename - full path name of local file to store in remote directory
843
843
844 remotefolder - remote directory
844 remotefolder - remote directory
845
845
846 Returns:
846 Returns:
847 self.status - 1 in error case else 0
847 self.status - 1 in error case else 0
848 """
848 """
849
849
850 if remotefolder == None:
850 if remotefolder == None:
851 remotefolder = self.remotefolder
851 remotefolder = self.remotefolder
852
852
853 self.status = 0
853 self.status = 0
854
854
855 try:
855 try:
856 self.ftp.cwd(remotefolder)
856 self.ftp.cwd(remotefolder)
857
857
858 self.file = open(filename, 'rb')
858 self.file = open(filename, 'rb')
859
859
860 (head, tail) = os.path.split(filename)
860 (head, tail) = os.path.split(filename)
861
861
862 command = "STOR " + tail
862 command = "STOR " + tail
863
863
864 print('Uploading: ' + tail)
864 print('Uploading: ' + tail)
865 self.ftp.storbinary(command, self.file)
865 self.ftp.storbinary(command, self.file)
866 print('Upload Completed')
866 print('Upload Completed')
867
867
868 except ftplib.all_errors:
868 except ftplib.all_errors:
869 print('Error Uploading ' + tail)
869 print('Error Uploading ' + tail)
870 self.status = 1
870 self.status = 1
871 return self.status
871 return self.status
872
872
873 self.file.close()
873 self.file.close()
874
874
875 #back to initial directory in __init__()
875 #back to initial directory in __init__()
876 self.ftp.cwd(self.remotefolder)
876 self.ftp.cwd(self.remotefolder)
877
877
878 return self.status
878 return self.status
879
879
880
880
881 def dir(self,remotefolder):
881 def dir(self,remotefolder):
882 """
882 """
883 dir is used to change working directory of remote server and get folder and file list
883 dir is used to change working directory of remote server and get folder and file list
884
884
885 Input:
885 Input:
886 remotefolder - current working directory
886 remotefolder - current working directory
887
887
888 Affects:
888 Affects:
889 self.fileList - file list of working directory
889 self.fileList - file list of working directory
890
890
891 Return:
891 Return:
892 infoList - list with filenames and size of file in bytes
892 infoList - list with filenames and size of file in bytes
893
893
894 self.folderList - folder list
894 self.folderList - folder list
895 """
895 """
896
896
897 self.remotefolder = remotefolder
897 self.remotefolder = remotefolder
898 print('Change to ' + self.remotefolder)
898 print('Change to ' + self.remotefolder)
899 try:
899 try:
900 self.ftp.cwd(remotefolder)
900 self.ftp.cwd(remotefolder)
901 except ftplib.all_errors:
901 except ftplib.all_errors:
902 print('Error Change to ' + self.remotefolder)
902 print('Error Change to ' + self.remotefolder)
903 infoList = None
903 infoList = None
904 self.folderList = None
904 self.folderList = None
905 return infoList,self.folderList
905 return infoList,self.folderList
906
906
907 self.dirList = []
907 self.dirList = []
908
908
909 try:
909 try:
910 self.dirList = self.ftp.nlst()
910 self.dirList = self.ftp.nlst()
911
911
912 except ftplib.error_perm as resp:
912 except ftplib.error_perm as resp:
913 if str(resp) == "550 No files found":
913 if str(resp) == "550 No files found":
914 print("no files in this directory")
914 print("no files in this directory")
915 infoList = None
915 infoList = None
916 self.folderList = None
916 self.folderList = None
917 return infoList,self.folderList
917 return infoList,self.folderList
918 except ftplib.all_errors:
918 except ftplib.all_errors:
919 print('Error Displaying Dir-Files')
919 print('Error Displaying Dir-Files')
920 infoList = None
920 infoList = None
921 self.folderList = None
921 self.folderList = None
922 return infoList,self.folderList
922 return infoList,self.folderList
923
923
924 infoList = []
924 infoList = []
925 self.fileList = []
925 self.fileList = []
926 self.folderList = []
926 self.folderList = []
927 for f in self.dirList:
927 for f in self.dirList:
928 name,ext = os.path.splitext(f)
928 name,ext = os.path.splitext(f)
929 if ext != '':
929 if ext != '':
930 self.fileList.append(f)
930 self.fileList.append(f)
931 value = (f,self.ftp.size(f))
931 value = (f,self.ftp.size(f))
932 infoList.append(value)
932 infoList.append(value)
933
933
934 if ext == '':
934 if ext == '':
935 self.folderList.append(f)
935 self.folderList.append(f)
936
936
937 return infoList,self.folderList
937 return infoList,self.folderList
938
938
939
939
940 def close(self):
940 def close(self):
941 """
941 """
942 close is used to close and end FTP connection
942 close is used to close and end FTP connection
943
943
944 Inputs: None
944 Inputs: None
945
945
946 Return: void
946 Return: void
947
947
948 """
948 """
949 self.ftp.close()
949 self.ftp.close()
950
950
951 class SendByFTP(Operation):
951 class SendByFTP(Operation):
952
952
953 def __init__(self, **kwargs):
953 def __init__(self, **kwargs):
954 Operation.__init__(self, **kwargs)
954 Operation.__init__(self, **kwargs)
955 self.status = 1
955 self.status = 1
956 self.counter = 0
956 self.counter = 0
957
957
958 def error_print(self, ValueError):
958 def error_print(self, ValueError):
959
959
960 print(ValueError, 'Error FTP')
960 print(ValueError, 'Error FTP')
961 print("don't worry the program is running...")
961 print("don't worry the program is running...")
962
962
963 def worker_ftp(self, server, username, password, remotefolder, filenameList):
963 def worker_ftp(self, server, username, password, remotefolder, filenameList):
964
964
965 self.ftpClientObj = FTP(server, username, password, remotefolder)
965 self.ftpClientObj = FTP(server, username, password, remotefolder)
966 for filename in filenameList:
966 for filename in filenameList:
967 self.ftpClientObj.upload(filename)
967 self.ftpClientObj.upload(filename)
968 self.ftpClientObj.close()
968 self.ftpClientObj.close()
969
969
970 def ftp_thread(self, server, username, password, remotefolder):
970 def ftp_thread(self, server, username, password, remotefolder):
971 if not(self.status):
971 if not(self.status):
972 return
972 return
973
973
974 import multiprocessing
974 import multiprocessing
975
975
976 p = multiprocessing.Process(target=self.worker_ftp, args=(server, username, password, remotefolder, self.filenameList,))
976 p = multiprocessing.Process(target=self.worker_ftp, args=(server, username, password, remotefolder, self.filenameList,))
977 p.start()
977 p.start()
978
978
979 p.join(3)
979 p.join(3)
980
980
981 if p.is_alive():
981 if p.is_alive():
982 p.terminate()
982 p.terminate()
983 p.join()
983 p.join()
984 print('killing ftp process...')
984 print('killing ftp process...')
985 self.status = 0
985 self.status = 0
986 return
986 return
987
987
988 self.status = 1
988 self.status = 1
989 return
989 return
990
990
991 def filterByExt(self, ext, localfolder):
991 def filterByExt(self, ext, localfolder):
992 fnameList = glob.glob1(localfolder,ext)
992 fnameList = glob.glob1(localfolder,ext)
993 self.filenameList = [os.path.join(localfolder,x) for x in fnameList]
993 self.filenameList = [os.path.join(localfolder,x) for x in fnameList]
994
994
995 if len(self.filenameList) == 0:
995 if len(self.filenameList) == 0:
996 self.status = 0
996 self.status = 0
997
997
998 def run(self, dataOut, ext, localfolder, remotefolder, server, username, password, period=1):
998 def run(self, dataOut, ext, localfolder, remotefolder, server, username, password, period=1):
999
999
1000 self.counter += 1
1000 self.counter += 1
1001 if self.counter >= period:
1001 if self.counter >= period:
1002 self.filterByExt(ext, localfolder)
1002 self.filterByExt(ext, localfolder)
1003
1003
1004 self.ftp_thread(server, username, password, remotefolder)
1004 self.ftp_thread(server, username, password, remotefolder)
1005
1005
1006 self.counter = 0
1006 self.counter = 0
1007
1007
1008 self.status = 1
1008 self.status = 1
General Comments 0
You need to be logged in to leave comments. Login now