2010-02-07

gnuplot : premiers pas



Le logiciel gnuplot permet de tracer de jolies courbes, graphes, et autres histogrammes.

Pour mes premiers pas, il me faut quelques données. Coup de chance, le fichier "/var/log/syslog" et ses amis "syslog.*.gz" sont remplis de tonnes de données dont je ne fais malheureusement pas grand chose, comme par exemple les logs transmis par mon routeur NetGear.



Celui-ci produit des logs pour les paquets qu'il bloque :

Feb  7 11:41:45 TCP Packet - Source:192.168.103.66,6000 Destination:192.168.153.215,1879 - [Any(ALL) rule match]

Il envoie ces logs sur le démon "rsyslogd" de ma machine (visiblement, c'est "rsyslogd" et non pas "syslog-ng", par défaut, avec Ubuntu). Question pour plus tard : "UDPServerRun" ou bien "InputUDPServerRun" ?

# /etc/rsyslog.conf
# (...)
$ModLoad imudp
$UDPServerRun 514
# (...)

Le démon place ces logs (et d'autres) dans différents fichiers, dont "/var/log/syslog" :

# /etc/rsyslog.d/50-default.conf
# (...)
*.*;auth,authpriv.none          -/var/log/syslog
# (...)

Par la suite, "logrotate" compresse chaque journée de logs (pour un usage ultérieur, comme on dit) :

# /etc/logrotate.d/rsyslog
# (...)
/var/log/syslog
{
 rotate 183
 daily
 missingok
 notifempty
 delaycompress
 compress
 postrotate
 reload rsyslog >/dev/null 2>&1 || true
 endscript
}
# (...)

Voici donc des tonnes de logs, dans les fichiers "/var/log/syslog.*.gz". Pour revenir à gnuplot, il faudrait un fichier de données utilisable, par exemple un fichier texte, contenant sur chaque ligne, une date, suivie du nombre de paquets bloqués à cette date. Ceci peut être fait à l'aide d'un script perl, en prenant en entrée les fichiers de log, et en comptant simplement le nombre de paquets bloqués pour chaque jour. Fichier "log2gp.pl" :

#!/usr/bin/perl -w

use strict;

my @file = <STDIN>;
my %d;
my %mon2num = qw(
 jan 01 feb 02 mar 03 apr 04 may 05 jun 06
 jul 07 aug 08 sep 09 oct 10 nov 11 dec 12
);
my $month;
my $day;

while (my $l = shift(@file)) {
    next if $l !~ m/ - \[Any\(ALL\) rule match\]/;
    chomp($l);
    if ($l =~ m/^(\w+)\s+(\d+)/) {
        $month = $mon2num{lc(substr($1, 0, 3))};
        $day = sprintf("%02d", $2);
    }
    if (!defined($d{"$month/$day"})) { $d{"$month/$day"} = 0.0; }
    $d{"$month/$day"} += 1.0;
}

foreach my $k (sort(keys(%d))) {
    print("$k $d{$k}\n");
}

Ainsi, la commande suivante permet de générer un fichier "fw.dat" qui servira de données d'entrée pour gnuplot :

zcat /var/log/syslog.*.gz | ./log2gp.pl > fw.dat

Voici donc nos données, dans le fichier "fw.dat" :

01/09 267
01/10 176
(...)

On peut enfin dire à gnuplot de tracer une jolie courbe à partir de ces données, avec un fichier de commandes gnuplot. Le fichier "plot.conf" ci-dessous est utilisé pour générer cette courbe :

set output "fw.png"
set terminal png size 800,600
set xdata time
set timefmt "%m/%d"
set format x "%d %b"
set yrange [0:]
set grid
set xlabel "Day"
set ylabel "Number"
set title "Firewall"
set key left box
plot "fw.dat" using 1:2 smooth csplines with lines title "blocked packets"

Pour générer l'image "fw.png", il suffit alors de lancer :

zcat /var/log/syslog.*.gz | ./log2gp.pl > fw.dat
gnuplot plot.conf

Et voilà ! Une jolie courbe qui présente le nombre de paquets bloqués sur le firewall, par jour, en provenance des Super Vilains de l'Internet. Et après ? Après rien. C'est une jolie courbe, et pis c'est tout ;-)

Aucun commentaire:

Enregistrer un commentaire