X-Git-Url: http://git.bytex64.net/?a=blobdiff_plain;f=runcheckdir;h=535fa6834c353ef6d53679ca8c9b2f33b98c1be9;hb=8d7475b3a36e68f80dc196a95fadc549c708f1cb;hp=d6589f2f5c8716a06c0c29636933bbd6911402ca;hpb=67d5ceff171336ae0a516c911b310f1d90e7062f;p=chksht.git diff --git a/runcheckdir b/runcheckdir index d6589f2..535fa68 100755 --- a/runcheckdir +++ b/runcheckdir @@ -1,118 +1,35 @@ #!/usr/bin/perl -use File::Basename; use strict; - my $dir = shift; -unless (-d $dir) { - print "Arg is not a directory"; +unless ($dir) { + print "No directory specified\n"; exit 1; } -my $me = basename $dir; -my ($status, $details); - -sub do_command { - my $command = shift; - $command =~ /^(\w+)(\s+(.*))?$/; - my ($do, $args) = ($1, $3); - if ($do eq 'mail') { - open MAIL, '|-', qq!mail -s "$me $status" $args! or die "Could not mail"; - print MAIL $details,"\n"; - close MAIL; - } elsif ($do eq 'exec') { - system($args); - } elsif ($do eq 'pipe') { - open PIPE, '|-', $args; - print PIPE "$status\n"; - print PIPE $details; - close PIPE; - } +unless (-d $dir) { + print "$dir is not a directory\n"; + exit 1; } +$|++; -my ($checkcommand, $every, %on); -$on{success} = []; -$on{failure} = []; -$on{change} = []; - -open CONFIG, "$dir/check"; -while () { - my @words = split(/\s+/); - my $command = shift @words; - if ($command eq 'check') { - $checkcommand = join(' ', @words); - } elsif ($command eq 'on') { - my $when = shift @words; - if ($when eq 'failure') { - push @{$on{failure}}, join(' ', @words); - } elsif ($when eq 'success') { - push @{$on{success}}, join(' ', @words); - } elsif ($when eq 'change') { - push @{$on{change}}, join(' ', @words); +while (1) { + opendir(CHECKS, $dir); + while (my $d = readdir(CHECKS)) { + next if (! -d "$dir/$d" || $d eq '.' || $d eq '..'); + unless (-f "$dir/$d/check") { + print "No check script in $dir/$d\n"; + next; + } + print "Running check $dir/$d: "; + system("runcheckdir $dir/$d"); + my $exitstatus = $? >> 8; + if ($exitstatus) { + print "FAILURE\n"; } else { - print "Unknown event in 'on', $dir/check line $.\n"; + print "OK\n"; } - } elsif ($command eq 'every') { - $every = $words[0]; - } else { - print "Unknown command '$command', $dir/check line $.\n"; + sleep 10; } + closedir(CHECKS); } -close CONFIG; - -unless ($checkcommand) { - print "Check command not specified in $dir/check\n"; - exit 1; -} -unless (@{$on{failure}} || @{$on{success}} || @{$on{change}}) { - print "No actions specified in $dir/check. This is probably a mistake.\n"; -} - -open STATUS, "$dir/checkstatus"; -chomp(my $oldstatus = ); -my $oldtime = (stat(STATUS))[9]; -close STATUS; - -my $td = time() - $oldtime; -if ($td < $every) { - # Not time to recheck yet - #print "Not rechecking; ", $every - $td, " seconds to go.\n"; - exit $oldstatus; -} - -my ($pid, $hung, $exitstatus); -$SIG{ALRM} = sub { - kill 9, $pid; - $hung = 1; -}; -alarm 10; - -$pid = open CHECK, '-|', $checkcommand; -$status = ; -$details = join('', ); -close CHECK; -if ($hung) { - $status = 'TIMEOUT'; - $details = 'Check did not complete within ten seconds'; - $exitstatus = -1; -} else { - $exitstatus = $? >> 8; -} - -if ($exitstatus == 0 && $oldstatus != 0) { - do_command($_) foreach @{$on{success}}; -} -if ($exitstatus != 0 && $oldstatus == 0) { - do_command($_) foreach @{$on{failure}}; -} -if ($exitstatus != $oldstatus) { - do_command($_) foreach @{$on{change}}; -} - -open STATUS, ">$dir/checkstatus"; -print STATUS "$exitstatus\n"; -print STATUS "$status\n"; -print STATUS "$details\n"; -close STATUS; - -exit $exitstatus;