#!/usr/local/bin/perl5
## -----------------------------------------------------------------------
## DAY COUNTER-EX v2.2
## by KENT (99/06/21)
## E-MAIL: webmaster@kent-web.com
## URL: http://www.kent-web.com/
## 1.このスクリプトはフリーソフトです。このスクリプトを使用したいかなる
## 損害も作者はその責を負いません。
## 2.設置に関する質問は直接メールでは行ってはいませんので「サポート掲示板」
## へお願いいたします。
## ------------------------------------------------------------------------
## [タグの書き方の例]
## 総カウント数
## 本日のカウント数
## 昨日 〃
##
## [日計/月次一覧を見る]
## http://www.host.ne.jp/~user/count/dayxmgr.cgi
##
## [チェックのしかた (ブラウザから最後に ?check をつけて呼出す)]
## http://www.host.ne.jp/~user/count/dayx.cgi?check
## ------------------------------------------------------------------------
## [ディレクトリ構成例 (括弧内はパーミッション) ]
##
## public_html / index.html ... ここにカウンタを設置
## |
## +-- count [777] / dayx.cgi [755]
## | dayxmgr.cgi [755]
## | gifcat.pl [755]
## | dayx.dat [666]
## | day.dat [666]
## | mon.dat [666]
## |
## +-- gif1 / 1.gif 2.gif ... 0.gif
## |
## +-- gif2 / 1.gif 2.gif ... 0.gif
##
## -------------------------------------------------------------------
require './gifcat.pl'; # gifcat.plが同一ディレクトリにある場合
## 基本設定
$figure1 = 6; # 総カウント数の桁数
$figure2 = 3; # 本/昨日カウント数の桁数
$logfile = "./dayx.dat"; # ログファイル
$dayfile = "./day.dat"; # 日次記録ファイル
$monfile = "./mon.dat"; # 月次記録ファイル
$gif_path1 = "./gif1"; # 総カウント数用GIF画像のディレクトリ
$gif_path2 = "./gif2"; # 本/昨日カウント数用GIF画像の 〃
$lockkey = 1; # ファイルロック機構 (0=no 1=symlink 2=open)
$lockfile = "dayx.lock"; # ロックファイル名
$lock_dir = "."; # ロックファイル用ディレクトリ
$type = 1; # タイプ (総カウント数の不要の方は 0とする)
$ip_key = 0; # IPアドレスチェック (0=no 1=日単位 2=時間単位)
## 設定完了
# 引数を解釈
$mode = $ENV{'QUERY_STRING'};
# ロックファイルを定義
$lockfile = "$lock_dir\/$lockfile";
# 更新系処理でないならば2-3秒待たせる
if ($type == 1 && $mode eq "yes") { sleep(3); }
elsif ($type == 1 && $mode eq "today") { sleep(2); }
elsif ($type == 0 && $mode eq "yes") { sleep(2); }
# ロック開始
if ($type == 1 && $mode eq "gif" && $lockkey == 1) { &lock1; }
elsif ($type == 0 && $mode eq "today" && $lockkey == 1) { &lock1; }
elsif ($type == 1 && $mode eq "gif" && $lockkey == 2) { &lock2; }
elsif ($type == 0 && $mode eq "today" && $lockkey == 2) { &lock2; }
# チェックモード
if (!$mode || $mode eq 'check') { ✓ }
# 記録ファイルから読み込み
open(IN,"$logfile") || die "Can't open $logfile : $!";
@lines = ;
close(IN);
$lines[0] =~ s/\n//;
# 記録ファイルを分解
($day_key,$yes,$today,$count,$youbi,$hr) = split(/<>/, $lines[0]);
# 日時を取得
$ENV{'TZ'} = "JST-9";
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time);
$mon++;
$thisday = (Sun,Mon,Tue,Wed,Thu,Fri,Sat) [$wday];
if ($mon < 10) { $mon = "0$mon"; }
$date = "$year\/$mon";
# 本日のカウント数をキーにカウントアップ
if (($type == 1 && $mode eq 'gif') || ($type == 0 && $mode eq 'today')) {
$newcnt = $count + 1;
## 当日処理
if ($day_key == $mday) {
$today++;
# ログをフォーマット
$lines[0] = "$mday<>$yes<>$today<>$newcnt<>$thisday<>$hour<>\n";
# IPアドレスからログチェック
$ipflag = 0;
$addr = $ENV{'REMOTE_ADDR'};
if ($ip_key == 1) { &ip_check1; }
elsif ($ip_key == 2) { &ip_check2; }
}
## 翌日処理
else {
# ログをフォーマット
$new[0] = "$mday<>$today<>1<>$newcnt<>$thisday<>$hour<>\n";
if ($ip_key) {
$new[1] = "$ENV{'REMOTE_ADDR'}\n";
$newhost[1]="$ENV{'REMOTE_HOST'}\n";
}
@lines = @new;
@lineshost = @newhost;
&day_count;
&mon_count;
$today = 1;
}
# ログを更新
if ($ipflag == 0) {
&renew;
$count++;
}
}
# ロック解除
if ($type == 1 && $mode eq 'gif' || $type == 0 && $mode eq 'today') {
unlink($lockfile) if (-e $lockfile);
}
# カウンタ画像出力
&count_view;
exit;
## --- カウンター出力処理
## (とほほさんの wwwcounterを参考にさせていただきました)
sub count_view {
$count += 0;
$cntstr = sprintf(sprintf("%%0%dld", $figure1), $count);
$cntstr2 = sprintf(sprintf("%%0%dld", $figure2), $today);
$cntstr3 = sprintf(sprintf("%%0%dld", $figure2), $yes);
if ($mode eq "gif") {
printf("Content-type: image/gif\n");
printf("\n");
for ($i=0; $i$lockfile");
close(LOCK) || die "Can't write $lockfile : $!";
$flag = 1;
last;
}
}
if ($flag == 0) { die "BUSY : $!"; }
}
## --- 日次カウント数の処理
sub day_count {
# ログの日次キーより本日の日が小さければ月が変わったと判断する
if ($mday < $day_key) {
open(DB,">$dayfile");
print DB "";
close(DB);
}
# 月内での処理
else {
if ($day_key < 10) { $day_key = "0$day_key"; }
open(DB,">>$dayfile");
print DB "$mon\/$day_key \($youbi\)<>$today<>\n";
close(DB);
}
}
## --- 月間カウント数の処理
sub mon_count {
# 初めてのアクセスの場合
if (-z $monfile) {
$mons[0] = "$date<>$today<>\n";
}
else {
open(IN,"$monfile");
@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");
print OUT @mons;
close(OUT);
}
## --- IPアドレスをチェック(日単位)
sub ip_check1 {
@ipdata = @lines;
shift(@ipdata);
foreach (@ipdata) {
chop($_);
if ($addr eq "$_") { $ipflag=1; last; }
}
push(@lines,"$addr\n");
}
## --- IPアドレスをチェック(時間単位)
sub ip_check2 {
if ($hour eq "$hr") { &ip_check1; }
else {
$temp = $lines[0];
@lines = ();
$lines[0] = "$temp";
$lines[1] = "$addr" . "\n";
}
}
## --- データ更新処理
sub renew {
# テンポラリーファイルを定義
$prono = "$$";
if ($prono eq "") {
srand;
$prono = 1000000000000000 * rand;
}
$tmpfile = "$lock_dir\/$prono\.tmp";
# テンポラリーファイルを作成
if (!open(OUT,">$tmpfile")) {
if (-e $lockfile) { unlink($lockfile); }
die "Can't write tempfile : $!";
}
print OUT @lines;
close(OUT);
chmod(0666,$tmpfile);
# リネーム処理
rename($tmpfile,$logfile);
# もしテンポラリーファイルが残っていたら削除
if (-e $tmpfile) { unlink($tmpfile); }
}
## --- チェックモード
sub check {
print "Content-type: text/html\n\n";
print "DAY COUNTER-EX\n";
print "\n\n";
# ログファイルのパス確認
if (-e $logfile) {
print "- ログファイルのパス : OK!";
} else {
print "
- ログファイルがありません。";
}
# ログファイルのパーミッション(読みこみ)
if (-r $logfile) {
print "
- ログファイルの読みこみパーミッション : OK!";
} else {
print "
- ログファイルの読みこみパーミッションが不正です。";
}
# ログファイルのパーミッション(書きこみ)
if (-w $logfile) {
print "
- ログファイルの書きこみパーミッション : OK!";
} else {
print "
- ログファイルが書きこみパーミッションが不正です。";
}
# 画像ディレクトリ1のパス確認
if (-d $gif_path1) {
print "
- gif1ディレクトリのパス : OK!";
} else {
print "
- gif1ディレクトリがありません。";
}
# 画像ディレクトリ2のパス確認
if (-d $gif_path2) {
print "
- gif2ディレクトリのパス : OK!";
} else {
print "
- gif2ディレクトリがありません。";
}
print "
\n\n";
exit;
}