Archives quotidiennes :

send_smsd ou comment un script devient un daemon

L’envoi de sms pfffff … yaka cliquer !

C’est presque vrai. Mais dès que l’on veut que cela soit fais correctement et proprement cela devient moins simple.

Comme je le disais dans cette précedente page de mon blog. mettre en place un modem GSM c’est facile.

Les scripts d’exemples permettent de rapidement comprendre comment cela fonctionnent, python à d’excellente librairie pour communiquer avec des liaisons série bref que de bonheur.

Non c’est après que viennent ces petites choses qui agacent.

D’abord, une liaison série c’est pas multi-tàche : et pourtant j’en ai bouffé de cette @!$% de liaison RS232 au siècle dernier, mais non avec une liaison série on ne communique qu’avec une seule connexion à la fois.

Comme quoi certain réflexe s’émoussent avec le temps, et comme il est normal que certaines technos disparaissent 🙂

Donc un script qui ouvrent la liaison série pour envoyer les commandes AT, tout seul il marchent, si plusieurs SMS doivent être envoyés et ben il faut le gérer.

Allons y c’est pas sorcier non plus, après tout ne n’ai que 5 SMS à envoyer, on fait un plus gros scripts avec des sleep entre chaque envois, cela marche … presque. En fonction des opérateurs et si votre correspondant est sur le même continent ou non le temps d’envoi est TRES variable.

D’une solution passable, on passe à un solution plus que moyenne bref cela ne me convenait pas du tout.

Et donc naturellement l’idée d’utiliser un fichier FIFO m’est venu. Et donc l’esquisse d’un serveur d’envoi de SMS commençait à poindre le bout de son nez.

Allons y :

un script en shell pour envoyer les infos dans le fifo, ce qu’il y a de bien dans les SMS c’est que c’est court et que cela tient dans une ligne 🙂

un script qui scrutent continuellement le fifo ligne par ligne et qui effectue l’envoi, une ligne = 1 SMS.

Simple, pas tant que cela. Car si pour un raison ou une autre un SMS ne passe pas il faut réessayer un certain nombre de fois avant d’abandonner.

Oui d’accord mais la lecture du fifo est bloquante. Je ne vais pas attendre les n tentatives  pour envoyer les suivants, ou je ne vais pas attendre le prochain SMS pour envoyer ceux qui sont en attente.

faire une boucle qui lit de manière non bloquante le fifo, vérifier que la liste des sms en attente est vide sinon on repart pour un tour.

Heureusement, la communauté python regorge de ressources et d’exemples et après quelques essais la solution est apparu auréolé de lumière quasi divine …

Bref vous trouverez le code complet ici, il n’y a pas encore de procédure d’installation automatique mais bon cela tient en 3 fichiers.

send_sms : le shellscript qui dépose le numéro et le message dans le fifo

send_smsd : le daemon qui lit le fifo et envoi les commandes AT sur le modem (faire un lien avec send_smsd.py)

send_smsd.conf : à configurer en fonction de vos besoins (seul le chapitre MAIN est utilisé, l’autre c’est de la déco)

send_smsd.service : le script init.d spécial SUSE (désolé mais la VM qui en avait besoin était sous SUSE)

Même si je l’utilise en exploitation, je ne le considère pas comme finalisé il reste encore beaucoup de choses à faire. (un seul modem de géré, pas franchement objet etc …)

Mais je me suis bien amusé et cela marche 🙂

A+

chris