mardi 9 juin 2009

Contrôler le crédit sur une carte SIM avec Nagios

Il est inutile de présenter Nagios, un système de monitoring très populaire et flexible.

J'ai la chance d'avoir a disposition, depuis mon serveur Nagios, un modem GSM très pratique pour envoyer des SMS d'alerte en cas de problème sur un service quelconque. Pour l'envoi de SMS, j'utilise SMSTools, qui s'installe sous la forme d'un daemon prenant le contrôle
du modem, et d'un répertoire de spooling (/var/spool/sms) dans lequel on dépose les messages sortants, au format adéquat.

Pour rendre la chose plus facile, il existe également un script d'envoi simple (sendsms) qui a l'avantage d'éviter les problèmes classiques aux répertoires de spool (conditions de course, etc..). Nagios se configure très simplement pour envoyer des notifications:

define command{
command_name notify-host-sms
command_line /usr/local/sbin/sendsms $CONTACTPAGER$ "'Host $HOSTNAME$ is $HOSTSTATE$'"
}

define command{
command_name notify-service-sms
command_line /usr/local/sbin/sendsms $CONTACTPAGER$ "'Service $SERVICEDESC$ @ $HOSTALIAS$ is $SERVICESTATE$'"
}


C'est parfait, tout va bien. Mais la carte SIM installée dans le modem est une carte prépayée. Comment faire si le crédit sur cette carte s'épuise ? nous allons justement utiliser Nagios pour surveiller le crédit sur la carte, et émettre un avertissement s'il tombe trop bas.

Avec mon opérateur téléphonique, on peut contrôler son crédit restant depuis le téléphone, en entrant une commande de service au clavier: *130#. Le téléphone répond avec un message indiquant le crédit restant.

Quelques recherches sur google indiquent que ce type de commandes s'envoie au modem au moyen de la commande AT CUSD. On teste immédiatement avec minicom:

AT+CUSD=1,*130#,15
OK

+CUSD: 2,"Credit actuel: CHF -0,44; 25 SMS gratuits jusqu'au 01.10.2009",15


Reste a interagir correctement avec le modem, ce qui n'est pas totalement trivial a cause de quelques détails pratiques. J'utilise pour piloter le terminal un obscur outil appelé comgt, un équivalent de "chat" (le système de script utilisé par ppp) mais en plus flexible. Voila le script (a mettre dans /etc/comgt/credit):

set com 115200n81
set senddelay 0.05
send "AT+CUSD=1,*130#,15^m"
waitfor 60 "+CUSD:"
get 10 "^m" $s
print "Reply: ",$s,"\n"


On teste avec comgt:

gate # comgt -d /dev/ttyS0 credit
SIM ready
Waiting for Registration..(120 sec max)
Registered on Home network: "Swisscom"
Signal Quality: 21,99
Got: " 2,"Crdit actuel: CHF -0,44; Xtra-liberty: 25 SMS gratuits jusqu'au 01.11.2009.",15


Reste à traiter la sortie pour l'envoyer vers nagios (exercice pour le lecteur parce que je suis paresseux).