]>
git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - config/updxlrator/updxlrator
3 # This code is distributed under the terms of the GPL
5 # (c) 2006-2009 marco.s - http://update-accelerator.advproxy.net
7 # Portions (c) 2008 by dotzball - http://www.blockouttraffic.de
9 # $Id: updxlrator,v 2.1 2009/01/10 00:00:00 marco.s Exp $
13 # 2012-10-26: nightshift - move curly bracket to capture AVG download source.
14 # - Adding BIG HINT for new update source#
22 my $swroot="/var/ipfire";
23 my $updcachedir="/var/updatecache";
24 my $apphome="/var/ipfire/updatexlrator";
25 my $logfile="/var/log/updatexlrator/cache.log";
26 my $wget="/usr/bin/wget";
27 my $debug=(-e
"$apphome/debug");
31 my %xlratorsettings=();
46 readhash
("${swroot}/ethernet/settings", \
%netsettings);
48 if (-e
"$swroot/updatexlrator/settings")
50 &readhash
("$swroot/updatexlrator/settings", \
%xlratorsettings);
51 if ($xlratorsettings{'ENABLE_LOG'} eq 'on') { $logging=1; };
52 if ($xlratorsettings{'PASSIVE_MODE'} eq 'on') { $passive_mode=1; };
53 $maxusage=$xlratorsettings{'MAX_DISK_USAGE'};
54 if ($xlratorsettings{'LOW_DOWNLOAD_PRIORITY'} eq 'on') { $nice='/bin/nice --adjustment=15 '; };
56 if (!$maxusage) { $maxusage=75; };
58 # dotzball: check for dead downloads
59 system("$apphome/bin/checkdeaddl &");
65 @tmp=split(/ /,$request);
68 $source_url = $tmp[0];
69 $hostaddr = $tmp[1]; while ($hostaddr =~ /.*\/$/) { chop $hostaddr; }
70 $username = $tmp[2]; if ($username eq '') { $username='-'; };
75 if (($method eq 'GET') || ($method eq 'HEAD'))
78 # -----------------------------------------------------------
79 # Section: Windows Update / Windows Downloads
80 # -----------------------------------------------------------
83 (($source_url =~ m@
^http
://[^/]*\.microsoft\.com/.*\
.(exe
|psf
|msi
|msp
|msu
|cab
)$@i) ||
84 ($source_url =~ m@
^http
://[^/]*\.windowsupdate\.com/.*\
.(exe
|psf
|msi
|msp
|msu
|cab
)$@i))
85 && ($source_url !~ m@
^http
://[^/]*\.microsoft\.com/.*(/autoupd|selfupdate/).*\
.cab
@i)
86 && ($source_url !~ m@\
&@
)
89 # NOTE: check_cache will change to $mirror instead of $unique if the filename contains an SHA1 hash
90 # and the URL is not found in cache!
91 $xlrator_url = &check_cache
($source_url,$hostaddr,$username,"Microsoft",$unique);
94 # -----------------------------------------------------------
95 # Section: Adobe Downloads
96 # -----------------------------------------------------------
100 ($source_url =~ m@
^http
://(ar
)?download\
.adobe\
.com
/.*\
.(exe
|ms
[ip
]|bin
|dmg
|idx
|gz
)$@i) ||
101 ($source_url =~ m@
^http
://swupdl\
.adobe\
.com
/updates
/.*\
.(exe
|ms
[ip
]|bin
|dmg
|idx
|gz
|[a
-z
][a
-z
]_
[A
-Z
][A
-Z
])$@i) ||
102 ($source_url =~ m@
^http
://swupmf\
.adobe\
.com
/manifest
/.*\
.upd
$@i)
105 $xlrator_url = &check_cache
($source_url,$hostaddr,$username,"Adobe",$unique);
108 # -----------------------------------------------------------
109 # Section: Linux Downloads
110 # -----------------------------------------------------------
113 ($source_url =~ m@
^[h
|f
]t?tp
://[^?
]+\
.(pkg\
.tar\
.xz
|deb
|rpm
)$@i) ||
114 ($source_url =~ m@
^[h
|f
]t?tp
://[^?
]+/distfiles/[^?
]+\
.(tar\
.gz
|tar\
.bz2
|tar\
.xz
|tgz
|zip
|patch\
.bz2
|gz
|docx
|patch
|pdf
|exe
)$@i)
117 $xlrator_url = &check_cache
($source_url,$hostaddr,$username,"Linux",$mirror);
120 # -----------------------------------------------------------
121 # Section: Trend Micro Downloads
122 # -----------------------------------------------------------
125 ($source_url =~ m@
^http
://[^/]*\.trendmicro\.com/activeupdate
/.*@i) &&
126 ($source_url !~ m@
.*/tmnotify\
.dat
$@i) &&
127 ($source_url !~ m@
.*/ini_xml\
.zip
$@i) &&
128 ($source_url !~ m@
.*/server\
.ini
$@i)
131 $xlrator_url = &check_cache
($source_url,$hostaddr,$username,"TrendMicro",$mirror);
134 # -----------------------------------------------------------
135 # Section: Symantec Downloads
136 # -----------------------------------------------------------
138 if ($source_url =~ m@
^[h
|f
]tt?p
://[^/]*\.symantec(liveupdate)?\.com/.*\
.(exe
|zip
|vdb
|xdb
)$@i)
140 $xlrator_url = &check_cache
($source_url,$hostaddr,$username,"Symantec",$unique);
143 # -----------------------------------------------------------
144 # Section: Apple Downloads
145 # -----------------------------------------------------------
148 (($source_url =~ m@
^http
://swcdn\
.apple\
.com
/content
/downloads
/.*\
.(tar
|pkg
)$@i) ||
149 ($source_url =~ m@
^http
://appldnld\
.apple\
.com\
.edgesuite\
.net
/.*\
.(exe
|dmg
)$@i) ||
150 ($source_url =~ m@
^http
://.*\
.g
.akamai
.net
/.*/3093/1/.*\
.(tar
|pkg
|dmg
|exe
)$@i))
153 $xlrator_url = &check_cache
($source_url,$hostaddr,$username,"Apple",$unique);
156 # -----------------------------------------------------------
157 # Section: Avast Downloads
158 # -----------------------------------------------------------
160 if ($source_url =~ m@
^http
://(ion
|download
)[\d
]+\
.avast\
.com
/.*\
.(exe
|vpu
|vpx
)$@i)
162 $xlrator_url = &check_cache
($source_url,$hostaddr,$username,"Avast",$mirror);
165 # -----------------------------------------------------------
166 # Section: Mozilla Downloads
167 # -----------------------------------------------------------
169 if ($source_url=~ m@
^http
://.*\
.mozilla\
.net
/.*\
.((complete
|partial
)\
.mar
|exe
)$@i)
171 $xlrator_url = &check_cache
($source_url,$hostaddr,$username,"Mozilla",$unique);
174 # -----------------------------------------------------------
176 # -----------------------------------------------------------
178 if ($source_url =~ m@
^http
://update\
.nai\
.com
/.*\
.(mcs
|z
|gem
|dat
|zip
)$@i)
180 $xlrator_url = &check_cache
($source_url,$hostaddr,$username,"mcafee",$mirror);
183 # -----------------------------------------------------------
184 # Section: Avira Downloads
185 # -----------------------------------------------------------
188 ($source_url =~ m@
^http
://dl[0-9]\
.avgate\
.net
/.*\
.(htm
|html
|gz
)$@i) ||
189 ($source_url =~ m@
^http
://80.190.130.19[4-5]/update/.*\
.(htm
|html
|gz
)$@i) ||
190 ($source_url =~ m@
^http
://62.146.64.14[6-7]/update/.*\
.(htm
|html
|gz
)$@i)
193 $xlrator_url = &check_cache
($source_url,$hostaddr,$username,"Avira",$mirror);
196 # -----------------------------------------------------------
197 # Section: AVG Downloads
198 # -----------------------------------------------------------
200 # if ($source_url =~ m@^http://[^/]*\.(grisoft|avg)\.com/.*\.(bin)$@i)
202 # $xlrator_url = &check_cache($source_url,$hostaddr,$username,"AVG",$mirror);
205 # ----------- ADD NEW SOURCES BEFORE THIS LINE !!! ------------------
209 print "OK rewrite-url=\"$xlrator_url\"\n";
215 # -------------------------------------------------------------------
219 my $filename = $_[0];
225 open(FILE
, $filename) or die "Unable to read file $filename";
229 ($var, $val) = split /=/, $_, 2;
235 # Untaint variables read from hash
236 $var =~ /([A-Za-z0-9_-]*)/; $var = $1;
237 $val =~ /([\w\W]*)/; $val = $1;
238 $hash->{$var} = $val;
245 # -------------------------------------------------------------------
251 open(LOGFILE
,">>$logfile");
252 print LOGFILE
time." $_[0] $_[1] $_[2] $_[3] $_[4]\n";
257 # -------------------------------------------------------------------
263 open(LOGFILE
,">>/var/log/updatexlrator/debug.log");
264 my @now = localtime(time);
265 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];
270 # -------------------------------------------------------------------
274 open (FILE
,">>$_[0]");
275 print FILE
"$_[1]\n";
279 # -------------------------------------------------------------------
283 open(DF
,"/bin/df --block-size=1 $_[0]|");
288 my $dfstr = join(' ',@dfdata);
289 my ($device,$size,$used,$free,$percent,$mount) = split(' ',$dfstr);
290 if ($free =~ m/^(\d+)$/)
296 # -------------------------------------------------------------------
300 open(DF
,"/bin/df $_[0]|");
305 my $dfstr = join(' ',@dfdata);
306 my ($device,$size,$used,$free,$percent,$mount) = split(' ',$dfstr);
307 if ($percent =~ m/^(\d+)%$/)
314 # -------------------------------------------------------------------
318 my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($_[0]);
323 # -------------------------------------------------------------------
327 my $updsource="UPDCACHE";
336 my $useragent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
341 $sourceurl =~ s@\
%2b@
+@ig;
342 $sourceurl =~ s@\
%2f@
/@ig;
343 $sourceurl =~ s@\
%7e@
~@ig;
344 $updfile = substr($sourceurl,rindex($sourceurl,"/")+1);
345 $updfile =~ s@\
%20@
@ig;
349 $uuid = `echo $updfile | md5sum`;
351 $uuid = `echo $sourceurl | md5sum`;
354 $uuid =~ s/[^0-9a-f]//g;
355 $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/;
358 $vendorid =~ tr/A-Z/a-z/;
360 &debuglog
("Processing URL $sourceurl");
361 &debuglog
("Vendor ID is $vendorid");
362 &debuglog
("UUID is $uuid");
364 if (($proxysettings{'UPSTREAM_PROXY'}) && ($proxysettings{'UPSTREAM_USER'}))
366 $login = "--proxy-user=\"$proxysettings{'UPSTREAM_USER'}\"";
367 if ($proxysettings{'UPSTREAM_PASSWORD'})
369 $login .= " --proxy-password=\"$proxysettings{'UPSTREAM_PASSWORD'}\"";
373 if ($proxysettings{'UPSTREAM_PROXY'}) { &debuglog
("Using upstream proxy $proxysettings{'UPSTREAM_PROXY'}"); }
375 $ENV{'http_proxy'} = $proxysettings{'UPSTREAM_PROXY'};
376 @http_header = `$wget $login --user-agent="$useragent" --spider -S $sourceurl 2>&1`;
377 $ENV{'http_proxy'} = '';
379 foreach (@http_header)
382 if (/^\s*Content-Length:\s/) { $remote_size = $_; $remote_size =~ s/[^0-9]//g; }
383 if (/^\s*Last-Modified:\s/) { $remote_mtime = $_; $remote_mtime =~ s/^\s*Last-Modified:\s//; $remote_mtime = HTTP
::Date
::str2time
($remote_mtime) }
387 (-e
"$updcachedir/$vendorid/$uuid/$updfile") &&
388 ($remote_size == (-s
"$updcachedir/$vendorid/$uuid/$updfile")) &&
389 ($remote_mtime == &getmtime
("$updcachedir/$vendorid/$uuid/$updfile"))
392 &debuglog
("File exists in cache and is up to date");
393 &debuglog
("Retrieving file from cache ($updsource) for $hostaddr");
394 &setcachestatus
("$updcachedir/$vendorid/$uuid/access.log",time);
395 $cacheurl="http://$netsettings{'GREEN_ADDRESS'}:$http_port/updatecache/$vendorid/$uuid/$updfile";
398 ($cfmirror == $unique) &&
399 ($vendorid == "microsoft") &&
400 ($source_url =~ m@
.*[0-9a
-f
]{40}\
.[^\
.]+@i)
403 # Most Microsoft updates now have an SHA1 hash in the name. These should be treated as unique files.
404 # Since it wasn't found in the URL cache, switch to mirror mode and try again using just the filename.
405 &debuglog
("SHA1: $vendorid $uuid not cached. Reprocessing as mirror $sourceurl");
406 $cacheurl = &check_cache
($source_url,$hostaddr,$username,$vendorid,$mirror);
410 if (-e
"$updcachedir/$vendorid/$uuid/$updfile")
412 &debuglog
("Local filesize: " . (-s
"$updcachedir/$vendorid/$uuid/$updfile"));
413 &debuglog
("Local timestamp: " . &getmtime
("$updcachedir/$vendorid/$uuid/$updfile"));
414 } else { &debuglog
("File not found in cache"); }
415 $updsource="DLSOURCE";
416 &debuglog
("Remote filesize: $remote_size");
417 &debuglog
("Remote timestamp: $remote_mtime");
418 &debuglog
("Free disk space: " . &diskfree
($updcachedir));
419 &debuglog
("Disk usage: " . &diskusage
($updcachedir) . "% (max. $maxusage%)");
420 if (-e
"$updcachedir/download/$vendorid/$updfile") { &debuglog
("File download/$vendorid/$updfile exists"); }
421 &debuglog
("Retrieving file from source ($updsource) for $hostaddr");
422 if ((!$passive_mode) && (&diskusage
($updcachedir) <= $maxusage) && ($remote_size <= &diskfree
($updcachedir)) && (!-e
"$updcachedir/download/$vendorid/$updfile"))
424 &debuglog
("Running command $nice$apphome/bin/download $vendorid $sourceurl $cfmirror &");
425 system("$nice$apphome/bin/download $vendorid $sourceurl $cfmirror &");
427 $cacheurl=$sourceurl;
430 &writelog
($_[1],$_[2],$_[3],$updsource,$sourceurl);
435 # -------------------------------------------------------------------