💬 Envoyez des notifications XMPP avec Sendi

| ~ 3 mins | 634 mots

Introduction

J’utilise beaucoup XMPP pour communiquer, j’ai ainsi mon propre serveur XMPP.

Un des usages, en tant qu’administrateur systĂšme d’un serveur, est d’utiliser XMPP pour m’alerter d’évĂšnements qui ont lieu sur le serveur. J’utilisais jusqu’à prĂ©sent un petit logiciel qui s’appelle sendxmpp. Mon cas d’usage est de le placer dans des scripts systemd avant ou aprĂšs des scripts pour me dire un peu plus sur l’état du systĂšme.

Un exemple par exemple est dans le cas du service backup.service présenté dans le dernier article :

[Unit]
After=btrbk.service btrbk_resume.service
Requires=btrbk.service btrbk_resume.service

[Service]
Environment=XMPP_NOTIFY_ACCOUNT=me@mysuperdomainname.ndd
User=me
Type=oneshot
ExecStart=/usr/bin/sendxmpp ${XMPP_NOTIFY_ACCOUNT} -t -m /path/of/the/message/after/success/backup

Ce logiciel sendxmpp Ă  un gros dĂ©fault qui me gĂȘne dans son utilisation : il est basĂ© sur le fait d’utiliser quasi nĂ©cessairement l’entrĂ©e standard, par exemple :

ls -la | sendxmpp me@mysuperdomainname.ndd

Et si on ne veut pas faire ça, la seule option qui reste est alors de données un chemin avec -m.

Ce choix technique, s’il est trùs pertinent dans des scripts bash, n’est vraiment pas pratique lorsque qu’on veut utiliser ce logiciel dans systemd.

L’idĂ©al, pour moi, serait de pouvoir faire quelque chose comme ça :

ExecStart=/usr/bin/monprogramme ${XMPP_NOTIFY_ACCOUNT} -m "masupercommande ${UNE VARIABLE}"

Ensuite sendxmpp souffre un peu de son Ăąge, crĂ©Ă© en 2004, il ne supporte ainsi rien de trĂšs original. C’est le genre de logiciel ancien, mais efficace pour sa tĂąche. Il est malheureusement plus rĂ©ellement maintenu avec une derniĂšre version en 2014 !

Sendi

Pour pallier ce problĂšme d’entrĂ©e, j’aurais pu Ă©ventuellement faire un bĂȘte script autour de sendxmpp, mais je me suis dit qu’il devait ĂȘtre possible de faire les choses mieux.

J’ai dĂ©couvert un logiciel intĂ©ressant apprise qui a comme objectif de servir pour des notifications de tout type. Cela m’a intĂ©ressĂ©. Malheureusement le support xmpp a Ă©tĂ© supprimĂ©, en effet la librairie qu’il utilise est asynchrone et n’est du coup pas si simple a utilisĂ© pour ce cas d’usage.

J’ai senti alors le dĂ©fi et j’ai dĂ©veloppĂ© Sendi.

Sendi est un autre programme en ligne de commande pour envoyer des notifications XMPP. Il n’utilise pas la sortie standard et supporte l’envoi de fichier par http XEP-0363 et le chiffrement OMEMO XEP-0384 et XEP-0454.

Attention la peinture est toute fraĂźche, c’est probablement un peu boguĂ©. N’hĂ©sitez pas Ă  faire des retours, le but du projet Ă©tant d’avoir quelque-chose d’assez fiable.

Je remercie chaleureusement les dĂ©veloppeurs xmpp de slixmpp et en particulier Syndace, dĂ©veloppeur de slixmpp-omemo qui m’a bien aidĂ© pour dĂ©boguer la partie omemo de mes tests automatisĂ©s.

Comment utiliser sendi avec systemd :

Dans mon cas particulier, bien qu’il soit possible d’installer sendi via paquet debian (experimental), j’ai testĂ© dans un premier temps avec podman en gĂ©nĂ©rant l’image localement.

Je me suis fait un petit script pour que ça soit plus facile Ă  utiliser :

 ❯ cat /usr/local/bin/sendi 
#!/bin/bash
set -euo pipefail
podman run --rm --net=host \
         -v $HOME/.config/sendi:/config \
         -v $HOME/.cache/sendi_container:/root/.cache/sendi \
         -v $HOME/.sendi_upload:/upload \
         localhost/sendi:1.0.0 --config-file=/config/config.toml "$@"

Je peux ainsi avoir cette configuration pour backup.service :

[Unit]
After=btrbk.service btrbk_resume.service
Requires=btrbk.service btrbk_resume.service

[Service]
Environment=SENDI_ACCOUNT_NAME=adminuser
Environment=XMPP_NOTIFY_ACCOUNT=me@mysuperdomainname.ndd
User=me
Type=oneshot
ExecStart=/usr/local/bin/sendi ${SENDI_ACCOUNT_NAME} ${XMPP_NOTIFY_ACCOUNT} --message "Backup process ended đŸ˜Œ"

Une bonne partie de la magie se situe dans le fichier $HOME/.config/sendi/config.toml:

[adminuser]
host="mysuperdomainname.ndd"
port=5222
password="A SUPER PASSWORD"
jid="bot@mysuperdomainname.ndd"
connection_type="standard"
security_level="encrypted"
lang="fr"

Avec cette configuration, les messages sont envoyé par bot@mysuperdomainname.ndd en chiffré bout en bout (via omemo).

La configuration sans podman via les paquets est un peu plus simple, vous n’avez besoin que de $HOME/.config/sendi/config.toml et d’une configuration comme cela :

[Unit]
After=btrbk.service btrbk_resume.service
Requires=btrbk.service btrbk_resume.service

[Service]
Environment=SENDI_ACCOUNT_NAME=adminuser
Environment=XMPP_NOTIFY_ACCOUNT=me@mysuperdomainname.ndd
User=me
Type=oneshot
ExecStart=/usr/bin/sendi ${SENDI_ACCOUNT_NAME} ${XMPP_NOTIFY_ACCOUNT} --message "Backup process ended đŸ˜Œ"

Noter que dans le cas présent le chemin vers sendi a changé, mais le reste est quasiment identique pour cet exemple.

Pour conclure

Sendi est dÚs à présent disponible en version 1.0 via Pypi, le code est lui disponible sur framagit.