#!/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; }