Тук си запазвам едно скриптче, което проверява за статус на хост и при промяна праща sms, jabber или mail, с две думи ако хоста е DOWN и стане UP - ни праща - урааа - хоста се вдигна, ако в UP и падне - казва - оо нее хоста падна.
Ползва и един мой пакет за най-най-елементарното и грозно пращане на мейл. :) В cpan.org има много, много повече и много, много по-добри - този да не се ползва. Ползвайте например този - EasyMail.
#!/usr/bin/perl
use strict;
use SMTPSend;
my $status_dir = '/var/log/host_check/';
# hosts to be checked for up/down status
my @hosts = (
"192.168.3.9",
"pc-to-w-rabotata.org",
);
# mail server parameters
my %params = (
host => 'localhost',
to => '35988888888@sms.mtel.net',
subj => 'hosts',
from => 'me@home',
);
my $date = `date "+%Y.%m.%d %H:%M:%S"`; chomp($date);
HOST_CHECK: foreach (@hosts) {
my $ping = `ping $_ -c 3`;
unless ($ping =~ / 0 received/) {
print "$date : $_ is UP\n";
next HOST_CHECK if -e "$status_dir${_}_UP";
unlink("$status_dir${_}_DOWN") if -e "$status_dir${_}_DOWN";
$params{body} = "$_ is UP! YEY!";
send_mail(\%params);
print "$date --- $params{to} was notified\n";
`touch $status_dir${_}_UP`;
}
else {
print "$date : $_ is DOWN\n";
next HOST_CHECK if -e "$status_dir${_}_DOWN";
unlink("$status_dir${_}_UP") if -e "$status_dir${_}_UP";
$params{body} = "$_ is DOWN";
send_mail(\%params);
print "$date ---$params{to} was notified\n";
`touch $status_dir${_}_DOWN`;
}
}
а ето и пакета SMTPSend.pm който трябва да се сложи в /usr/lib/perl5/5.8.8/ или /usr/lib/perl5/current/
package SMTPSend;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(send_mail);
use Expect;
$Expect::Log_Stdout = 0;
sub send_mail {
$| = 1;
my $hash = shift;
my $host = $hash->{'host'}?$hash->{'host'}:'localhost';
my $port = $hash->{'port'}?$hash->{'port'}:'25';
my $from = $hash->{'from'}?$hash->{'from'}:'mailer@localhost';
my $to = $hash->{'to'} or die "You need to supply a receiver\n";
my $subj = $hash->{'subj'}?$hash->{'subj'}:'no subject';
my $body = $hash->{'body'}?$hash->{'body'}:'empty...';
my $command = "telnet $host $port";
my $exp = Expect->spawn($command) or die "ERROR $!\n";
$exp->send("HELO host\n");
$exp->send("MAIL FROM: $from\n");
$exp->send("RCPT TO: $to\n");
$exp->send("DATA\n");
$exp->send("Subject: $subj\n\n");
$exp->send("$body");
$exp->send("\n.\n");
$exp->send("QUIT\n");
$exp->soft_close() or die "$!";
return 665; # the neighbour of the beast :)
}
return 666;
А ако искаме да получаваме PM на jabber-а, добавяме следната процедурка:
sub jabber_alert() {
my $who = shift;
my $message = shift;
use Log::Dispatch;
use Log::Dispatch::Jabber;
my $dispatcher = Log::Dispatch->new();
my $jabber = Log::Dispatch::Jabber->new(
name => "jabber",
min_level => "debug",
login => {
hostname => "jabber.whatever",
port => 5222,
username => "user-a-deto-prashta-jabber-msg-tata",
password => "passworda",
resource => "logger",
},
to=>["$who"],
check_presence=>1,
force=>"$who",
buffer => "1",
);
$dispatcher->add($jabber);
$dispatcher->log(
level => "debug",
message => "$message",
);
}
ползва се така:
jabber_alert('me@jabber.cz', "Stana edi kakwo si!!" );


