Home > URT > SMS-Gateway mit Siemens TC35i

SMS-Gateway mit Siemens TC35i

Zur Unterstützung der Rechnerüberwachung an der Universität Trier wurde ein Nagios-System eingerichtet, welches in regelmäßigen Abständen die Funktion wichtiger Systeme testet und ggf. die Administratoren über Probleme benachrichtigt. Allerdings gab es zuerst nur die Benachrichtung per E-Mail, sodass der Problembericht unter Umständen erst sehr spät zugestellt wurde, was in Ausnahmefällen weitere Probleme verursacht. Deswegen gab es den Wunsch, eine schnellere Benachrichtigung einzubauen, in diesem Fall per SMS.

Als Hardware verwenden wir ein Siemens TC35i auf einem Ubuntu 8.04 Serversystem. Da das Modem per Serielle Schnittstelle angesprochen wird, sollte eine solche am Rechner vorhanden sein (oder per USB-Adapter nachgerüstet werden).

Linux bietet ein Programm namens smstools, welches eigentlich genau die Funktion eines SMS-Gateways übernehmen können soll. Nach vielen Versuchen und gleichbleibend niedrigem Erfolg (null ist einfach null) wurden die smstools in den Mond geschossen, mehr oder weniger per Zufall bin ich über das Programm gnokii gestolpert, welches ich noch von Synchronisations-Versuchen mit meinem Handy kannte. Diese Tool hat aber noch weitere nette Funktionen, die wir hier gut gebrauchen konnten.

Als Vorbereitung sollte man sich eine SIM-Karte besorgen, die in der Lage ist, SMS zu versenden (ausreichend Guthaben, PIN bekannt, …). Man sollte die PIN-Eingabe deaktivieren, um weiteren Problemen in dieser Richtung aus dem Weg zu gehen.

Auf dem Zielsystem sollte man als nächstes einen neuen Benutzer und eine neue Gruppe einrichten, um die Rechte der später verwendeten Scripts einzuschränken. Wahnsinnige oder lebensmüde Administratoren dürfen aber auch gerne den root-Benutzer verwenden. Außerdem installieren wir direkt gnokii zur Kommunikation mit dem Modem und xinetd als Empfänger der zu versendenden SMS. (Bei den folgenden Befehlen gehe ich davon aus, dass man als root auf dem System unterwegs ist.)

useradd -d /home/smsd -m smsd
apt-get install gnokii gnokii-cli gnokii-common xinetd

Als weiteren Schritt fügt man den neu erstellten Benutzer smsd in die Gruppe dialout ein, damit dieser Benutzer auf die seriellen Schnittstellen zugreifen kann.

Dann wechselt man zum Benutzer smsd und geht legt in dessen Homeverzeichnis die Datei .gnokiirc mit folgendem Inhalt an (unter der Vorraussetzung, dass das Modem an /dev/ttyS0 angeschlossen ist, bitte nicht den Punkt im Dateinamen vergessen):

[global]
port = /dev/ttyS0
model = AT
initlength = default
connection = serial

Nun sollte man auf das Modem zugreifen können. Testen kann man dies mit folgendem Befehl:

gnokii –identify

Wenn man nicht zum Benutzer smsd gewechselt hat, bekommt man nun einen schicken Fehler, einfach wechseln, dann findet er auch die Datei mit den Einstellungen zum Modem und spuckt irgendetwas Nettes aus. Nun basteln wir ein Shellscript, welches von xinetd aufgerufen wird und die SMS an gnokii übergibt. Diese Datei nennen wir sendsms.sh (ebenfalls im Home von smsd):

#!/bin/bash
LOGFILE=/home/smsd/sendsms.log
CONFFILE=/home/smsd/.gnokiirc

read telnr
read text
while read line
do
text=”$text\n$line”
done
echo ========= `date +’%d.%m.%Y %H:%M’` =========== >> $LOGFILE
echo -e “SMS TO $telnr FROM $REMOTE_HOST” >> $LOGFILE
echo “== BEGIN ==” >> $LOGFILE
echo -e “$text” | sed -e “s/ *$//” >> $LOGFILE
echo “== END ==” >> $LOGFILE
echo -e “$text” | sed -e “s/ *$//” | gnokii –config $CONFFILE –sendsms “$telnr” >> $LOGFILE
echo “gnookii return code was: $?” >> $LOGFILE

Dieses Script liest aus der ersten Zeile der ankommenden Daten die Handynummer aus, an welche die SMS übertragen werden soll. Der restliche Text (bis zum EOF) wird als Inhalt der SMS verschickt. Damit man das Programm auch ausführen kann, ändern wir die Rechte ein wenig:

chmod u+x /home/smsd/sendsms.sh

Als nächstes überzeugen wir xinetd davon, an einem Port zu lauschen und bei Dateneingang unser kleines Sendescript aufzurufen. Dies tun wird durch Erstellen der Datei (wieder als root) /etc/xinetd.d/smsd:

service smsd
{
id = smsd
type = UNLISTED
socket_type = stream
protocol = tcp
port = 1254
wait = no
user = smsd
group = smsd
groups = yes
server = /home/smsd/sendsms.sh
}

Jetzt schnell noch xinetd neustarten:

/etc/init.d/xinetd restart

Nun sollte der Versand funktionieren. Eine kleine Testsequenz mit dem Programm netcat:

echo -e “+49123456789\nHello world!” | netcat -q 0 12.34.56.78 1254

Diese Zeile sendet an die Handynummer +49123456789 eine SMS mit dem Text “Hello world!”. In diesem Fall wird davon ausgegangen, dass die IP des Gateways 12.34.56.78 ist. Den Port kann man übrigens in der xinetd-Konfiguration erstellen.

Es macht übrigens Sinn, per iptables eine kleine Firewall einzurichten, wer verschicken darf und wer nicht, ansonsten kann nämlich jeder darauf zugreifen, der irgendwie an den Rechner kommt. Ganz Fleißige können natürlich auch eine Authentifikation einbauen.

Wer möchte, kann natürlich auch andere Benutzernamen, Pfade usw. verwenden, ein gewisses Grundverständis von Linux-System wird dabei jedoch vorausgesetzt.

Erweiterungen (TODOs):

  • Abfragen eingehender SMS, um Blockadesituationen bei vollem SMS-Speicher zu vermeiden
KategorienURT Tags: ,
  1. 4. Februar 2009, 12:15 | #1

    Wow, vielen Dank für die detaillierte Beschreibung, hat mir sehr geholfen. Es ist echt gut zu wissen, dass aller Wahrscheinlichkeit irgendein anderer user das eigene Problem schonmal durchgemacht hat und seine Erfahrungen mit der Community teilt. So kann man sich meistens wirklich recht einfach selbst helfen. Hoffentlich teilen die Leute ihr Wissen auch weiterhin so bereitwillig. Danke nochmal!

  2. 4. Februar 2009, 12:22 | #2

    Nichts zu danken, schließlich nehme ich auch oft die Hilfe der “Öffentlichkeit” in Anspruch, auf diese weise ist das also auch nur eine “Revanche”. So sieht die Open-Community-Welt eben aus: Ein stetiges Nehmen und Geben ;)

  1. Bisher keine Trackbacks