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