#!/usr/bin/perl use File::Basename; use strict; my $dir = shift; unless (-d $dir) { print "Arg is not a directory"; 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; } } my ($checkcommand, %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); } else { print "Unknown event in 'on', $dir/check line $.\n"; } } else { print "Unknown command '$command', $dir/check line $.\n"; } } 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 = ); close STATUS; open CHECK, '-|', $checkcommand; $status = ; $details = join('', ); close CHECK; my $exitstatus = $? >> 8; if ($exitstatus == 0) { foreach my $command (@{$on{success}}) { do_command $command; } } else { foreach my $command (@{$on{failure}}) { do_command $command; } } if ($exitstatus != $oldstatus) { foreach my $command(@{$on{change}}) { do_command $command; } } open STATUS, ">$dir/checkstatus"; print STATUS "$exitstatus\n"; print STATUS "$status\n"; print STATUS "$details\n"; close STATUS;