14-12-04 02:17
Skripta check_services
piše ŽELJKO BOROŠ
Nadzor rada informatičkih sustava oduvijek je bio problem, uglavnom zbog različitih potreba tvrtke gdje se sustav treba nadzirati. Danas se uglavnom rabe gotovi proizvodi, kompleksni i prilagodljivi sustavi nadzora, poput poznatog 'mona'. No, za slučaj da se niste dosad susreli s monom, ili jednostavno ne želite instalirati i podešavati cijeli sustav, možete posegnuti za dobrim starim skriptama koje će brzo riješiti problem, a možda ostati i trajno.
Ova skripta pisana u perlu je izuzetno jednostavna i prilagodljiva. Objasnit ćemo kako je konfigurirati i rabiti na Unix sustavima. Skripta obično radi iz crona i pokreće se svakih nekoliko minuta kako bi pružila što ažurniju sliku stanja mrežnih servisa. Prima dva parametra, --mail i --forcemail. Prvi parametar uključuje slanje maila svakih $PERIOD minuta u slučaju da neki servis ne radi i služi za uporabu iz crona. Drugi uključuje slanje maila svaki put kad se skripta pokrene i služi isključivo za testiranje i podešavanje. Za uporabu iz naredbenog retka nije potrebno navoditi nikakve opcije.
Unos u cronu može biti nešto poput ovog:
*/5 * * * * /some/bin/check_services --mail > /dev/null 2>&1
Ukoliko niste na linuxu, možete probati sa:
0,10,20,30,40,50 * * * * /some/bin/check_services --mail > /dev/null 2>&1
U prvom slučaju skripta se pokreće svakih 5 minuta, a u drugom svakih 10 minuta. Skripta ne mora raditi pod root korisničkim računom, te se taj način ni ne preporuča jer skripta ne pruža nikakvu posebnu zaštitu od pokušaja zloporaba. Skripta se konfigurira samo s nekoliko parmetara.
$MAILTO = "nick\@vip.hr";
$MAILTO parametar služi za definiranje email adrese gdje će obavijesti biti slane. Ideja je naravno da se radi o aliasu koji preusmjerava mail na SMS gateway. Oba mobilna operatora podržavaju ovu mogućnost. Obratite pažnju na obvezni backslash u email adresi.
$HOST = "neki.server.hr";
$HOST definira poslužitelj gdje se servisi nalaze.
$PERIOD = 120;
$PERIOD je naravno period u minutama u kojem skripta ne ponavlja slanje
obavijesti za pojedini servis.
$services = '21 22 25 53 80 110 111 113 139 143 389 587 3306';
$services = 'ftp ssh smtp domain http pop3 auth 139 imap2 ldap submission';
Varijabla $services sadržava sve servise koje želite nadzirati. Oni mogu biti napisani numerički ili simbolički.
$nc = "/bin/nc";
$nc = "/usr/local/bin/nc";
Za pregled otvorenih portova rabimo popularni alat netcat (nc), pa ovdje možemo podesiti putanju do njega ako se iz sigurnosnih razloga ne želite pouzdati u PATH. No, skripta se ne vrti pod root korisničkom oznakom, pa velika zaštita skripte ili environmenta nije nužna.
$timestamp = "$ENV{HOME}/.check_services";
$timestamp određuje gdje će se snimati podaci o trenutnom stanju servisa. Default je $HOME korisnika pod kojim se skripta pokreće. Možete ovo i
promijeniti, samo treba pripaziti da nitko drugi ne može pisati u tu datoteke zbog eventualnog race conditiona.
$mail = "/usr/bin/mailx";
I na kraju, varijabla $mail označava mail klijenta kojeg želite rabiti za slanje maila, i ako ga želite promijeniti pripazite na ispravnu sintaksu
u programskoj petlji na mjestu u skripti gdje se šalje mail. Ugodna uporaba skripte check_services!
#!/usr/bin/perl
# Zeljko Boros <zelja@ravnica.ptfos.hr> Mon, 29 Nov 2004 14:45:52 +0100
# Skripta za provjeru odabranih servisa putem nc alata
if ($ARGV[0] eq "--mail") { $mail = 1; } else { $mail = 0; }
if ($ARGV[0] eq "--forcemail") { $forcemail = 1; } else { $forcemail = 0; }
$MAILTO = "nick\@vip.hr";
$HOST = "neki.server.hr";
# period u minutama u kojem ne ponavlja slanje obavijesti za pojedini servis
$PERIOD = 120;
#$services = '21 22 25 53 80 110 111 113 139 143 389 587 3306';
$services = 'ftp ssh smtp domain http pop3 auth 139 imap2 ldap submission';
$nc = "nc";
$timestamp = "$ENV{HOME}/.check_services";
$mail = "/usr/bin/mailx";
### END USER CONFIGURATION AREA ####
### INITIALIZATION ###
$update = 1;
@output = ();
### SCRIPT START ###
foreach $service (split(/ /,$services)) {
$pid = `$nc -z -w 5 -v $HOST $service`;
push(@output, $service) if ($?/256);
}
if (stat ($timestamp) == FALSE) { system ("touch $timestamp"); }
if ((@output != 0)) {
$time_old = (stat ($timestamp))[9];
$time_curr = time();
$age = ($time_curr - $time_old)/60;
$stamp = `cat $timestamp`;
foreach $value (@output) {
if ($value eq $stamp) {
$update = 0;
}
}
if ($update) {
open(STAMP, "+>$timestamp");
print STAMP @output;
close STAMP;
}
$forcemail = 1 if ($age == 0 && $mail == 1);
if (($mail && ($age > $PERIOD)) || $forcemail) {
chop($date=`date`);
open(MAIL,"|$mail -s 'SERVICE CHECKER: Some services down' $MAILTO");
print MAIL "\nThe following services are down as of: $date\n\n";
print MAIL @output;
close MAIL;
system ("touch $timestamp");
}
} else {
system("rm $timestamp; touch $timestamp");
}
exit 0;
|