#!/usr/bin/perl use Sys::Syslog; $Nod32Root = shift || "/usr/local/nod32"; $Nod32Auth = "nod32.auth"; $LockFile = "/tmp/Nod32Busy.lock"; $LOCK_SH = 1; $LOCK_EX = 2; $LOCK_NB = 4; $LOCK_UN = 8; Sys::Syslog::openlog("Nod32-autoupdate", 'pid, nowait', 'mail'); # Check the auth file exists and has a username/password in it if ($Nod32Root eq '/usr/sbin' && -f "/etc/nod32/$Nod32Auth") { $Nod32Auth = undef; $Update = "$Nod32Root/nod32_update"; } else { $Nod32Auth = "$Nod32Root/$Nod32Auth"; $Update = "$Nod32Root/update"; } if ($Nod32Auth) { open(AUTH, $Nod32Auth) or &BailOut("Authentication file $Nod32Auth does not exist"); $password = ""; $username = ""; while() { chomp; ($key, $value) = split(/\s*=\s*/, $_, 2); $password = $value if $key eq "password"; $username = $value if $key eq "username"; } close(AUTH); &BailOut("Authentication file $Nod32Auth does not contain Nod32 username" . " and password") if $password eq "" || $username eq ""; } # Do the actual update &Lock(); mkdir "$Nod32Root/mirror", 0755 if $Nod32Auth; $result = system($Update) >>8; &Unlock(); Sys::Syslog::syslog('info', $result==1?"Nod32 already up to date":"Nod32 updated"); Sys::Syslog::closelog(); exit 0; sub BailOut { Sys::Syslog::syslog('err', @_); Sys::Syslog::closelog(); warn "@_, $!"; exit 1; } sub Lock { open(LOCK, ">$LockFile") or return; flock(LOCK, $LOCK_EX); print LOCK "Locked for updating virus definitions by $$\n"; } sub Unlock { print LOCK "Unlocked after updating virus definitions by $$\n"; unlink $LockFile; flock(LOCK, $LOCK_UN); close LOCK; }