Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
OmniVista 2500 - CLI-Scripting mit JavaScript
Der folgende Tech-Tipp soll die Möglichkeiten des Scripting Moduls des OmniVista2500 aufzeigen. Neben der Nutzung der bekannten AOS CLI Syntax, besteht die Möglichkeit Kommandos in JavaScript einzubinden, um so beispielsweise bedingte Konfigurationen durchzuführen (z.B. Learned Port Security nur auf Mobile Ports) oder komplexe Prüfungen der Konfiguration durchzuführen.
Das Modul kann zur Ausführung der Scripte neben den eingebauten System Variablen (z.B. GeräteTyp, IP-Adresse, MAC-Adresse) auch Benutzer Variablen zur Ausführung der Scripte heranziehen. Details zu den Möglichkeiten werden im OmniVista direkt unter dem Menüpunkt ?Help im CLI-Scripting Modul angeboten.
Folgend werden einige Beispiel Scripte kurz erklärt, die individuell angepasst werden können und den Konfigurationsaufwand in einigen Fällen bereits erheblich reduzieren können.
Überprüfung der installierten FPGA Version
Das folgende Script führt ein Kommando „show ni“ auf den Geräten aus, und sucht in dessen Ausgabe nach dem Vorkommen eines regulären Ausdrucks. In diesem Fall wird die FPGA Version 11 gesucht. Je nach Resultat, wird unter Administrator→Audit→Configuration→clisripting das Ergebnis entweder als INFORMATION oder ERROR angezeigt.
<js> /*@@Check if correct FPGA is installed. Use on your own risk! Benjamin Domroese, Januar 2018@@ */ cli.sendCmd("show ni"); var response = cli.lastResponse(); var pattern = /FPGA\s-\sPhysical\s\d:\s+0011/g;/*REGEX Pattern you hope to find. In this case FPGA 11*/ if (pattern.test(response)==true) { cli.trace("Everything OK here - FPGA 11 installed on " + "$IP_ADDRESS");/*Positiv Message in Audit if Pattern found*/ }/*if*/ else { cli.errorLog("FPGA need to be updated on " + "$IP_ADDRESS");/*Negative Message in Audit if not found*/ }/*else*/ </js>
Bedingte Konfiguration, Änderung nur an mobilen Ports
Das nächste Beispiel beinhaltet eine bedingte Konfiguration. Hier wird eine Liste der mobilen Ports angelegt, und für diese eine bestimmtes Kommando herangezogen. In diesem Fall „default vlan restore disable“. Die Liste wird hier anhand eines regulären Ausdrucks und des Kommandos „show vlan port mobile“ erzeugt. Anschließend wird mithilfe einer for-Schleife, für jedes Element in der Liste (jeder Port) ein Kommando ausgeführt.
<js> /*@@Check if there are mobile Ports with default vlan restore ENABLED. If yes, disable it. Use on your own risk! Benjamin Domroese, Januar 2018@@ */ cli.sendCmd("show vlan port mobile"); var response = cli.lastResponse(); var pattern = /\d+\/\d+(?=\s+on\s+\d{1,4}\s+\S{1,10}\s+\w{2,3}\s+on)/g;/*Create REGEX that only stores the port i.e 1/3 */ if (pattern.test(response)==false) { cli.trace("Everything OK here"); }/*if*/ else { var ListOfMobilePorts = response.match(pattern); /*Create the Array with the Ports that need to be changed*/ for (i=0;i<ListOfMobilePorts.length && ListOfMobilePorts != null;i++) { cli.sendCmd("vlan port " + ListOfMobilePorts[i] + " default vlan restore disable");/*send the Cmd for every entry in the Array (every port matched by the REGEX)*/ cli.errorLog(ListOfMobilePorts[i] + " has been changed"); }/*for*/ }/*else*/ </js>
Das Ergebnis kann sowohl im Audit Log, als auch im CLI Scripting Modul unter Configuration→CLI Scripting→Logs direkt eingesehen werden.
Überprüfung von gleichartiger 802.1x Konfiguration
Das folgende Script überprüft, ob die AAA Konfiguration auf allen Ports gleich ist oder sich die Konfiguration auf einzelnen Ports unterscheidet.
Anhand eines Regulären Ausdrucks wird hier mithilfe des Kommandos „show vlan port mobile“ eine Liste (Array) mit allen 802.1x Ports erstellt. Anschließend wird mit „show configuration snapshot aaa“ die komplette AAA Konfiguration eingelesen und mit einem Regulären Ausdruck so modifiziert, dass diese zwischen den Ports vergleichbar ist.
Aus:
802.1x 1/20 supp-polling retry 10
wird
802.1x supp-polling retry 10
Diese Konfiguration wird nun mit dem jeweilig nächsten Port verglichen und auf Differenzen untersucht (z.B. Port 1/2 mit Port 1/3).Dieser Vorgang wird für alle 802.1x Ports ausgeführt, die in der Liste „ListOf8021xPorts“ aufgeführt sind. Sollten Unterschiede auftreten, so sind diese anschliessend im Audit Log (siehe Screenshot) zu finden.
Anbei der JavaScript Code für diese Funtion.
Hinweis: Die folgende Scripte wurde mit OmniVsita 2500 4.2.1R01 Build 95 auf AOS 6.x Geräten (6450 und 6400) genutzt. Andere Geräte sowie AOS Versionen unterscheiden sich ggf. in der Syntax der Kommandos und in deren Ausgabe. Die Scripte müssen daher immer genau geprüft werden, bevor diese für einen flächendeckenden RollOut verwendet werden können.
<js> /*@@Check if all 8021x Config is identically. Created by Benjamin Domroese, Januar 2018@@*/ cli.sendCmd("show vlan port mobile"); cli.cliSleep("2000"); /*Give the command 2 seconds time, before the next is executed*/ var response = cli.lastResponse(); var pattern = new RegExp("\\d+\\/\\d+(?=\\s+on\\s+\\d{1,4}\\s+on\\-8021x)","gm");/*Create REGEX that only stores the port enabled for 8021x */ var noerrorfound = true; var okmsg = false; if (pattern.test(response)==false) { cli.trace("No 8021x Ports found on: " + "$IP_ADDRESS"); okmsg = true; }/*if*/ else { var ListOf8021xPorts = response.match(pattern);/*Create an Array out of all 8021x Ports seen with "show vlan port mobile"*/ cli.sendCmd("show configuration snapshot aaa"); var aaa_config = cli.lastResponse(); for (i=0;i<ListOf8021xPorts.length-1 && ListOf8021xPorts != null;i++) { var pattern_2 = new RegExp("(?:802.1x\\s+" + ListOf8021xPorts[i] + ").*(\\r\\n|\\r|\\n)","g");/*REGEX Object that capture everything between the Port Number and a new line (just the pure config)*/ var first_port = aaa_config.match(pattern_2); var pattern_3 = new RegExp("(?:802.1x\\s+" + ListOf8021xPorts[i+1] + ").*(\\r\\n|\\r|\\n)","g"); var second_port = aaa_config.match(pattern_3); for (j=0;j<first_port.length && second_port[j]!= null;j++) { var first_port_clean = first_port[j].replace(/\d{1,2}\/\d{1,2}/,""); /* Replace Port Number, so that config should be similar*/ var second_port_clean = second_port[j].replace(/\d{1,2}\/\d{1,2}/,""); if (second_port_clean != first_port_clean) { cli.errorLog("Warning on " + "$IP_ADDRESS" + "! Port " + ListOf8021xPorts[i] + " is different from " + ListOf8021xPorts[i+1]); cli.errorLog("Port Config on " + ListOf8021xPorts[i] + " is: " + first_port_clean); cli.errorLog("Port Config on " + ListOf8021xPorts[i+1] + " is: " + second_port_clean); var noerrorfound = false; }/*if*/ }/*for*/ }/*for*/ }/*else*/ if (noerrorfound==true && okmsg==false) { cli.trace("Everything ok on " + "$IP_ADDRESS" + "! All Ports are configured identically"); }/*if*/ </js>
Anbei ein Screenshot der Ausgabe, die Hinweise auf unterschiedliche Konfigurationen bietet.