#!/usr/bin/perl #--------------------------------------------------------------------------------------------# #Copyright (C) 1998-2000 by pika@cgi-club.com $script_nickname = 'imCTHTM'; $support_url = 'http://www.cgi-club.com/'; #------------------ ver -------- [ DATE ] - NOTE ----------------------------------------# $script_version = 'ver1.01'; # [2000/05/23] デフォルトのファイル構成を変更、Javaと組み合わせHTML起動でリンク元が取得できるように変更 #script_version = 'ver1.00'; # [2000/04/01] 作成 #--------------------------------------------------------------------------------------------# # ユーザ変数設定(ここから)-----------------------------------------------------------------# # 【注意】フレームを利用してカウンタを表示させる場合は$im_env{'set_url'}に存在しないURLを設定して下さい。 $im_env{'set_url'} = "http://www.foo.com/~boo/";#設置するホームページのURL $im_env{'gifcat_pl'} = "./pgifcat.pl"; #画像連結スクリプト(このファイルからの相対パス) $im_env{'dat_dir'} = "./data"; #データ用ディレクトリ(このファイルからの相対パス) $im_env{'lock_dir'} = "./lock"; #ファイルロック用ディレクトリ(このファイルからの相対パス) $im_env{'img_dir'} = "./img"; #カウンタ画像用ディレクトリ(このファイルからの相対パス) $im_env{'count_dat'} = "ct.dat"; #カウントデータファイル名(ファイル名のみ指定) $im_env{'access_log'} = "ac.log"; #アクセスログファイル名(ファイル名のみ指定) $im_env{'ct_lock'} = "ct.lock"; #カウントデータ用ロックファイル名(ファイル名のみ指定) $im_env{'ac_lock'} = "ac.lock"; #アクセスログ用ロックファイル名(ファイル名のみ指定) $im_env{'use_lock'} = "yes"; #ファイルロックがかかったままになるときは "no"(できるだけ "yes"で使用) $im_env{'need_aclog'} = "yes"; #アクセスログが必要ときは "yse" 不要なときは "no"("no"を指定した場合はリロードカウントアップ防止は機能しません) $im_env{'access_num'} = 20; #アクセスロ最大記録行数(あまり多いと動作が遅くなります) $im_env{'retry_limit'} = 10; #リロードカウントアップ防止時間(リロードによるカウントアップを禁止する時間:秒) $im_env{'ct_digit'} = 5; #カウンタの最小表示桁数 $im_env{'ct_align'} = "H"; #カウンタ画像の連結方向("H"のとき水平方向、"V"のとき垂直方向) # ユーザ変数設定(ここまで)-----------------------------------------------------------------# require "$im_env{'gifcat_pl'}"; if($ENV{'QUERY_STRING'}=~s/ref=//){$ENV{'HTTP_REFERER'}=$ENV{'QUERY_STRING'};} open(CT,"$im_env{'dat_dir'}/$im_env{'count_dat'}"); $ct=; close(CT);unless($ct){$ct=0;} if($ENV{'HTTP_REFERER'}=~m/$im_env{'set_url'}/){ &exit_script($ct,*im_env); } elsif($im_env{'need_aclog'} eq "yes"){ $time=time; $cht=$time-$im_env{'retry_limit'}; open(ACLOG,"$im_env{'dat_dir'}/$im_env{'access_log'}"); @ac_log=; close(ACLOG); foreach $i (@ac_log){ @buf=split(/,/,$i); if($buf[1]=~m/$ENV{'REMOTE_ADDR'}/){ if($buf[2]>$cht){ $i="$buf[0],$ENV{'REMOTE_ADDR'},$time,$ENV{'HTTP_USER_AGENT'},$buf[4]"; $add_flag=1; last; } } } unless($add_flag){ $ct++; $add_data="$ct,$ENV{'REMOTE_ADDR'},$time,$ENV{'HTTP_USER_AGENT'},$ENV{'HTTP_REFERER'}\n"; unshift(@ac_log,$add_data); } if($im_env{'use_lock'} eq "yes"){&set_lock($im_env{'lock_dir'},$im_env{'ac_lock'});} open(ACLOG,">$im_env{'dat_dir'}/$im_env{'access_log'}"); eval "flock(2,ACLOG)"; seek(ACLOG,0,0); foreach $i (0 .. $#ac_log){ if($i>$im_env{'access_num'}){last;} print ACLOG $ac_log[$i]; } $file_size = tell(ACLOG); truncate(ACLOG,$file_size); close(ACLOG); if($im_env{'use_lock'} eq "yes"){&reset_lock($im_env{'lock_dir'},$im_env{'ac_lock'});} } else{$ct++;} if($im_env{'use_lock'} eq "yes"){&set_lock($im_env{'lock_dir'},$im_env{'ct_lock'});} if(open(CT,">$im_env{'dat_dir'}/$im_env{'count_dat'}")){ eval "flock(2,CT)"; seek(CT,0,0); print CT "$ct\n"; close(CT); } if($im_env{'use_lock'} eq "yes"){&reset_lock($im_env{'lock_dir'},$im_env{'ct_lock'});} &exit_script($ct,*im_env); exit 0; sub exit_script{ local($out,*v)=@_; local($i,$x,@img_file); $out=sprintf('%0'.$v{'ct_digit'}.'d',$out); foreach $i (0..length($out)-1){ $x=substr($out,$i,1); $img_file[$i]="$v{'img_dir'}/$x\.gif"; } select(STDOUT);$|=1; binmode(STDOUT); print "Content-type: image/gif\n\n"; if($v{'ct_align'} eq 'V'){ print &gifcat'gifcatv(@img_file); } else{print &gifcat'gifcat(@img_file);} exit 0; } sub set_lock{ local($s_l_file)="$_[0]/$_[1]"; local($s_l_tmpfile)="$_[0]/$$".$_[1]; local($s_l_retry)=5; while ($s_l_retry){ if(rename($s_l_file,$s_l_tmpfile)){return 1;} else{sleep(1);$s_l_retry--;} } return 0; } sub reset_lock{ local($r_l_file)="$_[0]/$_[1]"; local($r_l_tmpfile)="$_[0]/$$".$_[1]; if(rename($r_l_tmpfile,$r_l_file)){return 1;} return 0; }