]> git.ipfire.org Git - ipfire-2.x.git/blame - config/updxlrator/download
Fix bug 11567 updxlrator: don't prematurely release lock file
[ipfire-2.x.git] / config / updxlrator / download
CommitLineData
46c01c09
MT
1#!/usr/bin/perl
2#
3# This code is distributed under the terms of the GPL
4#
0a638396 5# (c) 2006-2008 marco.s - http://update-accelerator.advproxy.net
46c01c09 6#
4f4092e3
CS
7# Portions (c) 2008 by dotzball - http://www.blockouttraffic.de
8#
9# $Id: download,v 2.1 2008/07/23 00:00:00 marco.s Exp $
46c01c09
MT
10#
11
12use strict;
0a638396 13use HTTP::Date;
46c01c09 14
4f4092e3
CS
15require '/var/ipfire/updatexlrator/updxlrator-lib.pl';
16
46c01c09 17my $logfile="/var/log/updatexlrator/download.log";
0a638396
CS
18my $logging=0;
19my $repository='/var/updatecache';
20my $login='';
21my $dlrate='';
22my $uuid='';
0a638396
CS
23my %xlratorsettings=();
24my %proxysettings=();
25my @http_header=();
4f4092e3 26my $remote_size=0;
0a638396
CS
27my $remote_mtime=0;
28my $updatefile='';
29my $unique=0;
30my $mirror=1;
46c01c09 31
4f4092e3 32my %dlinfo=();
46c01c09 33
4f4092e3
CS
34my $vendorid = $ARGV[0]; if (!defined($vendorid) || $vendorid eq '') { exit; }
35my $sourceurl = $ARGV[1]; if (!defined($sourceurl) || $sourceurl eq '') { exit; }
36my $cfmirror = $ARGV[2]; if (!defined($cfmirror) || $cfmirror eq '') { exit; }
37my $restartdl = defined($ARGV[3]) ? $ARGV[3] : 0;
46c01c09 38
0a638396 39umask(0002);
46c01c09 40
4f4092e3 41$sourceurl =~ s@\%2b@+@ig;
0a638396
CS
42$sourceurl =~ s@\%2f@/@ig;
43$sourceurl =~ s@\%7e@~@ig;
44$updatefile = substr($sourceurl,rindex($sourceurl,"/")+1);
45$updatefile =~ s@\%20@ @ig;
46$vendorid =~ tr/A-Z/a-z/;
46c01c09 47
0a638396 48unless (-d "$repository/download/$vendorid")
46c01c09 49{
c6919127 50 system("mkdir -p $repository/download/$vendorid");
a19f3396 51 chmod 0775, "$repository/download/$vendorid";
0a638396
CS
52}
53
4f4092e3
CS
54if($restartdl == 0)
55{
56 # this is a new download
57 exit if (-e "$repository/download/$vendorid/$updatefile");
58
e04f86b4
JL
59 # hinder multiple downloads from starting simultaneously. Create empty "lock" file.
60 # TODO: Another thread may sneak in between these two commands - so not fool-proof, but good enough?
4f4092e3 61 system("touch $repository/download/$vendorid/$updatefile");
4f4092e3
CS
62
63}
64else
65{
66 # this is a restart of a previous (unfinished) download
67 # -> continue download
4f4092e3
CS
68 &writelog("Continue download: $updatefile");
69}
0a638396 70
0a638396
CS
71
72if ($cfmirror)
73{
74 $uuid = `echo $updatefile | md5sum`;
75} else {
76 $uuid = `echo $sourceurl | md5sum`;
77}
78
79$uuid =~ s/[^0-9a-f]//g;
80$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/;
81
4f4092e3 82if (-e "$UPDXLT::swroot/updatexlrator/settings")
0a638396 83{
4f4092e3 84 &UPDXLT::readhash("$UPDXLT::swroot/updatexlrator/settings", \%xlratorsettings);
0a638396
CS
85 if ($xlratorsettings{'MAX_DOWNLOAD_RATE'} ne '') { $dlrate = "--limit-rate=" . int($xlratorsettings{'MAX_DOWNLOAD_RATE'} / 8) . "k" };
86}
87
4f4092e3 88if (-e "$UPDXLT::swroot/proxy/settings") { &UPDXLT::readhash("$UPDXLT::swroot/proxy/settings", \%proxysettings); }
0a638396 89
4f4092e3 90if (-e "$UPDXLT::swroot/proxy/advanced/settings")
0a638396
CS
91{
92 %proxysettings=();
4f4092e3 93 &UPDXLT::readhash("$UPDXLT::swroot/proxy/advanced/settings", \%proxysettings);
0a638396
CS
94}
95
96if (($proxysettings{'UPSTREAM_PROXY'}) && ($proxysettings{'UPSTREAM_USER'}))
46c01c09 97{
0a638396
CS
98 $login = "--proxy-user=\"$proxysettings{'UPSTREAM_USER'}\"";
99 if ($proxysettings{'UPSTREAM_PASSWORD'})
100 {
101 $login .= " --proxy-password=\"$proxysettings{'UPSTREAM_PASSWORD'}\"";
102 }
46c01c09
MT
103}
104
0a638396
CS
105if ($xlratorsettings{'MAX_DOWNLOAD_RATE'} eq '')
106{
107 &writelog("Retrieving file for local cache: $updatefile");
108} else {
f00699e8 109 &writelog("Retrieving file for local cache at max. " . $xlratorsettings{'MAX_DOWNLOAD_RATE'} . " kbit/s: $updatefile");
0a638396 110}
46c01c09 111
0a638396 112$ENV{'http_proxy'} = $proxysettings{'UPSTREAM_PROXY'};
4f4092e3 113@http_header = `$UPDXLT::wget $login --user-agent="$UPDXLT::useragent" --spider -S $sourceurl 2>&1`;
0a638396 114$ENV{'http_proxy'} = '';
46c01c09 115
0a638396
CS
116foreach (@http_header)
117{
118 chomp;
4f4092e3
CS
119 if (/^\s*Content-Length:\s/) { s/[^0-9]//g; $remote_size=$_; &writelog("Remote file size: $_ bytes"); }
120 if (/^\s*Last-Modified:\s/)
121 {
122 s/^\s*Last-Modified:\s//;
123 $remote_mtime = HTTP::Date::str2time($_);
124 &writelog("Remote file date: $_");
125 }
0a638396 126}
46c01c09 127
0a638396 128$ENV{'http_proxy'} = $proxysettings{'UPSTREAM_PROXY'};
4f4092e3
CS
129
130unless($restartdl)
131{
132 # this is a new download
133 # -> download from scratch
e04f86b4
JL
134
135 #already exited earlier if the file existed, and afterwards created this empty "lock", so if not empty now, another thread is already downloading it.
136 exit if ( -s "$repository/download/$vendorid/$updatefile" );
4f4092e3
CS
137 unlink "$repository/download/$vendorid/$updatefile.info";
138}
139
140# save file informations while downloading
141$dlinfo{'VENDORID'} = $vendorid;
142$dlinfo{'SRCURL'} = $sourceurl;
143$dlinfo{'FILENAME'} = $updatefile;
144$dlinfo{'CFMIRROR'} = $cfmirror;
145$dlinfo{'REMOTETIME'} = $remote_mtime;
146$dlinfo{'REMOTESIZE'} = $remote_size;
147$dlinfo{'STATUS'} = "1";
148&UPDXLT::writehash("$repository/download/$vendorid/$updatefile.info", \%dlinfo);
149
e04f86b4 150my $cmd = "$UPDXLT::wget $login $dlrate --user-agent=\"$UPDXLT::useragent\" -q -P $repository/download/$vendorid --continue $sourceurl";
4f4092e3
CS
151
152$_ = system("$cmd");
0a638396 153$ENV{'http_proxy'} = '';
46c01c09 154
0a638396
CS
155if ($_ == 0)
156{
157 &writelog("Download finished with result code: OK");
158
159 unless (-d "$repository/$vendorid")
160 {
2b5b6b9e 161 system("mkdir -p $repository/$vendorid");
a19f3396 162 chmod 0775, "$repository/$vendorid";
0a638396
CS
163 }
164
165 unless (-d "$repository/$vendorid/$uuid")
166 {
c6919127 167 system("mkdir -p $repository/$vendorid/$uuid");
a19f3396 168 chmod 0775, "$repository/$vendorid/$uuid";
0a638396
CS
169 }
170
171 &writelog("Moving file to the cache directory: $vendorid/$uuid");
172 $updatefile =~ s@ @\\ @ig;
173 system("mv $repository/download/$vendorid/$updatefile $repository/$vendorid/$uuid");
174 # Workaround for IPCop's mv bug:
175 utime time,$remote_mtime,"$repository/$vendorid/$uuid/$updatefile";
176 $updatefile =~ s@\\ @ @ig;
177
4f4092e3
CS
178 &UPDXLT::setcachestatus("$repository/$vendorid/$uuid/source.url",$sourceurl);
179 &UPDXLT::setcachestatus("$repository/$vendorid/$uuid/status",$UPDXLT::sfOk);
180 &UPDXLT::setcachestatus("$repository/$vendorid/$uuid/checkup.log",time);
181 &UPDXLT::setcachestatus("$repository/$vendorid/$uuid/access.log",time);
0a638396 182
a19f3396
MT
183 # Update permissions of all files in the download directory.
184 my @files = (
185 "$repository/$vendorid/$uuid/source.url",
186 "$repository/$vendorid/$uuid/status",
187 "$repository/$vendorid/$uuid/checkup.log",
188 "$repository/$vendorid/$uuid/access.log",
189 "$repository/$vendorid/$uuid/$updatefile"
190 );
191 chmod 0664, @files;
0a638396 192
4f4092e3
CS
193 unlink ("$repository/download/$vendorid/$updatefile.info");
194
0a638396
CS
195} else {
196 &writelog("Download finished with result code: ERROR");
197 if (-e "$repository/download/$vendorid/$updatefile") { unlink ("$repository/download/$vendorid/$updatefile"); }
198}
199
200
0a638396 201# -------------------------------------------------------------------
46c01c09
MT
202
203sub writelog
204{
0a638396 205 if ($logging)
c6919127 206 {
0a638396
CS
207 open (LOGFILE,">>$logfile");
208 my @now = localtime(time);
209 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];
210 close LOGFILE;
211 }
212}
213
214# -------------------------------------------------------------------