Un petit moniteur systeme en Perl
Vous connaissez TORSMO (ou son successeur, CONKY)? Le petit moniteur systeme (genre gkrellm, mais dans le style asciivision, léger) qui affiche tout ce que vous voulez... Bon ben, voici une version "light" en Perl pour ceux dont le systeme n'est pas encore supporté par CONKY.
Le pourquoi
Je suis grand fan de TORSMO (et de CONKY, son successeur). C'est un moniteur systeme qui permet d'afficher un certain nombre de chose sur votre écran de façon simple, sans surcharger le systeme. Rien a voir avec les gdesklets et autre super-karamba. Surtout il marche bien, meme lorsque le PC n'est pas connecté (j'ai tenté gdesklets, et hors ligne c'est la mort), en mode transparent il s'integre bien au fond d'écran et pas mal de chose peuvent etre affiché en récupérant la sortie d'un script Shell.
En résumé, cela permet d'afficher dans un style "OSD" (On Screen Display), des textes qui renseignent sur l'état du systeme (memoire utilisée, espace disque libre, heure, date, nombre de mails en attente, etc).
C'est bien tout ça, mais alors pourquoi en refaire un autre (moins bien), en Perl? Juste parce que "Perl, c'est bon pour la couche d'ozone"? Non, en fait, au bureau je travail sur une station Sparc (sous Solaris) et que CONKY n'est pas supporté sur Solaris. meme apres avoir bricolé pour le compiler quand meme (j'suis l'plus fort et j'me tape des erreurs et avertissements a la config). Donc pas d'alternative, il faut le coder...
La préparation
Le cahier des charges: je veux un truc qui me donne la date (je ne sais jamais la date du jours), l'heure pour savoir quand est l'apéro, le nombre de nouveaux mails qui m'attendent sur le serveur POP3, et la place disque qui me reste sur les deux disques que je squatte.
Pour tout cela il me faudra quelques modules Perl et un utilitaire (ou plutot la lib associée) qui permet d'ecrire des trucs sur l'ecran: Xosd.
Les modules Perl sont:
X::Osd;
Net::POP3;
Filesys::Df;
Le premier module fait le lien avec la lib OSD et permet l'affichage de textes sur l'écran.
Le second module permet d'acceder a une boite mail POP3 et de gérer simplement quelques commandes POP et leurs réponses associées. Il est aussi possible d'écrire les commande POP directement et d'interpréter les réponses du serveurs, mais avec ce module tout est compris, meme la gestion des erreurs...
Le dernier module permet d'accéder simplement aux informations concernant un disque ou une partition telles que fournies par un "df" ("man df" pour plus d'infos). Il permet donc de récupérer l'espace disque libre, occupée, totale, etc...
Le comment
Une premiere partie dans laquelle nous allons initialiser la bete, définir les polices et couleurs a utiliser pour l'affichage. Pour cela pas de mystere, faite des essais avec plusieurs valeurs differentes et choisissez les valeurs qui vous conviennent le mieux. Pour ma part, j'aime bien l'affichage en vert...
Il faut aussi définir quelques parametres pour l'acces a la boite aux lettres, il faudra mettre en clair le mot de passe de votre boite aux lettres. C'est pas le mieux en terme de sécurité mais de toute façon votre outil de mail fait la meme chose (non il ne va pas chercher votre mot de passe dans votre cerveau par télépathie).
Une bete boucle infinie qui remet a jours les infos, les affiche et attend un temps certain (comme le canon). Et oui, en plus c'est jouissif de coder un "while(1)", d'habitude c'est interdit, la c'est conseillé!
A chaque passage dans la boucle, nous nous connectons au serveur POP3 et demandons le nombre de messages en attente. Si la connection echoue, nous imprimons un message a 2 balles: "Fail to connect". Il y a ici de la place pour de l'amélioration: il serait plus intelligent de mémoriser la valeur précédente et de la réutiliser avec éventuellement une police ou une couleur differente ou un marqueur (une étoile*) pour signifier l'echec de la connection.
Ensuite, nous récuperons l'espace disque disponible, utilisé et total sur les deux disques, et pour finir il n'y a plus qu'a afficher le tout avec des petit séparateurs (les lignes "------------"). Vous pouvez aussi changer de séparateur...
Le code du script avec les commentaires pour tout bien comprendre:
#!/usr/bin/env perlEt voila ce que ça donne:
# On charge les modules utiles:
use X::Osd;
use Net::POP3;
use Filesys::Df;
# Pour faire du code propre:
use strict;
# Definition d'un tas de variables qui seront ensuite tres
# utiles. Un jours, il faudra le remplacer par la lecture
# d'un fichier de config...
my $delay = 60; # Le temps entre deux execution de la boucle
my $pop_host = "popy"; # Le nom de la machine serveur POP3
my $pop_user = "agent007"; # Le nom d'utilisateur du compte POP3
my $pop_password = "topsecret"; # Le mot de passe pour le mail
my $pop_timeout = 30; # Abandonner la connection POP3 au bout de...
# Les deux filesystems que je veux suivre:
my $filesystem = "/ly/175";
my $filesystem2 = "/ly/209";
# L'emplacement, la couleur et la police pour l'affichage:
my $osd_horizontal = XOSD_right;
my $osd_vertical = XOSD_top;
my $osd_font = "-*-helvetica-*-*-*-*-18-*-*-*-*-*-*-*";
my $osd_color = "red";
# Toutes les variables utilisées dans le script:
my $pop;
my $df;
my $df2;
my $free;
my $free2;
my $used;
my $used2;
my $total;
my $total2;
my $mail_number=0;
my @date;
#
# Début: créer un objet X::Osd
#
my $osd = X::Osd->new(9);
#
# Lui appliquer les option pré-définies (police, couleur,...)
#
#$osd->set_color($osd_color);
$osd->set_font($osd_font);
$osd->set_pos($osd_vertical);
$osd->set_align($osd_horizontal);
#
# La belle boucle infinie:
#
while (1) {
# Connection au serveur POP3
$pop = Net::POP3->new($pop_host, Timeout => $pop_timeout);
# Combien de mail?
if($pop->login($pop_user, $pop_password)) {
$mail_number = $pop->list();
$mail_number = scalar(keys(%{$mail_number}));
}
else {
$mail_number = "Fail to connect";
}
$pop->quit;
# Quel jours sommes nous?
@date = localtime(time);
# Combien de place me reste-t-il sur chaque disque?
$df = df($filesystem, 1024);
$free = int($df->{bavail} / 1024);
$used = int($df->{used} / 1024);
$total = int($df->{blocks} / 1024);
$df2 = df($filesystem2, 1024);
$free2 = int($df2->{bavail} / 1024);
$used2 = int($df2->{used} / 1024);
$total2 = int($df2->{blocks} / 1024);
# Afficher le tout:
$osd->string(0, $date[3] . "/" . ($date[4]+1) ."/" . ($date[5]+1900));
$osd->string(1, "[ " . $date[2] . ":" . $date[1] ." ] ");
$osd->string(2, "Mails: $mail_number");
$osd->string(3, "----------");
$osd->string(4, "$filesystem: $df->{per}\%");
$osd->string(5, "($free/$total)");
$osd->string(6, "----------");
$osd->string(7, "$filesystem2: $df2->{per}\%");
$osd->string(8, "($free2/$total2)");
# Sleep until next iter...
sleep $delay;
}

Et apres?
Utiliser un module Perl pour la mise en forme de la date (avec jours de la semaine, le saint du jours,...).
Ajouter la météo locale (mon bureau est trop loin de la fenetre, je ne sais pas le temps qu'il fait). En premier lieu, trouver le module Perl qui permet de récupérer les informations météo...
Remplacer le 'fail to connect' par le nombre de mails précédent. En général, une connection impossible est due au fait que la boite POP est verrouillée par l'outil de mail et que je suis donc en train de lire mes mails. Dans ce cas, il faudrait soit afficher '0' (car mon MUA est en train de vider la boite POP, donc il devrait en toute logique ne plus rester aucun mail), soit maintenir la valeur précédente. Cette derniere solution est sans doute préférable, car il est aussi possible que la connection échoue parce que le serveur est inaccessible, et si la connection n'est pas bonne et que cela arrive souvent, votre nombre de messages en attente fera le yoyo entre 0 et la valeur exacte de mails en attente. Il serait quand meme bon de signaler de maniere discrete l'échec de la connection afin de réveiller l'administrateur du serveur si le probleme persiste...
Prendre les options dans un fichier de configuration plutot que de les coder en dur dans le script. En plus d'etre un bon exercice de Perl, cela permet de partager le script avec d'autre utilisateurs en laissant la possibilité a chacun de le parametrer selon ses gouts (police, couleur, partitions, nom d'utilisateur POP, etc) et permet de protéger le fichier de configuration (lecture interdite pour tout le monde sauf le propriétaire), donc le mot de passe du compte POP3.
Faire le café...
Le faire en Python...