import pexpect import requests import json import ssl ssl._create_default_https_context = ssl._create_unverified_context import urllib import os import base64 #### setting common device_name = "" cli_address = "" login_name = "" login_pass = "" enable_pass = "" prompt = "" server_address = "" user_name = "" user_password = "" config_path = "" def device_login(p): #### telnet login p.expect("login:") p.sendline(login_name) p.expect("password:") p.sendline(login_pass) p.expect(prompt) p.sendline("enable") p.expect("password:") p.sendline(enable_pass) p.expect(prompt) #### no logging on p.sendline("no logging on") p.expect(prompt) #### no more p.sendline("no more") p.expect(prompt) def get_env(param): p = pexpect.spawn("env LANG=C telnet " + cli_address) #### telnet login device_login(p) #### show environment p.sendline("show environment") p.expect(prompt) text = p.before.decode(encoding='utf-8') #### split parameter lis = text.split('\r\n')[5].split() #### serial param[0] = lis[1] #### present version param[1] = lis[3] #### show version p.sendline("show version") p.expect(prompt) text = p.before.decode(encoding='utf-8') #### split parameter lis = text.split('\r\n')[5].split() #### other version param[2] = lis[2] #### telnet close p.close() def check_config(ztp_check): p = pexpect.spawn("env LANG=C telnet " + cli_address) #### telnet login device_login(p) #### diff running.cfg boot.cfg if ztp_check == 1: p.sendline("diff running.cfg /drive/pre_config/pre-config.cfg unified") else: p.sendline("diff running.cfg working.cfg unified") p.expect(prompt) text = p.before.decode(encoding='utf-8') #### telnet close p.close() # print(text) text2 = text.replace("\r\n\r\r\n","") # print(text2) #### split parameter lis = text2.split('\r\n')[9:] is_config_update = 0 # print(lis) for str in lis: # print(str[0]) if str[0] == '+': is_config_update=1 elif str[0] == '-': is_config_update=1 return(is_config_update) def get_config(serial): url = "https://" + server_address + "/" + config_path + "/" + device_name + "/" + serial + ".cfg" print("config url : ", url) basic_user_and_pasword = base64.b64encode('{}:{}'.format(user_name, user_password).encode('utf-8')) request = urllib.request.Request(url, headers={"Authorization": "Basic " + basic_user_and_pasword.decode('utf-8')}) with urllib.request.urlopen(request) as u: with open('/mnt/boot.cfg', 'bw') as o: o.write(u.read()) p = pexpect.spawn("env LANG=C telnet " + cli_address) #### telnet login device_login(p) #### load config p.sendline("load /drive/container/boot.cfg moff") p.expect(prompt) #### telnet close p.close() def apply_config(): p = pexpect.spawn("env LANG=C telnet " + cli_address) #### telnet login device_login(p) #### save boot config p.sendline("boot configuration /drive/boot.cfg") p.expect(prompt) p.sendline("save /drive/boot.cfg moff") p.expect(prompt) #### telnet close p.close() #### delete os.remove("/mnt/boot.cfg") def boot_side_set(): p = pexpect.spawn("env LANG=C telnet " + cli_address) #### telnet login device_login(p) #### boot side set command = "event manual run boot-side-set" p.sendline(command) p.expect(prompt) #### telnet close p.close() def device_reboot(is_reset_otherside): p = pexpect.spawn("env LANG=C telnet " + cli_address) #### telnet login device_login(p) #### reset other-side if is_reset_otherside == 1: p.sendline("reset other-side moff") p.expect(prompt) #### reset else: p.sendline("reset moff") p.expect(prompt) #### telnet close p.close() def device_refresh(): p = pexpect.spawn("env LANG=C telnet " + cli_address) #### telnet login device_login(p) #### load boot.cfg p.sendline("load moff") p.expect(prompt) #### refresh p.sendline("refresh moff") p.expect(prompt) #### telnet close p.close() def main(): param = list(range(3)) get_env(param) serial = param[0] present_version = param[1] other_version = param[2] print("serial : ", serial) print("present version : ", present_version) print("other version : ", other_version) #### check ztp is_config_update = check_config(1) is_ztp = 0 if is_config_update == 0: is_ztp = 1 print("is_ztp=", is_ztp) #### download config get_config(serial) #### check config is_config_update = check_config(0) print("is_config_update =", is_config_update) #### apply to boot.cfg if is_config_update == 1: apply_config() #### device reboot or refresh if is_ztp == 1: device_reboot(0) elif is_config_update == 1: device_refresh() main()