Sommaire
Note: ce journal est la traduction d'un article posté sur mon blog.
Errol est un programme servant à envoyer des fichiers de machine à machine. Il est basé sur inotify et le protocole XMPP. Errol peut être utilisé pour surveiller un répertoire et transférer automatiquement les nouveaux fichiers (ou les modifiés) vers une autre machine.
À l'origine
Errol a été écrit pour répondre à un besoin. J'ai l'occasion de donner un coup de main à une association locale. Je maintiens leur ERP (Odoo) et une des tâches consiste à générer un tarif biannuel à partir d'un fichier Excel (oui, je sais). Le processus est basé sur la génération d'un fichier LaTeX car j'ai beaucoup utilisé ce format dans le passé et les PDF générés sont compatibles avec le résultat souhaité. N'ayant pas envie d'installer une distribution LaTeX sur la machine de production, j'ai pris la décision de délocaliser cette tâche sur ma machine personnelle. L'utilisateur téléverse un fichier Excel sur un site web (Django), ce fichier est sauvé dans un répertoire "surveillé" et est ensuite envoyé par XMPP sur ma machine personnelle où le fichier LateX est généré. Le PDF résultat est renvoyé sur le serveur afin d'être pouvoir être téléchargé.
Pourquoi Errol?
Dans le monde fictionnel de Harry Potter, Errol est la chouette de la famille Weasley. Il est vieux et maladroit. Certains pourraient dire que XMPP est dans le même état mais Errol (le rapace) trouve son utilité, tout comme XMPP. ;-) Errol est une chouette lapone. Note: en anglais on parle de great grey owl. (voir photos)
Nimage: blurred.ca, Great Grey Owl
Howto
Prérequis
Errol nécessite l'infrastructure suivante:
- un système supportant inotify (Linux).
- un serveur XMPP compatible avec les XEPs suivantes: Stream Management, Publish-Subscribe, Multi-User Chat
- un service pubsub permettant d'avoir des nœuds ouverts. Le nom du nœud est renseigné dans le fichier de configuration. Mon service est sat_pubsub, le composant pubsub du projet Salut à Toi.
- un chat multi-utilisateurs (MUC) pour assurer la compatibilité avec certains clients et le débogage. À l'avenir, le MUC pourrait devenir obsolète.
Il est possible d'utiliser son propre serveur ou d'utiliser un service de la liste suivante.
Créer le noeud pubsub
Cette étape est optionnelle si vous disposez déjà d'un accès en écriture sur un nœud (ex: nœud de blogage). L'exemple suivant montre la création du nœud avec jp, l'interface en ligne de commande de Salut à Toi. Les alternatives Slixmpp ou Sleekxmpp peuvent être utilisés grâce à leurs scripts d'exemples.
$ jp pubsub node create -f publish_model open be.agayon.errol:0 -s pubsub.agayon.be -c
Le nom du nœud recommandé est be.agayon.errol:0 afin d'identifier la fonctionnalité.
En guise d'exemple, voici les informations de mon nœud sur pubsub.agayon.be:
$ jp pubsub node info be.agayon.errol:0 -s pubsub.agayon.be
persist_items: True
deliver_payloads: True
serial_ids: False
publish_model: open
access_model: open
send_last_published_item: on_sub
Si votre serveur supporte Personal Eventing Protocol(PEP) ou si vous ne voulez pas utiliser un service pubsub dédié, vous pouvez utiliser un nœud de microbologage (urn:xmpp:microblog:0) et votre propre jid (adresse xmpp) pour suivre les informations dans Movim ou Salut à Toi.
$ jp pubsub node create -f publish_model open urn:xmpp:microblog:0 -s info@agayon.be -c
Tests
Vous pouvez tester votre installation avec les scripts d'exemples de slixmpp.
Exemple:
./s5b_file_sender.py -j jid@example.org -p pass -r john@example.org -f /path/to/file.txt
Les scripts fournissent plus d'information.
Démarrer avec Errol
Errol a besoin des dépendances suivantes:
- slixmpp (python 3)
- asyncio
- configparser
- aionotify
Installer
Errol s'installe très bien dans un virtualenv mais ce n'est pas obligatoire.
$ pip install errol
Ou encore, après avoir cloné le dépôt:
$ git clone https://gitlab.com/jnanar/errol.git
$ cd errol
$ python3 setup.py install
Configuration
Vous devez remplir un fichier de configuration pour fournir les informations suivantes:
$ cat config.example.ini
[XMPP]
pubsub=pubsub.example.org
node=be.agayon.errol:0
room=chat@chat.example.org
jid=jid@example.org/errol
password=pass
ressource_receiver=-receiver
ressource_sender=-
nick_sender=example_sender
nick_receiver=example_receiver
receiver=jid@example.org/errol-receiver
- jid : le compte XMPP
- password: le mot de passe du compte
- pubsub: le serveur pubsub (peut-être le jid)
- room: le salon MUC (chatroom)
Dans cet exemple, les fichiers seront envoyés par jid@example.org/errol-0 à jid@example.org/errol-receiver.
Les "nicks" sont les pseudos utilisés dans le MUC.
Voler
Nimage: Wisconsin Department of Natural Resources, Great Grey Owl at Mauston
Une fois installé, Errol est utilisable depuis le terminal.
$ errol --help
usage: errol [-h] [-e EVENTS] [-f FILE] [-d] -p PATH -c COMMAND
Automatic XMPP file sender and directory watcher
optional arguments:
-h, --help show this help message and exit
-e EVENTS, --events EVENTS
Number of events to watch (delete, create modify) in
the directory. Once reached, the program stops.
-f FILE, --file FILE Config file containing XMPP parameters
-d, --debug set logging to DEBUG
-p PATH, --path PATH The path watched.
-c COMMAND, --command COMMAND
The executed command: xmpp or watcher
À Hogwarts
Pour surveiller le répertoire /tmp/sender
, il faut utiliser la commande suivante:
$ errol -f config.example.ini -p /tmp/sender -c watcher
Tous les fichiers nouvellement créés ou modifiés seront envoyés.
À Azkaban
Pour recevoir les fichiers dans le dossier /tmp/receiver
, il faut lancer errol comme suit:
$ errol -f config.example.ini -p /tmp/receiver -c xmpp
Licence
Le projet est libéré sous GPLv3.
Pourquoi pas X or Y?
Nimage: Bernard Spragg. NZ, Great Grey Owl (Strix nebulosa)
Il y a 36 manière de solutionner ce problème pour ce type de besoins. Certaines sont plus matures, plus connues ou évidentes. J'ai choisi XMPP pour plusieurs raisons:
- agayon.be possède déjà un service XMPP à jour avec les XEPs nécessaires activées.
- Je voulais apprendre à travailler avec pubsub pour des communications machines à machines et utiliser les notifications (pourquoi pas?).
Parmi les alternatives, le service aurait pu être basé sur
- des sockets
- un transfert de fichier HTTP.
- API REST
- SSH et commandes à distances
- …
Remerciements
Nimage: lasta29, Great grey owl, Osaka Tennoji Zoo
- Slixmpp pour la bibliothèque sympa.
- La communauté XMPP francophone (sat@chat.jabberfr.org, jabberfr@chat.jabberfr.org)
- Link Mauve (JabberFR).
- Goffi (Salut à Toi).
# super
Posté par Goffi (site web personnel, Mastodon) . Évalué à 10.
Vraiment super d'utiliser XMPP pour autre chose que de la messagerie instantanée, et de le montrer. Tes articles sont super didactiques en plus. J'ai hâte d'en lire d'autres :)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.