#!/usr/local/bin/perl
#
# (SSI式) WebACCESS v2.3 is Free. (c)rescue.ne.jp
#

#-------------------------------------------------------------------#

# ログ記録ファイルとアクセスカウント数ファイルをフルパスで設定
# 相対パスで指定するときは、ＳＳＩ記述するＨＴＭＬから見た位置を指定
#
$log = "./log.csv";

# 集計に含めないＵＲＬを指定（この文字列を含むデータを記録しない）
$mine = "http://www.xxx.or.jp/~user/";

# 最大ログ記録件数
$max = "1000";

#-------------------------------------------------------------------#

# 時刻取得
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
if ($hour < 10) { $hour = "0$hour"; }

#-------------------------------------------------------------------#

# ブラウザ名の取得
# Mozilla/3.0 (Windows 95; I) の場合 -> Mozilla/3
# Mozilla/2.0 (compatible; MSIE 3.01; Windows 95) の場合 -> MSIE/3 (Mozilla/2 compatible)

$HTTP_USER_AGENT = $ENV{'HTTP_USER_AGENT'};
$HTTP_USER_AGENT =~ s/</&lt;/g;
$HTTP_USER_AGENT =~ s/>/&gt;/g;

($hua,$vers) = split('/',$HTTP_USER_AGENT);

if ($vers =~ /MSIE/) {

   ($hua1,$dummy1) = split(/MSIE /,$vers);
   ($hua2,$dummy2) = split(/\;/,$dummy1);
   ($hua3,$dummy3) = split(/\./,$hua2);
   ($hua4,$dummy4) = split(/\(/,$vers);
   ($hua5,$dummy5) = split(/\./,$hua4);
    $hua ="MSIE\/$hua3 (Mozilla/$hua5 compatible)";
}

elsif ($hua eq "Mozilla") {

   ($hua4,$dummy4) = split(/\(/,$vers);
   ($hua5,$dummy5) = split(/\./,$hua4);
    $hua ="Mozilla\/$hua5";
}

#-------------------------------------------------------------------#

# リモートホスト名の判定
$rh = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
if ($rh eq '') { $rh = $addr; }
if ($rh eq $addr) { $rh = gethostbyaddr(pack('C4',split(/\./,$rh)),2) || $addr; }

if ($rh =~ /(.*)\.(\d+)$/) { ; }
elsif ($rh =~ /(.*)\.(.*)\.(.*)\.(.*)$/) { $rh = "\*\.$2\.$3\.$4"; }
elsif ($rh =~ /(.*)\.(.*)\.(.*)$/) { $rh = "\*\.$2\.$3"; }

#-------------------------------------------------------------------#

# リンク元の取得
$ref = $ENV{'HTTP_REFERER'};
if ($ref =~ /$mine/i || $ref =~ /file:/) { $ref = ""; }

#-------------------------------------------------------------------#

if (!open(DB,"$log")) { &error(1); }
@lines = <DB>;
close(DB);

$ic = 0;
foreach $line (@lines) {

	$ic++;
	if ($ic == $max) { last; }
	push(@new,$line);
}

$value = "$hour\,$ref\,$rh\,$hua\n";
unshift(@new,$value);

if (!open(DB,">$log")) { &error(2); }
print DB @new;
close(DB);

sub error { print "ERROR $_[0]"; exit; }
