#!/usr/bin/perl # $Id: update-virus-def.pl,v 1.2 2003/02/11 17:38:06 breu Exp $ use Getopt::Std; use IO::Scalar; use IO::File; use Archive::Zip; getopt(':d'); $def_location="/etc/iscan"; $smtp_host="mailserver.domain.com"; $email_to="user\@domain.com"; $email_from_name="User Name"; $email_from_address="Virus_Updater\@domain.com"; $verbose=(); if (defined $opt_d) { print "<-** running in debug mode **->\n"; $verbose=1; } $new_opr=(); $version_major=(); $version_minor=(); $new_version_major=(); $new_version_minor=(); $tarfile=(); $new_tarfile=(); $force=(); sub get_local_ver { open(f,"$def_location/opr.ini"); my $retrun_version=(); while () { chomp; if (/PatternVersion/) { ($blank,$v1)=split(/=/,$_); ($version_major,$version_minor)=split(/ /,$v1); $return_version=$version_major; print "current version = $return_version\n" if (defined $verbose); } } close(f); return $return_version; } sub check_local_file { my ($major)=@_; $ret=(); if (-f "$def_location/lpt\$vpn.$major") { $ret=1; } else { $ret=(); } return $ret; } sub check_remote_ver { use LWP::UserAgent; $ua=LWP::UserAgent->new; $ua->agent("cfu/0.1 "); my $req = HTTP::Request->new(GET => 'ftp://pattern.download.antivirus.com/products/pattern/opr.ini'); print "running request\n" if (defined $verbose); my $res = $ua->request($req); if ($res->is_success) { $content=sprintf("%s",$res->content); $new_opr=$content; $content=~ m/PatternVersion=([0-9]*)/; return $1; } else { print "bad luck this time\n"; return; } } sub mktmp(;$) { $tmpdir = $ENV{TMP}; if (!defined($tmpdir) or (!-d $tmpdir) or (!-w $tmpdir)) { $tmpdir = "/tmp"; } $tmp = (shift or "$tmpdir/mktmp"); $n=1; while(!sysopen(MKTMP_NOTUSED,$file="$tmp-$n-$$", (O_CREAT|O_EXCL|O_WRONLY),0600)) { $n++; if ($n > 500) { return undef; } } close MKTMP_NOTUSED; return $file; } sub send_email { my ($old,$new)=@_; use Net::SMTP; my $smtp=Net::SMTP->new($smtp_host); $smtp->mail($ENV{USER}); $smtp->to($email_to); $smtp->data(); $smtp->datasend("From: \"$email_from_name\" <$email_from_address>\n"); $smtp->datasend("To: <$email_to>\n"); $hostname=`/bin/hostname`; $smtp->datasend("Subject: V-DEF UPDATE ($old -> $new) on $hostname\n"); $smtp->datasend("\n\n"); $whatsnew=(); open(new,"$def_location/WHATSNEW.TXT"); while () { $whatsnew.=$_; }; close(new); $smtp->datasend("$whatsnew"); $smtp->dataend(); $smtp->quit; } sub download_new_def { # downloads new def file from trend and returns the filename. my ($major)=@_; $url="ftp://pattern.download.antivirus.com/products/pattern/lpt".$major.".zip"; print "url=$url\n" if (defined $verbose); use LWP::UserAgent; $ua=LWP::UserAgent->new; $ua->agent("cfu/0.1 "); my $req = HTTP::Request->new(GET => $url); my $res = $ua->request($req); if ($res->is_success) { return $res->content; } else { print "error\n"; return; } } sub cleanup { ($local_ver)=@_; opendir(dir,$def_location); @files=grep {!(/^\./) && (/lpt/) && !(-d "$dir/$_")} readdir(dir); foreach $file (@files) { ($j,$major)=split(/\./,$file); if ($local_ver > $major) { print "unlinking file=$j - $major ($file)\n" if (defined $verbose); $unlink_file=$def_location."/".$file; unlink($unlink_file); } } closedir(dir); } $local_ver=get_local_ver(); print "local_version is $local_ver\n" if (defined $verbose); if (check_local_file($local_ver)) { print "local file exists.\n" if (defined $verbose); } else { print "local file is not present!\n" if (defined $verbose); $force=1; } $remote_ver=check_remote_ver(); if (($remote_ver != $local_ver) || (defined $force)) { cleanup($local_ver); ($def)=download_new_def($remote_ver); my $SH = IO::Scalar->new(\$def); my $zip = Archive::Zip->new(); $zip->readFromFileHandle($SH); my $whatsnew=(); my $new_def=(); my $SH1 = IO::Scalar->new(\$whatsnew); my $SH2 = IO::Scalar->new(\$new_def); foreach my $member ($zip->members()) { $name=$member->fileName(); print "member=$name\n" if (defined $verbose); chdir($def_location); $zip->extractMember($name); } open (OPR,">$def_location/opr.ini"); printf OPR $new_opr; close(OPR); `/etc/rc.d/init.d/trophied stop`; `/etc/rc.d/init.d/trophied start`; send_email($local_ver,$remote_ver); } else { print "local version is up to date\n" if (defined $verbose); }