#!/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%)
|