Envoyer des messages sur XMPP en ligne de commandes grâce à SendXMPP.

Toujours dans le but de faire communiquer mon système domotique de façon simple pour le reste de la famille et avoir un système de notifications étant  le plus user friendly possible, j'ai voulu utiliser un protocole que j'apprécie beaucoup: XMPP. Comme je l'ai déjà dit c'est un protocole de messagerie instantanée basé sur XML et décentralisé. Il est très souple, et on trouve des clients dignes de ce nom (libres et supportant le chiffrement) sur tous les OS.

J'ai donc trouvé SendXMPP qui est un programme en Perl permettant d'envoyer des messages via XMPP en lignes de commandes depuis une machine Linux. Le but étant de lui adjoindre par la suite PHP comme interface principale avec le reste de l'installation. Mais voyons d'abord dans comment l'on peut envoyer des messages via XMPP en lignes de commandes.

D'abord on installe SendXMPP. C'est assez simple étant donné qu'il est disponible sur les dépots de Debian.:

aptitude install sendxmpp

Pour que SendXMPP puisse envoyer des message, il doit utiliser un compte déjà existant sur un serveur quelconque et lui indiquer les identifiants de ce compte. Pour cela, on crée un fichier .sendxmpprc dans /root, on indique les identifiants du compte XMPP dedans et on modifie ses droits à 600 par soucis de sécurité. SendXMPP refusera de toute façon d’exécuter des commandes si d'autres utilisateurs que le propriétaire du fichier peuvent le lire.

cd /root
nano /root/.sendxmpprc

Les identifiants devant être entrés dans ce nouveau fichier sous la forme:

user@ndd.tld motdepasse

Il n'y a rien d'autre à ajouter.

Puis on modifie les droits du dit fichier:

chmod 600 /root/.sendxmpprc

A partir de là on peut faire un premier test et envoyer un message vers un compte XMPP ou même un salon. Notez que le destinataire doit être enregistrer parmi les contacts du compte utilisé dans SendXMPP mais, il semblerait qu'il soit possible d'envoyer des messages d'un compte vers lui même.

Envoyons un simple "hello":

echo hello | sendxmpp -t destinataire@ndd.tld

Explications: echo est une commande shell permettant d'afficher une chaîne de caractères. Ici c'est le mot "hello" que l'on veut afficher sur le client. Ensuite on indique qu'on le fait via le programme "sendxmpp". L'option "-t" force SendXMPP à utiliser le protocole de chiffrement TLS. On peut le remplacer par -s pour utiliser SSL. Enfin, au bout de la ligne on trouve l'adresse XMPP du destinataire.

Si tout fonctionne, votre destinataire recevra le message comme si vous l'aviez envoyé de n'importe quel client.

Le fait d'utiliser SendXMPP n'est pas anodin, puisqu'il autorise de nombreux type d'utilisations en rapport avec les lignes de commandes sous linux. Par exemple si l'on veut envoyer l'état d'un service sous linux, apache par exemple, on se sert de la commande /etc/init.d/apache status . On peut mixer SendXMPP et cette commande pour envoyer l'état d'apache vers un client xmpp. Il suffit de connaître un peu le shell pour obtenir ce genre de commande:

echo $(/etc/init.d/apache2 status) | sendxmpp -t destinataire@ndd.tld

On peut faire de même pour envoyer le résultat d'une commande ping via XMPP:

echo $(ping -c 5 homeserver-diy.net) | sendxmpp -t destinataire@ndd.tld

Deux infos supplémentaires à propos de SendXMPP:

Premièrement, il est possible d'envoyer ses message vers un salon de discussion XMPP pour peu que celui-ci soit ouvert. Pour ce faire il faut ajouter l'option -c juste avant le destinataire, et remplacer son adresse par celle du salon en question.

Deuxièmement, plusieurs utilisateurs peuvent se servir de SendXMPP sur une même machine et avec des comptes XMPP différents. Pour cela il suffit de créer un fichier .sendxmpprc par utilisateur, dans son /home par exemple, de lui attribuer la propriété du fichier et de régler comme plus haut les permissions sur 600. Ensuite, il suffira de préciser l'emplacement du fichier via l'option -f dans la commande. Notez qu'il m'ait arrivé de devoir préciser aussi l'emplacement de SendXMPP dans la commande. Dans ce cas on obtient ceci:

echo Hello | /usr/bin/sendxmpp -f /home/tom23/.sendxmpprc -t destinataire@ndd.tld

Je pense que vous avez maintenant une bonne idée de ce qu'il est possible de faire avec SendXMPP depuis un terminal. C'est relativement puissant, on peut le coupler à de nombreuses commandes comme tail -f et d'autres.  Comme je l'ai dit au début de cet article, il est possible de coupler ce programme avec des scripts PHP. Je vous le détaillerai dans un prochain article. Dans mon cas cela me permettra de simplifier les interactions avec mon installation domotique.