#!/usr/bin/perl

#
# Vexira updater.
#

use Sys::Syslog;

$PackageDir = shift || "/usr/lib/Vexira";

$Bin = "$PackageDir/vexira";

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

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

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

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

  &LockVexira();
  eval {
    alarm 300;
    $Command = "$Bin --update -q";
    $retval=system($Command)>>8;
    &UnlockVexira();
    alarm 0;
  };

  if ($@) {
    if ($@ =~ /timeout/) {
      # We timed out!
      &UnlockVexira();
      Sys::Syslog::syslog('err', "WARNING Vexira update timed out");
      alarm 0;
    }
  } else {
    alarm 0;
    if ($retval == 0 ) {
      Sys::Syslog::syslog('info', "Vexira did not need updating");
    } elsif ($retval == 1 ) {
      Sys::Syslog::syslog('info', "Vexira updated");
    } else {
      Sys::Syslog::syslog('err', "Vexira updater failed");
    }
  }
} else {
  Sys::Syslog::syslog('err', "Vexira updater $Bin cannot be run");
}

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

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

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

