Files
bpfire/config/cfgroot/geoip-functions.pl
Michael Tremer 00793c27c9 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>
2017-11-13 22:37:19 +00:00

121 lines
4.0 KiB
Perl

#!/usr/bin/perl -w
############################################################################
# #
# This file is part of the IPFire Firewall. #
# #
# IPFire is free software; you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation; either version 2 of the License, or #
# (at your option) any later version. #
# #
# IPFire is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with IPFire; if not, write to the Free Software #
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #
# #
# Copyright (C) 2015 IPFire Team <info@ipfire.org>. #
# #
############################################################################
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) = @_;
# Webserver's root dir. (Required for generating full path)
my $webroot = "/srv/web/ipfire/html";
# Directory which contains the flag icons.
my $flagdir = "/images/flags";
# File extension of the country flags.
my $ext = "png";
# Remove whitespaces.
chomp($input);
# Convert given country code to upper case.
my $ccode = uc($input);
# Generate filename, based on the contry code in lower case
# and the defined file extension.
my $file = join('.', $ccode,$ext);
# Generate path inside webroot to the previously generated file.
my $flag_icon = join('/', $flagdir,$file);
# Generate absolute path to the icon file.
my $absolute_path = join('', $webroot,$flag_icon);
# Check if the a icon file exists.
if (-e "$absolute_path") {
# Return content of flag_icon.
return $flag_icon;
} else {
# If no icon for the specified country exists, try to use
# the icon for "unknown".
my $ccode = "unknown";
# Redoing all the stuff from above for the "unknown" icon.
my $file = join('.', $ccode, $ext);
my $flag_icon = join('/', $flagdir, $file);
my $absolute_path = join('', $webroot, $flag_icon);
# Check if the icon is present.
if (-e "$absolute_path") {
# Return "unknown" icon.
return $flag_icon;
}
}
}
# Function to get the county name by a given country code.
sub get_full_country_name($) {
my ($input) = @_;
my $name;
# Remove whitespaces.
chomp($input);
# Convert input into lower case format.
my $code = lc($input);
# Handle country codes which are not in the list.
if ($code eq "a1") { $name = "Anonymous Proxy" }
elsif ($code eq "a2") { $name = "Satellite Provider" }
elsif ($code eq "o1") { $name = "Other Country" }
elsif ($code eq "ap") { $name = "Asia/Pacific Region" }
elsif ($code eq "eu") { $name = "Europe" }
elsif ($code eq "yu") { $name = "Yugoslavia" }
else {
# Use perl built-in module to get the country code.
$name = &Locale::Codes::Country::code2country($code);
}
return $name;
}
1;