GeoIP: Add lookup function for convenience

Instead of opening the database again for each lookup,
we will read it into memory on first use and every lookup
after that will be coming from cache.

Reviewed-by: Peter Müller <peter.mueller@link38.eu>
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
This commit is contained in:
Michael Tremer
2017-11-09 22:32:04 +00:00
parent b1ad5b8b6c
commit 00793c27c9
6 changed files with 28 additions and 22 deletions

View File

@@ -23,8 +23,23 @@
package GeoIP;
use Geo::IP::PurePerl;
use Locale::Codes::Country;
my $database;
sub lookup($) {
my $address = shift;
# Load the database into memory if not already done
if (!$database) {
$database = Geo::IP::PurePerl->new(GEOIP_MEMORY_CACHE);
}
# Return the name of the country
return $database->country_code_by_name($address);
}
# Function to get the flag icon for a specified country code.
sub get_flag_icon($) {
my ($input) = @_;

View File

@@ -60,7 +60,7 @@ foreach my $country (@countries) {
$lines++;
# Convert country code into upper case.
my $country_uc = uc($country);
$country = uc($country);
# Get flag icon for of the country.
my $flag_icon = &GeoIP::get_flag_icon($country);
@@ -69,8 +69,8 @@ foreach my $country (@countries) {
my $name = &GeoIP::get_full_country_name($country);
if ($lines % 2) {
print "<td $col><a id='$country'><img src='$flag_icon' alt='$country_uc' title='$country_uc'/></a></td>";
print "<td $col>$country_uc</td>";
print "<td $col><a id='$country'><img src='$flag_icon' alt='$country' title='$country'/></a></td>";
print "<td $col>$country</td>";
print "<td $col>$name</td></tr>\n";
} else {
$lines2++;
@@ -80,8 +80,8 @@ foreach my $country (@countries) {
$col="style='background-color:${Header::table1colour};'";
}
print "<tr>";
print "<td $col><a id='$country'><img src='$flag_icon' alt='$country_uc' title='$country_uc'/></a></td>";
print "<td $col>$country_uc</td>";
print "<td $col><a id='$country'><img src='$flag_icon' alt='$country' title='$country'/></a></td>";
print "<td $col>$country</td>";
print "<td $col>$name</td>";
print "<td $col>&nbsp;</td>";

View File

@@ -13,7 +13,6 @@
#
use strict;
use Geo::IP::PurePerl;
use Getopt::Std;
# enable only the following on debugging purpose
@@ -352,9 +351,7 @@ foreach $_ (@log)
$srcport=$1 if $packet =~ /SPT=(\d+)/;
$dstport=$1 if $packet =~ /DPT=(\d+)/;
my $gi = Geo::IP::PurePerl->new();
my $ccode = $gi->country_code_by_name($srcaddr);
my $fcode = lc($ccode);
my $ccode = &GeoIP::lookup($srcaddr);
my $servi = uc(getservbyport($srcport, lc($proto)));
if ($servi ne '' && $srcport < 1024) {
@@ -386,10 +383,10 @@ foreach $_ (@log)
END
;
# Get flag icon for of the country.
my $flag_icon = &GeoIP::get_flag_icon($fcode);
my $flag_icon = &GeoIP::get_flag_icon($ccode);
if ( $flag_icon) {
print "<td align='center' $col><a href='../country.cgi#$fcode'><img src='$flag_icon' border='0' align='absmiddle' alt='$ccode'></a></td>";
print "<td align='center' $col><a href='../country.cgi#$ccode'><img src='$flag_icon' border='0' align='absmiddle' alt='$ccode'></a></td>";
} else {
print "<td align='center' $col></td>";
}

View File

@@ -11,7 +11,6 @@
# and Michael Tremer (www.ipfire.org)
use strict;
use Geo::IP::PurePerl;
use Getopt::Std;
# enable only the following on debugging purpose
@@ -287,7 +286,6 @@ print "<p><b>$Lang::tr{'firewall hits'} $longmonthstr $daystr: $lines</b></p>";
my $red_interface = &General::get_red_interface();
my $linesjc = 0;
my %tabjc;
my $gi = Geo::IP::PurePerl->new();
if ($pienumber == -1 || $pienumber > $lines || $sortcolumn == 2) { $pienumber = $lines; };
$lines = 0;
@@ -310,7 +308,7 @@ foreach $_ (@log)
# Traffic from red
if($srcaddr ne '') {
# srcaddr is set
my $ccode = $gi->country_code_by_name($srcaddr);
my $ccode = &GeoIP::lookup($srcaddr);
if ($ccode eq '') {
$ccode = 'unknown';
}

View File

@@ -11,7 +11,6 @@
# and Michael Tremer (www.ipfire.org)
use strict;
use Geo::IP::PurePerl;
use Getopt::Std;
# enable only the following on debugging purpose
@@ -436,9 +435,7 @@ for($s=0;$s<$lines;$s++)
$col="bgcolor='$color{\"color$colorIndex\"}'";
print "<tr>";
my $gi = Geo::IP::PurePerl->new();
my $ccode = $gi->country_code_by_name($key[$s]);
my $fcode = lc($ccode);
my $ccode = &GeoIP::lookup($key[$s]);
$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>";
@@ -448,7 +445,7 @@ for($s=0;$s<$lines;$s++)
my $flag_icon = &GeoIP::get_flag_icon($ccode);
if ( $flag_icon ) {
print "<td align='center' $col><a href='/cgi-bin/country.cgi#$fcode'><img src='$flag_icon' border='0' align='absmiddle' alt='$ccode' title='$ccode'></a></td>";
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>";
}

View File

@@ -13,9 +13,9 @@
#use CGI::Carp 'fatalsToBrowser';
#use strict;
use Geo::IP::PurePerl;
require '/var/ipfire/general-functions.pl';
require "${General::swroot}/geoip-functions.pl";
require "${General::swroot}/lang.pl";
require "${General::swroot}/header.pl";
@@ -152,7 +152,6 @@ if (!(open (FILE,($filestr =~ /.gz$/ ? "gzip -dc $filestr |" : $filestr)))) {
my $lines = 0;
my @log=();
my $country = $cgiparams{country};
my $gi = Geo::IP::PurePerl->new();
if (!$skip)
{
@@ -179,7 +178,7 @@ if (!$skip)
}
elsif($srcaddr ne '') {
# or srcaddr matches country code
my $ccode = $gi->country_code_by_name($srcaddr);
my $ccode = &GeoIP::lookup($srcaddr);
if($ccode eq uc($country)){
$log[$lines] = $_;
$lines++;