#!/usr/bin/perl use Sys::Syslog; $PackageDir = shift || "/usr/bin"; $UpdateCommand = "$PackageDir/niu"; $LockFile = "/tmp/NormanBusy.lock"; $LOCK_SH = 1; $LOCK_EX = 2; $LOCK_NB = 4; $LOCK_UN = 8; eval { Sys::Syslog::setlogsock('unix'); }; # This may fail! Sys::Syslog::openlog("Norman-autoupdate", 'pid, nowait', 'mail'); if (-x $UpdateCommand) { # Timeout prevention $SIG{ALRM} = sub { die "timeout"}; &LockNorman(); eval { alarm 300; $retval=system($UpdateCommand . ' -y -G')>>8; Sys::Syslog::syslog('err', "$!") unless $! =~ /ioctl for device/i; &UnlockNorman(); alarm 0; }; if ($@) { if ($@ =~ /timeout/) { # We timed out! &UnlockNorman(); alarm 0; } } else { alarm 0; if ($retval == 2 ) { Sys::Syslog::syslog('info', "Norman updated"); } elsif ($retval == 0 ) { Sys::Syslog::syslog('info', "Norman did not need updating"); } else { Sys::Syslog::syslog('err', "Norman updater failed"); } } } else { Sys::Syslog::syslog('err', "Norman updater $UpdateCommand cannot be run"); } Sys::Syslog::closelog(); exit 0; sub LockNorman { open(LOCK, ">$LockFile") or return; flock(LOCK, $LOCK_EX); print LOCK "Locked for updating Norman definitions by $$\n"; } sub UnlockNorman { print LOCK "Unlocked after updating Norman definitions by $$\n"; unlink $LockFile; flock(LOCK, $LOCK_UN); close LOCK; }