#!/usr/bin/perl
# MailScanner - SMTP E-Mail Virus Scanner
# Copyright (C) 2001 Julian Field
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# The author, Julian Field, can be contacted by email at
# Jules@JulianField.net
# or by paper mail at
# Julian Field
# Dept of Electronics & Computer Science
# University of Southampton
# Southampton
# SO17 1BJ
# United Kingdom
#
#
# Vexira updater. Original code by Julian Field. Timeout code by
# Alessandro Bianchi. Timeout code is not perfect but should be okay.
#
use Sys::Syslog;
# If you have a web proxy or cache server, put its value in the next line
# in the syntax "full.host.name:port".
$HTTPproxy = "";
$PackageDir = shift || "/usr/local/vexira";
$Signatures = "vexira8.vdb";
$SignaturesNew = "vexira8.vdb.new";
$DownloadPath = "ftp://upd.vexira.com/pub/vexira/vdb.8/vexira8.vdb";
$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');
#
# Check we can find all the external programs we need
#
$result = system("wget --version < /dev/null > /dev/null 2>&1");
BailOut("Could not find wget on your path. Please install it or fix your path")
if $result==127;
#
# Download update information from the update server
#
$SIG{ALRM} = sub { die "timeout" };
eval {
# Timeout prevention
alarm 300;
$result = system("wget --output-document=$PackageDir/$SignaturesNew " .
"--tries=3 '$DownloadPath' > /dev/null 2>&1");
BailOut("wget command failed. You need the latest version installed, $!")
if $result==127;
BailOut("Updates download from $DownloadPath failed. " .
"Suspect server could not be reached, $!")
if $result!=0;
# Only do this if it succeeded within the timeout
&LockVexira;
unlink "$PackageDir/$Signatures";
rename "$PackageDir/$SignaturesNew", "$PackageDir/$Signatures";
&UnlockVexira;
alarm 0;
};
if ($@) {
if ($@ =~ /timeout/) {
# We timed out!
Sys::Syslog::syslog('err', "WARNING: Vexira update timed out");
alarm 0;
unlink "$PackageDir/$SignaturesNew";
} else {
Sys::Syslog::syslog('err', "Vexira update cannot be run");
}
} else {
Sys::Syslog::syslog('notice', "Vexira update completed");
}
Sys::Syslog::closelog();
exit 0;
sub BailOut {
Sys::Syslog::syslog('err', @_);
Sys::Syslog::closelog();
warn "@_, $!";
exit 1;
}
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;
}
syntax highlighted by Code2HTML, v. 0.9.1