sendsms.pl - SMS-Versand mit Bremse
ein Script zum kontrollierten Versand von SMSSendSMS 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.