From: Michael Tremer Date: Thu, 9 Nov 2017 22:32:04 +0000 (+0000) Subject: GeoIP: Add lookup function for convenience X-Git-Tag: v2.19-core117~1^2~80 X-Git-Url: http://git.ipfire.org/?p=ipfire-2.x.git;a=commitdiff_plain;h=00793c27c929b68a21c4ef07044fbbb68942a192 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 Signed-off-by: Michael Tremer --- diff --git a/config/cfgroot/geoip-functions.pl b/config/cfgroot/geoip-functions.pl index 623169eaf8..be50d5e142 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 f2ae813009..8df2427a9e 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 "$country_uc"; - print "$country_uc"; + print "$country"; + print "$country"; print "$name\n"; } else { $lines2++; @@ -80,8 +80,8 @@ foreach my $country (@countries) { $col="style='background-color:${Header::table1colour};'"; } print ""; - print "$country_uc"; - print "$country_uc"; + print "$country"; + print "$country"; print "$name"; print " "; diff --git a/html/cgi-bin/logs.cgi/firewalllog.dat b/html/cgi-bin/logs.cgi/firewalllog.dat index 5c9722b852..e67a40a9f5 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 "$ccode"; + print "$ccode"; } else { print ""; } diff --git a/html/cgi-bin/logs.cgi/firewalllogcountry.dat b/html/cgi-bin/logs.cgi/firewalllogcountry.dat index f2b6048f79..949f2599da 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 "

$Lang::tr{'firewall hits'} $longmonthstr $daystr: $lines

"; 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 9e366745de..c73d24fd66 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 ""; - 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 "
"; @@ -448,7 +445,7 @@ for($s=0;$s<$lines;$s++) my $flag_icon = &GeoIP::get_flag_icon($ccode); if ( $flag_icon ) { - print "$ccode"; + print "$ccode"; } else { print ""; } diff --git a/html/cgi-bin/logs.cgi/showrequestfromcountry.dat b/html/cgi-bin/logs.cgi/showrequestfromcountry.dat index b6383ed59b..605873ac00 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++;