• Publicidad

Parseo de archivo

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

Parseo de archivo

Notapor natxo » 2008-10-15 08:21 @389

Tengo que verificar que ciertas tareas programadas (scheduled tasks) de un servidor win2k3 se ejecuten correctamente y si no, recibir un aviso. Usamos Nagios, así que me he puesto a escribir un plugin (no he visto nada en nagiosexchange).

Hay dos maneras de ver si se han ejecutado bien las tareas: interactivamente (no es lo que quiero) o con el comando schtasks.

He visto que puedo sacar la información a un archivo con este comando:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
schtasks /query /fo list /v > dump.txt
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El archivo es así:

Código: Seleccionar todo
HostName:                             SERVER
TaskName:                             jobname
Next Run Time:                        09:00:00, 16-10-2008
Status:                               
Logon Mode:                           Interactive only
Last Run Time:                        09:00:00, 07-10-2008
Last Result:                          0
Creator:                              user
Schedule:                             At 09:00 every day, starting 18-01-2008
Task To Run:                          C:\Program Files\program\exe.exe "jobname.xml" -l"C:\Documents and Settings\user\Application Data\program\log.log" -s"C:\Documents and Settings\user\Application Data\pgrogram\program.xml"
Start In:                             N/A
Comment:                              N/A
Scheduled Task State:                 Enabled
Scheduled Type:                       Daily
Start Time:                           09:00:00
Start Date:                           18-01-2008
End Date:                             N/A
Days:                                 Everyday
Months:                               N/A
Run As User:                          domain\administrator
Delete Task If Not Rescheduled:       Disabled
Stop Task If Runs X Hours and X Mins: Disabled
Repeat: Every:                        Disabled
Repeat: Until: Time:                  Disabled
Repeat: Until: Duration:              Disabled
Repeat: Stop If Still Running:        Disabled
Idle Time:                            Disabled
Power Management:                     Disabled


A continuación sigue otra tarea con el mismo formato, y otra ...

Necesito sacar la información de TaskName, Status y Last Result. Si sólo tuviera una tarea, sería muy simple, pero no sé me ocurre cómo guardar los resultados para luego utilizarlos. Cómo puedo leer trozos de un archivo (desde la línea Hostname hasta Power Management), y luego otra vez y otra y otra, tantas veces como sea necesario.

No me hace falta que me hagan la tarea :-) , sólo necesito un empujón en la dirección adecuada porque la verdad, no se me ocurre cómo hacerlo.
saludos,
Natxo Asenjo
natxo
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2007-08-09 16:22 @723
Ubicación: Países Bajos

Publicidad

Notapor kidd » 2008-10-15 08:46 @406

Hola,

En CPAN podrás encontrar varios módulos relacionados con Nagios, alguno de ellos te podría ayudar en lo que necesitas:
http://search.cpan.org/search?query=nagios&mode=all

Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor explorer » 2008-10-15 10:44 @489

Como es un fichero de texto, puedes probar a sacar las líneas con patrones de búsqueda:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ( $linea =~ /TaskName:\s+(.*)/ ) {
    print "Tarea $1\n";
}
Coloreado en 0.002 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

Notapor natxo » 2008-10-15 11:23 @516

Sí, claro :-)

El problema es la repetición de jobs/tareas. O sea, cada tarea es un párrafo del archivo de texto cuya primera línea es Hostname y la última 'Power Management' y así tantos párrafos como jobs haya definidos en el servidor. Si śolo hubiera un párrafo, sería trivial hacer algo así como indicas. Mi problema es que no sé todavía cómo parsear un párrafo, ver si hay algún error, pasar al siguiente párrafo, etc. Creo que voy a crear un hash por cada tarea programada y luego sacaré los resultados con los códigos de error que espera Nagios (0, 1, 2, ó 3).

Se nota que no soy un programador, soy el sysadmin de la empresa :)
saludos,
Natxo Asenjo
natxo
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2007-08-09 16:22 @723
Ubicación: Países Bajos

Notapor explorer » 2008-10-15 12:08 @547

Con
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

open MYLOG, '<kk.log' or die "No pude abrir el fichero de log: $!\n";

while (<MYLOG>) {
    if (/^(HostName|TaskName|Status|Last Result):\s+(.*)/) {
        printf "%-12s: %s\n", $1, $2;
        print "\n" if $1 eq 'Last Result';
    }
}

close MYLOG;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y el fichero de entrada

Código: Seleccionar todo
HostName:                             SERVER
TaskName:                             jobname
Next Run Time:                        09:00:00, 16-10-2008
Status:
Logon Mode:                           Interactive only
Last Run Time:                        09:00:00, 07-10-2008
Last Result:                          0
Creator:                              user
Schedule:                             At 09:00 every day, starting 18-01-2008
Task To Run:                          C:\Program Files\program\exe.exe "jobname.xml" -l"C:\Documents and Settings\user\Application Data\program\log.log" -s"C:\Documents and Settings\user\Appl
Start In:                             N/A
Comment:                              N/A
Scheduled Task State:                 Enabled
Scheduled Type:                       Daily
Start Time:                           09:00:00
Start Date:                           18-01-2008
End Date:                             N/A
Days:                                 Everyday
Months:                               N/A
Run As User:                          domain\administrator
Delete Task If Not Rescheduled:       Disabled
Stop Task If Runs X Hours and X Mins: Disabled
Repeat: Every:                        Disabled
Repeat: Until: Time:                  Disabled
Repeat: Until: Duration:              Disabled
Repeat: Stop If Still Running:        Disabled
Idle Time:                            Disabled
Power Management:                     Disabled
HostName:                             SERVER2
TaskName:                             jobname2
Next Run Time:                        09:00:00, 16-10-2008
Status:                               Ok
Logon Mode:                           Interactive only
Last Run Time:                        09:00:00, 07-10-2008
Last Result:                          1
Creator:                              user
Schedule:                             At 09:00 every day, starting 18-01-2008
Task To Run:                          C:\Program Files\program\exe.exe "jobname.xml" -l"C:\Documents and Settings\user\Application Data\program\log.log" -s"C:\Documents and Settings\user\Appl
Start In:                             N/A
Comment:                              N/A
Scheduled Task State:                 Enabled
Scheduled Type:                       Daily
Start Time:                           09:00:00
Start Date:                           18-01-2008
End Date:                             N/A
Days:                                 Everyday
Months:                               N/A
Run As User:                          domain\administrator
Delete Task If Not Rescheduled:       Disabled
Stop Task If Runs X Hours and X Mins: Disabled
Repeat: Every:                        Disabled
Repeat: Until: Time:                  Disabled
Repeat: Until: Duration:              Disabled
Repeat: Stop If Still Running:        Disabled
Idle Time:                            Disabled
Power Management:                     Disabled
HostName:                             SERVER3
TaskName:                             jobname3
Next Run Time:                        09:00:00, 16-10-2008
Status:                               No Ok
Logon Mode:                           Interactive only
Last Run Time:                        09:00:00, 07-10-2008
Last Result:                          12
Creator:                              user
Schedule:                             At 09:00 every day, starting 18-01-2008
Task To Run:                          C:\Program Files\program\exe.exe "jobname.xml" -l"C:\Documents and Settings\user\Application Data\program\log.log" -s"C:\Documents and Settings\user\Appl
Start In:                             N/A
Comment:                              N/A
Scheduled Task State:                 Enabled
Scheduled Type:                       Daily
Start Time:                           09:00:00
Start Date:                           18-01-2008
End Date:                             N/A
Days:                                 Everyday
Months:                               N/A
Run As User:                          domain\administrator
Delete Task If Not Rescheduled:       Disabled
Stop Task If Runs X Hours and X Mins: Disabled
Repeat: Every:                        Disabled
Repeat: Until: Time:                  Disabled
Repeat: Until: Duration:              Disabled
Repeat: Stop If Still Running:        Disabled
Idle Time:                            Disabled
Power Management:                     Disabled
HostName:                             SERVER4
TaskName:                             jobname41
Next Run Time:                        09:00:00, 16-10-2008
Status:                               -1
Logon Mode:                           Interactive only
Last Run Time:                        09:00:00, 07-10-2008
Last Result:                          023
Creator:                              user
Schedule:                             At 09:00 every day, starting 18-01-2008
Task To Run:                          C:\Program Files\program\exe.exe "jobname.xml" -l"C:\Documents and Settings\user\Application Data\program\log.log" -s"C:\Documents and Settings\user\Appl
Start In:                             N/A
Comment:                              N/A
Scheduled Task State:                 Enabled
Scheduled Type:                       Daily
Start Time:                           09:00:00
Start Date:                           18-01-2008
End Date:                             N/A
Days:                                 Everyday
Months:                               N/A
Run As User:                          domain\administrator
Delete Task If Not Rescheduled:       Disabled
Stop Task If Runs X Hours and X Mins: Disabled
Repeat: Every:                        Disabled
Repeat: Until: Time:                  Disabled
Repeat: Until: Duration:              Disabled
Repeat: Stop If Still Running:        Disabled
Idle Time:                            Disabled
Power Management:                     Disabled
sale
Código: Seleccionar todo
HostName    : SERVER
TaskName    : jobname
Status      :
Last Result : 0

HostName    : SERVER2
TaskName    : jobname2
Status      : Ok
Last Result : 1

HostName    : SERVER3
TaskName    : jobname3
Status      : No Ok
Last Result : 12

HostName    : SERVER4
TaskName    : jobname41
Status      : -1
Last Result : 023
Por eso Perl es perfecto para los administradores de sistemas...

Incluso si quieres ejecutarlo desde la línea de comandos, así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
filtra.pl kk.log
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

puedes dejarlo en
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -n
if (/^(HostName|TaskName|Status|Last Result):\s+(.*)/) {
    printf "%-12s: %s\n", $1, $2;
    print "\n" if $1 eq 'Last Result';
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Incluso, si quieres, sin hacer ningún programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl -nle '/^(HostName|TaskName|Status|Last Result):\s+(.*)/ and printf "%-12s: %s\n", $1, $2' kk.log
Coloreado en 0.001 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

Notapor natxo » 2008-10-20 09:56 @456

explorer:

A veces uno se enciega con una solución que no tiene sentido. Al final lo he hecho así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!perl

# define the file where we'll dump the logfile of schtasks
my $jobfile = "c:/tmp/dump.txt" ;
unlink ($jobfile) or die "cannot remove $jobfile: $!\n" ;

# first run schtasks /query /fo /list /v and dump everything to a file
my $schtasks_dump = `schtasks /query /fo list /v > $jobfile`;

# open file RO, or croak
open (JOBS, $jobfile) or die "couldn't open $jobfile: $!\n";

my $count = 0;
my $ok = 0;
# parse file, if string Last Result is not 0 (success), croak
while (<JOBS>) {
    if (/^(Last Result:)\s+(.*)$/) {
        # count how many jobs there are, we'll use this later
        $count++;
        # if an error level is not 0, croak
        if ($2 != 0) {
            print "WARNING: problem with a scheduled job\n";
            exit 1;
        }
        # now we count how many jobs have run fine
        else {
            $ok++;
        }
    }
}

if ($count = $ok) {
    print "OK: all scheduled tasks have run fine\n";
    exit 0;
}
else {
    # if there is something wrong, give unkonw and errolevel 3
    print "UNKONWN: something else went wrong\n";
    exit 3;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Nagios espera ciertos resultados: 0 => OK; 1 => WARNING; 2 => CRITICAL; 3 => UNKNOWN.

Me estaba empecinando en meter cada párrafo del log en un hash para luego sacarlo y hacer no sé qué. Con esta solución (ya lo tengo en producción) si falla algún job, Nagios me avisa (me da igual cuál, tengo que darme de alta en el servidor de todos modos para activarlo).

Gracias por darme un empujón en la dirección correcta ;-)
saludos,
Natxo Asenjo
natxo
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2007-08-09 16:22 @723
Ubicación: Países Bajos

Notapor explorer » 2008-10-20 11:41 @528

Hay un error (creo) en el código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($count = $ok) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Estás haciendo una asignación, no una comparación.

Salvo que quieras saber cuándo $ok es distinto de cero, lo normal es que una asignación dentro de una condición sea un error. Debería ser
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($count == $ok) {
Coloreado en 0.001 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

Notapor natxo » 2008-10-20 11:48 @533

explorer escribiste:Hay un error (creo) en el código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($count = $ok) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Estás haciendo una asignación, no una comparación.

Salvo que quieras saber cuándo $ok es distinto de cero, lo normal es que una asignación dentro de una condición sea un error. Debería ser
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($count == $ok) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


curioso, en mi código está como lo pones tú. No sé qué ha podido pasar durante el copiar/pegar.
saludos,
Natxo Asenjo
natxo
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2007-08-09 16:22 @723
Ubicación: Países Bajos

Notapor explorer » 2008-10-20 12:02 @543

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!perl
use strict;
use warnings;
use diagnostics;

# first run schtasks /query /fo /list /v and dump everything to a file
open (JOBS, "schtasks /query /fo list /v |") or die "couldn't exec schtasks: $!\n";

# Counters
my $count = 0;
my @count = ();

# parse file, if string Last Result is not 0 (success), croak
while (<JOBS>) {
    if (/^Last Result:\s+(.*)$/) {
        # count how many jobs there are, we'll use this later
        $count++;

        # By type
        $count[$1]++;
    }
}

close JOBS;

if ($count[1]) {
    warn "WARNING: problem with $count[1] scheduled jobs\n";
    exit 1;
}

if ($count[0] == $count) {
    warn "OK: all scheduled tasks have run fine\n";
    exit 0;
}
else {
    # if there is something wrong, give unkonw and errolevel 3
    warn "UNKONWN: something else went wrong\n";
    exit 3;
}

__END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Actualización: Ahora no recuerdo si en Windows funcionan los pipes de la misma manera que en Unix/Linux.
Última edición por explorer el 2008-10-20 14:08 @631, editado 1 vez en total
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

Notapor Leo_Gutierrez » 2008-10-20 13:00 @583

explorer escribiste:Actualización: Ahora no recuerdo si en Windows funcionan los pipes de la misma manera que en Unix/Linux.


Si, funcionan igual :
Código: Seleccionar todo
tasklist | find /i "explorer.exe"
Leo_Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 91
Registrado: 2008-08-20 23:38 @026


Volver a Básico

¿Quién está conectado?

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

cron