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:
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