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