SMS Server Tools 3 und Nagios

20. Januar 2010 | Von | Kategorie: StickyBit

Icinga und Nagios stellen eine sehr gute Basis für das proaktive Monitoring von Rechnersystemen, Netzwerken und Applikationen dar. Eine grundlegende Frage stellt sich in diesem Zusammenhang immer wieder: Wie soll über Ausfälle und Störungen berichtet werden. Im Allgemeinen wird auf den Einsatz von Mail und SMS zurückgegriffen. In einem anderen Artikel habe ich bereits eine Möglichkeit vorgstellt, wie SMS mittels wget und http-Anfrage verschickt werden können. Diese Lösung hat jedoch einen gravierenden Nachteil, da sie die korrekte Funktion von Netzwerk-Geräten voraussetzt. Ein (Teil-)Ausfall des Netzwerkes kann auch zum Ausfall der SMS-Benachrichtigung führen.

Im Folgenden werde ich das Verschicken von SMS mittels „getrennter Physik“ erläutern, die keine Netzwerkfunktionalität voraussetzt. Es wird dann jedoch eine Mobilfunk-Verfügbarkeit benötigt. So dass mit eMail und SMS zwei physikalisch getrennte Benachrichtigungswege bestehen. Neben der Einbindung zur Benachrichtigung stelle ich auch direkt notwendige Wege zum Monitoring des Modems und der benötigten Software vor – damit eine Mail-Benachrichtigung versand wird, wenn es Probleme mit dem zweiten Benachrichtigungsweg gibt.

Doch zunächst einmal zum grundlegenden Aufbau. Ich verwende ein CT63-Modem mit entsprechendem Starterpaket, weil  dem Modem selbst keine Antenne beigefügt ist. Das Modem wird per USB – aber auch seriell ist ohne Probleme möglich – an das Monitor-System angeschlossen. Meine Nagios-Installation basiert auf einem Debian-Lenny. Die SMS Server Tools hab ich mittels aptitude installiert. Zunächst muss das Modem für die Zusammenarbeit mit den SMS Server Tools konfiguriert werden.

#vim /etc/smsd.conf

devices = GSM1

logfile = /var/log/smsd.log
loglevel = 7

# Userberechtigungen mit dem die SMS Server Tools ausgeführt werden
user = smsd
group = dialout

# eventhandler führt Skript bei nach jeder Aktion (senden, empfangen) aus
eventhandler=/usr/local/bin/sms_event.sh

stats = /var/log/smsd_stats
stats_interval = 36000
stats_no_zeroes = no

[GSM1]
pre_init = yes
init = ATE0

# Device unter der das Modem angesprochen werden kann
device = /dev/ttyACM0
incoming = yes

# SMS Center Nummer des Mobilfunk-Providers
smsc = 491710760000
mode = new

#pin = 1111

Nach der Konfiguration und dem Neustart (/etc/init.d/smstools restart) der SMS Server Tools können bereits SMS verschickt und empfangen werden. Es gibt verschiedene Möglichkeiten SMS zu verschicken. Eine Möglichkeit ist es ASCII-Dateien zu erstellen und diese in das Spooling-Verzeichnis des SMS Server zu verschieben. Der Aufbau dieser Text-Dateien ist sehr simple:

To:4917011223344

Hello World!

Das ausgehende Spooling-Verzeichnis befindet sich unter /var/spool/sms/outgoing/. Der SMS Server überprüft dieses Verzeichnis regelmäßig und verschickt die enthaltenen SMS automatisch. Aus Sicht von Nagios werden wir ein Skript zur Benachrichtung aufrufen, welches die SMS zusammensetzt und in das Spooling Verzeichnis kopiert. Ich verwende diese Lösung, damit auch die jeweilige SMS nicht länger als 160 Zeichen wird. Letzlich nur um Kosten zu sparen, die zuständige Administratorin wird schon den Meldung im Webinterface nachvollziehen können ;-).

Ein einfaches Beispielskript für die Service-Benachrichtigung könnte wie folgt aufgebaut sein:

#!/bin/bash

# Host und Servicebezeichnung kürzen
HOST=$( echo $1 | cut -c 1-5 )
SERVICE=$( echo $2 | cut -c 1-5 )

STATE=$3
OUTPUT=$4

# Handynummer des Admin
MOBILE=$5

SPOOL=/var/spool/sms/outgoing/

# "Zufalls"-dateinamen erzeugen aus Datum und Mobilfunknummer
NOW=$(date +%s)
RAN=$( echo "$NOW$MOBILE" | md5sum | cut -c 1-8 )

# Zusammenstetzen und kürzen der Nachricht
MSG_RAW="$HOST $SERVICE $STATE $OUTPUT"
MSG_SMS=$( echo $MSG_RAW | cut -c 1-150 )

# SMS im Spool-Verzeichnis hinterlegen
echo -e "To: $MOBILE\r\n\r\n$MSG_SMS" > $SPOOL$RAN

exit 0

Nun muss für Nagios/ Icinga noch eine Command-Definition erfolgen und dieses Command an die entsprechenden Kontakte geknüpft werden.

define command {
command_name      notify_service_by_sms
command_line      /usr/local/nagios/bin/notify_sms.sh $HOSTALIAS$ $SERVICEDESC$ $SERVICESTATE$ $SERVICEOUTPUT$ $CONTACTADDRESS1$
}

Neben dem Service-Kommando muss analog auch ein separates Command für die Host-Benachrichtigung konfiguriert werden. Nagios und dessen Fork werden nun über Störungen der entsprechend konfigurierten Dienste und Hosts mittels SMS benachrichtigt.

Monitoring der Benachrichtigungsinfrastruktur

Nun will ich aber sicherstellen ob unsere Benachrichtigung per SMS auch funktioniert. Und das natürlich auch proaktiv mittels der Monitoring-Software. Nun was ist ausschlaggebend für die Funktionsweise der SMS-Benachrichtigung. Zum einen das korrekte Verschicken einer SMS und vielleicht auch der Empfang, die Mobilfunkqualität und die Verfügbarkeit des Modems. Und in meinem Falle auch noch, ob genügend Guthaben auf dem Konto vorhanden ist.

Für einen grundlegenden Test des Modems setze ich auf passive Testergebnisse, die über die externe Kommandoschnittstelle an Nagios übermittelt werden. Also ein Test zum Verschicken von SMS, ein Test zum Empfang von SMS und einen Test für das vorhandene Guthaben.

Zunächst also die grundlegende Nagios-Konfiguration.

define host {
host_name   GSM-Modem
check_command    check_dummy!0!"Kein Test durchgeführt"
check_period    24x7
address    0.0.0.0
}

Das Modem selbst kann auch noch weiter getestet werden, zum Beispiel, ob das Device vorhanden ist. Dies überspringe ich hier jedoch, weil ich nur die grundlegende weitere Funktion aufzeigen möchte.

define service {
...
host_name GSM-Modem
service_description    Send_SMS
active_checks_enabled   0
passive_checks-enabled   1
check_freshness      1
freshness_threshold   3600
check_command    check_dummy!2!"Es wurde seit über 1 Stunde keine SMS mehr verschickt"
check_period       24x7
}

Da die Testergebnisse passiv ins Nagios laufen, sollte auf jeden Fall eine Prüfung des Alters des Check-Ergebnisses erfolgen. Nun testen wir auch noch den Empfang von SMS.

 define service {
 ...
host_name GSM-Modem
 service_description    Receive_SMS
 active_checks_enabled   0
 passive_checks_enabled   1
 check_freshness      1
 freshness_threshold   3600
 check_command    check_dummy!2!"Es wurde seit über 1 Stunde keine SMS mehr empfangen!"
 check_period       24x7
 }

Bei Prepaid-Karten ist dringend empfohlen das vorhanden Guthaben ebenfalls zu testen.

 define service {
 ...
host_name GSM-Modem
 service_description    Prepaid
 active_checks_enabled   0
 passive_checks_enabled   1
 check_freshness      1
 freshness_threshold   90000
 check_command    check_dummy!2!"Es wurde seit über 1 Tag kein Guthaben-Testergebnis mehr empfangen!"
 check_period       24x7
 }

Da die Prüfung des verfügbaren Guthabens mittels SMS realisiert werden kann. Werden wir dies direkt zum Testen der Anbindung testen. Vom Ablauf her wird zunächst eine SMS zur Abfrage des Guthabens verschickt, auf diese SMS antwortet der Provider mit einer automatisch generierten SMS, die SMS des Providers muß dann noch auf das verfügbare Guthaben geprüft werden.

Um die Tests durchzuführen setzen wir auf ein Feature der SMS Server Tools auf. Die SMS Server Tools können nach jeder Aktion ein weiteres Programm aufrufen. In  meinem Falle habe ich hierfür bereits in der smsd.conf den Parameter eventhandler an ein Bash-Skript gebunden, welches nun beim Versenden und beim Empfang von SMS durchlaufen wird.

Mit Hilfe dieses Eventhandlers werden wir die Events überwachen und damit auch das Versenden von SMS, Empfangen und das vorhandene Guthaben überwachen. Die Überwachung erfolgt nun anhand des folgenden Skriptes, welches als Eventhandler eingesetzt wird.

#!/bin/bash

NOW=$(date +%s)
CMDFILE=/var/lib/nagios3/rw/nagios.cmd

case "$1" in
 RECEIVED)
# Nagios benachrichtigen das eine SMS empfangen wurde
 /usr/bin/printf "[%lu] PROCESS_SERVICE_CHECK_RESULT;GSM-Modem;Receive_SMS;0;OK - SMS erfolgreich empfangen\n" $NOW > $CMDFILE

# Extrahieren und Vergleich des Guthabens
IST=$(cat $2 | grep Kontostand | cut -f 3 -d " ")
 if [ -z "$IST" ]
   then
      # Diesen Zweig werde ich in einem anderen Artikel wieder aufgreifen
      echo $1 $2 $3 "- Keine Guthaben-SMS" >> /tmp/sms.receive.log
   else
      if [ $( echo "if ($IST>=4.00) 1 else 0" | bc ) -eq 0 ]
      then
         /usr/bin/printf "[%lu] PROCESS_SERVICE_CHECK_RESULT;GSM-Modem;Prepaid;2;WARNING - Prepaid-Guthaben kleiner 4.00 Euro\n" $NOW > $CMDFILE
      else
         /usr/bin/printf "[%lu] PROCESS_SERVICE_CHECK_RESULT;GSM-Modem;Prepaid;0;OK - Prepaid-Guthaben ausreichend\n" $NOW > $CMDFILE
      fi
      rm $2
 fi
 ;;
 SENT)
 /usr/bin/printf "[%lu] PROCESS_SERVICE_CHECK_RESULT;GSM-Modem;Send_SMS;0;OK - SMS erfolgreich verschickt\n" $NOW > $CMDFILE
 ;;
 *)
 echo $NOW $1 $2 $3 >> /tmp/sms.log
 ;;
esac

exit 0

Für das Verschicken der SMS habe ich einen Cron-Job eingerichtet der eine ASCII-Datei mit der SMS in das entsprechende Spooling-Verzeichnis kopiert. Die Interpretation des Guthabens wird von Mobilfunk-Provider zu Provider unterschiedlich sein, so das eine Anpassung der Interpretation der SMS erforderlich sein kann. In meinem Beispiel handelt es sich um maxxim.de als Provider.

Soweit zur grundlegenden Einrichtung der SMS-Benachrichtigung mittels SMS Server Tools und einem CT63-GSM-Modem. Durch die eingerichteten Tests wird die grundlegenden Funktionalität des Modems und der Benachrichtigung durchgehend getestet. Da ich das Guthaben der Prepaid-Karte regelmässig prüfen muss, habe ich hier nichts zur Prüfung der Signalstärke geschrieben, so lange die SMS verschickt wird, ist auch die Mobilfunk-Qualität ausreichend. Neben dem Verschicken und Empfangen sollte auch das Vorhandensein der smsd-Prozesse geprüft werden. Es gibt  weitere Möglichkeiten das GSM-Moden zu testen. Aber dazu sicherlich später in einem separatem Artikel.

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.