Perles de Mongueurs : Réparer Mailman avec Perl

GNU/Linux Magazine n° 130 | septembre 2010 | Philippe bruhat
Creative Commons
  • Actuellement 0 sur 5 étoiles
0
Merci d'avoir participé !
Vous avez déjà noté cette page, vous ne pouvez la noter qu'une fois !
Votre note a été changée, merci de votre participation !
Mailman est un gestionnaire de listes de diffusion. Mailman est écrit en Python. Mailman fonctionne. Mailman est utile. Mailman est partout. Un bon nombre de listes Perl sont gérées par Mailman. Je suis abonné à plus de cinquante listes gérées par Mailman.

1. Étape 1 : détester Mailman

Mais Mailman est quand même un logiciel, ce qui le rend détestable.

Voici plusieurs raisons de détester Mailman :

- L'option nodupes, qui permet de refuser les copies multiples des messages. Comme expliqué dans la documentation de Mailman : lorsque votre adresse se trouve dans l'un des en-têtes To: ou Cc: d'un message adressé à la liste, vous pouvez choisir de ne pas recevoir de message supplémentaire en provenance de la liste. Choisissez Oui pour éviter de recevoir plusieurs copies ; Non si vous voulez les avoir. Sur la plupart des serveurs, cette option est par défaut à Oui, ce qui déjoue les filtres de messagerie basés sur l'en-tête List-Id. Je préfère recevoir quelques rares messages en double, et qu'ils soient tous correctement triés, que de devoir repasser derrière car Mailman a cru bien faire.

- Dans mon expérience, la case à cocher Paramètre global n'a jamais marché.

- Il n'existe pas d'outil en ligne de commandes pour gérer les listes en tant qu'abonné lambda (de tels outils existent pour les administrateurs de Mailman, mais il faut avoir un compte shell sur le serveur qui fait tourner Mailman).

Quand je me plains de l'option nodupes, on me répond en général : « Ben, configure ton compte ! ». Mais configurer son compte, cela veut dire en général : requérir le renvoi du mot de passe (car on a depuis le temps oublié celui fourni automatiquement par Mailman), attendre l'arrivée du message, le lire, copier le mot de passe, aller sur la page de la liste, s'authentifier, aller sur la page des options, trouver l'option recherchée (nodupes est en bas de la page), valider. Même en excluant l'attente du message, cela va prendre plusieurs minutes. Multiplié par cinquante abonnements, on arrive rapidement à plusieurs heures perdues sur une tâche stupide et répétitive qui mériterait franchement d'être automatisée.

2. Étape 2 : programmer en Perl

Vous l'avez compris, en tant qu'utilisateur de Mailman, j'ai besoin d'un outil en ligne de commandes pour configurer mes listes. Et en tant que programmeur paresseux, j'ai préféré passer quelques heures à programmer une bonne fois pour toutes cet outil, plutôt que de cliquer comme un idiot pendant une après-midi entière.

La distribution WWW-Mailman contient plusieurs exemples dans son répertoire eg/, condensés ici en un seul programme.

    #!/usr/bin/env perl

use strict;

    use warnings;

    use WWW::Mailman;

    use Getopt::Long;

    use YAML::Tiny qw( LoadFile DumpFile Dump );

# La table de distribution %action est définie comme suit:

    # nom => {

    #    description => 'Courte description',

    # code => sub { ...; },

    # }

    my %action = (

# définition de %action

        # (voir la suite de la perle)

    );

    # paramètres de ligne de commande

    my %param = (

        config => 'mailman.yml',

        cookie => 'mailman.cookie',

    );

    GetOptions( \%param, 'config=s', 'cookie=s' )

or die "Usage: $0 [ --config file ] [ --cookie file ] <action>\n";

    # pas d'action ou action inconnue

    my $action = shift;

    if ( !$action || !exists $action{$action} ) {

print "Actions disponibles:\n",

            map { sprintf " %10s: %s\n", $_, $action{$_}{description} }

keys %action;

        exit !!$action;

    }

    # lecture des fichiers de configuration

    my $lists = LoadFile( $param{config} );

    my %opt = ( cookie_file => $param{cookie} );

# appel de la commande de la table de distribution

    $action{$action}->( \%opt, $lists );

Le code ci-dessus est très simple. Il analyse les paramètres de ligne de commandes pour trouver le fichier de configuration des listes Mailman et un éventuel fichier de sauvegarde des cookies (l'authentification par cookies accélère les choses en éliminant un certain nombre de requêtes intermédiaires).

Après lecture du fichier de configuration des listes, on définit les options par défaut de WWW::Mailman (le fichier de cookies) et on lance la commande demandée depuis la table de distribution.

Le fichier de configuration YAML ressemble à ceci :

    ---

    example:

      uri: http://lists.example.com/mailman/listinfo/example

email: user@example.com

      password: s3kr3t

3. Étape 3 : profiter !

Il ne reste donc plus qu'à ajouter les entrées qui nous seront utiles dans la table de distribution.

3.1 Obtenir la liste de toutes mes listes

        othersubs => {

            description => q{Demande un rappel de mot de passe},

            code => sub {

                my ( $opt, $lists ) = @_;

                for my $list ( values %$lists ) {

                    my $mm = WWW::Mailman->new( %opt, %$list );

                    for my $uri ( $mm->othersubs ) {

                        my $other = WWW::Mailman->new( %opt, uri => $uri );

                        $lists->{ $other->list }

||= { uri => "$uri", email => $mm->email };

                    }

                }

                # met à jour le fichier de configuration

                DumpFile( $param{config}, $lists );

}

       },

Pour chaque liste configurée, WWW::Mailman ira chercher les autres listes auxquelles l'utilisateur est abonné sur le serveur, et les ajoutera à sa configuration si elles n'y sont pas déjà.

3.2 Obtenir les mots de passe de toutes mes listes

        emailpw => {

            description => q{Demande un rappel de mot de passe},

            code => sub {

                my ( $opt, $lists ) = @_;

                for my $list ( values %$lists ) {

                    next if exists $list->{password};

print "Demande de mot de passe pour $list->{uri}\n";

                    WWW::Mailman->new( %opt, %$list )->emailpw;

}

            }

        },

Une fois la liste des listes obtenue, il nous faut les mots de passe. Cette commande va se connecter à chacune des listes pour obtenir un rappel de mot de passe.

J'avoue n'avoir pas été assez paresseux pour programmer un script de récupération des mots de passe dans ma boîte e-mail (principalement parce c'est vraiment une opération que je ne ferai qu'une fois, et que désormais je mettrai mon fichier de configuration à jour au fur et à mesure).

Après une courte séance de copier/coller entre la messagerie et le fichier de configuration, on peut passer à la suite.

3.3 Reconfigurer toutes mes listes

        nodupes => {

            description => q{Désactive l'option <nodupes>},

            code => sub {

                my ( $opt, $lists ) = @_;

                for my $list ( values %$lists ) {

                    my $mm = WWW::Mailman->new( %$opt, %$list );

$mm->options( { nodupes => 0 } );

                }

            },

        },

Cette commande reconfigure toutes les listes exactement comme j'en ai envie. :-)

Pour savoir exactement quels paramètres fournir à la référence de table de hachage en paramètre d'options(), le plus simple est de commencer par faire un script qui affiche le contenu du formulaire et de comparer avec le formulaire sur le Web. Cela donne en général une bonne idée des valeurs qu'on veut y mettre.

3.4 Et pour les administrateurs de listes ?

WWW::Mailman dispose également de méthodes donnant accès aux pages d'administration d'une liste. Comme pour un simple utilisateur la connexion est automatique, pourvu que l'objet ait été configuré avec les bons mots de passe.

L'ajout de commandes (d'entrées dans la table de distribution) d'administration à cet utilitaire est laissé en exercice au lecteur. ;-)

Références

- La liste de diffusion anglophone « hates software » (qui n'est pas gérée par Mailman, mais par un autre logiciel détestable : Siesta). C'est un défouloir pour les utilisateurs frustrés par les logiciels qu'ils utilisent. http://hates-software.com/ J'apprécie cette liste pour le niveau très élevé des participants, dont certains sont de véritables « dinosaures » de l'informatique avec, vous pouvez l'imaginer, une grande quantité de haine à remâcher.

- « Perles de Mongueurs 6 : Tables de distribution », par Philippe Bruhat, paru dans GNU/Linux Magazine nº65, octobre 2004, http://articles.mongueurs.net/magazines/perles/perles-06.html

- La distribution WWW-Mailman sur CPAN, http://search.cpan.org/dist/WWW-Mailman

- « LWP, Le Web en Perl (3) », par Philippe Bruhat, paru dans GNU/Linux Magazine nº58, février 2004. La section « Un exemple pas à pas » : le formulaire de Mailman constitue ma première expérience avec l'automatisation des interactions avec Mailman, http://articles.mongueurs.net/magazines/linuxmag58.html#h3

À vous !

Envoyez vos perles à perles@mongueurs.net, elles seront peut-être publiées dans un prochain numéro de GNU/Linux Magazine.