#!/usr/local/bin/perl
#┌─────────────────────────────────
#│ CUPID COUNTER v1.1 (2001/10/07)
#│ Copyright(C) KENT WEB 1997-2001
#│ webmaster@kent-web.com
#│ http://www.kent-web.com/
#└─────────────────────────────────
$ver = 'CupidCounter v1.1';
#┌─────────────────────────────────
#│ [注意事項]
#│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した
#│ いかなる損害に対して作者は一切の責任を負いません。
#│ 2. 設置に関する質問はサポート掲示板にお願いいたします。
#│ 直接メールによる質問は一切お受けいたしておりません。
#└─────────────────────────────────
#
# [ ディレクトリ構成例 ]
#
# ***.co.jp / index.html ... (ここにカウンタを設置)
# |
# +----- cgi-bin
# |
# +-- cupid / cupid.cgi
# | cupid.js
# | gifcat.pl
# +--- gif1 / 0.gif
# | 1.gif
# | :
# | 9.gif
#
# [タグの書き方の例](***.co.jp の部分は自分のドメインに置き換えてください)
#
# 総カウント数
#
#
# 本日・昨日のカウント数
#
#
#
# *チェックのしかた (ブラウザから最後に ?check をつけて呼出す)
# http://www.***.co.jp/cgi-bin/cupid/cupid.cgi?check
#============#
# 設定項目 #
#============#
#【重要】●の箇所のパスを変更してください。(例、***.co.jpの場合)
# ***.com であれば、***_com となります。
# ●画像連結ライブラリ取り込み
require 'D:\\users\\itmstr_com\\usa\\cgi-bin\\cupid\\gifcat.pl';
# ●ログファイル
$logfile = 'D:\\users\\itmstr_com\\usa\\cgi-bin\\cupid\\cupid.js';
# ●GIF画像ディレクトリ
# → 最後は \\ で閉じる
$gifdir = 'D:\\users\\itmstr_com\\usa\\cgi-bin\\cupid\\gif\\';
# GIFカウンタの桁数
$digit = 6;
# 二重カウント防止機能 (0=no 1=yes)
# → 直前のIPアドレスをチェックし同一のIPであればカウントしない
$ip_chk = 0;
# ファイルロック機構
# 0 : しない
# 1 : する(symlink関数)
# 2 : する(mkdir関数)→ サーバで symlink関数が使用不可の場合
$lockkey = 2;
# ●ロックファイル名
$lockfile = 'D:\\users\\itmstr_com\\usa\\cgi-bin\\cupid\\cupid.lock';
#============#
# 設定完了 #
#============#
#----------------------- これより処理開始 -----------------------#
#この行以下を書き換えられた場合、サポートの対象外となりますのでご注意下さい#
# テストモード
if ($ENV{'QUERY_STRING'} eq "check") { &CheckMode; }
# 日を取得
$ENV{'TZ'} = "JST-9";
$mday = (localtime(time))[3];
# IPアドレスを取得
$addr = $ENV{'REMOTE_ADDR'};
# ロック開始
&lock if ($lockkey);
open(IN,"$logfile") || &error;
$data = ;
close(IN);
($x,$day,$x,$count,$x,$yest,$x,$to,$x) = split(/\'/, $data);
($day,$ip) = split(/:/, $day);
$flag=0;
if ($ip_chk && $addr eq $ip) { $flag = 1; }
if (!$ip_chk) { $addr = ""; }
if (!$flag) {
if ($mday == $day) {
$cnt = $count + 1;
$to++;
$data = "D=\'$day\:$addr\'\;C=\'$cnt\'\;Y=\'$yest\'\;T=\'$to\'\;";
} else {
$cnt = $count + 1;
$data = "D=\'$mday\:$addr\'\;C=\'$cnt\'\;Y=\'$to\'\;T=\'1\'\;";
}
# 更新
open(OUT,">$logfile") || &error;
print OUT $data;
close(OUT);
}
# ロック解除
&unlock if ($lockkey);
# 画像出力
while (length($count) < $digit) { $count = '0' . $count; }
@array = split(//, $count);
@image=();
foreach (@array) { push(@image,"$gifdir$_\.gif"); }
print "Content-type: image/gif\n\n";
binmode(STDOUT);
print &gifcat'gifcat(@image);
exit;
#--------------#
# ロック処理 #
#--------------#
sub lock {
local($retry)=5;
if (-e $lockfile) {
local($mtime) = (stat($lockfile))[9];
if ($mtime && $mtime < time - 180) { &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 error {
&unlock if ($lockflag);
@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 CheckMode {
print "Content-type: text/html\n\n";
print "$ver\n";
print "\nCheck Mode
\n\n";
# ログファイルのパス確認
if (-e $logfile) { print "- ログファイルのパス : OK!\n"; }
else { print "
- ログファイルがありません\n"; }
# ログファイルのパーミッション
if (-r $logfile && -w $logfile) {
print "
- ログファイルのパーミッション : OK!\n";
} else {
print "
- ログファイルのパーミッションが不正です\n";
}
# 画像ディレクトリのパス確認
if (-d $gifdir) { print "
- gifディレクトリのパス : OK!\n"; }
else { print "
- gifディレクトリのパスが不正です → $gifdir\n"; }
# 画像チェック
$flag=0;
foreach (0 .. 9) {
if (-e "$gifdir$_\.gif") {
print "
- 画像OK → $_\.gif";
} else {
print "
- 画像NG → $_\.gif";
}
}
# ロックディレクトリ
print "
- ロック形式 : ";
if ($lockkey == 0) { print "ロック設定なし\n"; }
else {
if ($lockkey == 1) { print "symlink\n"; }
else { print "mkdir\n"; }
$lockfile =~ s/(.*)[\\\/].*$/$lockdir = $1/e;
print "
- ロックディレクトリ : $lockdir\n";
if (-d $lockdir) { print "
- ロックディレクトリのパス : OK\n"; }
else { print "
- ロックディレクトリのパス : NG → $lockdir\n"; }
if (-r $lockdir && -w $lockdir && -x $lockdir) {
print "
- ロックディレクトリのパーミッション : OK\n";
} else {
print "
- ロックディレクトリのパーミッション : NG → $lockdir\n";
}
}
# 著作権表示:削除禁止
print "
\n\n\n";
exit;
}