19

Jouons avec tmux et sic

Aujourd'hui, je vais parler de tmux, de sic, d'OpenBSD et de comment on peut s'amuser à personnaliser un client IRC avec uniquement les outils présents de base sur le système.

Avant:

Après:

Un peu de contexte

Un de mes grands plaisirs sous OpenBSD est de me limiter aux outils présents de base. Aussi contraignant cela puisse paraître au départ, cette démarche me force à me montrer plus ingénieux. À chaque fois que je peux supprimer un package, j'en suis très satisfait.

En effet, tout ce qu'on ajoute sur une installation est une nouvelle faille de sécurité potentielle. Or, les outils présents de base sous OpenBSD sont vus, revus, corrigés, nettoyés et profitent souvent de pledge/unveil.

Par ailleurs, je tente petit à petit de me mettre à IRC (oui je sais, on est en 2020...). J'ai toujours du mal avec les messageries instantanées : ça occupe trop l'attention, et je n'arrive plus à rester concentré. Ceci dit, je tente une nouvelle fois l'aventure.

C'est en cherchant un client IRC que je suis tombé sur sic, écrit par suckless fournissant des outils que j'apprécie en général. Les autres clients m'ont laissé une impression de "trop plein" ou de "passe 3h à lire la doc pour m'utiliser". Ceci dit, hexchat est très bien, mais je me vois mal ouvrir une fenêtre à chaque démarrage.

Du coup, mon choix s'est porté sur sic car :

Ceci dit, il est tellement simple qu'il présente quelques défauts :

Ceci dit, on va y remédier... ;)

En cherchant un peu, j'ai eu le plaisir de lire Bruno Flückiger qui semble partager les mêmes intérêts pour le minimalisme.

Ce qui va être dit en-dessous ressemblera beaucoup à son tutoriel, au moins pour la première partie.

Utilisation de sic

Tout d'abord, on installe sic:

doas pkg_add sic

Ensuite, on peut tenter de se connecter à freenode pour voir à quoi ça ressemble :

sic -h chat.freenode.net -n pseudo -k mot-de-passe -p 6667

Ça donne:

Chiffrement

Pour activer le chiffrement (sic ne le prend pas en charge par défaut), on peut utiliser un bouncer, ou bien relayd. Puisque le défi c'est d'utiliser des outils de base, on va donc choisir ce dernier :

# rcctl enable relayd
# cat /etc/relayd.conf
table <freenode> { chat.freenode.net }
relay "freenode" {
    listen on localhost port 6667
    forward with tls to <freenode> port 6697
}
# rcctl start relayd

On se connectera maintenant ainsi:

sic -h localhost -n pseudo -k mot-de-passe -p 6667

Amélioration de l'affichage

On va utiliser sed pour améliorer un peu ce que l'on voit à l'écran.

Tout d'abord, on peut retirer toutes les informations quand quelqu'un se connecte ou s'en va :

sic -h localhost -n prx -k "${pw}" -p 6667 |\
    sed -E "/(JOIN|QUIT|NICK)/d"

Le "|\" permet de passer à la ligne mais rester sur la même commande. Ça évite d'avoir des lignes interminables.

La commande sed a pour flag "-E" afin de pouvoir utiliser des regex étendues. Ensuite, on précise entre "/" les lignes à sélectionner : celles qui contiennent "JOIN" ou "QUIT" ou "NICK", puis on décide de les supprimer "d".

Ceci fait, j'ai envie d'ajouter un peu de couleurs. Je vais donc les définir avant avec les séquences d'échappement suivantes :

PURPLE='\033[0;35m'
LGREEN='\033[1;32m'
BOLD='\e[1m'
NC='\033[0m'

"NC" permettra de remettre les couleurs à la normale.

Je voudrais que mon pseudo soit coloré, pour repérer lorsqu'on me mentionne, et avoir une alerte par la même occasion (tmux affichera l'urgence sur la fenêtre contenant sic). sed peut le faire avec la commande suivante :

s/prx/$(printf ${PURPLE}prx${NC})$(printf "\a")/

Il s'agit d'une substitution "s", sur le motif correspondant à mon pseudo "/prx/", que je remplace par mon pseudo encadré mis en rose, suivi d'un alerte pour tmux. Cette dernière partie doit faire appel à la commande "printf" afin que les échappements soient corrects:

/$(printf ${PURPLE}prx${NC})$(printf "\a")/

Ensuite, je voudrais que les noms des salons soient colorés afin de repérer rapidement d'où viennent les messages reçus. Là encore, on le fait avec sed. Les noms de salons sont en début de ligne, on va dont les repérer avec ^. Par exemple, pour mettre le nom du salon "#openbsd# en vert et en gras :

s/^#obsd4\*/$(printf ${BOLD}${LBLUE}#obsd4*${NC})/

Finalement, ça donne quelque chose comme ça :

sic -h localhost -n prx -k "${pw}" -p 6667 |\
	sed -E "/(JOIN|QUIT|NICK)/d
	s/^#openbsd/$(printf ${BOLD}${LGREEN}#openbsd${NC})/
	s/^#obsd4\*/$(printf ${BOLD}${LBLUE}#obsd4*${NC})/
	s/^##kissballad/$(printf ${BOLD}${LRED}##kissballad${NC})/
	s/prx/$(printf ${PURPLE}prx${NC})$(printf "\a")/
"

Garder sic ouvert en arrière plan : tmux

Ça, c'est hyper facile, c'est le boulot de tmux. Ainsi, même si le terminal est fermé, tmux gardera sic ouvert pour le réafficher plus tard. En considérant que la commande précédente soit dans un script nommé "irc.sh", on lancera tmux ainsi :

tmux new-window -d -n irc irc.sh

Joindre automatiquement des salons

Maintenant que sic tourne dans tmux, on peut faire en sorte que les salons souhaités soient rejoins en envoyant à tmux la séquence à entrer, et ce, dans la bonne fenêtre.

sleep 10 # on laisse un peu de temps pour que sic se connecte
tmux send-keys -t "irc.0" ':j #openbsd' Enter
tmux send-keys -t "irc.0" ':j #obsd4*' Enter
tmux send-keys -t "irc.0" ':s #obsd4*' Enter

":j" permet de joindre un salon.

":s" permet de définir le salon par défaut.

Garder le texte intact lorsqu'on écrit

Afin qu'un message entrant ne vienne pas casser ce que vous êtes en train décrire à l'écran, on continue à utiliser tmux et la commande send-keys. À part, on va composer notre message et l'envoyer dans sic, un peu comme on l'a fait au-dessus pour rejoindre automatiquement un salon.

Afin que ça soit confortable, voici un script qui écoute en boucle ce qu'on lui entre (avec un petit prompte :)) et l'envoie sur le bon pane dans tmux. C'est sayirc:

#!/bin/sh
# sayirc

prompt="irc> "
tmuxpane="irc.0"

while read -r -u input?"$prompt"; do
	tmux send-keys -t $tmuxpane "${input}" Enter
done

Dans tmux, sic tourne dans la fenêtre nommée "irc", dans le premier pane : irc.0.

Pour finir, on va laisser tourner sayirc juste en-dessous de sic pour pouvoir écrire et lire en même temps.

On automatise le tout

Voici le script starttmux que je lance en début de session. L'idée est d'avoir 1 seule session tmux et de tout faire dedans.

Tout d'abord, on lance tmux :

#!/bin/sh
session=0
# set up tmux
tmux start-server
tmux has-session -t $session && exit # start only once
tmux new -d -s $session

Je veux l'afficher dans un terminal :

xterm -class tmux -maximized -e "tmux a -t $session" &

Avant d'aller plus loin, j'attends que ce terminal soit ouvert. Vous aurez remarqué que ce terminal a reçu la classe "tmux", ce qui permettra de le repérer avec la commande suivante.

while [ -z "$(xwininfo -tree -root | grep '("xterm" "tmux")')" ]; do
	sleep 1
done

Une fois tmux affiché (c'est important pour respecter les proportions des panneaux), j'ouvre mutt dans une fenêtre "mail"

tmux new-window -d -n mails "mutt"

Puis je lance le script "irc.sh" dans une fenêtre "irc", ce script se chargeant lui-même d'ouvrir sic.

tmux new-window -d -n "irc" "irc.sh"

Ensuite, je divise la fenêtre "irc" en 2 pour laisser un espace en bas afin de faire tourner "sayirc.sh" :

tmux split-window -d -t "irc" -v -l3 "sayirc.sh"

Enfin, je m'assure que le focus aille sur sayirc:

tmux select-pane -t irc.1

Et on termine par les autojoin :

sleep 10
tmux send-keys -t "irc.0" ':j #openbsd' Enter
tmux send-keys -t "irc.0" ':j #obsd4*' Enter
tmux send-keys -t "irc.0" ':j ##kissballad' Enter
tmux send-keys -t "irc.0" ':s #obsd4*' Enter

Au final, ça donne ça :

Les scripts

28/08/2020 11:13


Commentaires