#!/usr/bin/perl #================================================= # GRACY Analyzer Version 2.10 # Date : 2005/11/02 # Programmed by Hirohisa Nagai # nagai@gracy.co.jp # Gracy Technology Inc. # http://www.gracy.co.jp/ #================================================= # NTパス用 $0 =~ /^(.*[\\])/; chdir($1); require 'grana_ini.cgi'; #++++++++++++++++++++++++++++++++++++++++ 以下の変更禁止 +++ if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN,$in,$ENV{'CONTENT_LENGTH'}); } else { $in = $ENV{'QUERY_STRING'}; } @formdata = split(/&/,$in); foreach(@formdata) { ($name,$value) = split(/=/, $_); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $value =~ s//>/g; $value =~ s/\n//g; $FORM{$name} = $value; } # データ保存ディレクトリの設定 #$data_dir = "./usr/" . $IN{'id'} . '/'; #フォームのmodeの値によって、処理分岐 if($FORM{'mode'} eq 'day_list') { if(!&cookie_read) { &msg('エラー!!', 'パスワードの認証ができませんでした。'); } &daily_list; } elsif($FORM{'mode'} eq 'all') { if(!&cookie_read) { &msg('エラー!!', 'パスワードの認証ができませんでした。'); } &analyze_view; } elsif($FORM{'mode'} eq 'csv_dl') { if(!&cookie_read) { &msg('エラー!!', 'パスワードの認証ができませんでした。'); } &csv_download; } elsif($FORM{'mode'} eq 'login') { &login; } else { # &analyze_view; &login_form; } #=================解析結果表示==================== sub analyze_view { # カウントファイルのオープン if(!open(IN,"$cnt_file")) { &error_gif; } $cnt_data = ; close(IN); ($date, $month, $fyear, $total, $today, $tomon) = split(/\,/, $cnt_data); chomp($tomon); # 月別アクセス数ファイルのオープン if(!open(IN,"$mon_file")) { &error_gif; } @MONTH = ; close(IN); if(!opendir(DIR, $log_dir)) { &error_gif; } @logfiles = grep /\d{8}/, readdir(DIR); closedir(DIR); foreach(@logfiles) { $logfile = $log_dir . $_; if(!open(LOG, "$logfile")) { &error_gif; } @LOG = ; close(LOG); foreach(@LOG) { push(@DATA, $_); } } &log_analysis; &html_header; &count_html; &time_zone; &monthly; &day_week; &browser; &os; &referer; &keyword; &host; &html_footer; } #++++++++++++++++++++++++++++++++++++ 日別アクセス数表示 +++ sub daily_list { # 日別アクセス数ファイルのオープン if(!open(IN,"$day_file")) { &msg('エラー!!', '日別データファイルの読み込みに失敗しました。'); } @DAILY = ; close(IN); $i = 0; foreach(@DAILY) { ($year,$month,$day,$day_cnt) = split(/\,/,$_); chomp($day_cnt); $day_log[$i] = $day_cnt; $i++; } @sortdata = sort { $b <=> $a } @day_log; $daymax = $sortdata[0]; $datums = $daymax / 150; &html_header; print <
日別アクセス数(過去365日間の統計)

EOH if(@DAILY == 0) { print "\n"; } else { @DAILY = reverse @DAILY; foreach(@DAILY) { ($year, $month, $day, $day_cnt) = split(/\,/, $_); $bar = $day_cnt; $bar = $bar / $datums; $bar = int($bar); if ($bar == 0) { $bar = 1; } $border++; if ($border % 2 != 0) { $bgcolor = "bgcolor=#EEEEEE"; } else { $bgcolor = "bgcolor=#CCCCCC"; } print < EOF } } print < EOH &html_footer; } #==========時間帯別アクセス数解析結果表示========= sub time_zone { print < \n\n"; # print "\n"; # # foreach $hour (0 .. 23) { # print "\n"; # } # # print "\n
データがありません。
$year年$month月$day日 $day_cnt


時間帯別アクセス数(過去$log_limit日間の統計)

EOH foreach $hour (sort { $hour{$b} <=> $hour{$a} } keys %hour) { $hourmax = $hour{$hour}; last; } $datums = $hourmax / 150; foreach $hour (0 .. 23) { $hour = sprintf("%02d",$hour); $bar = $hour{$hour}; $bar = $bar / $datums; $bar = int($bar); if ($bar == 0) { $bar = 1; } $border++; if($border % 2 != 0) { $bgcolor = 'bgcolor="#EEEEEE"'; } else { $bgcolor = 'bgcolor="#CCCCCC"'; } print < EOF # print '\n"; } # else { # print "$hour{$hour}
"; # print "
"; # print "\n"; # } } print "
$hour $hour{$hour}
'; # if($bar == 0) { print "
$hour{$hour}
\n
$hour
\n\n\n"; } #============月別アクセス数解析結果表示=========== sub monthly { print <
月別アクセス数(過去12ヶ月間の統計)

EOH if(@MONTH < 1) { print <
データがありません。
EOH return 1; } foreach(@MONTH) { ($year,$month_name,$month_cnt) = split(/\,/,$_); chomp($month_cnt); push(@month_list, $month_cnt); } @sortdata = sort { $b <=> $a } @month_list; $monthmax = $sortdata[0]; $datums = $monthmax / 150; foreach (@MONTH) { ($year,$month_name,$month_cnt) = split(/\,/, $_); $bar = $month_cnt; $bar = $bar / $datums; $bar = int($bar); if ($bar == 0) { $bar = 1; } $border++; if($border % 2 != 0) { $bgcolor = 'bgcolor="#EEEEEE"'; } else { $bgcolor = 'bgcolor="#CCCCCC"'; } print < $year年$month_name月 $month_cnt EOF } print "\n\n\n"; } #===========曜日別アクセス数解析結果表示========== sub day_week { @WEEK = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'); print <
曜日別アクセス数(過去$log_limit日間の統計)

EOH foreach $wday (sort { $whatday{$b} <=> $whatday{$a} } keys %whatday) { $wdaymax = $whatday{$wday}; last; } $datums = $wdaymax / 100; $num = 0; foreach $wday (0 .. 6) { $bar = $whatday{$wday} / $datums; $bar = int($bar); $num++; # セルBGカラー if($num % 2 != 0) { $bgcolor = 'bgcolor="#EEEEEE"'; } else { $bgcolor = 'bgcolor="#CCCCCC"'; } print < EOH if($bar == 0) { print ""; } else { print < $whatday{$wday} EOH } } print "
$WEEK[$wday]
\n\n\n"; } #===============BROWSERの解析結果表示============= sub browser { print <
ブラウザ(過去$log_limit日間の統計)

EOH if($w == 0) { print "\n"; } else { $before = ''; $num = $flg = 0; @SORTDATA = sort { $agent{$b} <=> $agent{$a} } keys %agent; foreach $agent (@SORTDATA) { $num++; if($num > $max) { print "\n"; last; } $bar = $agent{$agent}; if($flg == 0) { $flg = 1; $datums = $bar / 150; $bar = 150; } else { $bar = $bar / $datums; } $bar = int($bar); if($bar == 0) { $bar = 1; } # セルBGカラー if($num % 2 != 0) { $bgcolor = 'bgcolor="#EEEEEE"'; } else { $bgcolor = 'bgcolor="#CCCCCC"'; } if(length($agent) > 45) { $agname = substr($agent,0,42) . "..."; } else { $agname = $agent; } if($before eq '') { $number = 1; } elsif($before == $agent{$agent}) { $number = ""; } else { $number = $num; } $before = $agent{$agent}; print < EOH } } print "
データがありません。
以下省略
$number $agname $agent{$agent}
\n\n\n"; } #=================OSの解析結果表示================ sub os { print <
OS(過去$log_limit日間の統計)

EOH if($v == 0) { print "\n"; } else { $before = ''; $num = $flg = 0; @SORTDATA = sort { $os{$b} <=> $os{$a} } keys %os; foreach $os (@SORTDATA) { $num++; if($num > $max) { print "\n"; last; } $bar = $os{$os}; if($flg == 0) { $flg = 1; $datums = $bar / 150; $bar = 150; } else { $bar = $bar / $datums; } $bar = int($bar); if($bar == 0) { $bar = 1; } # セルBGカラー if($num % 2 != 0) { $bgcolor = 'bgcolor="#EEEEEE"'; } else { $bgcolor = 'bgcolor="#CCCCCC"'; } if($before eq '') { $number = 1; } elsif($before == $os{$os}) { $number = ""; } else { $number = $num; } $before = $os{$os}; print < EOH } } print "
データがありません。
以下省略
$number $os $os{$os}
\n\n\n"; } #===============REFERERの解析結果表示============= sub referer { print <
リンク元(過去$log_limit日間の統計)

EOH if($u == 0) { print "\n"; } else { $before = ''; $num = $flg = 0; @SORTDATA = sort { $ref{$b} <=> $ref{$a} } keys %ref; foreach $ref (@SORTDATA) { $num++; if($num > $max) { print "\n"; last; } $bar = $ref{$ref}; if($flg == 0) { $flg = 1; $datums = $bar / 150; $bar = 150; } else { $bar = $bar / $datums; } $bar = int($bar); if($bar == 0) { $bar = 1; } # セルBGカラー if($num % 2 != 0) { $bgcolor = 'bgcolor="#EEEEEE"'; } else { $bgcolor = 'bgcolor="#CCCCCC"'; } if(length($ref) > 45) { $url = substr($ref,0,42) . "..."; } 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 < EOH } } print "
データがありません。
以下省略
$number $url $ref{$ref}
\n\n\n"; } #===============KEYWORDの解析結果表示============= sub keyword { print <
検索キーワード(過去$log_limit日間の統計)

EOH if($t == 0) { print "\n"; } else { $before = ''; $num = $flg = 0; @SORTDATA = sort { $keyword{$b} <=> $keyword{$a} } keys %keyword; foreach $key (@SORTDATA) { $num++; if($num > $max) { print "\n"; last; } $bar = $keyword{$key}; if($flg == 0) { $flg = 1; $datums = $bar / 150; $bar = 150; } else { $bar = $bar / $datums; } $bar = int($bar); if($bar == 0) { $bar = 1; } # セルBGカラー if($num % 2 != 0) { $bgcolor = 'bgcolor="#EEEEEE"'; } else { $bgcolor = 'bgcolor="#CCCCCC"'; } if($before eq '') { $number = 1; } if($before == $keyword{$key}) { $number = ""; } else { $number = $num; } $before = $keyword{$key}; print < EOH } } print "
データがありません。
以下省略
$number $key $keyword{$key}
\n\n\n"; } #================HOSTの解析結果表示=============== sub host { print <
ホスト(過去$log_limit日間の統計)

EOH if($x == 0) { print "\n"; } else { $before = ''; $num = $flg = 0; @SORTDATA = sort { $host{$b} <=> $host{$a} } keys %host; foreach $host (@SORTDATA) { $num++; if($num > $max) { print "\n"; last; } $bar = $host{$host}; if($flg == 0) { $flg = 1; $datums = $bar / 150; $bar = 150; } else { $bar = $bar / $datums; } $bar = int($bar); if($bar == 0) { $bar = 1; } # セルBGカラー if($num % 2 != 0) { $bgcolor = 'bgcolor="#EEEEEE"'; } else { $bgcolor = 'bgcolor="#CCCCCC"'; } if($before eq '') { $number = 1; } elsif ($before == $host{$host}) { $number = ""; } else { $number = $num; } $before = $host{$host}; print < EOH } } print "
データがありません。
以下省略
$number $host $host{$host}
\n\n\n"; } #==============ログデータの解析・集計============= sub log_analysis { foreach(@DATA) { chomp($_); ($HOUR, $WDAY, $HOST, $USER_AGENT, $OS, $REFERER, $KEYWORD) = split(/\,/, $_, 7); $total_cnt++; if($HOUR ne '') { $hour{$HOUR}++; $z++; } if($WDAY ne '') { $whatday{$WDAY}++; $y++; } if($HOST ne '') { $host{$HOST}++; $x++; } if($USER_AGENT ne '') { $agent{$USER_AGENT}++; $w++; } if($OS ne '') { $os{$OS}++; $v++; } if($REFERER ne '') { $ref{$REFERER}++; $u++; } if($KEYWORD ne '') { $keyword{$KEYWORD}++; $t++; } } } #+++++++++++++++++++++++++++++++++++++++ CSVダウンロード +++ sub csv_download { # 日別アクセス数ファイルのオープン if(!open(IN,"$day_file")) { &msg('エラー!!', '日別データファイルの読み込みに失敗しました。'); } @DAILY = ; close(IN); $csvname = "daily_cnt.csv"; print "Content-Type: application/octet-stream\n"; print "Content-Disposition: attachment; filename=$csvname\n\n"; foreach(@DAILY) { print "$_"; } exit; } #==================HTMLのヘッダー================= sub html_header { print "Content-type: text/html\n"; print "$cookie_set\n"; print < Access Analyzer
EOF } #==================HTMLのヘッダー================= sub html_footer { print <
EOF } #++++++++++++++++++++++++++++++++++++++++++ ログイン画面 +++ sub login_form { print "Content-type: text/html\n\n"; print < Access Analyzer
パスワードを入力してログインしてください。



EOF exit; } #++++++++++++++++++++++++++++++++++++++++++ ログイン処理 +++ sub login { if(!&authorize("$FORM{'password'}")) { &msg('エラー!!', 'パスワードの認証ができませんでした。', 0); } &cookie_set; &analyze_view; } #++++++++++++++++++++++++++++++++++++++++++++++++++ 認証 +++ sub authorize { my ($input_pass) = @_; if($input_pass eq $password) { return 1; } return 0; } #++++++++++++++++++++++++++++++++++++++++++++ Set Cookie +++ sub cookie_set { $cookie_set = "Set-Cookie: admin_info=$FORM{'password'}\n"; } #+++++++++++++++++++++++++++++++++++++++++++ Read Cookie +++ sub cookie_read { if($ENV{'HTTP_COOKIE'} ne '') { foreach(split(/; /, $ENV{'HTTP_COOKIE'})) { ($key, $value) = split(/=/, $_); $cookie{$key} .= "\0" if (defined($cookie{$key})); $cookie{$key} .= $value; if($cookie{'admin_info'} ne '') { if(&authorize("$cookie{'admin_info'}")) { return 1; } } } } return 0; } #=================アクセス数表示部================ sub count_html { print <
Total: $total Today: $today This Month: $tomon

EOF exit; } #++++++++++++++++++++++++++++++++++++ 各種メッセージ表示 +++ sub msg { my ($title, $msg) = @_; print "Content-type: text/html\n\n"; print < GRACY Analyzer

$title

$msg

BACK
EOH exit; }