ログオフ中 ...
\n"; print ""; exit; } sub logon { my($c) = @_; my $in_pass = $c->{q}->param('PASS'); if($in_pass eq '') { &PrintAuthForm($c, 1); } if($in_pass ne $c->{PASSWORD}) { &PrintAuthForm($c, 1); } my $session = new FCC::Apache::Session("./session"); unless($session) { &ErrorPrint("システムエラー : sessionディレクトリのパーミッションを777にしてください。"); } my %session_data = ${session}->session_create(); unless($session_data{_sid}) { my $err = '認証に失敗しました。:' . $session->error(); &ErrorPrint($err); } my $target_url = $c->{CGI_URL} . "?t=" . time; print &SetCookie($c->{COOKIE_NAME}, $session_data{_sid}), "\n"; print "Content-Type: text/html; charset=utf-8\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; if($ENV{SERVER_NAME} =~ /($c->{FREE_SERVER_NAME})/) { print "{COOKIE_NAME}=$session_data{_sid};\" />\n"; } print "\n"; print "ログオン中 ...
\n"; print ""; exit; } sub redirect { my($c, $url) = @_; my $url_disp = &SecureHtml($url); my $error = 0; if($url =~ /[^a-zA-Z0-9\.\-\_\/\:\?\&\%\=\+\~\,]/) { $error = 1; } my $t = &load_template("./template/redirect.tmpl"); $t->param("url" => $url); $t->param("url_disp" => $url_disp); $t->param("error" => $error); my $body = $t->output(); my $clen = length $body; print "Content-Type: text/html; charset=utf-8\n"; if($ENV{SERVER_NAME} !~ /($c->{FREE_SERVER_NAME})/) { print "Content-Length: ${clen}\n"; } print "\n"; print $body; exit; } sub load_template { my($f) = @_; my $t = HTML::Template->new( filename => $f, die_on_bad_params => 0, vanguard_compatibility_mode => 1, loop_context_vars => 1 ); require './conf/config.cgi'; my $c = &config::get; &convert_template_common($t, $c); return $t; } sub convert_template_common { my($t, $c) = @_; while( my($k, $v) = each %{$c->{ANA_TARGETS}} ) { $t->param($k => $v); } for(my $i=1; $i<=3; $i++) { $t->param("COPYRIGHT${i}" => $c->{"COPYRIGHT${i}"}); } $t->param("IMAGE_URL" => $c->{IMAGE_URL}); $t->param("CGI_URL" => $c->{CGI_URL}); $t->param("AUTHFLAG" => $c->{AUTHFLAG}); # ******* ( For What's New Start) $t->param("SET" => $c->{q}->param("set")); # ******* ( For What's New End) } sub print_result { my($t, $c) =@_; my $body = $t->output(); my $clen = length $body; print "Content-Type: text/html; charset=utf-8\n"; if($ENV{SERVER_NAME} !~ /($c->{FREE_SERVER_NAME})/) { print "Content-Length: ${clen}\n"; } print "\n"; print $body; exit; } sub AnalyzeDateRange { my($date_ref) = @_; # 対象ログの調査開始時と調査終了時を調べる my $min_date = 99999999999999; my $max_date = 0; while( my($i, $d) = each %{$date_ref} ) { if($date_ref->{$i} > $max_date) { $max_date = $date_ref->{$i}; } if($date_ref->{$i} < $min_date) { $min_date = $date_ref->{$i}; } } return($min_date, $max_date); } # アクセス元ホスト名、ドメイン名、国名ランキングを調べる sub AnalyzeRemoteHost { my($remote_hosts_ref) = @_; my %country_list; my %domain_list; my %host_list; while( my($i, $host) = each %{$remote_hosts_ref} ) { $host_list{$host} ++; my @dom_buff = split(/\./, $host); my $tld = pop(@dom_buff); if($tld eq '' || $tld =~ /[^a-zA-Z]/) { $country_list{'?'} ++; } else { $country_list{$tld} ++; } if($tld eq '') { $domain_list{'?'} ++; } elsif($tld =~ /[^a-zA-Z]/) { $domain_list{'?'} ++; } else { my $domain = &GetDomainByHostname($host); $domain_list{$domain} ++; } } return \%country_list, \%domain_list, \%host_list; } sub GetDomainByHostname { my($host) = @_; my %tld_fix = ( 'com' =>'2', 'net'=>'2', 'org'=>'2', 'biz'=>'2', 'info'=>'2', 'name'=>'3', 'aero'=>'2', 'coop'=>'2', 'museum'=>'2', 'pro'=>'3', 'edu'=>'2', 'gov'=>'2', 'mil'=>'2', 'int'=>'2', 'arpa'=>'2', 'nato'=>'2', 'hk'=>'3', 'sg'=>'3', 'kr'=>'3', 'uk'=>'3', 'au'=>'3', 'mx'=>'3', 'th'=>'3', 'br'=>'3', 'pe'=>'3', 'nz'=>'3' ); my %sld_fix = ( #日本 'ac.jp'=>'3', 'ad.jp'=>'3', 'co.jp'=>'3', 'ed.jp'=>'3', 'go.jp'=>'3', 'gr.jp'=>'3', 'lg.jp'=>'3', 'ne.jp'=>'3', 'or.jp'=>'3', 'hokkaido.jp'=>'3', 'aomori.jp'=>'3', 'iwate.jp'=>'3', 'miyagi.jp'=>'3', 'akita.jp'=>'3', 'yamagata.jp'=>'3', 'fukushima.jp'=>'3', 'ibaraki.jp'=>'3', 'tochigi.jp'=>'3', 'gunma.jp'=>'3', 'saitama.jp'=>'3', 'chiba.jp'=>'3', 'tokyo.jp'=>'3', 'kanagawa.jp'=>'3', 'niigata.jp'=>'3', 'toyama.jp'=>'3', 'ishikawa.jp'=>'3', 'fukui.jp'=>'3', 'yamanashi.jp'=>'3', 'nagano.jp'=>'3', 'gifu.jp'=>'3', 'shizuoka.jp'=>'3', 'aichi.jp'=>'3', 'mie.jp'=>'3', 'shiga.jp'=>'3', 'kyoto.jp'=>'3', 'osaka.jp'=>'3', 'hyogo.jp'=>'3', 'nara.jp'=>'3', 'wakayama.jp'=>'3', 'tottori.jp'=>'3', 'shimane.jp'=>'3', 'okayama.jp'=>'3', 'hiroshima.jp'=>'3', 'yamaguchi.jp'=>'3', 'tokushima.jp'=>'3', 'kagawa.jp'=>'3', 'ehime.jp'=>'3', 'kochi.jp'=>'3', 'fukuoka.jp'=>'3', 'saga.jp'=>'3', 'nagasaki.jp'=>'3', 'kumamoto.jp'=>'3', 'oita.jp'=>'3', 'miyazaki.jp'=>'3', 'kagoshima.jp'=>'3', 'okinawa.jp'=>'3', 'sapporo.jp'=>'3', 'sendai.jp'=>'3', 'chiba.jp'=>'3', 'yokohama.jp'=>'3', 'kawasaki.jp'=>'3', 'nagoya.jp'=>'3', 'kyoto.jp'=>'3', 'osaka.jp'=>'3', 'kobe.jp'=>'3', 'hiroshima.jp'=>'3', 'fukuoka.jp'=>'3', 'kitakyushu.jp'=>'3', #台湾 'com.tw'=>'3', 'net.tw'=>'3', 'org.tw'=>'3', 'idv.tw'=>'3', 'game.tw'=>'3', 'ebiz.tw'=>'3', 'club.tw'=>'3', 'edu.tw'=>'3', #中国 'com.cn'=>'3', 'net.cn'=>'3', 'org.cn'=>'3', 'gov.cn'=>'3', 'ac.cn'=>'3', 'edu.cn'=>'3' ); my($level3, $level2, $level1) = $host =~ /([^\.]+)\.([^\.]+)\.([^\.]+)$/; my $org_domain; if(my $dom_level = $tld_fix{$level1}) { if($dom_level eq '2') { $org_domain = "${level2}.${level1}"; } else { $org_domain = "${level3}.${level2}.${level1}"; } } elsif($sld_fix{"${level2}.${level1}"}) { $org_domain = "${level3}.${level2}.${level1}"; } else { $org_domain = "${level2}.${level1}"; } return $org_domain; } # ブラウザー表示可能言語一覧を調べる sub AnalyzeAcceptLang { my($accept_language_ref) = @_; my %language_list; while( my($i, $v) = each %{$accept_language_ref} ) { my @buff = split(/,/, $v); my $max = 0; my $lang; for my $j (@buff) { my($lang_tmp, $value_tmp) = split(/\;/, $j); $value_tmp =~ s/q=//; if($value_tmp eq '') { $value_tmp = 1; } if($max < $value_tmp) { $lang = $lang_tmp; $max = $value_tmp; } } $language_list{"\L$lang"} ++; } return \%language_list; } sub AnalyzeUserAgent { # OS, ブラウザーを調べる my($user_agent_ref) = @_; my %browser_list; my %browser_v_list; my %platform_list; my %platform_v_list; while( my($i, $ua) = each %{$user_agent_ref} ) { my($platform, $platform_v, $browser, $browser_v) = &User_Agent($ua); $browser_list{$browser} ++; $browser_v_list{"$browser:$browser_v"} ++; $platform_list{"$platform"} ++; $platform_v_list{"$platform:$platform_v"} ++; } return \%browser_list, \%browser_v_list, \%platform_list, \%platform_v_list; } sub AnalyzeRequestDate { # 時間別、曜日別、日付別、月別リクエスト数を調べる my($date_ref) = @_; my %hourly_list; my %date_list; my %monthly_list; my %daily_list; while( my($key, $v) = each %{$date_ref} ) { #for my $key (keys(%date)) { my $hourly = substr($v, 8, 2); $hourly_list{$hourly} ++; my $daily_y = substr($v, 0, 4); my $daily_m = substr($v, 4, 2); my $daily_d = substr($v, 6, 2); my @daily_array = localtime(timelocal(0, 0, 0, $daily_d, $daily_m - 1, $daily_y)); $daily_list{$daily_array[6]} ++; $date_list{"$daily_y$daily_m$daily_d"} ++; $monthly_list{"$daily_y$daily_m"} ++; } return \%hourly_list, \%date_list, \%monthly_list, \%daily_list; } sub AnalyzeRequestResource { # Directory Report, Request Report を調べる my($c, $request_ref) = @_; my %request_list; while( my($key, $v) = each %{$request_ref} ) { if($v =~ /^http:\/\/[^\/]+$/) { $v .= '/'; } my $uri = $v; if($v =~ /\/$/) { $_ = $v; m|^https*://[^\/]+/(.*)$|; my $RequestUri = "/$1"; my $HtmlFilePath = $ENV{'DOCUMENT_ROOT'}.$RequestUri; my $HitFlag = 0; for my $Index (@{$c->{DIRECTORYINDEX}}) { my $FileTest = $HtmlFilePath.$Index; if(-e $FileTest) { $uri = $v.$Index; $HitFlag = 1; last; } } unless($HitFlag) {$uri = $v;} } $request_list{$uri} ++; } return \%request_list; } # リンク元URL、検索エンジンの検索キーワードを調べる sub AnalyzeReferer { my($c, $referer_ref) = @_; my %referer_list; my %search_word_list; while( my($key, $v) = each %{$referer_ref} ) { next if($v eq '' || $v eq '-'); next unless($v =~ /^http/); my $flag = 0; if(scalar @{$c->{MY_SITE_URLs}}) { for my $myurl (@{$c->{MY_SITE_URLs}}) { if($v =~ /^\Q${myurl}\E/) { $flag = 1; last; } } } if($flag) {next;} $referer_list{$v} ++; my($word) = &GetSearchKeyword($v); next if($word eq ''); $search_word_list{$word} ++; } return \%referer_list, \%search_word_list; } sub GetSearchKeyword { my($requested_url) = @_; my ($url, $getstr) = split(/\?/, $requested_url); if($getstr eq '' && $url !~ /(a9\.com|\.excite\.com|technorati\.jp)/) { return ''; } my @parts = split(/\&/, $getstr); my %variables; for my $part (@parts) { my ($name, $value) = split(/=/, $part); if($value ne '') { $variables{$name} = $value; } } my @url_parts = split(/\//, $url); my @url_parts2 = split(/\./, $url_parts[2]); my $tld = pop @url_parts2; my $word = ''; my $engine_name = ''; my $engine_url = ''; if($url =~ /\.google\./) { if($url =~ /images\.google\./) { my $prev = $variables{'prev'}; $prev = &URL_Decode($prev); if($prev =~ /q=([^&]+)&/) { $word = $1; } } elsif($variables{'q'} ne '') { $word = $variables{'q'}; } elsif($variables{'as_q'} ne '') { $word = $variables{'as_q'}; } $engine_name = "Google($tld)"; my @tmp = split(/\.google\./, $url); my $suffix = pop @tmp; $engine_url = 'http://www.google.' . $suffix; } elsif($url =~ /\.yahoo\./) { if($variables{'p'} ne '') { $word = $variables{'p'}; } elsif($variables{'key'} ne '') { $word = $variables{'key'}; } $engine_name = "Yahoo!($tld)"; my @tmp = split(/\.yahoo\./, $url); my $suffix = pop @tmp; $engine_url = 'http://www.yahoo.' . $suffix; } elsif($url =~ /\.excite\./) { if($url =~ /odn\.excite\.co\.jp/) { $word = $variables{'search'}; $engine_name = "ODN Search"; $engine_url = 'http://www.odn.ne.jp/'; } elsif($url =~ /dion\.excite\.co\.jp/) { $word = $variables{'search'}; $engine_name = "DION Search"; $engine_url = 'http://www.dion.ne.jp/'; } else { if($variables{'search'}) { $word = $variables{'search'}; } elsif($variables{'s'}) { $word = $variables{'s'}; } $engine_name = "excite($tld)"; my @tmp = split(/\.excite\./, $url); my $suffix = pop @tmp; $engine_url = 'http://www.excite.' . $suffix; } } elsif($url =~ /\.msn\./) { $word = $variables{'q'}; $engine_name = "MSN($tld)"; my @tmp = split(/\.msn\./, $url); my $suffix = pop @tmp; $engine_url = 'http://www.msn.' . $suffix; } elsif($url =~ /\.live\.com/) { $word = $variables{'q'}; $engine_name = 'Live Search'; $engine_url = 'http://www.live.com/'; } elsif($url =~ /\.bing\.com\/images\//) { $word = $variables{'q'}; $engine_name = 'bing'; $engine_url = 'http://www.bing.com/'; } elsif($url =~ /\.bing\.com/) { $word = $variables{'q'}; $engine_name = 'bing'; $engine_url = 'http://www.bing.com/'; } elsif($url =~ /\.infoseek\./) { $word = $variables{'qt'}; $engine_name = 'infoseek'; $engine_url = 'http://www.infoseek.co.jp/'; } elsif($url =~ /\.goo\.ne\.jp/) { $word = $variables{'MT'}; $engine_name = 'goo'; $engine_url = 'http://www.goo.ne.jp/'; } elsif($url =~ /search\.livedoor\.com/) { $word = $variables{'q'}; $engine_name = 'livedoor'; $engine_url = 'http://www.livedoor.com/'; } elsif($url =~ /ask\.[a-z]+\//) { $word = $variables{'q'}; $engine_name = "Ask($tld)"; $engine_url = 'http://ask.' . $tld; } elsif($url =~ /lycos/) { if($url =~ /wisenut/) { $word = $variables{'q'}; } else { $word = $variables{'query'}; } $engine_name = "Lycos($tld)"; my @tmp = split(/\.lycos\./, $url); my $suffix = pop @tmp; $engine_url = 'http://www.lycos.' . $suffix; } elsif($url =~ /\.fresheye\.com/) { $word = $variables{'kw'}; $engine_name = 'フレッシュアイ'; $engine_url = 'http://www.fresheye.com/'; } elsif($url =~ /search\.biglobe\.ne\.jp/) { $word = $variables{'q'}; $engine_name = 'BIGLOBEサーチ attayo'; $engine_url = 'http://search.biglobe.ne.jp/'; } elsif($url =~ /\.altavista\.com/) { $word = $variables{'q'}; $engine_name = 'altavista'; $engine_url = 'http://www.altavista.com/'; } elsif($url =~ /search\.aol\.com/) { $word = $variables{'q'}; $engine_name = 'AOL Search(com)'; $engine_url = 'http://search.aol.com/aolcom/webhome'; } elsif($url =~ /search\.jp\.aol\.com/) { $word = $variables{'query'}; $engine_name = 'AOL Search(jp)'; $engine_url = 'http://search.jp.aol.com/index'; } elsif($url =~ /bach\.istc\.kobe\-u\.ac\.jp\/cgi\-bin\/metcha\.cgi/) { $word = $variables{'q'}; $engine_name = 'Metcha Seearch'; $engine_url = 'http://bach.cs.kobe-u.ac.jp/metcha/'; } elsif($url =~ /\.alltheweb\.com/) { $word = $variables{'q'}; $engine_name = 'alltheweb'; $engine_url = 'http://www.alltheweb.com/'; } elsif($url =~ /\.alexa\.com\/search/) { $word = $variables{'q'}; $engine_name = 'Alexa'; $engine_url = 'http://www.alexa.com/'; } elsif($url =~ /search\.naver\.com/) { $word = $variables{'query'}; $engine_name = 'NEVER'; $engine_url = 'http://www.naver.com/'; } elsif($url =~ /\.baidu\.(com|jp)/) { my $tld = $1; $word = $variables{'wd'}; $engine_name = "百度(${tld})"; $engine_url = "http://www.baidu.${tld}/"; } elsif($url =~ /\.mooter\.co\.jp/) { $word = $variables{'keywords'}; $engine_name = 'Mooter'; $engine_url = 'http://www.mooter.co.jp/'; } elsif($url =~ /\.marsflag\.com/) { $word = $variables{'phrase'}; $engine_name = 'MARS FLAG'; $engine_url = 'http://www.marsflag.com/'; } elsif($url =~ /clusty\.jp/) { $word = $variables{'query'}; $engine_name = 'Clusty'; $engine_url = 'http://clusty.jp/'; } elsif($url =~ /(search|newsflash)\.nifty\.com/) { if($variables{'Text'} ne '') { $word = $variables{'Text'}; } elsif($variables{'q'} ne '') { $word = $variables{'q'}; } elsif($variables{'key'} ne '') { $word = $variables{'key'}; } $engine_name = '@nifty アット・サーチ'; $engine_url = 'http://www.nifty.com/search/'; } elsif($url =~ /\.technorati\.jp\/search\/(.+)$/) { $word = $1; $engine_name = 'テクノラティ'; $engine_url = 'http://www.technorati.jp/'; } else { return ''; } if($word eq '') { return ''; } $word = &URL_Decode($word); if($requested_url =~ /\&(ei|ie)\=utf\-8/i) { #何もしない } elsif($requested_url =~ /\&(ei|ie)\=euc\-jp/i) { &Jcode::convert(\$word, "utf8", "euc"); } else { &Jcode::convert(\$word, "utf8"); } $word =~ s/ / /g; $word =~ s/\s+/ /g; $word =~ s/^\s//; $word =~ s/\s$//; return $word, $engine_name, $engine_url; } sub AnalyzeScreen { my($screen_ref) = @_; my %ScreenResolution; my %ScreenColorDepth; while( my($key, $v) = each %{$screen_ref} ) { if($v eq '-' || $v eq '') { next; } my($w, $h, $c) = split(/\s/, $v); $ScreenResolution{"$w×$h"} ++; $ScreenColorDepth{$c} ++; } return \%ScreenResolution, \%ScreenColorDepth; } sub print_summary { my ($t, $c, $summary) = @_; my($min_year, $min_mon, $min_mday, $min_hour, $min_min, $min_sec) = $summary->{min_date} =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/; my($max_year, $max_mon, $max_mday, $max_hour, $max_min, $max_sec) = $summary->{max_date} =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/; #対象ログ内の対象月のリストを作成する my %year_mon_list; while( my($i, $v) = each %{$summary->{all_date}} ) { my $ym = substr($v, 0, 6); $year_mon_list{$ym} ++; } #ページビュー $t->param("loglines" => &CommaFormat($summary->{loglines})); #ログファイル欄出力 my @log_list_array; for my $key (sort keys %{$summary->{LogList}}) { my %hash; $hash{logfilename} = $key; if($key eq $summary->{SelectedLogFileName}) { $hash{selected} = 'selected="selected"'; } push(@log_list_array, \%hash); } $t->param("LOG_LIST" => \@log_list_array); # ログファイルサイズ欄出力 $t->param("log_size" => &CommaFormat($summary->{log_size})); # ログローテーション欄出力 my $LogSizeRate = int(($summary->{log_size} * 100 / $c->{LOTATION_SIZE}) * 10) / 10; if($LogSizeRate > 100) {$LogSizeRate = 100;} my $LogSizeGraphMaxLen = 150; #ピクセル my $LogSizeGraphLen = int($LogSizeGraphMaxLen * $LogSizeRate / 100); #ピクセル if($c->{LOTATION} eq '0') { $t->param("LOTATION_0" => 1); } elsif($c->{LOTATION} eq '1') { $t->param("LOTATION_1" => 1); $t->param("lotation_size" => &CommaFormat($c->{LOTATION_SIZE})); $t->param("LogSizeRate" => $LogSizeRate); } elsif($c->{LOTATION} eq '2') { $t->param("LOTATION_2" => 1); } elsif($c->{LOTATION} eq '3') { $t->param("LOTATION_3" => 1); } # 解析モード欄出力 my($ana_mode_year, $ana_mode_mon) = $summary->{ana_month} =~ /^(\d{4})(\d{2})/; $t->param("ana_mode_year" => $ana_mode_year); $t->param("ana_mode_mon" => $ana_mode_mon); $t->param("ana_mode_day" => $summary->{ana_day}); if($summary->{mode} eq 'DAILY') { $t->param("ANA_MODE_DAILY" => 1); } elsif($summary->{mode} eq 'MONTHLY') { $t->param("ANA_MODE_MONTHLY" => 1); } else { $t->param("ANA_MODE_ALL" => 1); } # 解析モード指定欄出力 $t->param("SelectedLogFileName" => $summary->{SelectedLogFileName}); if($summary->{mode} eq 'MONTHLY') { $t->param("mode_selected_monthly" => 'selected="selected"'); } elsif($summary->{mode} eq 'DAILY') { $t->param("mode_selected_daily" => 'selected="selected"'); $t->param("ana_day" => $summary->{ana_day}); } else { $t->param("mode_selected_all" => 'selected="selected"'); } my @year_mon_list_array; for my $key (sort {$a <=> $b} keys(%year_mon_list)) { my($y, $m) = $key =~ /^(\d{4})(\d{2})/; my %hash; $hash{y} = $y; $hash{m} = $m; if($summary->{mode} eq 'MONTHLY' && $key eq $summary->{ana_month}) { $hash{selected} = 'selected="selected"'; } push(@year_mon_list_array, \%hash); } $t->param("YEAR_MON_LIST" => \@year_mon_list_array); # 解析対象期間欄出力 $t->param("min_year" => $min_year); $t->param("min_mon" => $min_mon); $t->param("min_mday" => $min_mday); $t->param("min_hour" => $min_hour); $t->param("min_min" => $min_min); $t->param("min_sec" => $min_sec); $t->param("max_year" => $max_year); $t->param("max_mon" => $max_mon); $t->param("max_mday" => $max_mday); $t->param("max_hour" => $max_hour); $t->param("max_min" => $max_min); $t->param("max_sec" => $max_sec); } # 国別ドメイン名レポート sub print_remote_tld { my($t, $c, $summary, $country_list_ref) = @_; my %tld_list = &ReadDef('./conf/country_code.dat'); my @ana_remotetld_list_array; my $order = 1; for my $tld ( sort { $country_list_ref->{$b} <=> $country_list_ref->{$a} } keys %{$country_list_ref} ) { my $rate = int($country_list_ref->{$tld} * 10000 / $summary->{loglines}) / 100; my $GraphLength = int($c->{GRAPHMAXLENGTH} * $rate / 100); my %hash; $hash{order} = $order; $hash{tld} = $tld; $hash{rate} = $rate; $hash{GraphLength} = $GraphLength; $hash{num} = $country_list_ref->{$tld}; $hash{country} = $tld_list{$tld}; $hash{IMAGE_URL} = $c->{IMAGE_URL}; push(@ana_remotetld_list_array, \%hash); $order ++; } $t->param("ANA_REMOTETLD_LIST" => \@ana_remotetld_list_array); } # アクセス元ドメイン名レポート sub print_remote_domain { my($t, $c, $summary, $domain_list_ref) = @_; my @ana_remotedomain_list_array; my $order = 1; my $dsp_order = 1; my $pre_velue = ""; for my $domain ( sort { $domain_list_ref->{$b} <=> $domain_list_ref->{$a} } keys %{$domain_list_ref} ) { unless($domain_list_ref->{$domain} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $c->{ROW}); } my $rate = int($domain_list_ref->{$domain} * 10000 / $summary->{loglines}) / 100; my $GraphLength = int($c->{GRAPHMAXLENGTH} * $rate / 100); my %hash; $hash{order} = $dsp_order; $hash{domain} = $domain; $hash{rate} = $rate; $hash{GraphLength} = $GraphLength; $hash{num} = $domain_list_ref->{$domain}; $hash{IMAGE_URL} = $c->{IMAGE_URL}; push(@ana_remotedomain_list_array, \%hash); $pre_velue = $domain_list_ref->{$domain}; $order ++; } $t->param("ANA_REMOTEDOMAIN_LIST" => \@ana_remotedomain_list_array); } # アクセス元ホスト名レポート sub print_remote_host { my($t, $c, $summary, $host_list_ref) = @_; my @ana_remotehost_list_array; my $order = 1; my $dsp_order = 1; my $pre_velue = ""; for my $key ( sort { $host_list_ref->{$b} <=> $host_list_ref->{$a} } keys %{$host_list_ref} ) { unless($host_list_ref->{$key} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $c->{ROW}); } my $rate = int($host_list_ref->{$key} * 10000 / $summary->{loglines}) / 100; my $GraphLength = int($c->{GRAPHMAXLENGTH} * $rate / 100); my %hash; $hash{order} = $dsp_order; $hash{host} = $key; $hash{rate} = $rate; $hash{GraphLength} = $GraphLength; $hash{num} = $host_list_ref->{$key}; $hash{IMAGE_URL} = $c->{IMAGE_URL}; push(@ana_remotehost_list_array, \%hash); $pre_velue = $host_list_ref->{$key}; $order ++; } $t->param("ANA_REMOTEHOST_LIST" => \@ana_remotehost_list_array); } # ブラウザー表示可能言語レポート sub print_http_lang { my($t, $c, $summary, $language_list_ref) = @_; my @ana_httplang_list_array; my $order = 1; my $dsp_order = 1; my $pre_velue = ""; for my $key ( sort { $language_list_ref->{$b} <=> $language_list_ref->{$a} } keys %{$language_list_ref} ) { unless($language_list_ref->{$key} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $c->{ROW}); } my $rate = int($language_list_ref->{$key} * 10000 / $summary->{loglines}) / 100; my $GraphLength = int($c->{GRAPHMAXLENGTH} * $rate / 100); my %hash; $hash{order} = $dsp_order; $hash{lang} = $key; if($key eq '' || $key eq '-') { $hash{lang} = ""; } else { $hash{lang_caption} = $summary->{langcode_list}->{$key}; } $hash{rate} = $rate; $hash{GraphLength} = $GraphLength; $hash{num} = $language_list_ref->{$key}; $hash{IMAGE_URL} = $c->{IMAGE_URL}; push(@ana_httplang_list_array, \%hash); $pre_velue = $language_list_ref->{$key}; $order ++; } $t->param("ANA_HTTPLANG_LIST" => \@ana_httplang_list_array); } # ブラウザーレポート sub print_browser { my($t, $c, $summary, $browser_list_ref, $browser_v_list_ref) = @_; my @ana_browser_list_array; my $order = 1; my $dsp_order = 1; my $pre_velue = ""; for my $key ( sort { $browser_list_ref->{$b} <=> $browser_list_ref->{$a} } keys %{$browser_list_ref} ) { unless($browser_list_ref->{$key} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $c->{ROW}); } my $rate = int($browser_list_ref->{$key} * 10000 / $summary->{loglines}) / 100; my $GraphLength = int($c->{GRAPHMAXLENGTH} * $rate / 100); my %hash; $hash{order} = $dsp_order; $hash{browser} = $key; if($key eq '' || $key eq '-') { $hash{browser} = ""; } $hash{rate} = $rate; $hash{GraphLength} = $GraphLength; $hash{num} = $browser_list_ref->{$key}; $hash{IMAGE_URL} = $c->{IMAGE_URL}; $pre_velue = $browser_list_ref->{$key}; $order ++; # my @version_list_array; for my $key1 (sort keys %{$browser_v_list_ref}) { if($key1 =~ /^$key:/) { my $vrate = int($browser_v_list_ref->{$key1} * 10000 / $summary->{loglines}) / 100; my $GraphLength2 = int($c->{GRAPHMAXLENGTH} * $vrate / 100); my $v = $key1; $v =~ s/^$key://; my %vhash; $vhash{version} = $v; $vhash{rate} = $vrate; $vhash{num} = $browser_v_list_ref->{$key1}; $vhash{GraphLength} = $GraphLength2; $vhash{IMAGE_URL} = $c->{IMAGE_URL}; push(@version_list_array, \%vhash); } } $hash{VERSION_LIST} = \@version_list_array; push(@ana_browser_list_array, \%hash); } $t->param("ANA_BROWSER_LIST" => \@ana_browser_list_array); } #プラットフォームレポート sub print_platform { my($t, $c, $summary, $platform_list_ref, $platform_v_list_ref) = @_; my @ana_platform_list_array; my $order = 1; my $dsp_order = 1; my $pre_velue = ""; for my $key ( sort { $platform_list_ref->{$b} <=> $platform_list_ref->{$a} } keys %{$platform_list_ref} ) { unless($platform_list_ref->{$key} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $c->{ROW}); } my $rate = int($platform_list_ref->{$key} * 10000 / $summary->{loglines}) / 100; my $GraphLength = int($c->{GRAPHMAXLENGTH} * $rate / 100); my %hash; $hash{order} = $dsp_order; $hash{platform} = $key; if($key eq '' || $key eq '-') { $hash{platform} = ""; } $hash{rate} = $rate; $hash{GraphLength} = $GraphLength; $hash{num} = $platform_list_ref->{$key}; $hash{IMAGE_URL} = $c->{IMAGE_URL}; $pre_velue = $platform_list_ref->{$key}; $order ++; # my @version_list_array; for my $key1 (sort keys %{$platform_v_list_ref}) { if($key1 =~ /^$key:/) { my $vrate = int($platform_v_list_ref->{$key1} * 10000 / $summary->{loglines}) / 100; my $GraphLength2 = int($c->{GRAPHMAXLENGTH} * $vrate / 100); my $v = $key1; $v =~ s/^$key://; my %vhash; $vhash{version} = $v; $vhash{rate} = $vrate; $vhash{num} = $platform_v_list_ref->{$key1}; $vhash{GraphLength} = $GraphLength2; $vhash{IMAGE_URL} = $c->{IMAGE_URL}; push(@version_list_array, \%vhash); } } $hash{VERSION_LIST} = \@version_list_array; push(@ana_platform_list_array, \%hash); } $t->param("ANA_PLATFORM_LIST" => \@ana_platform_list_array); } #月別アクセス数レポート sub print_request_monthly { my($t, $c, $summary, $monthly_list_ref) = @_; my @ana_monthly_list_array; for my $key (sort keys %{$monthly_list_ref}) { my($year, $month) = $key =~ /^(\d{4})(\d{2})/; my $rate = int($monthly_list_ref->{$key} * 10000 / $summary->{loglines}) / 100; my $GraphLength = int($c->{GRAPHMAXLENGTH} * $rate / 100); my %hash; $hash{year} = $year; $hash{month} = $month; $hash{rate} = $rate; $hash{GraphLength} = $GraphLength; $hash{num} = $monthly_list_ref->{$key}; $hash{IMAGE_URL} = $c->{IMAGE_URL}; push(@ana_monthly_list_array, \%hash); } $t->param("ANA_REQUESTMONTHLY_LIST" => \@ana_monthly_list_array); } #日付別アクセス数レポート sub print_request_daily { my($t, $c, $summary, $date_list_ref, $ana_month) = @_; my($year, $month) = $ana_month =~ /^(\d{4})(\d{2})/; my $last_day = &LastDay($year, $month); my @ana_daily_list_array; my @week_map = ('日', '月', '火', '水', '木', '金', '土'); for( my $key=1; $key<=$last_day; $key++ ) { my $day = sprintf("%02d", $key); my $num = $date_list_ref->{"${year}${month}${day}"} + 0; my $rate = int($num * 10000 / $summary->{loglines}) / 100; my $GraphLength = int($c->{GRAPHMAXLENGTH} * $rate / 100); my $w = &Youbi($year, $month, $key); my %hash; $hash{year} = $year; $hash{month} = $month; $hash{day} = $day; $hash{rate} = $rate; $hash{GraphLength} = $GraphLength; $hash{num} = $num; $hash{w} = $w; $hash{week} = $week_map[$w]; $hash{IMAGE_URL} = $c->{IMAGE_URL}; push(@ana_daily_list_array, \%hash); } $t->param("ANA_REQUESTDAILY_LIST" => \@ana_daily_list_array); } #時間別アクセス数レポート sub print_request_hourly { my($t, $c, $summary, $hourly_list_ref) = @_; my @ana_hourly_list_array; for( my $key=0; $key<24; $key++ ) { my $hour = sprintf("%02d", $key); my $num = $hourly_list_ref->{$hour} + 0; my $rate = int($num * 10000 / $summary->{loglines}) / 100; my $GraphLength = int($c->{GRAPHMAXLENGTH} * $rate / 100); my %hash; $hash{hour} = $hour; $hash{rate} = $rate; $hash{GraphLength} = $GraphLength; $hash{num} = $num; $hash{IMAGE_URL} = $c->{IMAGE_URL}; push(@ana_hourly_list_array, \%hash); } $t->param("ANA_REQUESTHOURLY_LIST" => \@ana_hourly_list_array); } # 曜日別アクセス数レポート sub print_request_weekly { my($t, $c, $summary, $daily_list_ref) = @_; my @ana_weekly_list_array; my @week_map = ('日', '月', '火', '水', '木', '金', '土'); for( my $key=0; $key<=6; $key++ ) { my $num = $daily_list_ref->{$key} + 0; my $rate = int($num * 10000 / $summary->{loglines}) / 100; my $GraphLength = int($c->{GRAPHMAXLENGTH} * $rate / 100); my %hash; $hash{rate} = $rate; $hash{GraphLength} = $GraphLength; $hash{num} = $num; $hash{w} = $key; $hash{week} = $week_map[$key]; $hash{IMAGE_URL} = $c->{IMAGE_URL}; push(@ana_weekly_list_array, \%hash); } $t->param("ANA_REQUESTWEEKLY_LIST" => \@ana_weekly_list_array); } #リクエストレポート sub print_request_file { my($t, $c, $summary, $request_list_ref) = @_; my @ana_requestfile_list_array; my $order = 1; my $dsp_order = 1; my $pre_velue = ""; for my $key ( sort { $request_list_ref->{$b} <=> $request_list_ref->{$a} } keys %{$request_list_ref} ) { unless($request_list_ref->{$key} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $c->{ROW}); } my $num = $request_list_ref->{$key} + 0; my $rate = int($request_list_ref->{$key} * 10000 / $summary->{loglines}) / 100; my $GraphLength = int($c->{GRAPHMAXLENGTH} * $rate / 100); my $title = &GetHtmlTitle($c, $key); # ******* ( For What's New Start) my(%hash,$dsp_url); $hash{title} = $title; if($key=~s/\|(.*)//){$dsp_url=$1} else{$dsp_url = $key} # ******* ( For What's New End) # my %hash; # $hash{title} = $title; $hash{url} = $key; # 表示するURLを、50文字に縮める my $dsp_url = $key; if(length($key) > 50) { $dsp_url = substr($key, 0, 50); $dsp_url .= '...'; } $hash{url_disp} = &SecureHtml($dsp_url); $hash{url_encoded} = &UrlEncode($key); $hash{order} = $dsp_order; $hash{rate} = $rate; $hash{GraphLength} = $GraphLength; $hash{num} = $num; $hash{IMAGE_URL} = $c->{IMAGE_URL}; $hash{CGI_URL} = $c->{CGI_URL}; push(@ana_requestfile_list_array, \%hash); $pre_velue = $request_list_ref->{$key}; $order ++; } $t->param("ANA_REQUESTFILE_LIST" => \@ana_requestfile_list_array); } sub UrlEncode { my($string) = @_; #半角英数字および半角スペースでない文字をエンコード $string =~ s/([^A-Za-z0-9\s])/'%'.unpack("H2", $1)/ego; #半角スペースを"+"に変換 $string =~ s/\s/+/g; return $string; } #リンク元サイトレポート sub print_referer_site { my($t, $c, $summary, $referer_list_ref) = @_; my %referer_site_list; my $total = 0; for my $url (keys %{$referer_list_ref}) { my @url_parts = split(/\//, $url); my $site = "$url_parts[0]//$url_parts[2]/"; $referer_site_list{$site} += $referer_list_ref->{$url}; $total += $referer_list_ref->{$url}; } my @ana_referersite_list_array; my $order = 1; my $dsp_order = 1; my $pre_velue = ""; for my $key ( sort { $referer_site_list{$b} <=> $referer_site_list{$a} } keys %referer_site_list ) { unless($referer_site_list{$key} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $c->{ROW}); } my $num = $referer_site_list{$key} + 0; my $rate = int($num * 10000 / $total) / 100; my $GraphLength = int($c->{GRAPHMAXLENGTH} * $rate / 100); my $dsp_url = $key; if(length($key) > 50) { $dsp_url = substr($key, 0, 50); $dsp_url .= '...'; } $dsp_url = &SecureHtml($dsp_url); my %hash; $hash{url_disp} = $dsp_url; $hash{url_encoded} = &UrlEncode($key); $hash{order} = $dsp_order; $hash{rate} = $rate; $hash{GraphLength} = $GraphLength; $hash{num} = $num; $hash{IMAGE_URL} = $c->{IMAGE_URL}; $hash{CGI_URL} = $c->{CGI_URL}; push(@ana_referersite_list_array, \%hash); $pre_velue = $referer_site_list{$key}; $order ++; } $t->param("ANA_REFERERSITE_LIST" => \@ana_referersite_list_array); } #リンク元URLレポート sub print_referer_url { my($t, $c, $summary, $referer_list_ref) = @_; my $total = 0; while( my($url, $n) = each %{$referer_list_ref} ) { $total += $n; } my @ana_refererurl_list_array; my $order = 1; my $dsp_order = 1; my $pre_velue = ""; for my $key ( sort { $referer_list_ref->{$b} <=> $referer_list_ref->{$a} } keys %{$referer_list_ref} ) { unless($referer_list_ref->{$key} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $c->{ROW}); } my $num = $referer_list_ref->{$key} + 0; my $rate = int($num * 10000 / $total) / 100; my $GraphLength = int($c->{GRAPHMAXLENGTH} * $rate / 100); # 表示するURLを、50文字に縮める my $dsp_url = $key; if(length($key) > 50) { $dsp_url = substr($key, 0, 50); $dsp_url .= '...'; } $dsp_url = &SecureHtml($dsp_url); my %hash; $hash{url_disp} = $dsp_url; $hash{url_encoded} = &UrlEncode($key); $hash{order} = $dsp_order; $hash{rate} = $rate; $hash{GraphLength} = $GraphLength; $hash{num} = $num; $hash{IMAGE_URL} = $c->{IMAGE_URL}; $hash{CGI_URL} = $c->{CGI_URL}; push(@ana_refererurl_list_array, \%hash); $pre_velue = $referer_list_ref->{$key}; $order ++; } $t->param("ANA_REFERERURL_LIST" => \@ana_refererurl_list_array); } #検索エンジンの検索キーワード レポート sub print_keyword { my($t, $c, $summary, $search_word_list_ref) = @_; my $cnt = 0; while( my($w, $n) = each %{$search_word_list_ref} ) { $cnt += $n; } my @ana_keyword_list_array; my $order = 1; my $dsp_order = 1; my $pre_velue = ""; for my $key ( sort { $search_word_list_ref->{$b} <=> $search_word_list_ref->{$a} } keys %{$search_word_list_ref} ) { unless($search_word_list_ref->{$key} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $c->{ROW}); } my $num = $search_word_list_ref->{$key} + 0; my $rate = int($num * 10000 / $cnt) / 100; my $GraphLength = int($c->{GRAPHMAXLENGTH} * $rate / 100); my $disp_word = &SecureHtml($key); my %hash; $hash{keyword} = $disp_word; $hash{order} = $dsp_order; $hash{rate} = $rate; $hash{GraphLength} = $GraphLength; $hash{num} = $num; $hash{IMAGE_URL} = $c->{IMAGE_URL}; push(@ana_keyword_list_array, \%hash); $pre_velue = $search_word_list_ref->{$key}; $order ++; } $t->param("ANA_KEYWORD_LIST" => \@ana_keyword_list_array); } sub SecureHtml { my($html) = @_; $html =~ s/\&/\&/g; $html =~ s/\&/&/g; $html =~ s/\"/"/g; $html =~ s/</g; $html =~ s/>/>/g; return $html; } #画面解像度レポート sub print_resolution { my($t, $c, $summary, $resolution_ref) = @_; my $cnt = 0; while( my($key, $n) = each %{$resolution_ref} ) { $cnt += $n; } my @ana_resolution_list_array; my $order = 1; my $dsp_order = 1; my $pre_velue = ""; for my $key ( sort { $resolution_ref->{$b} <=> $resolution_ref->{$a} } keys %{$resolution_ref} ) { unless($resolution_ref->{$key} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $c->{ROW}); } my $num = $resolution_ref->{$key} + 0; my $rate = int($num * 10000 / $cnt) / 100; my $GraphLength = int($c->{GRAPHMAXLENGTH} * $rate / 100); my %hash; $hash{resolution} = $key; $hash{order} = $dsp_order; $hash{rate} = $rate; $hash{GraphLength} = $GraphLength; $hash{num} = $num; $hash{IMAGE_URL} = $c->{IMAGE_URL}; push(@ana_resolution_list_array, \%hash); $pre_velue = $resolution_ref->{$key}; $order ++; } $t->param("ANA_RESOLUTION_LIST" => \@ana_resolution_list_array); } #画面色深度レポート sub print_color_depth { my($t, $c, $summary, $color_depth_ref) = @_; my $cnt = 0; while( my($key, $n) = each %{$color_depth_ref} ) { $cnt += $n; } my @ana_list_array; my $order = 1; my $dsp_order = 1; my $pre_velue = ""; for my $key ( sort { $color_depth_ref->{$b} <=> $color_depth_ref->{$a} } keys %{$color_depth_ref} ) { unless($color_depth_ref->{$key} == $pre_velue) { $dsp_order = $order; last if($dsp_order > $c->{ROW}); } my $num = $color_depth_ref->{$key} + 0; my $rate = int($num * 10000 / $cnt) / 100; my $GraphLength = int($c->{GRAPHMAXLENGTH} * $rate / 100); my %hash; $hash{color} = &CommaFormat(2 ** $key); $hash{bit} = $key; $hash{order} = $dsp_order; $hash{rate} = $rate; $hash{GraphLength} = $GraphLength; $hash{num} = $num; $hash{IMAGE_URL} = $c->{IMAGE_URL}; push(@ana_list_array, \%hash); $pre_velue = $color_depth_ref->{$key}; $order ++; } $t->param("ANA_COLORDEPTH_LIST" => \@ana_list_array); } # URLエンコードされた文字列を、デコードして返す sub URL_Decode { my($str) = @_; $str =~ s/\+/ /g; $str =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; return $str; } # 西暦、月、日を引数に取り、曜日コードを返す。 # 日:0, 月:1, 火:2, 水:3, 木:4, 金:5, 土:6 sub Youbi { my($year, $month, $day) = @_; my $time = timelocal(0, 0, 0, $day, $month - 1, $year); my @date_array = localtime($time); return $date_array[6]; } # 西暦と月を引数に取り、該当月の最終日を返す sub LastDay { my($year, $month) = @_; $month =~ s/^0//; if($month =~ /[^0-9]/ || $year =~ /[^0-9]/) { return ''; } if($month < 1 && $month > 12) { return ''; } if($year > 2037 || $year < 1900) { return ''; } my($lastday) = 1; my($time) = timelocal(0, 0, 0, 1, $month-1, $year-1900); my(@date_array) = localtime($time); my($mon) = $date_array[4]; my($flag) = 1; my($count) = 0; while($flag) { if($mon ne $date_array[4]) { return $lastday; $flag = 0; } $lastday = $date_array[3]; $time = $time + (60 * 60 * 24); @date_array = localtime($time); $count ++; last if($count > 40); } } sub DateConv { my($day_time) = @_; my @temp = split(/ /, $day_time); $day_time = $temp[0]; my($day, $hour, $min, $sec) = split(/:/, $day_time); my($mday, $mon, $year) = split(/\//, $day); my %month = ( 'Jan' => '01', 'Feb' => '02', 'Mar' => '03', 'Apr' => '04', 'May' => '05', 'Jun' => '06', 'Jul' => '07', 'Aug' => '08', 'Sep' => '09', 'Oct' => '10', 'Nov' => '11', 'Dec' => '12' ); $mon = $month{$mon}; if($mon eq '') {return '';} return "$year$mon$mday$hour$min$sec"; } sub EncryptPasswd { my($pass) = @_; my @salt_set = ('a'..'z','A'..'Z','0'..'9','.','/'); srand; my $seed1 = int(rand(64)); my $seed2 = int(rand(64)); my $salt = $salt_set[$seed1] . $salt_set[$seed2]; return crypt($pass,$salt); } sub InputCheck { my($mode, $ana_month, $ana_day) = @_; if($ana_month && $ana_month !~ /^\d{6}$/) { &ErrorPrint('年月に不正な値が送信されました。'); } if($mode eq 'DAILY') { if($ana_month eq '') { &ErrorPrint('年月がを指定してください。'); } if($ana_day =~ /[^0-9]/) { &ErrorPrint('日付は、半角数字で指定してください。'); } my($y, $m) = $ana_month =~ /^(\d{4})(\d{2})/; my $last_day = &LastDay($y, $m); if($ana_day > $last_day || $ana_day < 1) { &ErrorPrint('日付が正しくありません。'); } } } # 指定された定義ファイルを読み取り、連想配列を返す。 sub ReadDef { my($file) = @_; my %hash; open(FILE, "$file") || &ErrorPrint("$file をオープンできませんでした。"); while(