#!/usr/local/bin/perl # ###################################################################### ### ### ### CGIカウンター TcounT Ver.4.20 ### [2/3] 管理 (tcadmin.cgi) ### (c) 1996-1999 Takahiro Nishida ### http://www.mytools.net/ ### ### ###################################################################### # ### 変数設定部 (詳細は上記ページをご覧下さい) ###################### $basedir = "."; $ext = "cgi"; $topurl = "http://your.home/page.html"; $password = "TcounT420"; $method = "post"; ### (変数設定部) ここまで ##################################### $lockfile = "$basedir/lockdir/tc.lock"; $timefile = "$basedir/tcmtime.txt"; $compfile = "$basedir/tccomp.txt"; $logfile = "$basedir/tclog.txt"; $verno = "4.20"; $noact = "何も変更されませんでした。"; print "Content-type: text/html\n\n"; &main; sub main{ &lock; &check_input; &exec_action; &diag_files; &show_html; &unlock; } ##### 入力チェック sub check_input{ if ($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else{ $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); if($value !~ /[\w\d]*/){ &error(3, $name); } $FORM{$name} = $value; } } ##### 作業の実行 sub exec_action{ if($FORM{'pwd'} ne $password){ $actmes="パスワードが違います。$noact"; return; } if($FORM{'act'} eq "cnt"){ &clear_cntlog; return; } if(!($FORM{'fname'}=~/^\w+$/)){ $actmes="ファイル名が入力されていないか、間違っています。$noact"; return; } $mkf = "$basedir/data/all/$FORM{'fname'}.txt"; $omkf="$basedir/data/day/$FORM{'fname'}.txt"; $tmkf = "$basedir/data/today/$FORM{'fname'}.txt"; unless(-f $mkf){ $actmes = "$mkf がありません。$noact"; return; } unless(-f $omkf){ $actmes = "$omkf がありません。$noact"; return; } unless(-f $tmkf){ $actmes = "$tmkf がありません。$noact"; return; } unless(-f $compfile){ $actmes = "$compfile がありません。$noact"; return; } &new_counter if ($FORM{'act'} eq "new"); &fix_counter if ($FORM{'act'} eq "fix"); &del_counter if ($FORM{'act'} eq "del"); $actmes = "作業が選択されていません。$noact" unless $actmes; } ##### 新しいカウンターの作成 sub new_counter{ if($FORM{'num'} =~ /\D/){ $actmes = "初期値が入力されていないか、間違っています。$noact"; return; } unless(open(FILE,"$compfile")){ $actmes = "ファイル $compfile が開けません。$noact"; return; } @cfiles = ; close(FILE); foreach(@cfiles){ if(/^$FORM{'fname'}\t/){ $actmes = "カウンター $FORM{'fname'} は既に存在しています。$noact"; return; } } unless(open(FILE,">$mkf")){ $actmes = "ファイル $mkf に書き込めません。$noact"; return; } print FILE $FORM{'num'}; close(FILE); unless(open(FILE,">$omkf")){ $actmes = "ファイル $omkf に書き込めません。$noact"; return; } print FILE "0"; close(FILE); unless(open(FILE,">$tmkf")){ $actmes = "ファイル $tmkf に書き込めません。$noact"; return; } print FILE "0"; close(FILE); unless(open(FILE,">>$compfile")){ $actmes = "ファイル $compfile に書き込めません。$noact"; return; } print FILE "$FORM{'fname'}\t$FORM{'num'}\t\n"; close(FILE); $actmes = "カウンター $FORM{'fname'}(初期値...$FORM{'num'})が作成されました。"; } ##### カウント数の修正 sub fix_counter{ if($FORM{'num'} =~ /\D/){ $actmes="修正値が入力されていないか、間違っています。$noact"; return; } unless(open(FILE,">$mkf")){ $actmes="ファイル $mkf に書き込めません。$noact"; return; } print FILE $FORM{'num'}; close(FILE); $actmes = "カウンター $FORM{'fname'} の値を $FORM{'num'} に修正しました。"; } ##### カウンターの削除 sub del_counter{ unless(open(FILE,"$compfile")){ $actmes = "ファイル $compfile が開けません。$noact"; return; } @cfiles=; close(FILE); unless(open(FILE,">$compfile")){ $actmes = "ファイル $compfile に書き込めません。$noact"; return; } $frag = 0; foreach (@cfiles){ unless(/^$FORM{'fname'}\t/){ print FILE; } else{ $frag = 1; } } close(FILE); if($frag == 0){ $actmes = "カウンター $FORM{'fname'} の過去ログが見つかりません。$noact"; return; } $actmes = "カウンター $FORM{'fname'} を削除しました。
ファイルの削除は手作業で行って下さい。"; } ##### カウンターログのクリア sub clear_cntlog{ unless(-f $logfile){ $actmes = "$logfile がありません。$noact"; return; } unless(open(FILE, ">$logfile")){ $actmes = "$logfile が開けません。$noact"; return; } close(FILE); $actmes="カウンターログ $logfile をクリアしました。"; } ##### データファイルの診断 sub diag_files{ @dfs = ($logfile, $timefile, $compfile); @dmchs=( '^\d+\/?\d+\/?\d+\t' ,'^\d{8}$' ,'^\w+\t\d+\t\n' ); for(0..2){ $st[$_]="Lost!"; if(-f $dfs[$_]){ $st[$_]="Can't Open!"; } if(open(FILE,"$dfs[$_]")){ @test=; close(FILE); if(!$test[0]){ $st[$_]="Empty."; } elsif($test[0] =~ /$dmchs[$_]/){ $st[$_]="Good."; } else{ $st[$_]="Broken!"; } } } foreach $data(@test){ ($fn,$ov)=split("\t",$data); $OLDCNT{$fn} = $ov; # 総カウント数 if(open(FILE,"$basedir/data/all/$fn.txt")){ $NEWCNT{$fn}=; close(FILE); } else{ $NEWCNT{$fn}="Lost!"; } # 前日までのカウント数 if(open(FILE,"$basedir/data/day/$fn.txt")){ $DAYCNT{$fn}=; close(FILE); } else{ $DAYCNT{$fn}="Lost!"; } # 今日のカウント数 if(open(FILE,"$basedir/data/today/$fn.txt")){ $TODCNT{$fn}=; close(FILE); } else{ $TODCNT{$fn}="Lost!"; } } } ##### HTML表示部分 sub show_html{ #---------------------------- print <<"EOF"; TcounT Ver.$verno - admin [戻る]

TcounT 管理用ページ

パスワードを知っている管理者のみが実行できます。

Powered By TcounT Ver.$verno


*** 作業状況 ***

$actmes


作業とパスワードを入力し「作業実行」を押してください

新しいカウンターを作成する(1)(2)(3)
カウンターを修正する(1)(2)(3)
カウンターを削除する(1)(3)
カウンターログをクリアする(3)

★対応する番号の項目を埋めてください。
(1)ファイル名....txt
(2)初期値(修正値)...
(3)管理用パスワード...

▲ ワンポイント ▲

新しいカウンターを作成する下準備:
  1. カウンターの名前を決める。ここでは "new" とする。
  2. $basedir/data/all/ に 空ファイルnew.txt をFTPし、パーミッションを666にする。
  3. $basedir/data/day/ に 空ファイルnew.txt をFTPし、パーミッションを666にする。
  4. $basedir/data/today/ に 空ファイルnew.txt をFTPし、パーミッションを666にする。
 これらの作業を行なった後、上のフォームから「新しいカウンターを作成する」を選び、ファイル名を "new" としてください。

カウンターログの表\示

■ 現在のカウント数の状況

テストのマークをクリックすると、カウンターが表\示されます。
※ ■→総合、▲→総合・増加、▼→前日、●→今日
※ うまく行かないときはエラーメッセージが表\示されますので、内容を読んで対処して下さい。

EOF #----------------- while(($key, $vold) = each(%OLDCNT)){ print ""; print ""; print ""; print ""; print ""; print ""; } #----------------- print <<"EOF";
ファイル名 テスト 総合 今日 前日 前日まで
$key.txt "; print " "; print " "; print "$NEWCNT{$key}$TODCNT{$key}$DAYCNT{$key}$vold


■ パラメータの説明

<img src="tcount.cgi?(1)&(2)&(3)&(4)&(5)">

  • (1) ... カウンター名 (必須)
  • (2) ... 数を増やす場合 → "1" (何も指定しない場合は増えない)
  • (3) ... 表\示するケタ数 (指定しない場合は5桁。表\示しきれない場合は表\示できるところまで増える)
  • (4) ... 画像のディレクトリ名 (指定しない場合は "img")
  • (5) ... 前日 → "day"、今日 → "today"、 (何も指定しない場合は総合カウント数)
途中のパラメータを跳ばしたい場合は、"tcount.cgi?test&&&&day" という具合に書いて下さい。

■ 各データファイルの状態

EOF #----------------- for(0..2){ print "\n"; } #----------------- print <<"EOF";
ファイル名状態
$dfs[$_]$st[$_]

  • Good. ... 正常
  • Empty. ... 空っぽ
  • Broken! ... 壊れている
  • Can't Open! ... 開けない (パーミッションを確認してください)
  • Lost! ... 存在しない (\$basedirで指定した場所にあるかどうか調べてください)

EOF #---------------------------- } ##### ファイルロック sub lock{ local($try) = 3; while(!(symlink("$$",$lockfile))){ if(--$try <= 0){ &error(0); } sleep(1); } } ############################################## # symlink が使えないサーバー用のファイルロック ############################################## #sub lock{ # local($try) = 3; # while(-f $lockfile){ # if(--$try <= 0){ # &error(0) # } # sleep(1); # } # open(FILE,">$lockfile") || die &error(2); # close(FILE); #} ############################################## ##### ロック解除 sub unlock{ unlink($lockfile); } ##### エラー表示 sub error{ local($fname, $id)=@_; local(@sts) = lstat($lockfile); local($tn) = time(); $msg[0] = "ロック中です"; $msg[1] = "ファイルが開けません"; $msg[2] = "ファイルに書きこめません"; $msg[3] = "不正な文字がパラメタに使用されています"; print "TcounT Error!"; print "Message From tcadmin.cgi.
"; print "$fname $msg[$id]"; print ""; &unlock if ($id); # ID が 0 以外の場合はロック解除 &unlock if ($tn - $sts[9] > 15); # 約15秒以上ロックが続いてたら自動解除 exit; }