Journal Parlons XMPP - épisode 6 - les commandes à distance

Posté par (page perso) . Licence CC by-sa
25
27
juil.
2015

(pour lire les épisodes précédents, suivez l'étiquette correspondante)

Aujourd'hui nous allons parler d'une de mes fonctionnalités favorites dans XMPP : les commandes à distance. Il s'agit de la possibilité pour 2 entités XMPP d'exécuter des actions à distance de manière générique.

La première méthode, assez peu utilisée à ma connaissance, est via la XEP-0009 (oui c'est une vieille, elle date de 2001), qui donne une méthode pour utiliser XML-RPC à travers XMPP.
XML-RPC est un Système de communications inter processus, c'est à dire un moyen pour 2 entités de communiquer à distance. Vous pouvez ainsi exécuter des commandes indépendamment du langage de programmation, en ayant des données décrites (est-ce que je reçois un entier ? Une chaîne de caractères ?). Ceci est particulièrement adapté pour la communication de machines à machines, quand on sait déjà quelles méthodes sont disponibles et ce qu'elles font. Le cas type est une interface de programmation (ou API) pour permettre de contrôler quelque chose, comme un serveur par exemple.

La deuxième méthode est appelée commandes « ad-hoc » (de circonstance), et c'est la XEP-0050 qui les explique. L'idée est aussi de pouvoir exécuter de manière générique des commandes, mais cette fois sans savoir à l'avance ce qui va être disponible, et en pensant plutôt à une interaction humain/machine, bien que machine/machine soit bien sûr tout à fait possible.

Le cas typique d'utilisation est la configuration d'un service, mais ce peut être utilisé pour n'importe quoi.
Ce qui rend cette fonctionnalité particulièrement puissante, c'est qu'elle fait partie de XMPP et donc peut profiter de tous ses avantages, en particulier l'authentification forte (quand on parle à server@example.net, on sait qu'on ne parle pas à quelqu'un d'autre) et la liste de contacts (roster) avec leurs groupes. Nous avons ainsi un système de permissions simple à mettre en œuvre et efficace.

Prenons un exemple: vous êtes administrateur sur Prosody (pour mémoire, un serveur XMPP populaire) – pour cela il vous suffit de donner votre jid dans la variable « admins » dans la configuration –, et vous voulez… pouvoir administrer votre serveur. Pas besoin de s'embêter à avoir une page web dédiée avec mot de passe etc, il vous suffit d'avoir un client XMPP qui gère les commandes ad-hoc (Gajim par exemple), et d'entrer l'adresse de votre serveur.

Exemple ci-dessous avec Libervia, l'adresse libervia.org est celle du serveur, voici ce que, en tant qu'admin, je peux voir.

capture d'écran des commandes ad-hoc pour un admin avec Libervia

Le « Send Announcement to Online Users » (envoyer une annonce à tous les utilisateurs en ligne) est particulièrement utile juste avant une mise à jour.

Avec un compte lambda, voilà ce que l'on voit :
capture d'écran des commandes ad-hoc pour un utilisateur lambda avec Libervia

Malheureusement avec certains clients, l'accès est tout sauf intuitif. Je pense que l'exemple le pire est Psi : pour accéder aux commandes du serveur il faut aller dans la découverte des services (« service discovery ») soit via le menu « General » soit en cliquant droit sur votre profil, puis cliquer sur le nom de votre serveur dans la liste des services, puis enfin cliquer sur l’icône en forme de terminal, appelée « execute command » (exécuter une commande).

Dans Gajim c'est plus simple (clique droit sur votre profil puis « exécuter une commande »), dans Swift c'est dans le menu Actions => Run Server Command (Exécuter une commande serveur). Si vous voulez exécuter des commandes sur un jid arbitraire dans Gajim, il vous faut passer par le menu « Découvrir les services », comme avec Psi ; je n'ai pas l'impression que ce soit possible avec Swift.

Ci dessous une capture de Movim, ces commandes sont dans le menu « actions »:

les actions dans Movim

Même sans être administrateur, les commandes « ad-hoc » peuvent vous être utiles. Par exemple, vous avez oublié de déconnecter votre client chez vous et vous vous trouvez chez un ami. Il vous suffit de vous connecter, et de spécifier le jid complet, avec la ressource, de votre client à la maison. SàT par exemple vous permet à l'heure actuelle de changer votre statut voire de vous déconnecter. Gajim permet en plus de transférer les messages non lus ou de quitter des salons de discussions.

Accès à un client Gajim à distance

Il est facile d'imaginer à quel point cette fonctionnalité peut être utile pour l'administration ou la surveillance de serveurs, pour la robotique, la domotique, le contrôle à distance de votre ordinateur, de votre bot XMPP, etc.

Voyons un autre cas pratique que nous avons implémenté dans Salut à Toi : on couple les commandes « ad-hoc » avec D-Bus. Pour ceux qui ne connaissent pas, D-Bus est un autre système de communication inter-processus qui a été développé par Freedesktop comme un standard commun dans les bureaux libres, en s'inspirant de l'existant et en particulier du DCOP de KDE. Il est donc très largement utilisé dans les logiciels libres, et permet de piloter beaucoup de logiciels courants.
En liant D-Bus et ad-hoc, SàT permet de créer très facilement une télécommande universelle, pilotable depuis n'importe quel client XMPP compatible (y compris sur votre téléphone, ce qui est particulièrement intéressant pour une télécommande), et en prime avec gestion des permissions par groupe.

Cette fonctionnalité est montrée dans le courte vidéo ci-dessous, on autorise les membres du groupe « coloc » à piloter une instance de VLC, pratique quand on fait une séance cinéma dans la colocation :).

Cliquez sur l'image ci-dessous pour voir la vidéo:
Télécommande universelle dans Salut à Toi

Nous allons ajouter également la possibilité d’exécuter des scripts ou des commandes shell, on pourra ainsi très facilement autoriser tous les administrateurs d'un serveur à le redémarrer ou à avoir son statut.

Petite note sur le fonctionnement : les commandes ad-hoc, comme à peu près tout ce qui demande de la transmission d'informations typées dans XMPP, se basent sur les « Data Forms » (formulaires de données, XEP-0004). Cette extension standardise donc les formulaires, et permet de demander des booléens, des mots de passes ou encore des listes de jids.

J'en profite aussi pour vous donner le lien vers la conférence « PubSub, microblogage et XMPP » que j'ai faite aux RMLL il y a un peu plus de 2 semaines. J'y explique en 20 min les bases de PubSub et du microblogage dans XMPP, ainsi que l'intérêt des 2 XEPs que nous avons publiées (cf ce journal). J'en reparlerai bien sûr dans un prochain article.

Bien qu'ayant plusieurs idées en tête, je ne suis pas encore décidé pour le prochain article, il est possible que je parle de PubSub, de copie de fichiers, de chiffrement de bout en bout, ou de tout autre chose…

  • # question de mise en forme

    Posté par (page perso) . Évalué à 4. Dernière modification le 27/07/15 à 13:56.

    petite question pour le markdown: est-il possible de désactiver les liens automatiques ? Par exemple le lien server@example.net est cliquable alors qu'il ne faudrait pas…

    Aussi désolé pour la capture de Movim est de mauvaise qualité: comme je n'avais pas d'instance sous la main, j'ai récupéré la capture dans la présentation de PSES.

  • # Enter in the Matrix ! Bien plus simple

    Posté par . Évalué à -10.

    Matrix est bien plus simple comme API HTTP standardisée, dédiée à l'IM et aux appels VoIP et vidéo via WebRTC. Vous pouvez tester la bêta ici.

    Tu n'as pas besoin de suivre 6 épisodes (!!!!) pour mettre en place Synapse.

    A l'heure où XMPP rappelle les quelques rares passionnés existants du protocole Gopher. Autant dire que XMPP (et Movim) sont morts et enterrés. Et cela, vous n'arrivez pas à l'assumer.

    • [^] # Re: Enter in the Matrix ! Bien plus simple

      Posté par (page perso) . Évalué à 10.

      Ah c'est les vacances, on part à la pêche au trolls, même si on devrait éviter de les nourrir comme on dit.

      Le classique effet de nouveauté, comme j'en parle régulièrement, ça a été le cas avec pump.io, tox, bitmessage, twister, et maintenant matrix.

      Bien que je n'ai rien contre les nouvelles expérimentations, au contraire, et que matrix pourrait être intéressant (bien qu'après avoir vu la conf au Fosdem je n'y vois rien de franchement extraordinaire), ils ont visiblement quelque chose contre XMPP, et font une campagne massive de dénigrement pas vraiment faite pour attirer la sympathie, au point que les gens impliqués dans XMPP doivent perdre du temps à démonter point par point les attaques.

      Ce genre de gueguerre c'est pas franchement mon truc, et je préfère largement les projets amicaux même s'ils utilisent des technologies différentes (c'est le cas de Diaspora par exemple avec qui on parlait de collaborer pas plus tard qu'hier).

      Bref j'ai rien contre matrix en tant que tel, mais les attaques en règle ça commence à devenir lourd, et pourtant c'est pas vieux.

  • # Des exemples simples?

    Posté par . Évalué à 2.

    Merci pour cet article intéressant comme d'habitude.

    Afin de mieux comprendre comment ça fonctionne, est-ce qu'il y a des exemples simples d'utilisation de commande ad-hoc pour la domotique, robotique ou bot?

    • [^] # Re: Des exemples simples?

      Posté par (page perso) . Évalué à 4.

      Salut,

      Qu'est-ce que tu entends par exemple d'utilisation ? Un exemple d'échange XML ou des cas d'utilisation pratique ?

      Je ne suis pas trop entré dans les détails internes parce que je voulais surtout montrer l'intérêt de la fonctionnalité, et la XEP est assez facile à lire.

      En gros le principe c'est que tu récupères une liste de commandes disponibles via disco, ou alors tu connais déjà un nœud à utiliser (parce que défini dans une autre XEP, ou tu sais que c'est ce que tu utilises avec ton robot). Ensuite tu commences une session (associée à un id) avec cette commande, et tu peux effectuer une action:

      • cancel pour annuler

      • prev pour revenir en arrière

      • execute pour lancer une commande ou continuer la session

      • next pour passer à la page suivante

      • complete pour finir la sesssion

      Tu as un exemple complet dans la XEP, c'est vraiment simple.

      Pour un robot tu peux t'en servir pour plein de choses: lui dire de faire quelque chose, ou avoir un menu de configuration, pour récupérer son état, etc.

      Pour un bot logiciel, plutôt que d'avoir à taper « !ta_commande » dans une discussion, tu as un menu avec un vrai formulaire et des informations typées (bien sûr ça ne t'empêche pas d'ajouter des commandes « !ta_commande » si tu aimes mieux). Comme tu peux savoir très facilement si tu es admin ou utilisateur lambda (il suffit de regarder le jid), tu peux fournir un menu différent selon les cas (par exemple permettre de déconnecter ou relancer le bot si tu es admin). Tu peux même fournir des commandes dans différentes langues si tu veux, en regardant l'attribut xml:lang de la requête (cf la section 3.7).

    • [^] # Re: Des exemples simples?

      Posté par (page perso) . Évalué à 1.

      Voici deux exemples d'implémentation en python avec la bibliothèque SleekXMPP: adhoc_provider.py
      et adhoc_user.py. adhoc_provider.py est un simple bot qui accueille un utilisateur et adhoc_user.py s'y connecte et lance la commande.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.