đŹ Envoyez des notifications XMPP avec Sendi
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.