# page inspired from the initial firewalllog.dat
#
# Modified for IPFire by Christian Schmidt
-# and Michael Tremer (www.ipfire.org)
+# and Michael Tremer (www.ipfire.org)
use strict;
-use Geo::IP::PurePerl;
use Getopt::Std;
# enable only the following on debugging purpose
#use CGI::Carp 'fatalsToBrowser';
require '/var/ipfire/general-functions.pl';
+require "${General::swroot}/geoip-functions.pl";
require "${General::swroot}/lang.pl";
require "${General::swroot}/header.pl";
use POSIX();
-#workaround to suppress a warning when a variable is used only once
-my @dummy = ( ${Header::table2colour} );
-undef (@dummy);
-
my %cgiparams=();
my %settings=();
my $pienumber;
if ($cgiparams{'ACTION'} eq $Lang::tr{'save'})
{
- &General::writehash("${General::swroot}/fwlogs/ipsettings", \%settings);
+ &General::writehash("${General::swroot}/fwlogs/ipsettings", \%settings);
}
my $start = -1;
}
elsif($cgiparams{'ACTION'} eq '>>')
{
- my @temp_then=();
- my @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];
+ my @temp_then=();
+ my @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 '<<')
{
- my @temp_then=();
- my @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];
+ my @temp_then=();
+ my @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];
}
if (($cgiparams{'DAY'} ne $now[3]) || ($cgiparams{'MONTH'} ne $now[4]))
{
- my @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];
- my $lastleap=($year-1)%4;
- if ($tdoy>$doy) {
- if ($lastleap == 0 && $tdoy < 60) {
- $doy=$tdoy+366;
- } else {
- $doy=$doy+365;
- }
- }
+ my @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];
+ my $lastleap=($year-1)%4;
+ if ($tdoy>$doy) {
+ if ($lastleap == 0 && $tdoy < 60) {
+ $doy=$tdoy+366;
+ } else {
+ $doy=$doy+365;
+ }
+ }
}
my $datediff=0;
my $dowd=0;
my $multifile=0;
if ($tdoy ne $doy) {
- $datediff=int(($doy-$tdoy)/7);
- $dowd=($doy-$tdoy)%7;
- if (($dow-$dowd)<1) {
- $datediff=$datediff+1;
- }
- if (($dow-$dowd)==0) {
- $multifile=1;
- }
+ $datediff=int(($doy-$tdoy)/7);
+ $dowd=($doy-$tdoy)%7;
+ if (($dow-$dowd)<1) {
+ $datediff=$datediff+1;
+ }
+ if (($dow-$dowd)==0) {
+ $multifile=1;
+ }
}
my $monthstr = $shortmonths[$cgiparams{'MONTH'}];
my $skip=0;
my $filestr='';
if ($datediff==0) {
- $filestr="/var/log/messages";
+ $filestr="/var/log/messages";
} else {
$filestr="/var/log/messages.$datediff";
$filestr = "$filestr.gz" if -f "$filestr.gz";
}
if (!(open (FILE,($filestr =~ /.gz$/ ? "gzip -dc $filestr |" : $filestr)))) {
- $errormessage = "$Lang::tr{'date not in logs'}: $filestr $Lang::tr{'could not be opened'}";
- $skip=1;
- # Note: This is in case the log does not exist for that date
+ $errormessage = "$Lang::tr{'date not in logs'}: $filestr $Lang::tr{'could not be opened'}";
+ $skip=1;
+ # Note: This is in case the log does not exist for that date
}
my $lines = 0;
my @log=();
if (!$skip)
{
- while (<FILE>)
- {
- if (/(^${monthstr} ${daystr} ..:..:..) [\w\-]+ kernel:.*(IN=.*)$/) {
+ while (<FILE>)
+ {
+ if (/(^${monthstr} ${daystr} ..:..:..) [\w\-]+ kernel:.*(IN=.*)$/) {
$log[$lines] = $_;
$lines++;
}
}
- close (FILE);
+ close (FILE);
}
$skip=0;
if ($multifile) {
- $datediff=$datediff-1;
- if ($datediff==0) {
- $filestr="/var/log/messages";
- } else {
- $filestr="/var/log/messages.$datediff";
- $filestr = "$filestr.gz" if -f "$filestr.gz";
- }
- if (!(open (FILE,($filestr =~ /.gz$/ ? "gzip -dc $filestr |" : $filestr)))) {
- $errormessage="$Lang::tr{'date not in logs'}: $filestr $Lang::tr{'could not be opened'}";
- $skip=1;
- }
- if (!$skip) {
+ $datediff=$datediff-1;
+ if ($datediff==0) {
+ $filestr="/var/log/messages";
+ } else {
+ $filestr="/var/log/messages.$datediff";
+ $filestr = "$filestr.gz" if -f "$filestr.gz";
+ }
+ if (!(open (FILE,($filestr =~ /.gz$/ ? "gzip -dc $filestr |" : $filestr)))) {
+ $errormessage="$Lang::tr{'date not in logs'}: $filestr $Lang::tr{'could not be opened'}";
+ $skip=1;
+ }
+ if (!$skip) {
while (<FILE>) {
- if (/(^${monthstr} ${daystr} ..:..:..) [\w\-]+ kernel:.*(IN=.*)$/) {
+ if (/(^${monthstr} ${daystr} ..:..:..) [\w\-]+ kernel:.*(IN=.*)$/) {
$log[$lines] = $_;
$lines++;
}
my $MODNAME="fwlogs";
&Header::showhttpheaders();
-&Header::openpage($Lang::tr{'firewall log'}, 1, '');
+&Header::openpage($Lang::tr{'firewall log ip'}, 1, '');
&Header::openbigbox('100%', 'left', '', $errormessage);
&Header::closebox();
}
-&Header::openbox('100%', 'left', "$Lang::tr{'settings'}:");
+&Header::openbox('100%', 'left', "$Lang::tr{'settings'}");
print <<END
<form method='post' action='$ENV{'SCRIPT_NAME'}'>
{
print "\t<option ";
if ($month == $cgiparams{'MONTH'}) {
- print "selected='selected' "; }
+ print "selected='selected' ";
+ }
print "value='$month'>$longmonths[$month]</option>\n";
}
print <<END
{
print "\t<option ";
if ($day == $cgiparams{'DAY'}) {
- print "selected='selected' "; }
+ print "selected='selected' ";
+ }
print "value='$day'>$day</option>\n";
}
</td>
<td width='5%' align='center'><input type='submit' name='ACTION' title='$Lang::tr{'day before'}' value='<<' /></td>
<td width='5%' align='center'><input type='submit' name='ACTION' title='$Lang::tr{'day after'}' value='>>' /></td>
-<td width='20%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'update'}' /></td>
+<td width='20%' align='right'><input type='submit' name='ACTION' value='$Lang::tr{'update'}' /></td>
+</tr>
+<tr>
+ <td colspan='3' align='left' valign="left">$Lang::tr{'Number of IPs for the pie chart'}:</td>
+ <td colspan='3' align='left' valign="center"><input type='text' name='pienumber' value='$pienumber' size='4'></td>
+ <td align='right'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' /></td>
</tr>
</table>
-<table width='100%'>
-<tr><td width='20%' align='right' valign="center">$Lang::tr{'Number of IPs for the pie chart'}:</td>
- <td width='10%' align='left' valign="center"><input type='text' name='pienumber' value='$pienumber' size='4'></td>
- <td width='20%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' /></td></tr>
- </table>
- </form>
+</form>
END
;
&Header::closebox();
-&Header::openbox('100%', 'left', 'Firewall Logs');
+&Header::openbox('100%', 'left', $Lang::tr{'firewall graph ip'});
print "<p><b>$Lang::tr{'firewall hits'} $longmonthstr $daystr: $lines</b></p>";
my $linesjc = 0;
$lines = 0;
foreach $_ (@log)
{
- if($_ =~ /SRC\=([\d\.]+)/){
- $tabjc{$1} = $tabjc{$1} + 1 ;
- if(($tabjc{$1} == 1) && ($lines < $pienumber)) { $lines = $lines + 1; }
- $linesjc++;
- }
+ # Extract ipv4 or ipv6 address
+ if (($_ =~ /SRC\=(([\d]{1,3})(\.([\d]{1,3})){3})/) or ($_ =~ /SRC\=(([0-9a-fA-F]{0,4})(\:([0-9a-fA-F]{0,4})){2,7})/)) {
+ $tabjc{$1} = $tabjc{$1} + 1 ;
+ if(($tabjc{$1} == 1) && ($lines < $pienumber)) { $lines = $lines + 1; }
+ $linesjc++;
+ }
}
$pienumber = $lines;
if ($sortcolumn == 1)
{
for ($v=0;$v<$pienumber;$v++){
- findkey($tabjc2[$v]);
+ findkey($tabjc2[$v]);
}
}
else
{
foreach $v (@tabjc2) {
- $key[$indice] = $v;
- $value[$indice] = $tabjc{$v};
- $indice++;
+ $key[$indice] = $v;
+ $value[$indice] = $tabjc{$v};
+ $indice++;
}
}
else{
my $numothers;
for($o=0;$o<$pienumber;$o++){
- $numothers = $numothers + $numb[$o];
+ $numothers = $numothers + $numb[$o];
}
$numothers = $linesjc - $numothers;
if ($numothers > 0) {
my @data = (\@ips,\@numb);
use GD::Graph::colour qw( :files );
-GD::Graph::colour::read_rgb( "/srv/web/ipfire/cgi-bin/logs.cgi/colours.txt" );
+
+my $color=0;
+my %color = ();
+my %mainsettings = ();
+&General::readhash("${General::swroot}/main/settings", \%mainsettings);
+&General::readhash("/srv/web/ipfire/html/themes/".$mainsettings{'THEME'}."/include/colors.txt", \%color);
if ($showpie != 2 && $pienumber <= 50 && $pienumber != 0) {
my $mygraph = GD::Graph::pie->new(500, 350);
'title' => '',
'pie_height' => 50,
'start_angle' => 89
- ) or warn $mygraph->error;
+ ) or warn $mygraph->error;
$mygraph->set_value_font(GD::gdMediumBoldFont);
- $mygraph->set( dclrs => [ "colour1" , "colour2" , "colour3" , "colour4" , "colour5" , "colour6" , "colour7" , "colour8" , "colour9" , "colour10" ] );
+ $mygraph->set( dclrs => [ "$color{'color1'}" , "$color{'color2'}" , "$color{'color3'}" , "$color{'color4'}" , "$color{'color5'}" , "$color{'color6'}" , "$color{'color7'}" , "$color{'color8'}" , "$color{'color9'}" , "$color{'color10'}" ] );
my $myimage = $mygraph->plot(\@data) or die $mygraph->error;
my @filenames = glob("/srv/web/ipfire/html/graphs/fwlog-ip*.png");
print FILE $myimage->png;
close(FILE);
#####################################################
- print "<table align='center'><tr><td>";
+ print "<div style='text-align:center'>";
print "<img src='/graphs/fwlog-ip$imagerandom.png'>";
- print "</td></tr></table>";
+ print "</div>";
}
print <<END
-<TABLE WIDTH='100%'>
-<TR>
-<TD WIDTH='10%' ALIGN='CENTER' CLASS='boldbase'></TD>
-<TD WIDTH='30%' ALIGN='CENTER' CLASS='boldbase'><B>IP</B></TD>
-<TD WIDTH='10%' ALIGN='CENTER' CLASS='boldbase'><B>Flag</B></TD>
-<TD WIDTH='10%' ALIGN='CENTER' CLASS='boldbase'><B>Count</B></TD>
-<TD WIDTH='30%' ALIGN='CENTER' CLASS='boldbase'><B>Percent</B></TD>
-</TR>
+<table width='100%' class='tbl'>
+<tr>
+<th width='10%' align='center' class='boldbase'></th>
+<th width='30%' align='center' class='boldbase'><b>$Lang::tr{'ip address'}</b></th>
+<th width='10%' align='center' class='boldbase'><b>$Lang::tr{'country'}</b></th>
+<th width='10%' align='center' class='boldbase'><b>$Lang::tr{'count'}</b></th>
+<th width='30%' align='center' class='boldbase'><b>$Lang::tr{'percentage'}</b></th>
+</tr>
END
;
my $total=0;
my $show=0;
-my @colour;
-my $colour1;
-my $colour2;
-my $colour3;
-my $colour4;
-my $colour5;
-my $colour6;
-my $colour7;
-my $colour8;
-my $colour9;
-my $colour10;
-
-@colour = GD::Graph::colour::_rgb("colour1");
-$colour1 = GD::Graph::colour::rgb2hex($colour[0], $colour[1], $colour[2]);
-@colour = GD::Graph::colour::_rgb("colour2");
-$colour2 = GD::Graph::colour::rgb2hex($colour[0], $colour[1], $colour[2]);
-@colour = GD::Graph::colour::_rgb("colour3");
-$colour3 = GD::Graph::colour::rgb2hex($colour[0], $colour[1], $colour[2]);
-@colour = GD::Graph::colour::_rgb("colour4");
-$colour4 = GD::Graph::colour::rgb2hex($colour[0], $colour[1], $colour[2]);
-@colour = GD::Graph::colour::_rgb("colour5");
-$colour5 = GD::Graph::colour::rgb2hex($colour[0], $colour[1], $colour[2]);
-@colour = GD::Graph::colour::_rgb("colour6");
-$colour6 = GD::Graph::colour::rgb2hex($colour[0], $colour[1], $colour[2]);
-@colour = GD::Graph::colour::_rgb("colour7");
-$colour7 = GD::Graph::colour::rgb2hex($colour[0], $colour[1], $colour[2]);
-@colour = GD::Graph::colour::_rgb("colour8");
-$colour8 = GD::Graph::colour::rgb2hex($colour[0], $colour[1], $colour[2]);
-@colour = GD::Graph::colour::_rgb("colour9");
-$colour9 = GD::Graph::colour::rgb2hex($colour[0], $colour[1], $colour[2]);
-@colour = GD::Graph::colour::_rgb("colour10");
-$colour10 = GD::Graph::colour::rgb2hex($colour[0], $colour[1], $colour[2]);
my $s;
my $percent;
+my $col="";
+
for($s=0;$s<$lines;$s++)
{
- $show++;
- $percent = $value[$s] * 100 / $linesjc;
- $percent = sprintf("%.3f", $percent);
- $total = $total + $value[$s];
- if ( ($colour % 10) == 1 ){print "<TR BGCOLOR='$colour1'>\n";}
- if ( ($colour % 10) == 2 ){print "<TR BGCOLOR='$colour2'>\n";}
- if ( ($colour % 10) == 3 ){print "<TR BGCOLOR='$colour3'>\n";}
- if ( ($colour % 10) == 4 ){print "<TR BGCOLOR='$colour4'>\n";}
- if ( ($colour % 10) == 5 ){print "<TR BGCOLOR='$colour5'>\n";}
- if ( ($colour % 10) == 6 ){print "<TR BGCOLOR='$colour6'>\n";}
- if ( ($colour % 10) == 7 ){print "<TR BGCOLOR='$colour7'>\n";}
- if ( ($colour % 10) == 8 ){print "<TR BGCOLOR='$colour8'>\n";}
- if ( ($colour % 10) == 9 ){print "<TR BGCOLOR='$colour9'>\n";}
- if ( ($colour % 10) == 0 ){print "<TR BGCOLOR='$colour10'>\n";}
+ $show++;
+ $percent = $value[$s] * 100 / $linesjc;
+ $percent = sprintf("%.f", $percent);
+ $total = $total + $value[$s];
+ # colors are numbered 1 to 10
+ my $colorIndex = ($color % 10) + 1;
+ $col="bgcolor='$color{\"color$colorIndex\"}'";
+ print "<tr>";
+
+ my $ccode = &GeoIP::lookup($key[$s]);
- my $gi = Geo::IP::PurePerl->new();
- my $ccode = $gi->country_code_by_name($key[$s]);
- my $fcode = lc($ccode);
-
- $colour++;
- print "<TD ALIGN='CENTER'><form method='post' action='showrequestfromip.dat'><input type='hidden' name='MONTH' value='$cgiparams{'MONTH'}'> <input type='hidden' name='DAY' value='$cgiparams{'DAY'}'> <input type='hidden' name='ip' value='$key[$s]'> <input type='submit' value='details'></form></TD>";
- print "<TD ALIGN='CENTER'><a href='/cgi-bin/ipinfo.cgi?ip=$key[$s]'>$key[$s]</a></TD>";
- print "<TD ALIGN='CENTER'><a href='/cgi-bin/country.cgi#$fcode'><img src='/images/flags/$fcode.png' border='0' align='absmiddle' alt='$ccode'></a></TD>";
- print "<TD ALIGN='CENTER'>$value[$s]</TD>";
- print "<TD ALIGN='CENTER'>$percent</TD>";
- print "</TR>";
+ $color++;
+ print "<td align='center' $col><form method='post' action='showrequestfromip.dat'><input type='hidden' name='MONTH' value='$cgiparams{'MONTH'}'> <input type='hidden' name='DAY' value='$cgiparams{'DAY'}'> <input type='hidden' name='ip' value='$key[$s]'> <input type='submit' value='$Lang::tr{'details'}'></form></td>";
+ print "<td align='center' $col><a href='/cgi-bin/ipinfo.cgi?ip=$key[$s]'>$key[$s]</a></td>";
+
+ # Get flag icon for of the country.
+ my $flag_icon = &GeoIP::get_flag_icon($ccode);
+
+ if ( $flag_icon ) {
+ print "<td align='center' $col><a href='/cgi-bin/country.cgi#$ccode'><img src='$flag_icon' border='0' align='absmiddle' alt='$ccode' title='$ccode'></a></td>";
+ } else {
+ print "<td align='center' $col></td>";
+ }
+
+ print "<td align='center' $col>$value[$s]</td>";
+ print "<td align='center' $col>$percent</td>";
+ print "</tr>";
}
if($cgiparams{'otherspie'} == 2 ){}
else{
-if ( ($colour % 10) == 1 ){print "<TR BGCOLOR='$colour1'>\n";}
-if ( ($colour % 10) == 2 ){print "<TR BGCOLOR='$colour2'>\n";}
-if ( ($colour % 10) == 3 ){print "<TR BGCOLOR='$colour3'>\n";}
-if ( ($colour % 10) == 4 ){print "<TR BGCOLOR='$colour4'>\n";}
-if ( ($colour % 10) == 5 ){print "<TR BGCOLOR='$colour5'>\n";}
-if ( ($colour % 10) == 6 ){print "<TR BGCOLOR='$colour6'>\n";}
-if ( ($colour % 10) == 7 ){print "<TR BGCOLOR='$colour7'>\n";}
-if ( ($colour % 10) == 8 ){print "<TR BGCOLOR='$colour8'>\n";}
-if ( ($colour % 10) == 9 ){print "<TR BGCOLOR='$colour9'>\n";}
-if ( ($colour % 10) == 0 ){print "<TR BGCOLOR='$colour10'>\n";}
-
-my $dif;
-$dif = $linesjc - $total;
-$percent = $dif * 100 / $linesjc;
-$percent = sprintf("%.3f", $percent);
-print <<END
-<TD ALIGN='CENTER'></TD>
-<TD ALIGN='CENTER'>$Lang::tr{'otherip'}</TD>
-<TD ALIGN='CENTER'></TD>
-<TD ALIGN='CENTER'>$dif</TD>
-<TD ALIGN='CENTER'>$percent</TD>
-</TR>
+ # colors are numbered 1 to 10
+ my $colorIndex = ($color % 10) + 1;
+ $col="bgcolor='$color{\"color$colorIndex\"}'";
+ print "<tr>";
+
+ if ( $linesjc ne "0")
+ {
+ my $dif;
+ $dif = $linesjc - $total;
+ $percent = $dif * 100 / $linesjc;
+ $percent = sprintf("%.f", $percent);
+ print <<END
+ <td align='center' $col></td>
+ <td align='center' $col>$Lang::tr{'otherip'}</td>
+ <td align='center' $col></td>
+ <td align='center' $col>$dif</td>
+ <td align='center' $col>$percent</td>
+ </tr>
END
-;
+ ;
+ }
}
print <<END
-</TABLE>
+</table>
END
;
&Header::closebox();
-
&Header::closebigbox();
-
&Header::closepage();
sub findkey {
- my $v;
- foreach $v (@keytabjc) {
- if ($tabjc{$v} eq $_[0]) {
- delete $tabjc{$v};
- $key[$indice] = "$v";
- $value[$indice] = $_[0];
- $indice++;
- last;
- }
- }
-}sub checkversion {
+ my $v;
+ foreach $v (@keytabjc) {
+ if ($tabjc{$v} eq $_[0]) {
+ delete $tabjc{$v};
+ $key[$indice] = "$v";
+ $value[$indice] = $_[0];
+ $indice++;
+ last;
+ }
+ }
+}
+
+sub checkversion {
#Automatic Updates is disabled
return "0","0";
- }
+}
+