Files
bpfire/config/updxlrator/download
Michael Tremer a19f33961c update accelerator: Don't change owner of ALL files in cache.
When a file has been downloaded, all files in the update accelerator
cache directory have been chowned which causes huge IO load.
It is only required to set permissions that members of the group
can delete the files (purge function on the web user interface).

Changing the owner is completely unnecessary as only the squid
user needs write access and the web server is able to deliver
any file in the update cache anyways.
2013-01-26 19:31:58 +01:00

215 lines
6.1 KiB
Perl

#!/usr/bin/perl
#
# This code is distributed under the terms of the GPL
#
# (c) 2006-2008 marco.s - http://update-accelerator.advproxy.net
#
# Portions (c) 2008 by dotzball - http://www.blockouttraffic.de
#
# $Id: download,v 2.1 2008/07/23 00:00:00 marco.s Exp $
#
use strict;
use HTTP::Date;
require '/var/ipfire/updatexlrator/updxlrator-lib.pl';
my $logfile="/var/log/updatexlrator/download.log";
my $logging=0;
my $repository='/var/updatecache';
my $login='';
my $dlrate='';
my $uuid='';
my %xlratorsettings=();
my %proxysettings=();
my @http_header=();
my $remote_size=0;
my $remote_mtime=0;
my $updatefile='';
my $unique=0;
my $mirror=1;
my %dlinfo=();
my $wgetContinueFlag="";
my $vendorid = $ARGV[0]; if (!defined($vendorid) || $vendorid eq '') { exit; }
my $sourceurl = $ARGV[1]; if (!defined($sourceurl) || $sourceurl eq '') { exit; }
my $cfmirror = $ARGV[2]; if (!defined($cfmirror) || $cfmirror eq '') { exit; }
my $restartdl = defined($ARGV[3]) ? $ARGV[3] : 0;
umask(0002);
$sourceurl =~ s@\%2b@+@ig;
$sourceurl =~ s@\%2f@/@ig;
$sourceurl =~ s@\%7e@~@ig;
$updatefile = substr($sourceurl,rindex($sourceurl,"/")+1);
$updatefile =~ s@\%20@ @ig;
$vendorid =~ tr/A-Z/a-z/;
unless (-d "$repository/download/$vendorid")
{
system("mkdir -p $repository/download/$vendorid");
chmod 0775, "$repository/download/$vendorid";
}
if($restartdl == 0)
{
# this is a new download
exit if (-e "$repository/download/$vendorid/$updatefile");
# dotzball: Why is this necessary?
system("touch $repository/download/$vendorid/$updatefile");
$wgetContinueFlag = "-nc";
}
else
{
# this is a restart of a previous (unfinished) download
# -> continue download
$wgetContinueFlag = "-c";
&writelog("Continue download: $updatefile");
}
if ($cfmirror)
{
$uuid = `echo $updatefile | md5sum`;
} else {
$uuid = `echo $sourceurl | md5sum`;
}
$uuid =~ s/[^0-9a-f]//g;
$uuid =~ s/([a-f\d]{8})([a-f\d]{4})([a-f\d]{4})([a-f\d]{4})([a-f\d]{12})/$1-$2-$3-$4-$5/;
if (-e "$UPDXLT::swroot/updatexlrator/settings")
{
&UPDXLT::readhash("$UPDXLT::swroot/updatexlrator/settings", \%xlratorsettings);
if ($xlratorsettings{'MAX_DOWNLOAD_RATE'} ne '') { $dlrate = "--limit-rate=" . int($xlratorsettings{'MAX_DOWNLOAD_RATE'} / 8) . "k" };
}
if (-e "$UPDXLT::swroot/proxy/settings") { &UPDXLT::readhash("$UPDXLT::swroot/proxy/settings", \%proxysettings); }
if (-e "$UPDXLT::swroot/proxy/advanced/settings")
{
%proxysettings=();
&UPDXLT::readhash("$UPDXLT::swroot/proxy/advanced/settings", \%proxysettings);
}
if (($proxysettings{'UPSTREAM_PROXY'}) && ($proxysettings{'UPSTREAM_USER'}))
{
$login = "--proxy-user=\"$proxysettings{'UPSTREAM_USER'}\"";
if ($proxysettings{'UPSTREAM_PASSWORD'})
{
$login .= " --proxy-password=\"$proxysettings{'UPSTREAM_PASSWORD'}\"";
}
}
if ($xlratorsettings{'MAX_DOWNLOAD_RATE'} eq '')
{
&writelog("Retrieving file for local cache: $updatefile");
} else {
&writelog("Retrieving file for local cache at max. " . $xlratorsettings{'MAX_DOWNLOAD_RATE'} . " kBit/s: $updatefile");
}
$ENV{'http_proxy'} = $proxysettings{'UPSTREAM_PROXY'};
@http_header = `$UPDXLT::wget $login --user-agent="$UPDXLT::useragent" --spider -S $sourceurl 2>&1`;
$ENV{'http_proxy'} = '';
foreach (@http_header)
{
chomp;
if (/^\s*Content-Length:\s/) { s/[^0-9]//g; $remote_size=$_; &writelog("Remote file size: $_ bytes"); }
if (/^\s*Last-Modified:\s/)
{
s/^\s*Last-Modified:\s//;
$remote_mtime = HTTP::Date::str2time($_);
&writelog("Remote file date: $_");
}
}
$ENV{'http_proxy'} = $proxysettings{'UPSTREAM_PROXY'};
unless($restartdl)
{
# this is a new download
# -> download from scratch
unlink "$repository/download/$vendorid/$updatefile";
unlink "$repository/download/$vendorid/$updatefile.info";
}
# save file informations while downloading
$dlinfo{'VENDORID'} = $vendorid;
$dlinfo{'SRCURL'} = $sourceurl;
$dlinfo{'FILENAME'} = $updatefile;
$dlinfo{'CFMIRROR'} = $cfmirror;
$dlinfo{'REMOTETIME'} = $remote_mtime;
$dlinfo{'REMOTESIZE'} = $remote_size;
$dlinfo{'STATUS'} = "1";
&UPDXLT::writehash("$repository/download/$vendorid/$updatefile.info", \%dlinfo);
my $cmd = "$UPDXLT::wget $login $dlrate --user-agent=\"$UPDXLT::useragent\" -q -P $repository/download/$vendorid $wgetContinueFlag $sourceurl";
$_ = system("$cmd");
$ENV{'http_proxy'} = '';
if ($_ == 0)
{
&writelog("Download finished with result code: OK");
unless (-d "$repository/$vendorid")
{
system("mkdir -p $repository/$vendorid");
chmod 0775, "$repository/$vendorid";
}
unless (-d "$repository/$vendorid/$uuid")
{
system("mkdir -p $repository/$vendorid/$uuid");
chmod 0775, "$repository/$vendorid/$uuid";
}
&writelog("Moving file to the cache directory: $vendorid/$uuid");
$updatefile =~ s@ @\\ @ig;
system("mv $repository/download/$vendorid/$updatefile $repository/$vendorid/$uuid");
# Workaround for IPCop's mv bug:
utime time,$remote_mtime,"$repository/$vendorid/$uuid/$updatefile";
$updatefile =~ s@\\ @ @ig;
&UPDXLT::setcachestatus("$repository/$vendorid/$uuid/source.url",$sourceurl);
&UPDXLT::setcachestatus("$repository/$vendorid/$uuid/status",$UPDXLT::sfOk);
&UPDXLT::setcachestatus("$repository/$vendorid/$uuid/checkup.log",time);
&UPDXLT::setcachestatus("$repository/$vendorid/$uuid/access.log",time);
# Update permissions of all files in the download directory.
my @files = (
"$repository/$vendorid/$uuid/source.url",
"$repository/$vendorid/$uuid/status",
"$repository/$vendorid/$uuid/checkup.log",
"$repository/$vendorid/$uuid/access.log",
"$repository/$vendorid/$uuid/$updatefile"
);
chmod 0664, @files;
unlink ("$repository/download/$vendorid/$updatefile.info");
} else {
&writelog("Download finished with result code: ERROR");
if (-e "$repository/download/$vendorid/$updatefile") { unlink ("$repository/download/$vendorid/$updatefile"); }
}
# -------------------------------------------------------------------
sub writelog
{
if ($logging)
{
open (LOGFILE,">>$logfile");
my @now = localtime(time);
printf LOGFILE "%04d-%02d-%02d %02d:%02d:%02d [%d] %s\n",$now[5]+1900,$now[4]+1,$now[3],$now[2],$now[1],$now[0],$$,$_[0];
close LOGFILE;
}
}
# -------------------------------------------------------------------