#!/usr/bin/perl require './gifcat.pl'; ## ------------------------------------------------------------------- $MKNAME = ""; $MKURL = ""; ## ------------------------------------------------------------------- $CGIFILE = "./ecocount.cgi"; # このファイルの名前 $MGRPASS = "1111"; # 管理パスワード $LOGFILE = "./ecocntlog."; # ログファイル名 $LOCKFILE = "./ecocnt.lck"; # ロックファイル名 $GIF_PATH = "./"; # gif画像のあるディレクトリのパス $BASE_URL = "http://www.ecopac.co.jp/"; # 貴方のベースURL $ref_url = $ENV{'HTTP_REFERER'}; $cook = $ENV{'HTTP_COOKIE'}; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $form, $ENV{'CONTENT_LENGTH'}); } else { $form = $ENV{'QUERY_STRING'}; } @para = split(/&/,$form); foreach $pair (@para){ ($Name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$Name} = $value; } $FIG = $FORM{'fig'}; $ID = $FORM{'id'}; $MODE = $FORM{'mode'}; $PASS = $FORM{'pass'}; $ACT = $FORM{'act'}; $NAME = $FORM{'name'}; $COUNT= $FORM{'count'}; # 引数がなければディフォルト if ($FIG eq "") { $FIG = 5; } if ($ID eq "") { $ID = 1; } @para = split(/;/,$cook); foreach $pair (@para){ ($Name, $value) = split(/=/, $pair); $Name =~ s/ //g; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $COOK{$Name} = $value; } $OFFCNTM = $COOK{'minocntM'}; foreach $id ( split(/,/,$OFFCNTM) ) { if ( $ID eq $id ) { $UP = 'OFF'; last; } } $OFFCNT = $COOK{'minocnt'}; foreach $id ( split(/,/,$OFFCNT) ) { if ( $ID eq $id ) { $UP = 'OFF'; last; } } if ( $UP ne 'OFF' ) { $UP = 'ON'; } ## ------------------------------------------------------------------- ## モードにより処理 ## ------------------------------------------------------------------- if ( $MODE eq '' ) { # 管理操作以外だったらカウンタ表示 &CountDisp; } else { # 管理だったら管理処理 if ( $PASS ne $MGRPASS ) { &InputPass; } # パスワードが違う場合 elsif ( $ACT eq '' ) { &DispMgr; } # パスワードOK初期画面 elsif ( $ACT eq '編集' ) { &Conf; } # パスワードOK操作確認画面 elsif ( $ACT eq 'リセット' ) { &Conf; } # パスワードOK操作確認画面 elsif ( $ACT eq '削除' ) { &Conf; } # パスワードOK操作確認画面 elsif ( $ACT eq '回避OFF' ) { &Conf; } # パスワードOK操作確認画面 elsif ( $ACT eq '回避ON' ) { &Conf; } # パスワードOK操作確認画面 elsif ( $ACT eq 'OK' ) { &ExecOper; } # パスワードOK操作実行 elsif ( $ACT eq 'NG' ) { &DispMgr; } # パスワードOK初期画面 } exit; ## ------------------------------------------------------------------- ## カウンター表示処理サブルーチン ## ------------------------------------------------------------------- sub CountDisp { ## 他サイトからのアクセスを排除 $ref_url =~ s/\?(.|\n)*//ig; $ref_url =~ s/\%7E/\~/ig; if (($BASE_URL ne ".") && ($ref_url !~ $BASE_URL)){ &error; } if ( $ID > 999 ) { &error; } if ( $UP eq 'ON' ) { ## クッキー設定 print "Set-Cookie: "; if ( $OFFCNT eq '' ) { print "minocnt=$ID; "; } else { print "minocnt=$OFFCNT,$ID; "; } print "\n"; } ## ロック &lockon; ## ログファイル読み込み &ReadLog; if ( $NAME eq '' ) { $NAME = "$ID"; } # カウントアップの場合、ログを更新 if ( $UP eq 'ON' ) { $COUNT++; &PutLog; $UP = 'OFF'; } ## アンロック &lockoff; ## GIF画像を出力 &count_view; exit; } ## ------------------------------------------------------------------- ## パスワード入力画面サブルーチン ## ------------------------------------------------------------------- sub InputPass { &HtmlStart; print "
\n"; print "管理パスワード:"; print "\n"; print "
\n"; &HtmlEnd; } ## ------------------------------------------------------------------- ## 管理画面サブルーチン ## ------------------------------------------------------------------- sub DispMgr { &HtmlStart; print "\n"; print "\n"; print "\n"; $ID = 1; &lockon; while ( $ID <= 999 ) { $logfile = sprintf "$LOGFILE%03d",$ID; if ( -f $logfile ) { ## ログファイル読み込み &ReadLog; $UP = 'OFF'; foreach $id ( split(/,/,$OFFCNTM) ) { if ( $ID eq $id ) { $UP = 'ON'; last; } } print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } $ID++; } &lockoff; print "
ページ名番号訪問件数カウント
回避
操作
$NAME$ID$COUNT$UP\n"; print "\n"; if ( $COUNT > 0 ) { print "\n"; } print "\n"; if ( $UP eq 'ON' ) { print "\n"; } else { print "\n"; } print "

\n"; print "「編集」をクリックするとページ名を編集します。
\n"; print "「リセット」をクリックすると訪問者数をゼロにします。
\n"; print "「削除」をクリックすると情報を削除します。
\n"; print "「回避ON」にするとこのブラウザーでカウントアップしなくなります。
\n"; print "「回避OFF」にするとこのブラウザーでカウントアップします。
\n"; &HtmlEnd; } ## ------------------------------------------------------------------- ## 操作確認画面サブルーチン ## ------------------------------------------------------------------- sub Conf { &HtmlStart; if ( $ACT eq 'リセット' ) { $COUNT = 0; } print "■$ACT操作■

\n"; print "

\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } else { print "$NAME\n"; } print "\n"; print "
番号$ID
ページ名\n"; if ( $ACT eq '編集' ) { print "
訪問件数$COUNT

\n"; print " \n"; print "

\n"; &HtmlEnd; } ## ------------------------------------------------------------------- ## 操作実行サブルーチン ## ------------------------------------------------------------------- sub ExecOper { if ( $MODE eq '回避OFF' ) { $SETCOOK = ''; foreach $id ( split(/,/,$OFFCNTM) ) { if ( $ID ne $id ) { if ( $SETCOOK eq '' ) { $SETCOOK = "$id"; } else { $SETCOOK = "$SETCOOK,$id"; } } } print "Set-Cookie: "; print "minocntM=$SETCOOK; "; print "expires=Wed, 1-Jan-2020 00:00:00 GMT; "; print "\n"; &HtmlStart; } if ( $MODE eq '回避ON' ) { $SETCOOK = ''; foreach $id ( split(/,/,$OFFCNTM) ) { if ( $ID ne $id ) { if ( $SETCOOK eq '' ) { $SETCOOK = "$id"; } else { $SETCOOK = "$SETCOOK,$id"; } } } print "Set-Cookie: "; if ( $SETCOOK eq '' ) { print "minocntM=$ID; "; } else { print "minocntM=$SETCOOK,$ID; "; } print "expires=Wed, 1-Jan-2020 00:00:00 GMT; "; print "\n"; &HtmlStart; } if ( $MODE eq '削除' ) { $SETCOOK = ''; foreach $id ( split(/,/,$OFFCNTM) ) { if ( $ID ne $id ) { if ( $SETCOOK eq '' ) { $SETCOOK = "$id"; } else { $SETCOOK = "$SETCOOK,$id"; } } } print "Set-Cookie: "; print "minocntM=$SETCOOK; "; print "expires=Wed, 1-Jan-2020 00:00:00 GMT; "; print "\n"; &HtmlStart; $logfile = sprintf "$LOGFILE%03d",$ID; &lockon; unlink( $logfile ); &lockoff; } if ( $MODE eq '編集' || $MODE eq 'リセット' ) { &HtmlStart; if ($NAME =~ /:/) {$MSG = 'ページ名に:を含めることは出来ません。';&HtmlEnd;} &lockon; &PutLog; &lockoff; } print "

操作が完了しました。

\n"; print "

\n"; print "\n"; print "\n"; print "\n"; print "
\n"; &HtmlEnd; } ## ------------------------------------------------------------------- ## ログファイル読み込み処理サブルーチン ## ------------------------------------------------------------------- sub ReadLog { $logfile = sprintf "$LOGFILE%03d",$ID; if (!-f $logfile) { if ( open(OUT,">$logfile") ) { print OUT ""; close(OUT); } else { if ( $MODE eq '' ) { &error; } else { $MSG = 'ファイルが作成出来ません。'; &HtmlEnd; } } } $NAME = ''; $COUNT = 0; if ( open(IN,"$logfile") ) { while ( ) { chop $_; ( $NAME,$COUNT ) = split( /:/,$_ ); } close(IN); } else { if ( $MODE eq '' ) { &error; } else { $MSG = 'ファイルがオープン出来ません。'; &HtmlEnd; } } } ## ------------------------------------------------------------------- ## ログファイル書き込み処理サブルーチン ## ------------------------------------------------------------------- sub PutLog { $logfile = sprintf "$LOGFILE%03d",$ID; if ( open(OUT,">$logfile") ) { print OUT "$NAME:$COUNT\n"; close(OUT); } else { if ( $MODE eq '' ) { &error; } else { $MSG = 'ロックされています。'; &HtmlEnd; } } } ## ------------------------------------------------------------------- ## --- GIF出力処理サブルーチン ## ------------------------------------------------------------------- sub count_view { $COUNT += 0; $cntstr = sprintf(sprintf("%%0%dld", $FIG), $COUNT); printf("Content-type: image/gif\n"); printf("\n"); @files = (); for ($i=0; $i$LOCKFILE"); close(LOCK); $LOCKKEY = 9; last; } else { sleep(1); } } if ($LOCKKEY == 0) { if ( $MODE eq '' ) { &error; } else { $MSG = 'ロックされています。'; &HtmlEnd; } } } ## ------------------------------------------------------------------- ## アンロック処理サブルーチン ## ------------------------------------------------------------------- sub lockoff { if ($LOCKKEY == 9) { unlink($LOCKFILE); } } ## ------------------------------------------------------------------- ## エラー処理サブルーチン ## ------------------------------------------------------------------- sub error { &lockoff; $COUNT=999999; &count_view; exit; } ## ------------------------------------------------------------------- ## HTML開始処理サブルーチン ## ------------------------------------------------------------------- sub HtmlStart { print "Content-type: text/html\n\n"; print "\n"; print " カウンター管理画面 \n"; print "

カウンター管理画面


\n"; } ## ------------------------------------------------------------------- ## HTML終了処理サブルーチン ## ------------------------------------------------------------------- sub HtmlEnd { &lockoff; if ( $MSG ne '' ) { print "$MSG\n"; } print "

戻る\n"; print "
$MKNAME\n"; exit; }