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