assignservers.py
from netmiko import ConnectHandler
from datetime import datetime
import csv
import openpyxl
import re
def connected_switches_and_1stports(servers):
csvfile2 = open('huaweiswpass.csv', 'r')
reader2 = list(csv.DictReader(csvfile2))
with open(servers, newline='') as csvfile:
reader = list(csv.DictReader(csvfile))
l = [[[row2['e_sw_ip'], row2['e_username'], row2['e_password']], [row2['l_sw_ip'], row2['l_username'], row2['l_password']]] for row in reader for row2 in reader2 if row['rack'] == row2['rack']]
m = []
for i in l:
if i not in m:
m.append(i)
li = list(dict.fromkeys([row['rack'] for row in reader]))
sl = []
x = 0
for i in li:
sl.append([])
for row in reader:
if row['rack'] == i:
sl[x].append(row['no'])
x += 1
csvfile2.close()
return zip(m,sl)
def backup_vlan(ports, fname):
f = open(fname, 'w+')
for sw in ports:
sshcon = ConnectHandler(device_type='huawei', ip=sw[0][0][0], username=sw[0][0][1], password=sw[0][0][2], global_delay_factor=0.5)
output = sshcon.send_command_timing("display port vlan")
f.write(sw[0][0][0] + "n")
f.write(output + "nnn")
sshcon.disconnect()
if not sw[0][1][0] == '':
sshcon = ConnectHandler(device_type='huawei_vrpv8', ip=sw[0][1][0], username=sw[0][1][1], password=sw[0][1][2], global_delay_factor=0.5)
output = sshcon.send_command_timing("display port vlan")
f.write(sw[0][1][0] + "n")
f.write(output + "nnn")
sshcon.disconnect()
f.close()
def vlan_batch_and_uplink(ports, vlans):
v = vlans.split()
mvlan = v[0]
servlan = v[1].split("-")
serfrvlan = servlan[0]
sertovlan = servlan[1]
allowed_vlans = mvlan + " " + serfrvlan + " to " + sertovlan
for sw in ports:
sshcon = ConnectHandler(device_type='huawei', ip=sw[0][0][0], username=sw[0][0][1], password=sw[0][0][2], global_delay_factor=0.5)
output = sshcon.send_config_set(["vlan batch " + allowed_vlans, "int eth 1", "port trunk all vlan " + allowed_vlans, "return"])
sshcon.exit_config_mode()
output = sshcon.send_command_timing("save")
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt=False, strip_command=False)
sshcon.disconnect()
if not sw[0][1][0] == '':
sshcon = ConnectHandler(device_type='huawei_vrpv8', ip=sw[0][1][0], username=sw[0][1][1], password=sw[0][1][2], global_delay_factor=0.5)
output = sshcon.send_config_set(["vlan batch " + allowed_vlans, "int 10g1/0/48", "port trunk all vlan " + allowed_vlans], False)
sshcon.commit()
sshcon.exit_config_mode()
output = sshcon.send_command_timing("save")
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt=False, strip_command=False)
sshcon.disconnect()
def undo_vlan_batch_and_uplink(ports, vlans):
v = vlans.split()
#mvlan = v[0]
servlan = v[1].split("-")
serfrvlan = servlan[0]
sertovlan = servlan[1]
allowed_vlans = serfrvlan + " to " + sertovlan
for sw in ports:
sshcon = ConnectHandler(device_type='huawei', ip=sw[0][0][0], username=sw[0][0][1], password=sw[0][0][2], global_delay_factor=0.5)
sshcon.config_mode()
output = sshcon.send_command_timing("undo vlan batch " + allowed_vlans, strip_command=False, strip_prompt=False)
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt = False, strip_command = False)
output = sshcon.send_config_set(["int eth 1", "undo port trunk all vlan " + allowed_vlans, "return"])
sshcon.disconnect()
if not sw[0][1][0] == '':
sshcon = ConnectHandler(device_type='huawei_vrpv8', ip=sw[0][1][0], username=sw[0][1][1], password=sw[0][1][2], global_delay_factor=0.5)
sshcon.config_mode()
output = sshcon.send_command_timing("undo vlan batch " + allowed_vlans, strip_command=False, strip_prompt=False)
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt = False, strip_command = False)
output = sshcon.send_config_set(["int 10g1/0/48 ", "undo port trunk all vlan " + allowed_vlans], False)
sshcon.commit()
sshcon.exit_config_mode()
output = sshcon.send_command_timing("save")
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt = False, strip_command = False)
sshcon.disconnect()
def configure_int_vlan(ports,vlans):
start_time = datetime.now()
v = vlans.split()
mvlan = v[0]
servlan = v[1].split("-")
serfrvlan = servlan[0]
sertovlan = servlan[1]
allowed_vlans = serfrvlan + " to " + sertovlan
for sw in ports:
print("Configuring " + sw[0][0][0])
for port in sw[1]:
int1 = "g0/0/" + str(int(port))
int2 = "g0/0/" + str(int(port) + 15)
int3 = "g0/0/" + str(int(port) + 30)
int4 = "g1/0/" + str(int(port))
sshcon = ConnectHandler(device_type='huawei', ip=sw[0][0][0], username=sw[0][0][1], password=sw[0][0][2], global_delay_factor=0.5)
sshcon.config_mode()
output = sshcon.send_command_timing("clear configuration interface " + int1, strip_command=False, strip_prompt=False)
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt = False, strip_command = False)
output = sshcon.send_config_set(["interface " + int1, "undo shutdown", "port link trunk", "port trunk pvid vlan " + serfrvlan, "undo port trunk all vlan all", "port trunk all vlan " + allowed_vlans, "return"])
print(int1 + "Done")
sshcon.config_mode()
output = sshcon.send_command_timing("clear configuration interface " + int2, strip_command=False, strip_prompt=False)
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt = False, strip_command = False)
output += sshcon.send_config_set(["interface " + int2, "undo shutdown", "port link trunk", "port trunk pvid vlan " + mvlan, "undo port trunk all vlan all", "port trunk all vlan " + mvlan + " " + allowed_vlans, "return"])
print(int2 + "Done")
sshcon.config_mode()
output = sshcon.send_command_timing("clear configuration interface " + int3, strip_command=False, strip_prompt=False)
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt = False, strip_command = False)
output += sshcon.send_config_set(["interface " + int3, "undo shutdown", "port link trunk", "port trunk pvid vlan " + str(int(serfrvlan)+1), "undo port trunk all vlan all", "port trunk all vlan " + allowed_vlans, "return"])
print(int3 + "Done")
sshcon.config_mode()
output = sshcon.send_command_timing("clear configuration interface " + int4, strip_command=False, strip_prompt=False)
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt = False, strip_command = False)
output += sshcon.send_config_set(["interface " + int4, "undo shutdown", "port link trunk", "port trunk pvid vlan " + str(int(serfrvlan)+2), "undo port trunk all vlan all", "port trunk all vlan " + allowed_vlans, "return"])
print(int4 + "Done")
sshcon.exit_config_mode()
output = sshcon.send_command_timing("save")
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt=False, strip_command=False)
sshcon.disconnect()
if sw[0][1][0] != '':
for port in sw[1]:
if int(port) <= 12:
int1 = "10g1/0/" + str(int(port))
int2 = "10g1/0/" + str(int(port) + 12)
int3 = "10g1/0/" + str(int(port) + 24)
int4 = "10g1/0/" + str(int(port) + 36)
print("Configuring" + sw[0][1][0])
sshcon = ConnectHandler(device_type='huawei_vrpv8', ip=sw[0][1][0], username=sw[0][1][1], password=sw[0][1][2], global_delay_factor=0.5)
sshcon.config_mode()
output = sshcon.send_command_timing("clear configuration interface " + int1, strip_command=False, strip_prompt=False)
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt=False, strip_command=False)
output += sshcon.send_config_set(["interface " + int1, "undo shutdown", "port link trunk", "port trunk pvid vlan " + str(int(serfrvlan) + 3), "undo port trunk all vlan all", "port trunk all vlan " + allowed_vlans], False)
sshcon.commit()
print(int1 + "Done")
output = sshcon.send_command_timing("clear configuration interface " + int2, strip_command=False, strip_prompt=False)
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt=False, strip_command=False)
output += sshcon.send_config_set(["interface " + int2, "undo shutdown", "port link trunk", "port trunk pvid vlan " + str(int(serfrvlan) + 3), "undo port trunk all vlan all", "port trunk all vlan " + allowed_vlans], False)
sshcon.commit()
print(int2 + "Done")
output = sshcon.send_command_timing("clear configuration interface " + int3, strip_command=False, strip_prompt=False)
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt=False, strip_command=False)
output += sshcon.send_config_set(["interface " + int3, "undo shutdown", "port link trunk", "port trunk pvid vlan " + str(int(serfrvlan) + 4), "undo port trunk all vlan all", "port trunk all vlan " + allowed_vlans], False)
sshcon.commit()
print(int3 + "Done")
if int(port) != 12:
output = sshcon.send_command_timing("clear configuration interface " + int4, strip_command=False, strip_prompt=False)
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt=False, strip_command=False)
output += sshcon.send_config_set(["interface " + int4, "undo shutdown", "port link trunk", "port trunk pvid vlan " + str(int(serfrvlan) + 4), "undo port trunk all vlan all", "port trunk all vlan " + allowed_vlans], False)
sshcon.commit()
print(int4 + "Done")
sshcon.exit_config_mode()
output = sshcon.send_command_timing("save")
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt=False, strip_command=False)
sshcon.disconnect()
else:
output = "waiting to be implemented"
end_time = datetime.now()
print("Total time: {}".format(end_time - start_time))
def clear_conf_interface(ports):
start_time = datetime.now()
for sw in ports:
print("Releasing " + sw[0][0][0])
sshcon = ConnectHandler(device_type='huawei', ip=sw[0][0][0], username=sw[0][0][1], password=sw[0][0][2],
global_delay_factor=0.5)
for port in sw[1]:
int1 = "g0/0/" + str(int(port))
int2 = "g0/0/" + str(int(port) + 15)
int3 = "g0/0/" + str(int(port) + 30)
int4 = "g1/0/" + str(int(port))
sshcon.config_mode()
output = sshcon.send_command_timing("clear configuration interface " + int1, strip_command=False, strip_prompt=False)
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt = False, strip_command = False)
output = sshcon.send_config_set(["interface " + int1, "undo shutdown", "return"])
print(int1 + "Done")
sshcon.config_mode()
output = sshcon.send_command_timing("clear configuration interface " + int2, strip_command=False, strip_prompt=False)
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt = False, strip_command = False)
output += sshcon.send_config_set(["interface " + int2, "undo shutdown", "return"])
print(int2 + "Done")
sshcon.config_mode()
output = sshcon.send_command_timing("clear configuration interface " + int3, strip_command=False, strip_prompt=False)
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt = False, strip_command = False)
output += sshcon.send_config_set(["interface " + int3, "undo shutdown", "return"])
print(int3 + "Done")
sshcon.config_mode()
output = sshcon.send_command_timing("clear configuration interface " + int4, strip_command=False, strip_prompt=False)
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt = False, strip_command = False)
output += sshcon.send_config_set(["interface " + int4, "undo shutdown", "return"])
print(int4 + "Done")
sshcon.exit_config_mode()
output = sshcon.send_command_timing("save")
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt=False, strip_command=False)
sshcon.disconnect()
if sw[0][1][0] != '':
for port in sw[1]:
if int(port) <= 12:
int1 = "10g1/0/" + str(int(port))
int2 = "10g1/0/" + str(int(port) + 12)
int3 = "10g1/0/" + str(int(port) + 24)
int4 = "10g1/0/" + str(int(port) + 36)
print("Releasing" + sw[0][1][0])
sshcon = ConnectHandler(device_type='huawei_vrpv8', ip=sw[0][1][0], username=sw[0][1][1], password=sw[0][1][2], global_delay_factor=0.5)
sshcon.config_mode()
output = sshcon.send_command_timing("clear configuration interface " + int1, strip_command=False, strip_prompt=False)
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt=False, strip_command=False)
print(int1 + "Done")
output = sshcon.send_command_timing("clear configuration interface " + int2, strip_command=False, strip_prompt=False)
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt=False, strip_command=False)
print(int2 + "Done")
output = sshcon.send_command_timing("clear configuration interface " + int3, strip_command=False, strip_prompt=False)
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt=False, strip_command=False)
print(int3 + "Done")
if int(port) != 12:
output = sshcon.send_command_timing("clear configuration interface " + int4, strip_command=False, strip_prompt=False)
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt=False, strip_command=False)
print(int4 + "Done")
sshcon.exit_config_mode()
output = sshcon.send_command_timing("save")
if "Y/N" in output:
output += sshcon.send_command_timing("y", strip_prompt=False, strip_command=False)
sshcon.disconnect()
else:
output = "waiting to be implemented"
end_time = datetime.now()
print("Total time: {}".format(end_time - start_time))
def extract_vlans_and_servers_from_xlsx(pname, serverscsv):
path = 'D:\FH\svn0303\10 物料分配表\'
wb = openpyxl.load_workbook(path+pname+'.xlsx')
s = wb['网络配置']
pattern = r'Ld+-d+'
f = open(serverscsv, 'w+')
f.write('rack,non')
vlans = ''
for row in s.iter_rows():
for cell in row:
if cell.value == 'vlans':
vlans = s.cell(column=cell.column+1, row=cell.row).value
if type(cell.value) is str and re.match(pattern, cell.value) is not None:
no = s.cell(column=cell.column+2, row=cell.row).value
if type(no) is int:
no = str(no)
f.write(cell.value+','+no+'n')
f.close()
return vlans
configureswitches.py
import assignservers as asse
from datetime import datetime
import sys
lease = 'CONFIGURE' # CONFIGURE or RELEASE
pname = "200827200727001-lj-idle"
assigned_servers = "servers.csv"
vlans = asse.extract_vlans_and_servers_from_xlsx(pname, assigned_servers)
ports = list(asse.connected_switches_and_1stports(assigned_servers))
print("Related switches are: n")
for sw in ports:
print(sw)
print("nRelated vlans are " + vlans + 'n')
if lease == 'CONFIGURE':
prompt = "You are going to CONFIGURE interface vlans. Are you sure to continue? [Y/N]"
elif lease == 'RELEASE':
prompt = "You are going to CLEAR interface vlans and RELEASE servers. Are you sure to continue? [Y/N]"
flag = input(prompt)
if flag == 'Y' or flag == 'y':
if lease == 'CONFIGURE':
fname = datetime.now().strftime("%Y%m%d%H%M%S") + " backupforconfiguring " + pname
asse.backup_vlan(ports, fname)
asse.vlan_batch_and_uplink(ports, vlans)
asse.configure_int_vlan(ports, vlans)
elif lease == 'RELEASE':
fname = datetime.now().strftime("%Y%m%d%H%M%S") + " backupforreleasing " + pname
asse.backup_vlan(ports, fname)
asse.undo_vlan_batch_and_uplink(ports, vlans)
asse.clear_conf_interface(ports)
else:
sys.exit()