# perl -w
############################################################################
#
# Watchdog Agent
#
# (c) 2011 Andreas Krüger
# Homepage : http://www.andreas-krueger.de/
# Mail : http://www.andreas-krueger.de/system/kontakt/
#
############################################################################
my $Version = "2.11";
#
# 2.11 - 2011.02.27 - add last status
# 2.10 - 2011.02.24 - minor futures and fixes
# 2.00 - 2011.02.16 - Initialversion
#
############################################################################
#
############################################################################
# Benutze folgende Module
############################################################################
use LWP;
use MIME::Lite;
use Config::IniFiles;
use strict;
use warnings;
#
############################################################################
# Globale Konfigutaion in INI lesen
############################################################################
if (! -e "./WebWatch.ini" ){&MissingConfig;exit;}
my $cfg = Config::IniFiles->new( -file => "./WebWatch.ini" );
my $alive;
my $i;
my $ret;
############################################################################
if (lc($cfg->val( 'Application', 'Silent' ))eq "false"){&ShowInfo();}
for($i = 1; $i <= $cfg->val( 'Server', 'Anzahl' ); $i++) {
$alive = TesteDienst(lc($cfg->val( 'Server'.$i, 'TesteURI' )), $cfg->val( 'Server'.$i, 'TesteAuf' ), $i);
if ($alive eq "StatusTrue"){
$cfg->newval('Server'.$i, "Alive", "true");
$cfg->newval('Server'.$i, "Timestamp", &myTimer(0));
$cfg->WriteConfig('./WebWatch.ini'=>1);
}
else{
$cfg->newval('Server'.$i, "Alive", "false");
$cfg->newval('Server'.$i, "Timestamp", &myTimer(0));
$cfg->WriteConfig('./WebWatch.ini'=>1);
}
if (lc($cfg->val( 'Application', 'Silent' ))eq "false"){
print $cfg->val( 'Server'.$i, 'Label' )." - ".$cfg->val( 'Server'.$i, $alive )."\n";
}
}
############################################################################
############################################################################
# Subfunktionen
#
############################################################################
# Logfile schreiben
sub WriteLog
{
my $Service = shift;
my $Status = shift;
my $Logfile = $cfg->val( 'Application', 'LogFolder' ).&myTimer(2)."-".$cfg->val( 'Application', 'Titel' ).".log";
open(FILE_LOG, ">>$Logfile") || die "can't open: $!";
print FILE_LOG &myTimer(1)." - WatchDog: ".$cfg->val( 'Server'.$Service, $Status )."\n";
close (FILE_LOG);
}
############################################################################
# Fehlermail versenden
sub SendAlert
{
my $Service = shift;
MIME::Lite->send ("smtp", lc($cfg->val( 'Application', 'Mailserver' )));
my $msg = MIME::Lite->new
(
From => lc($cfg->val( 'Application', 'MailFrom' )),
To => lc($cfg->val( 'Server'.$Service, 'Kontakt' )),
Subject => "SMSInfo zu ".$cfg->val( 'Server'.$Service, 'Label' ),
Data => "SMSInfo : ".$cfg->val( 'Server'.$Service, 'StatusFail' )." ".&myTimer(3)."\n",
);
$msg->send ();
}
############################################################################
# Recovermail versenden
sub SendReturn
{
my $Service = shift;
MIME::Lite->send ("smtp", lc($cfg->val( 'Application', 'Mailserver' )));
my $msg = MIME::Lite->new
(
From => lc($cfg->val( 'Application', 'MailFrom' )),
To => lc($cfg->val( 'Server'.$Service, 'Kontakt' )),
Subject => "SMSInfo zu ".$cfg->val( 'Server'.$Service, 'Label' ),
Data => "SMSInfo : ".$cfg->val( 'Server'.$Service, 'StatusTrue' )." ".&myTimer(3)."\n",
);
$msg->send ();
}
############################################################################
# Teste den Webdienst
sub TesteDienst
{
my $uri = shift;
my $answer = shift;
my $Service = shift;
my $browser = LWP::UserAgent->new;
my @browser_headers = (
'User-Agent' => 'WebBot/1.2 (compatible; Watchdog-Service, $Version)',
'Accept' => 'text/plain, */*',
'Accept-Charset' => 'iso-8859-1,*,utf-8',
'Accept-Language' => 'de-DE',
);
my $response = $browser->get($uri, @browser_headers);
if ($response->content =~ /$answer/)
{
if($cfg->val( 'Application', 'DoMail' ) eq "true"){
if($cfg->val( 'Server'.$Service, 'Alive' ) eq "false"){&SendReturn($Service)};
};
if($cfg->val( 'Application', 'DoLog' ) eq "true"){&WriteLog($Service,"StatusTrue")};
return "StatusTrue"
}
else
{
if($cfg->val( 'Application', 'DoMail' ) eq "true"){
if($cfg->val( 'Server'.$Service, 'Alive' ) eq "true"){&SendAlert($Service)};
};
if($cfg->val( 'Application', 'DoLog' ) eq "true"){&WriteLog($Service,"StatusFail")};
return "StatusFail";
}
}
############################################################################
# Erstelle Zeitstempel für das Log
sub myTimer
{
my $Format = shift;
my ($sekunden, $minuten, $stunden, $monatstag, $monat, $jahr, $wochentag, $jahrestag, $sommerzeit) = localtime(time);
$jahr = $jahr + 1900;
$monat+=1;
$jahrestag+=1;
$monat = $monat < 10 ? $monat = "0".$monat : $monat;
$monatstag = $monatstag < 10 ? $monatstag = "0".$monatstag : $monatstag;
$stunden = $stunden < 10 ? $stunden = "0".$stunden : $stunden;
$minuten = $minuten < 10 ? $minuten = "0".$minuten : $minuten;
$sekunden = $sekunden < 10 ? $sekunden = "0".$sekunden : $sekunden;
if ($Format == 3){return "$monatstag.$monat.$jahr $stunden:$minuten:$sekunden";}
if ($Format == 2){return "$jahr$monat$monatstag";}
if ($Format == 1){return "$jahr.$monat.$monatstag $stunden:$minuten:$sekunden";}
if ($Format == 0){return "$jahr$monat$monatstag$stunden$minuten$sekunden";}
else {return "$monatstag.$monat.$jahr $stunden:$minuten:$sekunden";}
}
############################################################################
# Zeige Startinfo
sub ShowInfo
{
print "\n";
print " *** Running *************************************************************** \n";
print " * * \n";
print " * WatchDog v$Version * \n";
print " * * \n";
print " * ".&myTimer(3)." * \n";
print " * * \n";
print " *************************************************************************** \n";
print "\n";
}
sub MissingConfig
{
print "Missing Config-File, generate Template and open it ... !!\n";
open(FILE_CFG, ">>./WebWatch.ini") || die "can't open: $!";
print FILE_CFG <<"EOM" ;
[Application]
Titel=Watchdog
Admin=Max Mustermann
# Silent true/false -> Ausgabe auf Console
Silent=false
# DoMail true/false -> Benachrichtigung per Mail
DoMail=false
# smtp Gateway
Mailserver=mail.server.home
# Absender der Mail
MailFrom=watchdog\@mail.server.home
# DoLog true/false -> Logfile schreiben
DoLog=false
# LogFolder [Pfad] -> Pfad für Logfile
LogFolder=C:/Meine/Logs/
[Server]
# Anzahl der Serverabschnitte
Anzahl=1
[Server1]
Label=IIS Home
# zu Testende URL (HTTP, FTP, ...)
TesteURI=http://www.server.home/watchdog.php
# String den der zu testende Dienst zurück gibt
TesteAuf=is alive
# Antworttexte
StatusTrue=WWW- und Script-Service sind erreichbar.
StatusFail=WWW- und Script-Service nicht erreichbar !
# Mailempfänger wenn Versand aktiv
Kontakt=anwender\@mail.server.home
EOM
close (FILE_CFG);
system("notepad.exe ./WebWatch.ini");
exit;
}
|