]>
git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - config/cfgroot/location-functions.pl
2 ############################################################################
4 # This file is part of the IPFire Firewall. #
6 # IPFire is free software; you can redistribute it and/or modify #
7 # it under the terms of the GNU General Public License as published by #
8 # the Free Software Foundation; either version 2 of the License, or #
9 # (at your option) any later version. #
11 # IPFire is distributed in the hope that it will be useful, #
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
14 # GNU General Public License for more details. #
16 # You should have received a copy of the GNU General Public License #
17 # along with IPFire; if not, write to the Free Software #
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #
20 # Copyright (C) 2015 - 2020 IPFire Team <info@ipfire.org>. #
22 ############################################################################
24 package Location
::Functions
;
27 use Locale
::Codes
::Country
;
29 # Hash which contains country codes and their names which are special or not
31 my %not_iso_3166_location = (
32 "a1" => "Anonymous Proxy",
33 "a2" => "Satellite Provider",
34 "a3" => "Worldwide Anycast Instance",
35 "an" => "Netherlands Antilles",
36 "ap" => "Asia/Pacific Region",
38 "fx" => "France, Metropolitan"
41 # Directory where the libloc database and keyfile lives.
42 our $location_dir = "/var/lib/location/";
44 # Libloc database file.
45 our $database = "$location_dir/database.db";
47 # Libloc keyfile to verify the database.
48 our $keyfile = "$location_dir/signing-key.pem";
50 # Directory which contains the exported databases.
51 our $xt_geoip_db_directory = "/usr/share/xt_geoip/";
54 ## Tiny function to init the location database.
57 # Init and open the database.
58 my $db = &Location
::init
($database);
60 # Return the database handle.
65 ## Function to verify the integrity of the location database.
70 # Verify the integrity of the database.
71 if(&Location
::verify
($db_handle, $keyfile)) {
72 # Success, return "1".
76 # If we got here, return nothing.
81 ## Function to the the country code of a given address.
83 sub lookup_country_code
($$) {
84 my ($db_handle, $address) = @_;
86 # Lookup the given address.
87 my $country_code = &Location
::lookup_country_code
($db_handle, $address);
89 # Return the name of the country
93 # Function to get the flag icon for a specified country code.
94 sub get_flag_icon
($) {
97 # Webserver's root dir. (Required for generating full path)
98 my $webroot = "/srv/web/ipfire/html";
100 # Directory which contains the flag icons.
101 my $flagdir = "/images/flags";
103 # File extension of the country flags.
106 # Remove whitespaces.
109 # Convert given country code to upper case.
110 my $ccode = uc($input);
112 # Generate filename, based on the contry code in lower case
113 # and the defined file extension.
114 my $file = join('.', $ccode,$ext);
116 # Generate path inside webroot to the previously generated file.
117 my $flag_icon = join('/', $flagdir,$file);
119 # Generate absolute path to the icon file.
120 my $absolute_path = join('', $webroot,$flag_icon);
122 # Check if the a icon file exists.
123 if (-e
"$absolute_path") {
124 # Return content of flag_icon.
127 # If no icon for the specified country exists, try to use
128 # the icon for "unknown".
129 my $ccode = "unknown";
131 # Redoing all the stuff from above for the "unknown" icon.
132 my $file = join('.', $ccode, $ext);
133 my $flag_icon = join('/', $flagdir, $file);
134 my $absolute_path = join('', $webroot, $flag_icon);
136 # Check if the icon is present.
137 if (-e
"$absolute_path") {
138 # Return "unknown" icon.
144 # Function to get the county name by a given country code.
145 sub get_full_country_name
($) {
149 # Remove whitespaces.
153 # Convert input into lower case format.
154 my $code = lc($input);
156 # Handle country codes which are not in the list.
157 if ($not_iso_3166_location{$code}) {
158 # Grab location name from hash.
159 $name = $not_iso_3166_location{$code};
161 # Use perl built-in module to get the country code.
162 $name = &Locale
::Codes
::Country
::code2country
($code);
168 # Function to get all available locations.
169 sub get_locations
() {
172 # Get listed country codes from ISO 3166-1.
173 my @locations_lc = &Locale
::Codes
::Country
::all_country_codes
();
175 # The Codes::Country module provides the country codes only in lower case.
176 # So we have to loop over the array and convert them into upper case format.
177 foreach my $ccode (@locations_lc) {
178 # Convert the country code to uppercase.
179 my $ccode_uc = uc($ccode);
181 # Add the converted ccode to the locations array.
182 push(@locations, $ccode_uc);
185 # Add locations from not_iso_3166_locations.
186 foreach my $location (keys %not_iso_3166_location) {
187 # Convert the location into uppercase.
188 my $location_uc = uc($location);
190 # Add the location to the locations array.
191 push(@locations, $location_uc);
194 # Sort locations array in alphabetical order.
195 my @sorted_locations = sort(@locations);
198 return @sorted_locations;