#!/usr/local/bin/perl #┌───────────────────────────────── #│ DAY COUNTER-EX v3.4 (2002/06/19) #│ Copyright(C) KENT WEB 2002 #│ webmaster@kent-web.com #│ http://www.kent-web.com/ #└───────────────────────────────── $ver = 'DayX v3.4'; #┌───────────────────────────────── #│ [注意事項] #│ 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 = 6; # 本/昨日カウント数の桁数 $digit2 = 4; # ログファイル $logfile = "./dayx.dat"; # 日次記録ファイル $dayfile = "./day.dat"; # 月次記録ファイル $monfile = "./mon.dat"; # 総カウント数用GIF画像のディレクトリ $gifdir1 = "./gif1"; # 本/昨日カウント数用GIF画像のディレクトリ $gifdir2 = "./gif2"; # ファイルロック機構 # 0 : しない # 1 : する (symlink関数式) # 2 : する (mkdir関数式) $lockkey = 1; # ロックファイル名 $lockfile = "./lock/dayx.lock"; # カウンタの機能タイプ # 0 : 総カウント数不要(昨日/本日のみ) # 1 : 標準タイプ $type = 1; # IPアドレスの二重カウントチェック # 0 : チェックしない # 1 : チェックする $ip_check = 0; #============# # 設定完了 # #============# # 引数を解釈 $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 { 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\n"; print "\n", "

Check Mode

\n", "\n\n"; exit; }