]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blame - html/cgi-bin/logs.cgi/urlfilter.dat
urlfilter.dat: change ipcop to ipfire
[people/pmueller/ipfire-2.x.git] / html / cgi-bin / logs.cgi / urlfilter.dat
CommitLineData
10e4f239
MT
1#!/usr/bin/perl
2#
3# SmoothWall CGIs
4#
5# This code is distributed under the terms of the GPL
6#
7# (c) The SmoothWall Team
10e4f239
MT
8#
9# $Id: urlfilter.dat,v 1.4 2005/05/15 00:00:00 marco Exp $
10#
11
12use strict;
13
14# enable only the following on debugging purpose
15#use warnings;
16#use CGI::Carp 'fatalsToBrowser';
17
18use POSIX();
19
20require '/var/ipfire/general-functions.pl';
21require "${General::swroot}/lang.pl";
22require "${General::swroot}/header.pl";
23
f2fdd0c1
CS
24my %color = ();
25my %mainsettings = ();
26&General::readhash("${General::swroot}/main/settings", \%mainsettings);
8186b372 27&General::readhash("/srv/web/ipfire/html/themes/ipfire/include/colors.txt", \%color);
f2fdd0c1 28
10e4f239
MT
29my $dbdir = "${General::swroot}/urlfilter/blacklists";
30my $logdir = "/var/log/squidGuard";
31
32my %cgiparams=();
33my %logsettings=();
34my %filtersettings=();
35my %selected=();
36
37my $errormessage='';
38
39my @log=();
40my $logarch='';
41my $date='';
42my $time='';
43my $pid='';
44my @loginfo=();
45my @ip=();
46my @category=();
47my $dsturl='';
48my $site='';
49my $attr1='';
50my $attr2='';
51
52my $start=0;
53my $prev=0;
54my $next=0;
55my $lines=0;
56my @slice=();
57
58my @then=();
59my @temp=();
60my @temp_then=();
61my @temp_now=();
62my $lastleap='';
63
64my $day='';
65my $daystr='';
66my $month='';
67my $monthstr='';
68my $longmonthstr='';
69my $year='';
70
71my $logday='';
72my $logmonth='';
73my $logyear='';
74
75my @shortmonths = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug',
76 'Sep', 'Oct', 'Nov', 'Dec' );
77my @longmonths = ( $Lang::tr{'january'}, $Lang::tr{'february'}, $Lang::tr{'march'},
78 $Lang::tr{'april'}, $Lang::tr{'may'}, $Lang::tr{'june'}, $Lang::tr{'july'}, $Lang::tr{'august'},
79 $Lang::tr{'september'}, $Lang::tr{'october'}, $Lang::tr{'november'},
80 $Lang::tr{'december'} );
81
82my @now = localtime(time);
83my $doy = $now[7];
84my $tdoy = $now[7];
85my $year = $now[5]+1900;
86
87$cgiparams{'DAY'} = $now[3];
88$cgiparams{'MONTH'} = $now[4];
89$cgiparams{'LOGTYPE'} = 'urlfilter';
90
91&Header::getcgihash(\%cgiparams);
92$logsettings{'LOGVIEW_REVERSE'} = 'off';
93&General::readhash("${General::swroot}/logging/settings", \%logsettings);
94if (-e "${General::swroot}/urlfilter/settings")
95{
96 &General::readhash("${General::swroot}/urlfilter/settings", \%filtersettings);
97}
98
99$now[4] = $cgiparams{'MONTH'}+1;
100if($now[4] < 10) {
101 $now[4] = "0$now[4]"; }
102
103$start = -1;
104
105if ($ENV{'QUERY_STRING'} && $cgiparams{'ACTION'} ne $Lang::tr{'update'})
106{
107 @temp = split(',',$ ENV{'QUERY_STRING'});
108 $start = $temp[0];
109 $cgiparams{'MONTH'} = $temp[1];
66c36198
PM
110 $cgiparams{'DAY'} = $temp[2];
111 $cgiparams{'LOGTYPE'} = $temp[3];
10e4f239
MT
112}
113
114if (!($cgiparams{'MONTH'} =~ /^(0|1|2|3|4|5|6|7|8|9|10|11)$/) ||
115 !($cgiparams{'DAY'} =~ /^(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)$/))
116{
117 $cgiparams{'DAY'} = $now[3];
118 $cgiparams{'MONTH'} = $now[4];
119}
120elsif($cgiparams{'ACTION'} eq '>>')
121{
122 @temp_now = localtime(time);
123 $temp_now[4] = $cgiparams{'MONTH'};
124 $temp_now[3] = $cgiparams{'DAY'};
125 @temp_then = localtime(POSIX::mktime(@temp_now) + 86400);
126 ## Retrieve the same time on the next day -
127 ## 86400 seconds in a day
128 $cgiparams{'MONTH'} = $temp_then[4];
129 $cgiparams{'DAY'} = $temp_then[3];
130}
131elsif($cgiparams{'ACTION'} eq '<<')
132{
133 @temp_now = localtime(time);
134 $temp_now[4] = $cgiparams{'MONTH'};
135 $temp_now[3] = $cgiparams{'DAY'};
136 @temp_then = localtime(POSIX::mktime(@temp_now) - 86400);
137 ## Retrieve the same time on the previous day -
138 ## 86400 seconds in a day
139 $cgiparams{'MONTH'} = $temp_then[4];
140 $cgiparams{'DAY'} = $temp_then[3];
141}
142
143$monthstr = $shortmonths[$cgiparams{'MONTH'}];
144$longmonthstr = $longmonths[$cgiparams{'MONTH'}];
145
146if (($cgiparams{'DAY'} ne $now[3]) || ($cgiparams{'MONTH'} ne $now[4]))
147{
148 @then = ();
149 if ( ( $cgiparams{'MONTH'} eq $now[4]) && ($cgiparams{'DAY'} > $now[3]) ||
150 ( $cgiparams{'MONTH'} > $now[4] ) ) {
151 @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'}, $cgiparams{'MONTH'}, $year - 1901 ));
152 } else {
153 @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'}, $cgiparams{'MONTH'}, $year - 1900 ));
154 }
155 $tdoy = $then[7];
66c36198 156 $lastleap=($year-1)%4;
10e4f239
MT
157 if ($tdoy>$doy) {
158 if ($lastleap == 0 && $tdoy < 60) {
159 $doy=$tdoy+366;
160 } else {
161 $doy=$doy+365;
162 }
163 }
164}
165
166$day = $cgiparams{'DAY'};
167if ($day <= 9) {
168 $daystr = " $day";
169} else {
170 $daystr = $day;
171}
172if ($day < 10) {
173 $day = "0$day";
174}
175
176&processevent;
177
178if ($cgiparams{'ACTION'} eq $Lang::tr{'export'})
179{
180 print "Content-type: text/plain\n\n";
3da3c184 181 print "IPFire URL filter log\r\n";
10e4f239 182 print "Section: $cgiparams{'LOGTYPE'}\r\n";
66c36198 183 print "Date: $daystr $longmonthstr\r\n";
10e4f239
MT
184 print "\r\n";
185
186 if ($logsettings{'LOGVIEW_REVERSE'} eq 'on') { @log = reverse @log; }
187
188 foreach (@log)
189 {
190 ($date,$time,$pid,@loginfo) = split(/ /);
191 @ip = split(/\//,$loginfo[2]);
192 @category = split(/\//,$loginfo[0]);
193 $dsturl = $loginfo[1];
194 $loginfo[3] =~ s/\%5c/\\/;
195 print "$date ";
196 print "$time ";
197 if ($cgiparams{'LOGTYPE'} eq 'squidGuard')
198 {
199 print "$pid ";
200 print "@loginfo";
201 } else {
202 print "$category[1] ";
203 print "$ip[0] ";
204 if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') { print "$loginfo[3] "; }
205 print "$dsturl";
206 print "\n";
207 }
208 }
209
210 exit;
211}
212
213&Header::showhttpheaders();
214
215&Header::openpage($Lang::tr{'urlfilter log viewer'}, 1, '');
216
217&Header::openbigbox('100%', 'left', '', $errormessage);
218
219if ($errormessage) {
220 &Header::openbox('100%', 'left', $Lang::tr{'error messages'});
221 print "<font class='base'>$errormessage&nbsp;</font>\n";
222 &Header::closebox();
223}
224
225&Header::openbox('100%', 'left', "$Lang::tr{'settings'}:");
226
227$selected{'LOGTYPE'}{$cgiparams{'LOGTYPE'}} = "selected='selected'";
228
229print <<END
230<form method='post' action="$ENV{'SCRIPT_NAME'}">
231<table width='100%'>
232<tr>
233 <td width='8%' class='base'>$Lang::tr{'section'}</td>
234 <td width='15%' class='base'>
235 <select name='LOGTYPE' size='1'>
236 <option value='urlfilter' $selected{'LOGTYPE'}{'urlfilter'} = "selected='selected'">$Lang::tr{'urlfilter url filter'}</option>
237 <option value='squidGuard' $selected{'LOGTYPE'}{'squidGuard'} = "selected='selected'">squidGuard</option>
238 </select>
239 </td>
240
241 <td width='8%' class='base'>$Lang::tr{'month'}:</td>
242 <td width='15%'>
243 <select name='MONTH'>
244END
245;
246for ($month = 0; $month < 12; $month++)
247{
248 print "\t<option ";
249 if ($month == $cgiparams{'MONTH'}) {
250 print 'selected="selected" '; }
251 print "value='$month'>$longmonths[$month]</option>\n";
252}
253print <<END
254 </select>
255 </td>
256 <td width='8%' class='base'>$Lang::tr{'day'}:</td>
257 <td width='15%'>
258 <select name='DAY'>
259END
260;
66c36198 261for ($day = 1; $day <= 31; $day++)
10e4f239
MT
262{
263 print "\t<option ";
264 if ($day == $cgiparams{'DAY'}) {
265 print 'selected="selected" '; }
266 print "value='$day'>$day</option>\n";
267}
268print <<END
269 </select>
270 </td>
271 <td width='5%' align='center'><input type='submit' name='ACTION' title='$Lang::tr{'day before'}' value='&lt;&lt;' /></td>
272 <td width='5%' align='center'><input type='submit' name='ACTION' title='$Lang::tr{'day after'}' value='&gt;&gt;' /></td>
273 <td width='10%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'update'}' /></td>
274 <td width='10%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'export'}' /></td>
275</tr>
276</table>
277</form>
278END
279;
280
281&Header::closebox();
282
283&Header::openbox('100%', 'left', $Lang::tr{'log'});
284
285$lines = @log;
286
287if ($start == -1) { $start = $lines - $Header::viewsize; }
288if ($start >= $lines - $Header::viewsize) { $start = $lines - $Header::viewsize; };
289if ($start < 0) { $start = 0; }
290
291$prev = $start - $Header::viewsize;
292$next = $start + $Header::viewsize;
293
294if ($prev < 0) { $prev = 0; }
295if ($next >= $lines) { $next = -1 }
296if ($start == 0) { $prev = -1; }
297
298if ($cgiparams{'LOGTYPE'} eq 'urlfilter')
299{
300 print "<b>$Lang::tr{'urlfilter log summary'} $longmonthstr $daystr: $lines</b><p>\n";
301}
302
303@slice = splice(@log, $start, $Header::viewsize);
304
305if ($logsettings{'LOGVIEW_REVERSE'} eq 'on') { @slice = reverse @slice; }
306
1b18943b
MF
307if ($lines != 0) {
308
309&oldernewer();
310
10e4f239
MT
311if ($lines)
312{
313
314 $lines = 0;
315
fda1f52f 316 print "<table width='100%' class='tbl'>";
10e4f239
MT
317 unless ($cgiparams{'LOGTYPE'} eq 'squidGuard')
318 {
319 print "<tr>\n";
fda1f52f
AM
320 print "<th align='center'><b>$Lang::tr{'urlfilter time'}</b></th>\n";
321 print "<th align='center'><b>$Lang::tr{'urlfilter category'}</b></th>\n";
322 print "<th align='center'><b>$Lang::tr{'urlfilter client'}</b></th>\n";
323 if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') { print "<th align='center'><b>$Lang::tr{'urlfilter username'}</b></th>\n"; }
324 print "<th align='center'><b>$Lang::tr{'urlfilter dst'}</b></th>\n";
10e4f239
MT
325 print "</tr>\n";
326 }
327
fda1f52f 328 my $col="";
10e4f239
MT
329 foreach (@slice)
330 {
331 undef $attr1; undef $attr2;
332 $lines++;
333 ($date,$time,$pid,@loginfo) = split(/ /);
334 @ip = split(/\//,$loginfo[2]);
335 @category = split(/\//,$loginfo[0]);
336 $dsturl = $loginfo[1];
337 $loginfo[3] =~ s/\%5c/\\/;
338 if ($cgiparams{'LOGTYPE'} eq 'squidGuard') {
339 if (@loginfo[0] =~ /squidGuard/) { $attr1 .= "<b>"; $attr2 .= "</b>"; }
340 if (@loginfo[1] =~ /ready/) { $attr1 .= "<b><font color='$Header::colourgreen'>"; $attr2 .= "</font></b>"; }
341 if (@loginfo[2] =~ /emergency/) { $attr1 .= "<b><font color='$Header::colourerr'>"; $attr2 .= "</font></b>"; }
342 print "<tr>\n";
343 } else {
fda1f52f
AM
344 if ($lines % 2) {
345 print "<tr>";
346 $col="bgcolor='$color{'color22'}'";
347 }else {
348 print "<tr>";
349 $col="bgcolor='$color{'color20'}'";
350 }
10e4f239
MT
351 }
352 if ($cgiparams{'LOGTYPE'} eq 'squidGuard') {
fda1f52f 353 print "<td nowrap $col>$time &nbsp; $pid &nbsp; $attr1@loginfo$attr2</td>\n";
10e4f239 354 } else {
fda1f52f
AM
355 print "<td width='10%' align='center' nowrap $col>$time</td>\n";
356 print "<td width='11%' align='center' nowrap $col>$category[1]</td>\n";
357 print "<td width='15%' align='center' nowrap $col>$ip[0]</td>\n";
10e4f239
MT
358 if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on')
359 {
fda1f52f 360 print "<td width='12%' align='center' nowrap $col>$loginfo[3]</td>\n";
10e4f239
MT
361 $site = substr($dsturl,0,55);
362 if (length($dsturl) > 55) { $site .= "..."; }
363 } else {
364 $site = substr($dsturl,0,69);
365 if (length($dsturl) > 69) { $site .= "..."; }
366 }
367 #print "<td>$site</td>\n";
fda1f52f 368 print "<td $col><a href='$dsturl' title='$dsturl' target='_blank'>$site</a></td>\n";
10e4f239
MT
369 }
370 print "</tr>\n";
371 }
372
373 print "</table><br>\n";
374
375}
1b18943b 376}
10e4f239
MT
377&oldernewer();
378
379&Header::closebox();
380
381&Header::closebigbox();
382
383&Header::closepage();
384
385# -------------------------------------------------------------------
386
387sub processevent
388{
389 my $filestr='';
390
391 undef @log;
392 if ($cgiparams{'LOGTYPE'} eq 'squidGuard')
393 {
394 $filestr = "$logdir/squidGuard.log";
395 foreach $logarch (<$filestr.*.gz>)
396 {
397 open (LOG,"gzip -dc $logarch |");
398 foreach (<LOG>) {
399 ($date,$time,$pid,@loginfo) = split(/ /);
400 ($logyear,$logmonth,$logday) = split(/-/,$date);
401 if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) }
402 }
403 close(LOG);
404 }
405 open (LOG,$filestr);
406 foreach (<LOG>) {
407 ($date,$time,$pid,@loginfo) = split(/ /);
408 ($logyear,$logmonth,$logday) = split(/-/,$date);
409 if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) }
410 }
411 close(LOG);
412 } else {
413 foreach $logarch (<$logdir/*.gz>)
414 {
415 if ($logarch !~ /squidGuard\.log/) {
416 open (LOG,"gzip -dc $logarch |");
417 foreach (<LOG>) {
418 ($date,$time,$pid,@loginfo) = split(/ /);
419 ($logyear,$logmonth,$logday) = split(/-/,$date);
420 if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) }
421 }
422 close(LOG);
423 }
424 }
425 foreach $filestr (<$logdir/*.log>)
426 {
427 if ($filestr !~ /squidGuard\.log/) {
428 open (LOG,$filestr);
429 foreach (<LOG>) {
430 ($date,$time,$pid,@loginfo) = split(/ /);
431 ($logyear,$logmonth,$logday) = split(/-/,$date);
432 if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) }
433 }
434 close(LOG);
435 }
436 }
66c36198 437 @log = sort { substr($a,11,8) cmp substr($b,11,8) } @log;
10e4f239
MT
438
439 }
440}
441
442# -------------------------------------------------------------------
443
444sub oldernewer
445{
446 print "<table width='100%'>";
447 print "<tr>";
448
449 print "<td align='center' width='50%'>";
450 if ($prev != -1) {
451 print "<a href='$ENV{'SCRIPT_NAME'}?$prev,$cgiparams{'MONTH'},$cgiparams{'DAY'},$cgiparams{'LOGTYPE'}'>$Lang::tr{'older'}</a>"; }
452 else {
453 print "$Lang::tr{'older'}"; }
454 print "</td>\n";
455
456 print "<td align='center' width='50%'>";
457 if ($next != -1) {
458 print "<a href='$ENV{'SCRIPT_NAME'}?$next,$cgiparams{'MONTH'},$cgiparams{'DAY'},$cgiparams{'LOGTYPE'}'>$Lang::tr{'newer'}</a>"; }
459 else {
460 print "$Lang::tr{'newer'}"; }
461 print "</td>\n";
462
463 print "</tr>";
464 print "</table>";
465}
466
467# -------------------------------------------------------------------