#!/usr/bin/perl
#
######################################################################
###
###
### CGIカウンター TcounT Ver.5.03
### [2/2] 管理 (tcpadm.cgi)
### (c) 1996-2004 Takahiro Nishida
### http://www.mytools.net/
###
###
######################################################################
#
### 変数設定部 (詳細は上記ページをご覧下さい) ######################
# 管理パスワード
$password = "Tcount5";
# 管理者メールアドレス
$admin_email = "your\@email.address";
# データファイルの格納位置
$basedir = ".";
# 「戻る」を押したときに移動するURL
$backurl = "http://your.homepage/";
### 変数設定部 (ここまで)###########################################
# ログ閲覧にパスワードを要するか(1→必要、0→不必要)
$NEED_PASSWORD_FOR_LOGVIEW = 0;
# 「最近×日間の集計」を何日分にする
$RECENT_DAYS_COUNT = 7;
# カウント開始直後の×日を統計対象から除外する
$AVG_IGNORE_DAYS_COUNT = 1;
$lockfile = "$basedir/lockdir/tc.lock";
$allfile = "$basedir/tcdall.txt";
$ystfile = "$basedir/tcdyst.txt";
$hstfile = "$basedir/tcdhst.txt";
$logfile = "$basedir/tcdlog.txt";
$bakfile = "$basedir/tcdbak.txt";
$verno = "5.03";
print "Content-type: text/html; Charset=shift_jis\n\n";
&main;
sub main{
&lock;
&init_variables;
&open_datafile;
&check_input;
&exec_action;
&update_files;
&show_html;
&unlock;
}
########## 変数の初期化
sub init_variables{
$noact = "何も変更されませんでした。";
$actmsg = "";
}
########## データファイルのオープン
sub open_datafile{
&openfile($allfile, *tdys);
&openfile($ystfile, *ysts);
### 日付データ取得
$g_date_rec = shift(@tdys);
### 取得できなかったらrecoverで一旦初期化
($g_date_rec) || &error(391, "先に こちら をクリックしてデータファイルの初期化を行い、再度 tcpadm.cgi にアクセスしてください。");
### 今日データのハッシュ化
foreach(@tdys){
(/^\w+\t/) || next;
($b_ccode) = split("\t");
($b_ccode =~ /^\w+/) || next;
$CTDY{$b_ccode} = $_;
### ソート順取得
push(@g_codesort, $b_ccode);
}
### 昨日データのハッシュ化
foreach(@ysts){
($b_ccode) = split("\t");
($CYST{$b_ccode} = $_);
}
### 今日のカウント数
foreach (@g_codesort){
($b_ccode, $b_ca, $b_cah) = split("\t", $CTDY{$_});
($b_ccode, $b_cy, $b_cyh, $b_cu, $b_cuh) = split("\t", $CYST{$_});
### 今日=総合−昨日迄
$CCT{$_} = $b_ca - $b_cu;
$CCTH{$_} = $b_cah - $b_cuh;
}
}
########## 入力内容のチェック
sub check_input{
local($buffer, $vn, $pair, @pairs);
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
else {
$buffer = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($vn, $value) = split(/=/, $pair);
$F{$vn} .= $value;
}
$m_pwd = $F{'pwd'};
$m_mode = $F{'mode'};
$m_act = $F{'act'};
$m_ccode = $F{'ccode'};
(!$m_ccode) || ($m_ccode =~ /^\w+$/) || &error(300, "カウンターのコード名が不正です:$m_ccode");
}
########## 作業の実行
sub exec_action{
### パスワードチェック
if ($m_pwd ne $password){
$actmsg = ($m_pwd) ? "パスワードが間違っています。$noact" : "作業を選択し、パスワードを入力して「作業実行」を押してください。";
### logモードかつPassword不要「でない」場合はモードをtopに戻す
($m_mode eq 'log') && ($NEED_PASSWORD_FOR_LOGVIEW == 0) || ($m_mode = "top");
}
### modeごとの処理へ
if($m_mode eq 'cnt'){
$actmsg = "カウンタ修正用フォームを表\示しています。";
if($m_act eq 'new' || $m_act eq 'fix'){
&fix_data;
}
}
elsif($m_mode eq 'log'){
$actmsg = "カウンターログを表\示しています。";
}
elsif($m_mode eq 'clm'){
&clear_actlog;
$actmsg = "カウンター動作ログをクリアしました。";
}
}
########## データの修正
sub fix_data{
local($m_ccode, $m_cdel);
local($m_ca, $m_cah, $m_cy, $m_cyh, $m_cu, $m_cuh);
local($newtdys, $newysts);
### 入力の受け取り
$m_ccode = $F{'ccode'};
$m_ca = $F{'ca'};
$m_cu = $F{'cu'};
$m_cy = $F{'cy'};
$m_cah = $F{'cah'};
$m_cuh = $F{'cuh'};
$m_cyh = $F{'cyh'};
$m_cdel = ($F{'cdel'}) ? 1 : 0;
### 入力のチェック
($m_ccode =~ /^\w+$/) || &error(300, "カウンターコードが不正です:使用できる文字は [A-Za-z0-9] です");
($m_ca =~ /^\d+$/) || &error(301, "入力が不正です:「述べアクセス数−現在」は半角数字で記入");
($m_cu =~ /^\d+$/) || &error(302, "入力が不正です:「述べアクセス数−昨日まで」は半角数字で記入");
($m_cy =~ /^\d+$/) || &error(303, "入力が不正です:「述べアクセス数−昨日」は半角数字で記入");
($m_cah =~ /^\d+$/) || &error(304, "入力が不正です:「ホストアクセス数−現在」は半角数字で記入");
($m_cuh =~ /^\d+$/) || &error(305, "入力が不正です:「ホストアクセス数−昨日まで」は半角数字で記入");
($m_cyh =~ /^\d+$/) || &error(306, "入力が不正です:「ホストアクセス数−昨日」は半角数字で記入");
### 社会的エラー
($m_ca >= $m_cu) || &error(307, "数値が不正です:延べアクセス数−現在($m_ca)が昨日まで($m_cu)より小さい");
($m_cu >= $m_cy) || &error(309, "数値が不正です:延べアクセス数−昨日まで($m_cu)が昨日($m_cy)より小さい");
($m_cah >= $m_cuh) || &error(308, "数値が不正です:ホストアクセス数−現在($m_cah)が昨日まで($m_cuh)より小さい");
($m_cuh >= $m_cyh) || &error(310, "数値が不正です:ホストアクセス数−昨日まで($m_cuh)が昨日($m_cyh)より小さい");
### 新規
if($m_act eq 'new')
{
($m_ccode) || &error(311, "カウンターコードが入力されていません。");
($CTDY{$m_ccode}) && &error(312, "指定されたカウンタコードは既に使用されています:$m_ccode");
$actmsg = "カウンタ $m_ccode を新規作成しました。";
push(@g_codesort, $m_ccode);
$F{'cread'} = 0;
}
### 修正
else{
($CTDY{$m_ccode}) || &error(313, "指定されたカウンタコードは存在しません:$m_ccode");
$actmsg = "カウンタ $m_ccode を修正しました。";
$F{'cread'} = 1;
### 削除
if($m_cdel)
{
foreach(0..$#g_codesort)
{
($g_codesort[$_] eq $m_ccode) && splice(@g_codesort, $_, 1);
}
$actmsg = "カウンタ $m_ccode を削除しました。";
$F{'cread'} = 0;
}
}
### ハッシュ作成 or 上書き
$CTDY{$m_ccode} = "$m_ccode\t$m_ca\t$m_cah\t\n";
$CYST{$m_ccode} = "$m_ccode\t$m_cy\t$m_cyh\t$m_cu\t$m_cuh\t\n";
### 今日=総合−昨日迄
$CCT{$m_ccode} = $m_ca - $m_cu;
$CCTH{$m_ccode} = $m_cah - $m_cuh;
### データ再編成
push(@newtdys, $g_date_rec); # 日付
foreach(@g_codesort)
{
### 行挿入
push(@newtdys, $CTDY{$_});
push(@newysts, $CYST{$_});
}
@tdys = @newtdys;
@ysts = @newysts;
### 更新フラグ
$upf_tdys = 1;
$upf_ysts = 1;
}
########## カウンター動作ログのクリア
sub clear_actlog{
local @tmps = ();
&updatefile($logfile, *tmps);
}
########## ファイルの更新
sub update_files{
($upf_tdys) && &updatefile($allfile, *tdys);
($upf_ysts) && &updatefile($ystfile, *ysts);
}
########## 表示
sub show_html{
local($hbuf_copyright, $hbuf_table, $hbuf_form);
($F{'back'}) && ($m_mode = "top");
if($m_mode eq 'cnt'){
$hbuf_table = &html_table;
$hbuf_form = &html_form;
}
elsif($m_mode eq 'log'){
$hbuf_table = &html_log;
}
else{
$hbuf_form = &html_top;
}
$hbuf_copyright = ©right;
print <
T-Count 5 - 管理用ページ
[戻る]
[管理トップ]
T-Count 5 管理用ページ
作業状況: $actmsg
$hbuf_form
$hbuf_table
$hbuf_copyright