Whois Server list
トップレベルドメイン別、IPアドレス別の参照する Whois サーバのリストを作成する。
トップレベルドメイン別は、IANA Root Zone Database を参照し、TLDごとのサーバを取得して、リストファイル(whois.tlds.list)を作成する。
IPアドレス別は、IANA Number Resources の IPv4 Address Space(XML) と IPv6 Address Space(XML) および JPNICが管理するIPアドレス一覧 からIPアドレスの範囲を取得し、リストファイル(whois.rirs.list)を作成する。
ただし、作りっぱなしで使ってないので、有効利用できるか不明。あと、使う場合は自己責任で、TLDの方はドメインごと(300回近く) IANA にアクセスします(2秒のスリープを入れてますが)。
スクリプトコード
1 |
#!/usr/bin/perl
##### Character-code is UTF-8. Tab-size is 4 space character. #####
###############################################################################
## Remakes Whois list Script - Ver.0.00 (2010/02/03)
###############################################################################
use strict; # restrict unsafe constructs
use warnings; # control optional warnings ( as /usr/bin/perl -w )
use utf8;
########## script configuration ##########
# TLD(Top Level Domain)別 Whois Server.
my $WHOIS_TDLS_LIST_FILE = 'whois.tlds.list';
# IPアドレス(IPv4/IPv6)別 Whois Server.
my $WHOIS_RIRS_LIST_FILE = 'whois.rirs.list';
# JPNIC Whois Server.
my $JPNIC_WHOIS = 'whois.nic.ad.jp';
# APNIC Whois Server.
my $APNIC_WHOIS = 'whois.apnic.net';
# IANA Root Zone Database
my $IANA_ROOT_BASE = 'http://www.iana.org/domains/root/db/';
my $IANA_ROOT_RE = '<td><a href="/domains/root/db/([-0-9a-z.]+)">([^<]+)</a></td>' .
'<td>([^<]+)</td>' . '<td>([^<]+)<br/><span class="tld-table-so">(.*)</span></td>';
my $IANA_TLD_URL_RE = '<b>URL for registration services:</b> <a [^>]+>([^<]+)</a>';
my $IANA_TLD_SEV_RE = '<b>WHOIS Server:</b> ([^<]+)<';
# IPv4 Address Space
my $IANA_IPV4_SPACE = 'http://www.iana.org/assignments/ipv4-address-space/ipv4-address-space.xml';
# IPv6 Address Space
my $IANA_IPV6_SPACE = 'http://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xml';
# JPNIC管理下でAPNICが逆引きの管理を行っているIPv4アドレス一覧
my $APNIC_IPV4_SPACE = 'http://www.nic.ad.jp/ja/dns/ap-addr-block.html';
# JPNICが逆引きの管理を行っているIPv4アドレス一覧
my $JPNIC_IPV4_SPACE = 'http://www.nic.ad.jp/ja/dns/jp-addr-block.html';
# JPNICが管理を行っているIPv6アドレス一覧
my $JPNIC_IPV6_SPACE = 'http://www.nic.ad.jp/ja/dns/ipv6-addr-block.html';
# DEBUG OPT
my $DEBUG = 0;
###############################################################################
use LWP::Simple qw(get);
use XML::Simple qw();
my ($sec, $min, $hour, $mday, $mon, $year, $wDay, $yDay, $isdst) = localtime(time());
my $datestr = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
my %root_list = &get_root_list();
my %ipv4_list = &get_ipv4_space();
my %ipv6_list = &get_ipv6_space();
my @ipv6jp_list = &get_jp_ipv6_space();
my @ipv4jp_list = &get_jp_ipv4_space();
my @ipv4ap_list = &get_ap_ipv4_space();
####################
open(FH, ">:utf8", $WHOIS_TDLS_LIST_FILE) || die("Error: $WHOIS_TDLS_LIST_FILE $!\n");
print FH <<"__END_OF_MESSAGE__";
## Top-Level Domains to Whois Server. ($WHOIS_TDLS_LIST_FILE)
# Last modified : $datestr
#
# This data is created based on the following page.
# - IANA - Root Zone Database
# http://www.iana.org/domains/root/db/
#
__END_OF_MESSAGE__
print FH "\n";
print FH "## generic / sponsored\n";
foreach my $id ( sort keys %root_list ) {
my ($tld, $type, $org, $url, $whois) = @{$root_list{$id}};
next if($type eq 'country-code');
next if($type eq 'test');
print FH "# $org\n";
print FH "# $type, $url\n";
print FH "$tld=$whois\n";
}
print FH "\n";
print FH "## country-code\n";
foreach my $id ( sort keys %root_list ) {
my ($tld, $type, $org, $url, $whois) = @{$root_list{$id}};
next if($type ne 'country-code');
print FH "$tld=$whois # $org, $url\n";
}
print FH "\n";
print FH <<"__END_OF_MESSAGE__";
## End Of File ($WHOIS_TDLS_LIST_FILE)
__END_OF_MESSAGE__
close(FH);
####################
open(FH, ">:utf8", $WHOIS_RIRS_LIST_FILE) || die("Error: $WHOIS_RIRS_LIST_FILE $!\n");
print FH <<"__END_OF_MESSAGE__";
## IPv4/IPv6 Address to Whois Server. ($WHOIS_RIRS_LIST_FILE)
# Last modified : $datestr
#
# This data is created based on the following page.
# - IANA IPv4 Address Space
# http://www.iana.org/assignments/ipv4-address-space/ipv4-address-space.xhtml
# - IANA IPv6 Address Space
# http://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xhtml
#
# - A list of IPv4 addresses that JPNIC manages
# http://www.nic.ad.jp/ja/dns/jp-addr-block.html
# - A list of IPv4 addresses that APNIC manages control of JPNIC.
# http://www.nic.ad.jp/ja/dns/ap-addr-block.html
# - A list of IPv6 addresses that JPNIC manages
# http://www.nic.ad.jp/ja/dns/ipv6-addr-block.html
#
__END_OF_MESSAGE__
print FH "\n";
print FH "## JPNIC to APNIC IPv4\n";
foreach my $prefix ( @ipv4ap_list ) {
print FH "$prefix=$APNIC_WHOIS\n";
}
print FH "\n";
print FH "## JPNIC IPv4\n";
foreach my $prefix ( @ipv4jp_list ) {
print FH "$prefix=$JPNIC_WHOIS\n";
}
print FH "\n";
print FH "## JPNIC IPv6\n";
foreach my $prefix ( @ipv6jp_list ) {
print FH "$prefix=$JPNIC_WHOIS\n";
}
print FH "\n";
print FH "## IANA IPv4\n";
foreach my $id ( sort keys %ipv4_list ) {
my ($prefix, $desc, $date, $whois, $status) = @{$ipv4_list{$id}};
print FH "$prefix=$whois\t# $desc, $status, $date\n";
}
print FH "\n";
print FH "## IANA IPv6\n";
foreach my $id ( sort keys %ipv6_list ) {
my ($prefix, $desc) = @{$ipv6_list{$id}};
print FH "$prefix=\t# $desc\n";
}
print FH "\n";
print FH <<"__END_OF_MESSAGE__";
## End Of File ($WHOIS_RIRS_LIST_FILE)
__END_OF_MESSAGE__
close(FH);
exit;
###############################################################################
sub get_root_list() {
my %list = ();
print "DEBUG : IANA, get index. url=" . $IANA_ROOT_BASE . "\n" if($DEBUG);
my $html = get($IANA_ROOT_BASE);
while ( $html =~ /$IANA_ROOT_RE/go ) {
my ($page, $tld, $type, $org) = ($1, $2, $3, $4);
$org =~ s/\x0D\x0A|\x0D|\x0A//g;
print "DEBUG : IANA, get page. url=" . $IANA_ROOT_BASE . $page . "\n" if($DEBUG);
my ($url, $whois) = get_tld_info($IANA_ROOT_BASE . $page);
$list{ $tld } = [$tld, $type, $org, $url, $whois];
sleep 2;
}
return %list;
}
sub get_tld_info() {
my $page = shift;
my $html = $page ? get($page) : '';
my ($url, $whois) = ('', '');
if ( $html =~ /$IANA_TLD_URL_RE/go ) {
$url = $1;
}
if ( $html =~ /$IANA_TLD_SEV_RE/go ) {
$whois = $1;
}
print "DEBUG : IANA. url=" . $url . " whois=" . $whois . "\n" if($DEBUG);
return ($url, $whois);
}
########################################
sub get_ipv4_space() {
my %list = ();
print "DEBUG : IANA, get page. url=$IANA_IPV4_SPACE\n" if($DEBUG);
my $xml = get($IANA_IPV4_SPACE);
my $xmldata = $xml ? XML::Simple->new()->XMLin( $xml ) : undef;
if ($xmldata){ foreach my $record ( @{$xmldata->{record}} ) {
my $prefix = $record->{prefix} || '';
my $desc = $record->{designation} || '';
my $date = $record->{date} || '';
my $whois = $record->{whois} || '';
my $status = $record->{status} || '';
$list{ $prefix } = [$prefix, $desc, $date, $whois, $status];
}}
return %list;
}
sub get_ipv6_space() {
my %list = ();
print "DEBUG : IANA, get page. url=$IANA_IPV6_SPACE\n" if($DEBUG);
my $xml = get($IANA_IPV6_SPACE);
my $xmldata = $xml ? XML::Simple->new()->XMLin( $xml ) : undef;
if ($xmldata){ foreach my $record ( @{$xmldata->{record}} ) {
my $prefix = $record->{prefix} || '';
my $desc = $record->{description} || '';
$list{ $prefix } = [$prefix, $desc];
}}
return %list;
}
########################################
sub get_jp_ipv6_space() {
my @list = ();
print "DEBUG : IANA, get page. url=$JPNIC_IPV6_SPACE\n" if($DEBUG);
my $html = get($JPNIC_IPV6_SPACE);
while ( $html =~ /([0-9A-Fa-f]{4}(?:\:[0-9A-Fa-f]{4})*\:\:\/[0-9]+)/go ) {
push(@list, $1);
}
return @list;
}
sub get_jp_ipv4_space() {
my @list = ();
print "DEBUG : IANA, get page. url=$JPNIC_IPV4_SPACE\n" if($DEBUG);
my $html = get($JPNIC_IPV4_SPACE);
my $st = undef;
while ( $html =~ /([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})/go ) {
if ( $st ) {
push(@list, $st . '-' . $1);
$st = undef;
} else {
$st = $1;
}
}
return @list;
}
sub get_ap_ipv4_space() {
my @list = ();
print "DEBUG : IANA, get page. url=$APNIC_IPV4_SPACE\n" if($DEBUG);
my $html = get($APNIC_IPV4_SPACE);
my $st = undef;
while ( $html =~ /([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})/go ) {
if ( $st ) {
push(@list, $st . '-' . $1);
$st = undef;
} else {
$st = $1;
}
}
return @list;
}
###############################################################################
## End Of File (remake_list.pl) ##
############################################################################### |
whois.tlds.list サンプル
数があるので適当に抜粋しています。
1 |
## Top-Level Domains to Whois Server. (whois.tlds.list) # Last modified : 2010-02-13 17:20:49 # # This data is created based on the following page. # - IANA - Root Zone Database # http://www.iana.org/domains/root/db/ # ## generic / sponsored # Generic top-level domain .COM=whois.verisign-grs.com # Generic top-level domain .NET=whois.verisign-grs.com # Generic top-level domain .ORG=whois.pir.org ## country-code .JP=whois.jprs.jp # Japan, http://jprs.jp/ ## End Of File (whois.tlds.list) |
whois.rirs.list サンプル
JPNIC管理は例示用のアドレスに書き換えてます。IANAのはローカルとかのみを抜粋しています。
1 |
## IPv4/IPv6 Address to Whois Server. (whois.rirs.list) # Last modified : 2010-02-13 17:20:49 # # This data is created based on the following page. # - IANA IPv4 Address Space # http://www.iana.org/assignments/ipv4-address-space/ipv4-address-space.xhtml # - IANA IPv6 Address Space # http://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xhtml # # - A list of IPv4 addresses that JPNIC manages # http://www.nic.ad.jp/ja/dns/jp-addr-block.html # - A list of IPv4 addresses that APNIC manages control of JPNIC. # http://www.nic.ad.jp/ja/dns/ap-addr-block.html # - A list of IPv6 addresses that JPNIC manages # http://www.nic.ad.jp/ja/dns/ipv6-addr-block.html # ## JPNIC to APNIC IPv4 192.0.2.0-192.0.2.255=whois.apnic.net ## JPNIC IPv4 192.0.2.0-192.0.2.255=whois.nic.ad.jp ## JPNIC IPv6 2001:db8::/32=whois.nic.ad.jp ## IANA IPv4 000/8= # IANA - Local Identification, RESERVED, 1981-09 010/8= # IANA - Private Use, RESERVED, 1995-06 127/8= # IANA - Loopback, RESERVED, 1981-09 ## IANA IPv6 FC00::/7= # Unique Local Unicast FE80::/10= # Link Local Unicast FF00::/8= # Multicast ## End Of File (whois.rirs.list) |
最終更新時間:2010年04月21日 14時51分12秒 指摘や意見などあればSandBoxのBBSへ。
whois_list_remake.pl