#!/usr/bin/perl -w
# script to update rav automatically
# based on sophos update script by jkf
use strict;
use Sys::Syslog;
my($PackageDir, $retval);
$PackageDir = shift || "/usr/local/rav8";
my($TimeOut) = 5*60; # 5 minutes
my($LockFile) = '/tmp/RavBusy.lock';
my($ravcommand) = "$PackageDir/bin/ravlin8";
my($ravupdate) = "$ravcommand --update=engine";
my($LOCK_SH) = 1;
my($LOCK_EX) = 2;
my($LOCK_NB) = 4;
my($LOCK_UN) = 8;
local(*LOCK);
# Stop syslogd from needing external access (or -r)
eval { Sys::Syslog::setlogsock('unix'); }; # This may fail!
Sys::Syslog::openlog("RAV-autoupdate", 'pid, nowait', 'mail');
Sys::Syslog::syslog('err', "Installation dir \"$PackageDir\" does not exist!")
unless -e $PackageDir;
# Fix all the RAV permissions
system("chmod a+r /dev/console; cd $PackageDir; chmod -R go+rX . ; chmod a+rx rave bin pixmaps rc");
if (-x $ravcommand) {
# Timeout prevention
$SIG{ALRM} = sub { die "timeout"};
&LockRav();
eval {
alarm $TimeOut;
$retval=system($ravupdate)>>8;
&UnlockRav();
alarm 0;
};
if ($@) {
if ($@ =~ /timeout/) {
# We timed out!
alarm 0;
Sys::Syslog::syslog('err', "RAV updater timed out!");
}
} else {
alarm 0;
Sys::Syslog::syslog('info', "RAV updater completed");
#if ($retval == 0 ) {
# Sys::Syslog::syslog('info', "ClamAV updated");
#} elsif ($retval == 1 ) {
# Sys::Syslog::syslog('info', "ClamAV did not need updating");
#} else {
#if ($retval!=0 &&
# Sys::Syslog::syslog('err', "ClamAV updater failed");
#}
}
} else {
Sys::Syslog::syslog('err', "RAV updater $ravcommand cannot be run");
}
&UnlockRav();
Sys::Syslog::closelog();
exit 0;
sub LockRav {
open(LOCK, ">$LockFile") or return;
flock(LOCK, $LOCK_EX);
print LOCK "Locked for updating Rav Antivirus engine files by $$\n";
}
sub UnlockRav {
print LOCK "Unlocked after updating Rav Antivirus engine files by $$\n";
unlink $LockFile;
flock(LOCK, $LOCK_UN);
close LOCK;
}
syntax highlighted by Code2HTML, v. 0.9.1