Passerelle sms avec postfix et smstools

Pour le monitoring d’une salle serveurs je souhaite utiliser une sonde de température sachant envoyer des alertes par email. Or je préfère recevoir un sms, mais cette sonde n’a pas la fonctionnalité. J’ai dû trouver un moyen de le faire à sa place…


Mon serveur Nagios possèdait déjà une carte pcmcia sony ericson qui fait wifi et GSM, récemment remplacée par une carte pcmci SFR 3G Vodafone.

Un « lspci », pour la carte Sony, sur mon serveur me donne ceci:

...
00:0a.0 CardBus bridge: Ricoh Co Ltd RL5c475
( L'adptateur PCMCIA / PCI pour plugger la carte dans mon serveur )
...
02:00.0 Network controller: Broadcom Corporation BCM4306 802.11b/g Wireless LAN Controller (rev 03)
( L'interface WIFI de la carte Sony )
02:00.1 Serial controller: Broadcom Corporation BCM4306 UART (rev 03)
( La connexion "serie" du GSM qui est sur mon serveur ttyS1, comme me l'indique dmesg )

Pour la carte SFR, le port sera différent, comme vous le verrez dans le fichier de configuration.

Sur mon serveur, j’ai utilisé un adapteur pci/pcmcia, car j’ai récupéré une carte sony ericson orange lors du changement de matériel de nos commerciaux.

Un autre usage du sms peut se faire avec un téléphone portable et un câble USB ou série fourni par son constructeur en option.

Mais la carte me va bien, car pas de fils qui dépassent… 🙂

Paramétrage smstools

Mon serveur est installé avec une debian ETCH toute propre.
La debian a installé les modules pcmcia, vu que j’avais monté ma carte avant de procéder.

Je viens de vérifier que le système voit bien ma carte GSM au niveau matériel, j’ai fais un essai de déconnexion et re-connexion de la carte pcmcia, et la console m’affiche bien des messages m’indiquant ces modifications. Bref, jusqu’ici tout va bien…

J’installe le serveur sms avec la commande :

aptitude install smstools

L’installeur crée un fichier /etc/smsd.conf dans lequel j’adapte la configuration en fonction de ma carte modem.

Ici la configuration pour ma carte sony/ericson GC79


devices = GSM1
logfile = /var/log/smstools/smsd.log
infofile = /var/run/smstools/smsd.working
pidfile = /var/run/smstools/smsd.pid
outgoing = /var/spool/sms/outgoing
checked = /var/spool/sms/checked
failed = /var/spool/sms/failed
incoming = /var/spool/sms/incoming
sent = /var/spool/sms/sent
stats = /var/log/smstools/smsd_stats
autosplit = 3

# Modem configuration
[GSM1]
init = AT+CFUN=1,1
mode = new
device = /dev/ttyS1
incoming = no
pin = 0000
baudrate = 115200
rtscts = yes
cs_convert = yes

Remarque : la commande init indiquée ici sert à commuter la carte en gsm si je me souviens bien, je n’ai pas trouvé ce genre de paramètre pour des téléphones portables au cours de mes recherches.

Ici la configuration pour ma nouvelle carte pcmcia 3G SFR Vodafone


devices = GSM1
logfile = /var/log/smstools/smsd.log
infofile = /var/run/smstools/smsd.working
pidfile = /var/run/smstools/smsd.pid
outgoing = /var/spool/sms/outgoing
checked = /var/spool/sms/checked
failed = /var/spool/sms/failed
incoming = /var/spool/sms/incoming
sent = /var/spool/sms/sent
stats = /var/log/smstools/smsd_stats
autosplit = 3

[GSM1]
memory_start=0
mode = new
device = /dev/ttyUSB0
incoming = no
pin = 0843
baudrate = 115200
rtscts = yes
cs_convert = yes

Le device doit correspondre au port de votre connexion au GSM.
Je ne fais que des sms sortants, donc « incoming = no ».
Le pin est bien entendu important, adptez-le à votre cas.
Le baudrate peut changer aussi suivant le matériel, impossible de faire fonctionner la carte sony avec du 9600 ou 19200 dans mon cas.
Les options mode, rtscts, et cs_convert indiquées ici, ont enlevé l’aspect aléatoire de mes envois sms. Je ne sais pas vraiment à quoi ils servent, mais ça fonctionne !! 🙂

Le smstools de debian ne créent pas le script pour envoyer des messages directement. On est obligé de copier /usr/share/doc/smstool…/examples/scripts/sendsms dans /usr/local/bin, puis de faire un chmod +x /usr/local/bin/sendsms.

J’ai aussi modifié ce script afin de remplacer le propriétaire des fichiers a émettre. Quand je faisais des tests avec mon compte root, smsd me disait qu’il ne pouvait pas lire les messages par manque de droits sur /var/spool/sms/outgoing, son « spool » SMS.

Le script /usr/local/bin/sendsms ressemble à ceci maintenant :

#!/bin/sh
# This script send a text sms at the command line by creating
# a sms file in the outgoing queue.
# I use it for testing.

# $1 is the destination phone number
# $2 is the message text
# if you leave $2 or both empty, the script will ask you

DEST=$1
TEXT=$2

if [ -z "$DEST" ]; then
printf "Destination: "
read DEST
fi

if [ -z "$TEXT" ]; then
printf "Text: "
read TEXT
fi

FILE=`mktemp /var/spool/sms/outgoing/send_XXXXXX`
chown smsd $FILE

echo "To: $DEST" >> $FILE
echo "" >> $FILE
echo "$TEXT" >> $FILE

Pour valider le fonctionnement du serveur sms voici la syntaxe à utiliser :

echo Messge Test | sendsms +336XXXXXXXX

La syntaxe du numéro est la syntaxe internationale, 33 pour la France, pas de 0 dans le numéro , puis le complément du numéro.

Vous devriez recevoir rapidement un joli SMS sur votre portable.

Paramétrage de la passerelle mail –> SMS

Debian installant exim, je le remplace par postfix.

aptitude -y install postfix

J’installe aussi sudo pour palier à tout problème de droits sur un périphérique nécessaire au bon fonctionnement des scripts.

aptitude -y install sudo

J’utilise un programme permettant de « nettoyer » le mail des caractères qui pourraient ne pas passer en sms, nommé mail2sms.

Pour installer mail2sms :

aptitude install build-essential
wget http://daniel.haxx.se/projects/mail2sms/mail2sms-1.3.5.tar.gz
tar xzvf mail2sms-1.3.5.tar.gz
cd mail2sms-1.3.5
./configure
make
cp mail2sms /usr/local/bin/mail2sms

Je crée un compte nommé sms que je place dans le groupe smsd créé par smstools.

useradd -m -g smsd sms

C’est ce compte qui recevra les emails, puis procmail les renverra au système SMS.

On modifie le fichier /etc/postfix/main.cf en ajoutant ou modifiant ces variables :

myhostname = smsgateway.mondomaine.fr
mydomain = mondomaine.fr
myorigin = $myhostname

mydestination = smsgateway.mondomaine.fr, smsgateway, localhost

mynetworks = IP.DE.MON.RESEAU/24, 127.0.0.0/8

mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0

# inet_interfaces = loopback-only
inet_interfaces = all

recipient_delimiter = +
local_destination_concurrency_limit = 1

Dans le dossier /home/sms, je crée les fichiers suivants :

.forward , dont le contenu est :

"| exec /usr/bin/procmail -t -a $EXTENSION"

.procmailrc , dont le contenu est :

SHELL=/bin/sh
# LOGFILE = $HOME/procmail.log
# LOGABSTRACT="all"
# VERBOSE="on"

ARG=$1

:0 fW: sendsms.lock
| /usr/local/bin/mail2sms -c /home/sms/mail2sms.conf -o | /usr/bin/sudo /usr/local/bin/sendsms $ARG

et enfin mail2sms.conf ( sans . devant ) dont le contenu est :

##############################################################################
# First-line stuff in replies:
#
options: once body # a few options please
log: On-wrote junk
search: "^(On .* wrote:)"
replace:

##############################################################################
# Quoted lines:
#
options: body prio 2
search: ^ *>.*
log: quote-removal
replace:

##############################################################################
# Initial spaces
#
options: fullbody prio 2 subject
search: "^ +"
log: spaces in the beginning of lines
replace:

##############################################################################
# "re:" parts in subjects
#
options: subject nocase
search: .*(Re|Ang|Sv)(\[.*\]|): *
log: re/ang/sv-stuff in subject lines
replace:

##############################################################################
# Sequences of weird letters only one of them
#
options: fullbody prio 4
search: "([-\.=!+*#;:,~!&])2,"
log: multiple weirdo letters
replace: \1

##############################################################################
# Remove space between certain punctuation letters.
#
options: fullbody prio 4
log: non-alnum, space, non-alnum => remove space
search: "([-*!=.,]) ([-*!=.,])"
replace: \1\2

##############################################################################
# Remove space after non-word symbols
#
log: Remove spaces after symbols
options: prio 4
search: "(\W) +"
replace: \1

##############################################################################
# Cut off parentheses from From names.
#
options: from
log: cut off parantheses junk
search: \([^)]*\)
replace:

##############################################################################
# Cut off known domain names from email addresses
#
log: cut off @*.frontec.se domains
search: @(....|)frontec.se
replace: ""

##############################################################################
# URLs don't do any good in SMS messages:
#
options: nocase
log: remove http/ftp-URL
search: (http|ftp)://[a-z0-9.~/-]*
replace: (URL)

##############################################################################
# Output with two extra spaces:
#
#output: "$subject\r\n$body"
output: "$subject - $body"

On s’assure que le propriétaire est bien le compte sms avec les commandes suivantes :

chown sms: /home/sms/.forward
chown sms: /home/sms/.procmailrc
chown sms: /home/sms/mail2sms.conf

On paramètre sudo en lançant la commande « visudo ».

On ajoute cette ligne au fichier et on enregistre :

%smsd ALL=(ALL) NOPASSWD: /usr/local/bin/sendsms

On recharge la configuration de postfix avec la commande « /etc/init.d/postfix restart« .

Voila qui est fait !

Vous pouvez maintenant envoyer un email à sms+336xxxxxxxx@smsgateway.mondomaine.fr et normalement, vous le recevrez dans la foulée.

Attention tout de même !

SMS = Small Messages, donc pas de signatures tarabiscotées ou de mails de 3 pages ! 🙂

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.