]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blob - config/updxlrator/updxlrator
Moved updbooster cache files to a larger partition
[people/teissler/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 marco.s
6 #
7 # $Id: updxlrator,v 1.0 2006/10/03 00:00:00 marco.s Exp $
8 #
9
10 use strict;
11
12 use IO::Socket;
13
14 $|=1;
15
16 my $swroot="/var/ipfire";
17 my $updcachedir="/var/updatecache";
18 my %netsettings=();
19 my %xlratorsettings=();
20 my $http_port="81";
21 my $logfile="/var/log/updatexlrator/cache.log";
22 my $logging=0;
23 my $passive_mode=0;
24 my $maxusage=0;
25 my $nice='';
26 my @tmp=();
27 my $now='';
28 my $request='';
29 my $from_local_cache=0;
30 my $dsturl='';
31 my $hostaddr='';
32 my $username='';
33 my $method='';
34 my @metadata=();
35
36 my $sfNoSource = "0";
37 my $sfOk = "1";
38 my $sfOutdated = "2";
39
40 unless (-d "$updcachedir/metadata")
41 {
42 unless (-d "$updcachedir") { mkdir "$updcachedir"; }
43 mkdir "$updcachedir/metadata";
44 system("chown nobody.squid $updcachedir");
45 system("chmod 775 $updcachedir");
46 system("chown nobody.squid $updcachedir/metadata");
47 system("chmod 775 $updcachedir/metadata");
48 }
49
50 readhash("${swroot}/ethernet/settings", \%netsettings);
51
52 if (-e "$swroot/updatexlrator/settings")
53 {
54 &readhash("$swroot/updatexlrator/settings", \%xlratorsettings);
55 if ($xlratorsettings{'ENABLE_LOG'} eq 'on') { $logging=1; };
56 if ($xlratorsettings{'PASSIVE_MODE'} eq 'on') { $passive_mode=1; };
57 $maxusage=$xlratorsettings{'MAX_DISK_USAGE'};
58 if ($xlratorsettings{'LOW_DOWNLOAD_PRIORITY'} eq 'on') { $nice='/bin/nice --adjustment=15 '; };
59 }
60 if (!$maxusage) { $maxusage=75; };
61
62
63 while (<>) {
64
65 $request=$_;
66 $from_local_cache=0;
67
68 @tmp=split(/ /,$request);
69 chomp(@tmp);
70
71 $dsturl =$tmp[0];
72 $hostaddr=$tmp[1]; while ($hostaddr =~ /.*\/$/) { chop $hostaddr; }
73 $username=$tmp[2]; if ($username eq '') { $username='-'; };
74 $method =$tmp[3];
75
76 if (($method eq 'GET') || ($method eq 'HEAD'))
77 {
78
79 # -----------------------------------------------------------
80 # Section: Windows Update / Windows Downloads
81 # -----------------------------------------------------------
82
83 if (
84 (($dsturl =~ m@^http://[^/]*\.microsoft\.com/.*\.(exe|psf|msi)$@i) ||
85 ($dsturl =~ m@^http://[^/]*\.windowsupdate\.com/.*\.(exe|psf|cab)$@i))
86 && ($dsturl !~ m@^http://[^/]*\.microsoft\.com/.*(/autoupd|selfupdate/).*\.cab@i)
87 && ($dsturl !~ m@\&@)
88 )
89 {
90 $from_local_cache = &cache_access($dsturl,$hostaddr,$username,"Microsoft");
91 }
92
93 # -----------------------------------------------------------
94 # Section: Adobe Downloads
95 # -----------------------------------------------------------
96
97 if ($dsturl =~ m@^http://(ar)?download\.adobe\.com/.*\.(exe|bin|dmg|idx|gz)$@i)
98 {
99 $from_local_cache = &cache_access($dsturl,$hostaddr,$username,"Adobe");
100 }
101
102 # -----------------------------------------------------------
103 # Section: Symantec Downloads
104 # -----------------------------------------------------------
105
106 if ($dsturl =~ m@^[f|h]t?tp://[^/]*\.symantec(liveupdate)?\.com/.*\.(exe|zip|xdb)$@i)
107 {
108 $from_local_cache = &cache_access($dsturl,$hostaddr,$username,"Symantec");
109 }
110
111 # -----------------------------------------------------------
112 # Section: Avira Downloads
113 # -----------------------------------------------------------
114
115 if ($dsturl =~ m@^http://dl[0-9]\.avgate\.net/.*\.(htm|html|gz)$@i)
116 {
117 $from_local_cache = &cache_access($dsturl,$hostaddr,$username,"Avira");
118 }
119
120 # -----------------------------------------------------------
121 # Section: Avast Downloads
122 # -----------------------------------------------------------
123
124 if ($dsturl =~ m@^http://download[0-99]\.avast\.com/.*\.(exe|zip|vps|stamp|vpu)$@i)
125 {
126 $from_local_cache = &cache_access($dsturl,$hostaddr,$username,"Avast");
127 }
128
129 # -----------------------------------------------------------
130 # Section: IPFire Downloads
131 # -----------------------------------------------------------
132
133 if ($dsturl =~ m@^[f|h]t?tp://.*\.(ipfire)$@i)
134 {
135 $from_local_cache = &cache_access($dsturl,$hostaddr,$username,"IPFire");
136 }
137
138 # -----------------------------------------------------------
139 # Section: Linux Downloads
140 # -----------------------------------------------------------
141
142 if ($dsturl =~ m@^[f|h]t?tp://.*\.(deb|rpm)$@i)
143 {
144 $from_local_cache = &cache_access($dsturl,$hostaddr,$username,"Linux");
145 }
146
147 # -----------------------------------------------------------
148
149 # -----------------------------------------------------------
150 # Section: Apple Downloads
151 # -----------------------------------------------------------
152
153 if ($dsturl =~ m@^[f|h]t?tp://swcdn\.apple.*\.(pkm|tar)$@i)
154 {
155 $from_local_cache = &cache_access($dsturl,$hostaddr,$username,"Apple");
156 }
157
158 # -----------------------------------------------------------
159 # Section: Kaspersky Downloads
160 # not working properly
161 # -----------------------------------------------------------
162
163 #if ($dsturl =~ m@^http://dnl-.*\.kaspersky-labs\.com\/(diffs|bases|AutoPatches).*$@i)
164 #{
165 #$from_local_cache = &cache_access($dsturl,$hostaddr,$username,"Kaspersky");
166 #}
167
168 # -----------------------------------------------------------
169
170 }
171
172 if ($from_local_cache) { $request="http://$netsettings{'GREEN_ADDRESS'}:$http_port/updatecache/".substr($dsturl,rindex($dsturl,"/")+1)." $hostaddr $username $method\n"; }
173
174 print $request;
175 }
176
177 # -------------------------------------------------------------------
178
179 sub readhash
180 {
181 my $filename = $_[0];
182 my $hash = $_[1];
183 my ($var, $val);
184
185 if (-e $filename)
186 {
187 open(FILE, $filename) or die "Unable to read file $filename";
188 while (<FILE>)
189 {
190 chop;
191 ($var, $val) = split /=/, $_, 2;
192 if ($var)
193 {
194 $val =~ s/^\'//g;
195 $val =~ s/\'$//g;
196
197 # Untaint variables read from hash
198 $var =~ /([A-Za-z0-9_-]*)/; $var = $1;
199 $val =~ /([\w\W]*)/; $val = $1;
200 $hash->{$var} = $val;
201 }
202 }
203 close FILE;
204 }
205 }
206
207 # -------------------------------------------------------------------
208
209 sub writelog
210 {
211 open(LOGFILE,">>$logfile");
212 print LOGFILE time." $_[0] $_[1] $_[2] $_[3] $_[4]\n";
213 close(LOGFILE);
214 }
215
216 # -------------------------------------------------------------------
217
218 sub diskfree
219 {
220 open(DF,"/bin/df --block-size=1 $_[0]|");
221 while(<DF>)
222 {
223 unless ($_ =~ m/^Filesystem/ )
224 {
225 my ($device,$size,$used,$free,$percent,$mount) = split;
226 if ($free =~ m/^(\d+)$/)
227 {
228 close DF;
229 return $free;
230 }
231 }
232 }
233 close DF;
234 }
235
236 # -------------------------------------------------------------------
237
238 sub diskusage
239 {
240 open(DF,"/bin/df $_[0]|");
241 while(<DF>)
242 {
243 unless ($_ =~ m/^Filesystem/ )
244 {
245 my ($device,$size,$used,$free,$percent,$mount) = split;
246 if ($percent =~ m/^(\d+)%$/)
247 {
248 close DF;
249 $percent =~ s/%$//;
250 return $percent;
251 }
252 }
253 }
254 close DF;
255 }
256
257 # -------------------------------------------------------------------
258
259 sub getdownloadsize
260 {
261 my $remote=0;
262 my @response=();
263 my $contentlength=0;
264
265 my $url = $_[0];
266
267 $url =~ s@^(.*)://([^/]*)@@;
268
269 my $proto = $1;
270 my $fqhn = $2;
271
272 if ((-e "$swroot/red/active") && ($proto eq 'http'))
273 {
274 $remote = IO::Socket::INET->new(
275 PeerHost => $fqhn,
276 PeerPort => 'http(80)',
277 Timeout => 1
278 );
279 }
280
281 if ($remote)
282 {
283 print $remote "HEAD $url HTTP/1.0\n";
284 print $remote "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\n";
285 print $remote "Host: $fqhn\n";
286 print $remote "Accept: */*\n\n";
287 while (<$remote>) { push(@response,$_); }
288 close $remote;
289 if ($response[0] =~ /^HTTP\/\d+\.\d+\s\d+\sOK\s*$/)
290 {
291 foreach (@response)
292 {
293 if (/^Content-Length: /i)
294 {
295 s/^Content-Length: //i;
296 $contentlength=$_;
297 }
298 }
299 }
300 }
301 return $contentlength;
302 }
303
304 # -------------------------------------------------------------------
305
306 sub cache_access
307 {
308 my $updsource="UPDCACHE";
309 my $updfile='';
310 my $do_redirect=0;
311
312 $_[0] =~ s@\%2f@/@ig;
313 $updfile = substr($_[0],rindex($_[0],"/")+1);
314
315 if (!-e "$updcachedir/metadata/$updfile")
316 {
317 open(FILE,">$updcachedir/metadata/$updfile");
318 print FILE "$_[0]\n$_[3]\n$sfOutdated\n0\n";
319 close(FILE);
320 }
321
322 if (-e "$updcachedir/$updfile")
323 {
324 open(FILE,">>$updcachedir/metadata/$updfile");
325 print FILE time."\n";
326 close(FILE);
327 $do_redirect=1;
328 }
329 else
330 {
331 $updsource="DLSOURCE";
332 if ((!$passive_mode) && (&diskusage($updcachedir) <= $maxusage) && (&getdownloadsize <= &diskfree($updcachedir)) && (!-e "$updcachedir/download/$updfile"))
333 {
334 system("$nice/var/ipfire/updatexlrator/bin/download $_[0] &");
335 }
336 }
337
338 if ($logging) { &writelog($_[1],$_[2],$_[3],$updsource,$_[0]); }
339
340 return $do_redirect;
341 }
342
343 # -------------------------------------------------------------------