Publiez sur votre blog XMPP depuis Libervia ou jp (SàT)

goffi 24/03/2016, 17:55 jabber-xmpp projet GNU-Linux planet-libre SàT seenthis Libre Tutorial Libervia_installation

Articles précédents de la série : Installer une instance de Libervia (SàT) en moins de 10 min, Configuration avancée du conteneur Libervia et Importer un blog Dotclear dans XMPP.

Pour ce dernier article de la mini série sur l'installation d'un blog XMPP avec Libervia, je vais vous expliquer comment publier sur le blog que nous avons mis en place. Ceci fonctionnera également si vous avez un compte Movim (testé), et devrait fonctionner avec Jappix (non testé).

Je vais décrire 2 méthodes : via Libervia, l'interface web, qui est graphique, et la deuxième, pour les utilisateurs avancés, qui se fait via jp, l'interface en ligne de commande.

D'abord quelques explications

Avec XMPP, les blogs sont diffusés en texte pur ou en XHTML, aucun autre langage de balisage n'est utilisé à l'heure actuelle.

Dans SàT, nous faisons la distinction entre billet de blog et microblog avec l'utilisation du titre : nous considérons comme billet de blog un article ayant un titre, et supposé être travaillé, tandis qu'un message court (ou pas, nous n'avons pas de limite artificielle de caractères comme d'autres) sera plus une pensée « sur l'instant », et n'aura pas de titre. À terme nous fournirons sans doute plusieurs flux Atom pour suivre soit la totalité des messages, soit uniquement les billets de blog ou de microblog. Pour le moment les flux diffusent la totalité des messages (ou uniquement ceux correspondant à une étiquette).

D'autre part, nous avons un système permettant d'utiliser n'importe quelle syntaxe pour rédiger un billet. Comme nous ne voulions pas rester bloquer sur telle ou telle syntaxe à la mode, nous permettons la conversion d'une syntaxe à une autre et publions le résultat final en XHTML.

Évidemment la conversion d'une syntaxe à une autre peut provoquer de la perte d'informations de formatage, mais en pratique ça fonctionne relativement bien, et nous comptons faire des améliorations par la suite notamment pour garder le brouillon dans la syntaxe d'origine.

Aujourd'hui, vous pouvez utiliser XHTML bien sûr, mais également Markdown (par défaut) ou la syntaxe wiki de Dotclear pour rédiger un article.

Enfin, tout est unicode avec XMPP, vous pouvez donc utiliser les caractères spéciaux que vous voulez.

Publication via Libervia

La méthode la plus simple pour publier. Dans l'interface de Libervia, sélectionner un « panneau » blog (le panneau que vous voyez à l'ouverture en est un), et cliquez sur la zone de saisie tout en haut. Par défaut vous êtes en mode microblog et en texte simple, il vous suffit de taper votre message et d'appuyer sur [Majuscule] + [entrée] ou de cliquer sur le lien en bas à gauche pour publier votre message.

publication d'un microbillet

Pour un billet plus avancé, vous avez le lien en bas à droite « switch to blog » (passer en mode « blog »). Vous allez ainsi accéder à une zone plus élaborée, avec possibilité de mettre un titre, des étiquettes (« tags ») ou de faire de la mise en forme. Par défaut la syntaxe Markdown est utilisée, mais il est facile de changer dans les préférences via le menu Settings/Parameters/Composition

publication d'un billet de blog

Enfin, notez la case à cocher « preview » (aperçu), qui permet de taper avec un rendu direct un peu comme sur un traitement de texte, fonctionnalité associée à l'acronyme barbare « WYSIWYG ». Voici ce que vous obtenez en cliquant dessus :

publication d'un billet de blog avec aperçu

Une fois satisfait du résultat, vous n'avez plus qu'à cliquer sur « Send message ». En cas d'erreur pas de problème, il est possible d'éditer le message quand vous voulez. En effet les 3 icones sur la droite permettent respectivement de répondre, modifier ou supprimer le message.

icones du message

Tout ce qui vient d'être dit s'applique également aux commentaires.

Les billets que nous venons de publier sont publics, visible par tout le monde y compris les personnes qui n'ont pas de compte XMPP. Mais, spécificité de SàT dans le monde XMPP, il est possible de ne publier que pour un groupe de votre liste de contacts. Pour cela il suffit de cliquer sur le groupe désiré, ou de faire un glissé/déposé de groupe vers la zone des widgets. Un nouveau panneau dédié à ce groupe apparaîtra, vous n'aurez plus qu'à écrire dedans comme précédemment. Il est ainsi facile de ne publier que pour ses amis, ses collègues ou sa famille.

Méthode avancée : publication avec jp

Passons maintenant à la méthode « avancée ». Ici il vaut mieux avoir une version installée normalement plutôt qu'utiliser l'image Docker, car vous pourrez utiliser votre éditeur courant avec sa configuration. Une alternative est de modifier vous-même l'image Docker de jp (salutatoi/jp) en installant votre éditeur favori et en le configurant.

Cette méthode utilise jp, l'interface en ligne de commande de SàT, et donc demande de savoir utiliser un shell, mais elle offre un avantage indéniable de rapidité et d'efficacité : en une commande vous êtes dans votre éditeur de texte favori en train de rédiger votre billet.

Cette commande c'est :

      jp blog edit

    

Une fois validée, vous allez voir votre éditeur s'ouvrir avec le contenu de votre billet dans la syntaxe renseignée dans vos préférences. Un deuxième fichier est créé, avec le même nom que le billet mais qui se termine par « _metadata.json », qui contient les métadonnées de l'article, c'est à dire les informations comme son titre, les étiquettes utilisées, est-ce qu'il faut autoriser les commentaires, etc. Si vous utilisez un éditeur comme Vim ou Emacs, ce deuxième fichier devrait s'ouvrir automatiquement à côté du contenu. Une option particulièrement utile est « publish », que vous pouvez mettre à « false » pour interdire la publication de l'article, évitant toute publication accidentelle tant que votre article n'est pas fini. Une fois satisfait, vous n'aurez qu'à supprimer la ligne et quitter votre éditeur pour voir votre billet publié.

Ci-dessous, une capture de cet article pendant que je le rédige sous Vim :

édition depuis vim

Si vous voulez utiliser un autre éditeur, il suffit de le spécifier avec la variable d’environnement EDITOR, voici par exemple comment éditer avec kate :

      EDITOR=kate jp blog edit

    

Il est également possible de spécifier la commande à utiliser dans sat.conf, avec l'option « editor » dans la section « [jp] ».

En plus de créer un nouveau billet, il est possible d'éditer un billet existant, ou de continuer un brouillon non publié. 3 mots clefs sont utilisables à l'heure actuelle :

  • new permet de créer un nouveau billet, c'est l'option par défaut et nous venons donc de l'utiliser

  • last édite le dernier billet publié, particulièrement pratique pour corriger une faute

  • current édite le brouillon en cours (billet avec la métadonnée « publish » mise sur « false »)

ainsi pour faire une mise à jour du dernier billet, il suffit d'entrer:

      jp blog edit last

    

Plutôt simple non ?

Prévisualisation

Passons la plupart des options pour indiquer titre ou étiquette — il vous suffit de taper « jp blog edit --help » pour les connaître — et attardons-nous sur l'option « --preview ».

jp est capable d'ouvrir le brouillon en cours et d'afficher une prévisualisation dans le navigateur par défaut, et il va le mettre à jour à chaque enregistrement du fichier.

Par défaut, un nouvel onglet sera ouvert à chaque enregistrement, pas très pratique. Il est cependant possible de mettre à jour l'onglet en cours, soit via D-Bus pour un navigateur comme Konqueror (qui a la bonne idée de permettre ainsi de rafraîchir la page), soit via un outil externe, « xdotool » qui permet de piloter une application sur un serveur X (il faut donc installer cet outil pour que cela fonctionne).

2 options dans sat.conf sont prévues pour contrôler la prévisualisation : blog_preview_open_cmd pour l'ouverture du fichier, et blog_preview_update_cmd pour la mise à jour. Ces 2 options demandent des commandes shell, dans lesquelles {url} sera substituées par L'URL du fichier (de la forme file:…) et {preview_file} sera substitué par le chemin vers le fichier de prévisualisation.

Voici la recette pour une prévisualisation automatique avec Konqueror (qdbus doit être installé), à mettre dans sat.conf section [jp] :

      blog_preview_open_cmd = konqueror {url}
blog_preview_update_cmd = /bin/sh -c "qdbus $(qdbus org.kde.konqueror\*) /konqueror/MainWindow_1 reload"

    

Et celle pour Firefox (ou autre, changez « Mozilla Firefox » par ce qui vous intéresse) :

      blog_preview_open_cmd = firefox -new-tab {url}
blog_preview_update_cmd = /bin/sh -c "WID=$(xdotool search --name 'Mozilla Firefox' | head -1); xdotool windowactivate $WID; xdotool key F5"

    

Vous pouvez maintenant tester avec jp blog edit --preview. Si vous avez oublié le --preview, vous pouvez lancer la prévisualisation après coup grâce à jp blog preview.

Éditer un billet déjà publié

Si vous voulez éditer un billet déjà publié (et autre que le dernier, sinon last suffira), vous pouvez entrer directement son URL XMPP. Ainsi, si je veux éditer le premier article de cette série, je n'ai qu'à faire :

      jp blog edit --preview "xmpp:goffi@goffi.org?;node=urn%3Axmpp%3Amicroblog%3A0;item=067646bd-9439-430a-98c2-c655f5a63e40"

    

Mais il y a encore plus simple ! Vous pouvez entrer directement l'URL HTTP(S), et si le client XMPP fournir l'URL xmpp: dans la page (ce qui est le cas de Libervia), jp retrouvera le billet. Ainsi je peux entrer directement :

      jp blog edit --preview "http://www.goffi.org/blog/goffi/067646bd-9439-430a-98c2-c655f5a63e40"

    

Oui ça semble assez magique, c'est la standardisation qui permet cette magie !

Conclusion

Voilà qui conclut cette petite série sur l'installation d'un blog XMPP. La dernière partie est clairement pour utilisateurs avancés, mais il semblait intéressant de la mettre pour montrer une partie des possibilités de SàT. Par la suite je ferai des articles de temps en temps quand une fonctionnalité intéressante aura été ajoutée.

Si vous avez installé un blog XMPP, que ce soit avec Libervia ou autre, n'hésitez pas à me contacter que je vous ajoute dans mes contacts (ou ajoutez-moi directement ! goffi@jabber.fr, ce blog est sur une autre adresse : goffi@goffi.org).

Les prochains articles — en dehors d'un épisode de « parlons XMPP » en attente de publication — parleront très probablement de l'avancement sur « Cagou », la future interface bureau/Android, promise suite au succès de notre financement participatif, à bientôt !

X

xavier 15/04/2016, 20:54

Je crois que, au dela de libervia, je trouve jp excellent !

SàT: quelques nouvelles en vrac

goffi 26/04/2016, 22:04 jabber-xmpp projet GNU-Linux planet-libre SàT seenthis Libre

Salut à vous,

j'ai assez peu de temps devant moi, alors je vais faire bref pour les quelques nouvelles sur notre avancement.

Déjà je voulais annoncer que nous ne sommes plus à plein temps sur SàT, Souliane et moi avons repris un travail salarié. Le rythme de développement s'en retrouve bien sûr réduit, mais reste relativement soutenu.

Le développement sur Cagou, notre prochaine interface bureau/appareils portables promise suite à notre financement participatif, est d'ailleurs en cours, il est possible de se connecter depuis, et il y a une gestion basique des widgets.

Voici une petite vidéo avec les premières images. La gestion des widgets est inspirée de l'excellente interface de Blender : l'idée est d'avoir à la base un seul widget que l'on peut changer en cliquant sur une icône (un widget pouvant être une conversation, un fil de blogs, des fichiers en partage, la liste de contacts, etc), et de pouvoir séparer l'écran en faisant glisser une barre. Ne faites pas attention à l’aspect graphique qui va changer (j'ai pris une barre du thème par défaut de Kivy pour le développement, mais ça va changer par la suite).

Mais ça n'est pas tout ! Un autre frontal est en cours de développement, destiné à Emacs le bien connu système d'expl éditeur de texte. Il répond au doux nom de « Sententia », et c'est Xavier Maillard qui s'est lancé dedans, et vous pouvez suivre son avancement (ou lui filer un coup de pouce *clin d'œil* *clin d'œil*) sur http://git.maillard.im/xma/sententia.
Une petite mise en appétit :

Première image de sententia

Il y a pas mal de développements en cours, mais je commence à fatiguer, alors je détaillerai une autre fois.

Enfin, pour ceux qui sont dans cette zone, nous serons Souliane et moi à la « Linuxwochen » ce samedi à Vienne (Autriche) pour présenter SàT : https://cfp.linuxwochen.at/de/LWW16/public/events/398.

À bientôt !

X

xavier 27/04/2016, 04:50

\o/ l'invasion est en marche ! :) (bon la capture est franchement moche, j'espere que les personnes qui utiliseront sententia auront plus de gout que moi :) ).

goffi 27/04/2016, 08:48

xavier: j'aime bien moi, notamment l'horloge à droite c'est pas mal :). J'attends la suite avec impatience…

X

xavier 27/04/2016, 11:15

Le premier commit vient d'etre envoye. Maintenant, reste a reprendre le brouillon de buffer et le mettre dans le fichier et d'envoyer tout cela ;) Ce soir, certainement.

Premiers jappements de Cagou

goffi 14/09/2016, 07:05 seenthis jabber-xmpp projet GNU-Linux planet-libre SàT Libre

Salut à vous,

Cagou commençant à prendre sérieusement forme, il est temps de faire un billet sur l'avancement.

Avant le début du développement de l'interface elle-même, des changements nécessaires ont été faits en particulier sur la gestion des messages. Outre la gestion des langues dont j'ai parlé dans des précédents billets, le plus important est que nous pouvons désormais changer l'état d'un message après réception, ou y faire référence. Ceci permet d'implémenter des fonctionnalités comme les accusés de réception, ce qui a été fait par une contribution de Chteufleur (merci :)). D'autres fonctionnalités qui attendaient comme la correction du dernier message vont bientôt pouvoir suivre.

Il était nécessaire de faire ce travail avant d'implémenter la messagerie instantanée sur Cagou, pour pouvoir partir sur de bonnes bases.

Ensuite il a fallu intégrer l'interface sous Kivy à SàT, et en particulier D-Bus et QuickFrontend, notre modèle pour faire des frontaux en Python.

Tout ceci s'est relativement bien passé, et voici une petite vidéo pour vous mettre en appétit :

Quelques explications maintenant.

Comme vous le voyez, l'interface peut-être divisée facilement. Cette idée est inspirée de l'excellente interface de Blender, et permettra de s'adapter facilement à un petit ou grand écran en choisissant le nombre de widgets et leur disposition.
Au lieu d'être un logiciel discret qu'on utilise uniquement quand on veut répondre à quelqu'un, Cagou est une interface qui s'utilise principalement en plein écran, avec une disposition adaptée à la situation et les outils importants directement visibles (si la taille de l'écran le permet).

Autre point important, la liste de contacts n'est pas l'élément central comme c'est souvent le cas dans les logiciels de messagerie. Vous pouvez y accéder en sélectionnant le widget, voire la mettre sur le côté pour reproduire le comportement traditionnel, mais elle n'est pas affichée par défaut et n'est pas indispensable.

sélection de widget

Tous les widgets sont des greffons, a terme il devrait être possible d'en télécharger, ou de changer complément le fonctionnement d'un widget de base. Comme effet de bord, et surtout grâce au travail de l'équipe derrière Kivy, Cagou sera une plate-forme qui permettra d'échanger facilement des scripts Python sur Android (reste à voir comment on va gérer les permissions).

En ce qui concerne les notifications, le fonctionnement va être différent sur bureau et sur les plates-formes qui ont déjà un système de notification (comme Android). Dans ce dernier cas, le système de la plate-forme va être utilisé.
Sur bureau, un en-tête spécifique est utilisé. 2 icônes de Cagou (merci à Muchoslava pour ses contributions) peuvent apparaître : une à gauche pour les notes (c.-à-.d les messages court qui ne s'affichent que quelques secondes), et une à droite pour les notifications plus importantes, nécessitant l'action de l'utilisateur.
Un clique sur l’icône de gauche permet d'afficher les 10 dernières notes, et un sur l’icône de droite affiche la notification importante suivante.

Ceci a été pensé pour éviter les popups, ces dernières ne sont affichées que suite à une action de l'utilisateur, et n’apparaissent pas d'elles même si un quelconque événement les déclenche.

exemple de notification

Les menus ont également été implémentés, ils apparaissent en haut sur bureau. Sur petits écrans (téléphones), ils ne seront sûrement visibles que suite à l'appui de la touche idoine.

Grâce au fonctionnement de Salut à Toi, ceux-ci permettent déjà de faire des actions de base comme ajouter ou modifier un contact et avancées comme piloter son serveur.

Enfin le lancement d'une conversation peut se faire de plusieurs manières. On peut en commencer une en cliquant sur un contact dans le widget « liste de contacts », ou en tapant son jid dans un widget « chat » (il devrait rapidement être possible de taper quelques lettres pour avoir les suggestions). Les conversations ne se ferment pas quand on change de widget, on peut accéder aux conversations en cours en faisant passer son doigt (ou sa souris pendant un clique) rapidement vers la droite ou la gauche, cf. la vidéo ci-dessous. Il sera bientôt possible de les fermer via un menu dédié.

Voilà l'état des lieux actuel. Il y a déjà eu beaucoup de travail, et l'interface commence à être vraiment utilisable. Côté bureau le plus gros est fait, il s'agit maintenant d'adapter l'interface aux fonctionnalités (afficher l'accusé de réception par exemple), et à faire de nouveaux widgets. Un gros morceau reste toutefois l'affichage du contenu HTML, vu que ça n'est pas géré de base par Kivy (mais il y a différentes solutions possibles).

En ce qui concerne Android, il va y avoir une partie qui risque d'être un peu difficile pour faire le port, mais je ne m'inquiète pas plus que ça.

J'envisage également de faire un port sur Ubuntu Touch, j'ai commandé à cette fin une tablette d'occasion qui devrait me permettre de l'installer (ce n'est pas une promesse, juste une éventualité).

Ah et bien sûr, Cagou va profiter des fonctionnalités de SàT, y compris le chiffrement de bout en bout (OTR pour le moment, mais OpenPGP est envisagé pour la 0.7, et peut-être OMEMO également).

Petite note pour les programmeurs : une fois la prise en main passée (qui n'est pas très difficile), j'apprécie beaucoup travailler avec Kivy, c'est souple, agréable à utiliser et ça fonctionne jusqu'ici très bien, félicitation aux équipes derrière.

Je conclus sur une bouteille à la mer : c'est un travail absolument énorme de travailler sur SàT, et à l'heure actuelle je suis pratiquement seul dessus, et en plus de mon emploi salarié. Le projet avance toujours à bon train, mais j'ai besoin d'aide. La base de code est importante, mais il n'est pas insurmontable de s'y mettre : Chteufleur mentionné plus haut a pu rapidement écrire des greffons et a fait les implémentations des XEP-0070 et XEP-0184.

Il est aussi possible de contribuer en dehors du code : empaquetage pour des distributions, tests, graphismes, traductions, installation de serveurs, etc. Contribuer à une bibliothèque utilisée par SàT (comme l'implémentation de XMPP dans Twisted ou Kivy) est également très utile.

Au passage, je rappelle à ceux qui ont participé à la campagne de financement, qu'ils peuvent nous contacter sur « contact chez salut-a-toi point org » pour réclamer leur contrepartie, ou la demander plus tard s'ils préfèrent.

À très bientôt pour la suite :)

Want a decentralized, encrypted, Free (as in freedom) “social” app on Android and desktop ?

goffi 26/10/2015, 14:03 GNU-Linux jabber-xmpp-en SàT projet

http://ftp.goffi.org/media/pictures/arizuka_android_2015_50%25.png

We have just launched a crowdfunding campaign to develop a new frontend to Libervia, and port it to Android (in a native application!).

http://www.arizuka.com/en/projects/libervia (subtitles available in many languages).

If the campaign is successful, we'll have a unique tool. Here are only a few features managed by Libervia:

  • blogging/microblogging: we have a decentralized blogging engine based on XMPP, no need to create an account/validate an email to post a comment
  • instant messaging, single or multi-user, with a lot of features
  • end to end encryption: we already manage OTR for single chat, there is a good probability that we also implement OMEMO/Axolotl
  • file sharing: being file uploading or P2P transfer
  • group permissions: similarly to what others call “circle” or “aspect”, you can share with only your friends or your family
  • a lot more, check http://salut-a-toi.org/features.html (and don't miss the experimental ones)

In addition we are a non-profit association focusing on ethic, we want to make a good tool, not a place for advertisements!

So if you are looking for next-gen communication tool, please support us and share the link: http://www.arizuka.com/en/projects/libervia

Thanks !

http://salut-a-toi.org/static/images/screenshots/libervia/libervia_overview.png

Installer une instance de Libervia (SàT) en moins de 10 min

goffi 10/03/2016, 18:51 jabber-xmpp projet GNU-Linux planet-libre SàT seenthis Libre Tutorial Libervia_installation

Bon avouons le tout de suite, je triche, 2 fois. La première c'est que nous allons utiliser les images Docker autrement dit des versions pré-installées et qui facilitent la vie. La deuxième c'est que quand je dis « moins de 10 min », je ne compte pas le temps de téléchargement de ces images, qui peut bien évidemment varier selon la vitesse de votre connexion.

Ceci dit, voyons comment avoir une instance de Libervia, l'interface web du projet « Salut à Toi », fonctionnelle de manière triviale. Pour mémoire il s'agit d'un outil de communication (d'aucuns parlent de « réseau social ») basé sur le protocole standard et ouvert « XMPP », et donc compatible avec la multitude de logiciels déjà existants.

Préparatifs

Docker

Il vous faut essentiellement avoir Docker installé sur votre machine. Sur une Debian ou dérivée (Ubuntu, Linux Mint – attention dans ce dernier cas, elle a récemment été compromise –, etc) il suffit de faire :

# apt-get install docker.io

En tant que root (c.-à-d. précédez de « sudo » si nécessaire). Dans les autres cas, reportez-vous à la documentation officielle.

Il faut ensuite vous ajouter au groupe « docker », ce qui devrait pouvoir se faire avec

# adduser <votre_nom_d_utilisateur> docker && newgrp docker

Ou, si vous avez sudo installé et configuré (c'est le cas sur Ubuntu par exemple):

# sudo adduser $(whoami) docker && newgrp docker

À partir de maintenant, il n'est plus besoin d'être root, vous pouvez faire la suite avec votre utilisateur normal, qui vient d'être ajouté au groupe « docker ».

libervia_cont.sh

La deuxième chose à faire est d'installer le script libervia_cont.sh qui aide grandement à la gestion des conteneurs de Libervia. Pour cela, il suffit d'entrer :

wget https://repos.goffi.org/sat_docs/raw-file/tip/docker/libervia_cont.sh && chmod a+x libervia_cont.sh

(si wget n'est pas présent, installez-le, par exemple avec « apt-get install wget »)

Lancement

Pour lancer Libervia, il vous faut maintenant entrer :

./libervia_cont.sh

Et c'est tout ! Si si, je vous assure, le script et Docker se chargent de télécharger les images (ce qui peut prendre un peu de temps selon votre connexion) et de les lancer, À la fin, vous allez voir une liste de ports s'afficher, en particulier vous devez avoir une ligne qui ressemble à :

port 8080 (HTTP):                       0.0.0.0:32771

Le numéro à la fin est le port choisi par Docker pour accéder à Libervia via HTTP, il vous suffit d'ouvrir votre butineur sur http://localhost:32771 (en remplaçant 32771 par le port que vous avez bien sûr) et vous devriez voir apparaître la page d'accueil de Libervia. Le serveur n'est accessible qu'après quelques secondes.

Libervia login

Plutôt simple non ? Bon comme c'était trop facile, voyons voir comment configurer tout ça.

Configuration

ports

Une des options les plus importantes est l'option -p, qui permet de lancer Libervia avec des ports fixes, ainsi vous pourrez atteindre Libervia sur le port 8080 et non un port qui change à chaque lancement.

Vous pouvez spécifier des ports différents grâce aux variables d'environnement SAT_CONT_PORT_xxxxxxxx est le port que vous voulez remplacer. Ainsi si vous voulez utiliser les ports 80 et 443 qui sont les ports standard HTTP et HTTPS, plutôt que 8080 et 8443, il vous suffit de faire, avant de lancer libervia_cont.sh :

export SAT_CONT_PORT_8080=80
export SAT_CONT_PORT_8443=443

nom de domaine

Si vous avez déjà votre nom de domaine (l'obtention d'un nom de domaine et sa configuration dépassent le cadre de cet article, mais les explications ne manquent pas sur le web), vous pouvez le spécifier avec l'argument -d ou avec la variable d'environement SAT_CONT_DOMAIN, exemple :

export SAT_CONT_DOMAIN=goffi.org

éditer les fichiers

Vous pouvez éditer le fichier de configuration de SàT/Libervia en tapant simplement

./libervia_cont.sh config

De même, pour éditer la configuration du Prosody intégré, faites

./libervia_cont.sh config prosody

Sauvegardes

Le script gère également les commandes de sauvegardes. Pour faire une sauvegarde, il suffit de taper

./libervia_cont.sh backup

Ceci crééra un fichier sat_data_backup_<date_de_sauvegarde>.tar.gz. Pour le restaurer plus tard, vous n'aurez qu'à faire

./libervia_cont.sh restore sat_data_backup_<date_de_sauvegarde>.tar.gz

À suivre…

Cet article est le premier d'une petite série où je vais vous expliquer comment mettre en place et publier dans un blog comme le mien (qui tourne désormais avec SàT/Libervia) grâce à ce que nous venons d'installer. La prochaine fois (demain ?) j'expliquerai la configuration avancée (certificat personnalisé, lancement automatique).

Si vous parlez anglais, l'utilisation des images Docker et du script libervia_cont.sh sont documentés sur le wiki.

Nous aimerions beaucoup faciliter l'installation de Libervia avec d'autres méthodes, par exemple avec des scripts pour YunoHost, un peu d'aide serait très appréciée, car nous sommes déjà bien chargés. Si vous pensez pouvoir participer, venez en discuter sur le salon sat@chat.jabberfr.org.

N.B. : comme vous l'avez vu l'image contient un serveur XMPP (Prosody) pré-configuré pour simplifier l'installation. Cependant Salut à Toi et donc Libervia marchent bien évidemment avec tout autre serveur (les fonctionnalités seront juste adaptées selon ce qui est disponible), et vous pouvez créer un profil externe, sur un autre serveur (vous pouvez même entrer directement un jid et un mot de passe existant dans Libervia). Il est probable qu'il existe de futures variantes de ces images sans serveur XMPP pré-installé, ou avec un autre.

S

souliane 11/03/2016, 12:22

Super ! Un petit « hic » : docker ne s'installe pas (encore) sur les mini-serveurs come OLinuXino ou Raspberry Pi. Ou bien il faut bidouiller, il y a quelques procédures qui trainent sur Internet... ceci dit l'installation normale sans Docker fonctionne bien, c'est juste que ca demande un peu plus de temps. Le compte avec lequel je poste ici est connecté sur une instance de Libervia qui tourne sur un serveur maison OLinuXino.

Importer un blog Dotclear dans XMPP

goffi 23/03/2016, 11:12 jabber-xmpp projet GNU-Linux planet-libre SàT seenthis Libre Tutorial Libervia_installation

Articles précédents de la série : Installer une instance de Libervia (SàT) en moins de 10 min et Configuration avancée du conteneur Libervia

Pour le troisième article de cette série sur l'installation d'un blog XMPP avec Libervia, je vais vous montrer comment importer un blog Dotclear.

Notez bien que ceci marchera avec Libervia/Salut à Toi, mais devrait fonctionner également avec Movim, ou Jappix, ou autre futur client XMPP gérant le blogage. Aussi, je parle ici de Dotclear, mais nous avons un système générique d'imports avec pour le moment 2 « importeurs » : Dotclear et Dokuwiki. Dotclear a été choisi car c'est celui que j'ai utilisé pour mon blog, mais le principe est le même si vous voulez importer du Dokuwiki.

À terme, et selon la demande (et notre temps disponible — ou les contributions), nous pourrons ajouter d'autres importeurs, Wordpress ou Pelican par exemple.

J'en profite pour remercier les équipes derrière Dotclear, c'est un moteur de blog que j'ai utilisé pendant plusieurs années et qui est vraiment bien fait. Peut-être qu'un jour il communiquera aussi via XMPP, qui sait ?

Préparation des données à importer

La première chose à faire est d'exporter le blog depuis Dotclear. Pour cela il faut vous rendre dans la console d'administration, puis cliquer sur la section maintenance :

maintenance

Ensuite cliquez sur l'onglet « Backup » (Sauvegarde), selectionnez « Download database of current blog » (charger la base de données du blog courant) puis cliquez sur « Execute task » (Lancer la tâche) :

onglet backup

Vous n'avez plus qu'à sélectionner le répertoire où sauvegarder votre fichier, vous devriez avoir un fichier avec un nom similaire à 2016-03-21-15-15-default-backup.txt.

Utilisation de jp avec le conteneur

Pour le moment, seul le frontal en ligne de commande de « Salut à Toi », jp, permet l'import. L'idéal serait de l'avoir installé en local sur votre machine, mais comme jusqu'ici nous avons utilisé les conteneurs Docker, continuons avec.

« Salut à Toi » va avoir besoin d'accéder à la sauvegarde Dotclear que nous avons générée précédemment. Comme les conteneurs sont isolés du système de fichier, nous allons devoir demander à Docker de monter le répertoire parent via SAT_CONT_DK_EXTRA, que nous avons vu dans les précédents articles :

export SAT_CONT_DK_EXTRA="-v /tmp/dotclear_backup:/backup"

remplacez « /tmp/dotclear_backup » par le chemin vers le répertoire où se trouve votre sauvegarde. Il faut ensuite redémarrer les conteneurs pour que cela soit pris en compte :

./libervia_cont.sh restart -p

Comme indiqué sur la page wiki des conteneurs, il est possible d'utiliser jp avec le conteneur « Salut à Toi » en utilisant la commande suivante :

alias jp-docker="docker run --rm -ti --link sat:sat salutatoi/jp:latest"

à utiliser après avoir lancé les conteneurs bien entendu. Par la suite j'utiliserai jp ou jp-docker indifféremment, utilisez l'alias que vous avez défini ici (soit jp-docker si vous avez gardé le même).

Assurons-nous ensuite que cela fonctionne :

% jp-docker --version
jp 0.6.0D (rev fd959c8f64b6 (default 2016-03-18 10:25 +0100)) Copyright (C) 2009-2016 Jérôme Poisson, Adrien Cossa
This program comes with ABSOLUTELY NO WARRANTY;
This is free software, and you are welcome to redistribute it under certain conditions.

Si vous avez bien le message de version qui s'affiche, tout va bien, sinon venez demander de l'aide sur notre salon XMPP.

C'est la commande jp blog import que l'on va utiliser, vous pouvez voir les options disponibles avec jp blog import --help.

Assurez-vous d'avoir créé un profil (en utilisant le dialogue de création de compte de Libervia par exemple). Pour utiliser blog import, votre profil doit être connecté, soit depuis Libervia, soit en demandant à jp de le faire avec les arguments -cp goffi --pwd <mot_de_passe> : -c demande la connexion, -p goffi indique que l'on souhaite utiliser le profil « goffi » (à adapter bien sûr), et « --pwd <mot_de_passe> » est explicite. Une fois votre profil connecté, seule l'option « -p goffi » est nécessaire, sauf si c'est votre profil par défaut (on reviendra sur cette notion une autre fois).

Commençons par voir les importeurs disponibles :

% jp-docker blog import -cp goffi --pwd totototo
dotclear: import posts from Dotclear blog engine
dokuwiki: import posts from Dokuwiki blog engine

Pour avoir des détails sur l'importeur choisi, indiquez son nom tout simplement :

% jp-docker blog import -pgoffi dotclear
dotclear: import posts from Dotclear blog engine

This importer handle Dotclear blog engine.

To use it, you'll need to export your blog to a flat file.
You must go in your admin interface and select Plugins/Maintenance then Backup.
Export only one blog if you have many, i.e. select "Download database of current blog"
Depending on your configuration, your may need to use Import/Export plugin and export as a flat file.

location: you must use the absolute path to your backup for the location parameter

N.B. comme mon profil « goffi » a été connecté avec la commande précédente, je n'utilise plus « -c » ni « --pwd xxx »

Voilà, il n'y a plus qu'à faire l'import, avec la commande suivante (que j'explique ci-dessous) :

jp-docker blog import -pgoffi dotclear /backup/2016-03-21-15-15-default-backup.txt --ignore-tls-errors --host www.goffi.org  -P --upload-ignore-host goffi.org

Explications :

  • jp-docker blog import -pgoffi dotclear /backup/2016-03-21-15-15-default-backup.txt : nous l'avons vu précédemment, on indique d'importer la sauvegarde Dotclear située à /backup/2016-03-21-15-15-default-backup.txt pour le profile « goffi »

  • --ignore-tls-errors indique de ne pas faire d'erreur en cas de certificat invalide, ce qui est le cas de notre certificat auto-signé. Si vous avez installé un certificat valide comme vu dans l'article précédent, vous pouvez ignorer cette option

  • --host www.goffi.org indique le nom du blog originel, c'est nécessaire pour re-construire les chemins relatifs de la sauvegarde

  • -P permet d'afficher une barre de progression

  • --upload-ignore-host goffi.org indique de ne pas téléverser les images en provenance de l'hôte indiqué, en effet par défaut jp blog import va téléverser (« uploader ») via XMPP toutes les images trouvées sur le blog. Ce comportement peut-être désactivé avec l'option --no-images-upload

Et voilà ! À la fin de l'import (qui ne devrait pas être très long sauf si très gros blog, c'est de l'ordre de quelques minutes), vous allez avoir un long texte s'afficher, ce sont les options à copier/coller dans sat.conf (grâce à ./libervia_cont.sh config) dans la section [libervia]. La deuxième option (url_redirections_dict) permet de rediriger les anciennes URL de votre blog vers les nouvelles dans Libervia, évitant ainsi les liens cassés.

Vous pouvez d’ailleurs ajouter vos propres redirections, par exemple j'ai ajoutés celles-là sur mon blog :

url_redirections_dict = {
    "/": "/blog/goffi",
    "/videos": "file:/videos",
    "/feed/atom": "/blog/goffi/atom.xml",
    "/feed/tag/SàT/atom": "/blog/goffi/atom.xml?tag=SàT",
    [ETC]
}

La première redirige la page principale sur mon blog, plutôt que sur la fenêtre de connexion de Libervia. La deuxième permet d'accéder aux vidéos via le chemin absolu /videos (qui est monté comme vu précédemment via SAT_CONT_DK_EXTRA). Enfin les suivantes permettent de garder les liens vers les flux Atom, nécessaire vu que je suis sur plusieurs « planètes » et que je n'avais pas envie de m'amuser à faire changer tous les liens (j'ai tronqué mais vous comprenez le principe).

Il peut également être utile d'ajouter :

allow_registration = false

qui indique à Libervia de ne pas autoriser les enregistrements de nouveaux comptes depuis l'interface, particulièrement intéressant si vous êtes seul sur votre instance, ou si vous voulez créer les nouveaux comptes vous-même uniquement.

À suivre

À ce stade, vous devriez avoir votre blog importé et disponible via Libervia, bienvenu dans le monde des blogs XMPP ! Les avantages d'avoir son blog sur ce standard sont nombreux, et vont aller en grandissant au fur et à mesure que nous ajouterons des fonctionnalités (par exemple la possibilité de mentionner quelqu'un sur un autre blog est à prévoir probablement avant l'été), n'hésitez pas à venir discuter de ça sur notre salon.

Pour le prochain article, sans doute le dernier de cette mini série, je vous expliquerai comment publier sur ce blog.

De la place de la langue dans nos communications

goffi 22/06/2016, 18:03 réflexion jabber-xmpp projet GNU-Linux planet-libre SàT seenthis Libre

Une des belles choses qu’Internet a apporté — ou tenté d’apporter parce que certains y mettent des barrières virtuelles [1] — est la relative abolition des frontières. Il est devenu facile de communiquer avec des gens de tous pays ou presque, de partager des œuvres, de s’informer, ou encore de travailler ensemble à des milliers de kilomètres de distance. Le moyen de communication le plus utilisé est sans aucun doute l’écrit.

Quand on écrit quelque chose et qu’on le diffuse sur Internet, que ce soit un article sur un blog, de la documentation pour un logiciel, une information à communiquer, ou tout autre document public, on souhaite souvent que sa diffusion soit la plus large possible. Or à notre époque si on veut être lu, il faut adopter la culture de l’internet, publier sur les sites/réseaux en vue de l’internet et utiliser la langue de l’internet.

— la langue de l’internet ? Quelle langue de l’internet ?

— l’anglais bien sûr ! si tu veux être lu, point de salut, c’est l’anglais ou l’indifférence

— mais ceux qui ne parlent pas anglais ?

— pas anglais ? Allons allons, un peu de sérieux, tout le monde parle anglais de nos jours !

Oserais-je avancer le contraire ? Après tout il y a une commodité certaine à utiliser une langue commune, voire n’ayons pas peur des mots, universelle. Pourquoi s’embêter à traduire les choses, à rédiger plusieurs fois, à prendre du temps quand tout doit aller tellement vite ?

Eh bien osons ! Non tout le monde ne parle pas anglais, et osons même plus : il y a énormément de gens qui ne le parlent pas, ou très mal. Oui bien sûr il y a ce couple d’une autre époque, trop vieux pour avoir appris, et cet autre là, plus jeune, mais issu d’un lieu et d’un temps où l’anglais n’était pas bien vu. Ah mais attendez ! Il y aussi ce jeune là, qui n’a jamais trop bougé de sa campagne, et cet autre là qui vient d’un pays où il est peu courant de le parler, celui-là qui vient pourtant d’une grande capitale d’Europe (ce n’est pas la langue de l’Europe ?), et cet autre encore…

Même pour ceux qui le parlent, pour ceux-là, tout n’est pas si simple. Oui bien sûr il y a les « natifs », ceux dont c’est la langue maternelle, et puis il y a ceux qui ont eu les moyens de voyager, la chance d’avoir une éducation ou qui sont simplement doués pour ça. Mais même de ceux-là, combien sont capables de s’exprimer avec autant d’aisance, avec autant de nuances que dans leur langue maternelle ?

Oh, et bien entendu je fais l’impasse sur la culture que la langue véhicule, sur l’influence exacerbée des auteurs anglophones, et sur l’isolation des autres.

Accepter la domination de quelques langues ce n’est pas seulement refuser l’accessibilité ; c’est tuer la diversité et avant tout formater notre façon de penser.

Parlons maintenant un peu plus technique

Quand on écrit un message dans un système de discussion, il est possible de l'« étiqueter » avec des informations (les métadonnées) et en particulier de préciser la langue dans lequel il est rédigé. Cette information est disponible naturellement avec le protocole XMPP, et il est même prévu d’envoyer un message en plusieurs langues simultanément.

Cette propriété est à mon sens essentielle et complètement sous-exploitée dans les logiciels actuels. Pourtant, elle peut être extrêmement utile : un salon de discussion peut être multilingue (les gens n’ayant que les messages dans une langue qu’ils comprennent), un système de conversation (contact d’association, support technique, demande quelconque) peut être dirigé directement vers une personne parlant la langue idoine, une traduction peut être demandée pour un message important, un programme électronique (ou « bot ») peut envoyer des messages dans plusieurs langues à la fois, les règles typographiques peuvent être adaptées, etc.

Ces informations sont désormais utilisées dans « Salut à Toi ». Un greffon expérimental permet même de détecter la langue utilisée automatiquement [2] si celle-ci n’est pas explicitement spécifiée ; ainsi dans un salon multilingue, il est possible de passer du français à l’anglais sans devoir le préciser manuellement à chaque fois.

Ci-dessous une petite animation de la détection d’un texte en plusieurs langues, puis de l’utilisation d’un filtre pour n’afficher que l’une d’entre elles.

filtrage par langue dans Primitivus

Ce n’est qu’un premier pas, il y a beaucoup de choses envisageables pour permettre aux gens de s’exprimer dans la langue qu’ils maîtrisent le mieux, et bien sûr en dehors de la messagerie instantanée également (pour le blog par exemple).

Ah, et puisque vous le demandez, non SàT n’utilisera pas de drapeaux pour les langues, ceux souvent utilisés à cette fin étant des symboles de pays et non de langues.


[1]grand « firewall » de Chine, vidéo ou autre visible uniquement depuis certains pays, blocage de sites, etc

[2]greffon basé sur langid.py, les résultats sont corrects mais pas parfaits, il y a toutefois des améliorations envisageables

Libervia (Salut à Toi) 0.6.1: XMPP blogging and more

goffi 14/07/2016, 20:19 jabber-xmpp-en projet GNU-Linux SàT Libre

The 0.6.1 release of Libervia (Salut à Toi) is out, and it is a big one (despite of the minor version number). The one which will follow — and is already well advanced — will be the « general public » release, or in other words we'll do what is necessary to have a release stable enough to be used seriously, and easy enough to install so the large public can enjoy it.

You can have a look at the changelog or the repository for more details, but here are the main changes and fixes:

  • import plugin which can be extended, with "importers" for Dotclear and DokuWiki. Please note that, thanks to the use of standards, this can be useful even if you're not using Libervia to display your blog (it's compatible with Movim for instance)

  • in addition to the Dotclear import, its wiki syntax is available for SàT too, it comes with the already available Markdown and XHTML.

  • automatic subscription to PubSub feeds for new accounts, this avoids an empty pages for newcomers

  • MAM (XEP-0313) is implemented for PubSub, this allows to go back in publication history and to search in a more flexible and powerful way. Note that MAM is not available yet for instant messaging, it's planed for 0.7

  • better detection of repository revision

  • jp (CLI) has now an option --output with who you can specify the output format (e.g. JSON so parsing by an other command is easy).

  • jp: new command to import a blog (import), (re-)edit a new/old publication (edit) or have a preview in real time (preview). We have published a tutorial in french to explain how to publish on your XMPP blog with Vim, Emacs or whatever else, any help to translate to English welcome

  • jp: commands to manage your roster: get it (get), have statistic on it (stats), or clean it (purge)

  • jp: the command "message" has been moved to "message send" to be coherent with other commands, and because a "message get" should come in the future

  • Primitivus (console interface): paste detection (a validation is needed in this case, this avoid sending a bad text like a password by mistake), and handling of "bracketed paste mode"

  • Libervia (web interface): a new option "allow_registration" allows to deactivate the new account registration page, specially useful if you are alone on your instance, or if you create accounts by your own means

  • Libervia: a new pop-up with a counter is displayed if connection with server is lost

  • Libervia: new favicon with a notification counter

  • Libervia: connection with an external jid is fixed

  • Libervia: it is now possible to redirect pages or to integrate a local directory in Libervia. That's used to display directly the blog instead of the login page on www.goffi.org.

  • Libervia: TLS chains are now handled (hello Let's Encrypt)

  • Libervia (blog): tags are now handled, including search

  • we have also updated and improved our Docker images, so you can easily install and test Libervia. Please check the wiki page with the explanations.

This is a summary of 0.6.1, but it is not covering everything!

Salut à Toi is an ethical project is staying away from big proprietary companies, if you feel like helping it contact us by email (contact at salut-a-toi d.o.t org) or on our XMPP MUC room. We need more hands!

The 0.6.1 is the last one before the "general public" one and has its issues to be improved. Don't hesitate to report them so that the 0.7 will be rock solid :)

The 0.7 will go through beta testing phase, and will bring in particular:

  • refactoring of messages, which will be needed to implement a lot of extensions which were blocked until now, like last message correction, or server side messages archives (MAM). This part is already finished, and you can see below an example of an experimental language detection plugin for Primitivus (based on langid):

language detection and filtering on Primitivus

  • Cagou, the new desktop/mobile devices frontend that we have promised after the success on our crowdfunding campain. The development is advanced, a post about it should arrive soon.

  • blog and messaging gateways

Beside all this, there is a good probability that we implement new end 2 end encryption system, in addition to the already available OTR. We specially think about OpenPGP and OMEMO.

guide : écrire un greffon pour SàT

goffi 06/07/2016, 19:12 dév tutoriel jabber-xmpp projet GNU-Linux planet-libre SàT Libre

Cela fait plusieurs fois qu’on me demande comment contribuer à SàT, le projet étant conséquent il n’est pas facile d’accès. Aussi voici un article d’introduction pour l’écriture d’un greffon pour le backend.

Il est très utile d’avoir lu l'article d’introduction sur l’architecture de SàT avant. L’intérêt de faire un greffon backend est qu’il fonctionnera avec tous les frontaux, autrement dit sur le web, sur le bureau, sur appareils portables (bientôt) voire en ligne de commande ou autre.

Nous allons faire un classique « Salut à Toi le monde ! » bien connu des développeurs.

avant de commencer, quelques remarques en vrac

Quelques remarques et notions utiles à savoir, ne vous inquiétez pas si vous ne comprenez pas tout du premier coup :

  • SàT est actuellement en Python 2, le passage à Python 3 ayant été bloqué principalement par Twisted jusqu’ici. Mais les choses ont beaucoup avancé récemment, et Twisted fonctionne désormais partiellement avec Python 3, la partie XMPP est aussi en cours de portage, et le passage à Python 3 pourra être envisagé pour SàT 0.8 (après la version « grand public » donc).

  • le style de code suit à peu près les conventions de la PEP 8, mais pas entièrement. En particulier les noms de méthodes utilisent le CamelCase pour rester cohérent avec le code de Twisted, et la limite des 80 caractères n’est pas respectée (il n’est pas impossible que cela change dans le futur), vous aurez plus de détails sur le wiki (notez bien la partie sur les docstrings).

  • le backend de SàT est entièrement asynchrone, en utilisant Twisted. C’est probablement le plus difficile à appréhender pour un débutant, et vous pouvez commencer en regardant comment font les autres parties du code pour comprendre les grandes lignes. La chose la plus importante à retenir est qu’il ne faut jamais faire de code « bloquant », c’est-à-dire long à s’exécuter, car ça bloquera tout le backend. S’il est indispensable de bloquer pour une raison ou une autre (un module tiers à utiliser par exemple), vous devrez utiliser des processus séparés. La documentation sur le site mentionné est relativement fournie quand vous vous sentirez d’approfondir le domaine…

  • la hierarchie du code (src) est actuellement comme suit:

    • bridge gère la communication avec les frontaux, c’est l'IPC (actuellement D-Bus mais d’autres options sont possibles)
    • core contient comme son nom l’indique le cœur du backend (le « Service » SàT, le client XMPP, les constantes, les exceptions spécifiques à SàT, la gestion des logs et de la traduction)
    • memory gère tout ce qui est conservation des données que ce soit en mémoire vive ou sur disque (via Sqlite pour le moment, mais d’autres options sont possibles)
    • plugins contient… les greffons, c’est à eux que l’on va s’intéresser par la suite
    • stdui contient les interfaces XMLUI de base (nous reparlerons de XMLUI plus bas)
    • test est le répertoire où sont comme vous vous en doutez les tests unitaires ou autre.
    • tmp est une hiérarchie que nous avons dû créer pour mettre du code temporaire destiné à être intégré par des projets tiers que nous utilisons, en particulier Wokkel à l’heure actuelle
    • tools est la hiérarchie un peu « fourre-tout » pour les choses utiles, en particulier XMLUI et les triggers dont nous reparlerons plus tard. La sous-hiérarchie « common » contient les modules utilisés/ables à la fois par le backend et les frontaux.
    • twisted enfin est uniquement utilisé pour l’intégration à Twisted
    • on parle souvent de profil ( profile en anglais et dans le code) qui correspond à un compte XMPP. En mode mono-utilisateur (Primitivus ou Cagou par exemple), cela peut correspondre à plusieurs comptes d’un même utilisateur (par exemple j’ai un profil jabberfr et un autre libervia.org pour mes 2 comptes correspondant). En mode multi-utilisateur (avec Libervia par exemple), cela correspond à des comptes d’utilisateurs différents.
    • à la notion de « profile » s’ajoute celle de « profile_key ». C’est en fait en mot clef qui indique un profil à utiliser (vous les trouverez dans les constantes avec PROF_KEY_XXX). En particulier PROF_KEY_DEFAULT indique d’utiliser le profil par défaut, et PROF_KEY_NONE indique une valeur non renseignée qui provoquera une exception si elle est utilisée avec getClient (voir plus bas).
    • dans les classes, on utilise souvent un attribut « host » (self.host la plupart du temps), qui correspond à l’instance du service SàT, et qui permet d'accéder à beaucoup de choses (le « bridge », la partie « memory », etc).
    • dans les méthodes, vous verrez souvent les paramètres « client » ou « profile ». « profile » correspond au nom du profil dont on a parlé plus haut, et client à l’instance du client XMPP et donc à la session associée à ce profil. On passe du profil au client en faisant « host.getClient(profile) » et du client au profil en faisant « client.profile ». Avant « profile » était systématiquement utilisé et placé en dernier paramètre (avec une valeur par défaut de C.PROF_KEY_NONE qui indique une valeur non renseignée). Désormais il a été décidé de toujours utiliser client comme premier argument, et profile uniquement quand c’est nécessaire (à l’entrée ou la sortie du « bridge » par exemple), aussi le code passe petit à petit à la nouvelle convention, et vous pouvez voir les 2 cas.
    • en début de fichier, il est souvent utile de faire ces imports :
        python from sat.core.constants import Const as C
        from sat.core.i18n import _, D
        from sat.core.log import getLogger log = getLogger( **name** )
        from sat.core import exceptions

La première ligne permet d’accéder aux constantes, avec C pour que ça reste court et lisible. La seconde importe la fonction gettext « _ » qui traduit le texte dans la langue locale au moment de son utilisation, et « D_  » qui indique qu’un texte est à traduire, mais que la traduction aura lieu plus tard dynamiquement (utile pour un menu par exemple, qu’on peut traduire différemment selon les profils). Les 2 suivantes instancient un loggeur qu’on peut utiliser assez classiquement avec log.[niveau](message), par exemple log.debug(u"mon message de debug") Enfin la dernière ligne permet d’utiliser les exceptions spécifiques à SàT, vous pouvez lire le code du module idoine pour plus d’infos.

Avec tout ça on a l’essentiel pour s’attaquer au code.

création du fichier et déclaration du plugin

La première chose à faire est de créer un fichier python dans le répertoire plugins et dont le nom commence par "plugin_". De tels fichiers sont automatiquement importés par le backend au démarrage, et à terme il devrait être possible de les mettre ailleurs (par exemple dans un dossier personnel) et de les télécharger et installer automatiquement. Vous constaterez que les greffons existant sont nommés avec leur type puis leur nom, et que ceux qui implémentent des XEPs prennent le nom de la XEP (par exemple plugin_xep_0045.py ).

Nous allons maintenant déclarer le greffon, pour celà nous utilisons une variable (un dictionnaire) nommée PLUGIN_INFO et placée en début de fichier. Voici un exemple d’en-tête avec celui du greffon XEP-0045 (le salon de groupe MUC) :

    PLUGIN_INFO = {
    "name": "XEP-0045 Plugin",
    "import_name": "XEP-0045",
    "type": "XEP",
    "protocols": ["XEP-0045"],
    "dependencies": [],
    "recommendations": [C.TEXT_CMDS],
    "main": "XEP_0045",
    "handler": "yes",
    "description": _(u"""Implementation of Multi-User Chat""")
}

  

voici les informations données:

  • name  : nom « lisible par un humain » donné au greffon
  • import_name  : nom court utilisé pour référencer ce greffon par ailleurs (depuis d’autres greffons par exemple) pour accéder à ce greffon par la suite, vous pourrez utiliser host.plugins[ nom d'import ], ainsi ici vous pourrez faire host.plugins["XEP-0045"]
  • type  : une information sur ce que qui est implémenté ; est-ce une XEP (type "XEP"), ou expérimentation (type "EXP") ? L’information n’est pas encore utilisée, mais elle devrait permettre de filtrer les greffons à l’avenir, quand ils seront téléchargeables depuis un dépôt. Les types courants ont leur constante de la forme PLUG_TYPE_*
  • protocols  : une liste de protocoles implémenté le cas échéant. Les XEP sont toujours référencées sous la forme XEP-0xxx avec « XEP » en majuscules.
  • dependencies  : autres greffons indispensables pour faire fonctionner celui-ci. C'est une liste de noms correspondant au « import_name » voulus. Ces greffons seront importés avant celui en cours, et s’ils ne sont pas disponibles l'import échouera
  • recommendations  : greffons non indispensable pour faire fonctionner celui en cours, mais qui apportent des améliorations si présents. Fonctionne de la même manière que dependencies sauf que l'import n’échouera pas si ces greffons ne sont pas disponibles
  • main  : classe principale du greffon, c’est cette classe qui sera instanciée à l'import et qu’on référencera en faisant host.plugins[XXX]
  • handler  : s’il vaut "yes", indique que le greffon va réagir à des requêtes XML particulières, toute autre valeur indique le contraire. Nous reparlerons des handlers plus tard
  • description : texte décrivant ce que fait le greffon. Vous remarquerez la présence du _() qui est utilisé pour la traduction (gettext)

Pour notre greffon que nous allons mettre dans un fichier plugin_misc_salut_le_monde.py placé dans src/plugins, nous allons utiliser le code suivant :

    #!/usr/bin/env python2
# -*- coding: utf-8 -*-

from sat.core.constants import Const as C
from sat.core.i18n import _
from sat.core.log import getLogger
log = getLogger(__name__)

PLUGIN_INFO = {
    "name": u"Salut le monde",
    "import_name": "SALUT_MONDE",
    "type": C.PLUG_TYPE_MISC,
    "main": "Salut",
    "handler": "no",
    "description": _(u"""Plugin to learn basic concepts of SàT""")
}


class Salut(object):

    def __init__(self, host):
        log.info(_(u"Salut à Toi le monde !"))

  

C'est à peu près le greffon le plus simple que vous puissiez faire. En lançant SàT, vous devriez voir quelque chose similaire à ceci dans les logs :

    2016-07-05 19:15:31+0200 [-] [sat.core.sat_main] importing plugin: Salut le monde
2016-07-05 19:15:31+0200 [-] [sat.plugins.plugin_misc_salut_le_monde] Salut à Toi le monde !

  

XMLUI

Bon tout ça c’est bien gentil, mais il serait quand même sympa d’avoir notre message sur les frontaux.

Comme vous le savez, SàT est multi-frontaux, autrement dit un message peut être affiché sur Libervia (interface web), sur Primitivus (interface console), (bientôt) sur Cagou (interface bureau/appareils portatifs) ou encore dans Emacs avec l’interface « Sententia ». Tous ces frontaux affichent les informations différemment : qui avec du texte directement, qui en HTML, qui via un cadriciel graphique, etc. Il serait ennuyant de devoir refaire l’affichage de l’interface pour chaque frontal, aussi nous avons créé un mini langage XML qui permet de décrire une interface de manière générique : XMLUI. C’est un langage descriptif simple et qui reste volontairement de haut niveau pour que le frontal affiche l’information comme il l’entend. On décrit des choses comme des textes, des JID, ou des listes.

XMLUI contient 2 classes « mères » principales : un widget (texte ou mot de passe par exemple), et un « container » (conteneur) qui dispose les widgets d’une certaine façon (verticalement, 2 par 2, en liste, etc). Vous pouvez lire le code gérant cela dans tools.xml_tools.

La création d’une interface se veut assez simple, et xml_tools contient des méthodes pour aider. Par exemple, l’interface suivante utilisée dans l'UI standard pour le gestionnaire de profils (dans stdui.ui_profile_manager) permet de demander un mot de passe si nécessaire :

    form_ui = xml_tools.XMLUI("form", title=D_('Profile password for {}').format(profile), submit_id='')
form_ui.addPassword('profile_password', value='')
d = xml_tools.deferredUI(self.host, form_ui, chained=True)
d.addCallback(self._authenticateProfile, profile)
return {'xmlui': form_ui.toXml()}

  

Rien de bien compliqué. Quelques remarques sur ce code :

  • on utilise D_ pour le titre, car il peut être traduit différemment d’un profil à l’autre
  • une UI XML peut être soumise (c.-à-d. un résultat est envoyé par le frontal au backend, le mot de passe par exemple), et la méthode appelée dans le backend retourne un dictionnaire. Si celui-ci est vide, le dialogue est fini, s’il retourne une nouvelle interface avec la clef « xmlui », celle-ci sera affichée.
  • pour soumettre une interface on peut soit enregistrer une callback via host.registerCallback (l’identifiant retourné sera utilisé avec submit_id au moment de la création de l'UI), soit utiliser une XMLUI « déferrée » comme ici, ce qui permet d’utiliser le mécanisme de Deferred de Twisted, submit_id doit dans ce cas être une chaîne vide.

Pour notre greffon de test, nous n’avons pas besoin de quelque chose nécessitant une réponse, nous pouvons utiliser la méthode xml_tools.note qui facilite les choses.

Pour utiliser une XMLUI, il y a plusieurs méthodes : création d’une callback via un menu par exemple, ou envoi d’un signal aux frontaux pour leur indiquer qu’il faut afficher l’interface, c’est ce que nous allons faire ici avec la méthode host.actionNew  :

    host.actionNew({"xmlui": xml_tools.note(u"Salut à Toi le monde !").toXml()}, profile=profile)

  

Remarquez le toXml() nécessaire pour convertir l'UI XML en texte utilisable à travers le bridge.

Nous avons presque notre greffon qui affiche un message, mais il y a encore un problème à régler : le greffon est importé au chargement du backend, un moment où les frontaux ne sont pas encore actifs, aussi nous ne pouvons pas afficher le message dans l'__init__, il serait envoyé dans le vide.

La solution est simple : nous allons afficher le message quand le profil est connecté. Dans ce cas, la méthode profileConnected, si elle existe, est appelé pour chaque greffon, avec pour seul argument le nom de profil.

Notre code devient donc :

    #!/usr/bin/env python2
# -*- coding: utf-8 -*-

from sat.core.constants import Const as C
from sat.core.i18n import _
from sat.core.log import getLogger
log = getLogger(__name__)
from sat.tools import xml_tools

PLUGIN_INFO = {
    "name": u"Salut le monde",
    "import_name": "SALUT_MONDE",
    "type": C.PLUG_TYPE_MISC,
    "main": "Salut",
    "handler": "no",
    "description": _(u"""Plugin to learn basic concepts of SàT""")
}


class Salut(object):

    def __init__(self, host):
        self.host = host
        log.info(_(u"Salut à Toi le monde !"))

    def profileConnected(self, profile):
        msg = u"Salut à vous {} et le monde !".format(profile)
        self.host.actionNew({"xmlui": xml_tools.note(msg).toXml()}, profile=profile)

  

En lançant Primitivus, voici ce que l’on voit :

résultat avec Primitivus

…et avec Libervia :

résultat avec Libervia

Vous aurez un message équivalent sur les autres frontaux.

À savoir également

Nous n’irons pas plus loin pour ce premier guide afin de ne pas être trop indigeste, mais il peut être utile d’expliquer succinctement d’autre éléments :

  • il y a des paramètres que vous pouvez utiliser pour configurer votre greffon. Ils sont déclarés en XML, et il existe 2 types : « general » pour un paramètre global du backend (par exemple le port d’un serveur), et « individual » pour les paramètres qui changent avec les profils, ce qui est le cas le plus courant (par exemple le JID est un paramètre individuel).

  • il y a un mécanisme de menus qui permettent d’associer une action (souvent un XMLUI) à un menu. Il y a plusieurs types de menus (regardez les constantes C.MENU_*) : C.MENU_GLOBAL sera le menu principal, tandis que C.MENU_JID_CONTEXT sera utilisé en cliquant sur un jid (un contact par exemple).

  • si votre greffon gère une tâche longue quelconque (par exemple un transfert de fichier), il y a un mécanisme pour gérer les progressions, regardez les méthodes progress* pour avoir une idée de leur fonctionnement

  • autre notion importante : la limite de sécurité. Il s’agit d’un simple entier qui indique si une méthode peut être utilisée en environnement restreint ou pas. Pour un frontal utilisé par un simple utilisateur ça n’est a priori pas utilisé, mais un frontal multi-utilisateur comme Libervia, ça permet de limiter ce qui peut être changé (le port d’un serveur ne doit pas être changé tandis que la syntaxe favorite peut l’être par exemple). Vous trouverez des explications sur le wiki.

  • si votre greffon réagit au XML qui passe (ce qui est probablement — mais pas forcément — le cas si vous implémentez une XEP), il agit en « handler » et doit déclarer « "handler": "yes" » dans PLUGIN_INFO. Au moment de l'import, la méthode getHandler sera appelée et elle doit retourner l'instance à utiliser. Pour gérer « disco », votre classe doit implémenter wokkel.disco.IDisco et les méthodes getDiscoInfo et getDiscoItems, référez-vous au code des différents greffons pour bien comprendre.

  • enfin les triggers permettent de modifier le comportement de SàT (du cœur ou d’un plugin), ce sont des méthodes qui sont appelées à certains endroits (d’autres projets parlent parfois de « hook »). Ils peuvent être utilisés par exemple pour modifier un message (le greffon OTR les utilise pour chiffrer le contenu). Il ne faut les utiliser que si nécessaire, car ils compliquent un peu la lecture du code.

Et bien entendu, vous pouvez toujours venir chercher de l’aide sur le salon MUC de SàT : sat@chat.jabberfr.org.

À vos claviers ! Et n’oubliez pas de nous faire signe si vous vous lancez dans quelque chose :)

P.-S. : les morceaux de codes ne sont pas mis en couleurs à l’heure actuelle, j’envisage de faire un greffon pour intégrer pygments, mais pour le moment la priorité est le développement de Cagou.

Collective radio (with video)

goffi 02/02/2012, 00:00 GNU-Linux jabber-xmpp-en SàT projet Libre

G'day everybody

after the shell pipe over XMPP, here is a new feature in "Salut à Toi": collective radio.

The idea is: you are in a chat room with a common playlist, and everybody can add a song to the playlist. The song is played simultaneously for everybody, making it a collective radio experiment.

So far, there are maximum 2 songs in queue, as soon as one song is played, anybody can add a new one. In the future, we can imagine a more sophisticated system to choose who can add a song in queue (e.g. each one in turn, with a vote if songs played are appreciated, or with a game: the one who can answer a quiz question can choose next song).

Maybe in the future we'll see thematic rooms: jazz, rock, experimental, discovery, song with nice lyrics, etc. Or maybe we'll spend some evenings with friends, each one adding nice songs after the other, or playing blind test. We can also imagine party were everybody can participate to the playlist.
If in addition you use it on your phone: you are your own radio disc jockey :)

Following is a video showing the current implementation of the proof of concept, it's in french but quite easy to understand.

For the record: I'll be in Brussels next weekend for the FOSDEM, where I'll make a demo of the project at the XSF stand; don't hesitate to come to have a chat :). In addition I'll have a short talk in the devroom on saturday evening (18:00), you can have more information by clicking on this link.

To play the video, you nead a recent browser (e.g. Firefox 4+ or the last Chromium).
You can also use VLC (>=1.1 only), by using this url as a flux: http://www.goffi.org/videos/pr%c3%a9sentation_S%c3%a0T_5_radio_collective.webm

Last but not least, you can use mplayer: mplayer "http://www.goffi.org/videos/pr%c3%a9sentation_S%c3%a0T_5_radio_collective.webm"

This video is licensed under Creative Common BY-SA

Movim Network 16/03/2012, 15:23

Hello ! We need to interconnect with some other social networks, if they wish to do. We really think a social network can't stay alone.

You could discover us on our Wiki http://wiki.movim.eu/ or come to speak with us on our Mailing List (not very active, don't hesitate to post) http://wiki.movim.eu/mailing_list

There is also a MUC XMPP but we aren't always on it

Vincent, french coordinator of communications of the Movim Project

http://movim.eu/


author website