#!/usr/bin/python3 ''' LANforge 172.19.27.91 Controller at 172.19.27.95 2013 cisco/Cisco123 Controller is 192.1.0.10 AP is 172.19.27.95 2014 make sure pexpect is installed: $ sudo yum install python3-pexpect You might need to install pexpect-serial using pip: $ pip3 install pexpect-serial ./wifi_ctl_9800_3504.py -d 172.19.27.95 -o 2013 -l stdout -a AxelMain -u cisco -p Cisco123 -s telnet # For LANforge lab system. ./wifi_ctl_9800_3504.py --scheme ssh -d 192.168.100.112 --user admin --passwd Cisco123 --ap APA453.0E7B.CF9C --series 3504 --action cmd --value "show ap config general APA453.0E7B.CF9C" --prompt "(Cisco Controller)" ./wifi_ctl_9800_3504.py --scheme ssh -d 192.168.100.112 --user admin --passwd Cisco123 --ap APA453.0E7B.CF9C --series 3504 --action summary --prompt "(Cisco Controller)" telnet 172.19.36.168(Pwd:), go to the privileged mode and execute the command “clear line 43”. Cisco uses 9130 AP show controllers dot11Radio 1 wlan AP Command on AP to erase the config:"capwap ap erase all" TODO: Consolidate the login for Telnet and SSH for 9800 if possible. Note: trying to simplify the login process lead to lockups and made it more difficult to understand what stage of the login was locking up. The timing was determined emperically. ''' import sys if sys.version_info[0] != 3: print("This script requires Python 3") exit() import logging import time from time import sleep import argparse import pexpect default_host = "localhost" default_ports = { "serial": None, "ssh": 22, "telnet": 23 } NL = "\n" CR = "\r\n" Q = '"' A = "'" FORMAT = '%(asctime)s %(name)s %(levelname)s: %(message)s' band = "a" egg = None # think "eggpect" Need global scope for recovery def usage(): print("$0 used connect to controller:") print("-d|--dest: destination host") print("-o|--port: destination port") print("--prompt: prompt to expect, ie \"\\(Cisco Controller\\) >\"") print("--series: cisco controller series, ie \"9800\"") print("-u|--user: login name") print("-p|--pass: password") print("-s|--scheme (serial|telnet|ssh): connect via serial, ssh or telnet") print("-l|--log file: log messages here ") print("-b|--band: a (5Ghz) or b (2.4Ghz) or abgn for dual-band 2.4Ghz AP") print("-w|--wlan: WLAN name") print("-i|--wlanID: WLAN ID") print("-i|--wlanSSID: WLAN SSID") print("-h|--help") # see https://stackoverflow.com/a/13306095/11014343 class FileAdapter(object): def __init__(self, logger): self.logger = logger def write(self, data): # NOTE: data can be a partial line, multiple lines data = data.strip() # ignore leading/trailing whitespace if data: # non-blank self.logger.info(data) def flush(self): pass # leave it to logging to flush properly def main(): parser = argparse.ArgumentParser(description="Cisco AP Control Script") parser.add_argument("-d", "--dest", type=str, help="address of the cisco controller") parser.add_argument("-o", "--port", type=int, help="control port on the controller") parser.add_argument("--prompt", type=str, help="Prompt to expect", default="WLC") # (Cisco Controller)# parser.add_argument("--series", type=str, help="cisco controller series",default="9800") parser.add_argument("-u", "--user", type=str, help="credential login/username") parser.add_argument("-p", "--passwd", type=str, help="credential password") parser.add_argument("-s", "--scheme", type=str, choices=["serial", "ssh", "telnet"], help="Connect via serial, ssh or telnet") parser.add_argument("-t", "--tty", type=str, help="tty serial device") parser.add_argument("-l", "--log", type=str, help="logfile for messages, stdout means output to console",default="stdout") #parser.add_argument("-r", "--radio", type=str, help="select radio") parser.add_argument("-w", "--wlan", type=str, help="wlan name") parser.add_argument("-i", "--wlanID", type=str, help="wlan ID") parser.add_argument("--wlanSSID", type=str, help="wlan SSID") parser.add_argument("-a", "--ap", type=str, help="select AP", default="APA453.0E7B.CF9C") parser.add_argument("-b", "--band", type=str, help="Select band (a | b | abgn)", choices=["a", "b", "abgn"]) parser.add_argument("--action", type=str, help="perform action", choices=["config", "debug_disable_all","no_logging_console", "line_console_0", "country", "ap_country", "enable", "disable", "summary", "advanced", "cmd", "txPower", "bandwidth", "manual", "auto","no_wlan","show_wlan_summary", "ap_channel", "auto_rf","channel", "show", "create_wlan", "enable_wlan", "disable_wlan", "wlan_qos", "disable_network_5ghz","disable_network_24ghz","enable_network_5ghz","enable_network_24ghz", "wireless_tag_policy","no_wlan_wireless_tag_policy","delete_wlan"]) parser.add_argument("--value", type=str, help="set value") args = None try: args = parser.parse_args() host = args.dest scheme = args.scheme port = args.port #port = (default_ports[scheme], args.port)[args.port != None] user = args.user passwd = args.passwd logfile = args.log if (args.band != None): band = args.band if (band == "abgn"): band = "-abgn" else: band = "a" except Exception as e: logging.exception(e) exit(2) console_handler = logging.StreamHandler() formatter = logging.Formatter(FORMAT) logg = logging.getLogger(__name__) logg.setLevel(logging.DEBUG) file_handler = None if (logfile is not None): if (logfile != "stdout"): file_handler = logging.FileHandler(logfile, "w") file_handler.setLevel(logging.DEBUG) file_handler.setFormatter(formatter) logg.addHandler(file_handler) logging.basicConfig(format=FORMAT, handlers=[file_handler]) else: # stdout logging logging.basicConfig(format=FORMAT, handlers=[console_handler]) print("cisco series {}".format(args.series)) print("scheme {}".format(args.scheme)) CCPROMPT = args.prompt + " >" #'\(Voice-Talwar\) >' LOGOUTPROMPT = 'User:' EXITPROMPT = "Would you like to save them now? (y/N)" AREYOUSURE = "Are you sure you want to continue? (y/n)" CLOSEDBYREMOTE = "closed by remote host." CLOSEDCX = "Connection to .* closed." # 9800 series PROMPTS CCP = args.prompt + ">" # WLC> CCP_EN = args.prompt + "#" # WLC# CCP_CONFIG = args.prompt + "(config)#" #WLC(config)# CCP_CONFIG_WLAN = args.prompt + "(config-wlan)#" #WLC(config- wlan)# CCP_POLICY_TAG = args.prompt + "(config-policy-tag)#" #WLC(config-policy-tag)# CCP_CONFIG_LINE = args.prompt + "(config-line)#" #WLC(config-line)# '''print("CCP {}".format(CCP)) print("CCP_EN {}".format(CCP_EN)) print("CCP_CONFIG {}".format(CCP_CONFIG)) print("CCP_CONFIG_WLAN {}".format(CCP_CONFIG_WLAN)) print("CCP_POLICY_TAG {}".format(CCP_POLICY_TAG)) print("CCP_CONFIG_LINE {}".format(CCP_CONFIG_LINE))''' try: if (scheme == "serial"): #eggspect = pexpect.fdpexpect.fdspan(telcon, logfile=sys.stdout.buffer) import serial from pexpect_serial import SerialSpawn with serial.Serial('/dev/ttyUSB0', 115200, timeout=5) as ser: egg = SerialSpawn(ser); egg.logfile = FileAdapter(logg) print("logg {}".format(logg)) egg.sendline(NL) time.sleep(0.1) egg.expect('login:', timeout=3) time.sleep(0.1) egg.sendline(user) time.sleep(0.1) egg.expect('ssword:') elif (scheme == "ssh"): if (port is None): port = 22 cmd = "ssh -p%d %s@%s"%(port, user, host) logg.info("Spawn: "+cmd+NL) egg = pexpect.spawn(cmd) #egg.logfile_read = sys.stdout.buffer egg.logfile = FileAdapter(logg) print("logg {}".format(logg)) time.sleep(0.1) logged_in_9800 = False loop_count = 0 found_escape = False #9800 series if args.series == "9800": while logged_in_9800 == False and loop_count <= 4: loop_count += 1 #logg.info("9800 establishing Telnet egg {} ".format(egg)) #sleep(2) egg.sendline(CR) sleep(0.4) try: i = egg.expect_exact(["Escape character is '^]'.",CCP,CCP_EN,"User:","Password:",CCP_CONFIG,"Bad secrets",pexpect.TIMEOUT],timeout=2) except Exception as e: logg.info('connection failed. or refused Connection open by other process') logging.exception(e) exit(1) if i == 0: logg.info("9800 SSH found Escape character is '^] i:{} before: {} after: {}".format(i,egg.before,egg.after)) #egg.sendline(CR) found_escape = True sleep(0.1) j = egg.expect_exact([CCP,CCP_EN,"User:","Password:",CCP_CONFIG,pexpect.TIMEOUT],timeout=3) sleep(0.1) if j == 0: logg.info("9800 SSH found {} will elevate loging i:{} j:{} before {} after {}".format(CCP,i,j,egg.before,egg.after)) egg.sendline("en") sleep(0.1) k = egg.expect_exact(["Password:",pexpect.TIMEOUT], timeout=2) if k == 0: logg.info("9800 SSH received password prompt will send password: {} i:{} j:{} k:{} before {} after {}".format(args.passwd,i,j,k,egg.before,egg.after)) egg.sendline(args.passwd) sleep(0.1) l = egg.expect_exact([CCP_EN,pexpect.TIMEOUT],timeout=2) if l == 0: logg.info("9800 SSH Successfully received # prompt i:{} j:{} k:{} l:{}".format(i,j,k,l)) logged_in_9800 = True if l == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} l:{} before {} after {}".format(i,j,k,l,egg.before,egg.after)) if k == 1: logg.info("9800 SSH received timeout after looking for password: prompt i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) if j == 1: logg.info("9800 found # so logged in can start sending commands i:{} j:{}".format(i,j)) logged_in_9800 = True if j == 2: logg.info("9800 found User: will put in args.user {} i:{} j:{}".format(args.user,i,j)) egg.sendline(args.user) sleep(0.1) k = egg.expect_exact(["Password:",pexpect.TIMEOUT], timeout=2) if k == 0: logg.info("9800 received password prompt after sending User, sending password: {} i:{} j:{} k:{}".format(args.passwd,i,j,k)) egg.sendline(args.passwd) sleep(0.1) l = egg.expect_exact([CCP_EN,pexpect.TIMEOUT],timeout=2) if l == 0: logg.info("8900 SSH Successfully received # prompt i:{} j:{} k:{} l:{}".format(i,j,k,l)) logged_in_9800 = True if l == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} l:{} before {} after {}".format(i,j,k,l,egg.before,egg.after)) if k == 1: logg.info("9800 received timeout after looking for password after sending user i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) if j == 3: sleep(0.1) logg.info("9800 received Password prompt will send password {} i:{} j:{} before {} after {}".format(args.passwd,i,j,egg.before,egg.after)) egg.sendline(args.passwd) sleep(0.1) k = egg.expect([CCP_EN,pexpect.TIMEOUT],timeout=2) if k == 0: logg.info("8900 SSH Successfully received # prompt i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) logged_in_9800 = True if k == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) if j == 4: logg.info("9800 received {} prompt doing some cleanup".format(CCP_CONFIG)) egg.sendline("exit") sleep(0.1) k = egg.expect_exact([CCP,CCP_EN,"User:","Password:",pexpect.TIMEOUT],timeout=3) sleep(0.1) if k == 0: logg.info("9800 found CCP will elevate loging i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) egg.sendline("en") sleep(0.1) l = egg.expect_exact(["Password:",pexpect.TIMEOUT], timeout=2) if l == 0: logg.info("9800 received password prompt will send password: {} i:{} j:{} k:{} l:{} before {} after {}".format(args.passwd,i,j,k,l,egg.before,egg.after)) egg.sendline(args.passwd) sleep(0.1) m = egg.expect_exact([CCP_EN,pexpect.TIMEOUT],timeout=2) if m == 0: logg.info("9800 SSH Successfully received # prompt i:{} j:{} k:{} l:{} m:{}".format(i,j,k,l,m)) logged_in_9800 = True if m == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} l:{} m:{} before {} after {}".format(i,j,k,l,m,egg.before,egg.after)) if l == 1: logg.info("8900 received timeout after looking for password: prompt i:{} j:{} k:{} l:{} before {} after {}".format(i,j,k,l,egg.before,egg.after)) if k == 1: logg.info("9800 found # so logged in can start sending commands i:{} j:{} k:{}".format(i,j,k)) logged_in_9800 = True if k == 2: logg.info("9800 found User: will put in args.user {} i:{} j:{} k:{}".format(args.user,i,j,k)) egg.sendline(args.user) sleep(0.1) l = egg.expect_exact(["Password:",pexpect.TIMEOUT], timeout=2) if l == 0: logg.info("9800 received password prompt after sending User, sending password: {} i:{} j:{} k:{} l:{}".format(args.passwd,i,j,k,l)) egg.sendline(args.passwd) sleep(0.1) m = egg.expect([CCP_EN,pexpect.TIMEOUT],timeout=2) if m == 0: logg.info("9800 SSH Successfully received # prompt i:{} j:{} k:{} l:{} m:{}".format(i,j,k,l,m)) logged_in_9800 = True if m == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} l:{} m:{} before {} after {}".format(i,j,k,l,m,egg.before,egg.after)) if l == 1: logg.info("9800 received timeout after looking for password after sending user i:{} j:{} k:{} l:{} before {} after {}".format(i,j,k,l,egg.before,egg.after)) if k == 3: sleep(0.1) logg.info("9800 received Password prompt will send password {} i:{} j:{} k:{} before {} after {}".format(args.passwd,i,j,k,egg.before,egg.after)) egg.sendline(args.passwd) sleep(0.1) l = egg.expect([CCP_EN,pexpect.TIMEOUT],timeout=2) if l == 0: logg.info("8900 SSH Successfully received # prompt i:{} j:{} k:{} l:{} before {} after {}".format(i,j,k,l,egg.before,egg.after)) logged_in_9800 = True if l == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} l:{} before {} after {}".format(i,j,k,l,egg.before,egg.after)) if k == 4: logg.info("9800 timed out looking {}, {}, User:, Password: i:{} j:{} k:{} before {} after {}".format(CCP,CCP_EN,i,j,k,egg.before,egg.after)) logg.info("9800 Timed out waiting for initial prompt send logout loop_count: {} i: {} j: {} k:{} before {} after {}".format(loop_count, i, j, k, egg.before,egg.after)) logg.info("9800 Closing the connection and try to re-establish, ") egg.close(force = True) sleep(1) egg.close(force = True) sleep(1) # re establish ssh cmd = "ssh -p%d %s@%s"%(port, user, host) logg.info("Spawn: "+cmd+NL) egg = pexpect.spawn(cmd) egg.logfile = FileAdapter(logg) time.sleep(2) logged_in_9800 = False found_escape = False if j == 5: logg.info("9800 timed out looking for CCP :{},CCP_EN: {},CCP_CONFIG: {} loop_count {} i {} j {} before {} after {}".format(CCP,CCP_EN,CCP_CONFIG,loop_count,i,j,egg.before,egg.after)) logg.info("9800 Closing the connection and try to re-establish loop_count {} i {} j {}".format(loop_count,i,j)) egg.close(force = True) sleep(1) egg.close(force = True) sleep(1) # re establish ssh cmd = "ssh -p%d %s@%s"%(port, user, host) logg.info("Spawn: "+cmd+NL) egg = pexpect.spawn(cmd) egg.logfile = FileAdapter(logg) time.sleep(2) logged_in_9800 = False found_escape = False if i == 1: logg.info("9800 found {} will elevate loging i:{} before {} after {}".format(CCP,i,egg.before,egg.after)) egg.sendline("en") sleep(0.1) j = egg.expect_exact(["Password:",pexpect.TIMEOUT], timeout=2) if j == 0: logg.info("9800 received password prompt will send password: {} i:{} j:{} before {} after {}".format(args.passwd,i,j, egg.before,egg.after)) egg.sendline(args.passwd) sleep(0.1) k = egg.expect([CCP_EN,pexpect.TIMEOUT],timeout=2) if k == 0: logg.info("9800 SSH Successfully received # prompt i:{} j:{} k:{} before {} after {}".format(i,j,k, egg.before,egg.after)) logged_in_9800 = True if k == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) if j == 1: logg.info("8900 received timeout after looking for password: prompt i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) if i == 2: logg.info("9800 found {} This implies in incorrect logout or killed prior run test i:{} before {} after {}".format(CCP_EN,i,egg.before,egg.after)) logged_in_9800 = True if i == 3: logg.info("9800 found User will put in args.user {} i:{} j:{} before {} after {}".format(args.user,i,j,egg.before,egg.after)) egg.sendline(args.user) sleep(0.1) j = egg.expect_exact(["Password:",pexpect.TIMEOUT], timeout=2) if j == 0: logg.info("9800 received password prompt after sending User, sending password: {} i:{} j:{} before {} after {}".format(args.passwd,i,k,egg.before,egg.after)) egg.sendline(args.passwd) sleep(0.1) l = egg.expect([CCP_EN,pexpect.TIMEOUT],timeout=2) if k == 0: logg.info("9800 SSH Successfully received # prompt i:{} j:{} k:{}".format(i,j,k)) logged_in_9800 = True if k == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) if j == 1: logg.info("9800 received timeout after looking for password after sending user i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) if i == 4: logg.info("9800 received password prompt will send password: {} i:{} before {} after {}".format(args.passwd,i,egg.before,egg.after)) egg.sendline(args.passwd) sleep(0.1) j = egg.expect([CCP_EN,pexpect.TIMEOUT],timeout=2) if j == 0: logg.info("9800 SSH Successfully received # prompt i:{} j:{} before {} after {}".format(i,j,egg.before,egg.after)) logged_in_9800 = True if j == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} before {} after {}".format(i,j,egg.before,egg.after)) if i == 5: logg.info("9800 received {} prompt doing some cleanup".format(CCP_CONFIG)) egg.sendline("exit") sleep(0.1) j = egg.expect_exact([CCP,CCP_EN,"User:","Password:",pexpect.TIMEOUT],timeout=3) sleep(0.1) if j == 0: logg.info("9800 found {} will elevate loging i:{} j:{} before {} after {}".format(CCP,i,j,egg.before,egg.after)) egg.sendline("en") sleep(0.1) k = egg.expect_exact(["Password:",pexpect.TIMEOUT], timeout=2) if k == 0: logg.info("9800 received password prompt will send password: {} i:{} j:{} k:{} before {} after {}".format(args.passwd,i,j,k,egg.before,egg.after)) egg.sendline(args.passwd) sleep(0.1) l = egg.expect_exact([CCP_EN,pexpect.TIMEOUT],timeout=2) if l == 0: logg.info("9800 SSH Successfully received # prompt i:{} j:{} k:{} l:{}".format(i,j,k,l)) logged_in_9800 = True if l == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} l:{} before {} after {}".format(i,j,k,l,egg.before,egg.after)) if k == 1: logg.info("8900 received timeout after looking for password: prompt i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) if j == 1: logg.info("9800 found # so logged in can start sending commands i:{} j:{}".format(i,j)) logged_in_9800 = True if j == 2: logg.info("9800 found User: will put in args.user {} i:{} j:{}".format(args.user,i,j)) egg.sendline(args.user) sleep(0.1) k = egg.expect_exact(["Password:",pexpect.TIMEOUT], timeout=2) if k == 0: logg.info("9800 received password prompt after sending User, sending password: {} i:{} j:{} k:{}".format(args.passwd,i,j,k)) egg.sendline(args.passwd) sleep(0.1) l = egg.expect([CCP_EN,pexpect.TIMEOUT],timeout=2) if l == 0: logg.info("9800 SSH Successfully received # prompt i:{} j:{} k:{} l:{}".format(i,j,k,l)) logged_in_9800 = True if l == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} l:{} before {} after {}".format(i,j,k,l,egg.before,egg.after)) if k == 1: logg.info("9800 received timeout after looking for password after sending user i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) if j == 3: sleep(0.1) logg.info("9800 received Password prompt will send password {} i:{} j:{} before {} after {}".format(args.passwd,i,j,egg.before,egg.after)) egg.sendline(args.passwd) sleep(0.1) k = egg.expect([CCP_EN,pexpect.TIMEOUT],timeout=2) if k == 0: logg.info("8900 SSH Successfully received # prompt i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) logged_in_9800 = True if k == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) if j == 4: logg.info("9800 timed out looking {}, {}, User:, Password: i:{} j:{} before {} after {}".format(CCP, CCP_EN,i,j,egg.before,egg.after)) logg.info("9800 Timed out waiting for initial prompt send logout loop_count: {} i: {} j: {} before {} after {}".format(loop_count, i, j, egg.before,egg.after)) logg.info("9800 Closing the connection and try to re-establish, ") egg.close(force = True) sleep(1) egg.close(force = True) sleep(1) # re establish ssh cmd = "ssh -p%d %s@%s"%(port, user, host) logg.info("Spawn: "+cmd+NL) egg = pexpect.spawn(cmd) egg.logfile = FileAdapter(logg) time.sleep(2) logged_in_9800 = False found_escape = False if i == 6: logg.info("9800 recieved Bad secrets, to many password attempts i: {} before {} after {}".format(i, egg.before,egg.after)) egg.sendline(CR) sleep(0.2) if i == 7: logg.info("9800 Timed out waiting for initial prompt send logout loop_count: {} i: {} before {} after {}".format(loop_count, i, egg.before,egg.after)) logg.info("9800 Closing the connection and try to re-establish, ") egg.close(force = True) sleep(1) egg.close(force = True) sleep(1) # re establish ssh cmd = "ssh -p%d %s@%s"%(port, user, host) logg.info("Spawn: "+cmd+NL) egg = pexpect.spawn(cmd) egg.logfile = FileAdapter(logg) time.sleep(2) logged_in_9800 = False found_escape = False if loop_count >= 6: if found_escape == True: logg.info("9800 initial prompt and log messages interfering") logg.info("9800 will send escape to close telnet") egg.close(force = True) exit(1) else: logg.info("9800 the telnet session may need to be cleared will try to send logout") egg.sendline("logout") logg.info("9800 did not find the initial escape... exiting") egg.close(force = True) exit(1) # 3504 series else: i = egg.expect(["ssword:", "continue connecting (yes/no)?"], timeout=3) time.sleep(0.1) if i == 1: egg.sendline('yes') sleep(0.1) egg.expect('ssword:') sleep(0.1) egg.sendline(passwd) sleep(0.1) elif (scheme == "telnet"): sleep(1) if (port is None): port = 23 cmd = "telnet %s %d"%(host, port) logg.info("Spawn: "+cmd+NL) egg = pexpect.spawn(cmd) egg.logfile = FileAdapter(logg) time.sleep(2) logged_in_9800 = False loop_count = 0 found_escape = False CONFIG_I = "%SYS-5-CONFIG_I: Configured from console by console" PRESS_RETURN = "Press RETURN to get started." #9800 series if args.series == "9800": while logged_in_9800 == False and loop_count <= 7: loop_count += 1 logg.info("9800 loop_count {}".format(loop_count)) #logg.info("9800 establishing Telnet egg {} ".format(egg)) #sleep(2) egg.sendline(CR) sleep(0.4) try: i = egg.expect_exact(["Escape character is '^]'.",CCP,CCP_EN,"Username:","Password:",CCP_CONFIG,"Bad secrets", PRESS_RETURN, CONFIG_I,pexpect.TIMEOUT],timeout=2) except Exception as e: logg.info('AP connection failed. or refused Connection open by other process') logg.exception(e) exit(1) if i == 0: logg.info("9800 found Escape character is '^] i:{} before: {} after: {}".format(i,egg.before,egg.after)) egg.sendline(CR) found_escape = True sleep(0.2) j = egg.expect_exact([CCP,CCP_EN,"User:","Password:",CCP_CONFIG,pexpect.TIMEOUT],timeout=3) sleep(0.1) if j == 0: logg.info("9800 found {} will elevate loging i:{} j:{} before {} after {}".format(CCP,i,j,egg.before,egg.after)) egg.sendline("en") sleep(0.1) k = egg.expect_exact(["Password:",pexpect.TIMEOUT], timeout=2) if k == 0: logg.info("9800 received password prompt will send password: {} i:{} j:{} k:{} before {} after {}".format(args.passwd,i,j,k,egg.before,egg.after)) egg.sendline(args.passwd) sleep(0.1) l = egg.expect_exact([CCP_EN,pexpect.TIMEOUT],timeout=2) if l == 0: logg.info("9800 TELNET Successfully received {} prompt i:{} j:{} k:{} l:{}".format(CCP_EN,i,j,k,l)) logged_in_9800 = True if l == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} l:{} before {} after {}".format(i,j,k,l,egg.before,egg.after)) if k == 1: logg.info("8900 received timeout after looking for password: prompt i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) if j == 1: logg.info("9800 found # so logged in can start sending commands i:{} j:{}".format(i,j)) logged_in_9800 = True if j == 2: logg.info("9800 found User: will put in args.user {} i:{} j:{}".format(args.user,i,j)) egg.sendline(args.user) sleep(0.1) k = egg.expect_exact(["Password:",pexpect.TIMEOUT], timeout=2) if k == 0: logg.info("9800 received password prompt after sending User, sending password: {} i:{} j:{} k:{}".format(args.passwd,i,j,k)) egg.sendline(args.passwd) sleep(0.1) l = egg.expect_exact([CCP_EN,pexpect.TIMEOUT],timeout=2) if l == 0: logg.info("9800 TELNET Successfully received # prompt i:{} j:{} k:{} l:{}".format(i,j,k,l)) logged_in_9800 = True if l == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} l:{} before {} after {}".format(i,j,k,l,egg.before,egg.after)) if k == 1: logg.info("9800 received timeout after looking for password after sending user i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) if j == 3: sleep(0.1) logg.info("9800 received Password prompt will send password {} i:{} j:{} before {} after {}".format(args.passwd,i,j,egg.before,egg.after)) egg.sendline(args.passwd) sleep(0.1) k = egg.expect([CCP_EN,pexpect.TIMEOUT],timeout=2) if k == 0: logg.info("9800 TELNET Successfully received # prompt i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) logged_in_9800 = True if k == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) if j == 4: logg.info("9800 received {} prompt doing some cleanup i = {} j = {}".format(CCP_CONFIG, i, j )) egg.sendline("end") sleep(0.1) k = egg.expect_exact([CCP,CCP_EN,"User:","Password:",pexpect.TIMEOUT],timeout=3) sleep(0.1) if k == 0: logg.info("9800 found {} will elevate loging i:{} j:{} k:{} before {} after {}".format(CCP,i,j,k,egg.before,egg.after)) egg.sendline("en") sleep(0.1) l = egg.expect_exact(["Password:",pexpect.TIMEOUT], timeout=2) if l == 0: logg.info("9800 received password prompt will send password: {} i:{} j:{} k:{} l:{} before {} after {}".format(args.passwd,i,j,k,l,egg.before,egg.after)) egg.sendline(args.passwd) sleep(0.1) m = egg.expect_exact([CCP_EN,pexpect.TIMEOUT],timeout=2) if m == 0: logg.info("9800 TELNET Successfully received # prompt i:{} j:{} k:{} l:{} m:{}".format(i,j,k,l,m)) logged_in_9800 = True if m == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} l:{} m:{} before {} after {}".format(i,j,k,l,m,egg.before,egg.after)) if l == 1: logg.info("8900 received timeout after looking for password: prompt i:{} j:{} k:{} l:{} before {} after {}".format(i,j,k,l,egg.before,egg.after)) if k == 1: logg.info("9800 found # so logged in can start sending commands i:{} j:{} k:{}".format(i,j,k)) logged_in_9800 = True if k == 2: logg.info("9800 found User: will put in args.user {} i:{} j:{} k:{}".format(args.user,i,j,k)) egg.sendline(args.user) sleep(0.1) l = egg.expect_exact(["Password:",pexpect.TIMEOUT], timeout=2) if l == 0: logg.info("9800 received password prompt after sending User, sending password: {} i:{} j:{} k:{} l:{}".format(args.passwd,i,j,k,l)) egg.sendline(args.passwd) sleep(0.1) m = egg.expect([CCP_EN,pexpect.TIMEOUT],timeout=2) if m == 0: logg.info("9800 TELNET Successfully received # prompt i:{} j:{} k:{} l:{} m:{}".format(i,j,k,l,m)) logged_in_9800 = True if m == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} l:{} m:{} before {} after {}".format(i,j,k,l,m,egg.before,egg.after)) if l == 1: logg.info("9800 received timeout after looking for password after sending user i:{} j:{} k:{} l:{} before {} after {}".format(i,j,k,l,egg.before,egg.after)) if k == 3: sleep(0.1) logg.info("9800 received Password prompt will send password {} i:{} j:{} k:{} before {} after {}".format(args.passwd,i,j,k,egg.before,egg.after)) egg.sendline(args.passwd) sleep(0.1) l = egg.expect([CCP_EN,pexpect.TIMEOUT],timeout=2) if l == 0: logg.info("9800 TELNET Successfully received # prompt i:{} j:{} k:{} l:{} before {} after {}".format(i,j,k,l,egg.before,egg.after)) logged_in_9800 = True if l == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} l:{} before {} after {}".format(i,j,k,l,egg.before,egg.after)) if k == 4: logg.info("9800 timed out looking {}, {}, User:, Password: i:{} j:{} k:{} before {} after {}".format(CCP, CCP_EN, i,j,k,egg.before,egg.after)) logg.info("9800 Timed out waiting for initial prompt send logout loop_count: {} i: {} j: {} k:{} before {} after {}".format(loop_count, i, j, k, egg.before,egg.after)) logg.info("9800 Closing the connection and try to re-establish, ") egg.close(force = True) sleep(1) egg.close(force = True) sleep(1) # re establish telnet cmd = "telnet %s %d"%(host, port) logg.info("Spawn: "+cmd+NL) egg = pexpect.spawn(cmd) egg.logfile = FileAdapter(logg) time.sleep(2) logged_in_9800 = False found_escape = False if j == 5: logg.info("9800 timed out looking for {}, {},User:,Password: loop_count {} i {} j {} before {} after {}".format(CCP,CCP_EN,loop_count,i,j,egg.before,egg.after)) logg.info("9800 Closing the connection and try to re-establish loop_count {} i {} j {}".format(loop_count,i,j)) egg.close(force = True) sleep(1) egg.close(force = True) sleep(1) # re establish telnet cmd = "telnet %s %d"%(host, port) logg.info("Spawn: "+cmd+NL) egg = pexpect.spawn(cmd) egg.logfile = FileAdapter(logg) time.sleep(2) logged_in_9800 = False found_escape = False if i == 1: logg.info("9800 found {} will elevate loging i:{} before {} after {}".format(CCP,i,egg.before,egg.after)) egg.sendline("en") sleep(0.1) j = egg.expect_exact(["Password:",pexpect.TIMEOUT], timeout=2) if j == 0: logg.info("9800 received password prompt will send password: {} i:{} j:{} before {} after {}".format(args.passwd,i,j, egg.before,egg.after)) egg.sendline(args.passwd) sleep(0.1) k = egg.expect([CCP_EN,pexpect.TIMEOUT],timeout=2) if k == 0: logg.info("9800 TELNET Successfully received # prompt i:{} j:{} k:{} before {} after {}".format(i,j,k, egg.before,egg.after)) logged_in_9800 = True if k == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) if j == 1: logg.info("8900 received timeout after looking for password: prompt i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) if i == 2: logg.info("9800 found {} This implies in incorrect logout or killed prior run test i:{} before {} after {}".format(CCP_EN,i,egg.before,egg.after)) logged_in_9800 = True if i == 3: logg.info("9800 found User will put in args.user {} i:{} j:{} before {} after {}".format(args.user,i,j,egg.before,egg.after)) egg.sendline(args.user) sleep(0.1) j = egg.expect_exact(["Password:",pexpect.TIMEOUT], timeout=2) if j == 0: logg.info("9800 received password prompt after sending User, sending password: {} i:{} j:{} before {} after {}".format(args.passwd,i,j,egg.before,egg.after)) egg.sendline(args.passwd) sleep(0.1) l = egg.expect([CCP_EN,pexpect.TIMEOUT],timeout=2) if k == 0: logg.info("9800 TELNET Successfully received # prompt i:{} j:{} k:{}".format(i,j,k)) logged_in_9800 = True if k == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) if j == 1: logg.info("9800 received timeout after looking for password after sending user i:{} j:{} before {} after {}".format(i,j,egg.before,egg.after)) if i == 4: logg.info("9800 received password prompt will send password: {} i:{} before {} after {}".format(args.passwd,i, egg.before,egg.after)) egg.sendline(args.passwd) sleep(0.1) j = egg.expect([CCP_EN,pexpect.TIMEOUT],timeout=2) if j == 0: logg.info("9800 TELNET Successfully received # prompt i:{} j:{} before {} after {}".format(i,j,egg.before,egg.after)) logged_in_9800 = True if j == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} before {} after {}".format(i,j,egg.before,egg.after)) if i == 5: logg.info("9800 received {} prompt doing some cleanup".format(CCP_CONFIG)) egg.sendline("end") sleep(0.3) j = egg.expect_exact([CCP,CCP_EN,"User:","Password:",pexpect.TIMEOUT],timeout=3) sleep(0.1) if j == 0: logg.info("9800 found {} will elevate loging i:{} j:{} before {} after {}".format(CCP, i,j,egg.before,egg.after)) egg.sendline("en") sleep(0.1) k = egg.expect_exact(["Password:",pexpect.TIMEOUT], timeout=2) if k == 0: logg.info("9800 received password prompt will send password: {} i:{} j:{} k:{} before {} after {}".format(args.passwd,i,j,k,egg.before,egg.after)) egg.sendline(args.passwd) sleep(0.1) l = egg.expect_exact([CCP_EN,pexpect.TIMEOUT],timeout=2) if l == 0: logg.info("9800 TELNET Successfully received # prompt i:{} j:{} k:{} l:{}".format(i,j,k,l)) logged_in_9800 = True if l == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} l:{} before {} after {}".format(i,j,k,l,egg.before,egg.after)) if k == 1: logg.info("8900 received timeout after looking for password: prompt i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) if j == 1: logg.info("9800 found # so logged in can start sending commands i:{} j:{}".format(i,j)) logged_in_9800 = True if j == 2: logg.info("9800 found User: will put in args.user {} i:{} j:{}".format(args.user,i,j)) egg.sendline(args.user) sleep(0.1) k = egg.expect_exact(["Password:",pexpect.TIMEOUT], timeout=2) if k == 0: logg.info("9800 received password prompt after sending User, sending password: {} i:{} j:{} k:{}".format(args.passwd,i,j,k)) egg.sendline(args.passwd) sleep(0.1) l = egg.expect([CCP_EN,pexpect.TIMEOUT],timeout=2) if l == 0: logg.info("9800 TELNET Successfully received # prompt i:{} j:{} k:{} l:{}".format(i,j,k,l)) logged_in_9800 = True if l == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} l:{} before {} after {}".format(i,j,k,l,egg.before,egg.after)) if k == 1: logg.info("9800 received timeout after looking for password after sending user i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) if j == 3: sleep(0.1) logg.info("9800 received Password prompt will send password {} i:{} j:{} before {} after {}".format(args.passwd,i,j,egg.before,egg.after)) egg.sendline(args.passwd) sleep(0.1) k = egg.expect([CCP_EN,pexpect.TIMEOUT],timeout=2) if k == 0: logg.info("9800 TELNET Successfully received # prompt i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) logged_in_9800 = True if k == 1: logg.info("9800 Timed out waiting for # prompt i:{} j:{} k:{} before {} after {}".format(i,j,k,egg.before,egg.after)) if j == 4: logg.info("9800 timed out looking {}, {}, User:, Password: i:{} j:{} before {} after {}".format(CCP,CCP_EN,i,j,egg.before,egg.after)) logg.info("9800 Timed out waiting for initial prompt send logout loop_count: {} i: {} j: {} before {} after {}".format(loop_count, i, j, egg.before,egg.after)) logg.info("9800 Closing the connection and try to re-establish, ") egg.close(force = True) sleep(1) egg.close(force = True) sleep(1) # re establish telnet cmd = "telnet %s %d"%(host, port) logg.info("Spawn: "+cmd+NL) egg = pexpect.spawn(cmd) egg.logfile = FileAdapter(logg) time.sleep(2) logged_in_9800 = False found_escape = False if i == 6: logg.info("9800 recieved Bad secrets, to many password attempts i: {} before {} after {}".format(i, egg.before,egg.after)) egg.sendline(CR) sleep(0.2) if i == 7: logg.info("9800 received: {} i: {} before {} after {} send cr".format(PRESS_RETURN,i, egg.before, egg.after)) egg.sentline(CR) sleep(0.2) if i == 8: logg.info("9800 received: {} i: {} before {} after {} send cr".format(CONFIG_I,i, egg.before, egg.after)) egg.sentline(CR) sleep(0.2) if i == 9: logg.info("9800 Timed out waiting for initial prompt, Log message from controller interfering with expected prompts loop_count: {} i: {} before {} after {}".format(loop_count, i, egg.before,egg.after)) logg.info("9800 Closing the connection and try to re-establish, ") egg.close(force = True) sleep(1) egg.close(force = True) sleep(1) # re establish telnet cmd = "telnet %s %d"%(host, port) logg.info("Spawn: "+cmd+NL) egg = pexpect.spawn(cmd) egg.logfile = FileAdapter(logg) time.sleep(2) logged_in_9800 = False found_escape = False if loop_count >= 8: if found_escape == True: logg.info("9800 outside major loop loop_count {}".format(loop_count)) logg.info("9800 will look one more time for {}".format(CCP_EN)) egg.sentline(CR) sleep(0.2) r = egg.expect_exact([CCP_EN,pexpect.TIMEOUT],timeout=3) if r == 0: logg.info("Found {} r {} before {} after {} can move forward".format(CCP_EN,r,egg.before,egg.after)) if r == 1: egg.sendline("\x1b\r") egg.sendline("logout") logg.info("9800 the excape was found yet could not loging... close egg session") egg.close(force = True) exit(1) else: logg.info("9800 the telnet session may need to be cleared will try to send logout") egg.sendline("logout") logg.info("9800 did not find the initial escape... exiting") egg.close(force = True) exit(1) # 3504 series else: egg.sendline(' ') egg.expect('User\:',timeout=3) egg.sendline(user) egg.expect('Password\:',timeout=3) egg.sendline(passwd) #if args.prompt in CCP_EN or args.prompt in CCP: # egg.sendline("enable") # time.sleep(0.1) egg.sendline('config paging disable') #egg.expect('(Voice-Talwar) >', timeout=3) #time.sleep(0.1) #egg.sendline(user) #time.sleep(0.1) #egg.expect('ssword:') #time.sleep(0.1) #egg.sendline(passwd) else: usage() exit(1) except Exception as e: logging.exception(e) command = None time.sleep(0.1) sleep(0.1) if args.series == "9800": pass else: #TODO clean up logg.info("waiting for prompt: {}".format(CCPROMPT)) egg.expect(">", timeout=3) logg.info("Command to Process :: Ap[%s] Action[%s] Value[%s] "%(args.ap, args.action, args.value)) print("Ap[%s] Action[%s] Value[%s]"%(args.ap, args.action, args.value)) if ((args.action == "show") and (args.value is None)): raise Exception("show requires value, like 'country' or 'ap summary'") if (args.action == "show"): command = "show "+args.value if (args.action == "cmd"): if (args.value is None): raise Exception("cmd requires value to be set.") command = "%s"%(args.value) if (args.action == "summary"): if args.series == "9800": if band == "a": command = "show ap summary" else: command = "show ap summary" else: command = "show ap summary" if (args.action == "advanced"): if args.series == "9800": if band == "a": command = "show ap dot11 5ghz summary" else: command = "show ap dot11 24ghz summary" else: command = "show advanced 802.11%s summary"%(band) if ((args.action == "auto_rf") and ((args.ap is None))): raise Exception("auto_rf requires AP name") if (args.action == "auto_rf"): command = "show ap auto-rf 802.11a %s"%(args.ap) egg.sendline(command) command_done = False loop_count = 0 while command_done == False and loop_count <= 10 : i = egg.expect_exact(["--More--",CCP,pexpect.TIMEOUT],timeout=2) if i == 0: print(egg.before.decode('utf-8', 'ignore')) egg.sendline(NL) if i == 1: print(egg.before.decode('utf-8', 'ignore')) command_done = True if i == 2: print(egg.before.decode('utf-8', 'ignore')) command_done = True command = None # so additional command will not be sent if ((args.action == "ap_country") and ((args.value is None) or (args.ap is None))): raise Exception("ap_country requires country and AP name") if (args.action == "ap_country"): command = "config ap country %s %s"%(args.value, args.ap) if ((args.action == "country") and ((args.value is None))): raise Exception("country requires country value") if (args.action == "country"): command = "config country %s"%(args.value) if (args.action == "manual" and args.ap is None): raise Exception("action requires AP name") if (args.action == "manual"): if args.series == "9800": if band == "a": command = "ap name %s dot11 5ghz radio role manual client-serving"%(args.ap) else: command = "ap name %s dot11 24ghz radio role manual client-serving"%(args.ap) if (args.action == "auto" and args.ap is None): raise Exception("action requires AP name") if (args.action == "auto"): if args.series == "9800": if band == "a": command = "ap name %s dot11 5ghz radio role auto"%(args.ap) else: command = "ap name %s dot11 24ghz radio role auto"%(args.ap) if (args.action == "disable_network_5ghz"): if args.series == "9800": egg.sendline("config t") sleep(0.1) i = egg.expect_exact(["(config)#",pexpect.TIMEOUT],timeout=2) if i == 0: egg.sendline("ap dot11 5ghz shutdown") sleep(0.1) i = egg.expect_exact(["Are you sure you want to continue? (y/n)[y]:",pexpect.TIMEOUT],timeout=2) if j == 0: logg.info("did get Are you sure you want to continue? (y/n)[y]:") egg.sendline("y") sleep(0.5) if j == 1: logg.info("did not get Are you sure you want to continue? (y/n)[y]:") egg.sendline("y") sleep(0.5) if i == 1: logg.info("timed out on (config)# disable_network_5ghz") if (args.action == "disable_network_24ghz"): if args.series == "9800": egg.sendline("config t") sleep(0.1) i = egg.expect_exact(["(config)#",pexpect.TIMEOUT],timeout=2) if i == 0: egg.sendline("ap dot11 24ghz shutdown") sleep(0.5) i = egg.expect_exact(["Are you sure you want to continue? (y/n)[y]:",pexpect.TIMEOUT],timeout=2) if j == 0: logg.info("did get Are you sure you want to continue? (y/n)[y]:") egg.sendline("y") sleep(0.5) if j == 1: logg.info("did not get Are you sure you want to continue? (y/n)[y]:") egg.sendline("y") sleep(0.5) if i == 1: logg.info("timed out on (config)# disable_network_24ghz") if (args.action == "enable_network_5ghz"): if args.series == "9800": egg.sendline("config t") sleep(0.1) i = egg.expect_exact(["(config)#",pexpect.TIMEOUT],timeout=2) if i == 0: egg.sendline("no ap dot11 5ghz shutdown") sleep(0.1) if i == 1: logg.info("timed out on (config) prompt") if (args.action == "enable_network_24ghz"): if args.series == "9800": egg.sendline("config t") sleep(0.1) i = egg.expect_exact(["(config)#",pexpect.TIMEOUT],timeout=2) if i == 0: egg.sendline("no ap dot11 24ghz shutdown") sleep(0.1) if i == 1: logg.info("timed out on (config) prompt") if (args.action == "enable" and (args.ap is None)): raise Exception("action requires AP name") if (args.action == "enable"): if args.series == "9800": if band == "a": command = "ap name %s no dot11 5ghz shutdown"%(args.ap) else: command = "ap name %s no dot11 24ghz shutdown"%(args.ap) else: command = "config 802.11%s enable %s"%(band, args.ap) if (args.action == "disable" and (args.ap is None)): raise Exception("action requires AP name") if (args.action == "disable"): if args.series == "9800": if band == "a": command = "ap name %s dot11 5ghz shutdown"%(args.ap) else: command = "ap name %s dot11 24ghz shutdown"%(args.ap) else: command = "config 802.11%s disable %s"%(band, args.ap) if (args.action == "txPower" and ((args.ap is None) or (args.value is None))): raise Exception("txPower requires ap and value") if (args.action == "txPower"): if args.series == "9800": if band == "a": command = "ap name %s dot11 5ghz txpower %s"%(args.ap, args.value) else: command = "ap name %s dot11 24ghz txpower %s"%(args.ap, args.value) else: command = "config 802.11%s txPower ap %s %s"%(band, args.ap, args.value) if (args.action == "bandwidth" and ((args.ap is None) or (args.value is None))): raise Exception("bandwidth requires ap and value (20, 40, 80, 160)") if (args.action == "bandwidth"): if args.series == "9800": if band == "a": command = "ap name %s dot11 5ghz channel width %s"%(args.ap, args.value) else: command = "ap name %s dot11 24ghz channel width %s"%(args.ap, args.value) else: command = "config 802.11%s chan_width %s %s"%(band, args.ap, args.value) if (args.action == "channel" and ((args.ap is None) or (args.value is None))): raise Exception("channel requires ap and value 5Ghz ") if (args.action == "channel"): if args.series == "9800": if band == "a": command = "ap name %s dot11 5ghz channel %s"%(args.ap, args.value) else: command = "ap name %s dot11 24ghz channel %s"%(args.ap, args.value) else: command = "config 802.11%s channel ap %s %s"%(band, args.ap, args.value) if (args.action == "ap_channel" and (args.ap is None)): raise Exception("ap_channel requires ap") if (args.action == "ap_channel"): if args.series == "9800": if band == "a": command = "show ap dot11 5ghz summary" else: command = "show ap dot11 24ghz summary" else: command = "show ap channel %s"%(args.ap) if (args.action == "no_wlan_wireless_tag_policy" and (args.wlan is None)): raise Exception("wlan is required") if (args.action == "no_wlan_wireless_tag_policy"): logg.info("send wireless tag policy no wlan") logg.info("send wireless tag policy no wlan , for wlan {}".format(args.wlan)) egg.sendline("config t") sleep(0.1) i = egg.expect_exact(["(config)#",pexpect.TIMEOUT],timeout=2) if i == 0: for command in ["wireless tag policy default-policy-tag","no wlan {} policy default-policy-profile".format(args.wlan)]: egg.sendline(command) sleep(1) j = egg.expect_exact([CCP_POLICY_TAG,pexpect.TIMEOUT],timeout=2) if j == 0: logg.info("command sent: {}".format(command)) if j == 1: logg.info("timed out on command prompt (config-policy-tag)# for command {}".format(command)) if i == 1: logg.info("did not get the (config)# prompt") if (args.action == "wireless_tag_policy"): logg.info("send wireless tag policy") egg.sendline("config t") sleep(0.1) i = egg.expect_exact(["(config)#",pexpect.TIMEOUT],timeout=2) if i == 0: for command in ["wireless tag policy default-policy-tag","wlan open-wlan policy default-policy-profile"]: egg.sendline(command) sleep(1) j = egg.expect_exact([CCP_POLICY_TAG,pexpect.TIMEOUT],timeout=2) if j == 0: logg.info("command sent: {}".format(command)) if j == 1: logg.info("timed out on command prompt (config-policy-tag)# for command {}".format(command)) if i == 1: logg.info("did not get the (config)# prompt") if (args.action == "debug_disable_all"): if args.series == "9800": logg.info("action {} not avilable on 9800".format(args.action)) else: command = "debug disable-all" if (args.action == "no_logging_console"): if args.series == "9800": logg.info("send no logging console") egg.sendline("config t") sleep(0.2) i = egg.expect_exact(["(config)#",pexpect.TIMEOUT],timeout=2) if i == 0: egg.sendline("no logging console") sleep(0.2) if i == 1: logg.info("did not get the (config)# prompt") else: command = "config logging debug console disable" if (args.action == "line_console_0"): logg.info("send: line console 0") egg.sendline("config t") sleep(0.2) i = egg.expect_exact(["(config)#",pexpect.TIMEOUT],timeout=2) if i == 0: egg.sendline("line console 0") sleep(0.1) if i == 1: logg.info("did not get the (config)# prompt") if (args.action == "no_wlan" and (args.wlan is None)): raise Exception("wlan is required") if (args.action == "no_wlan"): egg.sendline("config t") sleep(0.1) i = egg.expect_exact(["(config)#",pexpect.TIMEOUT],timeout=2) if i == 0: command = "no wlan %s"%(args.wlan) egg.sendline(command) sleep(0.1) if i == 1: logg.info("did not get the (config)# prompt") if (args.action == "show_wlan_summary"): print("command show wlan summary ") command = "show wlan summary" if (args.action == "create_wlan" and ((args.wlanID is None) or (args.wlan is None) or (args.wlanSSID is None))): raise Exception("wlanID, wlan, wlanSSID are required an") if (args.action == "create_wlan"): logg.info("create_wlan wlan {} wlanID {} wlanSSID {}".format(args.wlan, args.wlanID, args.wlanSSID)) if args.series == "9800": egg.sendline("config t") sleep(0.4) i = egg.expect_exact(["(config)#",pexpect.TIMEOUT],timeout=2) if i == 0: logg.info("elevated to (config)#") # for create wlan command = "wlan {} {} {}".format(args.wlan, args.wlanID, args.wlanSSID) logg.info("open network command {}".format(command)) egg.sendline(command) sleep(0.4) j = egg.expect_exact([CCP_CONFIG_WLAN,pexpect.TIMEOUT],timeout=2) if j == 0: # previous commands for command in ["shutdown","no security ft","no security wpa","no security wpa wpa2","no security wpa wpa2 ciphers aes", # "no security wpa akm dot1x","no shutdown"]: # 1/14/2021 - Cisco suggestion # We are basically disabling all the possible security parameters for Authentication for command in [ "no security ft", "no security ft adaptive", "no security wpa", "no security wpa wpa2", "no security wpa wpa1", "no security wpa wpa2 ciphers aes" "no security dot1x authentication-list", "no security wpa akm dot1x", "no shutdown"]: egg.sendline(command) sleep(1) k = egg.expect_exact([CCP_CONFIG_WLAN,pexpect.TIMEOUT],timeout=2) if k == 0: logg.info("command sent: {}".format(command)) if k == 1: logg.info("command time out: {}".format(command)) if j == 1: logg.info("did not get the (config-wlan)# prompt") if i == 0: logg.info("did not get the (config)# prompt") else: command = "config wlan create {} {} {}".format(args.wlanID, args.wlan, args.wlanSSID) if (args.action == "delete_wlan"): if args.series == "9800": if (args.wlan is None): raise Exception("9800 series wlan is required") else: egg.sendline("config t") sleep(0.4) i = egg.expect_exact(["(config)#",pexpect.TIMEOUT],timeout=2) if i == 0: logg.info("elevated to (config)#") cmd = "no wlan %s"%(args.wlan) egg.sendline(cmd) sleep(0.4) if i == 1: logg.info("did not get the (config)# prompt") else: if (args.action == "delete_wlan" and (args.wlanID is None)): raise Exception("wlan ID is required") command = "config wlan delete {}".format(args.wlanID) logg.info("action {} series {}".format(args.action,args.series)) if (args.action == "enable_wlan"): if args.series == "9800": if (args.wlan is None): raise Exception("9800 series wlan is required") else: logg.info("sendline config t") egg.sendline("config t") sleep(0.3) i = egg.expect_exact(["(config)#",pexpect.TIMEOUT],timeout=2) if i == 0: logg.info("elevated to (config)#") cmd = "wlan %s"%(args.wlan) egg.sendline(cmd) sleep(0.1) j = egg.expect_exact(["(config-wlan)#",pexpect.TIMEOUT],timeout=2) if j == 0: logg.info("enable_wlan send no shutdown") cmd = "no shutdown" egg.sendline(cmd) sleep(0.1) if j == 1: logg.info("did not get the (config-wlan)# prompt") if i == 1: logg.info("did not get the (config)# prompt") else: if (args.wlan is None): raise Exception("wlan ID is required") logg.info("send: config wlan enable {}".format(args.wlan)) command = "config wlan enable %s"%(args.wlan) if (args.action == "disable_wlan"): if args.series == "9800": if (args.wlan is None): raise Exception("9800 series wlan is required") else: logg.info("sendline config t") egg.sendline("config t") sleep(0.3) i = egg.expect_exact(["(config)#",pexpect.TIMEOUT],timeout=2) if i == 0: logg.info("elevated to (config)#") cmd = "wlan %s"%(args.wlan) egg.sendline(cmd) sleep(0.1) j = egg.expect_exact(["(config-wlan)#",pexpect.TIMEOUT],timeout=2) if j == 0: logg.info("disable_wlan send shutdown") cmd = "shutdown" egg.sendline(cmd) sleep(0.1) if j == 1: logg.info("did not get the (config-wlan)# prompt") if i == 1: logg.info("did not get the (config)# prompt") else: if (args.wlan is None): raise Exception("wlan ID is required") logg.info("send: config wlan disable {}".format(args.wlan)) command = "config wlan disable %s"%(args.wlan) if (args.action == "wlan_qos" and (args.wlan is None)): raise Exception("wlan ID is required") if (args.action == "wlan_qos"): command = "config wlan qos %s %s"%(args.wlanID, args.value) # separate the 3504 and 9800 logouts as the are conflicting if (args.series == "9800"): if (command is None ): sleep(0.5) logg.info("9800 Command processed earlier will logout") else: logg.info("Command[%s]"%command) egg.sendline(command) sleep(0.5) logg.info("command sent {}".format(command)) logged_out_9800 = False loop_count = 0 while logged_out_9800 == False and loop_count <= 6: loop_count += 1 i = egg.expect_exact([CCP,CCP_EN, CCP_CONFIG,CCP_CONFIG_WLAN,CCP_POLICY_TAG,CCP_CONFIG_LINE,pexpect.TIMEOUT],timeout=5) print (egg.before.decode('utf-8', 'ignore')) # allows program that calls from subprocess to see output from command if i == 0: logg.info("{} prompt received can send logout, loop_count: {}".format(CCP,loop_count)) egg.sendline("logout") sleep(0.1) logged_out_9800 = True break if i == 1: logg.info("{} prompt received will send logout, loop_count: {}".format(CCP_EN,loop_count)) try: egg.sendline("logout") sleep(0.1) logged_out_9800 = True except: logg.info("9800 exception on logout") sleep(0.1) break if i == 2: logg.info("{} prompt received will send exit, loop_count: {}".format(CCP_CONFIG, loop_count)) try: egg.sendline("exit") sleep(0.2) logged_out_9800 = True except: logg.info("9800 exception on end") sleep(0.1) if i == 3: logg.info("{} prompt received will send end, loop_count: {}".format(CCP_CONFIG_WLAN, loop_count)) try: egg.sendline("end") sleep(0.2) except: logg.info("9800 exception on end") sleep(0.1) if i == 4: logg.info("(config-policy-tag)# prompt received will send end, loop_count: {}".format(loop_count)) try: egg.sendline("end") sleep(0.2) except: logg.info("9800 exception on end") sleep(0.1) if i == 5: logg.info("{} prompt received will send end, loop_count: {}".format(CCP_CONFIG_LINE,loop_count)) try: egg.sendline("end") sleep(0.2) except: logg.info("9800 exception on end") sleep(0.1) if i == 6: logg.info("9800 expect timeout loop_count: {}".format(loop_count)) egg.sendline("end") if( logged_out_9800 == False): logg.info("######################################################################################") logg.info("9800 did not send logout at end of command processing this could tie up the connection") logg.info("######################################################################################") if( scheme == "telnet"): egg.sendline("\x1b\r") logg.info("send escape to exit connection") sleep(0.2) logg.info("send close to the egg child process") egg.close(force = True) sleep(0.1) # 3504 else: if (command is None ): sleep(0.5) logg.info("No command specified, going to log out.") else: logg.info("Command[%s]"%command) egg.sendline(command) sleep(0.5) logg.info("command sent {}".format(command)) egg.expect([pexpect.TIMEOUT], timeout=1) print(egg.before.decode('utf-8', 'ignore')) command_sent = False loop_count = 0 while command_sent == False and loop_count <= 3: loop_count += 1 try: i = egg.expect_exact([CCPROMPT,AREYOUSURE,'--More-- or','config paging disable',pexpect.TIMEOUT],timeout=2) logg.info("before {} after {}".format(egg.before.decode('utf-8', 'ignore'),egg.after.decode('utf-8', 'ignore'))) print(egg.before.decode('utf-8', 'ignore')) if i == 0: logg.info("{} prompt received after command sent".format(CCPROMPT)) # granted the break will exit the loop command_sent = True if i == 2: egg.sendline("y") command_sent = True if i == 3: egg.sendline(NL) logg.info("received --More-- or") if i == 4: egg.sendline(NL) logg.info("received: config paging disable ") if i == 5: egg.sendline(NL) logg.info(" Check to see if logging to console is disabled") command_sent = True except: logg.info("closing connection logout loop {}".format(CCPROMPT)) try: egg.sendline("logout") logg.info("logout") logg.info("send close to the egg child process") egg.close(force = True) sleep(0.1) except: logg.info("closing connection on logout") # ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- if __name__ == '__main__': main() #### #### ####