]> git.ipfire.org Git - ipfire-2.x.git/blame - config/cfgroot/geoip-functions.pl
geoip-functions.pl: Remove non existing country codes.
[ipfire-2.x.git] / config / cfgroot / geoip-functions.pl
CommitLineData
1dcd8715
SS
1#!/usr/bin/perl -w
2############################################################################
3# #
4# This file is part of the IPFire Firewall. #
5# #
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. #
10# #
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. #
15# #
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 #
19# #
20# Copyright (C) 2015 IPFire Team <info@ipfire.org>. #
21# #
22############################################################################
23
24package GeoIP;
25
8a64d10f 26use Location;
b013822b 27use Locale::Codes::Country;
1dcd8715 28
e34dbea7
SS
29# Hash which contains country codes and their names which are special or not
30# part of ISO 3166-1.
31my %not_iso_3166_location = (
32 "a1" => "Anonymous Proxy",
33 "a2" => "Satellite Provider",
8a64d10f 34 "a3" => "Worldwide Anycast Instance",
e34dbea7
SS
35 "an" => "Netherlands Antilles",
36 "ap" => "Asia/Pacific Region",
37 "eu" => "Europe",
decef80c 38 "fx" => "France, Metropolitan"
e34dbea7
SS
39);
40
8a64d10f 41# Directory where the libloc database and keyfile lives.
a3afe905 42our $location_dir = "/var/lib/location/";
8a64d10f
SS
43
44# Libloc database file.
9b2594d8 45our $database = "$location_dir/database.db";
8a64d10f
SS
46
47# Libloc keyfile to verify the database.
9b2594d8
SS
48our $keyfile = "$location_dir/signing-key.pem";
49
50# Directory which contains the exported databases.
51our $xt_geoip_db_directory = "/usr/share/xt_geoip/";
8a64d10f
SS
52
53#
54## Tiny function to init the location database.
55#
56sub init () {
57 # Init and open the database.
58 my $db = &Location::init($database);
59
60 # Return the database handle.
61 return $db;
62}
00793c27 63
8a64d10f
SS
64#
65## Function to verify the integrity of the location database.
66#
67sub verify ($) {
68 my ($db_handle) = @_;
69
70 # Verify the integrity of the database.
71 if(&Location::verify($db_handle, $keyfile)) {
72 # Success, return "1".
73 return 1;
00793c27
MT
74 }
75
8a64d10f
SS
76 # If we got here, return nothing.
77 return;
78}
79
80#
81## Function to the the country code of a given address.
82#
83sub lookup_country_code($$) {
84 my ($db_handle, $address) = @_;
85
86 # Lookup the given address.
87 my $country_code = &Location::lookup_country_code($db_handle, $address);
88
0ca3baed 89 # Return the name of the country
8a64d10f 90 return $country_code;
00793c27
MT
91}
92
1dcd8715
SS
93# Function to get the flag icon for a specified country code.
94sub get_flag_icon($) {
95 my ($input) = @_;
96
97 # Webserver's root dir. (Required for generating full path)
98 my $webroot = "/srv/web/ipfire/html";
99
100 # Directory which contains the flag icons.
101 my $flagdir = "/images/flags";
102
103 # File extension of the country flags.
104 my $ext = "png";
105
106 # Remove whitespaces.
107 chomp($input);
108
dfbee171
SS
109 # Convert given country code to upper case.
110 my $ccode = uc($input);
1dcd8715
SS
111
112 # Generate filename, based on the contry code in lower case
113 # and the defined file extension.
114 my $file = join('.', $ccode,$ext);
115
116 # Generate path inside webroot to the previously generated file.
117 my $flag_icon = join('/', $flagdir,$file);
118
119 # Generate absolute path to the icon file.
120 my $absolute_path = join('', $webroot,$flag_icon);
121
122 # Check if the a icon file exists.
123 if (-e "$absolute_path") {
124 # Return content of flag_icon.
125 return $flag_icon;
dfbee171
SS
126 } else {
127 # If no icon for the specified country exists, try to use
128 # the icon for "unknown".
129 my $ccode = "unknown";
130
b1ad5b8b
MT
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);
dfbee171
SS
135
136 # Check if the icon is present.
137 if (-e "$absolute_path") {
138 # Return "unknown" icon.
139 return $flag_icon;
140 }
1dcd8715
SS
141 }
142}
143
144# Function to get the county name by a given country code.
145sub get_full_country_name($) {
146 my ($input) = @_;
147 my $name;
148
149 # Remove whitespaces.
150 chomp($input);
151
8a64d10f 152
1dcd8715
SS
153 # Convert input into lower case format.
154 my $code = lc($input);
155
156 # Handle country codes which are not in the list.
e34dbea7
SS
157 if ($not_iso_3166_location{$code}) {
158 # Grab location name from hash.
159 $name = $not_iso_3166_location{$code};
160 } else {
1dcd8715 161 # Use perl built-in module to get the country code.
b013822b 162 $name = &Locale::Codes::Country::code2country($code);
1dcd8715
SS
163 }
164
165 return $name;
166}
167
30c59cbb
SS
168# Function to get all available GeoIP locations.
169sub get_geoip_locations() {
abe21498 170 my @locations = ();
30c59cbb 171
e34dbea7
SS
172 # Get listed country codes from ISO 3166-1.
173 @locations = &Locale::Codes::Country::all_country_codes();
30c59cbb 174
e34dbea7
SS
175 # Add locations from not_iso_3166_locations.
176 foreach my $location (keys %not_iso_3166_location) {
177 push(@locations, $location);
30c59cbb
SS
178 }
179
30c59cbb
SS
180 # Sort locations array in alphabetical order.
181 my @sorted_locations = sort(@locations);
182
183 # Return the array..
184 return @sorted_locations;
185}
186
ec1c5263
SS
187# Function to get the continent code of a given country code.
188sub get_continent_code($$) {
189 my ($db_handle, $ccode) = @_;
190
191 # Omit the continent code.
192 my $continent_code = &Location::get_continent_code($db_handle, $ccode);
193
194 return $continent_code;
195}
196
e758c763
SS
197# Function to flush all exported GeoIP locations.
198sub flush_exported_locations () {
199 # Check if the xt_geoip_db_directory exists.
200 if (-e $xt_geoip_db_directory) {
201 # Perform a direcory listing.
202 opendir (DIR, $xt_geoip_db_directory) or die "Could not open $xt_geoip_db_directory. $!\n";
203
204 # Loop through the files.
205 while (my $file = readdir(DIR)) {
206 # Check if the element is a file.
207 if (-f "$xt_geoip_db_directory/$file") {
208 # Delete it.
209 unlink("$xt_geoip_db_directory/$file");
210 }
211 }
212 }
213}
214
215# Function which calls location-exporter to export a given array
216# of locations.
217sub export_locations (\@) {
218 my @locations = @{ shift() };
219
220 # String to store the given locations and pass it to the exporter tool.
221 my $locations_string;
222
223 # Only export IPv4 addresses.
224 my $family = "--family=ipv4";
225
226 # Specify xt_geoip as output format.
227 my $format = "--format=xt_geoip";
228
229 # Location export command.
230 my @command = ("/usr/bin/location-exporter", "--directory=$xt_geoip_db_directory", "$format", "$family");
231
232 # Check if the export directory exists, otherwise create it.
233 unless (-d $xt_geoip_db_directory) { mkdir $xt_geoip_db_directory };
234
235 # Loop through the array of locations which needs to be exported.
236 foreach my $location (@locations) {
237 # Add location to the command array.
238 push(@command, $location);
239 }
240
241 # Execute location-exporter to export the requested country codes.
242 system(@command) == 0
243 or die "@command failed: $?";
244}
30c59cbb 245
1dcd8715 2461;