标签:osi arch gen lock support ror led miss ted
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 )
标签:osi arch gen lock support ror led miss ted
原文地址:https://www.cnblogs.com/kHrystal/p/13443461.html