jueves, mayo 05, 2011

Perl para monitorizar la red


Estábamos sufriendo pequeños cortes de red muy esporádicos (digamos que 3 ó 4 al día).
Necesitaba registrar la fecha y hora para que los técnicos de comunicaciones supieran dónde buscar...

Podría haber utilizado cualquier software comercial pero preferí hacer el siguiente script PERL:

Funciona perfectamente con la instalación por defecto de ActivePerl para Windows:
#!/usr/bin/perl -w
use Net::Ping;

my $p = Net::Ping->new("icmp");
my @servidores=('servidor1','servidor2','servidor3','servidor4');
open(FICHERO, ">>errores.txt")||die "error!!!";
print FICHERO "EMPEZAMOS ANALISIS\n";
fechaHora();
print FICHERO "----------------------------------\n";
close(FICHERO);
for(;;) {
foreach my $host (@servidores)
{
if ($p->ping($host, 2)) {
print "$host OK!\n"
}
else {
open(FICHERO, ">>errores.txt")||die "error!!!";
print FICHERO "FALLO en $host. ";
fechaHora();
close(FICHERO);
}
sleep(1);
}
}
$p->close();

sub fechaHora {
my ($sec,$min,$hour,$day,$month,$yr20,@rest) = localtime(time);
print FICHERO "$day-".++$month. "-".($yr20+1900)." ";
print FICHERO sprintf("%02d",$hour).":".sprintf("%02d",$min).":".sprintf("%02d",$sec)."\n";
}


El funcionamiento es muy sencillo:

Creamos un array con los nombres de los servidores a los que el programa va a hacer continuamente PING.

Luego se intenta el PING. Si el servidor responde escribimos SERVIDOR OK. Si no responde abrimos el fichero ERRORES.TXT y escribimos la fecha y hora.

Curiosidades:

Cada vez que falla un PING abrimos el fichero, escribimos y volvemos a cerrar.
Lo tuve que hacer así porque el bucle infinito hay que terminarlo con Control+C o cerrando la ventana. Al interrumpir el programa antes de cerrar el fichero resulta que te encuentras con un ERRORES.TXT vacío.

Saludos.




No hay comentarios: