SSHClient

  1 import os
  2 import re
  3 import sys
  4 import time
  5 import traceback
  6 import paramiko
  7 import telnetlib
  8 from functools import reduce
  9 from pprint import pprint
 10 from .MyPrint import MyPrint
 11 from .PathConfig import pathOutcome
 12 
 13 
 14 #=========================================================
 15 
 16 class Pattern(object):
 17     #------------------------------------------------
 18     neFlag              = re.compile(r'^([<\[])?([^#<>\[\]\s]+)(?(1)[>\]]\s*$|#\s*$)')
 19     #                                    \---/   \-----------/   \-/ \-------/ \---/
 20     #                                      |           |          |      |       |
 21     #                                      |           |          |      |    CISCO device
 22     #                                HUAWEI device     |          |  HUAWEI device
 23     #                                                  |   IF HUAWEI device
 24     #                                              device name
 25     nebyteFlag          = re.compile(rb'([<\[])?([^#<>\[\]\s]+)(?(1)[>\]]\s*$|#\s*$)')
 26     #------------------------------------------------
 27     linuxFlag           = re.compile(r'^([^#\$]+)[#\$]\s*$')
 28     linuxbyteFlag       = re.compile(rb'^([^#\$]+)[#\$]\s*$')
 29     #------------------------------------------------
 30     moreFlag            = re.compile(r'-.*more.*-', re.I)
 31     morebyteFlag        = re.compile(rb'-.*more.*-',re.I)
 32     #------------------------------------------------
 33     continueFlag        = re.compile(r'Press any key to continue \(Q to quit\)')
 34     continuebyteFlag    = re.compile(rb'Press any key to continue \(Q to quit\)')
 35 
 36     #------------------------------------------------
 37     loginFlag           = re.compile(r'(?:login|username):', re.I)
 38     loginbyteFlag       = re.compile(rb'(?:login|username):', re.I)
 39 
 40     #------------------------------------------------
 41     passordFlag         = re.compile(r'password:', re.I)
 42     passordbyteFlag     = re.compile(rb'password:', re.I)
 43     #------------------------------------------------
 44     pwdChangeFlag       = re.compile(
 45                             r'The password needs to be changed\. Change now\? \[Y/N\]:'
 46                         )
 47     pwdChangebyteFlag   = re.compile(
 48                             rb'The password needs to be changed\. Change now\? \[Y/N\]:'
 49                         )
 50     #------------------------------------------------
 51     firstSshFlag        = re.compile(
 52                             r'Are you sure you want to continue connecting \(yes/no\)\?'
 53                         )
 54     #------------------------------------------------
 55     yes_no_Flag         = re.compile(r'\(yes/no\)')
 56     yes_no_byteFlag     = re.compile(rb'\(yes/no\)')
 57     #------------------------------------------------
 58     Y_N_Flag            = re.compile(r'\[Y/N\]')
 59     Y_N_byteFlag        = re.compile(rb'\[Y/N\]')
 60     #------------------------------------------------
 61     Y_N_C_Flag          = re.compile(r'\[Y\(yes\)/N\(no\)/C\(cancel\)\]:')
 62     Y_N_C_byteFlag      = re.compile(rb'\[Y\(yes\)/N\(no\)/C\(cancel\)\]:')
 63     #------------------------------------------------
 64     neErrorFlag         = re.compile(
 65                             r"Error: (?:(?:Incomplete|Unrecognized) command found at '\^' position\.|"
 66                             r"The specified \S+ does not exist\.|"
 67                             r"The command must be executed singly, "
 68                             r"please commit uncommitted configuration first|"
 69                             r"Bad command\.|Invalid parameter\.)?"
 70                         )
 71     neErrorbyteFlag     = re.compile(
 72                             rb"Error: (?:(?:Incomplete|Unrecognized) command found at '\^' position\.|"
 73                             rb"The specified \S+ does not exist\.|"
 74                             rb"The command must be executed singly, "
 75                             rb"please commit uncommitted configuration first|"
 76                             rb"Bad command\.|Invalid parameter\.)?"
 77                         )
 78     neWarningFlag       = re.compile(
 79                             r'Warning: (?:The current configuration will be written to the device\.)?'
 80                         )
 81     neWarningbyteFlag   = re.compile(
 82                             rb'Warning: (?:The current configuration will be written to the device\.)?'
 83                         )
 84     #------------------------------------------------
 85     sshFlag             = re.compile(r'ssh \S+@(\d{1,3}(?:\.\d{1,3}){3})')
 86     sshbyteFlag         = re.compile(rb'ssh \S+@(\d{1,3}(?:\.\d{1,3}){3})')
 87 
 88 
 89     sshErrorFlag        = re.compile(
 90                             r'(?:ssh: connect to host \d{1,3}(?:\.\d{1,3}){3} port 22: '
 91                             r'(?:Connection timed out|Resource temporarily unavailable)|'
 92                             r'ssh_exchange_identification: Connection closed by remote host|'
 93                             r'The user has been locked and you cannot log on it\.|'
 94                             r'Received disconnect from \d{1,3}(?:\.\d{1,3}){3} '
 95                             r'port 22:2: The connection is closed by SSH Server|'
 96                             r'Disconnected from \d{1,3}(?:\.\d{1,3}){3} port 22)'
 97                         )
 98 
 99     sshErrorbyteFlag    = re.compile(
100                             rb'(?:ssh: connect to host \d{1,3}(?:\.\d{1,3}){3} port 22: '
101                             rb'(?:Connection timed out|Resource temporarily unavailable)|'
102                             rb'ssh_exchange_identification: Connection closed by remote host|'
103                             rb'The user has been locked and you cannot log on it\.|'
104                             rb'Received disconnect from \d{1,3}(?:\.\d{1,3}){3} '
105                             rb'port 22:2: The connection is closed by SSH Server|'
106                             rb'Disconnected from \d{1,3}(?:\.\d{1,3}){3} port 22)'
107                         )
108 #=========================================================
109 
110 class ConnectError(Exception):
111     pass
112 
113 
114 class NeError(Exception):
115     pass
116 
117 
118 class SSH_Client(object):
119     def __init__(self, address, username, password, port=22):
120         self._ip = address
121         self._client = paramiko.SSHClient()
122         self._client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
123         self._client.connect(
124             hostname=address, 
125             username=username, 
126             password=password,
127             port=port, 
128             timeout=20, 
129             banner_timeout=20, 
130             look_for_keys=False, 
131             allow_agent=False
132         )
133         self._shell = self._client.invoke_shell()
134 
135     def bufferReady(self, interval=0.1):
136         while True:
137             time.sleep(interval)
138             if self._shell.recv_ready() or self._shell.recv_stderr_ready():
139                 break
140 
141     def recv_unit(self, interval):
142         temp = ''
143         endMark = 0
144         while True:
145             if (Pattern.neFlag.match(temp.split('\n')[-1].strip()) 
146                 or Pattern.linuxFlag.match(temp.split('\n')[-1].strip())
147                 or Pattern.loginFlag.search(temp.split('\n')[-1]) 
148                 or Pattern.passordFlag.search(temp.split('\n')[-1])
149                 or Pattern.pwdChangeFlag.search(temp.split('\n')[-1])
150                 or Pattern.firstSshFlag.search(temp.split('\n')[-1])
151                 or Pattern.yes_no_Flag.search(temp.split('\n')[-1]) 
152                 or Pattern.Y_N_Flag.search(temp.split('\n')[-1]) 
153                 or Pattern.Y_N_C_Flag.search(temp.split('\n')[-1])
154                 or Pattern.moreFlag.search(temp.split('\n')[-1]) 
155                 or Pattern.continueFlag.search(temp.split('\n')[-1])
156                 ):
157                 #print('WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW')
158                 endMark = 1
159                 break
160             elif temp.endswith('\r\n') and len(temp) > 300:
161                 #print('QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ')
162                 endMark = 2
163                 break
164             #-----------------------------
165             elif len(temp) > 99999:
166                 #print('RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR')
167                 endMark = 3
168                 break
169             #-----------------------------
170             self.bufferReady(interval)
171             temp += self._shell.recv(99999).decode(encoding='UTF-8', errors='replace')
172 
173         return temp, endMark
174 
175     def recv_all(self, deviceMark, cmdBefore, cmdAfter, interval=0.1):
176         output = ''
177         #self.bufferReady(interval)
178         #temp = self._shell.recv(99999).decode(encoding='UTF-8', errors='replace')
179         temp, endMark = self.recv_unit(interval)
180         output += temp
181         #------------------------------------
182         if (Pattern.neFlag.match(deviceMark.strip()) 
183             or Pattern.linuxFlag.match(deviceMark.strip())
184             ):
185             if Pattern.neErrorFlag.search(temp):
186                 #--------------
187                 #MyPrint.Blue('++++++++++++++++++++')
188                 #print(deviceMark, '=====> ', temp.split('\n')[0])
189                 #pprint(temp)
190                 #MyPrint.Blue('====================')
191                 #--------------
192                 MyPrint.Red(deviceMark.strip() + temp.split('\n')[0].strip())
193                 #raise NeError('Command Error')
194             elif Pattern.neWarningFlag.search(temp):
195                 #--------------
196                 #MyPrint.Blue('++++++++++++++++++++')
197                 #print(deviceMark, '=====> ', temp.split('\n')[0])
198                 #pprint(temp)
199                 #MyPrint.Blue('====================')
200                 #--------------
201                 MyPrint.Yellow(deviceMark.strip() + temp.split('\n')[0].strip())
202             else:
203                 #--------------
204                 #MyPrint.Blue('++++++++++++++++++++')
205                 #print(deviceMark, '=====> ', temp.split('\n')[0])
206                 #pprint(temp)
207                 #MyPrint.Blue('====================')
208                 #--------------
209                 MyPrint.Green(deviceMark.strip() + temp.split('\n')[0].strip())
210         #elif (Pattern.yes_no_Flag.search(deviceMark) 
211         #        or Pattern.Y_N_Flag.search(deviceMark) 
212         #        or Pattern.Y_N_C_Flag.search(deviceMark)
213         #    ):
214         #    print(deviceMark.strip() + temp.split('\n')[0].strip())
215         else:
216             #--------------
217             MyPrint.Blue('++++++++++++++++++++')
218             print(deviceMark, '=====> ', temp.split('\n')[0])
219             pprint(temp)
220             MyPrint.Blue('====================')
221             #--------------
222             print(deviceMark.strip() + temp.split('\n')[0].strip())
223 
224         if endMark == 1:
225             for line in temp.split('\n')[1:-1]:
226                 if line and line != '\r':
227                     #print(line, flush=True)
228                     print(line)
229             #if temp.split('\n')[1:-1]:
230             #    print(reduce(lambda x, y: x + '\n' + y, temp.split('\n')[1:-1]).strip())
231         else:
232             for line in temp.split('\n')[1:]:
233                 if line and line != '\r':
234                     #print(line, flush=True)
235                     print(line)
236             #if temp.split('\n')[1:]:
237             #    print(reduce(lambda x, y: x + '\n' + y, temp.split('\n')[1:]).strip())
238         #------------------------------------
239         while True:
240             #==============================================================
241             if (Pattern.neFlag.match(temp.split('\n')[-1].strip()) 
242                 or Pattern.linuxFlag.match(temp.split('\n')[-1].strip())
243                 ):
244                 deviceMark = temp.split('\n')[-1]
245                 if len(temp.split('\n')) >= 2 and Pattern.sshErrorFlag.search(temp.split('\n')[-2]):
246                     raise ConnectError('Connection failed')
247                 break
248             #==============================================================
249             elif (Pattern.loginFlag.search(temp.split('\n')[-1])
250                 or Pattern.passordFlag.search(temp.split('\n')[-1])
251                 ):
252                 deviceMark = temp.split('\n')[-1]
253                 if len(temp.split('\n')) >= 2 and Pattern.sshErrorFlag.search(temp.split('\n')[-2]):
254                     raise ConnectError('Connection failed')
255                 break
256             #==============================================================
257             elif Pattern.pwdChangeFlag.search(temp.split('\n')[-1]):
258                 deviceMark = temp.split('\n')[-1]
259                 #print(deviceMark + 'N')
260                 self._shell.send('N\n')
261                 deviceMark, temp = self.recv_all(deviceMark, cmdBefore, cmdAfter, interval)
262                 output += temp
263                 break
264             elif Pattern.firstSshFlag.search(temp.split('\n')[-1]):
265                 deviceMark = temp.split('\n')[-1]
266                 self._shell.send('yes\n')
267                 deviceMark, temp = self.recv_all(deviceMark, cmdBefore, cmdAfter, interval)
268                 output += temp
269                 break
270             #==============================================================
271             elif (Pattern.yes_no_Flag.search(temp.split('\n')[-1]) 
272                 or Pattern.Y_N_Flag.search(temp.split('\n')[-1]) 
273                 or Pattern.Y_N_C_Flag.search(temp.split('\n')[-1])
274                 ):
275                 if cmdAfter not in ('Y', 'y', 'N', 'n', 'C', 'c', 'yes', 'no', 'cancel'):
276                     deviceMark = temp.split('\n')[-1]
277                     yourChoice = ''
278                     while True:
279                         yourChoice = input(temp.split('\n')[-1])
280                         if yourChoice in ('Y', 'y', 'N', 'n', 'C', 'c', 'yes', 'no', 'cancel'):
281                             break
282                     self._shell.send(yourChoice + '\n')
283                     deviceMark, temp = self.recv_all(deviceMark, cmdBefore, cmdAfter, interval)
284                     output += temp
285                 else:
286                     deviceMark = temp.split('\n')[-1]
287                 break
288             #==============================================================
289             elif (Pattern.moreFlag.search(temp.split('\n')[-1]) 
290                 or Pattern.continueFlag.search(temp.split('\n')[-1])
291                 ):
292                 deviceMark = temp.split('\n')[-1]
293                 self._shell.send(' ')
294                 deviceMark, temp = self.recv_all(deviceMark, cmdBefore, cmdAfter, interval)
295                 output += temp
296                 break
297             #==============================================================
298             #self.bufferReady(interval)
299             #temp = self._shell.recv(99999).decode(encoding='UTF-8', errors='replace')
300             temp, endMark = self.recv_unit(interval)
301             output += temp
302             #----------------------------
303             #MyPrint.Yellow('++++++++++++++++')
304             #pprint(temp)
305             #MyPrint.Yellow('================')
306             #----------------------------
307             #------------------------------------
308             if endMark == 1:
309                 for line in temp.split('\n')[:-1]:
310                     if line and line != '\r':
311                         #print(line.strip('\r'), flush=True)
312                         #print(line, flush=True)
313                         print(line)
314                 #if temp.split('\n')[:-1]:
315                 #    print(reduce(lambda x, y: x + '\n' + y, temp.split('\n')[:-1]).strip())
316             else:
317                 for line in temp.split('\n'):
318                     if line and line != '\r':
319                         #print(line.strip('\r'), flush=True)
320                         #print(line, flush=True)
321                         print(line)
322                 #if temp.split('\n'):
323                 #    print(reduce(lambda x, y: x + '\n' + y, temp.split('\n')).strip())
324             #------------------------------------
325             #==============================================================
326         return deviceMark, output
327 
328     def send_command(self, command, deviceMark, cmdBefore, cmdAfter, interval=0.1):
329         if command.endswith('\n'):
330             pass
331         else:
332             command += '\n'
333         self._shell.send(command)
334         deviceMark, stdout = self.recv_all(deviceMark, cmdBefore, cmdAfter, interval)
335         return deviceMark, stdout
336 
337     def run(self, cmds, interval=0.1):
338         res, stdout, deviceMark = 'Below commands may be wrong:\n', '', ''
339         #====================================================================
340         #self.bufferReady(interval)
341         #temp = self._shell.recv(99999).decode(encoding='UTF-8', errors='replace')
342         temp, endMark = self.recv_unit(interval)
343         stdout += temp
344         while True:
345             if (Pattern.neFlag.match(temp.split('\n')[-1].strip()) 
346                 or Pattern.linuxFlag.match(temp.split('\n')[-1].strip())):
347                 deviceMark = temp.split('\n')[-1]
348                 break
349             elif Pattern.pwdChangeFlag.search(temp.split('\n')[-1]):
350                 self._shell.send('N\n')
351             #self.bufferReady(interval)
352             #temp = self._shell.recv(99999).decode(encoding='UTF-8', errors='replace')
353             temp, endMark = self.recv_unit(interval)
354             stdout += temp
355         #====================================================================
356         if deviceMark:
357             cmdList = cmds.split('\n')
358             for index, cmd in enumerate(cmdList):
359                 if cmd.strip():
360                     cmdBefore, cmdAfter = '', ''
361                     try:
362                         cmdBefore = cmdList[index - 1].strip()
363                         cmdAfter = cmdList[index + 1].strip()
364                     except IndexError:
365                         pass
366                     deviceMark, stdout_temp = self.send_command(
367                         cmd, deviceMark, cmdBefore, cmdAfter, interval
368                     )
369                     stdout += stdout_temp
370                     if Pattern.neErrorFlag.search(stdout_temp):
371                         res += (cmd + '\n')
372             if res == 'Below commands may be wrong:\n':
373                 res = 'All commands are executed perfectly'
374             else:
375                 res = res.strip() + '$%^&'
376         return res, stdout
377 
378     def close(self):
379         self._client.close()
380 
381 
382 class Telnet_Client(object):
383     def __init__(self, address, username, password, port=23):
384         self._telnet = telnetlib.Telnet()
385         self._telnet.open(address=address, port=port)
386         self._telnet.read_until(b':', timeout=5)
387         self._telnet.write(username.encode('ascii') + b'\n')
388         self._telnet.read_until(b'assword:', timeout=5)
389         self._telnet.write(password.encode('ascii') + b'\n')
390         time.sleep(2)
391         self._telnet.read_very_eager().decode(encoding='UTF-8', errors='replace')
392 
393     def send_command(self, command, interval):
394         self._telnet.write(command.encode('ascii') + b'\n')
395         stdout = self._telnet.expect(
396             [
397                 Pattern.nebyteFlag, 
398                 Pattern.linuxbyteFlag, 
399                 Pattern.pwdChangebyteFlag, 
400                 Pattern.morebyteFlag, 
401                 Pattern.continuebyteFlag, 
402                 Pattern.loginbyteFlag, 
403                 Pattern.passordbyteFlag
404             ], 
405             timeout=interval
406         )[2].decode(encoding='UTF-8', errors='replace')
407         data = stdout.split('\n')
408         while (Pattern.moreFlag.search(data[-1]) or Pattern.continuebyteFlag.search(data[-1])):
409             self._telnet.write(b' ')
410             #tmp = self._telnet.read_very_eager().decode(encoding='UTF-8', errors='replace')
411             tmp = self._telnet.expect(
412                 [
413                     Pattern.nebyteFlag, 
414                     Pattern.linuxbyteFlag, 
415                     Pattern.pwdChangebyteFlag, 
416                     Pattern.morebyteFlag, 
417                     Pattern.continuebyteFlag, 
418                     Pattern.loginbyteFlag, 
419                     Pattern.passordbyteFlag
420                 ], 
421                 timeout=interval
422             )[2].decode(encoding='UTF-8', errors='replace')
423             #time.sleep(0.5)
424             data = tmp.split('\n')
425             stdout += tmp
426         return stdout
427 
428     def run(self, cmds, interval):
429         res, stdout = 'Below commands may be wrong:\n', ''
430         stdout += self.send_command(' ', interval)
431         print(stdout)
432         for cmd in cmds.split('\n'):
433             if cmd.strip():
434                 stdout_temp = self.send_command(cmd, interval)
435                 stdout += stdout_temp
436                 for line in stdout_temp.split('\n'):
437                     print(line)
438 
439                 if Pattern.neErrorFlag.search(stdout_temp):
440                     res += (cmd + '\n')
441 
442         if res == 'Below commands may be wrong:\n':
443             res = 'All commands are executed perfectly'
444         else:
445             res = res.strip() + '$%^&'
446         return res, stdout
447 
448     def close(self):
449         self._telnet.write(b'exit\n')
450 
451 
452 class Actuator(object):
453     def __init__(self, config):
454         self._actuator = None
455         self.DestinationIP = config['DestinationIP']
456 
457         if config['Jumper1_IP'] is None:
458             self._ip       = config['DestinationIP']
459             self._username = config['UserName']
460             self._password = config['Password']
461             self._method   = config['Method']
462             self._commands = config['Commands']
463             self._outcome  = [self._ip]
464         elif config['Jumper1_IP'] is not None:
465             self._ip       = config['Jumper1_IP']
466             self._username = config['Jumper1_UserName']
467             self._password = config['Jumper1_Password']
468             self._method   = config['Jumper1_Method']
469 
470             if config['Jumper2_IP'] is None:
471                 if config['Method'] == 'SSH':
472                     self._commands = 'ssh {}@{}\n'.format(
473                         config['UserName'], config['DestinationIP']
474                     )
475                     self._commands += '{}\n'.format(config['Password'])
476                     self._commands += config['Commands']
477                 elif config['Method'] == 'Telnet':
478                     self._commands = 'telnet {}\n'.format(config['DestinationIP'])
479                     self._commands += '{}\n'.format(config['UserName'])
480                     self._commands += '{}\n'.format(config['Password'])
481                     self._commands += config['Commands']
482 
483             elif config['Jumper2_IP'] is not None:
484                 if config['Jumper3_IP'] is None:
485                     if config['Jumper2_Method'] == 'SSH':
486                         self._commands = 'ssh {}@{}\n'.format(
487                             config['Jumper2_UserName'], config['Jumper2_IP']
488                         )
489                         self._commands += '{}\n'.format(config['Jumper2_Password'])
490                     elif config['Jumper2_Method'] == 'Telnet':
491                         self._commands = 'telnet {}\n'.format(config['Jumper2_IP'])
492                         self._commands += '{}\n'.format(config['Jumper2_UserName'])
493                         self._commands += '{}\n'.format(config['Jumper2_Password'])
494 
495                     if config['Method'] == 'SSH':
496                         self._commands += 'ssh {}@{}\n'.format(
497                             config['UserName'], config['DestinationIP']
498                         )
499                         self._commands += '{}\n'.format(config['Password'])
500                         self._commands += config['Commands']
501                     elif config['Method'] == 'Telnet':
502                         self._commands += 'telnet {}\n'.format(config['DestinationIP'])
503                         self._commands += '{}\n'.format(config['UserName'])
504                         self._commands += '{}\n'.format(config['Password'])
505                         self._commands += config['Commands']
506                 else:
507                     if config['Jumper2_Method'] == 'SSH':
508                         self._commands = 'ssh {}@{}\n'.format(
509                             config['Jumper2_UserName'], config['Jumper2_IP']
510                         )
511                         self._commands += '{}\n'.format(config['Jumper2_Password'])
512                     elif config['Jumper2_Method'] == 'Telnet':
513                         self._commands = 'telnet {}\n'.format(config['Jumper2_IP'])
514                         self._commands += '{}\n'.format(config['Jumper2_UserName'])
515                         self._commands += '{}\n'.format(config['Jumper2_Password'])
516 
517                     if config['Jumper3_Method'] == 'SSH':
518                         self._commands += 'ssh {}@{}\n'.format(
519                             config['Jumper3_UserName'], config['Jumper3_IP']
520                         )
521                         self._commands += '{}\n'.format(config['Jumper3_Password'])
522                     elif config['Jumper3_Method'] == 'Telnet':
523                         self._commands += 'telnet {}\n'.format(config['Jumper3_IP'])
524                         self._commands += '{}\n'.format(config['Jumper3_UserName'])
525                         self._commands += '{}\n'.format(config['Jumper3_Password'])
526 
527                     if config['Method'] == 'SSH':
528                         self._commands += 'ssh {}@{}\n'.format(
529                             config['UserName'], config['DestinationIP']
530                         )
531                         self._commands += '{}\n'.format(config['Password'])
532                         self._commands += config['Commands']
533                     elif config['Method'] == 'Telnet':
534                         self._commands += 'telnet {}\n'.format(config['DestinationIP'])
535                         self._commands += '{}\n'.format(config['UserName'])
536                         self._commands += '{}\n'.format(config['Password'])
537                         self._commands += config['Commands']
538             
539             self._outcome  = [config['DestinationIP']]
540             #print(self._commands)
541 
542     def __enter__(self):
543         MyPrint.Blue(
544             '-------------------------------\n' +
545             'Connecting to {}\n'.format(self.DestinationIP) + 
546             '-------------------------------'
547         )
548         try:
549             if self._method == 'SSH':
550                 self._actuator = SSH_Client(self._ip, self._username, self._password)
551             elif self._method == 'Telnet':
552                 self._actuator = Telnet_Client(self._ip, self._username, self._password)
553             MyPrint.Blue(
554                 '-------------------------------\n' +
555                 'Connection to {} succeed\n'.format(self.DestinationIP) + 
556                 '-------------------------------'
557             )
558         except:
559             self._actuator = None
560             MyPrint.Blue(
561                 '-------------------------------\n' +
562                 'Connection to {} failed\n'.format(self.DestinationIP) + 
563                 '-------------------------------'
564             )
565         return self
566 
567     def writeFile(self, stdout):
568         file_time = time.strftime('_%Y-%m-%d-%H-%M-%S', time.localtime())
569         file_name = os.path.join(pathOutcome, self.DestinationIP + file_time + '.txt')
570         with open(file_name, 'w', encoding='utf-8') as f:
571             #-------------------------------------------------
572             f.write(
573                 '#' * 90 + '\n' + '#' + ' ' * 88 + '#' + '\n' + '#' + ' ' * 11 + 
574                 '^_^    A CLI Tool Made By Kelvin, Thanks For Your Support~~    ^_^' + 
575                 ' ' * 11 + '#' + '\n' + '#' + ' ' * 88 + '#' + '\n' + '#' * 90 + '\n'
576             )
577             #-------------------------------------------------
578             for line in stdout.split('\r\n'):
579                 f.write(line)
580                 f.write('\n')
581         #return file_name
582 
583     def runCommands(self):
584         interval = 0.01 if self._method == 'SSH' else 5
585         if self._actuator:
586             try:
587                 res, stdout = self._actuator.run(self._commands, interval)
588             except ConnectError as e:
589                 self._outcome.extend(['cannot be connected...@#$%', 0])
590             except:
591                 print(traceback.format_exc())
592             else:
593                 self.writeFile(stdout)
594                 self._outcome.extend([res, len(stdout.split('\r\n'))])
595         else:   
596             self._outcome.extend(['cannot be connected...@#$%', 0])
597 
598     def connectOutcome(self):
599         return self._outcome
600 
601     def __exit__(self, exc_ty, exc_val, tb):
602         time.sleep(5) if self._method == 'SSH' else time.sleep(20)
603         if self._actuator is not None:
604             self._actuator.close()
605             self._actuator = None
606             MyPrint.Blue(
607                 '-------------------------------\n' +
608                 'Connection closed\n' + 
609                 '-------------------------------'
610             )

 

posted @ 2020-08-05 23:14  技术人员kelvin  阅读(359)  评论(0)    收藏  举报