mirror of
https://github.com/webmin/webmin.git
synced 2026-02-10 01:02:19 +00:00
105 lines
3.1 KiB
Perl
Executable File
105 lines
3.1 KiB
Perl
Executable File
#!/usr/local/bin/perl
|
|
# monitor.pl
|
|
# Check all the monitors and send email if something is down
|
|
|
|
$no_acl_check++;
|
|
require './status-lib.pl';
|
|
|
|
# Check if the monitor should be run now
|
|
@tm = localtime(time());
|
|
@hours = split(/\s+/, $config{'sched_hours'});
|
|
!@hours || &indexof($tm[2], @hours) >= 0 || exit;
|
|
@days = split(/\s+/, $config{'sched_days'});
|
|
!@days || &indexof($tm[6], @days) >= 0 || exit;
|
|
|
|
# Check for services that are down
|
|
&read_file("$module_config_directory/oldstatus", \%oldstatus);
|
|
$now = localtime(time());
|
|
$host = &get_system_hostname();
|
|
foreach $serv (&list_services()) {
|
|
if ($serv->{'nosched'}) {
|
|
delete($oldstatus{$serv->{'id'}});
|
|
next;
|
|
}
|
|
$stat = &service_status($serv);
|
|
$o = $oldstatus{$serv->{'id'}};
|
|
if ($config{'sched_warn'} == 0 && $stat->{'up'} == 0 && $o) {
|
|
# Service has just gone down
|
|
$email .= "Monitor on $host for '$serv->{'desc'}'\n".
|
|
"has detected that the service is down at $now\n\n";
|
|
$subj = "$serv->{'desc'} down on $host";
|
|
$pager_msg .= "$host: '$serv->{'desc'}' is down $now! ";
|
|
if ($serv->{'ondown'}) {
|
|
system("($serv->{'ondown'}) >/dev/null 2>&1");
|
|
}
|
|
}
|
|
elsif ($config{'sched_warn'} == 1 && $stat->{'up'} != $o &&
|
|
(defined($o) || $stat->{'up'} == 0)) {
|
|
# Service has changed status
|
|
if ($stat->{'up'} == 0) {
|
|
$email .= "Monitor on $host for '$serv->{'desc'}'\n".
|
|
"has detected that the service is down at $now\n\n";
|
|
$subj = "$serv->{'desc'} down on $host";
|
|
$pager_msg .= "$host: '$serv->{'desc'}' is down $now! ";
|
|
if ($serv->{'ondown'}) {
|
|
system("($serv->{'ondown'}) >/dev/null 2>&1");
|
|
}
|
|
}
|
|
elsif ($stat->{'up'} == 1) {
|
|
$email .= "Monitor on $host for '$serv->{'desc'}'\n".
|
|
"has detected that the service is back up at $now\n\n";
|
|
$subj = "$serv->{'desc'} back up on $host";
|
|
$pager_msg .= "$host: '$serv->{'desc'}' is back up $now! ";
|
|
if ($serv->{'onup'}) {
|
|
system("($serv->{'onup'}) >/dev/null 2>&1");
|
|
}
|
|
}
|
|
}
|
|
$oldstatus{$serv->{'id'}} = $stat->{'up'};
|
|
if ($config{'sched_single'} && $email) {
|
|
# Force the sending of one email per report
|
|
&send_status_email($email, $subj);
|
|
undef($email);
|
|
}
|
|
}
|
|
&write_file("$module_config_directory/oldstatus", \%oldstatus);
|
|
|
|
# Send the email if necessary
|
|
if ($email) {
|
|
&send_status_email($email, 'Service monitor');
|
|
&send_status_pager($pager_msg);
|
|
}
|
|
|
|
# send_status_email(text, subject)
|
|
sub send_status_email
|
|
{
|
|
return if (!$config{'sched_email'});
|
|
local %sconfig = &foreign_config("sendmail");
|
|
if ($config{'sched_from'}) {
|
|
open(MAIL, "|$sconfig{'sendmail_path'} -t -f$config{'sched_from'} >/dev/null 2>&1");
|
|
print MAIL "From: $config{'sched_from'}\n";
|
|
}
|
|
else {
|
|
open(MAIL, "|$sconfig{'sendmail_path'} -t >/dev/null 2>&1");
|
|
print MAIL "From: webmin\n";
|
|
}
|
|
print MAIL "To: $config{'sched_email'}\n";
|
|
print MAIL "Subject: $_[1]\n";
|
|
print MAIL "\n";
|
|
print MAIL $_[0];
|
|
print MAIL "\n";
|
|
close(MAIL);
|
|
}
|
|
|
|
# send_status_pager(text)
|
|
sub send_status_pager
|
|
{
|
|
return if (!$config{'sched_pager'});
|
|
return if (!&has_command($config{'pager_cmd'}));
|
|
local $msg = $_[0];
|
|
$msg =~ s/\\/\\\\/g;
|
|
$msg =~ s/\'/\\\'/g;
|
|
system("$config{'pager_cmd'} $config{'sched_pager'} '$msg' >/dev/null 2>&1 </dev/null");
|
|
}
|
|
|