/runcheckdir
#!/usr/bin/perl
use Getopt::Long;
use Cwd qw/abs_path/;
use POSIX qw/setsid setuid setgid/;
use strict;
my ($nodaemon, $verbose, $pidfile, $logfile, $user, $group, $uid, $gid);
$pidfile = '/var/run/runcheckdir.pid';
$logfile = '/var/log/runcheckdir.log';
GetOptions(
"nodaemon" => \$nodaemon,
"verbose" => \$verbose,
"pidfile=s" => \$pidfile,
"logfile=s" => \$logfile,
"user=s" => \$user,
"group=s" => \$group,
);
my $dir = abs_path(shift);
unless ($dir) {
print "No directory specified\n";
exit 1;
}
unless (-d $dir) {
print "$dir is not a directory\n";
exit 1;
}
$uid = (getpwnam($user))[2] if $user;
$gid = (getpwnam($group))[3] if $group;
sub daemonize {
if (fork()) {
exit 0;
}
setsid();
umask 027;
if (open STDOUT, ">>$logfile") {
open STDERR, ">>$logfile";
chown $uid, $gid, $logfile;
} else {
print "WARNING: Could not open logfile. You will get NO error output.\n";
open STDOUT, ">/dev/null";
open STDERR, ">/dev/null";
}
open STDIN, "/dev/null";
open PID, ">$pidfile" or warn "Could not write PID file\n";
print PID "$$\n";
close PID;
chown $uid, $gid, $pidfile;
chdir '/';
print "Daemon started at ",scalar gmtime(),"\n";
}
daemonize unless $nodaemon;
setuid($uid) if $uid;
setgid($uid) if $gid;
$|++;
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("runcheck $dir/$d");
my $exitstatus = $? >> 8;
if ($exitstatus) {
print "FAILURE\n";
} else {
print "OK\n";
}
sleep 10;
}
closedir(CHECKS);
}