Есть скрипт на Perl для обновления антивируса NOD32! Суть его состоит в том, что он скачивает с сервера файлик со списком апдейтов, выбирает из него все ссылки на файлы и выкачивает их. Но это очень долгий процесс!!! Выкачивать каждый день где-то по 200Мб :((
У меня возникла идея! Скрипт делит описания файлов на пары (name,value). Можно например найти среди значений name параметр version и взять его значение, потом выбрать наибольшее и сохранить в файл! А при следующем запуске открыть этот файл и качать только те файлы, у которых параметр version больше!!!Помогите плз. реализовать, я не очень чилен в Perl!!! Привожу ниже текст скрипта:
-----------------------------------
#!/usr/bin/perl
use LWP;
# path to store updates
$PATH="/lookj/htdocs/nod32_upd/";
# username/password for updates registered users
$LOGIN="AV-4435218";
$PASS="wj4vg62o4q";
# URL for updates
#$URL_UPD="http://u2.eset.com/nod_eval";
$URL_UPD="http://u3.eset.com/nod_upd/";
$URL_UPD =~ s/\/$//;
$URL_UPD =~ m/(.*:\/\/)(.*?)(\/.*)/;
$site = "$1$2";
if ($site =~ m//) {
print "Enter correct URL\n";
return;
}
unlink("$PATH/update.ver","$PATH/update.tmp");
download($PATH,"$URL_UPD/update.ver",$LOGIN,$PASS);
`/usr/local/bin/unrar e -y $PATH/update.ver $PATH 2> /dev/null`;
rename("$PATH/update.ver","$PATH/update.tmp");
$ver = "$PATH/update.tmp";
$vers = "$PATH/update.ver";
open(VER, "< $ver") or die "Couldn't open $ver for reading: $!\n";
open(VERS, "> $vers") or die "Couldn't open $vers for writing: $!\n";
%files = ();
%urls = ();
while (defined($line = <VER>) )
{
chomp $line;
$line =~ s/^\s+//;
$line =~ s/\s+$//;
($par,$val)=split /=/, $line;
if ($par =~ /file/ )
{
$name = $val;
$name =~ s/\/.*\///;
if ($name=~m/$val/) {$furl="$URL_UPD/$val";}
else {$furl="$site$val";}
$line="file=$name";
}
if ($par =~ /size/ )
{
$size = $val;
$files{$name} = $size;
$urls{$name} = "$furl";
}
print VERS "$line\r\n";
}
print "\n";
close(VER);
close(VERS);
foreach $f (keys %files) {
if ( (-s ("$PATH/$f")) != $files{$f}){
download($PATH,$urls{$f},$LOGIN,$PASS);
}
}
chmod(0644,"$PATH/*");
sub download()
{
my ($path, $url, $login, $pass) = @_;
# use external downloader
# system("/usr/local/bin/lftp -c \"get -cO $path $url\"");
# return;
# PERL downloader
$url =~ m/(.*:\/\/)(.*)\/(.*)/;
my $filename = $3;
my $ua=LWP::UserAgent->new();
$ua->agent("PerlUA/0.1");
my $ua=LWP::UserAgent->new();
$ua->agent("PerlUA/0.1");
my $req = HTTP::Request->new(HEAD => "$url");
$req->authorization_basic($login, $pass);
my $document=$ua->request($req);
if($document->is_success) {
if (!($document->content_length== -s("$path/$filename"))) {
my $req = HTTP::Request->new(GET => "$url");
$req->authorization_basic($login, $pass);
my $document=$ua->request($req);
if($document->is_success) {
open(OUT, "> $path/$filename");
print OUT $document->content;
close(OUT);
print "Downloading $url ";
print "- ok\n";
}
else {
print "$url ",$document->status_line,"\n";
}
}
else {
# print "$filename - exist\n";
}
}
else {
print "$url ",$document->status_line,"\n";
}
}
------------------------------------
А вот пример файлика update.ver - кусочек:
[HOSTS]
Japanese-ir=1@http://www.nod32.jp/irda/
English-ir=1@http://www.nod32.jp/irda/
Other=10@http://u1.eset.com/nod_upd/, 10@http://u2.eset.com/nod_upd/, 10@http://u3.eset.com/nod_upd/, 5@http://u4.eset.com/nod_upd/, 20@http://82.165.250.33/nod_upd/, 1@http://u7.eset.com/nod_upd/, 20@http://u20.eset.com/nod_upd/, 20@http://u21.eset.com/nod_upd/, 20@http://u22.eset.com/nod_upd/, 20@http://u23.eset.com/nod_upd/, 20@http://u24.eset.com/nod_upd/, 20@http://u25.eset.com/nod_upd/, 20@http://u26.eset.com/nod_upd/, 20@http://u27.eset.com/nod_upd/, 20@http://u28.eset.com/nod_upd/, 20@http://u29.eset.com/nod_upd/
Telefonica-Other=1@http://nod32.telefonica.com.ar:81/nod_upd/
[Expire]
ExpireList=expire.rar
[SETUP]
CompUpgradeProb=25
CompUpgradeMaxDelay=1128077999
[ENGINE0]
version=1860 (20061109)
build=8374
type=engine
level=0
base=268435456
date=09.11.2006
category=engine
buildregname=EngineBuild
file=engine0.nup
size=5339546
[ENGINE1]
version=1861 (20061110)
build=8377
type=engine
level=1
base=8374
date=10.11.2006
category=engine
buildregname=EngineBuild
file=engine1.nup
size=4162
[ENGINE2]
version=1863 (20061113)
build=8389
type=engine
level=2
base=8377
date=13.11.2006
category=engine
buildregname=EngineBuild
file=engine2.nup
size=19378
[ADVHEUR0]
version=1.033 (20060804)
build=1117
type=advheur
level=0
base=268435456
date=04.08.2006
category=engine
buildregname=AdvHeurBuild
file=advheur0.nup
size=399042
.....