Log Files mit Python auswerten

Wie Sie Layer-2-Loops vermeiden können

 09.02.2022     IT Automation

Python ist beliebt und gut zu erlernen

Python gehört zu den beliebtesten und sehr verbreiteten Programmiersprachen. Als sogenannte GPL (General Purpose Language) ist sie auf kein bestimmtes Anwendungsfeld festgelegt. Pythons Position in der Landschaft der Programmiersprachen zeigt sich in verschiedenen Indizes, welche deren Beliebtheit messen. Z. B im TIOBE-Index hat sich Python mittlerweile auf den ersten Platz vorgearbeitet. Im Folgenden sieht man die ersten fünf Plätze des TIOBE-Index, des PYPL (PopularitY of Programming Language) und The RedMonk Programming Language Rankings:

Rang

TIOBE Index
(Januar 2022)

PYPL
(Februar 2022)

RedMonk
(Juni 2021)

1 Python     Python     JavaScript
2 C Java     Python    
3 Java     JavaScript Java    
4 C++ C/C++ PHP
5 C# C# CSS

Die verhältnismäßig einfache Syntax, die große Standardbibliothek und die vielen Module, die man im Hinblick auf die unterschiedlichsten Anwendungsfälle nachinstallieren kann, machen bei der Programmierung das Leben leicht.

Python Bild

Mit Python können Sie Log Files auswerten

Ein Bereich, in dem Python hilfreich sein kann, ist das Auffinden relevanter Informationen in Log Files. Bei kleineren Log Files kann man durchaus auch selbst einen Blick in das File werfen, um die wichtigen Informationen abzulesen. Bei größeren Log Files wird es jedoch immer aufwändiger, die kritischen Stellen zu finden.

Hierbei kann es nützlich sein, ein Skript zu schreiben, welches das Log File nach den interessanten Informationen durchsucht und sie ausgibt oder auch in eine andere Datei schreibt. Ist das Skript einmal erarbeitet, lässt es sich immer wieder auf entsprechende Log Files anwenden. Ein Vorteil dabei ist natürlich die hohe Geschwindigkeit, mit der das Skript das Log File durchsucht. Gerade bei größeren Log Files würde eine manuelle Durchsicht sehr viel mehr Zeit in Anspruch nehmen.

Im Folgenden stellen wir Ihnen ein interessantes Beispiel vor. Wenn Sie das Skript selbst ausprobieren möchten, dann laden Sie es doch einfach kostenlos herunter!

Use Case: Layer-2-Loops in einem Netzwerk erkennen

Als Beispiel dient hier ein Log File, das auf dem Cisco CLI-Befehl „show spanning-tree root“ basiert.

Hintergrund: 
Das STP (Spanning Tree Protocol) verhindert Loops auf Layer 2. Das ist sehr wichtig, um endlos kreisende Datenpakete zu vermeiden. Ciscos Weiterentwicklung PVST+ (Per-VLAN Spanning Tree) erfüllt diese Funktion für jedes einzelne VLAN. Somit erhält man eine Loop-freie Topologie in jedem VLAN. Dabei übernimmt in jedem VLAN ein Switch die Rolle der Root Bridge. Dieser ist der zentrale Switch in der Struktur des Spanning Tree. In jedem VLAN sollte es also exakt eine Root Bridge geben!

Folgende Abbildung soll das Prinzip illustrieren:

<i>Bild1: Switch Blocks mit VLANs</i><br>

Bild1: Switch Blocks mit VLANs

Auf der linken Seite (Switch Block 1) befinden sich vier Switches, welche die VLANs 10 und 20 kennen. Der PVST+ Mechanismus hat den Switch links unten als Root Bridge für VLAN 10 ermittelt. Außerdem hat er dafür gesorgt, dass die beiden mit einem Kreuz versehenen Links geblockt sind und hat dadurch mögliche Loops verhindert.

Die Topologie enthält allerdings einen Fehler: Zwischen den beiden Switches SW 1 und SW 2 befindet sich ein Link; auf der Seite von SW 1 ist das ein Access-Port im VLAN 10 (orange markiert), während auf der Seite von SW 2 ein Access-Port im VLAN 20 (grün markiert) zu finden ist. Dadurch wurden die beiden VLANS 10 und 20 gekoppelt. Die rot dargestellten Links markieren den Loop, der dadurch entstanden ist.

Wie lässt sich der Konfigurationsfehler erkennen?

Eine fehlerhafte Konfiguration kann zu diesem Szenario führen: Entweder sind zwei Switches über Access-Ports verschiedener VLANs miteinander verbunden (siehe Beispiel oben) oder auf einem Trunk zwischen zwei Switches sind unterschiedliche Native VLANs konfiguriert (Native VLAN Mismatch).

Diese Konstellationen kann man daran erkennen, dass eine Root Bridge für mehrere (!) VLANs aufgeführt wird. Damit sind diese VLANs gekoppelt. Das kann zu Loops führen, was wiederum den Ausfall von Teilbereichen des Netzwerks verursachen kann.

Wie lässt sich diese Konstellation erkennen? Der oben genannte Cisco CLI-Befehl „show spanning-tree root“ listet für jedes VLAN die Root Bridge des Switches auf. Wird eine Root Bridge bei mehreren VLANs aufgeführt, liegen gekoppelte VLANs vor und der Fehler ist entdeckt.

Im Log File eines Switches sieht das so aus:

<i>Bild 2: Ausschnitt eines Log Files mit doppelter Root ID</i><br>

Bild 2: Ausschnitt eines Log Files mit doppelter Root ID

Ein Python-Skript entwickeln

Besonders dann, wenn viele VLANs aufgelistet sind, ist es aufwändig, den Fehler zu finden, indem man sich das Log File in einem Texteditor anschaut. Diese Aufgabe kann auch ein Python-Skript übernehmen. Welche Arbeitsschritte soll das Skript dazu durchführen? Das folgende Flowchart gibt einen groben Überblick über den Ablauf des Skripts:

<i>Bild 3: Ablaufdiagramm des Python-Skripts</i><br>

Bild 3: Ablaufdiagramm des Python-Skripts

Das Log-File öffnen und einlesen

<i>Bild 4: Das Log File wird geöffnet und eingelesen</i><br>

Bild 4: Das Log File wird geöffnet und eingelesen

Das Skript beginnt mit dem Import der verwendeten Bibliotheken. In diesem Fall sind alle in der Standardbibliothek enthalten und müssen daher nicht nachinstalliert werden.

Das ist zunächst argparse, das zum Parsen von Argumenten verwendet wird. Dadurch können wir bei diesem Skript den Namen des Log Files (als Argument) gleich hinter dem Skriptnamen angeben (siehe unten „Wie rufe ich das Skript auf?“).

Das Modul re bietet die Möglichkeit, mit regulären Ausdrücken zu arbeiten. Aus dem sys-Modul wird hier lediglich die exit()-Funktion verwendet, mit der sich ein Programm beenden kann.

Der erste Schritt des obigen Flowcharts besteht im Öffnen und Einlesen des Log Files. Dafür wird die open()-Funktion (Zeile 17) verwendet. Die open()-Funktion steht hier in einem try-Block, zu dem der folgende except-Block gehört.

Mit dieser Struktur werden Fehler abgefangen; in Python wird das viel verwendet. Die Idee hierbei (Zeile 16-20) ist, dass wenn das Log File nicht gefunden wird, weil beispielsweise der Name falsch geschrieben wurde, eine Meldung ausgegeben wird („File not found!“) und das Programm sich beendet.

Wurde das File gefunden und geöffnet, muss nun der relevante Inhalt in eine geeignete Datenstruktur eingelesen werden. Die ersten beiden Zeilen des Log Files bestehen aus den Spaltennamen und (darunter) einer Linie von Bindestrichen, die den Kopf der Tabelle vom Rest trennt. Diese Zeilen sind zu überspringen.

Die relevanten Informationen finden sich in den ersten beiden Spalten der Tabelle: Die VLAN-ID und die Root-ID (die aus der Priorität und der MAC-Adresse besteht). Durch die split()-Methode (Zeile 23) brechen wir die Zeilen an Leerzeichen auf (siehe oben den Auszug aus einem Log File).

Da die split()-Methode aus einem String eine Liste macht, erhält man also eine Liste mit der VLAN-ID als erstem Element, der Priorität als zweitem und der MAC-Adresse als drittem Element. Z.B.
[VLAN0001, 32769, a40c.c35c.8b00]

Jede Log-File-Zeile wird nun einem Dictionary hinzugefügt, wobei die VLAN-ID der Key ist. Der Wert ist wiederum ein Dictionary, welcher Priorität und MAC-Adresse als Werte enthält. Werden die ersten beiden Zeilen (siehe oben) dem Dictionary hinzugefügt, erhält man folgendes Dictionary:

{‘VLAN0001‘: {‘priority‘: ‘32796‘,
  ‘mac‘: ‘a40c.c35c.8b00’},
‘VLAN0020’:  {‘priority’: ‘32788’,
  ’mac’: a40c.c35c.8b00}}

Ist die Schleife, die in Zeile 23 beginnt, fertig ausgeführt, gibt es für jedes VLAN einen Eintrag in diesem Dictionary.

Liste mit Root IDs erzeugen

<i>Bild 5: Liste mit Root IDs wird erzeugt</i>

Bild 5: Liste mit Root IDs wird erzeugt

Nun ist zu ermitteln, ob bzw. welche Root IDs für mehrere VLANs aufgeführt werden. Dazu wird als erstes eine Liste mit allen Root IDs erzeugt. Dann lässt sich anschließend leicht feststellen, ob Root IDs auf dieser Liste mehrfach vorkommen. Die Liste hat den Namen „root_id_list“ (Zeile 34) und wird auf Grund des zuvor angelegten Dictionarys (root_ids) erzeugt.


Mehrfache Root IDs ermitteln

Nun wird jede Root ID der Liste root_id_list gezählt. Kommt sie zwei Mal oder öfters vor, wird sie einer weiteren Liste (multiple_root_ids) hinzugefügt. Zu diesem Zeitpunkt steht fest, ob und wenn ja welche Root IDs mehr als einmal vorkommen. Es fehlt nur noch die Ausgabe des Ergebnisses.


Ausgabe Root IDs / VLANs

Als nächstes wird überprüft, ob die Liste multiple_root_ids überhaupt Elemente enthält. Wenn nicht, heißt das, dass keine Root ID mehrfach vorkommt. In diesem Fall gibt das Skript die Rückmeldung „No VLANs with the same ROOT ID found.“  Falls aber doch Root IDs auf der Liste vorhanden sind, sollen sie mit den zugeordneten VLANs ausgegeben werden. Dazu müssen die VLANs, bei denen die Root ID angegeben ist, aus dem Dictionary root_ids herausgesucht werden (Zeile 47-50).

Wie rufe ich das Skript auf?

Eine Möglichkeit besteht darin, das Skript so zu schreiben, dass man das Log File als Argument auf der Kommandozeile übergibt. Dabei gibt man zunächst den Namen des Skriptes ein und dahinter das Log File, das ausgewertet werden soll. Heißt das Skript coupled_vlans.py, sieht der Aufruf so aus:

<i>Bild 6: Aufruf des Skripts mit erkanntem Topologie-Fehler</i><br>

Bild 6: Aufruf des Skripts mit erkanntem Topologie-Fehler

An der Ausgabe erkennt man, dass die VLANs 222 und 275 gekoppelt sind, denn für beide ist dieselbe Root Bridge angegeben. Falls keine Root Bridge mehrfach angegeben wird, soll das Tool auch in diesem Fall eine Rückmeldung geben. Die kann beispielsweise so aussehen:

<i>Bild 7: Aufruf des Skripts ohne erkannten Topologie-Fehler</i><br>

Bild 7: Aufruf des Skripts ohne erkannten Topologie-Fehler

Was Sie noch alles mit Python anstellen könnten

Dieses Projekt kann in unterschiedliche Richtungen weiterentwickelt werden. Wenn für mehrere Geräte dieses Log File erzeugt wurde, kann das Skript so erweitert werden, dass diese Log Files abgearbeitet werden und jedes auf mehrfache Root IDs überprüft wird.

Auch das Generieren dieser Log Files kann durch Python-Skripte automatisiert werden. Ebenfalls können Sie Skripte oder Funktionen schreiben, die andere Log File Typen auswerten. Diese lassen sich wiederum zu einem Tool bündeln. Es gibt viele Möglichkeiten. Mit kleineren Skripten lassen sich bereits solche Log-File-Auswertungen automatisieren.

Sie können das vorgestellte Skript aber auch weiterentwickeln und weitere eigene Funktionalitäten integrieren. Probieren Sie es einfach aus!

 

Das könnte Sie auch interessieren

Python Schulung bei ExperTeach – eine Übersicht unseres Kurs-Angebots im Bereich Python

Warum Sie Python lernen sollten! – ein Blog-Artikel, der Sie an Python heranführt

Python ist ja ganz nett, aber ist C nicht besser und überhaupt was soll dieses Einrücken? – Python Skript der Rheinischen Friedrich-Wilhelms-Universität Bonn

Stackoverflow.com – eine der wichtigsten Python Communities