#┌─────────────────────────────────
#│ DAY COUNTER-EX v3.5 (2003/07/04)
#│ Copyright (c) KentWeb
#│ webmaster@kent-web.com
#│ http://www.kent-web.com/
#└─────────────────────────────────
$ver = 'DayX v3.5';
#┌─────────────────────────────────
#│ [注意事項]
#│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した
#│ いかなる損害に対して作者は一切の責任を負いません。
#│ 2. 設置に関する質問はサポート掲示板にお願いいたします。
#│ 直接メールによる質問は一切お受けいたしておりません。
#└─────────────────────────────────
#
# [タグの書き方の例]
# 総カウント数
# 本日のカウント数
# 昨日 〃
#
# [日計/月次一覧を見る]
# http://www.host.xxx/~user/count/dayxmgr.cgi
#
# [チェックのしかた (ブラウザから最後に ?check をつけて呼出す)]
# http://www.host.xxx/~user/count/dayx.cgi?check
#
# [ディレクトリ構成例 (括弧内はパーミッション) ]
#
# public_html / index.html ... ここにカウンタを設置
# |
# +-- count / dayx.cgi [755]
# | dayxmgr.cgi [755]
# | gifcat.pl [644]
# | dayx.dat [666]
# | day.dat [666]
# | mon.dat [666]
# | blue.gif
# | red.gif
# |
# +-- gif1 / 1.gif 2.gif ... 0.gif
# |
# +-- gif2 / 1.gif 2.gif ... 0.gif
# |
# +-- lock [777] /
#============#
# 設定項目 #
#============#
# 画像連結ライブラリ取込み
require './gifcat.pl';
# 総カウント数の桁数
$digit1 = 7;
# 本/昨日カウント数の桁数
$digit2 = 4;
# ログファイル
$logfile = "./dayx.dat";
# 日次記録ファイル
$dayfile = "./day.dat";
# 月次記録ファイル
$monfile = "./mon.dat";
# 総カウント数用GIF画像のディレクトリ
$gifdir1 = "./gif1";
# 本/昨日カウント数用GIF画像のディレクトリ
$gifdir2 = "./gif1";
# ファイルロック機構
# 0 : しない
# 1 : する (symlink関数式)
# 2 : する (mkdir関数式)
$lockkey = 0;
# ロックファイル名
$lockfile = "./lock/dayx.lock";
# カウンタの機能タイプ
# 0 : 総カウント数不要(昨日/本日のみ)
# 1 : 標準タイプ
$type = 1;
# IPアドレスの二重カウントチェック
# 0 : チェックしない
# 1 : チェックする
$ip_check = 1;
#============#
# 設定完了 #
#============#
# 引数を解釈
$mode = $ENV{'QUERY_STRING'};
$mode =~ s/\W//g;
# 更新系処理でないならば 1 秒待たせる
if (($type == 1 && $mode eq "yes") || ($type == 1 && $mode eq "today") || ($type == 0 && $mode eq "yes")) { sleep(1); }
# チェックモード
if (!$mode || $mode eq 'check') { ✓ }
# ロック開始
if (($type && $mode eq "gif" && $lockkey) || (!$type && $mode eq "today" && $lockkey)) { &lock; }
# 記録ファイルから読み込み
open(IN,"$logfile") || &error;
$data = ;
close(IN);
# 記録ファイルを分解
($key,$yes,$today,$count,$youbi,$ip) = split(/<>/, $data);
# 日時を取得
$ENV{'TZ'} = "JST-9";
($mday,$mon,$year,$wday) = (localtime(time))[3..6];
@week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
$year += 1900;
$mon++;
$thisday = $week[$wday];
if ($mon < 10) { $mon = "0$mon"; }
$date = "$year\/$mon";
# IPチェック
$flag=0;
if ($ip_check) {
$addr = $ENV{'REMOTE_ADDR'};
if ($addr eq $ip) { $flag=1; }
}
# 本日のカウント数をキーにカウントアップ
if ((!$flag && $type && $mode eq 'gif') || (!$flag && !$type && $mode eq 'today')) {
$count++;
## 当日処理
if ($key eq $mday) {
$today++;
# ログをフォーマット
$data = "$key<>$yes<>$today<>$count<>$thisday<>$addr<>\n";
## 翌日処理
} else {
# ログをフォーマット
$data = "$mday<>$today<>1<>$count<>$thisday<>$addr<>\n";
&day_count;
&mon_count;
}
# ログを更新
open(OUT,">$logfile") || &error;
print OUT $data;
close(OUT);
}
# ロック解除
if ($lockflag) { &unlock; }
# カウンタ画像出力
if ($mode eq "gif") { &count_view($count, $digit1, $gifdir1); }
elsif ($mode eq "yes") { &count_view($yes, $digit2, $gifdir2); }
else { &count_view($today, $digit2, $gifdir2); }
exit;
#-------------------#
# カウンタ出力処理 #
#-------------------#
sub count_view {
local(@view);
local($data, $digit, $dir) = @_;
# 桁数調整
while (length($data) < $digit) { $data = '0' . $data; }
@view=();
foreach (split(//, $data)) {
push(@view,"$dir/$_\.gif");
}
# 画像連結
print "Content-type: image/gif\n\n";
binmode(STDOUT);
print &gifcat'gifcat(@view);
}
#--------------#
# ロック処理 #
#--------------#
sub lock {
local($retry) = 5;
if (-e $lockfile) {
local($mtime) = (stat($lockfile))[9];
if ($mtime < time - 60) { &unlock; }
}
# symlink関数式ロック
if ($lockkey == 1) {
while (!symlink(".", $lockfile)) {
if (--$retry <= 0) { &error; }
sleep(1);
}
# mkdir関数式ロック
} elsif ($lockkey == 2) {
while (!mkdir($lockfile, 0755)) {
if (--$retry <= 0) { &error; }
sleep(1);
}
}
$lockflag=1;
}
#--------------#
# ロック解除 #
#--------------#
sub unlock {
if ($lockkey == 1) { unlink($lockfile); }
elsif ($lockkey == 2) { rmdir($lockfile); }
$lockflag=0;
}
#----------------#
# 日次カウント #
#----------------#
sub day_count {
# ログの日次キーより本日の日が小さければ月が変わったと判断する
if ($mday < $key) {
open(DB,">$dayfile") || &error;
close(DB);
}
# 月内での処理
else {
if ($key < 10) { $key = "0$key"; }
open(DB,">>$dayfile") || &error;
print DB "$mon\/$key \($youbi\)<>$today<>\n";
close(DB);
}
}
#----------------#
# 月間カウント #
#----------------#
sub mon_count {
# 初めてのアクセスの場合
if (-z $monfile) { $mons[0] = "$date<>$today<>\n"; }
else {
open(IN,"$monfile") || &error;
@mons = ;
close(IN);
# ログ配列の最終行を分解
$mons[$#mons] =~ s/\n//;
($y_m,$cnt) = split(/<>/,$mons[$#mons]);
# 当月処理
if ($y_m eq $date) {
$cnt = $cnt + $today;
$mons[$#mons] = "$y_m<>$cnt<>\n";
}
# 翌月処理
#(ログ配列の最終行が $dateと異なれば、月が変ったと判断する)
else {
$cnt = $cnt + $today;
$mons[$#mons] = "$y_m<>$cnt<>\n";
push(@mons,"$date<>0<>\n");
}
}
# ログファイルを更新
open(OUT,">$monfile") || &error;
print OUT @mons;
close(OUT);
}
#--------------#
# エラー処理 #
#--------------#
sub error {
local($data,@err);
if ($lockflag) { &unlock; }
@err = ('47','49','46','38','39','61','2d','00','0f','00','80','00','00','00','00','00','ff','ff','ff','2c', '00','00','00','00','2d','00','0f','00','00','02','49','8c','8f','a9','cb','ed','0f','a3','9c','34', '81','7b','03','ce','7a','23','7c','6c','00','c4','19','5c','76','8e','dd','ca','96','8c','9b','b6', '63','89','aa','ee','22','ca','3a','3d','db','6a','03','f3','74','40','ac','55','ee','11','dc','f9', '42','bd','22','f0','a7','34','2d','63','4e','9c','87','c7','93','fe','b2','95','ae','f7','0b','0e', '8b','c7','de','02','00','3b');
print "Content-type: image/gif\n\n";
foreach (@err) {
$data = pack('C*',hex($_));
print $data;
}
exit;
}
#------------------#
# チェックモード #
#------------------#
sub check {
print "Content-type: text/html\n\n";
print <
DAY COUNTER-EX
Check Mode
EOM
# ログファイル確認
foreach ($logfile, $dayfile, $monfile) {
# パス
if (-e $_) {
print "- $_ → パス OK!\n";
# パーミッション
if (-r $_ && -w $_) { print "
- $_ → パーミッション OK!\n"; }
else { print "
- $_ → パーミッション NG!\n"; }
} else { print "
- $_ → パス NG!\n"; }
}
# 画像ディレクトリ
foreach ($gifdir1, $gifdir2) {
if (-d $_) {
print "
- $_ → 画像ディレクトリ OK!\n";
# 画像
foreach $n (0 .. 9) {
if (-e "$_\/$n\.gif") { print "
- $_\/$n\.gif → OK!\n"; }
else { print "
- $_\/$n\.gif → NG!\n"; }
}
} else { print "
- $_\/$n\.gif → 画像ディレクトリ NG!\n"; }
}
# ロックディレクトリ
print "
- ロック形式:";
if ($lockkey == 0) { print "ロック設定なし\n"; }
else {
if ($lockkey == 1) { print "symlink\n"; }
else { print "mkdir\n"; }
($lockdir) = $lockfile =~ /(.*)[\\\/].*$/;
print "
- ロックディレクトリ:$lockdir\n";
if (-d $lockdir) {
print "
- ロックディレクトリ : パス OK\n";
if (-r $lockdir && -w $lockdir && -x $lockdir) {
print "
- ロックディレクトリ : パーミッション OK\n";
} else {
print "
- ロックディレクトリ : パーミッション NG → $lockdir\n";
}
} else { print "
- ロックディレクトリ : パス NG → $lockdir\n"; }
}
# 著作権表示:削除禁止
print <
- $ver -