• Publicidad

Script de comprobación de SNMP

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Script de comprobación de SNMP

Notapor jero2528 » 2015-01-19 15:58 @707

Hola a todos.

Tengo problemas con la siguiente sentencia:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "Ejecutando el comando: snmpwalk -v 2c -c localpublic $IPDEVICE\n";
  2.  
  3. #$salidaComando=system("snmpwalk -v 2c -c localpublic $IPDEVICE | head -5");
  4. #$salidaComando=`snmpwalk -v 2c -c localpublic $IPDEVICE | head -5 2>&1`; ##### Si uso este se queda procesando...
  5. #print `snmpwalk -v 2c -c localpublic $IPDEVICE | head -5`;
  6. #print "Salida: $salidaComando\n";
  7. system "snmpwalk -v 2c -c localpublic $IPDEVICE | head -5";
  8. print $?;
  9. print $? >> 8;
  10.  
  11. #print "Salida: $?\n";
  12. if ( ( $salidaComando =~ m/Timeout: No Response from $IPDEVICE/is ) ) {
  13.     $mensaje .= "No funciona el SNMP en ese equipo contra mi servidor\n";
  14. }
  15.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

¿Podrían ayudarme, por favor? Al ejecutarlo se queda procesando y solo puedo terminar la ejecución del script al hacer Ctrl+C.

Sé que algunas cosas están comentadas. En realidad son los intentos que he realizado para obtener la salida de la ejecución del comando :) Lo raro es que no obtengo nada. La única forma en que veo en la CLI la salida es usando system("cmd") pero no sé cómo capturarlo.

De antemano les agradezco si me pueden ayudar con otra idea o a mejorar alguna de las plasmadas en el script.


Gracias. :oops:
Saludos,

Jero2528
Avatar de Usuario
jero2528
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2014-05-14 15:43 @697
Ubicación: Bogota, Colombia

Publicidad

Re: Script de comprobación de SNMP

Notapor explorer » 2015-01-19 17:08 @755

Yo no veo problemas en la parte de Perl, así que sospecho que el programa se para al ejecutar snmpwalk.

Por otra parte, si lo que quieres es ejecutar la salida del comando, no debes usar system(), sino qx():

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $cmd = "snmpwalk -v 2c -c localpublic $IPDEVICE | head -5";
  2.  
  3. print "Ejecutando el comando: [$cmd]\n";
  4.  
  5. $salidaComando = qx($cmd);
  6.  
  7. if ($salidaComando =~ m/Timeout: No Response from $IPDEVICE/is ) {
  8.     $mensaje .= "No funciona el SNMP en ese equipo contra mi servidor\n";
  9. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Otro tema distinto es que snmpwalk se cuelgue... Si es así, hay que tomar otras medidas, como puede ser alarm() para que se mate el proceso arrancado, y que el programa Perl continúe.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Script de comprobación de SNMP

Notapor jero2528 » 2015-01-20 09:01 @417

Hola, explorer.

Gracias por tu ayuda, sigo teniendo el problema :( A continuación te dejo la salida usando el script y luego aplicando el comando directamente desde la CLI:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [root@server scripts]# ./scripts_pruebas/reporte_snmp_devices.pl
  2. Ejecutando el comando: [snmpwalk -v 2c -c localpublic 200.65.3.229 | head -5]
  3. [root@server scripts]# snmpwalk -v 2c -c localpublic 200.65.3.229 | head -5
  4. SNMPv2-MIB::sysDescr.0 = STRING: Cisco IOS Software, C181X Software (E181X-ADVIPSERVICESK8-M), Version 12.4(4)T1, RELEASE SOFTWARE (fc4)
  5. Technical Support: http://www.cisco.com/techsupport
  6. Copyright (c) 1986-2005 by Cisco Systems, Inc.
  7. Compiled Wed 21-Dec-05 15:55 by ccai
  8. SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.9.1.641
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

La idea de mi script es desde el servidor ejecutar el comando con la IP de cada uno de los equipos de red, y verificar que si no funciona el SNMP se debe enviar un mensaje de alerta, por esto es tan importante la salida que requiero del comando ejecutado, pero por alguna razón no la está capturando :( y se queda mucho tiempo como lo que muestra la línea 3 de la salida anterior, y para detenerlo simplemente hago un Ctrl+C y se detiene la ejecución, ya probé esperando hasta 1 hora pero no pasa nada :?

Gracias
Saludos,

Jero2528
Avatar de Usuario
jero2528
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2014-05-14 15:43 @697
Ubicación: Bogota, Colombia

Re: Script de comprobación de SNMP

Notapor explorer » 2015-01-20 12:25 @559

Pues sí que es raro.

En situaciones anteriores, una cosa así me pasaba hasta que me di cuenta de que la salida del comando no estaba saliendo por la salida estándar, sino por la salida estándar de error. Claro: si ejecutas el comando por la terminal, las dos salidas van a parar al mismo sitio (la terminal), y no te das cuenta de que el comando lo está enviado por otro canal.

La forma de darte cuenta de esto es ejecutar
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ snmpwalk -v 2c -c localpublic 200.65.3.229 | head -5 > prueba.txt
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Si prueba.txt no contiene nada (o no toda la salida), entonces es que toda (o parte de) la salida va por la salida estándar de error. En ese caso hay que usar otro módulo, como open2 u open3.

Pero no creo que sea este el caso... en la página de manual de snmpwalk no dice nada de que la salida sea por la salida estándar de error (excepto los log, que sí pueden redireccionarse por ahí).

Puedes probar este código (sacado de perldoc -f alarm):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $IPDEVICE = '200.65.3.229';
  2. my $cmd = "snmpwalk -v 2c -c localpublic $IPDEVICE | head -5";
  3. print "Ejecutando el comando: [$cmd]\n";
  4. eval {
  5.     local $SIG{ALRM} = sub { die "timeout\n" }; # Nota: \n es requerido
  6.     alarm 10;                                   # ajustamos una alarma a los 10 segundos
  7.     $salidaComando = qx($cmd);                  # ejecutamos el comando. Debe terminar antes de 10 s
  8.     alarm 0;                                    # todo bien, desactivamos alarma
  9. };
  10. if ($@) {                                                               # si hubo errores...
  11.     die unless $@ eq "timeout\n";                                       # Propagar los errores inesperados
  12.     die "ERROR: Se produjo un error al ejecutar [$cmd]: [$@]\n";        # paramos el programa informando del error
  13. }
  14. print "Salida: [$salidaComando]\n";                                     # no hubo problemas: sacamos la salida del comando
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Con la ayuda de alarm(), creamos un tiempo límite de ejecución. Si se llega a ese tiempo, se ejecuta el $SIG{ALRM}, que contiene un die(), que es capturado por el eval{}, y podemos seguir con el resto del programa.

Otra cosa... en CPAN hay unos cuántos módulos para gestionar SNMP... ¿no les quieres dar una oportunidad? ;)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Script de comprobación de SNMP

Notapor jero2528 » 2015-01-21 11:45 @531

La primera prueba funcionó dejando el registro de las líneas de respuesta, pero en el segundo caso sucedió lo mismo, solo que esta vez me generó este error:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [root@server ~]# ./scripts_pruebas/reporte_snmp_devices.pl
  2. Ejecutando el comando: [snmpwalk -v 2c -c localpublic 200.65.3.229 | head -5]
  3. ERROR: Se produjo un error al ejecutar [snmpwalk -v 2c -c localpublic 200.65.3.229 | head -5]: [timeout
  4. ]
  5.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Intentaré con los módulos de SNMP; lo que sucede es que no los he usado, tendré que estudiarlos primero.

Muchas gracias por tu ayuda, explorer.
Última edición por explorer el 2015-01-21 15:51 @702, editado 1 vez en total
Razón: funciono => funcionó; lineas => líneas; modulos => módulos;
Saludos,

Jero2528
Avatar de Usuario
jero2528
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2014-05-14 15:43 @697
Ubicación: Bogota, Colombia

Re: Script de comprobación de SNMP

Notapor explorer » 2015-01-21 16:02 @710

Vale, el problema está justo en la ejecución del comando.

Yo haría una prueba quitando la parte " | head -5 ", no sea que esté influyendo.

Segundo, haría una prueba con solo

snmpwalk --version

para estar seguros de que no se trata de un retraso producido por el propio comando y no por los argumentos que le estamos pasando.

Tercero, si no funciona, en el shell ejecutaría un which snmpwalk para averiguar la ruta completa al comando. Por ejemplo, podría estar instalado en /usr/local/bin/. En ese caso, modificamos $cmd con esa ruta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $cmd = "/usr/local/bin/snmpwalk -v 2c -c localpublic $IPDEVICE";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si con eso funciona, entonces le ponemos el head...

Prueba, y dinos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Script de comprobación de SNMP

Notapor jero2528 » 2015-01-21 17:11 @758

Quitando el head:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [root@server ~]# /home/eherrera/scripts_pruebas/reporte_snmp_devices.pl
  2. Ejecutando el comando: [snmpwalk -v 2c -c localpublic 200.62.0.230]
  3. ERROR: Se produjo un error al ejecutar [snmpwalk -v 2c -c localpublic 200.62.0.230]: [timeout]
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Probando con solo snmpwalk --version:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. Ejecutando el comando: [snmpwalk --version]
  2. NET-SNMP version: 5.3.2.2
  3. Salida: []
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Me muestra en pantalla el resultado pero no lo captura en la variable de salida :?

Y con la tercera y cuarta opción me genera el error:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. Ejecutando el comando: [snmpwalk -v 2c -c localpublic 200.62.0.230]
  2. ERROR: Se produjo un error al ejecutar [snmpwalk -v 2c -c localpublic 200.62.0.230]: [timeout]
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Realicé pruebas con la librería Net::SNMP:HostInfo parece que funciona bien, lo único es que no he podido encontrar algún equipo que no esté respondiendo al SNMP :) :lol: para saber cómo se está recibiendo la respuesta.

Relaciono el código usado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Net::SNMP::HostInfo;
  2. $host = shift || '200.62.0.230';
  3.         $password = shift || 'localpublic';
  4.          
  5.         $hostinfo = Net::SNMP::HostInfo->new(Hostname => $host,
  6.                                              Community => $password);
  7.          
  8.         print "Packets Received = ", $hostinfo->ipInReceives, "\n";
  9.         print "Output Requests = ", $hostinfo->ipOutRequests, "\n";
  10.          
  11.         print "TCP Segments Received = ", $hostinfo->tcpInSegs, "\n";
  12.         print "TCP Segments Sent = ", $hostinfo->tcpOutSegs, "\n";
  13.          
  14.         print "UDP Datagrams Received = ", $hostinfo->udpInDatagrams, "\n";
  15.         print "UDP Datagrams Sent = ", $hostinfo->udpOutDatagrams, "\n";
  16.  
  17.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Gracias por la ayuda, explorer, espero que esto le sirva de ayuda a otros perleros :).
Saludos,

Jero2528
Avatar de Usuario
jero2528
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2014-05-14 15:43 @697
Ubicación: Bogota, Colombia

Re: Script de comprobación de SNMP

Notapor explorer » 2015-01-21 20:08 @881

Me he instalado el paquete snmp y ya sé lo que pasa: que los comandos snmp envían su resultado a la salida estándar de error, que es lo que te comentaba en una de mis primeras respuestas.

Lo que muestras de la salida de snmpwalk --version ha sido la clave: si vemos que sale algo en pantalla, pero Perl no lo ha capturado, es que está saliendo por la salida estándar de error.

Haz una prueba con esta línea, y nos cuentas.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $cmd = "/usr/local/bin/snmpwalk -v 2c -c localpublic $IPDEVICE 2>&1 | head -5";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Lo que hace es redirigir la salida estándar de error a la salida estándar normal, por lo que head ya recibe algo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Script de comprobación de SNMP

Notapor jero2528 » 2015-01-22 09:29 @437

explorer, realicé la prueba y aun no funciona :(

Aquí el código usado. Decidí aumentar los 10 segundos a 20 a ver si era por eso, pero pasa igual:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. foreach $row_r_query01 (@$r_query01) {
  2.         ($IDHOST, $IPDEVICE, $TIPO, $LOCATION, $COMPLETENAME, $DEVICE, $MANUFACTURER) = @$row_r_query01;
  3.         $cmd = "/usr/bin/snmpwalk -v 2c -c localpublic $IPDEVICE 2>&1 | head -5";
  4.         print "Ejecutando el comando: [$cmd]\n";
  5.         eval {
  6.             local $SIG{ALRM} = sub { die "timeout\n" }; # Nota: \n es requerido
  7.             alarm 20;                                   # ajustamos una alarma a los 20 segundos
  8.             $salidaComando = qx($cmd);                  # ejecutamos el comando. Debe terminar antes de 10 s
  9.             alarm 0;                                    # todo bien, desactivamos alarma
  10.         };
  11.         if ($@) {                                                               # si hubo errores...
  12.             die unless $@ eq "timeout\n";                                       # Propagar los errores inesperados
  13.             die "ERROR: Se produjo un error al ejecutar [$cmd]: [$@]\n";        # paramos el programa informando del error
  14.         }
  15.         print "Salida: [$salidaComando]\n";
  16.         sleep(5);
  17.         if(($salidaComando=~m/Timeout: No Response from $IPDEVICE/is)){
  18.                 $mensaje.= "no estoy obteniendo respuesta de SNMP por parte del Equipo $IPDEVICE";
  19.                 $contador++;
  20.         }
  21. }
  22.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ese foreach se hace porque los equipos provienen de una consulta a una base de datos. La salida obtenida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [root@server ~]# ./scripts_pruebas/reporte_snmp_devices.pl
  2. Ejecutando el comando: [/usr/bin/snmpwalk -v 2c -c localpublic 200.62.0.230 2>&1 | head -5]
  3. ERROR: Se produjo un error al ejecutar [/usr/bin/snmpwalk -v 2c -c localpublic 200.62.0.230 2>&1 | head -5]: [timeout
  4. ]
  5.  
  6.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



:cry:
Saludos,

Jero2528
Avatar de Usuario
jero2528
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2014-05-14 15:43 @697
Ubicación: Bogota, Colombia

Re: Script de comprobación de SNMP

Notapor explorer » 2015-01-22 14:06 @629

Pues... se me están acabando las ideas.

Mira, en mi equipo, si ejecuto esto desde la línea de comandos, no sale nada
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -E '$salida = qx(snmpwalk --version  | wc ); say "[$salida]"'
  2. NET-SNMP version: 5.4.3
  3. [      0       0       0
  4. ]
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Mejor dicho: sale el mensaje que se espera, pero por la salida de error. El comando wc no recibe nada.

Si pongo la redirección, entonces sí que lo capturo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -E '$salida = qx(snmpwalk --version  2>&1 | wc ); say "[$salida]"'
  2. [      1       3      24
  3. ]
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Humm... creo que podrías quitar el head porque no creo que te influya en el resto del programa. Menos problemas si lo quitas.

Pero el problema sigue siendo que snmpwalk no regresa, y no sé el motivo.

Bueno, si te funciona el módulo, mejor. Así no tienes que pelearte con las expresiones regulares.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron