NAME

Simple::IPInfo - Get IP/IPList Info (location, as number, etc)

给定IP列表,查对应的区域信息,或AS号

SYNOPSIS

use Simple::IPInfo;
use Data::Dumper;
use utf8;

my $rr_loc = get_ip_loc([ '202.38.64.10', '202.96.196.33' ]);
my $inet_rr_loc = get_ip_loc([ '3395339297', '3391504394' ]);
my $rr_asn = get_ip_as([ '202.38.64.10', '202.96.196.33' ]);
print Dumper($rr_loc, $inet_rr_loc, $rr_asn);

my $arr = [ [qw/202.38.64.10 xxx/], [qw/8.8.8.8 yyy/], ];
my $r = append_table_ipinfo(
    $arr, 
    0,
    write_file => '02.ip_loc.csv', 
    sep => ',', 
    charset         => 'utf8',
    return_arrayref => 1,
    ipinfo_names    => [qw/country prov isp country_code prov_code isp_code/],
    write_head => [qw/ip some country prov isp country_code prov_code isp_code/ ], 
);
print Dumper($r);

DESCRIPTION

default ip as data: ftp://routeviews.org/dnszones/originas.bz2

default ip location data: http://ip.taobao.com

use iso 3166 country_code, subdivision_1 code, isp shortcut name

METHOD

get_ip_loc

get ip location, with country, prov, isp, country_code, prov_code, isp_code

返回IP区域信息,包括国家、省份、运营商,及其英文iso3166编号

my $rr = get_ip_loc([ '202.38.64.10', '202.96.196.33' ]);

# {  
# $ip_a => { country => ... , prov => ..., isp => ..., country_code => ..., prov_code => ..., isp_code => ... }, 
# ...
# }

get_ip_as

get ip as number

返回IP的AS号

my $rr = get_ip_as([ '202.38.64.10', '202.96.196.33' ]);

# {  
# $ip_a => { as => ... }, 
# $ip_b => { as => ... }, 
# }

get_ipinfo

get_ipinfo from some csv file, see also inet_loc.csv

给定IP列表,以及csv文件,返回csv文件提供的IP信息,格式参考inet_loc.csv

my $rr = get_ipinfo([ '202.38.64.10', '202.96.196.33' ], 
    ip_info_file => 'some_ipinfo.csv', 
    use_ip_c => 0, 
);

get_ipc_info

get_ipc_info from ip info hash

指定ip,从已知的ip_c段hash中取出对应的信息

my $r =  get_ipc_info('202.38.64.10', $rr);

append_table_ipinfo

add ipinfo to arrayref

use Simple::IPInfo;
use Data::Dumper;

my $arr = [ [qw/202.38.64.10 xxx/], [qw/8.8.8.8 yyy/], ];

my $r = append_table_ipinfo(
    $arr, 
    0,
    write_file => '02.ip_loc.csv', 
    sep => ',', 
    charset         => 'utf8',
    return_arrayref => 1,
    ipinfo_names    => [qw/country prov isp country_code prov_code isp_code/],
    write_head => [qw/ip some country prov isp country_code prov_code isp_code/ ], 
);
print Dumper($r);

my $inet_arr = [[ '3395339297', 'test'], ['3391504394' , 'ceshi'], ];
my $r = append_table_ipinfo(
    $inet_arr, 
    0,
    write_file => '02.inet_loc.csv', 
    sep => ',', 
    charset         => 'utf8',
    return_arrayref => 1,
    ipinfo_names    => [qw/country prov isp country_code prov_code isp_code/],
    write_head => [qw/inet some country prov isp country_code prov_code isp_code/ ], 
);
print Dumper($r);

ATTR

DEBUG

set $Simple::IPInfo::DEBUG = 1 for more details

BIN

add_ip_info.pl

perl add_ip_info.pl -f xt/02.ip.csv -d xt/02.ip.csv.log -i 0 -t loc -H 1

f : source file 源文件
d : dest file 目标文件
i : ip is in cloumn x, ip在第x列
H : skip head or not,default is 0 (not skip) 默认不跳过首行
t : loc or as, default is loc;添加信息类型,默认是加loc信息,也可指定为as
s : sep character, default is ',' 默认分隔符为逗号

make_inet_from_cidr.pl

make_inet_from_cidr.pl [src_file] [dst_file]

$ pip install csvkit
$ cd xt/data/

$ csvcut -c network,isp,autonomous_system_number isp_cidr.csv > isp_cidr.csv.cut
$ make_inet_from_cidr.pl isp_cidr.csv.cut isp_inet.csv

$ csvcut -c network,geoname_id city_blocks_ipv4.csv > city_blocks_ipv4.csv.cut
$ csvcut -c geoname_id,country_iso_code,subdivision_1_iso_code,country_name,subdivision_1_name city_locations_zh-CN.csv > city_locations_zh-CN.csv.cut
$ csvjoin -c geoname_id city_blocks_ipv4.csv.cut city_locations_zh-CN.csv.cut |csvcut -C geoname_id > city_cidr.csv
$ make_inet_from_cidr.pl city_cidr.csv city_inet.csv

refine_inet.pl

refine_inet.pl [src_file] [dst_file]

src_file's inet is sorted by csvsort

$ csvsort isp_inet.csv > isp_inet.csv.sort
$ refine_inet.pl isp_inet.csv.sort isp_inet.csv.sort.refine

$ csvsort city_inet.csv > city_inet.csv.sort
$ refine_inet.pl city_inet.csv.sort city_inet.csv.sort.refine

merge_inet.pl

merge_inet.pl [src_inet_file1] [src_inet_file2] [dst_merge_file]

$ merge_inet.pl city_inet.csv.sort.refine isp_inet.csv.sort.refine merge_city_isp_inet.csv

XBIN

system need install curl、bunzip2、tar

get ip as data from routeviews.org

perl parse_ip_as.pl 

mv originas.csv inet_as.csv

get ip loc from taobao

1) init data dir, and null csv file

perl init_ip_loc.pl

2) add ask_ip_loc.pl to crontab, for example

*/5 * * * * cd ip_loc_taobao/bin && perl ask_ip_loc.pl >/dev/null 2>&1

3) merge data/*.csv to ip_loc_taobao.csv , get main tidy csv

perl merge_ip_loc.pl

perl tidy_ip_loc.pl ip_loc_taobao.csv ip_loc_taobao.tidy.csv

4) compare with ip_loc_old.csv

#按inet顺序
perl sort_ip_loc.pl ip_loc_old.csv ip_loc_old.sort.csv

perl tidy_ip_loc.pl ip_loc_old.sort.csv ip_loc_old.tidy.csv

perl compare_ip_loc.pl  ip_loc_old.tidy.csv ip_loc_taobao.tidy.csv  ip_loc_compare.csv

5) fix cn ip loc, guess by same as number

perl fix_ip_loc.pl ip_loc_compare.csv  ip_loc_fix.csv

6) merge with fix_cn data

perl compare_ip_loc.pl ip_loc_compare.csv ip_loc_fix.csv ip_loc.csv

7) parse ip_loc.csv, map ipc to inet range

perl parse_ip_loc.pl ip_loc.csv ip_loc_inet.csv

mv ip_loc_inet.csv inet_loc_src.csv

9) rename ip_loc.csv to old

mv ip_loc.csv ip_loc_old.tidy.csv

add iso_3166 code for inet_loc_src.csv

use merge_file.pl from SimpleR::Reshape

inet_loc_src.csv : s, e , country, prov, isp

inet_loc.csv : s, e , country, prov, isp , country_code, prov_code, isp_code

merge_file.pl -f country.csv -k 1 -v 0 -F inet_loc_src.csv -K 2 -o inet_loc.csv.c
merge_file.pl -f country_prov.csv -k 0,3 -v 1 -F inet_loc.csv.c -K 5,3 -o inet_loc.csv.p
merge_file.pl -f country_isp.csv -k 0,3 -v 1 -F inet_loc.csv.p -K 5,4 -o inet_loc.csv
rm inet_loc.csv.c
rm inet_loc.csv.p

AUTHOR

Abby Pan <abbypan@gmail.com>

thanks to Gabor Szabo <szabgab@gmail.com>