nokia sros için araçlar
genel olarak network ekipmanlarında cli ile konfigürasyon yapıyorsanız sıklıkla kopyala – yapıştır yapıyorsunuzdur. ancak bu yöntem hatalara oldukça açıktır.
bu hatayı minimize etmek adına python ile yazılmış nokia sros güzel bir kod bulmuştum. bunu paylaşmak istedim. örnek için aşağıdaki şekilde bir konfigürasyonumuz olsun.. bunu c1.txt olarak kaydediyoruz.
vpls 11 customer 1 vpn 11 i-vpls create
backbone-vpls 100:11
exit
stp
shutdown
exit
sap 1/5/1:11 create
exit
sap 1/5/1:12 create
exit
no shutdown
exit
vpls 100 customer 1 vpn 100 b-vpls create
service-mtu 2000
stp
shutdown
exit
mrp
flood-time 10
no shutdown
exit
sap 1/5/1:100 create
exit
spoke-sdp 3101:100 create
exit
spoke-sdp 3201:100 create
exit
no shutdown
exit
t.py olarak kaydettiğimiz python kodunu çalıştığımızda mevcut kodumuz aşağıdaki örnekte görüleceği üzere yeniden düzenleniyor. bu şekilde bir yapı bir çok olası hatanın önüne geçecektir.
fcicek@cicek:~/mpls/sros$ python t.py c1.txt
/configure vpls 11 customer 1 vpn 11 i-vpls create backbone-vpls 100:11
/configure vpls 11 customer 1 vpn 11 i-vpls create stp shutdown
/configure vpls 11 customer 1 vpn 11 i-vpls create sap 1/5/1:11 create
/configure vpls 11 customer 1 vpn 11 i-vpls create sap 1/5/1:12 create
/configure vpls 11 customer 1 vpn 11 i-vpls create no shutdown
/configure vpls 100 customer 1 vpn 100 b-vpls create service-mtu 2000
/configure vpls 100 customer 1 vpn 100 b-vpls create stp shutdown
/configure vpls 100 customer 1 vpn 100 b-vpls create mrp flood-time 10
/configure vpls 100 customer 1 vpn 100 b-vpls create mrp no shutdown
/configure vpls 100 customer 1 vpn 100 b-vpls create sap 1/5/1:100 create
/configure vpls 100 customer 1 vpn 100 b-vpls create spoke-sdp 3101:100 create
/configure vpls 100 customer 1 vpn 100 b-vpls create spoke-sdp 3201:100 create
/configure vpls 100 customer 1 vpn 100 b-vpls create no shutdown
kullanılan t.py
#!/usr/bin/env python3
import re
import math
import sys
def pop(stack):
try:
stack.pop()
except Exception as err:
print("ERROR: Unable to flush stack - %s" %err)
def output(stack):
output = " ".join(stack)
print(output)
return output
def sros_flatten(data):
stack = []
exit_detected = False
indent = 0
new_conf = ""
for line in data.lstrip().splitlines():
l = len(line) - len(line.lstrip())
nxt_indent = math.ceil(float(l/4))
if line.startswith(("#", "echo")) or line.strip() == "":
pass
elif line.strip() == "exit all":
new_conf = new_conf + "\n" + output(stack)
else:
if nxt_indent == 0 and line.strip() == "configure":
new_line = str("/") + str(line.strip())
stack.append(new_line)
elif nxt_indent > indent:
if line.strip() != "configure" and len(stack) == 0:
stack.insert(0, "/configure")
stack.append(line.lstrip())
elif nxt_indent == indent:
if line.strip() != "exit":
if exit_detected:
stack.append(line.strip())
else:
if len(stack) != 0:
new_conf = new_conf + "\n" + output(stack)
pop(stack)
stack.append(line.strip())
else:
stack.insert(0, "/configure")
stack.append(line.strip())
exit_detected = False
else:
if line.strip() == "exit":
if not exit_detected:
new_conf = new_conf + "\n" + output(stack)
del stack[-2:]
else:
pop(stack)
exit_detected = True
else:
new_conf = new_conf + "\n" + output(stack)
exit_detected = False
pop(stack)
indent = nxt_indent
return new_conf
def main():
filename = sys.argv[1]
with open(filename, 'r') as f:
data = f.read()
sros_flatten(data)
if __name__ == "__main__":
main()