18-01-05 15:26
Skripta za nadzor servisa
piše ŽELJA BOROŠ
Nadzor rada informatičkih sustava oduvijek je bio problem, uglavnom zbog različitih potreba tvrtke u kojoj se sustav treba nadzirati.
Danas se najviše koriste gotovi proizvodi, kompleksni i prilagodljivi sustavi nadzora, poput poznatih programa iz svijeta open sourcea, mona i nagiosa.
No, ako se dosad nise 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 ako ste s njima zadovoljni, mogu se koristiti i trajno.
Ova skripta napisana u perlu izuzetno je jednostavna i prilagodljiva. Objašnjavamo kako je konfigurirati i rabiti na unixu.
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 šalje mail svakih $PERIOD minuta u slučaju da neki servis ne radi i služi za uporabu iz crona. Drugi šalje mail 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.
Upisano u cronu može biti otprilike poput ovog:
*/5 * * * * /some/bin/check_services --mail > /dev/null 2>&1
Akone radite pod linuxom, možete pokušati ovako:
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 ovlastima, čak se to ne preporuča jer skripta ne pruža zaštitu od pokušaja zloupotreba.
Skripta se konfigurira samo s nekoliko parmetara.
$MAILTO = "nickname\@provider.hr";
$MAILTO parametar služi za definiranje email adrese na koju će se obavijesti slati. Po zamisli, to je alias koji preusmjerava mail na SMS gateway. Oba mobilna operatora podržavaju tu 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 razdoblje, u minutama, u kojemu skripta 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 se mogu napisati 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 stazu 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 trenutačnom 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 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 = "nickname\@provider.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;
|