viernes, 1 de julio de 2011

Script PERL para consultar prefijos recibidos desde un peer de BGP

Hace un tiempo que estoy buscando de armar un panel de monitoreo personalizado, y como toda mañana de viernes me puse a despuntar el vicio de programar un rato en PERL.

Estuve jugando con el módulo Net::Telnet y al final terminé haciendo un script que se conecta contra un router para extraer información.

No es mi intención reinventar la rueda, sencillamente lo comparto para ahorrarle tiempo a alguien que pueda estar necesitando esto.

Seguramente existen miles de scripts mucho más completos que manejan más cosas, pero en este caso es sencillamente por una satisfacción personal de programar un rato.

tnet.pl

#!/usr//bin/perl
#Hecho por Ariel Weher @20110701

use Net::Telnet ();

#En este caso los datos del host, usuario y password
#los dejo grabados en el script.
#Verificar que los permisos del archivo no den lectura a todos.
#
my $username = 'usuario';
my $password = 'supersecreto';
my $host = '192.168.0.1';


# Me conecto y ajusto algunos parámetros
my $t = new Net::Telnet (Timeout => 15, Prompt => '/[%#>]$/');
$t->open($host);
$t->login($username, $password);
$t->max_buffer_length("50000000");
$t->timeout("120");

# Con esto digo que la consola haga scroll sin pedir
# de apretar la barra espaciadora para continuar...
$t->cmd("terminal len 0");

# Ahora mando el comando que quiero capturar:
my @lineas = $t->cmd("show ip route");

# Desconecto
$t->close;

# Muestro los resultados
print "\n";
print @lineas;
print "\n";

# Salimos
exit 0;

Ahora la aplicación práctica:

Modifiqué el script para que me de una salida que informe la cantidad de prefijos recibidos por un neighbor de BGP.

Este script lo corre MRTG y luego dibuja una bonita gráfica donde nos quedan las fluctuaciones de las cantidades de rutas recibidas.

rutasrecibidas.pl

#!/usr//bin/perl
# Hecho por Ariel Weher @20110701
# Uso: rutasrecibidas.pl {ip_del_neighbor_bgp}
#
# No olvidar darle permisos adecuados: (chmod 750 rutasrecibidas.pl)

use Net::Telnet ();

my $username = 'usuariodelrouterqueusa-AAA-new-model-o-login-local';
my $password = 'super-password_secreto';
my $host = '192.168.0.1';

#Chequeo si me pasaron una IP como argumento...
if ($ARGV[0] =~ /^\s?(0?[0-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))\.(0?[0-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))\.(0?[0-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))\.(0?[0-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))\s?$/){
        $neighbor = $ARGV[0];
        chomp $neighbor;
} else {
        # MRTG espera dos ceros como resultado de un query inválido
        die "0\n0";
}

$t = new Net::Telnet (Timeout => 15, Prompt => '/[%#>]$/');
$t->open($host);
$t->login($username, $password);
$t->max_buffer_length("50000000");
$t->timeout("120");
$t->cmd("terminal len 0");
my @linea = $t->cmd("show ip bgp sum | include $neighbor");
my $dato = $linea[0];
my @columnas = split(" ", $dato);
$salida = $columnas[9];
chomp $salida;
if ($salida =~ /\d\d*/){
 print "$salida\n$salida";
} else {
 print "0\n0";
}
exit 0;

Ahora configuramos una entrada en nuestro mrtg.cfg:

Title[bgp-pref-192-168-0-1]: Rutas recibidas por BGP
PageTop[bgp-pref-192-168-0-1]: Cantidad de prefijos recibidos por BGP desde 192.168.0.1
Target[bgp-pref-192-168-0-1]: `/path/al/script/rutasrecibidas.pl 192.168.0.1`
MaxBytes[bgp-pref-192-168-0-1]: 500000
ShortLegend[bgp-pref-192-168-0-1]: Prefijos IP
YLegend[bgp-pref-192-168-0-1]: Prefijos IP
Options[bgp-pref-192-168-0-1]: integer, nopercent, gauge, noinfo
kMG[bgp-pref-192-168-0-1]: ,,

Les dejo un ejemplo de como MRTG me dibuja los datos extraídos del router.



Espero que les sirva este sencillo ejemplo. Seguro hay algunos mejores pero a mí me gustan las cosas hechas en casa.

Saludos.

1 comentarios:

Daniel dijo...

Hola!

LOL, leyendo este post me recordó como con Perl logre salvar el día, pero en mi caso para hacer troubleshooting a un BUG que el TAC de Cisco no lograba solucionar:

http://blog.initialdraft.com/archives/2390/

Mi código tampoco es el mas bonito, pero fue un momento en donde los minutos contaban.

La segunda herramienta que una persona de Redes debe aprender es Perl :D

Saludos,

Publicar un comentario