Irccd 2.0
J’ai très peu écrit ces derniers temps suite à de nombreux soucis personnels. J’ai d’ailleurs pendant un moment mis largement en pause tous mes projets informatique. Mais depuis quelques semaines je m’y suis remis encore plus motivé que jamais.
Et comme la sortie d’irccd 2.0 est prévue pour décembre, je vous propose de vous parler des quelques nouveautés qui arriveront dans cette version majeure.
Système de règles (ou filtres)
Déjà prévu initiallement pour irccd 1.2, le système de règle permet de filtrer les évènements IRC selons les critères suivants :
- nom du serveur,
- nom de l’évènement (exemple onMessage),
- nom du canal (si c’est possible),
- nom du plugin.
Ensuite, on indique si l’on souhaite détruire cet évènement ou l’accepter. Ainsi, comme les règles sont évaluées dans l’ordre où elles sont lues, il devient tout à fait possible de désactiver des plugins comme bon vous semble.
Exemple :
# Quand un champ n'est pas précisé, la règle est acceptable, cette règle
# est donc valide pour tous les évènements et les supprime
[rule]
action = drop
# Cette deuxième règle va autoriser le plugin hangman uniquement sur le
# canal #staff sur le serveur malikania
[rule]
servers = "malikania"
channels = "#staff"
plugins = "hangman"
action = accept
Monothread
Avant, irccd était bourré de threads. Chaque serveur générait deux threads, il y en avait à peu près partout et le code contenait des mutex à foison. Irccd 2.0 est maintenant totalement monothread. Seuls les timers (que les plugins peuvent créer, voir ci dessous) vont générer de nouveaux threads.
Ainsi, afin d’écrire du code thread-safe, au lieu de mettre des verrous dans tous les sens, chaque action est placée dans une file d’évènements qui est la seule partie verrouillée par un mutex. Et donc, quand les timers ont besoin d’exécuter un plugin, ces derniers vont ajouter l’évènement dans la file afin d’éviter d’accéder au plugin en même temps que la boucle principale.
Transports bilatéraux
Plus connus sous le nom de listeners, les transports remplacent ces
derniers en étant cette fois ci totalement bilatéraux. Avec irccd 1.0,
vous pouviez envoyer des commande à irccd
avec
irccdctl
(ou telnet même) mais la connexion s’arrêtait tout
de suite après car irccd ne renvoyait rien à irccdctl (ormis une erreur
si jamais).
Maintenant, il est possible de se connecter à irccd et d’écouter tous les évènements qu’irccd reçoit. Avec ça, vous allez pouvoir développer des bouncer, des chiens de garde, des plugins avancés sans même JavaScript !
Nouveaux journaux
Alors qu’irccd 1.x ne supportait que syslog et la console, il est maintenant possible d’utiliser des fichiers pour les journaux d’irccd. Notez que pour l’occasion, c’est une toute nouvelle section qui a été ajoutée
# syslog
[logs]
type = syslog
verbose = true
# ou fichiers
[logs]
type = file
path-logs = "/tmp/irccd-rocks.txt"
Par défaut, cela reste la console.
Un parseur amélioré
Le parseur de configuration a été largement amélioré et permet maintenant :
- Plusieurs options sur la même ligne
- Un système d’inclusion de fichier avec le mot clé
@include
- Un système de listes pour les valeurs
#
# Exemple de fichier
#
@include "rules.conf" # les guillemets sont recommandés
@include servers.conf # mais ça fonctionne aussi comme ça
[rule]
servers = ( "malikania", "localhost" )
Timer
La nouvelle API JavaScript se voit dotée d’un objet Timer qui remplace les threads et les pipes de l’ancienne API d’irccd 1.1. Ce sont des timers s’exécutant à intervalles réguliers ou tout simplement après un labs de temps.
var t = new Irccd.Timer(Irccd.Timer.Repeat, 1000, function () {
// je suis appelé toutes les 1000 secondes...
;
}).start(); t
ElapsedTimer
Autre nouveauté, un petit objet simple qui permet de mesurer le temps passé. Largement inspiré de QElapsedTimer.
var t = new Irccd.ElapsedTimer();
// Après pas mal de temps :
var milliseconds = t.elapsed();
Encore plus d’unixeries
Comme vous le savez, Unix c’est le bien. Et tout bon daemon se doit de respecter plusieurs commandements dorénavant intégrés dans irccd 2.0 :
- changement de l’uid
- changement du gid
- écriture du pid dans un fichier
[general]
pidfile = "/var/run/irccd.pid"
uid = "irccd"
gid = "irccd"
Tout nouvelle documentation
La documentation est maintenant totalement générée depuis le projet avec CMake et pandoc. Cela me permettra d’installer cette documentation sur le prochain site web mais aussi de l’installer en local pour que les gens puissent toujours regarder la documentation s’ils n’ont pas eu la possibilité de mettre à jour irccd.