[2/2] GeoIP: Add lookup function for convenience

Message ID 20171109223204.14213-2-michael.tremer@ipfire.org
State Accepted
Commit 00793c27c929b68a21c4ef07044fbbb68942a192
Headers show
Series [1/2] geoip-functions.pl: Fix typos and formatting | expand

Commit Message

Michael Tremer Nov. 10, 2017, 9:32 a.m. UTC
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

Peter Müller Nov. 12, 2017, 11:27 p.m. UTC | #1
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>&nbsp;</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++;

Patch

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>&nbsp;</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++;