[2/2] GeoIP: Add lookup function for convenience
Commit Message
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.
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
---
config/cfgroot/geoip-functions.pl | 15 +++++++++++++++
html/cgi-bin/country.cgi | 10 +++++-----
html/cgi-bin/logs.cgi/firewalllog.dat | 9 +++------
html/cgi-bin/logs.cgi/firewalllogcountry.dat | 4 +---
html/cgi-bin/logs.cgi/firewalllogip.dat | 7 ++-----
html/cgi-bin/logs.cgi/showrequestfromcountry.dat | 5 ++---
6 files changed, 28 insertions(+), 22 deletions(-)
Comments
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.
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
Reviewed-by: Peter Müller <peter.mueller@link38.eu>
---
config/cfgroot/geoip-functions.pl | 15 +++++++++++++++
html/cgi-bin/country.cgi | 10 +++++-----
html/cgi-bin/logs.cgi/firewalllog.dat | 9 +++------
html/cgi-bin/logs.cgi/firewalllogcountry.dat | 4 +---
html/cgi-bin/logs.cgi/firewalllogip.dat | 7 ++-----
html/cgi-bin/logs.cgi/showrequestfromcountry.dat | 5 ++---
6 files changed, 28 insertions(+), 22 deletions(-)
diff --git a/config/cfgroot/geoip-functions.pl b/config/cfgroot/geoip-functions.pl
index 623169eaf..be50d5e14 100644
--- a/config/cfgroot/geoip-functions.pl
+++ b/config/cfgroot/geoip-functions.pl
@@ -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) = @_;
diff --git a/html/cgi-bin/country.cgi b/html/cgi-bin/country.cgi
index f2ae81300..8df2427a9 100644
--- a/html/cgi-bin/country.cgi
+++ b/html/cgi-bin/country.cgi
@@ -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> </td>";
diff --git a/html/cgi-bin/logs.cgi/firewalllog.dat b/html/cgi-bin/logs.cgi/firewalllog.dat
index 5c9722b85..e67a40a9f 100644
--- a/html/cgi-bin/logs.cgi/firewalllog.dat
+++ b/html/cgi-bin/logs.cgi/firewalllog.dat
@@ -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>";
}
diff --git a/html/cgi-bin/logs.cgi/firewalllogcountry.dat b/html/cgi-bin/logs.cgi/firewalllogcountry.dat
index f2b6048f7..949f2599d 100644
--- a/html/cgi-bin/logs.cgi/firewalllogcountry.dat
+++ b/html/cgi-bin/logs.cgi/firewalllogcountry.dat
@@ -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';
}
diff --git a/html/cgi-bin/logs.cgi/firewalllogip.dat b/html/cgi-bin/logs.cgi/firewalllogip.dat
index 9e366745d..c73d24fd6 100644
--- a/html/cgi-bin/logs.cgi/firewalllogip.dat
+++ b/html/cgi-bin/logs.cgi/firewalllogip.dat
@@ -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>";
}
diff --git a/html/cgi-bin/logs.cgi/showrequestfromcountry.dat b/html/cgi-bin/logs.cgi/showrequestfromcountry.dat
index b6383ed59..605873ac0 100644
--- a/html/cgi-bin/logs.cgi/showrequestfromcountry.dat
+++ b/html/cgi-bin/logs.cgi/showrequestfromcountry.dat
@@ -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++;
@@ -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) = @_;
@@ -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> </td>";
@@ -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>";
}
@@ -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';
}
@@ -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>";
}
@@ -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++;