#!/usr/bin/perl
use strict;
use warnings;
require Geo::IPfree;
##################################
# CONVERT IPSCOUNTRY.DAT TO TXT #
##################################
my $in_fname = $ARGV[ 0 ] || './ipscountry.dat';
my $out_fname = $ARGV[ 1 ] || './ips-ascii.txt';
if ( !@ARGV || $ARGV[ 0 ] =~ m{^-[h?]}i ) {
print qq`This tool will convert a Geo::IPfree dat file to ASCII.
USAGE: perl $0 ./ipscountry.dat ./ips-ascii.txt
`;
exit;
}
print "Reading ${in_fname} ...\n";
open( my $in_fh, $in_fname ) or die "unable to open '${in_fname}': $!";
my $buffer = '';
sysread( $in_fh, $buffer, 1, length( $buffer ) ) while $buffer !~ m{##start##$}s;
my @IPS;
while ( sysread( $in_fh, $buffer, 7 ) ) {
my $country = substr( $buffer, 0, 2 );
my $iprange = substr( $buffer, 2 );
my $range = Geo::IPfree::baseX2dec( $iprange );
my $ip = Geo::IPfree::nb2ip( $range );
my $ip_prev = Geo::IPfree::nb2ip( $range - 1 );
push( @IPS, $country, $ip, $ip_prev );
}
close( $in_fh );
print "Saving ${out_fname} ...\n";
my @OUT;
for ( my $i = 0; $i <= $#IPS; $i += 3 ) {
my $ct = $IPS[ $i ];
my $ip = $IPS[ $i + 1 ];
my $ipprev = $IPS[ $i - 1 ];
if ( $ip ne '1.0.0.0.0' && $ct =~ /[\w-]{2}/ ) {
push( @OUT, "$ct: $ip $ipprev" );
}
}
open( my $out_fh, '>', $out_fname ) or die "unable to open '${out_fname}': $!";
print $out_fh join( "\n", reverse @OUT );
close( $out_fh );
print "Done.\n";