Munin Daten in Plugin verarbeiten

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
haenschen
Beiträge: 2
Registriert: 22.02.2014 20:50:49

Munin Daten in Plugin verarbeiten

Beitrag von haenschen » 22.02.2014 21:02:12

Hallo,
ich habe auf meinem Raspberry Munin installiert um die Parameter meiner Heizungsanlage zu visualisieren. Die Installation und Inbetriebnahme von Munin funktionierte ohne Probleme und die Parameter vom Raspberry (auf dem Munin installiert ist) werden alle als Graph angezeigt.
Um die Parameter meiner Heizungsanlage zu visualisieren habe ich ein Plugin erstellt und überprüft.
Das Plugin funktioniert auch aber der mir scheint meine Vorgehensweise etwas kompliziert zu sein.
Zur Erklärung: vclient baut eine Verbindung auf die Adresse 192.168.178.24 auf und führt den Befehl getTempA aus.

Code: Alles auswählen

 /usr/local/bin/vclient -h 192.168.178.24:3002  -c getTempA -o /vito/test.txt 
Die Ausgabe sieht folgender Maßen aus:
getTempA:
6.400000 Grad Celsius

Um die Parameter für den Graphen zu erstellen lasse ich die Ausgabe in ein Textfile schreiben (-o /vito/test.txt ) und frage danach das Textfile mit folgenden Parametern ab:

Code: Alles auswählen

printf "load.value "; cat /vito/test.txt | head -n2 | tail -n1 | cut -d' ' -f1 
Die Ausgabe sieht danach folgender Maßen aus:
load.value 5.800000

Alles funktioniert wunderbar. Ich möchte aber nicht den Umweg über ein Textfile machen, sondern die Ausgabe direkt im Plugin verarbeiten und mein Daten für den Graph erzeugen.
Hat jemand eine Idee wie ich dies realisieren kann.

Gesamtes Plugin:

Code: Alles auswählen

#!/bin/sh

case $1 in
   config)
        cat <<'EOM'
graph_title test 
graph_vlabel test2 
graph_args --base 1000 -l 0
graph_scale no
graph_category system
load.warning 10
load.critical 120
graph_info The load average
load.label test3 
EOM
        exit 0;;
esac

/usr/local/bin/vclient -h 192.168.178.24:3002  -c getTempA -o /vito/test.txt
printf "load.value "; cat /vito/test.txt | head -n2 | tail -n1 | cut -d' ' -f1

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Munin Daten in Plugin verarbeiten

Beitrag von Cae » 23.02.2014 00:26:55

Code: Alles auswählen

printf "load.value "
/usr/local/bin/vclient -h 192.168.178.24:3002  -c getTempA -o /dev/stdout \
| head -n2 | tail -n1 | cut -d' ' -f1
Und falls das Programm ohne -o direkt auf stdout schreibt, kann man -o /dev/stdout auch weglassen. Ausserdem koennte man anstatt des head|tail|cut-Konstruktes awk einsetzen, was Pipes und damit fork()s spart:

Code: Alles auswählen

/usr/local/bin/vclient -h 192.168.178.24:3002  -c getTempA \
| awk '2==NR{print("load.value "$1)}'
printf sollte zwar ein Shell-Builtin sein, aber es wird ebenso eingespart. Der awk-Aufruf druckt fuer die zweite Zeile (NR zaehlt normalerweise die Zeilen durch, beginnend mit 1) den String load.value und dann das erste Feld ($1) dieser Zeile.

Uebrigens koennte deine bisherige Vorgehensweise ein Sicherheitsrisiko sein, da ein Angreifer einen Symlink von /vito/test.txt auf eine beliebige andere Datei setzen kann, sofern er dort Schreibrechte hat. Das Ziel des Symlinks wuerde bei jedem Aufruf des Skriptes ueberschrieben. Solche Fehler sind insbesondere fuer /tmp/ typisch; dein /vito/ hat dagegen vermutlich restriktivere Schreibberechtigungen. Generell empfiehlt sich bei so etwas die Verwendung von mktemp, welches zufaellige Dateinamen vergibt und diese vorher auf Existenz prueft.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

haenschen
Beiträge: 2
Registriert: 22.02.2014 20:50:49

Re: Munin Daten in Plugin verarbeiten

Beitrag von haenschen » 23.02.2014 17:54:36

Scheint mir alles plausibel zu sein.

Ich habe die Änderungen vorgenommen und erhalte jetzt folgende Ausgabe

Code: Alles auswählen

getTempA:
7.100000 Grad Celsius
das zählen und die Ausgabe scheint nicht richtig zu funktionieren. Was mir noch aufgefallen ist das das Script nicht automatisch beednet wird

Antworten