/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);
}