Suche

lichtschattenblog

Kategorie

Bash

PRTG – bash Skript zur Abfrage am Linux-Server – XML-Datensatz

Bei Einsatz von PRTG zur Überwachung von Systemen in einem Netzwerk können bei Bedarf eigene Skripte aktiviert werden, wo die gewünschten Daten/Informationen via XML ausgegeben werden.

In meinem Beispiel benötigte ich einen einfachen Sensor, wo ich als Ergebnis, zu einer Liste von Verzeichnissen, die Anzahl der Dateien und die Gesamtgröße mit allen Unterverzeichnisse als Datensatz bekomme. Ziel war es eine Fehlermeldung zu generieren und per E-Mail zu erhalten, um entsprechende Massnahmen durchführen zu können.

Damit das eigene Skript auf dem Server verfügbar ist, erstellen wir zunächst im Verzeichnis /var/prtg/scriptsxml auf dem betroffenen Server eine Datei mit sinnvollen Namen:

nano getfolderinfo

und fügen den folgenden Inhalt ein:

#!/bin/bash

echo "<?xml version=\"1.0\" encoding=\"Windows-1252\" >"
echo "<prtg>"

for i do

foldersize=$(du -s "$i" | cut -f1)
filescount=$(find "$i" -type f | wc -l)

 echo "<result>"
  echo "<channel>$i - folder size</channel>"
  echo "<value>$foldersize</value>"
  echo "<volumeSize>Byte</volumeSize>"
 echo "</result>"

 echo "<result>"
  echo "<channel>$i - files count</channel>"
  echo "<value>$filescount</value>"
 echo "</result>"

done

echo "</prtg>"

Anschließend machen wir die Datei ausführbar mittels:

chmod 755 getfolderinfo

 

Zur Info:

Mittels:

for i do
  ...done

werden die übergebene Argumente in einer Schleife abgearbeitet.

Mittels:

foldersize=$(du -s "$i" | cut -f1)
filescount=$(find "$i" -type f | wc -l)

werden die jeweiligen Informationen in Variablen geschrieben. Die restlichen Zeilen erzeugen die notwendige XML-Struktur.

 

Zum Test führen wir das Skript mit einem Argument aus, wobei das Argument als Verzeichnis auf dem Server vorliegen muss:

prtg_sensor_script_output

 

Anschließend aktivieren wir im PRTG den neuen Sensor. Hierzu wird zu einem bereits bestehenden Linux-System ein weiterer Sensor hinzugefügt. Zur Auswahl des Sensors wählen wir SSH Script Advanced:

prtg_sensor_sshxml

Im nächsten Schritt wählen wir das Skript auf dem Server:

prtg_sensor_select

Hinweis: Hier erscheint auch der Hinweis wo sich das Skript auf dem Server befinden muss!

und hinterlegen die zu prüfenden Verzeichnisse mit Leerzeichen getrennt als Parameter:

prtg_sensor_select_parameters

Anschließend schließen wir die Eingabe ab und warten mindestens zweimal die Zeit für das Aktualisierungsinterval ab, damit die Struktur vom Sensor via XML erfasst und anschließend mit ersten Daten befüllt wird.

Im Ergebnis und mit ein paar Anpassungen für aktivierte Grenzwerte (Limits -> Enable Limts) in der Spalte Settings zum jeweiligen Kanal (Beispiel):

  • Upper Error Limit (#): 1
  • Error Limit Message: … Aufnahmen (Bilder oder Video) …

sehen wir:

prtg_sensor_output.jpg

Wer einen Sensor mit bereits festen Vorgaben für Grenzwerte erstellen möchte, siehe sich bitte das Handbuch mit mindestens 3000 Seiten an:

https://www.de.paessler.com/support/manuals

Ansonsten ist die Datei: Demo Batchfile – Returns static values in four channels.bat auf dem PRTG-Server unter C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML eine gute Grundlage für die jeweiligen XML-Tags.

Weitere Quellen/Links:

 

Advertisements

Ermittlung von Seriennummern von Netzwerkdruckern via NMAP und SNMP (snmpwalk)

Mit Hilfe des Tools nmap ist ein gezielter Scan von vorliegenden Systemen im eigenen Netzwerk möglich. Zur Verbesserung der Geschwindkeit, werden die zu scannenden Ports auf die sinnvollen reduziert um anschließend nach erfolgter Filterung über eine SNMP-Abfrage und der OID: 1.3.6.1.2.1.43.5.1.1.17.1 die Seriennummer abzufragen.

Zur Nutzung dieses Beispiels verwende ich ein Linux mit Debian 6 und die Pakete für snmp und nmap. Die Installation erfolgte als root mit dem Befehl:

  • apt-get install nmap snmp

In diesem Beispiel wird als Voraussetzung eine gleiche Konfiguration der SNMP-Einstellungen am Drucker vorausgesetzt. Im Standard ist oft SNMP aktiviert, die verwendete Version ist meist 2c und der Community-Name ist public.

Von Druckern und teilweise Druckservern werden die folgenden Ports verwendet:

  • 515: LPR/LPD-Port – wird vorwiegend von älteren Druckermodellen verwendet
  • 631: IPP-Port – wird häufig von modernen und auf CUPS-basierenden Druckern verwendet
  • 9100: RAW-Port / direct-IP

Zur Ermittlung von Druckern und Druckserver kann nun der Befehl für ein Teilnetz (Beispiel: 192.168.12.1 bis 192.168.12.254) wie folgt verwendet werden:

nmap -p 515,631,9100 -oG - 192.168.12.0/24 | grep 'Ports:' | grep '631/open\|515/open\|9100/open'

verwendet werden. Die Ausgabe sieht ähnlich der folgenden aus:

  • Host: 192.168.12.10 ()     Ports: 515/open/tcp//printer///, 631/closed/tcp//ipp///, 9100/open/tcp//jetdirect///

Zum nmap-Befehl folgende Informationen:

  • -p 515,631,9100 legt die zu scannenden Ports fest
  • -oG steuert die Ausgabe zur späteren Nutzung von grep
  • 192.168.12.0/24 ist der scannende IP-Bereich. Kann hierbei auch mit Leerzeichen getrennt weitere IP-Bereiche umfassen oder auch einzelne IP-Adressen wie 192.168.12.10
  • | grep ‚Ports:‘ reduziert die Ausgabe auf die Zeilen auf den String Ports:
  • | grep ‚631/open\|515/open\|9100/open‘ reduziert die Ausgabe auf die Zeilen, wo mindesten einer der Ports verwendet wird. \| wird hierbei als logisches ODER verwendet.

In der aktuell bestehenden Variante werden jedoch auch Server mit den entsprechend verwendeten Ports aufgeführt. Zusätzlich sollen nur die IPs und auch nur in Frage kommende Drucker, ausgegeben werden. Zur Reduzierung hilft uns folgende Variante:

nmap -p 445,515,631,901,9100 -oG - 192.168.12.0/24 | grep 'Ports:' | grep -v '445/open' | grep -v '901/open' | grep '631/open\|515/open\|9100/open' | awk '{print $2}'

Die zusätzlichen Ports sind:

  • 445: microsoft-ds
  • 901: samba-swat

Durch | grep -v ‚139/open‘ | grep -v ‚445/open‘ | grep -v ‚901/open‘ wird die Ausgabe um die Systeme reduziert, die mindestens einen der entsprechende Ports aktiv haben. Mit | awk ‚{print $2}‘ wird die Ausgabe auf die IP reduziert.

Damit jetzt die Seriennummer gelesen wird, müssen wir für die jeweils ausgegebene IP den Befehl für den snmpwalk wie folgt verwenden:

snmpwalk -c public -v 2c 192.168.12.10 iso.3.6.1.2.1.43.5.1.1.17.1
Als Ergebnis erhalten wir ähnlich folgende Zeile
iso.3.6.1.2.1.43.5.1.1.17.1 = STRING: "39127xxxxx"

Unter Vorgabe, dass das Ergebnis lesbar ist, soll nur noch die Seriennummer ohne die Anführungszeichen, ausgegeben werden.

snmpwalk -c public -v 2c 192.168.12.10 iso.3.6.1.2.1.43.5.1.1.17.1 | awk '{print $4}' | sed 's/^"\(.*\)"$/\1/'

Ergebnis:

39127xxxxx

Zum snmpwalk-Befehl folgende Informationen:

  • -c: Namen der Community
  • -v: die zu verwendente Version (1, 2c, 3 …)
  • die IP-Adresse und die entsprechende OID für die Seriennummer

Mit | awk ‚{print $4}‘ wird die Ausgabe auf die Seriennummer in Anführungszeichen reduziert und mit | sed ’s/^“\(.*\)“$/\1/‘ werden das erste und letzte Anführungszeichen entfernt.

Jetzt noch alles in einen Befehl übergeben:

nmap -p 445,515,631,901,9100 -oG - 192.168.12.0/24 | grep 'Ports:' | grep -v '445/open' | grep -v '901/open' | grep '631/open\|515/open\|9100/open' | awk '{print $2}' | xargs -i@ snmpwalk -c public -v 2c @ iso.3.6.1.2.1.43.5.1.1.17.1 | awk '{print $4}' | sed 's/^"\(.*\)"$/\1/'

Mit xargs wird die Ausgabe an einen weiteren Befehl übergeben. Die Besonderheit ist jetzt, dass beim Befehl snmpwalk die Position für die IP nicht am Ende des Befehls angefügt wird. Daher muss die Ausgabe im nachfolgenden Befehl festgelegt werden. Dies erfolgt durch den xargs-Parameter: -i und dem Platzhalter @:

... | xargs -i@ snmpwalk -c public -v 2c @ iso.3.6.1.2.1.43.5.1.1.17.1

Epilog:

Durch den hier aufgeführten Befehl ist es für mich, über mehrere Standorte und durch Verwendung von mehreren Teilnetzwerken im Befehl, möglich, von sehr vielen Druckern die Seriennummern zu erfassen. Natürlich gibt es auch hier Abweichungen, die jedoch, bei abweichender Community und/oder Version erneut nach Befehlsanpassungen und der gezielten Ausgabe in eine Datei, ich die Werte ohne Probleme vereinen kann. Bei Druckern mit fehlender Unterstützung gibt es ggf. die Möglichkeit via wget und der entsprechenden Drucker-Seite, die Seriennummer zu erfassen. Bei ggf abweichender OID für die Seriennummer, was mir derzeit nicht bekannt ist, kann am Beispiel mit bekannter Seriennummer, Community-Name und SNMP-Version die OID wie folgt ermittelt werden:

snmpwalk -c public -v 2c 192.168.12.10 | grep '39127xxxxx'
Ergebnis: iso.3.6.1.2.1.43.5.1.1.17.1 = STRING: "39127xxxxx"

Zusätzlich kann es vorkommen, dass die Ausgabe von nmap, mit mehr als 1024 abgefragten Elementen, nicht vollständig ist. Hier hilft ggf folgende Lösung:

sh -c 'echo 4096 > /proc/sys/net/ipv4/neigh/default/gc_thresh3'

Die Verwendung dieses Befehls erfolgt auf eigene Gefahr!

Nachtrag:

Nach einer Vielzahl von Tests habe ich den Befehl zu folgenden verändert.

nmap -p 445,515,631,901,5900,6000,9100,10010 -oG - 192.168.12.0/24 | grep 'Ports:' | grep -v '445/open' | grep -v '901/open' | grep -v '6000/open' | grep -v '5900/open' | grep -v '10010/open'| grep '631/open\|515/open\|9100/open' | awk '{print $2}' | xargs -i@ snmpwalk -c public -v 2c @ iso.3.6.1.2.1.43.5.1.1.17.1 | awk '{print $4}' | sed 's/^"\(.*\)"$/\1/'

Folgende OIDs enthalten je nach Hersteller die Information für die Seriennummer (ggf unvollständig):

  • iso.3.6.1.2.1.43.5.1.1.17.1
  • iso.3.6.1.4.1.1248.1.2.2.1.1.1.5.1
  • iso.3.6.1.4.1.2435.2.3.9.4.2.1.5.5.1.0
  • iso.3.6.1.4.1.2001.1.1.1.1.11.1.10.45.0

Bloggen auf WordPress.com.

Nach oben ↑