Unsere Nagios-Ampel ist im Einsatz

9. November 2009 | Von | Kategorie: StickyBit
Ampel im OS-T Aufenthaltsraum

Ampel im OS-T Aufenthaltsraum

Nach einigem Hin und Her haben wir dann letzlich doch noch eine ausgediente Ampel über Ebay ersteigern können. Diese Ampel dient uns nun als Signalisierung der Verfügbarkeit unserer Systeme und Netzwerke.

Das nebenstehende Foto zeigt die Ampel im Betrieb. Positioniert haben wir sie im Aufenthaltsraum unseres Schulungszentrums. Doch bevor die Ampel an ihrem neuen Platz ihre neue Funktion wahrnehmen konnte, stand einiges an Arbeit an.

Teststellung aus Relaiskarte und Ampel für unsere Nagios-Ampel

Teststellung aus Relaiskarte und Ampel für unsere Nagios-Ampel

Zunächst musste die Verkabelung der Ampel an unsere neuen Bedürfnisse angepasst werden. Also jede Birne muss separat ansteuerbar sein. Die Schaltung der Lampen übernimmt eine Relaiskarte, die mit einen Parallelport eines ausgedienten Laptops verbunden ist. Um festzustellen, wie der aktuelle Status unserer Systeme und Netzwerke ist greifen wir auf unsere Nagios-Installationen zurück.

Wir haben ein verteiltes Monitoring-System, bei dem der Master als Check-Ergebnisse der Satelliten entgegennimmt, in einer Datenbank speichert und  im Bedarfsfalle Benachrichtugen aussendet. Wir greifen nun mit einem Bash-Skript auf die in der Datenbank gespeicherten Check-Ergebnisse zu und werten diese aus.

#! /bin/bash

# Gruen 4
# Orange 2
# rot 1

# Einstellungen zur DB
DB=<IP-ADRESSE>
USER=ndoutils
PASSWD=nagios
PATH=/usr/bin/
# absoluter Pfad zum Programm zur Steuerung der parallelen Schnittstelle
IOPORT=/home/thorsten/Desktop/io_port

#SQL-Queries zur Abfrage der Status
HOST=$(mysql -u$USER -p$PASSWD -h $DB -e "use ndoutils; select count(*) from nagios_hoststatus where current_state>0;" | /bin/sed -e '1d')
SERVICE=$(mysql -u$USER -p$PASSWD -h $DB -e "use ndoutils; select count(*) from nagios_servicestatus where current_state>0;" | /bin/sed -e '1d')
SERVICESTATEWARNING=$(mysql -u$USER -p$PASSWD -h $DB -e "use ndoutils; select count(*) from nagios_servicestatus where current_state=1;" | /bin/sed -e '1d')
SERVICESTATECRITICAL=$(mysql -u$USER -p$PASSWD -h $DB -e "use ndoutils; select count(*) from nagios_servicestatus where current_state=2;" | /bin/sed -e '1d')
SERVICESTATEUNKNOWN=$(mysql -u$USER -p$PASSWD -h $DB -e "use ndoutils; select count(*) from nagios_servicestatus where current_state=3;" | /bin/sed -e '1d')

if [ "$HOST" = "0" ]; then
 if [ "$SERVICE" = "0" ]; then
 # Ampel auf grün setzen!
 $IOPORT 4
 else
 if [ "$SERVICESTATEWARNING" != 0 ]; then
 # Ampel auf Orange - weil wenigstens ein Service Warning ist
 $IOPORT 2
 else
 if [ "$SERVICESTATEUNKNOWN" != 0 ]; then
 # Ampel auf Rot und Orange  setzen - weil unknown
 $IOPORT 3
 else
 if [ "$SERVICESTATECRITICAL" != 0 ]; then
 #Ampel auf Rot setzen - kritisch
 $IOPORT 1
 fi
 fi
 fi
 fi
else
 # Ampel auf rot setzen!
 $IOPORT 1
fi

exit 0;

Das Bash-Skript fragt zunächst nach den Testergebnissen für die Host- und Service-Checks nach und zwar nach allen, die einen von 0 (OK oder UP) abweichenden Wert haben. Dann wird im Detail noch gefragt, welche unerschiedlichen Service-States wie häufig vorkommen. Diese werden dann im folgenden ausgewertet und die Ampel jenach Situation geschaltet.

Zur Schaltung der Ampel benötigen wir eine kleines Binary, welche mit der parallelen Schnittstelle kommuniziert. Dieses Programm muss später mit Root-Rechten ausgeführt werden. Zwei möglich Wege hierfür entweder SetUID-Bit setzen oder mittels sudo den Zugriff mit entsprechenden Rechten erlauben. Ich habe mal den Quelltext dieses kleinen Progrämmchen angefügt.

#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#include <unistd.h>

/*
Parallelport definieren
*/
#define port 0x378

/*
Programm zur Steuerung einer Relaiskarte über die parallele Schnittstelle.
Als Aufruf-Parameter wird ein Zahl zwischen 0 - 255 erwartet, um entsprechend
die 8 vorhandenen Relais zu steuern.
*/

/*
Berechtigung auf /dev/lp0 setzen
*/
int io_perm(unsigned int ports, unsigned int perm)
{
return ioperm(port,ports,perm);
}

int main(int argc, char *argv[])
{

if(argc!=2) {
 fprintf(stderr,"usage: io_port <value>\n");
 exit(0);
}

int wert = atoi(argv[1]);

if(!(wert>=0 && wert<=255)) {
 fprintf(stderr,"illegal value, please use only values between 0 and 255\n");
 exit(0);
}

if (io_perm(1,1)!=0)
{
 fprintf(stderr,"kein Zugriff. Muss als root laufen !\n");
 exit(1);
}

outb(wert,port);

io_perm(1,0);

return 0;
}

Zu guter Letzt noch ein paar Bildchen unserer Nagios-Ampel:

Relaiskarte für Nagios-Ampel im Testbetrieb

Relaiskarte für Nagios-Ampel im Testbetrieb

Rückansicht unserer Nagios-Ampel

Rückansicht unserer Nagios-Ampel

Nagios-Ampel in 3 Farben beim Einschalten zum Testen der Birnen

Nagios-Ampel in 3 Farben beim Einschalten zum Testen der Birnen

Mit der Ampel haben wir nun eine „Benachrichtigung“ die wir im Vorbeigehen erfassen können.

Post to Twitter Post to Yahoo Buzz Post to Delicious Post to Digg Post to Facebook Post to Ping.fm Post to Reddit

Tags: | | | | | |

Schreibe einen Kommentar

Fühle dich ermuntert einen Kommentar, Anmerkungen, Hinweise oder deine Ideen zum Thema zu hinterlassen. Wir freuen uns über deine Rückmeldung.