#!/usr/local/bin/perl

#┌─────────────────────────────────
#│ DAY COUNTER v2.7 (2006/10/10)
#│ Copyright (c) KentWeb
#│ webmaster@kent-web.com
#│ http://www.kent-web.com/
#└─────────────────────────────────
$ver = 'DayCounter v2.7';
#┌─────────────────────────────────
#│ [注意事項]
#│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した
#│    いかなる損害に対して作者は一切の責任を負いません。
#│ 2. 設置に関する質問はサポート掲示板にお願いいたします。
#│    直接メールによる質問は一切お受けいたしておりません。
#└─────────────────────────────────
#
# [ ディレクトリ構成例 ]
#
#  public_html / index.html (ホームディレクトリ）
#       |
#       +-- daycount / daycount.cgi [705]
#              |       daycount.dat [606]
#              |       gifcat.pl    [604]
#              |
#              +-- gif1 / 0.gif, 1.gif, ..... 9.gif
#              |
#              +-- gif2 / 0.gif, 1.gif, ..... 9.gif
#
#
# [ タグの書き方の例 ]
#
#  総カウント数 	<img src="パス/daycount.cgi?gif">
#  本日のカウント数 	<img src="パス/daycount.cgi?today">
#  昨日　　〃		<img src="パス/daycount.cgi?yes">
#
#  ▼動作チェックのしかた (ブラウザから最後に ?check をつけて呼出す）
#    http://〜〜/daycount.cgi?check

#=================================================
#  設定項目
#=================================================

# 画像連結ライブラリ取込み
require './gifcat.pl';

# 総カウント数の桁数
$digit1 = 5;

# 本/昨日カウント数の桁数
$digit2 = 3;

# 記録ファイル
$logfile = './daycount.dat';

# 総カウント用GIF画像のディレクトリ
#  → フルパスだと / から始るパス
$gifdir1 = './gif1';

# 本/昨日カウント用GIF画像のディレクトリ
#  → フルパスだと / から始るパス
$gifdir2 = './gif2';

# IPアドレスの二重カウントチェック
#  0 : チェックしない
#  1 : チェックする
$ip_check = 1;

# カウンタの機能タイプ
#  0 : 総カウント数不要（昨日／本日のみ）
#  1 : 標準タイプ
$type = 1;

#=================================================
#  設定完了
#=================================================

# 引数受取
$mode = $ENV{'QUERY_STRING'};
$mode =~ s/\W//g;

# チェックモード
if (!$mode || $mode eq 'check') { &check; }

# 未更新処理は少し待たせる
if ($type) {
	if ($mode ne "gif") { select(undef,undef,undef,0.5); }
} else {
	if ($mode eq "yes") { select(undef,undef,undef,0.5); }
}

# 記録ファイル読み込み
open(DAT,"+< $logfile") || &error;
eval "flock(DAT, 2);";
$data = <DAT>;

# 記録ファイル分解
($key, $yes, $tod, $count, $ip) = split(/<>/, $data);

# 本日の日を取得
$ENV{'TZ'} = "JST-9";
($mday) = (localtime(time))[3];

# IPチェック
$flg = 0;
if ($ip_check) {
	$addr = $ENV{'REMOTE_ADDR'};
	if ($addr eq $ip) { $flg = 1; }
}

# 本日のカウント数をキーにしてカウントアップ
if ((!$flg && $type && $mode eq "gif") || (!$flg && !$type && $mode eq "today")) {

	if ($key eq $mday) {
		$tod++;
	} else {
		$yes = $tod;
		$tod = 1;
	}

	# カウントアップ
	$count++;

	# 記録ファイル更新
	seek(DAT, 0, 0);
	print DAT "$mday<>$yes<>$tod<>$count<>$addr";
	truncate(DAT, tell(DAT));
}
close(DAT);

# 画像表示
if ($mode eq "gif") { &gifview($count, $digit1, $gifdir1); }
elsif ($mode eq "yes") { &gifview($yes, $digit2, $gifdir2); }
else { &gifview($tod, $digit2, $gifdir2); }
exit;

#-------------------------------------------------
#  カウンタ画像出力
#-------------------------------------------------
sub gifview {
	local(@view);
	local($data, $digit, $dir) = @_;

	# 桁数調整
	while ( length($data) < $digit ) {
		$data = '0' . $data;
	}
	foreach ( split(//, $data) ) {
		push(@view,"$dir/$_.gif");
	}

	# 画像連結
	print "Content-type: image/gif\n\n";
	binmode(STDOUT);
	print &gifcat'gifcat(@view);
}

#-------------------------------------------------
#  エラー処理
#-------------------------------------------------
sub error {
	# エラー画像を定義
	local($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 ( split(/\s/, $err) ) {
		print pack('C*',hex($_));
	}
	exit;
}

#-------------------------------------------------
#  チェックモード
#-------------------------------------------------
sub check {
	print "Content-type: text/html\n\n";
	print <<EOM;
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=shift_jis">
<title>DAY COUNTER</title>
</head>
<body>
<h2>Check Mode</h2>
<ul>
EOM

	# ログファイルのパス確認
	if (-e $logfile) {
		print "<li>ログファイルのパス : OK!\n";
		# ログファイルのパーミッション
		if (-r $logfile && -w $logfile) {
			print "<li>ログファイルのパーミッション : OK!\n";
		} else {
			print "<li>ログファイルのパーミッション : NG → $logfile\n";
		}
	} else {
		print "<li>ログファイルのパス : NG → $logfile\n";
	}

	# 画像ディレクトリ
	foreach ( $gifdir1, $gifdir2 ) {
		# ディレクトリパス確認
		if (-d $_) {
			print "<li>画像ディレクトリパス ( $_ ) : OK!\n";
		} else {
			print "<li>画像ディレクトリのパス : NG → $_\n";
		}

		# 画像チェック
		foreach $i (0 .. 9) {
			if (-e "$_/$i.gif") {
				print "<li>画像 : $_/$i.gif → OK!\n";
			} else {
				print "<li>画像 : $_/$i.gif → NG!\n";
			}
		}
	}

	# 著作権表示：削除禁止
	print <<EOM;
<li>バージョン : <a href="http://www.kent-web.com/">$ver</a>
</ul>
</body>
</html>
EOM
	exit;
}


