• Publicidad

Problema Usando Net::Telnet::Cisco

¿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.

Problema Usando Net::Telnet::Cisco

Notapor jero2528 » 2014-11-20 17:21 @764

Cordiales saludos perleros.

Tengo problemas para capturar la salida que se genera después de cada comando, a continuación relaciono parte del script que estoy usando:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @conn1 = conectar_telnet_cisco( $IPDEVICE, $userbackups, $passbackups );
  2. if ( ( $conn1[0] ) ) {
  3.     $mensajeerror .= "Equipo=$DEVICE, IP=$IPDEVICE, INTERFACE=$INTERFACE, ERROR=$conn1[0]\n<br>";
  4.     $conteoerrores++;
  5. }
  6. else {
  7.     @out = $conn1[1]->cmd("configure terminal\n");
  8.     @out = $conn1[1]->cmd("interface $INTERFACE\n");
  9.     @out = $conn1[1]->cmd("shutdown\n");
  10.     @out = $conn1[1]->cmd("exit\n");
  11.     @out = $conn1[1]->cmd("exit\n");
  12.     sleep(10);
  13.     @out = $conn1[1]->cmd("write memory\n");
  14.     sleep(10);
  15.  
  16.     $comando .= "configure terminal<br>";
  17.     $comando .= "interface $INTERFACE<br>";
  18.     $comando .= "shutdown<br>";
  19.     $comando .= "exit<br>";
  20.     $comando .= "exit<br>";
  21.     $comando .= "write memory<br>";
  22.  
  23.     foreach $salida (@out) {
  24.         print "Salida--------> $salida\n";
  25.         if ( $salida =~ /.+?error.+?/is ) {
  26.             $comando = $salida . "<br>";
  27.         }
  28.     }
  29.  
  30.     $query_deleted
  31.         = "insert into noglpi_suspended_interface VALUES ($IDHOST, '$DEVICE', '$IPDEVICE', '$INTERFACE', '$DESCR', '$CONF', '$LOCATION', now(), 'SUSPENDED', $SERVICEID, '$FABRICANTE')";
  32.     $sql = $mysql_glpi02->prepare($query_deleted);
  33.     $sql->execute();
  34.     $sql->finish();
  35.  
  36.     $query_deleted
  37.         = "insert into noglpi_suspended_interface_tool VALUES ($IDHOST, '$DEVICE', '$IPDEVICE', '$INTERFACE', '$DESCR', '$CONF', '$LOCATION', now(), 'SUSPENDED', $SERVICEID, '$FABRICANTE')";
  38.     $sql = $mysql_glpi02->prepare($query_deleted);
  39.     $sql->execute();
  40.     $sql->finish();
  41.     ##print "<tr> <td>$CUSTOMER</td> <td>$SERVICEID</td> <td>$SUSPENSIONDATE</td> <td>$DEVICE</td> <td>$IPDEVICE</td> <td>$INTERFACE</td> <td>$DESCR</td> <td>$comando</td> </tr>\n";
  42.     $mensaje
  43.         .= "<tr> <td>$CUSTOMER</td> <td>$SERVICEID</td> <td>$SUSPENSIONDATE</td> <td>$DEVICE</td> <td>$IPDEVICE</td> <td>$INTERFACE</td> <td>$DESCR</td> <td>$comando</td> </tr>\n";
  44. }
  45. cerrar_telnet_cisco( $conn1[1] );
  46. $conteointerfaces++;
  47. }
  48.  
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


Básicamente quiero capturar si al ejecutar uno de los comandos se genera algún tipo de error.
La forma de usarlo es realmente a través de una función que tiene el siguiente código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. ## -----------------------------------------------------------------------
  2. ## Conexión con los equipos cisco
  3. ## -----------------------------------------------------------------------
  4. sub conectar_telnet_cisco {
  5.         ## ---------------------------------------------------------------
  6.         ## Inicialización de variables
  7.         ## ---------------------------------------------------------------
  8.         my $ip   = $_[0];
  9.         my $err  = "";
  10.         my $telnet = new Net::Telnet::Cisco (Errmode => "return");
  11.         my ($localpass);
  12.  
  13.         ## ---------------------------------------------------------------
  14.         ## Se establece la conexión vía telnet
  15.         ## ---------------------------------------------------------------
  16.         $telnet->open (Host => $ip, Port => 23, Timeout => 12);
  17.         $err = $telnet->errmsg();
  18.         if ($err) {
  19.                 return $err, $telnet;
  20.         }
  21.         $telnet->login(Name => "$userbackups",Password => "$passbackups",Timeout => 30);
  22.         $err = $telnet->errmsg();
  23.         return $err, $telnet;
  24. }
  25.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Agradezco mucho quien me pueda ayudar, no he podido obtener los errores.
Última edición por explorer el 2014-11-20 18:55 @829, editado 1 vez en total
Razón: travez => través; funcion => función; codigo => código; Conexion => Conexión; Inicializacion => Inicialización; via => vía;
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: Problema Usando Net::Telnet::Cisco

Notapor explorer » 2014-11-20 20:18 @887

Creo que te refieres a la parte de ejecución de comandos, no a las inserciones en la base de datos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     ## Comandos normales
  2.     my @comandos = (
  3.         "configure terminal",
  4.         "interface $INTERFACE",
  5.         "shutdown",
  6.     );
  7.  
  8.     for my $cmd (@comandos) {
  9.         $comando .= "$cmd<br>\n";               # acumulamos el $comando
  10.  
  11.         @out = $conn1[1]->cmd("$cmd\n");
  12.  
  13.         for my  $salida (@out) {
  14.             if ($salida =~ /error/i) {
  15.                 $comando .= "=> $salida<br>\n"; # vamos acumulando los errores
  16.             }
  17.         }
  18.     }
  19.  
  20.     ## Provocando la salida
  21.     for (1 .. 3) {                              # tres intentos
  22.  
  23.         @out = $conn1[1]->cmd("exit\n");        # de salir
  24.  
  25.         if (grep { /error/i } @out) {           # si hay un error
  26.             for my  $salida (@out) {
  27.                 if ($salida =~ /error/i) {
  28.                     $comando .= "=> $salida<br>\n";     # vamos acumulando los errores
  29.                 }
  30.             }
  31.         }
  32.         else {
  33.             last;                               # si no hay error, salimos inmediatamente
  34.         }
  35.  
  36.         sleep(10);
  37.     }
  38.  
  39.     ## Último comando
  40.     $comando .= "write memory<br>\n";
  41.  
  42.     @out = $conn1[1]->cmd("write memory\n");
  43.  
  44.     for my  $salida (@out) {
  45.         if ($salida =~ /error/i) {
  46.             $comando .= "=> $salida<br>\n";     # vamos acumulando los errores
  47.         }
  48.     }
  49.  
  50.    sleep(10);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema Usando Net::Telnet::Cisco

Notapor jero2528 » 2014-11-21 12:13 @550

Hola, explorer, muchas gracias nuevamente de antemano.

Sí, es eso lo que necesito, ya realicé los ajustes pertinentes pero tengo esta salida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <actool/services_to_suspend.pl 95684 COBOGGER7206x1 10.0.120.1 FastEthernet1/0.400
  2. conteo {1} -- Msg: {Las interfaces contenidas en el adjunto se bajaron dado que se encuentran suspendidas en RRData.<br><br>
  3. <table border='1'>
  4. <tr> <b> <td>CUSTOMER</td> <td>SERVICE</td> <td>SUSPENSION</td> <td>DEVICE</td> <td>IPDEVICE</td> <td>INTERFACE</td> <td>DESCR</td> <td>COMANDO</td> </b> </tr>
  5. <tr> <td>EZEQUIEL </td> <td>95684</td> <td>2014-11-21</td> <td>ROUTER7206x1</td> <td>10.0.120.1</td> <td>FastEthernet1/0.400</td> <td>95684 #- PREMIUM_IP #- 2048KB_VID:400 #- 34697_EZEQUIEL #- DIAG 97 # ABCDE #- IFX #- PRUEBA</td>
  6.  
  7. <td>ini terminal<br>
  8. interface FastEthernet1/0.400<br>
  9. shutdown<br>
  10. write memory<br>
  11. </td> </tr>
  12. </table>
  13.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Como lo puedes notar el comando: ini terminal, retorna:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. ROUTER7206X1#ini terminal
  2.                 ^
  3. % Invalid input detected at '^' marker.
  4.  
  5. ROUTER7206X1#interface FastEthernet1/0.400
  6.                 ^
  7. % Invalid input detected at '^' marker.
  8.  
  9.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

Lo que hice sobre el código que me indicaste fue lo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.                 ## Comandos normales
  2.                 my @comandos = ( "ini terminal", "interface $INTERFACE", "shutdown", );
  3.  
  4.                 for my $cmd (@comandos) {
  5.                     $comando .= "$cmd<br>\n";  # acumulamos el $comando
  6.                     @out = $conn1[1]->cmd("$cmd\n");
  7.                     for my $salida (@out) {
  8.                         if ( $salida =~ /.+?(error|Invalid).+?/is ) {
  9.                             $comando .= "=> $salida<br>\n";    # vamos acumulando los errores
  10.                         }
  11.                     }
  12.                 }
  13.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Por lo cual no me está capturando la salida del comando que se ejecuta en el enrutador :(

¿Por qué podría ser?

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: Problema Usando Net::Telnet::Cisco

Notapor explorer » 2014-11-21 13:51 @619

Pues... realmente no sé por qué falla... por alguna razón no admite esos comandos.

Una cosa: no necesitas poner '.+?' en la expresión regular. Fíjate que solo quieres saber si ocurre un 'error' o un 'Invalid', en cualquier sitio, así que no necesitas analizar nada más.

Lo recomendado es ponerlo así:

$salida =~ /error|Invalid/i

Y como no hay comodines '.' pues tampoco es necesaria la opción /s.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
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 6 invitados