]>
git.ipfire.org Git - ipfire-2.x.git/blob - config/cfgroot/location-functions.pl
2 ###############################################################################
4 # IPFire.org - A linux based firewall #
5 # Copyright (C) 2007-2020 IPFire Team <info@ipfire.org> #
7 # This program is free software: you can redistribute it and/or modify #
8 # it under the terms of the GNU General Public License as published by #
9 # the Free Software Foundation, either version 2 of the License, or #
10 # (at your option) any later version. #
12 # This program is distributed in the hope that it will be useful, #
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
15 # GNU General Public License for more details. #
17 # You should have received a copy of the GNU General Public License #
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
20 ###############################################################################
22 package Location
::Functions
;
26 # Hash which contains country codes and their names which are special or not
28 my %not_iso_3166_location = (
29 "A1" => "Anonymous Proxy",
30 "A2" => "Satellite Provider",
31 "A3" => "Worldwide Anycast Instance",
34 # Hash which contains possible network flags and their mapped location codes.
36 "LOC_NETWORK_FLAG_ANONYMOUS_PROXY" => "A1",
37 "LOC_NETWORK_FLAG_SATELLITE_PROVIDER" => "A2",
38 "LOC_NETWORK_FLAG_ANYCAST" => "A3",
41 # Array which contains special country codes.
42 my @special_locations = ( "A1", "A2", "A3" );
44 # Directory where the libloc database and keyfile lives.
45 our $location_dir = "/var/lib/location/";
47 # Libloc database file.
48 our $database = "$location_dir/database.db";
50 # Libloc keyfile to verify the database.
51 our $keyfile = "$location_dir/signing-key.pem";
53 # Directory which contains the exported databases.
54 our $xt_geoip_db_directory = "/usr/share/xt_geoip/";
56 # Create libloc database handle.
57 my $db_handle = &init
();
60 ## Tiny function to init the location database.
63 # Init and open the database.
64 my $db = &Location
::init
($database);
66 # Return the database handle.
71 ## Function to verify the integrity of the location database.
76 # Verify the integrity of the database.
77 if(&Location
::verify
($db_handle, $keyfile)) {
78 # Success, return "1".
82 # If we got here, return nothing.
87 ## Function to get the country code of a given address.
89 sub lookup_country_code
($$) {
92 # Lookup the given address.
93 my $country_code = &Location
::lookup_country_code
($db_handle, $address);
95 # Return the name of the country
99 # Function to get the flag icon for a specified country code.
100 sub get_flag_icon
($) {
103 # Webserver's root dir. (Required for generating full path)
104 my $webroot = "/srv/web/ipfire/html";
106 # Directory which contains the flag icons.
107 my $flagdir = "/images/flags";
109 # File extension of the country flags.
112 # Remove whitespaces.
115 # Convert given country code to upper case.
116 my $ccode = uc($input);
118 # Generate filename, based on the contry code in lower case
119 # and the defined file extension.
120 my $file = join('.', $ccode,$ext);
122 # Generate path inside webroot to the previously generated file.
123 my $flag_icon = join('/', $flagdir,$file);
125 # Generate absolute path to the icon file.
126 my $absolute_path = join('', $webroot,$flag_icon);
128 # Check if the a icon file exists.
129 if (-e
"$absolute_path") {
130 # Return content of flag_icon.
133 # If no icon for the specified country exists, try to use
134 # the icon for "unknown".
135 my $ccode = "unknown";
137 # Redoing all the stuff from above for the "unknown" icon.
138 my $file = join('.', $ccode, $ext);
139 my $flag_icon = join('/', $flagdir, $file);
140 my $absolute_path = join('', $webroot, $flag_icon);
142 # Check if the icon is present.
143 if (-e
"$absolute_path") {
144 # Return "unknown" icon.
150 # Function to get the county name by a given country code.
151 sub get_full_country_name
($) {
155 # Remove whitespaces.
158 # Convert input into upper case format.
159 my $code = uc($input);
161 # Handle country codes which are special or not part of the list.
162 if ($not_iso_3166_location{$code}) {
163 # Grab location name from hash.
164 $name = $not_iso_3166_location{$code};
166 # Get the country name by using the location module.
167 $name = &Location
::get_country_name
($db_handle, $code);
173 # Function to get all available locations.
174 sub get_locations
() {
177 # Set default mode to add_special_locations.
178 $mode = $mode ?
$mode : "add_special_locations";
180 # Get locations which are stored in the location database.
181 my @locations = &Location
::database_countries
($db_handle);
183 # Check if the special locations should be added.
184 if ($mode ne "no_special_locations") {
185 # Merge special locations array and the database locations array.
186 @locations = (@special_locations, @locations);
189 # Sort locations array in alphabetical order.
190 my @sorted_locations = sort(@locations);
193 return @sorted_locations;
196 # Function to get the continent code of a given country code.
197 sub get_continent_code
($) {
198 my ($country_code) = @_;
200 # Use location module to grab the continent code.
201 my $continent_code = &Location
::get_continent_code
($db_handle, $country_code);
203 return $continent_code;
206 # Function to check if a given address has one ore more special flags.
207 sub address_has_flags
($) {
210 # Array to store the flags of the address.
213 # Loop through the hash of possible network flags.
214 foreach my $flag (keys(%network_flags)) {
215 # Check if the address has the current flag.
216 if (&Location
::lookup_network_has_flag
($db_handle, $address, $flag)) {
217 # The given address has the requested flag.
219 # Grab the mapped location code for this flag.
220 $mapped_code = $network_flags{$flag};
222 # Add the mapped code to the array of flags.
223 push(@flags, $mapped_code);
227 # Sort the array of flags.
228 @flags = sort(@flags);
230 # Return the array of flags.
235 ## Function to get the Autonomous System Number of a given address.
240 # Lookup the given address.
241 my $asn = &Location
::lookup_asn
($db_handle, $address);
243 # Return the number of the Autonomous System
248 ## Function to get the name of an Autonomous System.
253 # Fetch the name of this AS...
254 my $as_name = &Location
::get_as_name
($db_handle, $asn);
256 # Return the name of the Autonomous System
260 # Custom END declaration which will be executed when perl
261 # ends, to release the database handle to libloc.
263 # Check if a database handle exists.
265 # Destroy libloc database handle.
266 &Location
::DESTROY
($db_handle);