#!/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)