Table des matières

Errbot

Errbot est un logiciel de bot multiplateforme, dont XMPP et IRC, (là où Eggdrop et Limnoria fonctionnent avant tout sur IRC).

On peut utiliser des “bots” sur les canaux de discussions pour divers usages. Nous avons sur nos canaux un bot qui ramène les dernières infos de certains flux RSS et est parfois animé de sa propre vie : Pendorid. Ce bot est mis en place grâce au logiciel Errbot.

Cet article détaille comment gérer un bot avec Errbot. Il vaut mieux installer Errbot sur un serveur afin que le bot soit présent en permanence ensuite.

Errbot répondait difficilement à certains de nos besoins tout en consommant un peu trop de mémoire à notre goût pour le peu qu'il faisait, nous ne l'avons pas gardé pour Khaganat, préférant une solution maison : Botlogmauve.

Installation

Il faut faire ce qui suit avec python3.

Sous Debian stable, python est encore par défaut à une vieiiiiiille version, alors que python3 est pourtant présent.

Donc, changeons ça :

rm /usr/bin/python
ln -s /usr/bin/python3 /usr/bin/python 

Si vous avez des erreurs sur python lors d'une mise à jour du système, remettez le lien symbolique sur python2 le temps de faire la mise à jour.

Note : ce n'est pas bien de faire ça comme ça. Mais ça marche.

Via Pipenv

Pipenv est probablement la façon la plus propre de gérer les choses. L'installation sous Debian est cependant un peu baroque.

sudo apt install python3-pip python3-requests

Puis installez pipenv, avec l'utilisateur (pas en root !) afin de ne pas casser le système :

python -m pip install pip --upgrade --user
python -m pip install pipenv --user

Source : http://sametmax.com/pipenv-solution-moderne-pour-remplacer-pip-et-virtualenv/

Note : avec Debian, il faudra remplacer la simple commande pipenv par python -m pipenv. Pourquoi faire simple ?

On créé un dossier où errbot sera installé et on installe ses dépendances :

mkdir -p "~/errbot"
‎cd "~/errbot"
python -m pip install sleekxmpp pyasn1 pyasn1-modules --user
‎python -m pipenv install errbot

Si vous avez des erreurs à ce stade, lisez bien ce qui est indiqué.

Par exemple, sleekxmpp a un bug, il faut installer une version précédente. Un problème de compatibilité a également été constaté avec les deux autres dépendances.

La commande pour installer ces dépendances dans une version antérieure devient donc

python -m pipenv install sleekxmpp==1.3.1 pyasn1==0.3.7 pyasn1-modules==0.1.4

J'ai aussi eu droit à quelque chose qui se terminait de cette façon :

You can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.Hint: try $ pipenv lock --pre if it is a pre-release dependency
Could not find a version that matches pygments-markdown-lexer>=0.1.0.dev39
Tried: 0.1.0.dev39
There are incompatible versions in the resolved dependencies.

Résolu en faisant ce qui était écrit :

python -m pipenv install --skip-lock
python -m pipenv graph

On peut enfin initialiser le premier lancement du bot :

‎python -m pipenv run errbot --init 

Alternative sans pipenv

virtualenv --python $(which python3) ~/.errbot-ve
source .errbot-ve/bin/activate
~/.errbot-ve/bin/pip install errbot

mkdir ~/errbot
cd ~/errbot
errbot --init

source .errbot-ve/bin/activate met dans un environnement virtuel, pour en sortir il suffit de faire deactivate, et relancer la commande source .errbot-ve/bin/activate pour y revenir.

Pour XMPP, il faut installer des trucs en plus :

pip install sleekxmpp pyasn1 pyasn1-modules

Si jamais ça coince dans le virtualenv, on doit sortir afin d'installer certains paquets, puis les réimporter dans le virtual-env :

deactivate
pip install sleekxmpp pyasn1 pyasn1-modules
source .errbot-ve/bin/activate
cd ~/errbot
pip install sleekxmpp pyasn1 pyasn1-modules
errbot

Config.py

Le fichier ~/errbot/config.py contient la configuration du bot ; les exemples de ce qu'on peut y mettre sont dans http://errbot.io/en/latest/_downloads/config-template.py.

Voici ce qu'il contient chez nous (à un mot de passe près) :

config.py
import logging
 
# This is a minimal configuration to get you started with the Text mode.
# If you want to connect Errbot to chat services, checkout
# the options in the more complete config-template.py from here:
# https://raw.githubusercontent.com/errbotio/errbot/master/errbot/config-template.py
 
#Config de base
BOT_DATA_DIR = '/home/lapinou/erbaut/data'
BOT_EXTRA_PLUGIN_DIR = '/home/lapinou/erbaut/plugins'
 
BOT_LOG_FILE = '/home/lapinou/erbaut/errbot.log'
BOT_LOG_LEVEL = logging.INFO
 
#IPV6 pour voir si ça passe
XMPP_USE_IPV6 = True
 
# Liste des admins autorisées à modifier le bot en ligne
BOT_ADMINS = ('moi@xmppserver.com', )  
 
#Install auto des dépendances des plugins
AUTOINSTALL_DEPS = True
 
## XMPP
BACKEND = 'XMPP'  
 
BOT_IDENTITY = {
	# XMPP
    'username': 'bot@xmppserver.com',  # The JID of the user you have created for the bot
    'password': 'ACHANGER', 
    }
 
CHATROOM_PRESENCE = ('salon1@chat.xmppserver.com','salon2@chat.xmppserver.com',)
 
# "nick" of the bot in the room
CHATROOM_FN = 'Erbaut'
 
## Prefix configuration
# autre nom auquel le bot répond (même si c'est dans une phrase ?)
BOT_ALT_PREFIXES = ('pendorid',)
 
# Evite que la casse change quelque chose
BOT_ALT_PREFIX_CASEINSENSITIVE = True
 
## Contrôles d'accès et droits
ACCESS_CONTROLS_DEFAULT = {}
ACCESS_CONTROLS = {
    'say': {
        'allowrooms': ('salon1@chat.xmppserver.com','salon2@chat.xmppserver.com',),
        'denyusers':('toi@xmppserver.com',)
    },
}
HIDE_RESTRICTED_COMMANDS = True

Contrôle des ACL

La partie des contrôles d'accès est importante.

Par défaut, tout le monde a les accès :

ACCESS_CONTROLS_DEFAULT = {}

Mais en réalité, c'est les admins qui ont ces accès ouverts, hein…

On va ensuite définir des utilisateurs, des salons qui ont des accès, et définir qui peut faire quoi avec quels plugins

ACCESS_CONTROLS_DEFAULT = {} # autoriser l'accès à tout le monde par défaut
ACCESS_CONTROLS = {'status': {'allowrooms': ('someroom@conference.localhost',)},
                   'about': {'denyusers': ('*@evilhost',), 'allowrooms': ('room1@conference.localhost', 'room2@conference.localhost')},
                   'uptime': {'allowusers': BOT_ADMINS},
                   'help': {'allowmuc': False},
                   'ChatRoom:*': {'allowusers': BOT_ADMINS},
                  }

On peut définir les noms explicitement (par exemple user@jabber.fr), mais aussi par groupe dans le style unix : user@localhost ou même *@localhost. Le groupe d'utilisateur BOT_ADMINS est aussi autorisé (incluant tout ce qui a été déclaré admin du bot).

Passer le bot en démon

La documentation officielle donne, pour lancer errbot en démon :

errbot --daemon

Je ne sais pas comment “marche” cette commande : si le serveur a un souci, est-ce qu'elle se relance au démarrage ? Ça parait incertain.

Cependant, sous la plupart des systèmes Linux, la bonne pratique consiste maintenant à passer par systemd.

Nous allons donc créer un service presque proprement.

Lancement automatique avec systemd

Version Tycho Brahe

C'est probablement presque la bonne façon de faire, sauf que ça ne marche pas pour moi avec pipenv… — zatalyz 2018/04/29 11:01

Afin de lancer le bot automatiquement à chaque redémarrage de la machine, il est possible de créer un service systemd. Et afin d'avoir plusieurs instances, on décide d'un répertoire qui contiendra le dossier de chaque instance.

Créons donc /etc/systemd/system/errbot@.service :

[Unit]
Description=Chat bot
After=network.target network-online.target

[Service]
Type=simple
User=khaganat
Group=khaganat
ExecStart=/path/to/.errbot-ve/bin/errbot --config=/path/to/config/%I/config.py

[Install]
WantedBy=multi-user.target

Il est alors possible d'activer une instance :

# systemctl enable errbot@monbot
# systemctl start errbot@monbot

Avec l'exemple ci-dessus, la configuration utilisée sera /path/to/config/monbot/config.py

Version Zatalyz

Créer plutôt /etc/systemd/system/errbot.service parce qu'avec le @ j'arrivais pas à faire enable

[Unit]
Description=Chat bot Errbot
After=network.target network-online.target
 
[Service]
Type=simple
User=khaganat
Group=khaganat
WorkingDirectory=/home/khaganat/chatbot/errbot/
ExecStart=/usr/bin/python -m pipenv run errbot
Restart=always
KillSignal=SIGINT
 
[Install]
WantedBy=multi-user.target

Contrairement à la version de Tycho, ça ne sera pas multi-bot, mais à ce stade, je m'en fous.

Administrer le bot

Après pas mal d'errance, voici comment administrer le bot depuis xmpp lui-même.

Renseigner son identifiant jabber dans config.py

BOT_ADMINS = ('*@localhost','moi@xmppserver.com',) 

Puis ajouter le bot à ses contacts, et initier la conversation depuis les contacts, pas depuis le salon, sinon il croit qu'on est le salon ! Pour vérifier comment il nous voit, il suffit de lui envoyer la commande “!whoami”. C'est peut-etre lié au client jabber.

Commandes de base utiles

Pour avoir la liste des commandes de base

!help

Pour vérifier s'il sait qui on est :

!whoami

Pour voir les dernières infos du log du bot (pas le log des canaux hein, mais ce qui est passé en info au bot)

!log tail

Par défaut c'est assez long, on peut mettre un chiffre en paramètre pour limiter le nombre de lignes :

!log tail 10

Pages

La doc d'errbot est assez mal fichue, trouver les bonnes pages c'est la misère…

Plugins

Pour installer des plugins, il faudra que git soit présent sur le serveur où le bot fonctionne.

sudo apt install git

Installer un plugin

!repos install nomgithub/nomplugin

Désinstaller un plugin

!repos uninstall nomgithub/nomplugin

SayBot

https://github.com/log0ymxm/err-say est un plugin qui permet de faire causer le bot et il marche.

Pour l'installer :

!repos install log0ymxm/err-say

Il faut configurer les acl sinon elle n'a pas le droit de causer, par défaut.

Dans config.py, on renseigne pour la commande say :

ACCESS_CONTROLS = {
    'say': {
        'allowrooms': ('salon1@chat.xmppserver.com','salon2@chat.xmppserver.com',),
    },
}

Voir la configuration des ACL pour plus de détail.

La commande pour le faire causer :

!say salon:message

Par exemple :

!say salon1@chat.xmppserver.com:hello
!say salon2@chat.xmppserver.com:/me n'aime pas causer

Moralité, va falloir un plugin d'alias… Car c'est vraiment long à écrire.

Autre point de détail : par défaut le plugin est configuré pour que seules les administratrices puissent utiliser “say”.

Il faut modifier le fichier du plugin, dans votre dossier d'installation d'errbot (probablement errbot/data/plugins/log0ymxm/err-say/saybot.py et passer admin_only=True à admin_only=False.

Configurez alors bien les ACL en autorisant explicitement certaines utilisatrices à faire causer le bot :

ACCESS_CONTROLS = {
    'say': {
        'allowrooms': ('salon1@chat.xmppserver.com','salon2@chat.xmppserver.com',),
        'allowusers': ('georgette@xmppserver.com','marcel@xmppserver.com',),
    },
}

Alias

https://github.com/rroemhild/err-alias

Pour l'installer :

!repos install rroemhild/err-alias

Créer un alias

!alias add raccourci commande

Enlever un alias

!alias remove raccourci

Alias à créer

!alias add y say salon1@chat.xmppserver.com:
!alias add s say salon2@chat.xmppserver.com:

Appel !y message !s message

RSSReader

https://github.com/errbotters/err-rssreader/

Pour l'installer :

!repos install https://github.com/errbotters/err-rssreader

Pour lister les commandes et une explication de chacune :

!help rssreader
RSSReader
 Get newest content from your favorite RSS feeds via your Errbot.
• !rssreader add - Add URL(s) of feed(s) to be checked for updates.
• !rssreader feeds - Show all feeds that are checked for updates by RSSReader.
• !rssreader rm - Remove feed(s) from the update loop.
• !rssreader subs - Show channels which will receive new content from specific feeds.
• !rssreader subscribe - Make a feed send updates to given channel(s).
• !rssreader subscriptions - Show channels which will receive new content from specific feeds.
• !rssreader unsubscribe - Unsubscribe channels/rooms from a specific feed.

Ajouter un flux RSS

!rssreader add addresse_du_flux

Cela va associer une ID au flux (feed).

Pour Pendorid

!rssreader add https://khaganat.net/blog/feed.php
!rssreader add https://khaganat.net/taf/feed.php
!rssreader add https://khaganat.net/um1/feed.php
!rssreader add https://khaganat.net/wikhan/feed.php
!rssreader add https://khaganat.net/mediateki/feed.php
!rssreader add https://khaganat.net/forum/index.php?action=.xml;type=rss;limit=10
!rssreader add https://git.khaganat.net/khaganat.atom

Puis !rssreader feeds pour lister les flux et leur id. Ensuite, on souscrit sur les canaux aux flux qui nous intéressent :

!rssreader subscribe f0c0f2 salon1@chat.xmppserver.com

Pour voir les abonnements de chaque canaux aux flux :

!rssreader subscriptions

Loguer les salons (ressource externe)

Linkmauve nous a créé de quoi loguer les canaux, mais c'est un autre bot, voir Botlogmauve.