App-geoip
view release on metacpan or search on metacpan
my $m = $ENV{NO_COLOR} ? "Pod::Text" : "Pod::Text::Color";
my $p = $m->new ();
open my $fh, ">", \my $out;
$p->parse_from_file ($0, $fh);
close $fh;
print $out;
exit 0;
} # pod_text
sub pod_nroff {
first { -x "$_/nroff" } grep { -d } split m/:+/ => $ENV{PATH} or pod_text ();
require Pod::Man;
my $p = Pod::Man->new ();
open my $fh, "|-", "nroff", "-man";
$p->parse_from_file ($0, $fh);
close $fh;
exit 0;
} # pod_nroff
$opt_v >= 7 and _dump ("Configuration", \%conf);
if (@ARGV == 0 and my $eh = $ENV{GEOIP_HOST}) {
$eh =~ s{[\s\r\n]+\z}{};
# No IPv6 support yet
if ($eh =~ m{^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$} and
$1 > 0 && $1 < 256 && $2 < 256 && $3 < 256 && $4 < 256) {
# Simplistic IPv4
push @ARGV => $eh;
}
elsif ($eh =~ m/^\w[-.\w]{0,252}\z/) { # Skip invalid clipboard content
# https://en.wikipedia.org/wiki/Hostname#Syntax
for (split m/\./ => $eh) {
m/^\w[-\w]{0,62}$/ or die "$eh is not a valid hostname or IPv4\n";
}
push @ARGV => $eh;
}
}
my $dbh = do {
my $dsn = $conf{dsn} =~ s{^b=(?=\w+:)}{}ir; # catch -DB=.. instead of --DB=
my $help = $dsn =~ m/^dbi:(\w+):/i
? "Did you forget to install DBD::$1?"
# network,geoname_id,registered_country_geoname_id,represented_country_geoname_id,is_anonymous_proxy,is_satellite_provider
# 1.0.0.0/24,2077456,2077456,,0,0
$dbh->do ("$truncate ipv4");
$dbh->commit;
my $n;
my $sti = $dbh->prepare ("insert into ipv4 values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
csv (in => \$c, headers => "auto", out => undef, on_in => sub {
++$n % 1000 or print STDERR " $n\r";
my $cidr = $_{network};
my @rng = Net::CIDR::cidr2range ($cidr);
my ($f, $t) = split m/\s*-\s*/ => $rng[0];
my ($F, $T) = map { unpack "L>", inet_aton $_ } $f, $t;
my $rec = {
cidr => $cidr,
id => $_{geoname_id} || undef,
ip_from => $f,
ip_to => $t,
ip_from_n => $F,
ip_to_n => $T,
reg_country_id => $_{registered_country_geoname_id} || undef,
rep_country_id => $_{represented_country_geoname_id} || undef,
# network,autonomous_system_number,autonomous_system_organization
# 1.0.0.0/24,13335,"Cloudflare, Inc."
$dbh->do ("$truncate provider");
$dbh->commit;
my $n;
my $sti = $dbh->prepare ("insert into provider values (?, ?, ?, ?, ?, ?, ?)");
csv (in => \$c, headers => "auto", out => undef, on_in => sub {
++$n % 1000 or print STDERR " $n\r";
my $cidr = $_{network};
my @rng = Net::CIDR::cidr2range ($cidr);
my ($f, $t) = split m/\s*-\s*/ => $rng[0];
my ($F, $T) = map { unpack "L>", inet_aton $_ } $f, $t;
my $rec = {
cidr => $cidr,
id => $_{autonomous_system_number} || undef, # All NULL
name => $_{autonomous_system_organization},
ip_from => $f,
ip_to => $t,
ip_from_n => $F,
ip_to_n => $T,
};
# is_satellite_provider,postal_code,latitude,longitude,accuracy_radius
# 1.0.0.0/24,2062391,2077456,,0,0,5412,-34.1551,138.7482,1000
$dbh->do ("$truncate ipc4");
$dbh->commit;
my $n;
my $sti = $dbh->prepare ("insert into ipc4 values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
csv (in => \$c, headers => "auto", out => undef, on_in => sub {
++$n % 1000 or print STDERR " $n\r";
my $cidr = $_{network};
my @rng = Net::CIDR::cidr2range ($cidr);
my ($f, $t) = split m/\s*-\s*/ => $rng[0];
my ($F, $T) = map { unpack "L>", inet_aton $_ } $f, $t;
my $rec = {
cidr => $cidr,
id => $_{geoname_id} || undef,
ip_from => $f,
ip_to => $t,
ip_from_n => $F,
ip_to_n => $T,
reg_country_id => $_{registered_country_geoname_id} || undef,
rep_country_id => $_{represented_country_geoname_id} || undef,
unless (@addr) {
warn "Cannot get the IP for $ip\n";
next;
}
$host = $name;
$ip = inet_ntoa (shift @addr);
$seen{$ip}++;
$seen{$host}++;
push @ARGV, grep { $_ && !$seen{$_}++ }
(map { inet_ntoa $_ } @addr),
split m/\s+/ => $aliases;
}
$found{$ip} and next;
my $in = unpack "L>" => inet_aton ($ip);
#say "Look up $ip ($in) ...";
my $sth = $dbh->prepare ("select * from ipv4 where ip_from_n <= $in and ip_to_n >= $in");
my $stc = $dbh->prepare ("select * from country where id = ?");
my $stC = $dbh->prepare ("select * from city where id = ?");
lib/App/geoip.pm view on Meta::CPAN
my $m = $ENV{NO_COLOR} ? "Pod::Text" : "Pod::Text::Color";
my $p = $m->new ();
open my $fh, ">", \my $out;
$p->parse_from_file ($0, $fh);
close $fh;
print $out;
exit 0;
} # pod_text
sub pod_nroff {
first { -x "$_/nroff" } grep { -d } split m/:+/ => $ENV{PATH} or pod_text ();
require Pod::Man;
my $p = Pod::Man->new ();
open my $fh, "|-", "nroff", "-man";
$p->parse_from_file ($0, $fh);
close $fh;
exit 0;
} # pod_nroff
$opt_v >= 7 and _dump ("Configuration", \%conf);
lib/App/geoip.pm view on Meta::CPAN
if (@ARGV == 0 and my $eh = $ENV{GEOIP_HOST}) {
$eh =~ s{[\s\r\n]+\z}{};
# No IPv6 support yet
if ($eh =~ m{^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$} and
$1 > 0 && $1 < 256 && $2 < 256 && $3 < 256 && $4 < 256) {
# Simplistic IPv4
push @ARGV => $eh;
}
elsif ($eh =~ m/^\w[-.\w]{0,252}\z/) { # Skip invalid clipboard content
# https://en.wikipedia.org/wiki/Hostname#Syntax
for (split m/\./ => $eh) {
m/^\w[-\w]{0,62}$/ or die "$eh is not a valid hostname or IPv4\n";
}
push @ARGV => $eh;
}
}
my $dbh = do {
my $dsn = $conf{dsn} =~ s{^b=(?=\w+:)}{}ir; # catch -DB=.. instead of --DB=
my $help = $dsn =~ m/^dbi:(\w+):/i
? "Did you forget to install DBD::$1?"
lib/App/geoip.pm view on Meta::CPAN
# network,geoname_id,registered_country_geoname_id,represented_country_geoname_id,is_anonymous_proxy,is_satellite_provider
# 1.0.0.0/24,2077456,2077456,,0,0
$dbh->do ("$truncate ipv4");
$dbh->commit;
my $n;
my $sti = $dbh->prepare ("insert into ipv4 values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
csv (in => \$c, headers => "auto", out => undef, on_in => sub {
++$n % 1000 or print STDERR " $n\r";
my $cidr = $_{network};
my @rng = Net::CIDR::cidr2range ($cidr);
my ($f, $t) = split m/\s*-\s*/ => $rng[0];
my ($F, $T) = map { unpack "L>", inet_aton $_ } $f, $t;
my $rec = {
cidr => $cidr,
id => $_{geoname_id} || undef,
ip_from => $f,
ip_to => $t,
ip_from_n => $F,
ip_to_n => $T,
reg_country_id => $_{registered_country_geoname_id} || undef,
rep_country_id => $_{represented_country_geoname_id} || undef,
lib/App/geoip.pm view on Meta::CPAN
# network,autonomous_system_number,autonomous_system_organization
# 1.0.0.0/24,13335,"Cloudflare, Inc."
$dbh->do ("$truncate provider");
$dbh->commit;
my $n;
my $sti = $dbh->prepare ("insert into provider values (?, ?, ?, ?, ?, ?, ?)");
csv (in => \$c, headers => "auto", out => undef, on_in => sub {
++$n % 1000 or print STDERR " $n\r";
my $cidr = $_{network};
my @rng = Net::CIDR::cidr2range ($cidr);
my ($f, $t) = split m/\s*-\s*/ => $rng[0];
my ($F, $T) = map { unpack "L>", inet_aton $_ } $f, $t;
my $rec = {
cidr => $cidr,
id => $_{autonomous_system_number} || undef, # All NULL
name => $_{autonomous_system_organization},
ip_from => $f,
ip_to => $t,
ip_from_n => $F,
ip_to_n => $T,
};
lib/App/geoip.pm view on Meta::CPAN
# is_satellite_provider,postal_code,latitude,longitude,accuracy_radius
# 1.0.0.0/24,2062391,2077456,,0,0,5412,-34.1551,138.7482,1000
$dbh->do ("$truncate ipc4");
$dbh->commit;
my $n;
my $sti = $dbh->prepare ("insert into ipc4 values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
csv (in => \$c, headers => "auto", out => undef, on_in => sub {
++$n % 1000 or print STDERR " $n\r";
my $cidr = $_{network};
my @rng = Net::CIDR::cidr2range ($cidr);
my ($f, $t) = split m/\s*-\s*/ => $rng[0];
my ($F, $T) = map { unpack "L>", inet_aton $_ } $f, $t;
my $rec = {
cidr => $cidr,
id => $_{geoname_id} || undef,
ip_from => $f,
ip_to => $t,
ip_from_n => $F,
ip_to_n => $T,
reg_country_id => $_{registered_country_geoname_id} || undef,
rep_country_id => $_{represented_country_geoname_id} || undef,
lib/App/geoip.pm view on Meta::CPAN
unless (@addr) {
warn "Cannot get the IP for $ip\n";
next;
}
$host = $name;
$ip = inet_ntoa (shift @addr);
$seen{$ip}++;
$seen{$host}++;
push @ARGV, grep { $_ && !$seen{$_}++ }
(map { inet_ntoa $_ } @addr),
split m/\s+/ => $aliases;
}
$found{$ip} and next;
my $in = unpack "L>" => inet_aton ($ip);
#say "Look up $ip ($in) ...";
my $sth = $dbh->prepare ("select * from ipv4 where ip_from_n <= $in and ip_to_n >= $in");
my $stc = $dbh->prepare ("select * from country where id = ?");
my $stC = $dbh->prepare ("select * from city where id = ?");
( run in 1.074 second using v1.01-cache-2.11-cpan-39bf76dae61 )