#!/usr/local/bin/perl5 # ap.pl # # アクセスを歓迎する! # BIGLOBE のアクセスポイント名を表示する # jp ドメインは、変換して名称を表示する # 上記以外からのアクセスは、ドメインの第1,2,3レベルあたりを表示する。 # # 1997/09/05 Ver.0.01 # 1997/09/08 Ver.0.02 # 1997/09/15 Ver.0.03 # host コマンドが動かなくなったため調査してpath を指定 # 1997/12/23 Ver.0.04 # 1997/12/29 Ver.0.05 # or.jp ne.jp ad.jp co.jp ac.jp に対する表示を拡張 # 1998/01/14 Ver.0.06 # proxy server への対応 # host コマンドから gethostbyaddr へ # 1998/01/23 Ver.0.07 # proxy server への対応強化 # 1998/02/16 Ver.0.08 # ファイルを第2レベルごとに分割 # ドメイン名の内部処理を小文字に統一 # 名称を ap.pl に変更 # 1998/02/17 Ver.0.09 bugfix # 1998/02/17 Ver.0.10 bugfix # 1998/02/17 Ver.0.11 bugfix # 1998/02/22 Ver.0.12 bugfix # 1998/07/30 Ver.0.13 # kek.jp の処理を追加 # 1998/08/12 Ver.0.14 # biglobe AP が未知の場合の処理の Bugfix # 1999/03/30 Ver.0.15 # go, gr を分離, com,net の第3レベルを無視 # 1999/11/15 Ver.0.16 # REMOTE_HOST -> REMOTE_ADDR # 20000/03/25 Ver.0.17 # データのディレクトリを絶対指定に # # (C) 1997-2000 がま # e-mail addr : gama@mvg.biglobe.ne.jp # 変換用のデータファイル群 # $datadir ='/home4/gama/public_html/cgi/ap/'; # 2001/09/20 $datadir ='/home2/www2d/025/public_html/cgi/ap/'; # 2001/09/20 $apfile =$datadir."ap.csv"; # biglobe 用 $nefile =$datadir."ne.csv"; # or.jp, ne.jp, ad.jp $cofile =$datadir."co.csv"; # co.jp $gofile =$datadir."go.csv"; # go.jp $grfile =$datadir."gr.csv"; # gr.jp $acfile =$datadir."ac.csv"; # ac.jp $jpfile =$datadir."jp.csv"; # その他の jp $wwfile =$datadir."ww.csv"; # jp 以外 # 環境変数の REMOTE_HOST の IP アドレスで gethostbyaddr を実行しドメインを得る $ip =$ENV{'REMOTE_ADDR'}; if ($ENV{'HTTP_VIA'} && $ENV{'HTTP_X_FORWARDED_FOR'}) { $pip = $ENV{'HTTP_X_FORWARDED_FOR'}; $rhost = gethostbyaddr(pack('C4',split(/\./,$pip)),2); } unless ($rhost) { # host 名への変換 $rhost = gethostbyaddr(pack('C4',split(/\./,$ip)),2); unless ($rhost) { exit; } } $rhost = "\L$rhost\E"; # 小文字化 # ドメインを逆転し後ろから見るようにする。 ($d1,$d2,$d3,$d4,$d5)=reverse(split(/\./, $rhost)); if ( $d1 eq "jp") { # .jp ドメイン if ( $d2 eq "ad" && $d3 eq "mesh" ) { # mesh.ad.jp $site = &biglobe; # biglobe の処理 } elsif ( $d2 eq "or" || $d2 eq "ne" || $d2 eq "ad" ) { $site = &name($nefile); } elsif ( $d2 eq "co") { $site = &name($cofile); } elsif ( $d2 eq "ac") { $site = &name($acfile); } elsif ( $d2 eq "go") { $site = &name($gofile); } elsif ( $d2 eq "gr") { $site = &name($grfile); } elsif ( $d2 eq "kek") { # $site = '高エネルギー物理学研究所'; } else { $site = &name($jpfile); } } else { if ($d1 eq 'com' or $d1 eq 'net') { $d3 =''; } $site = &name($wwfile); } print "$site からのアクセスを歓迎します!"; ############################################################################### sub biglobe { # $d4 3文字の場合は、都道府県単位と思われる # 2文字の場合は、資料不足・・・ # $d5 最初の英文字部分が、AP を示すと思われる # AP 以外を示す物もありそうなのだが、資料不足 my($dd5) = $d5; $d5 =~ /\d/; # 数字を探して・・・ $d5 =$`; # 前だけを取り出す my($ap); my($pref); local($_); open (FILE, $apfile); # 変換用データファイルを探す。 while (<FILE>) { chomp; # 最後の改行文字を切り捨てる ($f1,$f2,$f3,$f4,$f5,$f6,$f7,$f8) = split(/,/); $f1 =~ /\d/; # 数字を探して・・・ $f1 =$`; # 前だけを取り出す if (($d5 eq $f1) && ($d4 eq $f2) ) { $ap = $f7; # AP名 last; # ループを抜ける } if ($d4 eq $f2 ) { $pref = $f8; # 都道府県名 } } close (FILE); unless (defined($ap)) { # $ap が、まだ、設定されていないとき open (FILE,">>$apfile"); printf FILE "%s,%s,%s,%s,%s,%s,%s,%s\n", $dd5, $d4, $d3, $d2, $d1, "", $ap, $pref; close (FILE); } unless ($ap) { # 未知の AP へ都道府県名を表示 unless ($pref) { $ap = "BIGLOBE"; # 都道府県名も未知 } else { $ap = $pref; # 都道府県名は既知 } } return $ap; } ############################################################################### sub name { # $d1,$d2,$d3 で名称を表示する my($file)=$_[0]; # サブルーチンの引数 my($name); local($_); open (FILE, $file); # 変換用データファイルを探す。 while (<FILE>) { chomp; # 最後の改行文字を切り捨てる ($f1,$f2,$f3,$f4) = split(/,/); if (($d3 eq $f1) && ($d2 eq $f2) && ($d1 eq $f3)) { $name = $f4; # name last; # ループを抜ける } } close (FILE); unless (defined($name)) { # $name が、まだ、設定されていないとき open (FILE,">>$file"); if ($d1 eq "jp" ) { # 第3レベルを大文字化して表示 $name = "\U$d3\E"; } elsif ( $d1 eq "com" || $d1 eq "net") { # .com .net 1,2 を表示 $name = sprintf ( "%s.%s", $d2, $d1 ); } else { # その他 1,2,3 を表示 $name = sprintf ( "%s.%s.%s", $d3, $d2, $d1 ); } printf FILE "%s,%s,%s,%s\n", $d3, $d2, $d1, $name; close (FILE); } return $name; }