SMS-Versand mit wget – Nagios-Benachrichtigung mal anders

8. April 2009 | Von | Kategorie: Monitoring | Availability

Nagios ist das verbreiteste OpenSource Netzwerk- und Systemüberwachungswerkzeug. Es ist flexibel einsetz- und erweiterbar und kann an die unvorstellbarsten 😉 Netzwerk- und Systemarchitekturen angepasst werden . Ein weiterer Vorteil stellt auch das ausgefeilte Benachrichtigungssystem dar. Letztlich könnte jedes Programm oder Skript, welches in irgendeiner Art eine Ausgabe produziert, in das Benachrichtigungssystem eingebunden werden.

Oftmals wollen Systemadminstratorinnen und -adminstratoren auch per SMS über den Ausfall eines Dienstes, Hardware oder eines ganzen Systems benachrichtigt werden. Die Konfiguration von SMS-Benachrichtigung stellt jedoch immer wieder eine besondere Herausforderung dar. Ich will eine einfache Möglichkeit vorstellen, mit der  Benachrichtigung per SMS verschickt werden, ohne sich lange Gedanken um Modems, Handyanbindung oder sonstigen zusätzlicher Hardware machen zu müssen.

Wir verschicken SMS einfach per wget – ja richtig, das kleine Werkzeug zum herunterladen von Daten. Wie die aufmerksame Leserin und der aufmerksame Leser sich denken können, wird hierfür allerdings eine funktionstüchtige Internetverbindung des Nagios-Rechner benötigt. Aber für die kleine (Firmen-)Lösung ist dies auf jeden Fall eine sinnvolle Ergänzung zur ausschließlichen Mail-Benachrichtigung, die in den meisten Fällen ebenfalls eine Internetverbindung voraussetzt.

Zunächst wird ein SMS-Provider benötigt, der ein Verschicken von SMS auch per Webbrowser erlaubt. Wir haben uns in einem Falle für den kostenpflichtigen Dienstanbieter Maxxim.de entschieden. Dieser ermöglicht das Verschicken von SMS per URL-Aufruf und ist mit aktuell 8 Cent/ SMS auch recht günstig.

Da eine Authentifizierung beim Dient notwendig ist, verwenden wir zum automatischen Verschicken wget, welches bei allen gängigen Linux-Distributionen im Standard-Repository enthalten sein sollte. Mit wget ist es möglich mit den Parameter –user und –password die Authentifizierungangaben zu übermitteln. Bei maxxim.de ist die SMS auf 140 Zeichen beschränkt.

Zunächst ist für das Verschicken der SMS ein Bash-Skript zu erstellen, welches von Nagios die notwendigen Informationen erhält, dieser in eine entsprechende Form bringt und anschließend an den SMS-Provider überträgt. Es sind zwei unterschiedliche Bash-Skripte erforderlich. Eines für die Host- und eines für eine Service-Benachrichtigung. Hier hab ist nur das Skript für die Services aufgeführt, aber das Host-Skript sieht sehr ähnlich aus.

#! /bin/bash
# Skript zum Verschicken von SMS im Fehlerfalle
HOST=$1
SERVICE=$2
STATE=$3
FEHLER=$4
VORWAHL=$5
NUMMER=$6

MSG_RAW="$HOST $SERVICE $STATE $FEHLER"

# Normierung der Ausgabe auf 140 Zeichen
MSG_SMS=$( echo $MSG_RAW | cut -c 1-140 )

# Normierung der Sonderzeichen auf HTML
MSG_ENC=$( php -r "echo urlencode(\"$MSG_SMS\");";)

#Ausgaben werden im /tmp-Verzeichnis abgelegt, ansonsten Ausgabe nach /dev/null verschieben
cd /tmp
/usr/bin/wget --user=0123456789 --password=XXXXXX "https://service.maxxim.de/maxxim/sms-neu.php?zeichenanzahl=140&TEXT=$MSG_ENC&ZEICHEN=0&vorwahl=%2B$VORWAHL&nummer=$NUMMER&sende=Absenden&action=&unteraction=abschicken"

Das entsprechende Benachrichtigungskommando für die Service-Benachrichtigung sieht wie folgt aus:

define command {
command_name    notify-service-by-sms
command_line    /etc/nagios3/conf.d/commands/skripts/sms_service.sh $HOSTNAME$ "$SERVICEDESC$" $SERVICESTATE$ "$SERVICEOUTPUT$" $CONTACTADDRESS1$ $CONTACTADDRESS2$
}

Ein entsprechender Kontakt, der mittels SMS benachrichtigt wird, benötigt die Definition einer Vorwahl und einer Nummer. Diese werden mittels den addressX-Parametern innerhalb der Kontakte definiert.

define contact {
contact_name                    sms_thorsten
alias                           Thorsten Robers
service_notification_period     24x7
host_notification_period        nonworkhours
service_notification_options    w,u,r,c
host_notification_options       d,u,r
service_notification_commands   notify-service-by-sms
host_notification_commands      notify-host-by-sms
email                           thorsten@os-t.de
address1                        49172
address2                        1234567890
}

Mit dieser Konfiguration lässt es sich gleich noch besser schlafen. Vorausgesetzt das Handy liegt in Hörweite zum Bett 😉

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

Tags: | | |

3 Kommentare
Hinterlasse einen Kommentar »

  1. String Manipulation mit Bash:
    http://tldp.org/LDP/abs/html/string-manipulation.html

    und php für encoding finde ich overkill. Wie wäre es mit folgendem?
    MSG_ENC=$( echo „Text to send “ | od -t x1 -A n | tr “ “ % )

  2. Hallo Gerd,

    klar so geht es auch.

    Hin und wieder sind die Dinge so naheliegend, das sie einem nicht mal mehr ins Auge springen wollen. 😉

    Danke dir für den Hinweis.

  3. Eine kleine Anmerkung erreichte uns von Markus Jungwirth von der Thomas Krenn AG, die ich hier gerne zur Verfügung stelle.

    Markus realisiert die SMS-Benachrichtigung mittel sms77.de. Das Verschicken der SMS ist fast identisch zu dem oben vorgestellten Verfahren.

    Neue zeile im sms-send-script:
    /usr/bin/wget -q -O /etc/nagios/tkag/scripts/sms_service.output „http://gateway.sms77.de/?u=username&p=password&to=$NUMMER&text=$MSG_ENC&type=quality&from=NAGIOS“

    SMS77.de stellt darüber hinaus auch die Möglichkeit der Online-Abfrage des Prepaid-Guthabens zur Verfügung. Dies lässt sich dann auch prima mit dem folgenden Skript monitoren.

    #!/bin/bash
    ##get sms-baclace from http-api
    BALANCE=`wget -q -O – „http://gateway.sms77.de/balance.php?u=username&p=password“`
    BALANCEINT=${BALANCE/.*}
    EXIT=0
    ##check if error is returned
    if [ $BALANCEINT -gt 100 ]
    then
    EXITMSG=“CRITICAL – Check-Error-Code“
    EXIT=2
    fi
    ##check if balance is under 2€
    if [ $BALANCEINT -lt 2 ]
    then
    EXITMSG=“CRITICAL – Zu wenig Guthaben: $BALANCE“
    EXIT=2
    fi
    ##check if balance is under 5€
    if [ $BALANCEINT -lt 5 ]
    then
    EXITMSG=“WARNING – Zu wenig Guthaben: $BALANCE“
    EXIT=1
    fi
    ##print balance
    if [ $EXIT -eq 0 ]
    then
    EXITMSG=“OK – Aktuelles Guthaben: „$BALANCE
    EXIT=0
    fi
    echo $EXITMSG;
    exit $EXIT;

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.