#!/usr/local/bin/perl
#!D:/Perl/bin/perl.exe
#---------------------------------------------------------------------------------
# imWHOISデータ自動更新プログラム(IO::Socketモジュール使用例)
# URL:http://whois.sakaguch.com/ 電子メール:http://whois.sakaguch.com/cgi/postmail/ より送信して下さい。
# ファイル名:MakeImWhoisList.pl 2004.01.02 作成:鷹の巣
# 参考URL:サブルーチン内に記載有り。
#---------------------------------------------------------------------------------
# 改版記録:
# 2004.01.02 Rev.1.000 初版で公開。
# 2004.02.01 Rev.1.010 ccTLDのWebページの途中改行対策を実施。
$ver = 'MakeImWhoisList.pl Rev.1.010(作成:鷹の巣 http://whois.sakaguch.com/)';
#---------------------------------------------------------------------------------
# 1.用途
#
# このPerlスクリプトは、フリーソフトです。詳細は、項4をご一読願います。
#
# このPerlスクリプトは、imWHOISで使用する煩雑なデータファイルを
# 公式ページよりダウンロードして自動更新します。
#
# ※注意
# 作成されるファイル名は、tld_a.listとrirs_a.listで、
# オリジナルとファイル名が異なります。
# ご使用される場合は、必ずim_whois.confの再設定を行なって下さい。
#
# tld_a.listファイルは、tld.listと完全に互換性がありますので、
# そのまま差し替えてご使用出来ます。
#
# rirs_a.listファイルをご使用されますと、JPNICのwhoisデータベースを
# 検索しなくなります。
# rirs_a.listファイルをご使用して、JPNICのwhoisデータベースを検索させるには、
# このrirs_a.listファイル内に記載されている様に
# im_whois.cgi ver1.05のスクリプトを一部変更する必要があります。
# 改造方法も含めた詳細は、以下のURLをご参照願います。
# http://whois.sakaguch.com/SetImWhoisKai.html
#
#
#---------------------------------------------------------------------------------
# 2.作成されるファイルの表示例と特徴
#
# 作成されたtld_a.listとrirs_a.listファイル例を以下のURLで公開しています。
# http://whois.sakaguch.com/DownLoad/tld_a.list.txt
# http://whois.sakaguch.com/DownLoad/rirs_a.list.txt
#
# ○利点:imWHOISのデータの更新が容易。それ以外は何もありません。
#
# ○欠点:アジア/太平洋州管理のIPアドレスの場合は、必ず
# JPNIC管理のIPアドレスかどうか問合せを行なうので、多少処理に時間がかかる。
# また、im_whois.cgiのスクリプトを一部変更する必要がある。
#
# このスクリプトは、HEADメソッドを使用してLast-Modified(更新日)を判断せずに、
# 最初からGETメソッドを使用するため、処理に時間がかかる。
# スクリプトの読みやすさに重点を置いているので、処理速度が多少、遅い。
#
#---------------------------------------------------------------------------------
# 3.ご注意事項
#
# このスクリプトは、Windows XP HOME Edition
# Active Perl 5.8.4.810 built for MSWin32-x86-multi-thread
# の環境のコマンドプロンプト画面にて、動作確認を行っております。
#
# このスクリプトに対するご質問や不具合がございましたら、電子メールで、
# webmaster@whois.sakaguch.com まで、お寄せ下さい。
# また、「鷹の巣」の自宅サーバー掲示板
# http://sakaguch.com/cgi/bbs/
# にご投稿して頂いても結構です。
#
# このPerlスクリプトは、鷹の巣が個人的に作成しました。
# CGI倶楽部さんとは、全く関係がありませんので、
# お問合せは、必ず、上記の掲示板の方に御願い致します。
#
#---------------------------------------------------------------------------------
# 4.著作権
#
# このスクリプトは、鷹の巣が作成しましたが、著作権は放棄しています。
# スクリプトの再配布や改造は自由ですが、無償として下さい。
# いかなる目的であっても、このスクリプトに付加価値をつけて、
# 有償配布してはなりません。
#
#---------------------------------------------------------------------------------
# 5.起動方法
#
# 基本設定部分を変更し、コマンドラインから、
# perl MakeImWhoisList.pl
# を実施すれば、基本設定部分に記載された場所に
# tld_a.listとirs_a.listファイルが生成されます。
#
#---------------------------------------------------------------------------------
#■□■ 基本設定 ■□■
$file_rirs = 'D:\WWW\cgilib\whois\rirs_a.list'; # imWHOISのrirs.listの絶対パス表記ファイル名
$file_tld = 'D:\WWW\cgilib\whois\tld_a.list'; # imWHOISのtld.listの絶対パス表記ファイル名
#■□■ 基本設定終わり ■□■
$url_IPv4 = 'http://www.iana.org/assignments/ipv4-address-space';# INTERNET PROTOCOL V4 ADDRESS SPACEのURL
$url_gTLD = 'http://www.iana.org/gtld/gtld.htm'; # gTLDのURL
$url_TLD = 'http://www.iana.org/cctld/cctld-whois.htm'; # TLDのURL
$http_version = '1.1'; # HTTPプロトコル(Hypertext Transfer Protocol)の改版番号
$timeout = 60; # 接続待ち許容時間(秒)
%comment = ( # gTLDの説明部分の定義
".aero" , "Air-transport" ,
".biz" , "Businesses" ,
".com" , "Commercial" ,
".coop" , "Cooperatives" ,
".edu" , "Educational" ,
".gov" , "Government(US)" ,
".info" , "Unrestricted" ,
".int" , "International" ,
".mil" , "Military(US)" ,
".museum" , "Museums" ,
".name" , "Individuals" ,
".net" , "Network" ,
".org" , "Organizations" ,
".pro" , "Professional"
);
use IO::Socket; # IO::Socketモジュールを使用
&main(); # perlで、URLを閲覧
exit;
#----------#
# 主回路 #
#----------#
sub main {
# 改版番号の表示
print "$ver\n\n";
open ( OUT , "> $file_rirs" ) || die("Can't open in $file_rirs");
$rirs = &header_rirs ; print "$rirs\n"; print OUT "$rirs\n";
# IPv4のWebページを読込み、IPアドレスブロックとwhoisデータベース名を書出す。
my @rcv_data = &get( $url_IPv4 , $http_version , $timeout );
foreach (@rcv_data) {
chomp ( $_ );
if ( $_ =~ /(\d{3}\/\d)(.+)/isg ) {
my $rirs = $1 ; my $other = $2 ; $rirs =~ s/(^00|^0)//;
if ( $other =~ /(.+)\(whois\.(.+)\)/isg ) {
$rirs .= ",whois.$2";
} else {
$rirs .= ",whois.arin.net";
}
print "$rirs\n"; print OUT "$rirs\n";
}
}
close ( OUT );
print "\n\n\n\n\n";
open ( OUT , "> $file_tld" ) || die("Can't open in $file_tld");
$tld = &header_tld ; print "$tld\n"; print OUT "$tld\n";
# gTLDのWebページを読込み、ドメイン名とwhoisデータベース名と説明とURLを書出す。
my @rcv_data = &get( $url_gTLD , $http_version , $timeout );
$url_gTLD =~ /(http:)?(\/\/)?([^:\/]*)?(:([0-9]+))?(\/.*)?/; $base_url = 'http://' . $3;
@html_link_data = &make_link_line ( \@rcv_data ); # 途中改行対策を追加 2004.02.01
foreach ( @html_link_data ) {
if ( $_ =~ /(.+) domain<\/a>/isg ) {
$url = $1 ; $domain = $2; $contry = $comment { $domain };
( $url_reg , $whois_server ) = &get_whois_server ( $base_url . $url , $http_version , $timeout );
$tld = "$domain,$whois_server,$contry,$url_reg";
print "$tld\n"; print OUT "$tld\n";
}
}
# ccTLDのWebページを読込み、ドメイン名とwhoisデータベース名と説明とURLを書出す。
my @rcv_data = &get( $url_TLD , $http_version , $timeout );
$url_TLD =~ /(http:)?(\/\/)?([^:\/]*)?(:([0-9]+))?(\/.*)?/; $base_url = 'http://' . $3;
@html_link_data = &make_link_line ( \@rcv_data ); # 途中改行対策を追加 2004.02.01
foreach ( @html_link_data ) {
if ( $_ =~ /(.+) (.+)<\/A>/isg ) {
$url = $1 ; $domain = $2; $contry = $3;
( $url_reg , $whois_server ) = &get_whois_server ( $base_url . $url , $http_version , $timeout );
$tld = "$domain,$whois_server,$contry,$url_reg";
print "$tld\n"; print OUT "$tld\n";
}
}
close ( OUT );
}
#---------------------------------#
# リンクを含む行を1行にまとめる #
#---------------------------------#
# 途中改行対策を追加 2004.02.01
sub make_link_line {
my ( $html_ref ) = @_;
my ( $i , $line );
my @new = ();
for ( $i = 0; $i < $#{$html_ref}; $i++ ) {
$line = @{$html_ref}[$i]; chomp($line);
$line =~ s/^[ \t]+/ /g; # 先頭行の半角空白とタブ文字を半角空白1個に置換する。
$line =~ s/[\r\n]+//g; # 改行コードを削除。
if ( $line =~ /(.*)(0 ){ @new[$#new] .= $line; } # ハイパーリンクを含まなければ、前行末尾に追加
}
}
return @new;
}
#---------------------------------#
# whois説明ページのデータ読込み #
#---------------------------------#
sub get_whois_server {
my ( $url , $http_version , $timeout ) = @_; # 引数0:URI、引数1:HTTPプロトコルのバージョン、引数2:接続待ち許容時間(秒)
my @rcv_data = &get ( $base_url . $1 , $http_version , $timeout );# $urlに設定したURLのWebページを標準出力(HTTPクライアント)
my $url_reg = ""; my $whois_server = "";
foreach (@rcv_data) {
chomp ( $_ );
if ( $_ =~ /URL for registration services/isg ) {
if ( $_ =~ /(.+)<\/a>/isg ) { $url_reg = $1; }
}
if ( $_ =~ /Whois server/isg ) {
if ( $_ =~ /<\/u>:<\/b> (.+)<\/font><\/p>/isg ) {
if ( $1 ne 'None listed.' ) { $whois_server = $1; }
}
}
}
return ( $url_reg , $whois_server );
}
#---------------------#
# Webページの読込み #
#---------------------#
sub get {
# Webページ表示チェックプログラムその2(IO::Socketモジュール使用例)
# SOCKEThttp2.pl 2002.08.17 作成:鷹の巣 http://whois.sakaguch.com/
# 参考URL
# 説明が豊富なURL:http://x68000.q-e-d.net/~68user/net/http-2.html
# 説明が豊富なURL:http://ash.or.jp/perl/socket_http.htm
my ($url, $http_version, $timeout) = @_;# 引数0:URI、引数1:HTTPプロトコルのバージョン、引数2:接続待ち許容時間(秒)
$url =~ /(http:)?(\/\/)?([^:\/]*)?(:([0-9]+))?(\/.*)?/;
my $host = $3; if ($host eq "") {$host = 'localhost';}
my $port = $5; if ($port eq "") {$port = 80;} # HTTPプロトコルgetservbyname('http','tcp')は80。
my $path = $6; if ($path eq "") {$path = '/';}
my @rcv_data = (); # 戻り値を初期化。
my $SOCKET = IO::Socket::INET -> new(PeerAddr => $host, # HTTPプロトコルでWWWサーバーへ接続する
PeerPort => $port, # サービスポート番号
Proto => "tcp", # プロトコル
Timeout => $timeout,# 接続待ち許容時間(秒)
);
if ($SOCKET) {
if ($http_version eq '1.1') { # WWWサーバにHTTPリクエストを送る
print $SOCKET "GET $path HTTP/1.1\r\n";
print $SOCKET "Host: $host\r\n";
print $SOCKET "Connection: close\r\n";
} else {
print $SOCKET "GET $path HTTP/1.0\r\n";
}
print $SOCKET "\r\n";
$SOCKET -> flush(); # バッファに溜まっているデータも送る
while (<$SOCKET>){ m/^\r\n$/ and last; } # ヘッダ部分を除去する(改行のみの行ならループを抜ける)
@rcv_data = <$SOCKET>;
$SOCKET -> close(); # WWWサーバーから切断する
}
return (@rcv_data); # 戻り値を格納する。
}
#---------------------------#
# rirs.listのヘッダー作成 #
#---------------------------#
sub header_rirs {
my $Date_Koushin = &Date_Koushin;
my $rirs = <<"_COMMENT_";
# ===========================================================================
# rirs.list ver1.00
# Copyright (C) 2001 pika@cgi-club.com
# IPv4アドレス-WHOISサーバ対応リスト
# ===========================================================================
# =================
# 更新履歴
# =================
# [2001/10/19] v1.00
# 作成
# $Date_Koushin :鷹の巣
# このデータは、以下のURLに記載されている内容をもとに
# $verにより、自動更新されています。
# INTERNET PROTOCOL V4 ADDRESS SPACE
# $url_IPv4
# このデータを利用するには、im_whois.cgi ver1.05の改造が必要です。
# 改造方法も含めた詳細は、以下のURLをご参照願います。
# http://whois.sakaguch.com/
_COMMENT_
}
#--------------------------#
# tld.listのヘッダー作成 #
#--------------------------#
sub header_tld {
my $Date_Koushin = &Date_Koushin;
my $tld = <<"_COMMENT_";
# ===========================================================================
# tld.list ver1.00
# Copyright (C) 2001 pika@cgi-club.com
# 国コード-WHOISサーバ対応リスト
# ===========================================================================
# =================
# 更新履歴
# =================
# [2001/10/19] v1.00
# 作成
# $Date_Koushin :鷹の巣
# このデータは、以下のURLに記載されている内容をもとに
# $verにより、自動更新されています。
# IANA | Generic Top-Level Domains
# $url_gTLD
# IANA | Root-Zone Whois Index by TLD Code
# $url_TLD
# このデータを利用するには、im_whois.cgi ver1.05の改造が必要です。
# 改造方法も含めた詳細は、以下のURLをご参照願います。
# http://whois.sakaguch.com/
_COMMENT_
}
#----------------------#
# データ更新日の生成 #
#----------------------#
sub Date_Koushin {
my ($sec, $min, $hour, $day, $mon, $year, $wday) = localtime(time());
my $Date_Koushin = "データ更新日:" . sprintf("%04d年%02d月%02d日",$year+1900,$mon+1,$day);
return $Date_Koushin;
}