David Demelier

J'écris du code, de la musique et je contribue à mes projets opensource préférés.

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 :

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 :

  1. Plusieurs options sur la même ligne
  2. Un système d’inclusion de fichier avec le mot clé @include
  3. 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...
});
t.start();

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 :

[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.