[couverture de Linux Magazine 62]

Perles de Mongueurs (4)

Article publié dans Linux Magazine 62, juin 2004.

[+ del.icio.us] [+ Developers Zone] [+ Bookmarks.fr] [Digg this] [+ My Yahoo!]

Tester un compte POP

Ce script sera probablement autant utile à un administrateur système qu'à un utilisateur. Il permet de tester rapidement si un compte POP fonctionne et accessoirement indique le nombre de messages non lus.

    #!/usr/bin/perl
    use Net::POP3;

    print STDERR "usage: pop3check server login [password]\n"
      and exit unless @ARGV;

    $| = 1;
    my ($server,$login,$passwd) = @ARGV;
    print "Password: " and chomp($passwd = <STDIN>) unless defined $passwd;

    print "connecting to $server.. ";
    my $pop = Net::POP3->new($server);
    print STDERR "can't connect to server\n" and exit unless defined $pop;
    print "ok\n";

    $pop->login($login, $passwd);
    print STDERR "error: wrong username or password\n" and exit unless $pop->ok;
    my ($undeleted, $size) = $pop->popstat;
    my $last = $pop->last;

    print "mail box size: $size\n",
          "$undeleted unread mail(s).\n",
          "last read mail was number $last\n\n";

Il attend en argument le nom du serveur POP, l'identifiant et le mot de passe. Si ce dernier n'est pas donné sur la ligne de commande, il est demandé interactivement. Mais en clair ! À ne pas exécuter donc devant n'importe qui, ni en cas d'avis de tempête.

(Sébastien Aperghis-Tramoni (Maddingue), Marseille.pm - sebastien@aperghis.net)

Générer toutes les adresses IP de plusieurs sous-réseaux

Il y a peu de temps, un collègue spécialisé dans le réseau et les télécoms s'est tourné vers moi car il voulait savoir si je pouvais lui générer la liste de toutes les adresses IP d'un réseau subneté. Le module NetAddr::IP m'a permit de briller en cette occasion avec le bout de code suivant :

    #!/usr/bin/perl
    use NetAddr::IP;

    print STDERR "usage: subnets network/mask bits\n" and exit unless @ARGV;
    my($network,$bits) = @ARGV;
    my $mask = (split '/', $network)[1];
    print STDERR "bits undefined or smaller than mask\n" and exit
      unless $bits >= $mask;
    for my $net ( NetAddr::IP->new($network)->split($bits) ) {
        print join(" ", map { $net+$_ } 0..(1<<(32-$bits))-1 ), $/
    }

Ce script prend comme argument l'adresse de réseau de base en format CIDR et le nombre de bits de masque des sous-réseaux demandés. Le format de sortie est très simple : chaque ligne correspond à un sous-réseau, les adresses étant séparées par des espaces. La première est donc l'adresse de réseau et la dernière l'adresse de diffusion.

(Maddingue)

Décoder les fichiers UUencode et Base64

On peut quelquefois se trouver confronté à des fichiers encodés suivant les cas, soit au format UUencode, soit en Base64. Or, sur bien des Unix, il n'y a pas de commande permettant de décoder le Base64, et l'utilitaire uudecode(1) est souvent très tatillon sur le format et décode mal le fichier.

En Perl, des unilignes sont suffisants pour décoder ces deux formats. Ainsi, pour le Base64, on utilise le module MIME::Base64 :

    $ perl -MMIME::Base64 -ne 'print decode_base64($_)' fichier.mime

Et pour décoder de l'UUencode, la fonction unpack() est très efficace :

    $ perl -ne 'print unpack"u*",$_' fichier.uu

Inversement, pour encoder en Base64, il suffit d'utiliser la fonction encode_base64() de MIME::Base64.

    $ perl -0777 -MMIME::Base64 -ne 'print encode_base64($_)' < fichier > fichier.mime

L'encodage en UUencode étant par contre assez spécial, il est préférable d'utiliser le module Convert::UU :

    $ perl -MConvert::UU=uuencode -e 'print uuencode(*STDIN)' < fichier > fichier.uu

Et il faut par ailleurs savoir que si le but est d'inclure un fichier dans un mail, des modules comme MIME::Lite se chargent très bien de ces basses besognes.

(Maddingue)

Le saviez-vous ?

bleadperl

bleadperl est le petit nom donné à la toute dernière version de développement de Perl. Si vous trouvez un bug dans Perl et que vous voulez proposer un patch, il est fortement conseillé de le produire à partir de bleadperl.

Pour récupérer cette version, le plus simple est d'utiliser rsync :

    $ rsync -avz rsync://ftp.linux.activestate.com/perl-current/ current

Vous récupérerez les sources à jour dans le répertoire current.

Pourquoi les sources ne sont-ils pas disponibles par l'intermédiaire de CVS ? Tout simplement parce que les sources de Perl sont gérés depuis début 1997 par un outil professionnel appelé Perforce (P4 en abrégé). C'est la société ActiveState, qui maintient une version de Perl pour Windows, qui héberge le serveur Perforce.

Si à l'origine seul le pumpking avait les droits en écriture pour appliquer un patch sur les sources de Perl, ce n'est plus vrai aujourd'hui. Le pumpking s'occupe des patchs importants et refuse les patchs incomplets ou non adaptés -- mais d'autres peuvent appliquer des patchs (surtout des corrections de bugs ou des corrections de documentation).

(Philippe "BooK" Bruhat, Paris.pm - book@mongueurs.net - Merci à Rafaël Garcia-Suarez pour les précisions qu'il m'a apportées.)

Le golf Perl

Le sport qu'on appelle golf consiste à mettre une petite balle dans un trou en un nombre minimum de coups (strokes en anglais).

Le golf Perl (ou Perl golf en anglais) consiste à écrire un programme Perl qui résout un problème donné en un minimum de frappes de touches (keystrokes en anglais).

La mode du golf a été relancée dans The Perl Review et de février à novembre 2002, une dizaine de compétitions mensuelles ont eu lieu. Très rapidement, les discussions consacrées au golf ont surchargé la liste Fun with Perl (fwp@perl.org) et une liste dédiée a dû être créée (golf@perl.org). C'est sur cette liste que les programmes de test et les traditions du golf (classements, calculs de score, mythes et légendes) se sont rapidement créés.

Voici une petite sélection des mythes du golf :

Le site principal de golf Perl est http://perlgolf.sf.net/. Le site le plus actif aujourd'hui est le site de mini-golf de Terje Kristensen : http://terje.perlgolf.org/.

Le golf mène à tout : Ton Hospel s'est fait une spécialité d'envoyer sur p5p des rapports de bug avec des programmes reproduisant le bug en un nombre minimum de caractères.

(BooK)

À vous !

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

[IE7, par Dean Edwards] [Validation du HTML] [Validation du CSS]