202 lines
4.5 KiB
Python
Executable File
202 lines
4.5 KiB
Python
Executable File
#!/usr/bin/python3
|
|
|
|
import os
|
|
import sys
|
|
import socket
|
|
import telnetlib
|
|
import csv
|
|
import threading
|
|
import argparse
|
|
try:
|
|
import queue
|
|
except ImportError:
|
|
import Queue as queue
|
|
|
|
PORT=26000
|
|
NEXT=1
|
|
WORKERS = 5
|
|
|
|
NetMask = "255.255.0.0"
|
|
Gateway = "10.250.0.0.255.255.0.0.0.172.16.0.1"
|
|
OldSubnet = "192.168"
|
|
NewSubnet = "172.16"
|
|
VLAN = 4095
|
|
|
|
parser = argparse.ArgumentParser(description='Scriptable configuration of Aviat Eclipse INUes.')
|
|
parser.add_argument('csv')
|
|
|
|
|
|
def Config(tn, Context, Command, Position = 0, Value = None, Reverse = False):
|
|
tn.write(("contextid %s\n" % Context).encode('ascii'))
|
|
tn.read_until(b'Command Executed. Status unknown.\n')
|
|
if Reverse:
|
|
Temp = Position
|
|
Position = Value
|
|
Value = Temp
|
|
if Value:
|
|
tn.write(('set %s %s %s\n' % (Command, Position, Value)).encode('ascii'))
|
|
else:
|
|
tn.write(('get %s %s\n' % (Command, Position)).encode('ascii'))
|
|
response = tn.read_until(b'\n').split()
|
|
if response[0].decode() == Command:
|
|
return response[-1]
|
|
else:
|
|
return False
|
|
|
|
def CommitSave(tn):
|
|
Config(tn, "Terminal_I", "configCommitSave", 0, 1)
|
|
Config(tn, "Terminal_I", "configCommitSwitch", 0, 1)
|
|
|
|
class Worker(threading.Thread):
|
|
|
|
def __init__(self, INUEs, Passed, Failed):
|
|
self.__INUEs = INUEs
|
|
self.__Passed = Passed
|
|
self.__Failed = Failed
|
|
threading.Thread.__init__(self)
|
|
|
|
def run(self):
|
|
while 1:
|
|
INUE = self.__INUEs.get()
|
|
if INUE is None:
|
|
self.__Passed.put(None)
|
|
self.__Failed.put(None)
|
|
break
|
|
|
|
NewIP = INUE.replace(OldSubnet, NewSubnet)
|
|
|
|
RSTPDAC = 0
|
|
|
|
try:
|
|
with telnetlib.Telnet(INUE, PORT) as tn:
|
|
for Slot in range(1,9):
|
|
if Config(tn, "Slot%s_I" % Slot, "ceConfigBridgeStpMode"):
|
|
RSTPDAC = Slot
|
|
|
|
if not RSTPDAC:
|
|
self.__Failed.put(INUE)
|
|
continue
|
|
|
|
commands = [
|
|
["Slot%s_I" % Slot, "ceConfigNmsVid", 0, VLAN],
|
|
["Terminal_I", "ipConfigAdEntAddress", Slot + 1, NewIP],
|
|
["Terminal_I", "ipConfigAdEntNetMask", Slot + 1, NetMask],
|
|
["Terminal_I", "ipConfigAutoroutingOspfEnable", Slot + 1, 2],
|
|
["Terminal_I", "ipCidrRouteIfIndex", Slot + 48, Gateway, True],
|
|
]
|
|
|
|
fail = False
|
|
|
|
for command in commands:
|
|
if not Config(tn, *command):
|
|
self.__Failed.put(INUE)
|
|
fail = True
|
|
continue
|
|
|
|
if fail:
|
|
continue
|
|
|
|
CommitSave(tn)
|
|
|
|
except OSError:
|
|
FailedQueue.put(INUE)
|
|
continue
|
|
|
|
try:
|
|
with telnetlib.Telnet(NewIP, PORT) as tn:
|
|
self.__Passed.put(NewIP)
|
|
except OSError:
|
|
FailedQueue.put(INUE)
|
|
continue
|
|
|
|
def Input():
|
|
with open(inFilePath, 'r', newline='') as inFile:
|
|
csvReader = csv.DictReader(inFile)
|
|
|
|
for row in csvReader:
|
|
INUeQueue.put(row['IP Address'])
|
|
inFile.close()
|
|
|
|
for i in range(WORKERS):
|
|
INUeQueue.put(None)
|
|
|
|
|
|
def FailedOutput():
|
|
Count = WORKERS
|
|
|
|
# with open('/tmp/sc200.csv', 'w', newline='') as outFile:
|
|
# csvWriter = csv.DictWriter(outFile, fieldnames=fieldNames,
|
|
# delimiter=',', quotechar='"',
|
|
# quoting=csv.QUOTE_MINIMAL)
|
|
|
|
# csvWriter.writeheader()
|
|
|
|
print('Failed:')
|
|
|
|
while 1:
|
|
INUE = FailedQueue.get()
|
|
if INUE is None:
|
|
if Count > 1:
|
|
Count -= 1
|
|
# print(Count)
|
|
else:
|
|
break
|
|
else:
|
|
print(INUE)
|
|
|
|
def PassedOutput():
|
|
Count = WORKERS
|
|
|
|
fieldNames = ['IP Address']
|
|
with open('/tmp/aviat.csv', 'w', newline='') as outFile:
|
|
csvWriter = csv.DictWriter(outFile, fieldnames=fieldNames,
|
|
delimiter=',', quotechar='"',
|
|
quoting=csv.QUOTE_MINIMAL)
|
|
|
|
csvWriter.writeheader()
|
|
|
|
while 1:
|
|
INUE = PassedQueue.get()
|
|
if INUE is None:
|
|
if Count > 1:
|
|
Count -= 1
|
|
else:
|
|
break
|
|
else:
|
|
csvWriter.writerow({"IP Address": INUE})
|
|
|
|
outFile.close()
|
|
|
|
|
|
INUeQueue = queue.Queue(0)
|
|
PassedQueue = queue.Queue(0)
|
|
FailedQueue = queue.Queue(0)
|
|
|
|
# for i in range(WORKERS):
|
|
# Worker(INUeQueue, PassedQueue, FailedQueue).start()
|
|
|
|
# for INUE in sys.argv:
|
|
# if NEXT:
|
|
# NEXT=0
|
|
# else:
|
|
# INUeQueue.put(INUE)
|
|
|
|
# for i in range(WORKERS):
|
|
# INUeQueue.put(None)
|
|
|
|
inFilePath = sys.argv[1]
|
|
|
|
Input()
|
|
|
|
for i in range(WORKERS):
|
|
Worker(INUeQueue, PassedQueue, FailedQueue).start()
|
|
|
|
if threading.current_thread() is not threading.main_thread():
|
|
sys.exit(0)
|
|
|
|
PassedOutput()
|
|
FailedOutput()
|
|
|
|
sys.exit(0)
|
|
|