#!/usr/bin/perl #デイリーアクセスログ #Daily Access Log - dailylog.cgi #Ver 1.56 #Copyright(C) 1999 - 2000 MOG T.Kitazaki #CGI Pocket http://pocket.727.net/ # ############ #設定箇所 ############ #戻りのリンク先の指定 $Home = 'http://www.clover-design.net'; #タイトル $Title = 'アクセス解析'; #背景色 $Bgcol = 'white'; #文字色 $Text = '#404040'; #リンク色(未読) $Link = 'red'; #リンク色(既読) $Vlink = 'blue'; #リンク色(リンク中) $Alink = 'lime'; #表示テーブル枠 $Tblbor = 0; #表示テーブル色上段 $Tblcol1 = '#e8f0ff'; #表示テーブル色中段 $Tblcol2 = '#f0f0f0'; #表示テーブル色詳細表示部 $Tblcol3 = 'ivory'; #壁紙の指定 $Background = ''; #リモホの取得 #0 = IPアドレスで取得 #1 = リモートホスト名で取得 $Getremote = 1; ############ #ここまで ############ #このCGIの名前 $Cgi = 'dailylog.cgi'; #管理者プログラム $Manage = 'manage.cgi'; #データインデックスファイル $Index = 'dailylog.dat'; #データディレクトリ $Dir = 'data'; #リンク用画像ファイル $Logo = 'logo.gif'; #グラフ表示用画像ファイル $Gif1 = 'blue.gif'; $Gif2 = 'red.gif'; $Gif3 = 'green.gif'; $Footlogo = 'Daily Access Log CGI Pocket'; $times = time; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($times); $mon++; $year += 1900; $Nowdate = $year . '-' . $mon . '-' . $mday; $imgw = 2; $imgh = 10; $cols = 150; $perlver = $]; if($perlver >= 5){ use Socket; if(not $ENV{'REMOTE_HOST'}){ $hostaddr = inet_aton($ENV{'REMOTE_ADDR'}); $Host = gethostbyaddr ($hostaddr, &AF_INET); if($Host){ $Ip = inet_ntoa ($hostaddr); } else{ $Ip = $ENV{'REMOTE_ADDR'}; } } else{ $Host = $ENV{'REMOTE_HOST'}; $Ip = $ENV{'REMOTE_ADDR'}; } } else{ $Host = $ENV{'REMOTE_HOST'}; if($Host eq ''){ $hostaddr = pack('C4', (split(/\./,$ENV{'REMOTE_ADDR'}))); $Host = gethostbyaddr ($hostaddr, 2); } $Ip = $ENV{'REMOTE_ADDR'}; } if($Getremote){ $HOST = $Host; } else{ $HOST = $Ip; } $AGENT = $ENV{'HTTP_USER_AGENT'}; $HOST =~ s/,//g; $AGENT =~ s/,//g; if($Background ne ''){ $Bg = " background=\"$Background\""; } else{ $Bg = ''; } &Read_Formdata; if($IN{'mode'} eq 'view'){ &View; } elsif($IN{'mode'} eq 'view2'){ &View2; } elsif($IN{'mode'} eq 'all'){ &All; } else{ $filename = $Dir . '/' . $Nowdate; unless(-e $filename){ $f = 1; open (INDEX,$Index); while (){ chomp $_; if($Nowdate eq $_){ $f = 0; last; } } close (INDEX); if($f){ open (INDEX, ">>$Index"); print INDEX "$Nowdate\n"; close (INDEX); } } $logdat = "$hour\,$HOST\,$AGENT\,\n"; open (LOG,">>$filename"); print LOG $logdat; close (LOG); print "Location: $Logo\n\n"; } exit(0); ##### sub View{ if($IN{'date'} eq '' || $IN{'date'} eq $Nowdate){ $date = $Nowdate; $filename = $Dir . '/' . $Nowdate; $now = $hour; } else{ $date = $IN{'date'}; $filename = $Dir . '/' . $IN{'date'}; $now = 23; } open (INDEX,$Index); @files = ;close (INDEX); if(!open (LOG,$filename)){ &Err("指定された日付のデータは記録されていません"); exit (0); } @logs = ; close (LOG); $hits = $#logs + 1; for ($i = 0; $i <= $#logs; $i++){ chop($logs[$i]); @log = split(/\,/,$logs[$i]); $DATAS{$log[0]}++; $HOSTS{$log[1]}++; $AGENTS{$log[2]}++; $hourhosts = $log[0] . '__E__' . $log[1]; $houragents = $log[0] . '__E__' . $log[2]; $H{$hourhosts}++; $A{$houragents}++; } print "Content-type: text/html\n\n"; print < $Title
EOM if($IN{'mode_enter'} eq 'host'){ print < $IN{'date'} - 時間別(ホスト)アクセス統計


EOM for ($i = $now; $i >= 0; $i--){ print < EOM undef %GH; while (($hk, $hv)= each %H){ ($hou, $hos) = split (/__E__/,$hk); if($hou == $i){ $GH{$hos} += $hv; } } $ke = values %GH; if($ke == 0){ print < EOM } else{ foreach $hk (sort By_Number4 keys (%GH)){ print "\n"; } } } print < EOM } elsif($IN{'mode_enter'} eq 'agent'){ print <
時間別(ホスト)アクセス統計
ホスト カウント数 カウント数グラフ
$i:00〜$i:59
-
$hk$GH{$hk}\n"; $col = int ($GH{$hk} / $cols); $yo = int ($GH{$hk} % $cols); while ($col--){ $iw = $imgw * $cols; print "
"; } $iw = $imgw * $yo; print ""; print "
$IN{'date'} - 時間別(ブラウザ)アクセス統計


EOM for ($i = $now; $i >= 0; $i--){ print < EOM undef %GH; while (($hk, $hv)= each %A){ ($hou, $hos) = split (/__E__/,$hk); if($hou == $i){ $GH{$hos} += $hv; } } $ke = values %GH; if($ke == 0){ print < EOM } else{ foreach $hk (sort By_Number4 keys (%GH)){ print "\n"; } } } print < EOM } else{ print <
時間別(ブラウザ)アクセス統計
ブラウザ名 カウント数 カウント数グラフ
$i:00〜$i:59
-
$hk$GH{$hk}\n"; $col = int ($GH{$hk} / $cols); $yo = int ($GH{$hk} % $cols); while ($col--){ $iw = $imgw * $cols; print "
"; } $iw = $imgw * $yo; print ""; print "
$Title
EOM if($IN{'fullview'} eq 'fullview'){ print < EOM } else{ print < EOM } print <


EOM if($IN{'date'} eq '' || $IN{'date'} eq $Nowdate){ print < 本日[ $Nowdate ]のアクセス統計 本日はこれまで $hits 件のアクセスがあります EOM } else{ print < [ $IN{'date'} ]のアクセス統計 $IN{'date'} は $hits 件のアクセスがありました EOM } print <
EOM for ($i = $now; $i >= 0; $i--){ if($DATAS{$i} eq '') { $DATAS{$i} = 0; } print "\n"; } else{ $col = int ($DATAS{$i} / $cols); $yo = int ($DATAS{$i} % $cols); while ($col--){ $iw = $imgw * $cols; print "
"; } $iw = $imgw * $yo; print ""; } } print <

EOM if($IN{'fullview'} eq 'fullview'){ print <
EOM foreach (sort By_Number2 keys (%HOSTS)){ print "\n"; } print <
時間別アクセス統計
時間 カウント数 カウント数グラフ
$i:00〜$i:59$DATAS{$i}\n"; if($DATAS{$i} == 0){ print "
ホスト別アクセス統計
ホスト カウント数 カウント数グラフ
$_$HOSTS{$_}\n"; $col = int ($HOSTS{$_} / $cols); $yo = int ($HOSTS{$_} % $cols); while ($col--){ $iw = $imgw * $cols; print "
"; } $iw = $imgw * $yo; print ""; print "


EOM foreach (sort By_Number3 keys (%AGENTS)){ print "\n"; } print <
ブラウザ別アクセス統計
ブラウザ名 カウント数 カウント数グラフ
$_$AGENTS{$_}\n"; $col = int ($AGENTS{$_} / $cols); $yo = int ($AGENTS{$_} % $cols); while ($col--){ $iw = $imgw * $cols; print "
"; } $iw = $imgw * $yo; print ""; print "


EOM } if($IN{'date'} ne '' && $IN{'date'} ne $Nowdate){ print < 本日のデータ

EOM } print < 昨日までのデータ EOM $lop = 0; foreach (@files){ chop ($_); if($_ ne $Nowdate){ if($lop == 0){ print "\n"; } print < $_ EOM $lop++; if($lop == 4){ $lop = 0; print "\n"; } } } if($lop != 0){ print "\n"; } print < EOM } print <
$Footlogo
EOM } ##### sub All{ $allcount = 0; open (INDEX,$Index); @files = ; close (INDEX); print "Content-type: text/html\n\n"; print < $Title
EOM if($IN{'allmode'} eq ''){ print < EOM } print <
全アクセス解析


EOM $pos = 0; $days = $#files + 1; foreach $line (@files){ chop ($line); if($pos == 0){ $start = $line; } $pos++; $end = $line; $Openfile = $Dir . '/' . $line; open (DAT,$Openfile); @dat = ; close (DAT); $count = $#dat + 1; $count_loop = int ($count / 10); print < EOM foreach $dline (@dat){ chop ($dline); @data = split(/,/,$dline); $DATAS{"$data[0]"}++; $HOSTS{"$data[1]"}++; $AGENTS{"$data[2]"}++; $allcount++; } close (DAT); } $ave = $allcount / $days; @av = split(/\./,$ave); $ave = $av[0]; print <
日別アクセス統計
日付 カウント カウントグラフ
$line $count EOM if($count == 0){ print "
\n"; } else{ $col = int ($count / $cols); $yo = int ($count % $cols); while ($col--){ $iw = $imgw * $cols; print "
"; } $iw = $imgw * $yo; print ""; } print <
$start 〜 $end 間の記録 アクセス $allcount 件 1日平均 $ave 件


EOM $now = 23; for ($i = $now; $i >= 0; $i--){ if($DATAS{$i} eq '') { $DATAS{$i} = 0; } if($DATAS{$i} != 0){ if($DATAS{$i} == $allcount){ $ritu = 100; } else{ $ritu = $DATAS{$i}/$allcount; ($ritu1,$ritu2) = split(/\./,$ritu); @tmp = split (//,$ritu2); $tmp[0] =~ s/0//; if($tmp[2] >= 5){ if($tmp[1] == 9){ $tmp[0]++; $tmp[1] = 0; } else{ $tmp[1]++; } } $ritu = $tmp[0] . $tmp[1]; } } else{ $ritu = 0; } print "\n"; } else{ $iw = int (($imgw * $ritu) * 1.5); print ""; print "\n"; } } print <

EOM if($IN{'allmode'} eq 'allmode'){ print <
EOM foreach (sort By_Number2 keys (%HOSTS)){ if($HOSTS{$_} == $allcount){ $ritu = 100; } else{ $ritu = $HOSTS{$_}/$allcount; ($ritu1,$ritu2) = split(/\./,$ritu); @tmp = split (//,$ritu2); $tmp[0] =~ s/0//; if($tmp[2] >= 5){ if($tmp[1] == 9){ $tmp[0]++; $tmp[1] = 0; } else{ $tmp[1]++; } } $ritu = $tmp[0] . $tmp[1]; } print "\n"; } print "\n"; } print <

時間別アクセス統計
アクセス時間 カウント 比率 比率グラフ
$i:00〜$i:59$DATAS{$i}$ritu%\n"; if($ritu == 0){ print "
ホスト別アクセス統計
ホスト名 カウント 比率 比率グラフ
$_$HOSTS{$_}$ritu%\n"; if($ritu == 0){ print "
"; } else{ $iw = int (($imgw * $ritu) * 1.5); print ""; print "
EOM foreach (sort By_Number3 keys (%AGENTS)){ if($AGENTS{$_} == $allcount){ $ritu = 100; } else{ $ritu = $AGENTS{$_}/$allcount; ($ritu1,$ritu2) = split(/\./,$ritu); @tmp = split (//,$ritu2); $tmp[0] =~ s/0//; if($tmp[2] >= 5){ if($tmp[1] == 9){ $tmp[0]++; $tmp[1] = 0; } else{ $tmp[1]++; } } $ritu = $tmp[0] . $tmp[1]; } print "\n"; } print "\n"; } print <

EOM } print < EOM } ##### sub Read_Formdata{ if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $buf = $ENV{'QUERY_STRING'}; } @lens = split(/&/,$buf); foreach $len(@lens){ ($key, $value) = split(/=/,$len,2); $value =~ tr/+/ /; $key =~ s/%(..)/pack("c",hex($1))/ge; $value =~ s/%(..)/pack("c",hex($1))/ge; $IN{$key} = $value; } } ##### sub By_Number2{ if($HOSTS{$b} != $HOSTS{$a}){ $HOSTS{$b} <=> $HOSTS{$a}; } else{ $HOSTS{$b} cmp $HOSTS{$a}; } } ##### sub By_Number3{ if($AGENTS{$b} != $AGENTS{$a}){ $AGENTS{$b} <=> $AGENTS{$a}; } else{ $AGENTS{$b} cmp $AGENTS{$a}; } } ##### sub By_Number4{ if($GH{$b} != $GH{$a}){ $GH{$b} <=> $GH{$a}; } else{ $GH{$b} cmp $GH{$a}; } } ##### sub Err{ local ($msg) = @_; print "Content-type: text/html\n\n"; print < Error Message
■ Error Message ■
$msg
BACK
EOM } #####
ブラウザ別アクセス統計
ブラウザ名 カウント 比率 比率グラフ
$_$AGENTS{$_}$ritu%\n"; if($ritu == 0){ print "
"; } else{ $iw = int (($imgw * $ritu) * 1.5); print ""; print "