• Publicidad

Ejecución de comandos shell en Perl

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Re: Ejecución de comandos shell en Perl

Notapor davidin073 » 2010-01-15 06:49 @326

Es muy extraño pero al probar tu último ejemplo, ejecutando en la consola, el resultado es bueno, pero Nagios muestra el estado como si retornase 1 y muestra la línea impresa que está fuera del for().

Es desesperante, no sé por qué actúa de esa manera...
davidin073
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2010-01-13 10:33 @481

Publicidad

Re: Ejecución de comandos shell en Perl

Notapor davidin073 » 2010-01-15 06:53 @328

Lo que parece que sí funciona es esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use Getopt::Std;
  4. use strict;
  5.  
  6. my $asterisk_bin="/usr/bin/sudo /usr/sbin/asterisk";
  7. my $asterisk_option="-rx";
  8. my $asterisk_dahdi="dahdi show status";
  9. my $return;
  10.  
  11. my $cmd = qq($asterisk_bin $asterisk_option "$asterisk_dahdi" );
  12. foreach (`($cmd)`) {
  13.   if (/OK/) {
  14.       $return=0;
  15.     }
  16. }
  17. if($return == 0){
  18. print(" La tarjeta Wildcard TDM400P no tiene alarmas. \n");
  19. exit(0);
  20. }
  21. print(" Revisar el estado de la tarjeta Wildcard TDM400P. \n ");
  22. exit(1);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
davidin073
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2010-01-13 10:33 @481

Re: Ejecución de comandos shell en Perl

Notapor davidin073 » 2010-01-15 06:59 @332

El problema realmente está en que paro Asterisk y todos los servicios deberían de estar, o en estado critical o warning. Y eso no sucede por este motivo, con el código del anterior mensaje:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [nagios@localhost SCRIPTS]$ ./dahdi.pl
  2. Use of uninitialized value in numeric eq (==) at ./dahdi.pl line 17.
  3.  La tarjeta Wildcard TDM400P no tiene alarmas.
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Es decir, es cierto que sigue ejecutando el código pero ejecuta también lo que está dentro del if{}, por tanto, sigue mostrando la línea de no hay alarmas y sigue retornando 0.

Ese es el problema que me falta por resolver.
davidin073
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2010-01-13 10:33 @481

Re: Ejecución de comandos shell en Perl

Notapor explorer » 2010-01-15 09:18 @429

davidin073 escribiste:Es muy extraño pero al probar tu último ejemplo, ejecutando en la consola, el resultado es bueno, pero Nagios muestra el estado como si retornase 1 y muestra la línea impresa que está fuera del for().

Pues si funciona en consola, pero a Nagios le sale el mensaje de error, es que quizás no ha tenido los permisos necesarios para ejecutar el asterisk.

Una pregunta... Nagios, ¿qué espera? ¿El resultado (estado, status) de la ejecución, o un texto por la entrada estándar?

davidin073 escribiste:Y eso no sucede por este motivo, con el código del anterior mensaje:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [nagios@localhost SCRIPTS]$ ./dahdi.pl
  2. Use of uninitialized value in numeric eq (==) at ./dahdi.pl line 17.
  3.  La tarjeta Wildcard TDM400P no tiene alarmas.
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Es decir, es cierto que sigue ejecutando el código pero ejecuta también lo que está dentro del if{}, por tanto, sigue mostrando la línea de no hay alarmas y sigue retornando 0.

Es que el problema está en que NO inicializas el valor de $return.

my $return;

Por defecto, tendrá el valor 'undef'.

Supongamos que, en la línea siguiente, se ejecuta el Asterisk, y falla. Luego entonces, $return NO obtiene el valor 0 (el bucle for() no se ejecuta o se ejecuta pero no hay Ok) y sigue valiendo 'undef'. Llega al if(). Allí, sale el mensaje de aviso (gracias a Larry tenemos 'warnings' activado) -que tu muestras- de que estás haciendo una comparación con una variable que NO ha sido inicializada. PERO ES UN AVISO. Perl, lo que hará, es una conversión del valor 'undef' a valor numérico... ¿sabes a qué valor?... pues a CERO.

Es por ESA razón por la que el programa entrará en el if(), tanto en el caso de que Asterisk esté Ok, como si falla su ejecución.

La solución, ya te lo vuelvo a decir: inicializa el $return con el valor de critical (u otro valor, que no sea 0 ni 'undef').

De esa manera,
* si el Asterisk funciona, se podrá actualizar $return dentro del for() (o no, si no está Ok).
* si el Asterisk falla, ya tenemos un valor de $return puesto (a critical)
* al llegar al if(), sabemos que $return habrá sido modificado a 0 =>SOLO<= si Asterisk devolvió un Ok

Ya has visto como mi solución funciona en consola. Otro tema es ver por qué Nagios no lo ejecuta tan bien como la consola.

¿No tiene Nagios un registro (log) de actividad para ver lo que hace?
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: Ejecución de comandos shell en Perl

Notapor davidin073 » 2010-01-15 11:14 @509

Ok, entiendo esa explicación, no había caído en eso, jeje.

Por una parte lo de los privilegios, es cierto, se ejecutan con el usuario nagios, por eso cuando ejecuto los scripts para probarlos lo hago desde ese usuario mientras que para modificarlos lo hago como root.

Nagios espera un retorno numérico, como te he dicho:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
0 --> OK
1 --> WARNING
2 --> CRITICAL
3 --> UNKNOWN
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Lo del texto por pantalla lo hago porque Nagios tiene asociado al estado una característica llamada Status Information que se rellena con el primer print() del script.

De ahí que siempre pongan print().

No sé por qué pero el funcionamiento no es correcto, los logs no muestran gran cosa.
Última edición por explorer el 2010-01-15 11:43 @530, editado 1 vez en total
Razón: Ortografía
davidin073
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2010-01-13 10:33 @481

Anterior

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron