Category: Service
Author/Contact Info Dr. Zin Mostaccho
Description: Service native for Win32, what verify a service of proxy installed in this host. Reading archive .ini with parameters. Send alert, with command batch.
#!/usr/bin/perl 

# Version 2.0  - 07-03-2002
#
# Salidas Errorlevel
# 0: OK
# 1: ALERTA
# 2: CRITICAL
# 3: APERTURA DE ARCHIVOS
# 4: FUERA DE RANGO HORARIO
# 9: HELP

######################################################################
+###########
# Definicion de Librerias                                             
+          #
######################################################################
+###########

#use strict;
#use warnings;
#use diagnostic;
use File::Copy;
use LWP::UserAgent;
require HTTP::Headers::Util;
require HTTP::Message;

######################################################################
+###########
# Definicion de variables                                             
+          #
######################################################################
+###########

my %param = ();
my $flag;
my ($hour,$min,$seg)=&local_hour;
my ($ano,$mes,$dia)=&local_date;
$param{debug}=0;


######################################################################
+###########
# Main                                                                
+          #
######################################################################
+###########

if (uc($ARGV[0]) eq "DEBUG") {
    $param{debug}=1;
}elsif ((uc($ARGV[0]) eq "HELP") || ($ARGV[0] eq "?")) {
    &ayuda;
}
$param{flag}="UP";
(%param)=&read_paramini(%param);
&prt_param(%param) if ($param{debug} eq 1);

print "1 ______________________\n" if ($param{debug} eq 1);
my $FileList = $param{workdir}."\\".$param{logs_arch_path_name};
if ($hour < $param{horaini} or $hour > $param{horafin}) {
    # No ejecuta ... fuera de rango
    exit 4;
}
print "LOG : $FileList\n" if ($param{debug} eq 1);
if ($param{logs_verificat} > 0) {
    $hora1=$hour.$min;
    $dif=($param{delay}/60)-1;
    $hora2=$param{horaini}.$dif;
    if ( $hora1 <= $hora2 ) {
        my $in = $FileList;
        my $out = $FileList."\.bak";
        copy($in, $out);
        open LOG, ">$FileList" or exit 3 ;
    }else{
        open LOG, ">>$FileList" or exit 3 ;
    }
}

(%param)=&read_flag(%param);
print "2 ______________________\n" if ($param{debug} eq 1);
(%param)=&processes(%param);
&prt_param(%param) if ($param{debug} eq 1);

print "3 ______________________\n" if ($param{debug} eq 1);
(%param)=&alerta(%param);
(%param)=&processes(%param);

print "4 ______________________\n" if ($param{debug} eq 1); 

(%param)=&write_flag(%param);
print "5 ______________________\n" if ($param{debug} eq 1);

close LOG;
if ($param{flag} eq "UP") {
    exit; 
}elsif ($param{flag} eq "ALERTA") {
    exit 1;
}if ($param{flag} eq "CRITICAL") {
    exit 2;
}

######################################################################
+###########
# Help                                                                
+            #
######################################################################
+###########

sub ayuda {
    system(cls);
    print "ProxyCheck.exe - Version 2.0 - 08-03-2002 \n";
    print "Opciones \[DEBUG\]: muestra por pantalla el proceso\n";
    print "         \[HELP\]: muestra por pantalla esta ayuda\n\n";
    print "# Salidas Errorlevel\n";
    print "# 0: OK\n";
    print "# 1: ALERTA\n";
    print "# 2: CRITICAL\n";
    print "# 3: APERTURA DE ARCHIVOS\n";
    print "# 4: FUERA DE RANGO HORARIO\n";
    print "# 9: HELP || ?\n";
exit 9;
}


######################################################################
+###########
# Lectura de Parametros => proxycheck.ini                             
+          #
######################################################################
+###########

sub read_paramini {
    (%param)=@_;

    my $FileList = "proxycheck.ini";
    if (!-e $FileList) {
        $param{logs_verificat}=1;
        $param{workdir}="c:\proxyckeck";
        $param{logs_arch_path_name}= "proxycheck.log";
        $param{server}= "localhost";
        $param{port}= "8080";
        $param{url1}= "http://foo.com.ar";
        $param{url2}= "http://refoo.com.ar";
        $param{horaini}=0;
        $param{horafin}=21;
        $param{delay}=180;
    }
    
    if (open INI, "<$FileList") {
        print "Abro archivo $FileList para lectura\n " if ($param{debu
+g} eq 1) ;
        my @lectura_param=<INI>;
        close INI;
        my $urlcount=0;
        foreach my $linea_param (@lectura_param){
            chomp ($linea_param);
            if ($linea_param =~ /#/) {
                # linea de comentario
            }elsif (!$linea_param) {
                # lineas en blanco
            }else{
                $linea_param =~ tr / //;
                $linea_param =~ s/ //eg;
                ($variable, $valor) = split (/=/, $linea_param);
                if ($variable =~ /url/) {
                    $urlcount= ++ $urlcount;
                }
                $param{$variable} = $valor;
            }
        }
        $param{urlcount}=$urlcount;
    }else{
        print ":::::::::: Tomo parametros de default ...\n " if ($para
+m{debug} eq 1);
        print "\n$param{logs_verificat},$param{workdir},$param{logs_ar
+ch_path_name},$param{server},$param{port},$param{url1},$param{horaini
+},$param{horafin},$param{delay}\n" if ($param{debug} eq 1) ;
        $param{urlcount}=1;
    }
    return(%param);
}

######################################################################
+###########
# Lectura de FLAG => FLAG.dat                                         
+           #
######################################################################
+###########

sub read_flag {
    (%param)=@_;
    my $FileList = "flag.dat";
    if (open FLAG, "<$FileList") {
        print "Abro archivo $FileList para lectura\n " if ($param{debu
+g} eq 1);
        while (<FLAG>){
            $param{flag}=$_;
            print "FLAG : $param{flag}\n" if ($param{debug} eq 1);
            close FLAG;
        }
    }else{
        open FLAG, ">$FileList";
        print FLAG "UP";
        close FLAG;    
    }

return(%param);
}

######################################################################
+###########
# write de FLAG => FLAG.dat                                           
+             #
######################################################################
+###########

sub write_flag {
    (%param)=@_;
    my $FileList = "flag.dat";
    open FLAG, ">$FileList" or exit 3;
    print FLAG "$param{flag}";
    close FLAG;
return(%param);
}


######################################################################
+###########
# Procesos                                                            
+          #
######################################################################
+###########

sub processes {
        (%param) = @_;
        $urlcuenta = $param{urlcount};
        $param{active}="Ok";
            while ($urlcuenta >0) {
                $temp="url".$urlcuenta;
                chomp ($temp);
                $url_data = $param{$temp};
                $url_data =~ tr / //;
                $url_data =~ s/ //eg;
                $param{data}=$url_data;
                if ($url_data =~ m/^http:\/\/.*/) {
                    (%param) = &HTTpConn(%param);
                    my ($year,$month,$day)=&local_date($year,$month,$d
+ay);
                    my $date=$year."-".$month."-".$day;
                    my ($hour,$min,$sec)=&local_hour($hour,$min,$sec);
                    my $time=$hour.":".$min;
                    my $temp = "url".$param{urlcount};
                    my $valores = $date.",".$time.",".$param{active}."
+,".$param{server}.",".$param{data}.",".$param{errormsg};
                    print LOG "$valores\n";
                    $status{$temp} = $valores;
                    $param{$temp}= $valores;
                }
                $urlcuenta=--$urlcuenta;
                $param{urlcount}=$urlcuenta;
            
        }
    return(%param);
}

######################################################################
+###########
# Conexion contra URL                                                 
+          #
######################################################################
+###########

sub HTTpConn {

        (%param) = @_;
        my $ua = LWP::UserAgent->new;
        my $server = $param{server};
        my $port = $param{port};
        my $ErrorMsg = "200 - Ok";
        my $url = $param{data};
        my $temporal_con = "http://".$server.":".$port;
        chomp ($temporal_con);
        print "\n$temporal_con with $url\n" if ($param{debug} eq 1);
        
        $ua->proxy(['http', 'ftp'] , $temporal_con);

        $req = new HTTP::Request 'GET' => $url;
#        $res = $ua->request($req);
        $res = $ua->request($req, \&callback, 4096);
        

            if ($res->is_success) {
                    $param{active}="Ok";
                    print "$url -> Connect OK\n" if ($param{debug} eq 
+1);
            } else {
                $ErrorMsg=$res->as_string;
                ($ErrorMsg,my $trash)=split(/\n/,$ErrorMsg);
                if ($ErrorMsg =~ /4\d\d/) {
                    $param{active}="NOk";
                    print "$url -> Connect NOk \n" if ($param{debug} e
+q 1);
                }else{
                    $param{active}="Err";
#                    $_=$res->error_as_HTML;
                    print "$url -> Connect Err \n" if ($param{debug} e
+q 1);
                }
            }
            $param{errormsg}=$ErrorMsg;
    return(%param);
}

##############################################################
#  Genera alertas en Tivoli
##############################################################

sub alerta {
    (%param) = @_;
    my $icuenta=0;
    my $flag = $param{flag};
    foreach $linea (sort keys %param) {
        if ($linea =~ /url/) {
            print "$linea: $status{$linea}\n" if ($param{debug} eq 1);
            my ($date,$time,$estado,$server_nam,$url,$ErrorMsg)=split(
+/,/,$status{$linea});
            if ($estado =~ /Err/) {
                $icuenta=$icuenta+1;
                $ErrorMsg = $linea;                
            }
        }
    }
    my $tivolicmd=$param{workdir}."\\".$param{tivoli};
    my $ErrorMsg=sprintf "\"%s\"",$ErrorMsg;
    if ($icuenta > 0) {
        if ($flag =~ /ALERTA/) {
            #si existe genero critical
            $flag = "CRITICAL";
            system "$alertacmd CRITICAL $ErrorMsg";
            print ">>>>>>>>>>>>>> Alerta -> CRITICAL \n" if ($param{de
+bug} eq 1);
        }elsif ($flag =~ /UP/){
            #si no existe genero alerta
            $flag = "ALERTA";
            system "$alertacmd DOWN $ErrorMsg";
            print ">>>>>>>>>>>>>> Alerta  -> DOWN \n" if ($param{debug
+} eq 1);
        }
    }else{
        if ($flag =~ /CRITICAL/ || $flag =~ /ALERTA/){
            #si existe alerta o critical - borro flags
            $flag = "UP";
            system "$alertacmd UP Service_proxy_server";
            print ">>>>>>>>>>>>>> Alerta  -> UP Service_proxy_server\n
+" if ($param{debug} eq 1);
        }
    }
    $param{flag} = $flag;
return(%param);
}
    
######################################################################
+###########
# Dia formato                                                         
+         #
######################################################################
+###########

sub local_date {
        ($day, $mes, $ano) = (localtime)[3..5];
        $month = $mes+1; 
        $year = $ano+1900;
    return($year,$month,$day);
}

######################################################################
+###########
# Dia formato                                                         
+         #
######################################################################
+###########

sub local_hour {
    ($sec, $min, $hour) = (localtime)[0..2];
    return($hour,$min, $sec);
}


######################################################################
+###########
# Funcion print param                                                 
+             #
######################################################################
+###########

sub prt_param {
    (%ini)=@_;
    my $icuenta=1;
    print "\nLista Hash ...\n" ;
    foreach $linea (sort keys %ini) {
        print "$icuenta .- $linea: $ini{$linea}\n";
        $icuenta=$icuenta+1;
    }
    print "Fin Hash ...\n\n";
return;
}

######################################################################
+###########
# Funcion Callback                                                    
+          #
######################################################################
+###########

sub callback { 
    my ($data, $response, $protocol) = @_; 
return;
}

######################################
# NOTA
# INI externo: alerta.cmd

# Todas las variables deben ser ingresadas en minusculas y # para come
+ntarios

# Tiempo loop (en seg) entre llamados, las horas de 0 .. 21
#horaini = 0
#horafin = 21

# Directorio de trabajo
#workdir = c:\proxycheck

# Generacion de logs y archivo de logs
#logs_verificat = 1
#logs_arch_path_name = proxycheck.log

# Datos del proxy server
#server = localhost
#port = 8080

# Archivos Tivoli
#alerta = alerta.cmd

# URLs a controlar 
#url1 = http://foo.com.ar
#url2 = http://refoo.com.ar
#url3 = ....

######################################
# NOTA
# CMD externo: alerta.cmd

#@echo off
#set MSG=%2
#goto %1

#:up
#set a=HARMLESS
#set b=web_proxy_up
#set MSG=%2_UP
#goto fin

#:down
#set a=WARNING
#set b=web_proxy_down
#net stop proxy_xxxx >NUL
#c:\proxycheck\sleep 30
#c:\proxycheck\kill -f ns-proxy.exe
#c:\proxycheck\kill -f proxy.exe 
#c:\proxycheck\kill -f bupdate.exe
#net start proxy_xxxx >NUL
#goto fin

#:critical
#set a=CRITICAL
#set b=web_proxy_down
#goto fin

#:fin
# use tool ext. of mail or tivoli postmsg with parameters (%a%,%MSG%,%
+computername%,%b%)