List of ap/ap.pl

Tue Apr 23 17:24:21 2024

戻る

TEXTAREA で表示(カット&ペーストむき)

#!/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;
}

戻る