#!/usr/bin/perl # # SmoothWall CGIs # # This code is distributed under the terms of the GPL # # (c) The SmoothWall Team # # $Id: urlfilter.dat,v 1.4 2005/05/15 00:00:00 marco Exp $ # use strict; # enable only the following on debugging purpose #use warnings; #use CGI::Carp 'fatalsToBrowser'; use POSIX(); require '/var/ipfire/general-functions.pl'; require "${General::swroot}/lang.pl"; require "${General::swroot}/header.pl"; my %color = (); my %mainsettings = (); &General::readhash("${General::swroot}/main/settings", \%mainsettings); &General::readhash("/srv/web/ipfire/html/themes/ipfire/include/colors.txt", \%color); my $dbdir = "${General::swroot}/urlfilter/blacklists"; my $logdir = "/var/log/squidGuard"; my %cgiparams=(); my %logsettings=(); my %filtersettings=(); my %selected=(); my $errormessage=''; my @log=(); my $logarch=''; my $date=''; my $time=''; my $pid=''; my @loginfo=(); my @ip=(); my @category=(); my $dsturl=''; my $site=''; my $attr1=''; my $attr2=''; my $start=0; my $prev=0; my $next=0; my $lines=0; my @slice=(); my @then=(); my @temp=(); my @temp_then=(); my @temp_now=(); my $lastleap=''; my $day=''; my $daystr=''; my $month=''; my $monthstr=''; my $longmonthstr=''; my $year=''; my $logday=''; my $logmonth=''; my $logyear=''; my @shortmonths = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ); my @longmonths = ( $Lang::tr{'january'}, $Lang::tr{'february'}, $Lang::tr{'march'}, $Lang::tr{'april'}, $Lang::tr{'may'}, $Lang::tr{'june'}, $Lang::tr{'july'}, $Lang::tr{'august'}, $Lang::tr{'september'}, $Lang::tr{'october'}, $Lang::tr{'november'}, $Lang::tr{'december'} ); my @now = localtime(time); my $doy = $now[7]; my $tdoy = $now[7]; my $year = $now[5]+1900; $cgiparams{'DAY'} = $now[3]; $cgiparams{'MONTH'} = $now[4]; $cgiparams{'LOGTYPE'} = 'urlfilter'; &Header::getcgihash(\%cgiparams); $logsettings{'LOGVIEW_REVERSE'} = 'off'; &General::readhash("${General::swroot}/logging/settings", \%logsettings); if (-e "${General::swroot}/urlfilter/settings") { &General::readhash("${General::swroot}/urlfilter/settings", \%filtersettings); } $now[4] = $cgiparams{'MONTH'}+1; if($now[4] < 10) { $now[4] = "0$now[4]"; } $start = -1; if ($ENV{'QUERY_STRING'} && $cgiparams{'ACTION'} ne $Lang::tr{'update'}) { @temp = split(',',$ ENV{'QUERY_STRING'}); $start = $temp[0]; $cgiparams{'MONTH'} = $temp[1]; $cgiparams{'DAY'} = $temp[2]; $cgiparams{'LOGTYPE'} = $temp[3]; } if (!($cgiparams{'MONTH'} =~ /^(0|1|2|3|4|5|6|7|8|9|10|11)$/) || !($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)$/)) { $cgiparams{'DAY'} = $now[3]; $cgiparams{'MONTH'} = $now[4]; } elsif($cgiparams{'ACTION'} eq '>>') { @temp_now = localtime(time); $temp_now[4] = $cgiparams{'MONTH'}; $temp_now[3] = $cgiparams{'DAY'}; @temp_then = localtime(POSIX::mktime(@temp_now) + 86400); ## Retrieve the same time on the next day - ## 86400 seconds in a day $cgiparams{'MONTH'} = $temp_then[4]; $cgiparams{'DAY'} = $temp_then[3]; } elsif($cgiparams{'ACTION'} eq '<<') { @temp_now = localtime(time); $temp_now[4] = $cgiparams{'MONTH'}; $temp_now[3] = $cgiparams{'DAY'}; @temp_then = localtime(POSIX::mktime(@temp_now) - 86400); ## Retrieve the same time on the previous day - ## 86400 seconds in a day $cgiparams{'MONTH'} = $temp_then[4]; $cgiparams{'DAY'} = $temp_then[3]; } $monthstr = $shortmonths[$cgiparams{'MONTH'}]; $longmonthstr = $longmonths[$cgiparams{'MONTH'}]; if (($cgiparams{'DAY'} ne $now[3]) || ($cgiparams{'MONTH'} ne $now[4])) { @then = (); if ( ( $cgiparams{'MONTH'} eq $now[4]) && ($cgiparams{'DAY'} > $now[3]) || ( $cgiparams{'MONTH'} > $now[4] ) ) { @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'}, $cgiparams{'MONTH'}, $year - 1901 )); } else { @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'}, $cgiparams{'MONTH'}, $year - 1900 )); } $tdoy = $then[7]; $lastleap=($year-1)%4; if ($tdoy>$doy) { if ($lastleap == 0 && $tdoy < 60) { $doy=$tdoy+366; } else { $doy=$doy+365; } } } $day = $cgiparams{'DAY'}; if ($day <= 9) { $daystr = " $day"; } else { $daystr = $day; } if ($day < 10) { $day = "0$day"; } &processevent; if ($cgiparams{'ACTION'} eq $Lang::tr{'export'}) { print "Content-type: text/plain\n\n"; print "IPFire URL filter log\r\n"; print "Section: $cgiparams{'LOGTYPE'}\r\n"; print "Date: $daystr $longmonthstr\r\n"; print "\r\n"; if ($logsettings{'LOGVIEW_REVERSE'} eq 'on') { @log = reverse @log; } foreach (@log) { ($date,$time,$pid,@loginfo) = split(/ /); @ip = split(/\//,$loginfo[2]); @category = split(/\//,$loginfo[0]); $dsturl = $loginfo[1]; $loginfo[3] =~ s/\%5c/\\/; print "$date "; print "$time "; if ($cgiparams{'LOGTYPE'} eq 'squidGuard') { print "$pid "; print "@loginfo"; } else { print "$category[1] "; print "$ip[0] "; if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') { print "$loginfo[3] "; } print "$dsturl"; print "\n"; } } exit; } &Header::showhttpheaders(); &Header::openpage($Lang::tr{'urlfilter log viewer'}, 1, ''); &Header::openbigbox('100%', 'left', '', $errormessage); if ($errormessage) { &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); print "$errormessage \n"; &Header::closebox(); } &Header::openbox('100%', 'left', "$Lang::tr{'settings'}:"); $selected{'LOGTYPE'}{$cgiparams{'LOGTYPE'}} = "selected='selected'"; print <
$Lang::tr{'section'} $Lang::tr{'month'}: $Lang::tr{'day'}:
END ; &Header::closebox(); &Header::openbox('100%', 'left', $Lang::tr{'log'}); $lines = @log; if ($start == -1) { $start = $lines - $Header::viewsize; } if ($start >= $lines - $Header::viewsize) { $start = $lines - $Header::viewsize; }; if ($start < 0) { $start = 0; } $prev = $start - $Header::viewsize; $next = $start + $Header::viewsize; if ($prev < 0) { $prev = 0; } if ($next >= $lines) { $next = -1 } if ($start == 0) { $prev = -1; } if ($cgiparams{'LOGTYPE'} eq 'urlfilter') { print "$Lang::tr{'urlfilter log summary'} $longmonthstr $daystr: $lines

\n"; } @slice = splice(@log, $start, $Header::viewsize); if ($logsettings{'LOGVIEW_REVERSE'} eq 'on') { @slice = reverse @slice; } if ($lines != 0) { &oldernewer(); if ($lines) { $lines = 0; print ""; unless ($cgiparams{'LOGTYPE'} eq 'squidGuard') { print "\n"; print "\n"; print "\n"; print "\n"; if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') { print "\n"; } print "\n"; print "\n"; } my $col=""; foreach (@slice) { undef $attr1; undef $attr2; $lines++; ($date,$time,$pid,@loginfo) = split(/ /); @ip = split(/\//,$loginfo[2]); @category = split(/\//,$loginfo[0]); $dsturl = $loginfo[1]; $loginfo[3] =~ s/\%5c/\\/; if ($cgiparams{'LOGTYPE'} eq 'squidGuard') { if (@loginfo[0] =~ /squidGuard/) { $attr1 .= ""; $attr2 .= ""; } if (@loginfo[1] =~ /ready/) { $attr1 .= ""; $attr2 .= ""; } if (@loginfo[2] =~ /emergency/) { $attr1 .= ""; $attr2 .= ""; } print "\n"; } else { if ($lines % 2) { print ""; $col="bgcolor='$color{'color22'}'"; }else { print ""; $col="bgcolor='$color{'color20'}'"; } } if ($cgiparams{'LOGTYPE'} eq 'squidGuard') { print "\n"; } else { print "\n"; print "\n"; print "\n"; if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') { print "\n"; $site = substr($dsturl,0,55); if (length($dsturl) > 55) { $site .= "..."; } } else { $site = substr($dsturl,0,69); if (length($dsturl) > 69) { $site .= "..."; } } #print "\n"; print "\n"; } print "\n"; } print "
$Lang::tr{'urlfilter time'}$Lang::tr{'urlfilter category'}$Lang::tr{'urlfilter client'}$Lang::tr{'urlfilter username'}$Lang::tr{'urlfilter dst'}
$time   $pid   $attr1@loginfo$attr2$time$category[1]$ip[0]$loginfo[3]$site$site

\n"; } } &oldernewer(); &Header::closebox(); &Header::closebigbox(); &Header::closepage(); # ------------------------------------------------------------------- sub processevent { my $filestr=''; undef @log; if ($cgiparams{'LOGTYPE'} eq 'squidGuard') { $filestr = "$logdir/squidGuard.log"; foreach $logarch (<$filestr.*.gz>) { open (LOG,"gzip -dc $logarch |"); foreach () { ($date,$time,$pid,@loginfo) = split(/ /); ($logyear,$logmonth,$logday) = split(/-/,$date); if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) } } close(LOG); } open (LOG,$filestr); foreach () { ($date,$time,$pid,@loginfo) = split(/ /); ($logyear,$logmonth,$logday) = split(/-/,$date); if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) } } close(LOG); } else { foreach $logarch (<$logdir/*.gz>) { if ($logarch !~ /squidGuard\.log/) { open (LOG,"gzip -dc $logarch |"); foreach () { ($date,$time,$pid,@loginfo) = split(/ /); ($logyear,$logmonth,$logday) = split(/-/,$date); if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) } } close(LOG); } } foreach $filestr (<$logdir/*.log>) { if ($filestr !~ /squidGuard\.log/) { open (LOG,$filestr); foreach () { ($date,$time,$pid,@loginfo) = split(/ /); ($logyear,$logmonth,$logday) = split(/-/,$date); if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) } } close(LOG); } } @log = sort { substr($a,11,8) cmp substr($b,11,8) } @log; } } # ------------------------------------------------------------------- sub oldernewer { print ""; print ""; print "\n"; print "\n"; print ""; print "
"; if ($prev != -1) { print "$Lang::tr{'older'}"; } else { print "$Lang::tr{'older'}"; } print ""; if ($next != -1) { print "$Lang::tr{'newer'}"; } else { print "$Lang::tr{'newer'}"; } print "
"; } # -------------------------------------------------------------------