SendSMS ist ein für Nagios einsetzbares Script zum Versand von SMS über die HTTP-API von SMS-Providern (in diesem Beispiel: www.smstrade.de).

Über die “throttle”(=Drossel)-Funktion lässt sich festlegen, wie viele SMS innerhalb einer bestimmten Zeit versandt werden dürfen. Die Funktion “throttle-by-tag” berücksichtigt insbesondere Nagios-Nachrichten, die ja meist an mehrere Empfänger gerichtet sind. SMS über das gleiche Event werden somit nur als eine Notification gezählt.

Im einfachsten Fall erfolgt der Aufruf wie folgt:

./sendsms.pl --recipient 01793343948 --message "Das ist eine Testnachricht."
OK: SMS has been sent successfully

Anstelle einer Telefonnummer können auch Benutzerkürzel verwendet werden, die im Script in einem Hash deklariert werden:

my %group     = (
        "Simon"           => "491793343948",
        "Alice"           => "492457331221",
        "Bob"             => "4917034227893",
        # groups
        "SystemAdmin"     => "Simon,Alice,Bob");
./sendsms.pl --recipient Simon --message "Das ist eine Testnachricht."
OK: SMS has been sent successfully

Es soll ja Incidents geben, die nicht nur eine SMS auslösen… Wer also gleich mehrere Meldungen auf sein Handy bekommt, weiß ohnehin, dass jetzt “Einloggen und Nachsehen” angesagt ist. Um Nerven, Handy-Akku und letztlich auch den Geldbeutel zu schonen, besitzt das Script eine Drossel-Funktion, die mit der bestimmt werden kann, wieviele SMS pro Zeiteinheit versendet werden dürfen (z.b. max 10 SMS in 15 Minuten). Jede versendete SMS wird in einer Logdatei protokolliert, die jeweils vor dem Versand einer weiteren SMS analysiert wird:

./sendsms.pl --recipient 01793343948 --message "test" --throttle 10,15

wird in /var/log/sendsms.log wie folgt protokolliert:

1314260997  sendsms  sendsms  01793343948  100  (1;10)  test  (1;10)

Die Spalten von links nach rechts bedeuten (Account und Tag s.u.):

  • Unix-Timestamp des Versands
  • Account
  • Tag
  • Empfänger
  • Statuscode des Versands
  • Zähler
  • Nachrichtentext (incl. Zähler)

Übersteigt die Anzahl der ausgelieferten SMS den erlaubten Wert, wird eine Broadcast-Nachricht an die im Key “SystemAdmin” des Hashs group hinterlegten User gesendet:

WARNING: stopping temporarily sending SMS.

Der Inhalt dieser Nachricht dürfte klar sein: ab nun liegt es an Ihnen, sich einen Überblick über das Problem zu verschaffen.

Sobald das Script bei weiteren SMS feststellt, dass innerhalb der letzten 15 Minuten weniger als die erlaubte Anzahl SMS versendet wurde, wird die Drossel entfernt und SMS wieder normal zugestellt.

Falls das Script von mehreren Applikationen aufgerufen wird, lassen sich diese über den Parameter –account voneinander unterscheiden; das Script kann den SMS-Versand somit pro Applikation drosseln:

./sendsms.pl --recipient 01793343948 --message "test" --throttle 10,15 --account nagios1

Der Parameter –tag ist ein Flag, mit dem Nachrichten gleicher Herkunft markiert werden können. Zusammen mit dem Parameter –throttle-by-tag lässt sich das Inkrement des SMS-Zählers auf Nachrichten mit unterschiedlichen Tags einschränken. Bei Nagios bietet sich als Tag das Makro $HOSTEVENTID$ bzw. $SERVICEEVENTID$ an; beide ändern sich pro Event. sendsms drosselt den Versand also nicht nach x SMS, sondern nach x Host/Service-Events:

define command{
        command_name    notify-host-sms
        command_line    /usr/bin/perl /opt/omd/sites/int/bin/sendsms.pl --sender 'Nagios 2E' --recipient $CONTACTPAGER$ --throttle 20,15 --throttle-by-tag --tag $HOSTEVENTID$ --message "Host $HOSTNAME$ is $HOSTSTATE$ ($HOSTOUTPUT$), Date: $LONGDATETIME$\n"
        }

define command{
        command_name    notify-service-sms
        command_line    /usr/bin/perl /opt/omd/sites/int/bin/sendsms.pl --sender 'Nagios 2E' --recipient $CONTACTPAGER$ --throttle 20,15 --throttle-by-tag --tag $SERVICEEVENTID$ --message "Service $SERVICEDESC$ on $HOSTNAME$ is $SERVICESTATE$ ($SERVICEOUTPUT$), Date: $LONGDATETIME$"
        }

Eine Host-DOWN/UP-SMS an drei Empfänger wird somit korrekt als zwei (anstatt sechs) Notifications erkannt:

1314175264  sendsms  11370  +49123  100  (1;20)  Host xen01 is DOWN (CRITICAL - 10.0.3.3: Host unreachable @ 192.168.1.100. rta nan, lost 100%) (1;20)
1314175265  sendsms  11370  +49456  100  (1;20)  Host xen01 is DOWN (CRITICAL - 10.0.3.3: Host unreachable @ 192.168.1.100. rta nan, lost 100%) (1;20)
1314175265  sendsms  11370  +49789  100  (1;20)  Host xen01 is DOWN (CRITICAL - 10.0.3.3: Host unreachable @ 192.168.1.100. rta nan, lost 100%) (1;20)
1314175368  sendsms  11371  +49123  100  (2;20)  Host xen01 is UP (OK - 10.0.3.3: rta 0.873ms, lost 0%), (2;20)
1314175369  sendsms  11371  +49456  100  (2;20)  Host xen01 is UP (OK - 10.0.3.3: rta 0.873ms, lost 0%), (2;20)
1314175369  sendsms  11371  +49789  100  (2;20)  Host xen01 is UP (OK - 10.0.3.3: rta 0.873ms, lost 0%), (2;20)

Das Script sendsms.pl können Sie hier herunterladen. Bitte beachten Sie, dass Sie zuvor einen Account bei einem SMS-Provider eingerichtet haben müssen.