]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - config/updxlrator/updxlrator
Merge branch 'master' of ssh://git.ipfire.org/srv/git/ipfire-2.x
[people/pmueller/ipfire-2.x.git] / config / updxlrator / updxlrator
1 #!/usr/bin/perl
2 #
3 # This code is distributed under the terms of the GPL
4 #
5 # (c) 2006-2009 marco.s - http://update-accelerator.advproxy.net
6 #
7 # Portions (c) 2008 by dotzball - http://www.blockouttraffic.de
8 #
9 # $Id: updxlrator,v 2.1 2009/01/10 00:00:00 marco.s Exp $
10 #
11
12 use strict;
13 use HTTP::Date;
14
15 $|=1;
16
17 my $swroot="/var/ipfire";
18 my $updcachedir="/var/updatecache";
19 my $apphome="/var/ipfire/updatexlrator";
20 my $logfile="/var/log/updatexlrator/cache.log";
21 my $wget="/usr/bin/wget";
22 my $debug=(-e "$apphome/debug");
23 my $http_port='81';
24 my %netsettings=();
25 my %proxysettings=();
26 my %xlratorsettings=();
27 my $logging=0;
28 my $passive_mode=0;
29 my $maxusage=0;
30 my $nice='';
31 my @tmp=();
32 my $request='';
33 my $xlrator_url=0;
34 my $source_url='';
35 my $hostaddr='';
36 my $username='';
37 my $method='';
38 my $unique = 0;
39 my $mirror = 1;
40
41 readhash("${swroot}/ethernet/settings", \%netsettings);
42
43 if (-e "$swroot/updatexlrator/settings")
44 {
45 &readhash("$swroot/updatexlrator/settings", \%xlratorsettings);
46 if ($xlratorsettings{'ENABLE_LOG'} eq 'on') { $logging=1; };
47 if ($xlratorsettings{'PASSIVE_MODE'} eq 'on') { $passive_mode=1; };
48 $maxusage=$xlratorsettings{'MAX_DISK_USAGE'};
49 if ($xlratorsettings{'LOW_DOWNLOAD_PRIORITY'} eq 'on') { $nice='/bin/nice --adjustment=15 '; };
50 }
51 if (!$maxusage) { $maxusage=75; };
52
53 # dotzball: check for dead downloads
54 system("$apphome/bin/checkdeaddl &");
55
56 while (<>) {
57
58 $request=$_;
59
60 @tmp=split(/ /,$request);
61 chomp(@tmp);
62
63 $source_url = $tmp[0];
64 $hostaddr = $tmp[1]; while ($hostaddr =~ /.*\/$/) { chop $hostaddr; }
65 $username = $tmp[2]; if ($username eq '') { $username='-'; };
66 $method = $tmp[3];
67
68 $xlrator_url = $source_url;
69
70 if (($method eq 'GET') || ($method eq 'HEAD'))
71 {
72
73 # -----------------------------------------------------------
74 # Section: Windows Update / Windows Downloads
75 # -----------------------------------------------------------
76
77 if (
78 (($source_url =~ m@^http://[^/]*\.microsoft\.com/.*\.(exe|psf|msi|msp|cab)$@i) ||
79 ($source_url =~ m@^http://[^/]*\.windowsupdate\.com/.*\.(exe|psf|msi|msp|cab)$@i))
80 && ($source_url !~ m@^http://[^/]*\.microsoft\.com/.*(/autoupd|selfupdate/).*\.cab@i)
81 && ($source_url !~ m@\&@)
82 )
83 {
84 $xlrator_url = &check_cache($source_url,$hostaddr,$username,"Microsoft",$unique);
85 }
86
87 # -----------------------------------------------------------
88 # Section: Adobe Downloads
89 # -----------------------------------------------------------
90
91 if (
92 ($source_url =~ m@^http://(ar)?download\.adobe\.com/.*\.(exe|msi|bin|dmg|idx|gz)$@i) ||
93 ($source_url =~ m@^http://swupdl\.adobe\.com/updates/.*\.(exe|msi|bin|dmg|idx|gz|[a-z][a-z]_[A-Z][A-Z])$@i) ||
94 ($source_url =~ m@^http://swupmf\.adobe\.com/manifest/.*\.upd$@i)
95 )
96 {
97 $xlrator_url = &check_cache($source_url,$hostaddr,$username,"Adobe",$unique);
98 }
99
100 # -----------------------------------------------------------
101 # Section: Linux Downloads
102 # -----------------------------------------------------------
103
104 if ($source_url =~ m@^[h|f]t?tp://[^?]+\.(deb|rpm)$@i)
105 {
106 $xlrator_url = &check_cache($source_url,$hostaddr,$username,"Linux",$mirror);
107 }
108
109 # -----------------------------------------------------------
110 # Section: Trend Micro Downloads
111 # -----------------------------------------------------------
112
113 if (
114 ($source_url =~ m@^http://[^/]*\.trendmicro\.com/activeupdate/.*@i) &&
115 ($source_url !~ m@.*/tmnotify\.dat$@i) &&
116 ($source_url !~ m@.*/ini_xml\.zip$@i) &&
117 ($source_url !~ m@.*/server\.ini$@i)
118 )
119 {
120 $xlrator_url = &check_cache($source_url,$hostaddr,$username,"TrendMicro",$mirror);
121 }
122
123 # -----------------------------------------------------------
124 # Section: Symantec Downloads
125 # -----------------------------------------------------------
126
127 if ($source_url =~ m@^[h|f]tt?p://[^/]*\.symantec(liveupdate)?\.com/.*\.(exe|zip|vdb|xdb)$@i)
128 {
129 $xlrator_url = &check_cache($source_url,$hostaddr,$username,"Symantec",$unique);
130 }
131
132 # -----------------------------------------------------------
133 # Section: Apple Downloads
134 # -----------------------------------------------------------
135
136 if (
137 (($source_url =~ m@^http://swcdn\.apple\.com/content/downloads/.*\.(tar|pkg)$@i) ||
138 ($source_url =~ m@^http://appldnld\.apple\.com\.edgesuite\.net/.*\.(exe|dmg)$@i) ||
139 ($source_url =~ m@^http://.*\.g.akamai.net/.*/3093/1/.*\.(tar|pkg|dmg|exe)$@i))
140 )
141 {
142 $xlrator_url = &check_cache($source_url,$hostaddr,$username,"Apple",$unique);
143 }
144
145 # -----------------------------------------------------------
146 # Section: Avast Downloads
147 # -----------------------------------------------------------
148
149 if ($source_url =~ m@^http://download[\d]+\.avast\.com/.*\.(exe|vpu)$@i)
150 {
151 $xlrator_url = &check_cache($source_url,$hostaddr,$username,"Avast",$mirror);
152 }
153
154 # -----------------------------------------------------------
155
156 # -----------------------------------------------------------
157 # Section: Avira Downloads
158 # -----------------------------------------------------------
159
160 if ($source_url =~ m@^http://dl[0-9]\.avgate\.net/.*\.(htm|html|gz)$@i)
161 {
162 $xlrator_url = &check_cache($source_url,$hostaddr,$username,"Avira",$mirror);
163 }
164
165 # -----------------------------------------------------------
166 # Section: IPFire Downloads
167 # -----------------------------------------------------------
168
169 if ($source_url =~ m@^[f|h]t?tp://.*\.(ipfire)$@i)
170 {
171 $xlrator_url = &check_cache($source_url,$hostaddr,$username,"IPFire",$mirror);
172 }
173
174 }
175
176 # -----------------------------------------------------------
177 # Section: AVG Downloads
178 # -----------------------------------------------------------
179
180 # if ($source_url =~ m@^http://[^/]*\.(grisoft|avg)\.com/.*\.(bin)$@i)
181 # {
182 # $xlrator_url = &check_cache($source_url,$hostaddr,$username,"AVG",$mirror);
183 # }
184
185 $request="$xlrator_url $hostaddr $username $method\n";
186
187 print $request;
188 }
189
190 # -------------------------------------------------------------------
191
192 sub readhash
193 {
194 my $filename = $_[0];
195 my $hash = $_[1];
196 my ($var, $val);
197
198 if (-e $filename)
199 {
200 open(FILE, $filename) or die "Unable to read file $filename";
201 while (<FILE>)
202 {
203 chop;
204 ($var, $val) = split /=/, $_, 2;
205 if ($var)
206 {
207 $val =~ s/^\'//g;
208 $val =~ s/\'$//g;
209
210 # Untaint variables read from hash
211 $var =~ /([A-Za-z0-9_-]*)/; $var = $1;
212 $val =~ /([\w\W]*)/; $val = $1;
213 $hash->{$var} = $val;
214 }
215 }
216 close FILE;
217 }
218 }
219
220 # -------------------------------------------------------------------
221
222 sub writelog
223 {
224 if ($logging)
225 {
226 open(LOGFILE,">>$logfile");
227 print LOGFILE time." $_[0] $_[1] $_[2] $_[3] $_[4]\n";
228 close(LOGFILE);
229 }
230 }
231
232 # -------------------------------------------------------------------
233
234 sub debuglog
235 {
236 if ($debug)
237 {
238 open(LOGFILE,">>/var/log/updatexlrator/debug.log");
239 my @now = localtime(time);
240 printf LOGFILE "%04d-%02d-%02d %02d:%02d:%02d [%d] [%s] %s\n",$now[5]+1900,$now[4]+1,$now[3],$now[2],$now[1],$now[0],$$,"updxlrator",$_[0];
241 close(LOGFILE);
242 }
243 }
244
245 # -------------------------------------------------------------------
246
247 sub setcachestatus
248 {
249 open (FILE,">>$_[0]");
250 print FILE "$_[1]\n";
251 close FILE;
252 }
253
254 # -------------------------------------------------------------------
255
256 sub diskfree
257 {
258 open(DF,"/bin/df --block-size=1 $_[0]|");
259 my @dfdata = <DF>;
260 close DF;
261 shift(@dfdata);
262 chomp(@dfdata);
263 my $dfstr = join(' ',@dfdata);
264 my ($device,$size,$used,$free,$percent,$mount) = split(' ',$dfstr);
265 if ($free =~ m/^(\d+)$/)
266 {
267 return $free;
268 }
269 }
270
271 # -------------------------------------------------------------------
272
273 sub diskusage
274 {
275 open(DF,"/bin/df $_[0]|");
276 my @dfdata = <DF>;
277 close DF;
278 shift(@dfdata);
279 chomp(@dfdata);
280 my $dfstr = join(' ',@dfdata);
281 my ($device,$size,$used,$free,$percent,$mount) = split(' ',$dfstr);
282 if ($percent =~ m/^(\d+)%$/)
283 {
284 $percent =~ s/%$//;
285 return $percent;
286 }
287 }
288
289 # -------------------------------------------------------------------
290
291 sub getmtime
292 {
293 my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($_[0]);
294
295 return $mtime;
296 }
297
298 # -------------------------------------------------------------------
299
300 sub check_cache
301 {
302 my $updsource="UPDCACHE";
303 my $updfile='';
304 my $cacheurl='';
305 my $vendorid='';
306 my $uuid='';
307 my @http_header=();
308 my $remote_size=0;
309 my $remote_mtime=0;
310 my $login='';
311 my $useragent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
312
313 my $sourceurl=$_[0];
314 my $cfmirror=$_[4];
315
316 $sourceurl =~ s@\%2f@/@ig;
317 $updfile = substr($sourceurl,rindex($sourceurl,"/")+1);
318 $updfile =~ s@\%20@ @ig;
319
320 if ($cfmirror)
321 {
322 $uuid = `echo $updfile | md5sum`;
323 } else {
324 $uuid = `echo $sourceurl | md5sum`;
325 }
326
327 $uuid =~ s/[^0-9a-f]//g;
328 $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/;
329
330 $vendorid = $_[3];
331 $vendorid =~ tr/A-Z/a-z/;
332
333 &debuglog("Processing URL $sourceurl");
334 &debuglog("Vendor ID is $vendorid");
335 &debuglog("UUID is $uuid");
336
337 if (($proxysettings{'UPSTREAM_PROXY'}) && ($proxysettings{'UPSTREAM_USER'}))
338 {
339 $login = "--proxy-user=\"$proxysettings{'UPSTREAM_USER'}\"";
340 if ($proxysettings{'UPSTREAM_PASSWORD'})
341 {
342 $login .= " --proxy-password=\"$proxysettings{'UPSTREAM_PASSWORD'}\"";
343 }
344 }
345
346 if ($proxysettings{'UPSTREAM_PROXY'}) { &debuglog("Using upstream proxy $proxysettings{'UPSTREAM_PROXY'}"); }
347
348 $ENV{'http_proxy'} = $proxysettings{'UPSTREAM_PROXY'};
349 @http_header = `$wget $login --user-agent="$useragent" --spider -S $sourceurl 2>&1`;
350 $ENV{'http_proxy'} = '';
351
352 foreach (@http_header)
353 {
354 chomp;
355 if (/^\s*Content-Length:\s/) { $remote_size = $_; $remote_size =~ s/[^0-9]//g; }
356 if (/^\s*Last-Modified:\s/) { $remote_mtime = $_; $remote_mtime =~ s/^\s*Last-Modified:\s//; $remote_mtime = HTTP::Date::str2time($remote_mtime) }
357 }
358
359 if (
360 (-e "$updcachedir/$vendorid/$uuid/$updfile") &&
361 ($remote_size == (-s "$updcachedir/$vendorid/$uuid/$updfile")) &&
362 ($remote_mtime == &getmtime("$updcachedir/$vendorid/$uuid/$updfile"))
363 )
364 {
365 &debuglog("File exists in cache and is up to date");
366 &debuglog("Retrieving file from cache ($updsource)");
367 &setcachestatus("$updcachedir/$vendorid/$uuid/access.log",time);
368 $cacheurl="http://$netsettings{'GREEN_ADDRESS'}:$http_port/updatecache/$vendorid/$uuid/$updfile";
369 }
370 else
371 {
372 if (-e "$updcachedir/$vendorid/$uuid/$updfile")
373 {
374 &debuglog("Local filesize: " . (-s "$updcachedir/$vendorid/$uuid/$updfile"));
375 &debuglog("Local timestamp: " . &getmtime("$updcachedir/$vendorid/$uuid/$updfile"));
376 } else { &debuglog("File not found in cache"); }
377 $updsource="DLSOURCE";
378 &debuglog("Remote filesize: $remote_size");
379 &debuglog("Remote timestamp: $remote_mtime");
380 &debuglog("Free disk space: " . &diskfree($updcachedir));
381 &debuglog("Disk usage: " . &diskusage($updcachedir) . "% (max. $maxusage%)");
382 if (-e "$updcachedir/download/$vendorid/$updfile") { &debuglog("File download/$vendorid/$updfile exists"); }
383 &debuglog("Retrieving file from source ($updsource)");
384 if ((!$passive_mode) && (&diskusage($updcachedir) <= $maxusage) && ($remote_size <= &diskfree($updcachedir)) && (!-e "$updcachedir/download/$vendorid/$updfile"))
385 {
386 &debuglog("Running command $nice$apphome/bin/download $vendorid $sourceurl $cfmirror &");
387 system("$nice$apphome/bin/download $vendorid $sourceurl $cfmirror &");
388 }
389 $cacheurl=$sourceurl;
390 }
391
392 &writelog($_[1],$_[2],$_[3],$updsource,$sourceurl);
393
394 return $cacheurl;
395 }
396
397 # -------------------------------------------------------------------