#!/usr/local/bin/perl

#┌─────────────────────────────────
#│ e-Counter v1.4 (2008/09/01)
#│ Copyright (c) KentWeb
#│ webmaster@kent-web.com
#│ http://www.kent-web.com/
#└─────────────────────────────────
$ver = 'e-Counter v1.4';
#┌─────────────────────────────────
#│ [注意事項]
#│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した
#│    いかなる損害に対して作者は一切の責任を負いません。
#│ 2. 設置に関する質問はサポート掲示板にお願いいたします。
#│    直接メールによる質問は一切お受けいたしておりません。
#└─────────────────────────────────
#
# 【ディレクトリ／ファイル構成例】かぎかっこ内はパーミッション値
#
#  public_html / index.html (トップページ)
#       |
#       +-- cgi-bin / ecount.cgi [705]
#              |      ecount.dat [606]
#              |
#              +-- gif / 0.gif 1.gif .... 9.gif
#
# 【タグの書き方】
#  (1) IMGタグを「桁数」分だけ記述する
#  (2) 右のタグから左のタグへ順に、引数を数字（桁数）で記述する
#
#   例1 ： 4桁で表示したいとき
#  <img src="cgi-bin/ecount.cgi?4">
#  <img src="cgi-bin/ecount.cgi?3">
#  <img src="cgi-bin/ecount.cgi?2">
#  <img src="cgi-bin/ecount.cgi?1">
#
#   例2 ： 6桁で表示したいとき
#  <img src="cgi-bin/ecount.cgi?6">
#  <img src="cgi-bin/ecount.cgi?5">
#  <img src="cgi-bin/ecount.cgi?4">
#  <img src="cgi-bin/ecount.cgi?3">
#  <img src="cgi-bin/ecount.cgi?2">
#  <img src="cgi-bin/ecount.cgi?1">
#
#  ↑例は見やすいようにタグ毎に改行していますが、実際は改行せずに
#    全てのタグを一行で記述します。
#
# 【チェックモード】
#  ・引数に「check」を付けて呼び出すと簡易的な設定チェックを行ないます
#
#  例：http://www.xxx.zzz/cgi-bin/ecount.cgi?check

#-------------------------------------------------
#  設定項目
#-------------------------------------------------

# ログファイル
$logfile = './ecount.dat';

# 画像形式
# G : GIF  (画像拡張子は「.gif」とすること)
# J : JPEG (画像拡張子は「.jpg」とすること)
# P : PNG  (画像拡張子は「.png」とすること)
$imgtype = 'G';

# 画像ディレクトリ（最後は / で終わること）
# → フルパスだと / から始まるパス（http://からではない）
$imgdir = './gif1/';

# IPチェック機能（重複カウント対策）
# 0=no 1=yes
$ipcheck = 1;

#-------------------------------------------------
#  設定完了
#-------------------------------------------------

# 引数を取得
$buf = $ENV{'QUERY_STRING'};
$buf =~ s/\W//g;

# 引数がない場合はエラー
if ($buf eq "") { &error; }

# 画像の拡張子とMIMEヘッダを定義
if ($imgtype eq 'J') { $tail='.jpg'; $mime='jpeg'; }
elsif ($imgtype eq 'P') { $tail='.png'; $mime='x-png'; }
else { $tail='.gif'; $mime='gif'; }

# チェックモードのときはチェック処理
if ($buf eq "check") { &check; }

# ログを読み込んで分解
open(DAT,"+< $logfile") || &error;
eval "flock(DAT, 2);" if ($buf == 1);
$count = <DAT>;

# 分解
($count, $ip) = split(/:/, $count);

# IPチェック
$flg = 0;
$addr = $ENV{'REMOTE_ADDR'};
if (($ipcheck && $addr ne $ip) || !$ipcheck) {
	$flg = 1;
	$count++;
}

# カウント数を１文字毎に分解して表示画像を定義
@file = split(//, $count);
if ($#file + 1 >= $buf) {
	$view = $file[$#file + 1 - $buf];
} else {
	$view = '0';
}

# 画像を読み込んで表示
open(IMG,"$imgdir$view$tail") || &error;
print "Content-type: image/$mime\n\n";
binmode(IMG);
binmode(STDOUT);
print <IMG>;
close(IMG);

# ログ更新モード
if ($buf == 1 && $flg == 1) {
	seek(DAT, 0, 0);
	print DAT "$count:$addr";
	truncate(DAT, tell(DAT));
} else {
	select(undef, undef, undef, 0.5);
}

close(DAT);
exit;

#-------------------------------------------------
#  エラー処理
#-------------------------------------------------
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 (@err) {
		print pack('C*',hex($_));
	}
	exit;
}

#-------------------------------------------------
#  チェック機構
#-------------------------------------------------
sub check {
	print "Content-type: text/html\n\n";
	print "<html><head><title>$ver</title></head>\n";
	print "<body><h2>Check Mode</h2>\n<ul>\n";

	# ログのパス
	if (-e $logfile) {
		print "<li>ログファイルのパス：OK!\n";

		if (-r $logfile && -w $logfile) {
			print "<li>ログファイルのパーミッション：OK!\n";
		} else {
			print "<li>ログファイルのパーミッションが不正です\n";
		}
	} else { print "<li>ログファイルのパスが不正です：$logfile\n"; }

	# 画像ファイル
	foreach (0 .. 9) {
		if (-e "$imgdir$_$tail") {
			print "<li>画像：$imgdir$_$tail → OK! \n";
		} else {
			print "<li>画像：$imgdir$_$tail → NG! \n";
		}
	}

	# 著作権表示（削除・改変不可）
	print "<p><!-- $ver --><small>\n";
	print "- <a href='http://www.kent-web.com/'>$ver</a> -\n";
	print "</small></ul>\n</body>\n</html>\n";
	exit;
}


