Tengo inconvenientes con la ejecución de un script en Perl que ejecuta tres comandos sobre equipos Cisco, los cuales dependen uno del otro, de manera que si el comando 1, no se ejecuta, no se puede seguir ya que el comando 2 se arma de acuerdo a la salida generada por el primero; de igual forma sucede con el tercer comando.
El problema es que algunas veces el script se ejecuta de forma correcta y otras veces se detiene ya que alguno de los comandos ejecutados no genera la salida que se espera. ¿Por qué sucede esto? ¿Cómo puedo resolver este inconveniente?
La salida del script cuando se ejecuta sin problemas es la siguiente:
Using bash Syntax Highlighting
- [root@miserver ~]# /usr/local/scripts/findipservicescisco.pl
- Wed Mar 30 19:22:28 UTC 2016
- C1 show ip route 190.60.215.408
- C2: show ip route 190.60.124.190
- C3 show run inter GigabitEthernet0/1.6087
- (190.60.215.408,65661,COMPANY,29)
- update subnets set serviceid = 65661, Customer = 'COMPANY' where subnet = 3191658288 and mask = 29
- Wed Mar 30 19:22:30 UTC 2016
- [root@miserver ~]#
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
¡Qué alegría que funcionara! Pero luego borré los datos que actualiza el script en la base de datos para volver a ejecutar lo mismo y la salida es la siguiente:
Using bash Syntax Highlighting
- [root@miserver ~]# /usr/local/scripts/findipservicescisco.pl
- Wed Mar 30 19:26:50 UTC 2016
- C1 show ip route 190.60.215.408
- C2: show ip route 190.60.124.190
- Wed Mar 30 19:26:52 UTC 2016
- [root@miserver ~]#
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Es decir: que la salida del comando 2 (C2) no fue la esperada para poder ejecutar el Comando 3.
He probado indicando el timeout a la ejecución de los comandos, he usado las opciones de print() y wait_for() pero el resultado es el mismo siempre y no solo me ha ocurrido en este script sino en algunos otros.
Comparto el código para que por favor alguien me ayude a resolver este lío:
Using perl Syntax Highlighting
- @conn1 = conectar_telnet_cisco( $IPDEVICE, $userbackupsdefault, $passbackupsdefault );
- if ( ( $conn1[0] ) ) {
- $mensajeerror = "Equipo=$DEVICE, IP=$IPDEVICE, Descripcion=$conn1[0]\n";
- }
- else {
- $query01
- = "select id, subnet, mask from subnets where serviceId is null and mastersubnetid not in (0, 1, 2, 3, 4) and subnet=3191658288 group by subnet";
- $r_query01 = $mysql_glpi01->selectall_arrayref("$query01");
- foreach $row_r_query01 (@$r_query01) {
- ( $id, $ip, $mask ) = @$row_r_query01;
- $idFather = &findFather($id);
- #print "Father: $idFather\n";
- if ( $idFather == 1 ) {
- $ip = `php /usr/local/scripts/ip2long.php $ip long2ip`;
- $command = "show ip route $ip";
- print "C1 $command \n";
- $ipnextjump = "";
- @out = $conn1[1]->cmd( String => "$command\n", Timeout => 10 );
- for my $salida (@out) {
- if ( $salida =~ /\*\s+((?:\d+\.){3}\d+)/i ) {
- $ipnextjump = $1;
- }
- }
- $interface = "";
- if ( $ipnextjump =~ /(?:\d+\.){3}\d+/ ) {
- $commandnext = "show ip route $ipnextjump";
- print "C2: $commandnext \n";
- @out = $conn1[1]->cmd( String => "$commandnext\n", Timeout => 10 );
- for my $salida (@out) {
- if ( $salida =~ /\*.+?via\s+(\w+\/\d+\.\d+)/i ) {
- $interface = $1;
- }
- }
- }
- if ( $interface =~ /\w+\/\d+\.\d+/ ) {
- $commandDesc = "show run inter $interface";
- print "C3 $commandDesc \n";
- @out = $conn1[1]->cmd( String => "$commandDesc\n", Timeout => 10 );
- for my $salida (@out) {
- if ( $salida =~ /description\s+(\d+(?:\*\d+)?)/i ) {
- ( $servicio, $subservicio ) = split( /\*/, $1 );
- unless ($subservicio) { $subservicio = 0; }
- $cliente = &getClient($servicio);
- print "($ip,$servicio,$cliente,$mask) \n";
- &updateService( $ip, $servicio, $cliente, $mask );
- &insertLog( $ip, $servicio, $mask );
- #&insertStaticIp($dataS[$i]{'ipservicio'}, $servicio, $subservicio, $dataS[$i]{'maskservicio'}, $dataS[$i]{'interface'});
- }
- }
- }
- }
- }
- }
- cerrar_telnet_cisco( $conn1[1] );
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
De antemano, muchas gracias a cualquiera que me pueda ayudar con este problema. Cada vez es más frecuente y cada día que pasa es un reto poder trabajar con ello. Por cierto, la versión de Perl que uso es: This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi sobre un RedHat 6. Mil gracias