#!/usr/local/bin/perl

#####################################################
# LOG Viewer v2.00 for Web Analyzer (c)rescue.ne.jp #
#####################################################

# [History]
# 11/FEB/1999 v1.02 隔罫線が正しく表示されないバグの修正
# 11/MAY/1999 v1.04 ＯＳ記録のデータ更新
# 17/JUL/1999 v1.05 log.plのバグ修正
# 06/NOV/1999 v2.00 カウンター機能の追加

# analyze.cgiから見たログフォルダの場所(path)
$log_dir = './log/';

# 各解析項目の最大表示数
$max = 30;

# analyze.cgiから見たグラフ用画像の場所(URL)
$gif = './images/bar.gif'; #色付
$gif2 = './images/blank.gif'; #背景と同じ色

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

$buffer = $ENV{'QUERY_STRING'};

if ($buffer =~ /Yesterday/i) {

	($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time - 24*60*60);
}
elsif ($buffer =~ /Today/i) {

	($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
}
else {

	&error('Web Analyzer',"<a href=\"analyze.cgi?Yesterday\">Yesterday</a><br>\n<a href=\"analyze.cgi?Today\">Today</a>");
}

@wday_array = ('SUN','MON','TUE','WED','THU','FRI','SAT');
$date = sprintf("%01d\/%01d(%s)",$mon +1,$mday,$wday_array[$wday]);
$log = sprintf("%04d%02d%02d",$year +1900,$mon +1,$mday);

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

$log = "$log_dir$log";

open(LOG,$log) || &error('Log Not Found','');
@lines = <LOG>;
close(LOG);

foreach $data (@lines) {

	chop($data);
	($HOUR,$HTTP_REFERER,$REMOTE_HOST,$HTTP_USER_AGENT,$OS) = split(/\t/,$data);

	$i++;

	if ($HOUR ne '') { $hour{$HOUR}++; $j++; }
	if ($HTTP_REFERER ne '') { $ref{$HTTP_REFERER}++; $k++; }
	if ($REMOTE_HOST ne '') { $host{$REMOTE_HOST}++; $l++; }
	if ($HTTP_USER_AGENT ne '') { $agent{$HTTP_USER_AGENT}++; $m++; }
	if ($OS ne '') { $os{$OS}++; $n++; }
}

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

$count = -s $log_file;

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

print "Content-type: text/html\n\n";
print <<"EOF";
<html><head><title>LOG Analyzer</title></head>
<body bgcolor=#ffffff>
<h1>LOG Analyzer</h1>

<h2>$i at $date</h2>

<h3>HOUR<hr></h3>

<table cellpadding=0 cellspacing=0>
<tr>
EOF

foreach $hour (sort { $hour{$b} <=> $hour{$a} } keys %hour) { $hourmax = $hour{$hour}; last; }
$magnification = $hourmax / 100;

$f = 0;
foreach $hour (0 .. 23) {

	$hour = sprintf("%02d",$hour);
	if ($j != 0) { $bar = $hour{$hour}; }

	print "<td align=center>\n";

	$bar = $bar / $magnification;
	$bar = int($bar);

	if ($bar == 0) { print "<img src=\"$gif2\" WIDTH=20 HEIGHT=1></td>\n"; }
	else {

		$blank = 100 - $bar;
		if ($blank != 0 ) { print "<img src=\"$gif2\" WIDTH=20 HEIGHT=$blank><br>"; }

		print "<font size=-1>$hour{$hour}</font><br>";
		print "<img src=\"$gif\" WIDTH=15 HEIGHT=$bar></td>\n";

		next;
	}
}

print <<"EOF";
</tr>
<tr>
EOF

foreach $hour (0 .. 23) {

	if ($hour < 12) { $bgcolor = "bgcolor=#eeddff"; } else { $bgcolor = "bgcolor=#ffeedd"; }

	print "<td align=center $bgcolor><font size=-1>$hour</font></td>\n";
}

print <<"EOF";
</tr>
</table>
<p>

<h3>HTTP_REFERER<hr></h3>

<table cellpadding=0 cellspacing=0>
EOF

if ($k == 0) { print "<tr><td>None</td></tr>\n"; }
else {

	$before = '';
	$num = $border = $f = 0;
	foreach $ref (sort { $ref{$b} <=> $ref{$a} } keys %ref) {


		$num++;
		if ($num > $max) { print "<tr><td>.<br>.<br>.</td></tr>\n"; last; }

		$bar = $ref{$ref};

		if ($f == 0) { $f = 1; $magnification = $bar / 100; $bar = 100; }
		else { $bar = $bar / $magnification; }

		$bar = int($bar);

		if ($bar == 0) { $bar = 1; }

		$border++;
		if ($border % 2 != 0) { $bgcolor = "bgcolor=#ffeedd"; } else { $bgcolor = ""; }

		if (length($ref) > 70) { $url = substr($ref,0,67) . "..."; } else { $url = $ref; }
		$url =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;

		if ($before eq '') { $number = "1"; }
		if ($before == $ref{$ref}) { $number = ""; }
		else { $number = $num; }

		$before = $ref{$ref};

		print "<tr>\n";
		print "<td align=right>$number</td>\n";
		print "<td $bgcolor><a href=\"$ref\" target=\"_blank\">$url</a></td>\n";
		print "<td><img src=\"$gif\" WIDTH=$bar HEIGHT=10> <font size=-1>$ref{$ref}<font></td>\n";
		print "</tr>\n";
	}
}

print <<"EOF";
</table>
<p>

<h3>REMOTE_HOST<hr></h3>

<table cellpadding=0 cellspacing=0>
EOF

if ($l == 0) { print "<tr><td>None</td></tr>\n"; }
else {

	$before = '';
	$num = $border = $f = 0;
	foreach $host (sort { $host{$b} <=> $host{$a} } keys %host) {

		$num++;
		if ($num > $max) { print "<tr><td>.<br>.<br>.</td></tr>\n"; last; }

		$bar = $host{$host};

		if ($f == 0) { $f = 1; $magnification = $bar / 100; $bar = 100; }
		else { $bar = $bar / $magnification; }

		$bar = int($bar);

		if ($bar == 0) { $bar = 1; }

		$border++;
		if ($border % 2 != 0) { $bgcolor = "bgcolor=#ffeedd"; } else { $bgcolor = ""; }

		if ($before eq '') { $number = "1"; }
		if ($before == $host{$host}) { $number = ""; }
		else { $number = $num; }

		$before = $host{$host};

		print "<tr>\n";
		print "<td align=right>$number</td>\n";
		print "<td $bgcolor>$host</td>\n";
		print "<td><img src=\"$gif\" WIDTH=$bar HEIGHT=10> <font size=-1>$host{$host}<font></td>\n";
		print "</tr>\n";
	}
}

print <<"EOF";
</table>
<p>

<h3>HTTP_USER_AGENT<hr></h3>

<table cellpadding=0 cellspacing=0>
EOF

if ($m == 0) { print "<tr><td>None</td></tr>\n"; }
else {

	$before = '';
	$num = $border = $f = 0;
	foreach $agent (sort { $agent{$b} <=> $agent{$a} } keys %agent) {

		$num++;
		if ($num > $max) { print "<tr><td>.<br>.<br>.</td></tr>\n"; last; }

		$bar = $agent{$agent};

		if ($f == 0) { $f = 1; $magnification = $bar / 100; $bar = 100; }
		else { $bar = $bar / $magnification; }

		$bar = int($bar);

		if ($bar == 0) { $bar = 1; }

		$border++;
		if ($border % 2 != 0) { $bgcolor = "bgcolor=#ffeedd"; } else { $bgcolor = ""; }

		if ($before eq '') { $number = "1"; }
		elsif ($before == $agent{$agent}) { $number = ""; }
		else { $number = $num; }

		$before = $agent{$agent};

		print "<tr>\n";
		print "<td align=right>$number</td>\n";
		print "<td $bgcolor>$agent</td>\n";
		print "<td><img src=\"$gif\" WIDTH=$bar HEIGHT=10> <font size=-1>$agent{$agent}<font></td>\n";
		print "</tr>\n";
	}
}

print <<"EOF";
</table>
<p>

<h3>OS<hr></h3>

<table cellpadding=0 cellspacing=0>
EOF

if ($n == 0) { print "<tr><td>None</td></tr>\n"; }
else {

	$before = '';
	$num = $border = $f = 0;
	foreach $os (sort { $os{$b} <=> $os{$a} } keys %os) {

		$num++;
		if ($num > $max) { print "<tr><td>.<br>.<br>.</td></tr>\n"; last; }

		$bar = $os{$os};

		if ($f == 0) { $f = 1; $magnification = $bar / 100; $bar = 100; }
		else { $bar = $bar / $magnification; }

		$bar = int($bar);

		if ($bar == 0) { $bar = 1; }

		$border++;
		if ($border % 2 != 0) { $bgcolor = "bgcolor=#ffeedd"; } else { $bgcolor = ""; }

		if ($before eq '') { $number = "1"; }
		if ($before == $os{$os}) { $number = ""; }
		else { $number = $num; }

		$before = $os{$os};

		print "<tr>\n";
		print "<td align=right>$number</td>\n";
		print "<td $bgcolor>$os</td>\n";
		print "<td><img src=\"$gif\" WIDTH=$bar HEIGHT=10> <font size=-1>$os{$os}<font></td>\n";
		print "</tr>\n";
	}
}

print <<"EOF";
</table>
<p>
<div align=right><a href="http://www.rescue.ne.jp/" target="_top">LOG Analyzer</a></div><p>
</body></html>
EOF

exit;


sub error {

	print "Content-type: text/html\n\n";
	print <<"EOF";
	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
	<HTML>
	<HEAD>
	<TITLE>$title</TITLE>
	<SCRIPT language="JavaScript">
	<!--
	function PageBack(){ history.back(); }
	//-->
	</SCRIPT>
	</HEAD>
	$body
	<h1>$_[0]</h1>
	$_[1]<p>
	<h3>[<A HREF="JavaScript:history.back()">Back</A>]</h3>
	</body></html>
EOF

	exit;
}
