summaryrefslogtreecommitdiffstats
path: root/debian/src/geolite2-to-legacy-csv.sh
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 12:31:56 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 12:31:56 +0000
commit0f8bda193d0dc185420c6196d20fa1d63e8f090f (patch)
tree0252e34cbe37904122165c69df9793761a502985 /debian/src/geolite2-to-legacy-csv.sh
parentAdding upstream version 1.6.12. (diff)
downloadgeoip-0f8bda193d0dc185420c6196d20fa1d63e8f090f.tar.xz
geoip-0f8bda193d0dc185420c6196d20fa1d63e8f090f.zip
Adding debian version 1.6.12-10.debian/1.6.12-10debian
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rwxr-xr-xdebian/src/geolite2-to-legacy-csv.sh99
1 files changed, 99 insertions, 0 deletions
diff --git a/debian/src/geolite2-to-legacy-csv.sh b/debian/src/geolite2-to-legacy-csv.sh
new file mode 100755
index 0000000..4531528
--- /dev/null
+++ b/debian/src/geolite2-to-legacy-csv.sh
@@ -0,0 +1,99 @@
+#!/usr/bin/perl -w
+use strict;
+use diagnostics;
+use NetAddr::IP;
+use Getopt::Long;
+
+my $quiet = 0;
+GetOptions(
+ 'quiet' => \$quiet,
+ ) or die("bad args");
+
+unless(-s "$ARGV[0]"){
+ print STDERR "Specify Country DB to use on the command line.\n";
+ exit 1;
+}
+
+# Prime country data with additional continent codes
+# http://download.geonames.org/export/dump/readme.txt
+my $countryinfo;
+$countryinfo->{'6255146'}->{'code'} = 'AF';
+$countryinfo->{'6255146'}->{'name'} = 'Africa';
+$countryinfo->{'6255147'}->{'code'} = 'AS';
+$countryinfo->{'6255147'}->{'name'} = 'Asia';
+$countryinfo->{'6255148'}->{'code'} = 'EU';
+$countryinfo->{'6255148'}->{'name'} = 'Europe';
+$countryinfo->{'6255149'}->{'code'} = 'NA';
+$countryinfo->{'6255149'}->{'name'} = 'North America';
+$countryinfo->{'6255150'}->{'code'} = 'SA';
+$countryinfo->{'6255150'}->{'name'} = 'South America';
+$countryinfo->{'6255151'}->{'code'} = 'OC';
+$countryinfo->{'6255151'}->{'name'} = 'Oceania';
+$countryinfo->{'6255152'}->{'code'} = 'AN';
+$countryinfo->{'6255152'}->{'name'} = 'Antarctica';
+
+# Read the countryinfo file
+open my $fh_in, "<", "$ARGV[0]" or die "Can't open $ARGV[0]: $!\n";
+foreach my $line (<$fh_in>){
+ chomp $line;
+ next if ($line =~ /^#/);
+ my @fields = (split "\t", $line);
+ my $code = $fields[0];
+ my $name = $fields[4];
+ my $id = $fields[16];
+ $countryinfo->{$id}->{'code'} = $code;
+ $countryinfo->{$id}->{'name'} = $name;
+}
+close $fh_in;
+
+# Convert actual GeoLite2 data from STDIN
+my $counter;
+foreach my $line (<STDIN>){
+ next unless ($line =~ /^\d/);
+ chomp $line;
+ $counter++;
+ my @fields = (split ",", $line);
+ my $network = $fields[0];
+ my $geoname_id = $fields[1];
+ my $registered_country_geoname_id = $fields[2];
+ my $represented_country_geoname_id = $fields[3];
+ my $is_anonymous_proxy = $fields[4];
+ my $is_satellite_provider = $fields[5];
+ my $ip = NetAddr::IP->new($network);
+ my $start_ip = $ip->canon();
+ my $end_ip = $ip->broadcast();
+ my $start_int = $ip->bigint();
+ my $end_int = $end_ip->bigint();
+ my $code;
+ my $name;
+ if ($is_anonymous_proxy){
+ $code = "A1";
+ $name = "Anonymous Proxy";
+ }elsif ($is_satellite_provider){
+ $code = "A2";
+ $name = "Satellite Provider";
+ }elsif($countryinfo->{$geoname_id}){
+ $code = $countryinfo->{$geoname_id}->{'code'};
+ $name = $countryinfo->{$geoname_id}->{'name'};
+ }elsif($countryinfo->{$represented_country_geoname_id}){
+ $code = $countryinfo->{$represented_country_geoname_id}->{'code'};
+ $name = $countryinfo->{$represented_country_geoname_id}->{'name'};
+ }elsif($countryinfo->{$registered_country_geoname_id}){
+ $code = $countryinfo->{$registered_country_geoname_id}->{'code'};
+ $name = $countryinfo->{$registered_country_geoname_id}->{'name'};
+ }else{
+ print STDERR "Unknown Geoname ID, panicking. This is a bug.\n";
+ print STDERR "ID: $geoname_id\n";
+ print STDERR "ID Registered: $registered_country_geoname_id\n";
+ print STDERR "ID Represented $represented_country_geoname_id\n";
+ exit 1;
+ }
+
+ # Legacy GeoIP listing format:
+ # "1.0.0.0","1.0.0.255","16777216","16777471","AU","Australia"
+ printf "\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\"\n",
+ $start_ip, $end_ip->canon(), $start_int, $end_int, $code, $name;
+ if (!$quiet && $counter % 10000 == 0) {
+ print STDERR "$counter\n";
+ }
+}