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