FritzBox übernimmt Servermonitoring/Domain Überwachung

Es ist relativ einfach die Fritzbox dazu zu bringen, beliebige Domains auf ihre Funktion zu überwachen. Mir war es dazu wichtig, keine Änderungen oder Besonderheiten an den Domains einzustellen. Diese sollten so bleiben, wie sie sind. Gleichwohl wollte ich nicht nur den Web-Server überwachen, also nur eine Art Ping ausführen. Diese Überwachung sollte den Apache, PHP und MySQL möglichst einfach und effektiv überwachen. Und die FritzBox ist dazu ideal, da sie immer online ist und sich sowieso meist langweilt.

Was brauchen wir:

Ein alten USB Stick (dieser ist nötig, damit wir der FritzBox nicht den Speicher klauen müssen)

microperl (kann gleich auf den USB-Stick kopiert werden)

Zur Erläuterung:

In der Shell (dazu muss man mit Telnet auf die FritzBox rauf!) kann man mit:

wget http://www.mirco-brahmann.de/ eine Domain sozusagen abfragen. Das heißt es wird ähnlich wies es auch ein Brwoser tut der Inhalt der Site geholt. Hier in diesem Beispiel wird ein File: index.html erzeugt. Das geht übrigens nur in einem Verzeichnis, wo wir auch Schreibrechte haben, also z.B. /var (machen wir also zuvor ein cd /var).

wget -O – http://www.mirco-brahmann.de/ gibt direkt aus!

mit:  wget -O – http://www.mirco-brahmann.de/ |grep „<title>“ bekommt man nur die Titelzeile angezeigt. Also habe ich mir ein kleines Perl Skript gebastelt, welches die gewünschten Seiten zyklisch abprüft.

Da ein get mit microperl nicht zu laufen zu bekommen war, habe ich das oben beschriebene wget der Fritzbox verwendet.

#!/var/media/ftp/Intenso-Rainbow-11/microperl -I /var/media/ftp/Intenso-Rainbow-11/microperl/lib

#############################################
#——————————————————————————-
print „Content-type: text/html\n\n“;
#print „<html><h1>Hello!</h1></html>\n“;

#use Time::Local; ////das geht mit microperl leider nicht so einfach, also zumides hab ich das nicht geschafft.
#use LWP::Simple;

$ZYKLUSZEIT=120;      # Alle zwei Minuten. (120)

$Server{„rhs“}=      „http://www.1rhs-berlin.de“;                                          # 1. zu überwachende Domian
$pText{„rhs“}=       „1. RHS Berlin – 1. Rettungshundestaffel Berlin“;  # Suchtext für die 1. Domain …. na ja und so weiter…

$Server{„hsv“}=      „http://hsvmarienfelde.de“;
$pText{„hsv“}=       „HSV Marienfelde e. V. im DVG“;

$Server{„ivory“}=    „http://ivory-flat.de“;
$pText{„ivory“}=     „Ivory’s Seite“;

$Server{„idova“}= „http://www.mirco-brahmann.de“;
$pText{„idova“}=  „Mirco&#039;s Blog“;

while(1)

{
#——————————————————-
# Ermitteln des Datums und der Uhrzeit für ein Zyklus
#
($sec,$min,$hours,$day,$month,$year)=localtime(time);
$year=$year+1900; $month=$month+1;

if ($min   < 10) { $min   = „0$min“; }
if ($hours < 10) { $hours = „0$hours“; }
if ($month < 10) { $month = „0$month“; }
if ($day   < 10) { $day   = „0$day“; }
#——————————————————-

foreach $ourl (keys %Server)
{
print“$day.$month.$year-$hours:$min:$sec „;
print „$ourl $Server{$ourl} „;
#$tmpget= get($Server{$ourl});
$tmpget= `wget -O – $Server{$ourl}`;

if($tmpget=~/$pText{$ourl}/)
{
print „Site Ok!\n“;
#hier kann der Status geschrieben werden…
}
else
{
print „Fehler!\n“;
$err= system(„/sbin/mailer -s Server:_$ourl -f userIhr\@gmx.de -t userIhr\@gmx.de -m mail.gmx.de -a userIhr\@gmx.de -w *****“);
print „Mail gesendet! $err\n“;
#print „$tmpget \n“;
#hier kann der Fehler Status geschrieben werden…
}

}# FOREACH

foreach (1..8)# Hier werden die 120 Sek. Wartezeit /8 geteilt,
{   # für Aktionen die doch öffter ausgeführt werden sollen.

sleep $ZYKLUSZEIT/8;

}# FOREACH 1..4
}# WHILE

Gestartet wird dann so (damit das Programm auch gleich im Hintergrund läuft ein & am Ende)

/var/media/ftp/Intenso-Rainbow-11/microperl/microperl   /var/media/ftp/Intenso-Rainbow-11/microperl/serverwache.pl &

Weitere Hinweise:

http://www.ip-phone-forum.de/showthread.php?t=114888

Es gibt auch: http://www.foo.be/docs/tpj/issues/vol5_3/tpj0503-0003.html, war mir aber zu aufwendig!
Usage: ./microperl [switches] [--] [programfile] [arguments]
-0[octal]       specify record separator (\0, if no argument)
-a              autosplit mode with -n or -p (splits $_ into @F)
-C[number/list]enables the listed Unicode features
-c              check syntax only (runs BEGIN and CHECK blocks)
-d[:debugger]   run program under debugger
-D[number/list]set debugging flags (argument is a bit mask or alphabets)
-e program      one line of program (several -e's allowed, omit programfile)
-f              don't do $sitelib/sitecustomize.pl at startup
-F/pattern/     split() pattern for -a switch (//'s are optional)
-i[extension]   edit <> files in place (makes backup if extension supplied)
-Idirectory     specify @INC/#include directory (several -I's allowed)
-l[octal]       enable line ending processing, specifies line terminator
-[mM][-]module  execute "use/no module..." before executing program
-n              assume "while (<>) { ... }" loop around program
-p              assume loop like -n but print line also, like sed
-P              run program through C preprocessor before compilation
-s              enable rudimentary parsing for switches after programfile
-S              look for programfile using PATH environment variable
-t              enable tainting warnings
-T              enable tainting checks
-u              dump core after parsing program
-U              allow unsafe operations
-v              print version, subversion (includes VERY IMPORTANT perl info)
-V[:variable]   print configuration summary (or a single Config.pm variable)
-w              enable many useful warnings (RECOMMENDED)
-W              enable all warnings
-x[directory]   strip off text before #!perl line and perhaps cd to directory
-X              disable all warnings

Mailen mit der Fritzbox

FritzBox per FTP ansprechen mit Telnet auf die Ftitzbox rauf unf ‚ftpd -D‘ starten.

In der etc/passwd den Path für ftpUser ändern, sonst kommt immer die Meldung: kann in Verz. nicht wechseln.

/var/media/ftp/Intenso-Rainbow-11/microperl

 

 

Windows Dienst mit Perl

fiber opticWin32::Daemon;
Win32::Daemon::StartService();

while (SERVICE_START_PENDING != Win32::Daemon::State()) {
sleep(1); }

Win32::Daemon::State(SERVICE_RUNNING);

while (1) {
open FOUT, „>>c:\\win32testserv.log“;
print FOUT localtime() . „\n“;
close FOUT;
sleep 3;
if (Win32::Daemon::State() == SERVICE_STOP_PENDING) {
open FOUT, „>>c:\\win32testserv.log“;
print FOUT „Jetzt ist aber Schluss\n“;
close FOUT;
exit 0;
} }

Win32::Daemon::StopService();
Win32::Daemon::State(SERVICE_STOPPED);

#Nennen wir das obenstehende Skript ‚test.pl‘ und sagen wir, das Skript läge unter ‚c:\scripts‘.
#Wir können nun diese Datei mit dem folgenden Befehl als Dienst registrieren:
#
#perl win32serv.pl install Test c:\\scripts\\test.pl
#
#Der nun installierte Dienst kann mit ’net start Test‘ gestartet
#werden und bewirkt, dass alle drei Sekunden das aktuelle Datum in einer Log-Datei festgehalten wird.

Perl startet Programm mit Timeoute

>rent a car bulgariaEnglish;
@Ruck= SystemCmd(”e: && cd\\.. && Test.bat”);
print @Ruck;
sub SystemCmd
{
eval {
local $SIG{ALRM} = sub { die “Alarm” };
alarm(10);
system($_[0].”>\\SystemCmd.dat”);
open FILE,”<\\SystemCmd.dat” or print “File fehler\n”;
@dat=<FILE>;
close FILE;
alarm(0);
};
if ($EVAL_ERROR=~ /Alarm/)  { return (”Timeout bei $_[0], Error, ERROR, Timeout Fehler!!”);  }
else                        { return (@dat);                                  }
}#SystemCmd