#!/usr/bin/perl

#
# eTrust updater. Original code by Julian Field. Timeout code by
# Alessandro Bianchi. Timeout code is not perfect but should be okay.
#

use Sys::Syslog;

$PackageDir = shift || "/opt/eTrustAntivirus";

$LockFile = "/tmp/eTrustBusy.lock";

$LOCK_SH = 1;
$LOCK_EX = 2;
$LOCK_NB = 4;
$LOCK_UN = 8;

eval { Sys::Syslog::setlogsock('unix'); }; # This may fail!
Sys::Syslog::openlog("eTrust-autoupdate", 'pid, nowait', 'mail');

unless (chdir $PackageDir . '/ino/config') {
  Sys::Syslog::syslog('err', "eTrust installation dir \"$PackageDir\" does not exist!");
  Sys::Syslog::closelog();
  exit 1;
}

$ENV{'CAIGLBL0000'} = $PackageDir;
$ENV{'LD_LIBRARY_PATH'} = "$PackageDir/ino/config:$PackageDir/ino/lib";

$DA0time = (stat('virsig.da0'))[9]; # mtime

if (-x 'InoDist') {
  # Timeout prevention
  $SIG{ALRM} = sub { die "timeout"};

  &LockAV();
  eval {
    alarm 300;
    $Command = './InoDist -cfg InoDist.ini';
    system($Command)>>8;
    &UnlockAV();
    alarm 0;
  };

  if ($@) {
    if ($@ =~ /timeout/) {
      # We timed out!
      &UnlockAV();
      alarm 0;
    }
  } else {
    alarm 0;
    if ($DA0time != (stat('virsig.da0'))[9]) {
      Sys::Syslog::syslog('info', "eTrust updated");
    } else {
      Sys::Syslog::syslog('info', "eTrust did not need updating");
    }
  }
} else {
  Sys::Syslog::syslog('err', "eTrust updater $PackageDir/ino/config/InoDist cannot be run");
}

Sys::Syslog::closelog();
exit 0;

sub LockAV {
	open(LOCK, ">$LockFile") or return;
	flock(LOCK, $LOCK_EX);
	print LOCK "Locked for updating eTrust definitions by $$\n";
}

sub UnlockAV {
	print LOCK "Unlocked after updating eTrust definitions by $$\n";
	unlink $LockFile;
	flock(LOCK, $LOCK_UN);
	close LOCK;
}

