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
allowusers
etdenyusers
: autorise ou interdit les commandes à ces utilisateurs seulement.allowrooms
etdenyrooms
: autorise ou interdit ces commandes uniquement dans ces salons.allowprivate
: autorise ces commandes depuis un message direct avec le bot.allowmuc
: autorise ces commandes à l'intérieur des salons.
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.