#!/usr/bin/perl #--------------------------------------------------------------------- # 高機能アクセス解析(フリー版)Ver.2.00 #--------------------------------------------------------------------- # ログをとりたいページの〜間に下記のタグを埋め込んで下さい。 # # ■フレームを使っていない場合 # # # # # ■フレームを使ってる場合 # ※フレームから呼び出されるファイルに埋め込んで下さい。 # # # # #--------------------------------------------------------------------- #------------------- # ▼ 設定 START #------------------- #このファイル $script = './log.cgi'; #ログファイル $logfile = './log.dat'; #タイトル $PAGE_TITLE = 'Promenade'; #ログ最大保存件数 $maxlog = '1000'; #パスワード $pass = 'gion'; #詳細データ表示件数 $pageview = '20'; #ランキング表示をするモードのデータ表示件数 # 空白=全て表示 / 数値=入力した数値までランキング表示 $maxrank = '10'; #初期表示モード # 1=ログ一覧 / 2=ページ / 3=日付 / 4=時間帯 / 5=曜日 / 6=ブラウザ / 7=ホスト / 8=ドメイン # 9=IPアドレス / 10=リンク元 / 11=解像度 / 12=色数 / 13=検索 / 14=検索エンジン / 15=OS / 16=ブラウザ $init_mode = '10'; #棒グラフの色 $barcolor = '#ff0000'; #グラフの表示方法 # 0=通常の割合で表示 / 1=最多の件数を100%として表示 $graphMethod = '1'; #長いデータの表示方法 # 0=全て表示 / 1=一定の長さ+"..."で表示 $datalength = '0'; #IP連続チェック( 0=NO / 1=YES ) # YES(1)の場合、下記の禁止時間の間、同一ページの連続したIPアドレスは記録しません $ip_chk = '1'; #IP連続記録禁止の場合の禁止時間(分) $prohibitiontime = '180'; #URL表示変換 # ('URL1==表示名1','URL2==表示名2') の形式で複数指定可能です。 @ALIAS = ('http://salon.e-kuchikomi.info/detail/clinic_3289.html==美容室・ネイルサロンの口コミ広場','http://salon.e-kuchikomi.info/m/detail/page_3289.html==美容室・ネイルサロンの口コミ広場Mobile'); #同一ページとして扱うアドレス # ('同一扱いの対象URL1==同一扱いの基準URL1','同一扱いの対象URL2==同一扱いの基準URL2' の形式で複数指定可能です # 対象URLは基準URLにアクセスされたものとして扱います。 @SamePage = ('http://www.xxx.com/==http://www.xxx.com/index.html'); #集計除外対象指定 # ('対象1','対象2') の形式で複数指定可能です # 部分一致:指定した文字列が含まれていれば除外します。 # 完全一致:指定した文字列が完全に一致すれば除外します。 #IPアドレス(部分一致) @EXCEPT_ADDR = ('125.194.59.227'); #ホスト名(部分一致) @EXCEPT_HOST = ('FL1-122-130-35-148.aic.mesh.ad.jp'); #リンク元(完全一致) @EXCEPT_REF = ('http://www.xxx.com/'); #データ取得不可表示 #表示文字 $nodata = "No Data"; #表示色 $nodata_color = '#999999'; #時差(国内サーバーは 0) $jisa = '0'; #ファイルロックの種類(0=flock関数使用 / 1=ロックディレクトリ使用) $file_lock = '1'; #ロックディレクトリ名 $lockdir = 'lockdir'; #ファイル書き込み失敗時のリトライ間隔(秒) $retry_interval = '1'; #メソッドの指定(POST / GET) $method = 'post'; #------------------- # ▲ 設定 END #------------------- ################################################################################ # # - ご注意 - # これより下はプログラムです。 # 改造はご自由にされてもかまいませんが、改造によって発生した不具合に関しては # サポート外になりますので、あらかじめご了承下さい。 # ################################################################################ #------------------------------------------------- # クエリー取得 #------------------------------------------------- if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; } #リンク元検出不具合回避処理 if($query =~ /ref=/){ ($query, $referrer) = split(/ref=/, $query); } #パラメータごとにハッシュテーブルへ格納 @pairs = split(/&/, $query); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$name} = $value; } if ($FORM{'pass'} eq "") { if ($FORM{'barcolor'} ne "") { $barcolor = $FORM{'barcolor'}; } } #------------------------------------------------- # モード判別 #------------------------------------------------- #管理者認証 if( $FORM{'mode'} eq "" ){ &login; exit; } #認証実行 if( $FORM{'mode'} eq "admin" ){ &auth; exit; } #ログ記録 if( $FORM{'mode'} eq "rec" ){ &rec; exit; } #------------------------------------------------- # 認証 #------------------------------------------------- sub auth{ if( $FORM{'pass'} eq $pass ){ #ログ一覧 if( $FORM{'analysis'} eq "log_list" ){ &getlog; &log_list; } #時間別一覧 if( $FORM{'analysis'} eq "jikan" ){ &getlog; &jikan; } #日付別一覧 if( $FORM{'analysis'} eq "date" ){ &getlog; &date; } #曜日別一覧 if( $FORM{'analysis'} eq "youbi" ){ &getlog; &youbi; } #ホスト別一覧 if( $FORM{'analysis'} eq "host" ){ &getlog; &host; } #ドメイン別一覧 if( $FORM{'analysis'} eq "domain" ){ &getlog; &host; } #IPアドレス別一覧 if( $FORM{'analysis'} eq "addr" ){ &getlog; &host; } #エージェント別一覧 if( $FORM{'analysis'} eq "agent" ){ &getlog; &agent; } #参照ページ別一覧 if( $FORM{'analysis'} eq "referer" ){ &getlog; &referer; } #リンク元別一覧 if( $FORM{'analysis'} eq "referrer" ){ &getlog; &referrer; } #解像度別一覧 if( $FORM{'analysis'} eq "swh" ){ &getlog; &swh; } #表示可能色数別一覧 if( $FORM{'analysis'} eq "scd" ){ &getlog; &scd; } #個別リスト if( $FORM{'analysis'} eq "list" ){ &getlog; &log_list; } #削除実行 if( $FORM{'analysis'} eq "delete" ){ &getlog; &delete; &getlog; &log_list; } #検索 if( $FORM{'analysis'} eq "kensaku" ){ &getlog; &kensaku; } #検索実行 if( $FORM{'analysis'} eq "search" ){ &getlog; &log_list; } #検索エンジン別一覧 if( $FORM{'analysis'} eq "sengin" ){ &getlog; &sengin; } #OS別一覧 if( $FORM{'analysis'} eq "os" ){ &getlog; &os; } #ブラウザ別一覧 if( $FORM{'analysis'} eq "brows" ){ &getlog; &brows; } #初期表示モード判別 if( $FORM{'analysis'} eq "" ){ if( $init_mode eq '1' ) { &getlog; &log_list; } #ページ if( $init_mode eq '2' ) { &getlog; &referer; } #日付 if( $init_mode eq '3' ) { &getlog; &date; } #時間帯 if( $init_mode eq '4' ) { &getlog; &jikan; } #曜日 if( $init_mode eq '5' ) { &getlog; &youbi; } #エージェント if( $init_mode eq '6' ) { &getlog; &agent; } #ホスト if( $init_mode eq '7' ) { &getlog; &host( host ); } #ドメイン if( $init_mode eq '8' ) { &getlog; &host( domain ); } #IPアドレス if( $init_mode eq '9' ) { &getlog; &host( addr ); } #リンク元 if( $init_mode eq '10' ){ &getlog; &referrer; } #解像度 if( $init_mode eq '11' ){ &getlog; &swh; } #色数 if( $init_mode eq '12' ){ &getlog; &scd; } #検索 if( $init_mode eq '13' ){ &kensaku; } #検索エンジン if( $init_mode eq '14' ){ &getlog; &sengin; } #OS if( $init_mode eq '15' ) { &getlog; &os; } #ブラウザ if( $init_mode eq '16' ) { &getlog; &brows; } } }else{ #認証失敗時、パスワード画面へ &login; } } #------------------------------------------------- # HTMLヘッダー #------------------------------------------------- sub header { print "Content-type:text/html\n\n"; print <<"EOF"; $PAGE_TITLE - アクセス解析

EOF } #------------------------------------------------- # HTMLフッター #------------------------------------------------- sub footer { print ""; print ""; print ""; print ""; print "

[ トリニティー ]
"; print "
"; print ""; print ""; } #------------------------------------------------- # 管理者認証 #------------------------------------------------- sub login { &header; print <<"EOF";
$PAGE_TITLE - アクセス解析

- 管 理 者 認 証 -
パスワードを入力し [ 認証 ] を押して下さい。

パスワード
大文字と小文字は判別されますのでご注意下さい。

EOF &footer; } #------------------------------------------------- # 環境変数取得 #------------------------------------------------- sub get_env{ #現在の時刻を取得 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time + $jisa * 60 * 60); $mon++; if ($sec < 10) { $sec = "0$sec"; } if ($min < 10) { $min = "0$min"; } if ($hour < 10) { $hour = "0$hour"; } if ($mday < 10) { $mday = "0$mday"; } if ($mon < 10) { $mon = "0$mon"; } $youbi = ('日','月','火','水','木','金','土') [$wday]; $year = sprintf("%02d",$year + 1900); $date = "$year年$mon月$mday日"; #環境変数の取得 $agent = $ENV{'HTTP_USER_AGENT'}; #エージェント $addr = $ENV{'REMOTE_ADDR'}; #IPアドレス $host = gethostbyaddr(pack("C4",split(/\./,$addr)),2); #ホスト名 #参照ページ取得 if($FORM{'pg'} ne ""){ $referer = $FORM{'pg'}; } else { $referer = $ENV{'HTTP_REFERER'}; } # 画面情報取得 $swh = $FORM{'swh'}; # サイズ $scd = $FORM{'scd'}; # 色数 # 空データ処理 if ($agent eq "") { $agent = $nodata; } if ($addr eq "") { $addr = $nodata; } if ($host eq "") { $host = $addr; } if ($referer eq "") { $referer = $nodata; } if ($referrer eq ""){ $referrer = $nodata; } # タグ置換処理 $agent =~ s//>/g; $referer =~ s//>/g; $referrer =~ s//>/g; $swh =~ s//>/g; $scd =~ s//>/g; } #------------------------------------------------- # ログ記録 #------------------------------------------------- sub rec{ #各種情報取得 &get_env; #記録除外判定 #除外フラグ初期化 $recexcept = 0; # IPアドレス除外判定 foreach( @EXCEPT_ADDR ){ if( $_ ){ if( $addr =~ /$_/ ){ $recexcept = 1; } } } # ホスト名除外判定 foreach( @EXCEPT_HOST ){ if( $_ ){ if( $host =~ /$_/ ){ $recexcept = 1; } } } # リンク元除外判定 foreach( @EXCEPT_REF ){ if( $_ ){ if( $referrer eq $_ ){ $recexcept = 1; } } } # 記録除外フラグが立っていなければファイルへ出力 if( $recexcept == 0 ){ # ログファイル存在フラグの設定 if( -e $logfile ){ # ログファイルが存在する場合 $flgFileExist = 1; }else{ # ログファイルが存在しない場合 $flgFileExist = 0; } # 既存のログ取得 &getlog; # ログの件数カウンタを初期化 $cntNewLog = 0; if( $total == 0 ){ # 新規ログデータの編集 $new_log = "1<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$referrer<>$swh<>$scd<>\n"; # 新規ログデータを配列に追加 push(@newlog, $new_log); }else{ # 既存ログ分ループ foreach $line (@logs){ # 先頭に来る新規ログデータの編集 if( $cntNewLog == 0 ){ # ログ内容を各変数に格納 ($tmp_count,$tmp_date,$tmp_youbi,$tmp_hour,$tmp_min,$tmp_sec,$tmp_addr,$tmp_host,$tmp_agent,$tmp_referer,$tmp_referrer,$tmp_swh,$tmp_scd,) = split(/<>/, $line); # 連続IP禁止処理 if( $ip_chk == 1 ){ if( ($addr eq $tmp_addr) && ($referer eq $tmp_referer) && ($date eq $tmp_date) && ($hour eq $tmp_hour) && ($min < $tmp_min+$prohibitiontime) ){ $recexcept = 1; last; } } # カウントアップ $count = $tmp_count + 1; # 新規ログデータの編集 $new_log = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$referrer<>$swh<>$scd<>\n"; # 新規ログデータを配列に追加 push(@newlog, $new_log); # ログカウンタをインクリメント $cntNewLog++; } # 最大ログ件数に達した場合ループ終了 if ($cntNewLog == $maxlog) { last; } # 既存ログデータを配列に追加 push(@newlog, $line); # ログカウンタをインクリメント $cntNewLog++; } } if( $recexcept == 0 ){ # 記録ファイルへ出力 &File_Write; # ログファイルが新規の場合 if( $flgFileExist == 0 ){ #パーミッションの変更 chmod (0666, $logfile); } } } #ダミー画像出力 &dummy_img; } #------------------------------------------------- # ログ取得 #------------------------------------------------- sub getlog{ # ログの取得 if( $file_lock == 0 ){ #flock関数使用 open(LOG,"<$logfile"); flock(LOG, 1); @logs = ; close(LOG); }else{ #ロックディレクトリ使用 for( $i=0 ; $i<=10 ; $i++ ){ if( mkdir($lockdir, 0755) ){ last; }else{ sleep($retry_interval); } } open( LOG,"<$logfile" ); @logs = ; close(LOG); rmdir($lockdir); } # 現存件数の取得 $total = @logs; } #------------------------------------------------- # ログ集計 #------------------------------------------------- sub decode { # 配列要素のデータ加算 $i = 0; foreach $line (@logs){ ($count,$date,$youbi,$hour,$min,$sec,$addr,$host,$agent,$referer,$referrer,$swh,$scd,)=split(/<>/, $line); $i++; $sengin = $referrer; $brows = $agent; $os = $agent; #ドメイン名処理 if ($FORM{'analysis'} eq "domain"){ if ($host =~ /(.*)\.(\d+)$/) { ; } elsif ($host =~ /(.*)\.(.*)\.(.*)\.(.*)$/) { $host = "\*\.$2\.$3\.$4"; } elsif ($host =~ /(.*)\.(.*)\.(.*)$/) { $host = "\*\.$2\.$3"; } } # 同一ページ扱い処理 foreach $same_url(@SamePage) { ($same_url1, $same_url2) = split(/==/, $same_url); if($referer eq $same_url1){ $referer = $same_url2; } if($referrer eq $same_url1){ $referrer = $same_url2; } } #各項目カウントアップ if( $FORM{'analysis'} eq "addr" ){ $host = "$addr"; } #日付のカウントアップ if( $date ne "" ){ $dates{($date)[0]}++; $cntDate++; $yobi{($date)[0]}=$youbi; } #時間のカウントアップ if( $hour ne "" && ($FORM{'key'} eq $date || $FORM{'option'} eq "") ){ $hours{($hour)[0]}++; $cntHour++; } #曜日のカウントアップ if( $youbi ne "" ){ $youbis{($youbi)[0]}++; $cntYoubi++; } #ホストのカウントアップ if( $host ne "" ){ $hosts{($host)[0]}++; $cntHost++; } #エージェントのカウントアップ if( $agent ne "" ){ $agents{($agent)[0]}++; $cntAgent++; } #参照ページのカウントアップ if( $referer ne "" ){ $referers{($referer)[0]}++; $cntReferer++; } #リンク元のカウントアップ if( $referrer ne "" ){ $referrers{($referrer)[0]}++; $cntReferrer++; } #解像度のカウントアップ if( $swh ne "" ){ $swhs{($swh)[0]}++; $cntSwh++; } #表示可能色数のカウントアップ if( $scd ne "" ){ $scds{($scd)[0]}++; $cntScd++; } #検索エンジンのカウントアップ if( $sengin ne "" ){ if( $sengin =~ /search.yahoo.co.jp/i ){ $sengin = 'Yahoo! Japan'; } elsif( $sengin =~ /google.co.jp/i ){ $sengin = 'Google'; } elsif( $sengin =~ /search.msn.co.jp/i ){ $sengin = 'MSN Japan'; } elsif( $sengin =~ /search.goo.ne.jp/i ){ $sengin = 'goo'; } elsif( $sengin =~ /infoseek.co.jp/i ){ $sengin = 'Infoseek楽天'; } elsif( $sengin =~ /cgi.search.biglobe.ne.jp/i ){ $sengin = 'BIGLOBE'; } elsif( $sengin =~ /excite.co.jp/i ){ $sengin = 'Excite'; } elsif( $sengin =~ /search.fresheye.com/i ){ $sengin = 'fresh EYE'; } elsif( $sengin =~ /search.nifty.com/i ){ $sengin = '@nifty'; } elsif( $sengin =~ /search.livedoor.com/i ){ $sengin = 'livedoor'; } elsif( $sengin =~ /dion.excite.co.jp/i ){ $sengin = 'DION'; } elsif( $sengin =~ /search.jp.aol.com/i ){ $sengin = 'AOL'; } elsif( $sengin =~ /odn.excite.co.jp/i ){ $sengin = 'ODN'; } elsif( $sengin =~ /ask.jp/i ){ $sengin = 'Ask.jp'; } elsif( $sengin =~ /so-net.search.goo.ne.jp/i ){ $sengin = 'So-net'; } elsif( $sengin =~ /ocnsearch.goo.ne.jp/i ){ $sengin = 'OCN'; } elsif( $sengin =~ /ocn/i ){ $sengin = 'OCN'; } #不明 else{ $sengin = 'その他'; } $sengins{($sengin)[0]}++; $cntSengin++; } #ブラウザのカウントアップ if( $brows ne "" ){ #ブラウザ判別 #Windows系 InternetExplorer if( ($brows =~ /MSIE 3/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Internet Explorer 3x'; } elsif( ($brows =~ /MSIE 4\.0/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Internet Explorer 4.0'; } elsif( ($brows =~ /MSIE 5\.0/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Internet Explorer 5.0'; } elsif( ($brows =~ /MSIE 5\.01/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Internet Explorer 5.01'; } elsif( ($brows =~ /MSIE 5\.5/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Internet Explorer 5.5'; } elsif( ($brows =~ /MSIE 6\.0/i) && ($brows =~ /Win/i) && ($brows =~ /Lunascape 2/i) ){ $brows = 'Windows / Lunascape 2x ( IE6 )'; } elsif( ($brows =~ /MSIE 6\.0/i) && ($brows =~ /Win/i) && ($brows =~ /Lunascape 3/i) ){ $brows = 'Windows / Lunascape 3x ( IE6 )'; } elsif( ($brows =~ /MSIE 6\.0/i) && ($brows =~ /Win/i) && ($brows =~ /Sleipnir Version/i) ){ $brows = 'Windows / Sleipnir 1x ( IE6 )'; } elsif( ($brows =~ /MSIE 6\.0/i) && ($brows =~ /Win/i) && ($brows =~ /Sleipnir\/2/i) ){ $brows = 'Windows / Sleipnir 2x ( IE6 )'; } elsif( ($brows =~ /MSIE 6\.0/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Internet Explorer 6.0'; } #Windows系 Netscape elsif( ($brows =~ /Mozilla\/4/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Netscape 4x'; } elsif( ($brows =~ /Netscape6\/6\.0/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Netscape 6.0'; } elsif( ($brows =~ /Netscape6\/6\.01/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Netscape 6.01'; } elsif( ($brows =~ /Netscape6\/6\.2\.1/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Netscape 6.2.1'; } elsif( ($brows =~ /Netscape6\/6\.2\.3/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Netscape 6.2.3'; } elsif( ($brows =~ /Netscape\/7\.01/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Netscape 7.01'; } elsif( ($brows =~ /Netscape\/7\.02/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Netscape 7.02'; } elsif( ($brows =~ /Netscape\/7\.1/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Netscape 7.1'; } elsif( ($brows =~ /Netscape\/7\.2/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Netscape 7.2'; } #Windows系 その他 elsif( ($brows =~ /Firefox\/*/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Firefox'; } elsif( ($brows =~ /Opera 6/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Opera 6x'; } elsif( ($brows =~ /Opera\/7/i) || ($brows =~ /Opera 7/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Opera 7x'; } elsif( ($brows =~ /Opera\/8/i) || ($brows =~ /Opera 8/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Opera 8x'; } elsif( ($brows =~ /Sleipnir Version/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Sleipnir 1x'; } elsif( ($brows =~ /Sleipnir\/2/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Sleipnir 2x'; } elsif( ($brows =~ /Mozilla\/*/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Mozilla'; } elsif( ($brows =~ /WebCapture/i) && ($brows =~ /Win/i) ){ $brows = 'Windows / Adobe Reader'; } #Macintosh系 InternetExplorer elsif( ($brows =~ /MSIE 4\.01/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Internet Explorer 4.01'; } elsif( ($brows =~ /MSIE 4\.5/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Internet Explorer 4.5'; } elsif( ($brows =~ /MSIE 5\.0/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Internet Explorer 5.0'; } elsif( ($brows =~ /MSIE 5\.16/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Internet Explorer 5.16'; } elsif( ($brows =~ /MSIE 5\.17/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Internet Explorer 5.17'; } elsif( ($brows =~ /MSIE 5\.22/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Internet Explorer 5.22'; } elsif( ($brows =~ /MSIE 5\.23/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Internet Explorer 5.23'; } #Macintosh系 Netscape elsif( ($brows =~ /Mozilla\/2/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Netscape 2x'; } elsif( ($brows =~ /Mozilla\/3/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Netscape 3x'; } elsif( ($brows =~ /Mozilla\/4/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Netscape 4x'; } elsif( ($brows =~ /Netscape6\/6\.0/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Netscape 6.0'; } elsif( ($brows =~ /Netscape6\/6\.1/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Netscape 6.1'; } elsif( ($brows =~ /Netscape6\/6\.2/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Netscape 6.2'; } elsif( ($brows =~ /Netscape6\/6\.2\.2/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Netscape 6.2.2'; } elsif( ($brows =~ /Netscape\/7\.0/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Netscape 7.0'; } elsif( ($brows =~ /Netscape\/7\.01/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Netscape 7.01'; } elsif( ($brows =~ /Netscape\/7\.02/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Netscape 7.02'; } elsif( ($brows =~ /Netscape\/7\.1/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Netscape 7.1'; } #Macintosh系 その他 elsif( ($brows =~ /Firefox\/*/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Firefox'; } elsif( ($brows =~ /Safari\/*/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Safari'; } elsif( ($brows =~ /iCab/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / iCab'; } elsif( ($brows =~ /OmniWeb/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / OmniWeb'; } elsif( ($brows =~ /Camino/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Camino'; } elsif( ($brows =~ /Chimera/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Chimera'; } elsif( ($brows =~ /WebCapture/i) && ($brows =~ /Mac/i) ){ $brows = 'Macintosh / Adobe Acrobat (Reader)'; } #UNIX系 Netscape elsif( ($brows =~ /Mozilla\/4/i) && ($brows =~ /SunOS/i) ){ $brows = 'SunOS / Netscape 4x'; } elsif( ($brows =~ /Netscape\/7\.0/i) && ($brows =~ /SunOS/i) ){ $brows = 'SunOS / Netscape 7.0'; } #UNIX系 Mozilla elsif( ($brows =~ /Mozilla\/*/i) && ($brows =~ /Linux/i) ){ $brows = 'Linux / Mozilla'; } elsif( ($brows =~ /Mozilla\/*/i) && ($brows =~ /FreeBSD/i) ){ $brows = 'FreeBSD / Mozilla'; } elsif( ($brows =~ /Mozilla\/*/i) && ($brows =~ /NetBSD/i) ){ $brows = 'NetBSD / Mozilla'; } elsif( ($brows =~ /Mozilla\/*/i) && ($brows =~ /SunOS/i) ){ $brows = 'SunOS / Mozilla'; } #UNIX系 その他 elsif( ($brows =~ /Firefox\/*/i) && ($brows =~ /Linux/i) ){ $brows = 'Linux / Firefox'; } elsif( $brows =~ /Konqueror/i ){ $brows = 'UNIX / Konqueror'; } elsif( $brows =~ /Galeon/i ){ $brows = 'UNIX / Galeon'; } elsif( $brows =~ /Nautilus/i ){ $brows = 'UNIX / Nautilus'; } elsif( $brows =~ /Epiphany/i ){ $brows = 'UNIX / Epiphany'; } #その他 elsif( $brows =~ /amaya/i ){ $brows = 'amaya'; } elsif( $brows =~ /Lynx/i ){ $brows = 'Lynx'; } elsif( $brows =~ /w3m/i ){ $brows = 'w3m'; } elsif( $brows =~ /BTRON/i ){ $brows = 'BTRON'; } elsif( $brows =~ /ASTEL/i ){ $brows = 'ASTEL'; } elsif( $brows =~ /DDIPOCKET/i ){ $brows = 'Air H'; } elsif( $brows =~ /DoCoMo/i ){ $brows = 'Mobile : DoCoMo i-mode'; } elsif( $brows =~ /L-mode/i ){ $brows = 'Mobile : DoCoMo L-mode'; } elsif( $brows =~ /J-PHONE/i ){ $brows = 'Mobile : Vodafone ( J-PHONE )'; } elsif( ($brows =~ /UP\.Browser/i) && ($brows =~ /KDDI/i) ){ $brows = 'Mobile : au'; } elsif( $brows =~ /UP\.Browser/i ){ $brows = 'Mobile : TU-KA'; } elsif( $brows =~ /PlayStation/i ){ $brows = 'PlayStation2'; } elsif( $brows =~ /Dreampassport/i ){ $brows = 'DreamCast'; } elsif( $brows =~ /NF/i ){ $brows = 'NetFront'; } elsif( $brows =~ /AVE-Front/i ){ $brows = 'AVE-Front'; } elsif( $brows =~ /sharp pda/i ){ $brows = 'ザウルス'; } elsif( $brows =~ /sharp wd/i ){ $brows = '書院'; } elsif( $brows =~ /Google/i ){ $brows = 'Googlebot'; } elsif( $brows =~ /msnbot/i ){ $brows = 'MSNbot'; } #不明 else{ $brows = "不明"; } $browss{($brows)[0]}++; $cntBrows++; } #OSのカウントアップ if( $os ne "" ){ #OS判別 #Windows系 if( ($os =~ /win/i) && ($os =~ /95/i) ){ $os = 'Windows 95'; } elsif( ($os =~ /win/i) && ($os =~ /98/i) ){ $os = 'Windows 98'; } elsif( ($os =~ /win/i) && ($os =~ /9x/i) ){ $os = 'Windows Me'; } elsif( ($os =~ /win/i) && ($os =~ /ME/i) ){ $os = 'Windows Me'; } elsif( ($os =~ /win/i) && ($os =~ /XP/i) ){ $os = 'Windows XP'; } elsif( ($os =~ /win/i) && ($os =~ /NT/i) && ($os =~ /5\.1/i) ){ $os = 'Windows XP'; } elsif( ($os =~ /win/i) && ($os =~ /5/i) ){ $os = 'Windows 2000'; } elsif( ($os =~ /win/i) && ($os =~ /2000/i) ){ $os = 'Windows 2000'; } elsif( ($os =~ /win/i) && ($os =~ /NT/i) ){ $os = 'Windows NT'; } elsif( $os =~ /CE/i ){ $os = 'Windows CE'; } #Macintosh系 elsif( ($os =~ /Mac/i) && ($os =~ /Mac OS X/i) ){ $os = 'Mac OS X'; } elsif( ($os =~ /Mac/i) && ($os =~ /68000/i) ){ $os = 'Mac 68K'; } elsif( ($os =~ /Mac/i) && ($os =~ /Mac_PowerPC/i) ){ $os = 'Mac PowerPC'; } elsif( $os =~ /Mac/i ){ $os = 'Mac OS'; } #UNIX系 elsif( $os =~ /SunOS/i ){ $os = 'SunOS'; } elsif( $os =~ /Linux/i ){ $os = 'Linux'; } elsif( $os =~ /FreeBSD/i ){ $os = 'FreeBSD'; } elsif( $os =~ /NetBSD/i ){ $os = 'NetBSD'; } #モバイル系 elsif( $os =~ /DoCoMo/i ){ $os = 'i-mode'; } elsif( $os =~ /L-mode/i ){ $os = 'L-mode'; } elsif( $os =~ /J-PHONE/i ){ $os = 'Vodafone'; } elsif( ($os =~ /UP\.Browser/i) && ($brows =~ /KDDI/i) ){ $os = 'au'; } elsif( $os =~ /UP\.Browser/i ){ $os = 'TU-KA'; } elsif( $os =~ /DDIPOCKET/i ){ $os = 'Air H'; } elsif( $os =~ /AVE-Front/i ){ $os = 'AVE-Front'; } elsif( $os =~ /sharp pda/i ){ $os = 'ザウルス'; } elsif( $os =~ /sharp wd/i ){ $os = '書院'; } #ゲーム機系 elsif( $os =~ /PlayStation/i ){ $os = 'PlayStation2'; } elsif( $os =~ /DreamPassport/i ){ $os = 'DreamCast'; } elsif( $os =~ /NF/i ){ $os = 'NetFront'; } #ロボット系 elsif( $os =~ /Google/i ){ $os = 'Googlebot'; } elsif( $os =~ /msnbot/i ){ $os = 'MSNbot'; } #不明 else{ $os = "不明"; } $oss{($os)[0]}++; $cntOs++; } #各項目の最大値をカウント if( $graphMethod == 1 ){ #日付 $maxDates = 0; foreach(%dates){ if( $dates{$_} > $maxDates ){ $maxDates = $dates{$_}; } } #時間 $maxHours = 0; foreach (%hours){ if( $hours{$_} > $maxHours ){ $maxHours = $hours{$_}; } } #曜日 $maxYoubis = 0; foreach (%youbis){ if( $youbis{$_} > $maxYoubis ){ $maxYoubis = $youbis{$_}; } } #ホスト $maxHosts = 0; foreach (%hosts){ if( $hosts{$_} > $maxHosts ){ $maxHosts = $hosts{$_}; } } #エージェント $maxAgents = 0; foreach (%agents){ if( $agents{$_} > $maxAgents ){ $maxAgents = $agents{$_}; } } #参照ページ $maxReferers = 0; foreach (%referers){ if( $referers{$_} > $maxReferers ){ $maxReferers = $referers{$_}; } } #リンク元 $maxReferrers = 0; foreach (%referrers){ if( $referrers{$_} > $maxReferrers ){ $maxReferrers = $referrers{$_}; } } #解像度 $maxSwhs = 0; foreach (%swhs){ if( $swhs{$_} > $maxSwhs ){ $maxSwhs = $swhs{$_}; } } #色数 $maxScds = 0; foreach (%scds){ if( $scds{$_} > $maxScds ){ $maxScds = $scds{$_}; } } #検索エンジン $maxSengins = 0; foreach (%sengins){ if( $sengins{$_} > $maxSengins ){ $maxSengins = $sengins{$_}; } } #OS $maxOss = 0; foreach (%oss){ if( $oss{$_} > $maxOss ){ $maxOss = $oss{$_}; } } #ブラウザ $maxBrowss = 0; foreach (%browss){ if( $browss{$_} > $maxBrowss ){ $maxBrowss = $browss{$_}; } } }else{ $maxDates = $cntDate; $maxHours = $cntHour; $maxYoubis = $cntYoubi; $maxHosts = $cntHost; $maxAgents = $cntAgent; $maxReferers = $cntReferer; $maxReferrers = $cntReferrer; $maxSwhs = $cntSwh; $maxScds = $cntScd; $maxSengins = $cntSengin; $maxOss = $cntOs; $maxBrowss = $cntBrows; } } } #------------------------------------------------- # メニュー表示 #------------------------------------------------- sub menu { print <<"EOF";
EOF } #------------------------------------------------- # ログ数、最大ログ数、ログ期間表示 #------------------------------------------------- sub head_data { print <<"EOF";
件数: $total  /  最大件数: $maxlog
"; print "
期間: EOF if ($total >= 2){ $line = pop(@logs); ($count,$date,$youbi,$hour,$min,$sec,$addr,$host,$agent,$referer,$referrer,$swh,$scd,) = split(/<>/, $line); $day1 = "$date($youbi)$hour:$min:$sec"; push(@logs, $line); $line = shift(@logs); ($count,$date,$youbi,$hour,$min,$sec,$addr,$host,$agent,$referer,$referrer,$swh,$scd,) = split(/<>/, $line); $day2 = "$date($youbi)$hour:$min:$sec"; unshift(@logs, $line); print "$day1 〜 $day2"; } print "
"; } #------------------------------------------------- # 詳細ログ一覧 #------------------------------------------------- sub log_list{ &header; # 個別リスト表示用データ編集 if ($FORM{'analysis'} eq "list" || $FORM{'analysis'} eq "search"){ if ($FORM{'analysis'} eq "list") { #リスト抽出 &list_extract; } elsif ($FORM{'analysis'} eq "search") { #検索実行 &search_exec; } @logs = @displog; $total = @logs; $message = $message . "
$total件がヒットしました。"; } if ($FORM{'page'} eq "") { $FORM{'page'} = 1; } # 表示開始件数を計算 $i = ($FORM{'page'} - 1) * $pageview; # 最大ページの計算 $totalpage = 0; $j = $total; while( $j > 0 ){ $totalpage++; $j = $j - $pageview; } print <<"EOF";
詳 細 ロ グ 一 覧
EOF &menu; print "\n"; &head_data; if( $total eq '0' ){ if( $FORM{'analysis'} eq "list" || $FORM{'analysis'} eq "search"){ $ErrNo = 2; }else{ $ErrNo = 1; } &error; } print <<"EOF";

$message     EOF if ($total != 0){ print "$pageview件ずつ表\示します。PAGE $FORM{'page'}/$totalpage\n"; } print <<"EOF";

EOF #1ページ分をループして表示 foreach $line ( @logs[$i .. $i + $pageview - 1] ){ ($count,$date,$youbi,$hour,$min,$sec,$addr,$host,$agent,$referer,$referrer,$swh,$scd,)=split(/<>/,$line); # エイリアス変換 $referer = &convURL($referer); # 参照ページ $referrer = &convURL($referrer); # リンク元 #ログ表示 print <<"EOF";
EOF print "
NO.$count EOF #土日を着色 if( $youbi eq "日" ){ print "アクセス日時 : $date($youbi) $hour時$min分$sec秒 \n"; }elsif( $youbi eq "土" ){ print "アクセス日時 : $date($youbi) $hour時$min分$sec秒 \n"; }else{ print "アクセス日時 : $date($youbi) $hour時$min分$sec秒 \n"; } if( $referrer =~ /http:/g ){ $referrer = "$referrer"; }else{ $referrer = $referrer; } print <<"EOF";
 
PAGE :  $referer
FROM :  $referrer
AGENT :  $agent
IP : $addr / HOST : $host
EOF print "\n"; print <<"EOF";
解像度 : $swh / 表\示可能\色数 : " . &convColorText($scd) . "
\n"; print "
"; print "
"; $i++; if ($i == $total) { last; } } #ページのリンクを表示 print ""; print ""; print "

"; print ""; #前のページ if ( $FORM{'page'} != 1 ) { $pg_back = $FORM{'page'} - 1; print ""; print ""; } #次のページ if ($i != $total) { $pg_fwd = $FORM{'page'} + 1; print ""; print ""; } print "
\n"; print "
"; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print "
\n"; print "
"; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print "
"; #直接移動ボタン if( $totalpage >= 3 ){ print ""; print ""; print "

"; $p = 0; print ""; print ""; print "
[ 直接移動 ]
"; print ""; print ""; if( ($p % 20 == 0) && ($p != 0) ){ print ""; } } print "
"; for( $p=1 ; $p<=$totalpage ; $p++ ){ print ""; print "
"; print ""; print ""; print ""; print ""; print ""; print ""; if( $FORM{'page'} eq $p ){ print ""; }else{ print ""; } print "
 
"; } print ""; print ""; print "

"; #削除欄 print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print "
 
削除したいログ番号をスペースで区切って入力して下さい。
"; print "
"; print "
"; &footer; } #------------------------------------------------- # 日付別ログ一覧 #------------------------------------------------- sub date { &decode; &header; print <<"EOF";
日 別 ロ グ 一 覧
EOF &menu; print "\n"; &head_data; if( $total == 0 ){ $ErrNo = 1; &error; } print "
\n"; print "
\n"; $i=0; foreach( sort keys %dates ){ $per = sprintf("%.01f", $dates{$_} / $cntDate * 100); $perGraph = sprintf("%.01f", $dates{$_} / $maxDates * 100); $clrwidth = 350 * ( $perGraph / 100 ); $clrwidot = 350 - $clrwidth; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; if( $yobi{$_} eq "土" ){ print ""; }elsif( $yobi{$_} eq "日" ){ print ""; }else{ print ""; } print "
" . $_ . "(" . $yobi{$_} . ")" . $_ . "(" . $yobi{$_} . ")" . $_ . "(" . $yobi{$_} . ")
\n"; print "
"; print "\n"; print ""; print ""; print "
\n"; print "
"; print "\n"; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print "\n"; print ""; print "\n"; print ""; print ""; print ""; print ""; print ""; print "\n"; print "
 $dates{$_}pt ( $per% ) 
 
\n"; print "
\n"; $i++; $today = "$_"; $today_ac = "$dates{$_}"; } &get_env; if( $i > 1 ){ if( $today ne $date ){ $heikin = sprintf("%.f", $cntDate / $i); }else{ $heikin = sprintf("%.f", ($cntDate - $today_ac) / ($i - 1)); } print ""; print ""; print ""; print ""; print "
1日平均 : $heikin アクセス
※集計中の日付は計算されません。
"; } print "
"; print "
"; &footer; } #------------------------------------------------- # 時間帯別ログ一覧 #------------------------------------------------- sub jikan { &decode; &header; print <<"EOF";
時 間 帯 別 ロ グ 一 覧
EOF &menu; print "\n"; &head_data; if( $total == 0 ){ $ErrNo = 1; &error; } print "
\n"; print "
\n"; if($FORM{'option'} ne ""){ print ""; print ""; print "
$FORM{'option'}のログ
"; } for ($i=0; $i<=23; $i++) { $hours = 0; foreach $line(@logs) { ($count,$date,$youbi,$hour,$min,$sec,$addr,$host,$agent,$referer,$referrer,$swh,$scd,) = split(/<>/, $line); if( $i < 10 ){ $jikan = "0" . $i; }else{ $jikan = $i; } if( ($hour eq $jikan) && ($date eq $FORM{'key'} || $FORM{'option'} eq "") ){ $hours++; } } $per = sprintf("%.01f", $hours / $cntHour * 100); $perGraph = sprintf("%.01f", $hours / $maxHours * 100); $clrwidth = 450 * ( $perGraph / 100 ); $clrwidot = 450 - $clrwidth; if( $per eq "0.0" ){ $per = 0; } $hours = $hours . "pt"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print ""; print "
" . $jikan . ":00 〜
\n"; print "
"; print "\n"; print ""; print ""; print "
\n"; print "
"; print "\n"; print ""; if( $per eq 0 ){ print ""; }else{ print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; } print "
 $hours ( $per% ) 
\n"; print "
\n"; } print "
"; print "
"; &footer; } #------------------------------------------------- # 曜日別ログ一覧 #------------------------------------------------- sub youbi { &decode; &header; print <<"EOF";
時 間 帯 別 ロ グ 一 覧
EOF &menu; print "\n"; &head_data; if( $total == 0 ){ $ErrNo = 1; &error; } print "
\n"; print "
\n"; for ($i=0; $i<=6; $i++){ $youbis = 0; foreach $line(@logs) { ($count,$date,$youbi,$hour,$min,$sec,$addr,$host,$agent,$referer,$referrer,$swh,$scd,)=split(/<>/,$line); if( $youbi eq "日" ){ $youbiNo = 0; } if( $youbi eq "月" ){ $youbiNo = 1; } if( $youbi eq "火" ){ $youbiNo = 2; } if( $youbi eq "水" ){ $youbiNo = 3; } if( $youbi eq "木" ){ $youbiNo = 4; } if( $youbi eq "金" ){ $youbiNo = 5; } if( $youbi eq "土" ){ $youbiNo = 6; } if( $youbiNo eq $i ){ $youbis++; } } $YoubiText = ('日','月','火','水','木','金','土') [$i]; $YoubiList = ('日 曜 日','月 曜 日','火 曜 日','水 曜 日','木 曜 日','金 曜 日','土 曜 日') [$i]; $per = sprintf("%.01f", $youbis / $cntYoubi * 100); $perGraph = sprintf("%.01f", $youbis / $maxYoubis * 100); $clrwidth = 450 * ( $perGraph / 100 ); $clrwidot = 450 - $clrwidth; if( $per eq "0.0" ){ $per = 0; } $youbis = $youbis . "pt"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; if( $i == 6 ){ print ""; }elsif( $i == 0 ){ print ""; }else{ print ""; } print "
$YoubiList$YoubiList$YoubiList
\n"; print "
"; print "\n"; print ""; print ""; print "
\n"; print "
"; print "\n"; print ""; if( $per eq 0 ){ print ""; }else{ print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; } print "
 $youbis ( $per% ) 
\n"; print "
\n"; } print "
"; print "
"; &footer; } #------------------------------------------------- # リモートホストアドレス別ログ一覧 #------------------------------------------------- sub host { &decode; &header; $hmd = $_[0]; if( $hmd eq "host"){ $FORM{'analysis'} = 'host'; } if( $hmd eq "addr"){ $FORM{'analysis'} = 'addr'; } if( $hmd eq "domain"){ $FORM{'analysis'} = 'domain'; } if( $FORM{'analysis'} eq "host" ) { $PTITLE = "ホ ス ト 別 ロ グ 一 覧"; } if( $FORM{'analysis'} eq "addr" ) { $PTITLE = "I P ア ド レ ス 別 ロ グ 一 覧"; } if( $FORM{'analysis'} eq "domain" ){ $PTITLE = "ド メ イ ン 別 ロ グ 一 覧"; } print <<"EOF";
$PTITLE
EOF &menu; print "\n"; &head_data; if( $total == 0 ){ $ErrNo = 1; &error; } print "
\n"; if( $maxrank ne "" ){ print "\n"; print "\n"; } print "
ランキング $maxrank 位まで表\示中です。
\n"; @sorthosts = sort by_hosts keys(%hosts); $num = 1; $ranking = 1; foreach( @sorthosts ){ if( $maxrank ne "" ){ if( $ranking > $maxrank ){ last; } } $per = sprintf("%.01f", $hosts{$_} / $cntHost * 100); $perGraph = sprintf("%.01f", $hosts{$_} / $maxHosts * 100); $clrwidth = 590 * ( $perGraph / 100 ); $clrwidot = 590 - $clrwidth; print "\n"; print "\n"; print "\n"; $_=~ s/ /\+/g; print "\n"; print "
$num\n"; print "\n"; print "\n"; $hosts = $hosts{$_} . "pt"; if( $datalength eq 1 ){ $nlen = length $_; if( $nlen > 70 ){ $_ = substr( $_, 0, 70 ); $_ = $_ . " ..."; } } print ""; print "
 $_
\n"; print "
"; print "\n"; print ""; print ""; print ""; print ""; print ""; print ""; print ""; if( $FORM{'analysis'} eq "host" ){ print ""; }elsif( $FORM{'analysis'} eq "addr" ){ print ""; }elsif( $FORM{'analysis'} eq "domain" ){ print ""; } print ""; print "
 $hosts ( $per% ) 
\n"; print "
\n"; print "\n"; print ""; print "
"; print "\n"; print ""; print ""; print "
\n"; print "
"; $num++; $ranking++; } print "
"; print "
"; &footer; } #リモートホストアドレス昇順サブルーチン sub by_hosts { if( $hosts{$b} != $hosts{$a} ){ $hosts{$b} <=> $hosts{$a}; }else{ $a cmp $b; } } #------------------------------------------------- # エージェント別ログ一覧 #------------------------------------------------- sub agent { &decode; &header; print <<"EOF";
ユ ー ザ ー エ ー ジ ェ ン ト 別 ロ グ 一 覧
EOF &menu; print "\n"; &head_data; if( $total == 0 ){ $ErrNo = 1; &error; } print "
\n"; if( $maxrank ne "" ){ print "\n"; print "\n"; } print "
ランキング $maxrank 位まで表\示中です。
\n"; @sortagents = sort by_agents keys(%agents); $num = 1; $ranking = 1; foreach( @sortagents ){ if( $maxrank ne "" ){ if( $ranking > $maxrank ){ last; } } $per = sprintf("%.01f", $agents{$_} / $cntAgent * 100); $perGraph = sprintf("%.01f", $agents{$_} / $maxAgents * 100); $clrwidth = 590 * ( $perGraph / 100 ); $clrwidot = 590 - $clrwidth; print "\n"; print "\n"; print "\n"; print "\n"; print "
$num\n"; print "\n"; print "\n"; $agents = $agents{$_} . "pt"; if( $datalength eq 1 ){ $nlen = length $_; if( $nlen > 70 ){ $_ = substr( $_, 0, 70 ); $_ = $_ . " ..."; } } print ""; print "
 $_
\n"; print "
"; print "\n"; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print "
 $agents ( $per% ) 
\n"; print "
\n"; print "\n"; print ""; print "
"; print "\n"; print ""; print ""; print "
\n"; print "
"; $num++; $ranking++; } print "
"; print "
"; &footer; } #エージェント昇順サブルーチン sub by_agents { if( $agents{$b} != $agents{$a} ){ $agents{$b} <=> $agents{$a}; }else{ $a cmp $b; } } #------------------------------------------------- # ページ別ログ一覧 #------------------------------------------------- sub referer { &decode; &header; print <<"EOF";
ペ ー ジ 別 ロ グ 一 覧
EOF &menu; print "\n"; &head_data; if ($total == 0){ $ErrNo = 1; &error; } print "
\n"; if( $maxrank ne "" ){ print "\n"; print "\n"; } print "
ランキング $maxrank 位まで表\示中です。
\n"; @sortreferers = sort by_referers keys(%referers); $num = 1; $ranking = 1; foreach (@sortreferers) { if( $maxrank ne "" ){ if( $ranking > $maxrank ){ last; } } # エイリアス変換 $disp_referer = &convURL($_); $per = sprintf("%0.1f", $referers{$_} / $cntReferer * 100); $perGraph = sprintf("%0.1f", $referers{$_} / $maxReferers * 100); $clrwidth = 590 * ( $perGraph / 100 ); $clrwidot = 590 - $clrwidth; $referers = $referers{$_} . "pt"; print "\n"; print "\n"; print "\n"; print "\n"; print "
$num\n"; print "\n"; print "\n"; if( $_ eq "" ){ print "\n"; }elsif( $_ eq $nodata || $_=~/$script.?mode=rec/ ){ print "\n"; }else{ if( $datalength eq 1 ){ $nlen = length $disp_referer; if( $nlen > 70 ){ $disp_referer = substr( $disp_referer, 0, 70 ); $disp_referer = $disp_referer . " ..."; } } print ""; } print "
 " . $nodata . "" . $nodata . "$disp_referer
\n"; print "
"; print "\n"; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; # print "詳細"; print "
 $referers ( $per% ) 
\n"; print "
\n"; print "\n"; print ""; print "
"; print "\n"; print ""; print ""; print "
\n"; print "
"; $num++; $ranking++; } print "
"; print "
"; &footer; } #ページ昇順サブルーチン sub by_referers { if( $referers{$b} != $referers{$a} ){ $referers{$b} <=> $referers{$a}; }else{ $a cmp $b; } } #------------------------------------------------- # リンク元ログ一覧 #------------------------------------------------- sub referrer { &decode; &header; print <<"EOF";
リ ン ク 元 別 ロ グ 一 覧
EOF &menu; print "\n"; &head_data; if( $total == 0 ){ $ErrNo = 1; &error; } print "
\n"; if( $maxrank ne "" ){ print "\n"; print "\n"; } print "
ランキング $maxrank 位まで表\示中です。
\n"; @sortreferrers = sort by_referrers keys(%referrers); $num = 1; $ranking = 1; foreach( @sortreferrers ){ if( $maxrank ne "" ){ if( $ranking > $maxrank ){ last; } } $per = sprintf( "%.01f", $referrers{$_} / $cntReferrer * 100 ); $perGraph = sprintf( "%.01f", $referrers{$_} / $maxReferrers * 100 ); $clrwidth = 590 * ( $perGraph / 100 ); $clrwidot = 590 - $clrwidth; $referrers = $referrers{$_} . "pt"; print "\n"; print "\n"; print "\n"; print "\n"; print "
$num\n"; print "\n"; print "\n"; if ($_ eq $nodata || $_ eq "Download" || $_ eq "NoScript" || $_=~/$script.?mode=rec/ || $_=~/$script.?rec/) { print "\n"; }else{ # エイリアス変換 $disp_referrer = &convURL($_); #URLデコード $disp2 = ""; if( $disp_referrer =~ m/%u[0-9a-fA-F]{3,4}/ ){ $disp2 = "
(※UTF-16でエンコードされています。)"; }elsif( $disp_referrer =~m|%[eE][0-9a-fA-F]{1}%[0-9a-fA-F]{2}%[0-9a-fA-F]{2}%[eE][0-9a-fA-F]{1}%[0-9a-fA-F]{2}%[0-9a-fA-F]{2}| ){ $disp2 = "
(※UTF-8でエンコードされています。)"; }else{ $disp_referrer =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/ego; } if( $datalength eq 1 ){ $nlen = length $disp_referrer; if( $nlen > 70 ){ $disp_referrer = substr( $disp_referrer, 0, 70 ); $disp_referrer = $disp_referrer . " ..."; } } print ""; } print "
 " . $_ . "$disp_referrer$disp2
\n"; print "
"; print "\n"; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print "
 $referrers ( $per% ) 
\n"; print "
\n"; print "\n"; print ""; print "
"; print "\n"; print ""; print ""; print "
\n"; print "
"; $num++; $ranking++; } print "
"; print "
"; &footer; } #リンク元昇順サブルーチン sub by_referrers { if( $referrers{$b} != $referrers{$a} ){ $referrers{$b} <=> $referrers{$a}; }else{ $a cmp $b; } } #------------------------------------------------- # 解像度別ログ一覧 #------------------------------------------------- sub swh { &decode; &header; print <<"EOF";
解 像 度 別 ロ グ 一 覧
EOF &menu; print "\n"; &head_data; if( $total == 0 ){ $ErrNo = 1; &error; } print "
\n"; if( $maxrank ne "" ){ print "\n"; print "\n"; } print "
ランキング $maxrank 位まで表\示中です。
\n"; @sortswhs = sort by_swhs keys(%swhs); $num = 1; $ranking = 1; foreach( @sortswhs ){ if( $maxrank ne "" ){ if( $ranking > $maxrank ){ last; } } $per = sprintf("%.01f", $swhs{$_} / $cntSwh * 100); $perGraph = sprintf("%.01f", $swhs{$_} / $maxSwhs * 100); $clrwidth = 450 * ( $perGraph / 100 ); $clrwidot = 450 - $clrwidth; $swhs = $swhs{$_} . "pt"; print "\n"; print "\n"; print "\n"; print "\n"; print "
$num\n"; print "\n"; print "\n"; print "
 \n"; if( $_ eq "" ){ print "" . $nodata . "\n"; }elsif( $_ eq "NoScript" ){ print "$_\n"; }else{ print "$_"; } print "
\n"; print "
"; print "\n"; print ""; print ""; print "
\n"; print "
"; print "\n"; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print "
 $swhs ( $per% ) 
"; print "
"; $num++; $ranking++; } print "
"; print "
"; &footer; } # 解像度昇順サブルーチン sub by_swhs { if( $swhs{$b} != $swhs{$a} ){ $swhs{$b} <=> $swhs{$a}; }else{ $a cmp $b; } } #------------------------------------------------- # 表示可能色数別ログ一覧 #------------------------------------------------- sub scd { &decode; &header; print <<"EOF";
表\ 示 可 能\ 色 数 別 ロ グ 一 覧
EOF &menu; print "\n"; &head_data; if( $total == 0 ){ $ErrNo = 1; &error; } print "
\n"; if( $maxrank ne "" ){ print "\n"; print "\n"; } print "
ランキング $maxrank 位まで表\示中です。
\n"; @sortscds = sort by_scds keys(%scds); $num = 1; $ranking = 1; foreach( @sortscds ){ if( $maxrank ne "" ){ if( $ranking > $maxrank ){ last; } } $per = sprintf("%.01f", $scds{$_} / $cntScd * 100); $perGraph = sprintf("%.01f", $scds{$_} / $maxScds * 100); $clrwidth = 450 * ( $perGraph / 100 ); $clrwidot = 450 - $clrwidth; $scds = $scds{$_} . "pt"; print "\n"; print "\n"; print "\n"; print "\n"; print "
$num\n"; print "\n"; print "\n"; print "
 \n"; if( $_ eq "" ){ print "" . $nodata . ""; }elsif( $_ eq "NoScript" ){ print "$_"; }else{ print "" . &convColorText($_); } print "
\n"; print "
"; print "\n"; print ""; print ""; print "
\n"; print "
"; print "\n"; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print "
 $scds ( $per% ) 
"; print "
"; $num++; $ranking++; } print "
"; print "
"; &footer; } #解像度昇順サブルーチン sub by_scds { if( $scds{$b} != $scds{$a} ){ $scds{$b} <=> $scds{$a}; }else{ $a cmp $b; } } #------------------------------------------------- # 検索エンジン別ログ一覧 #------------------------------------------------- sub sengin { &decode; &header; print <<"EOF";
検 索 エ ン ジ ン 別 ロ グ 一 覧
EOF &menu; print "\n"; &head_data; if( $total == 0 ){ $ErrNo = 1; &error; } print "
\n"; if( $maxrank ne "" ){ print "\n"; print "\n"; } print "
ランキング $maxrank 位まで表\示中です。
\n"; @sortsengins = sort by_sengins keys(%sengins); $num = 1; $ranking = 1; $seflg = 0; $totalse = 0; foreach( @sortsengins ){ if( $maxrank ne "" ){ if( $ranking > $maxrank ){ last; } } $per = sprintf("%.01f", $sengins{$_} / $cntSengin * 100); $perGraph = sprintf("%.01f", $sengins{$_} / $maxSengins * 100); $clrwidth = 447 * ( $perGraph / 100 ); $clrwidot = 447 - $clrwidth; $sengins = $sengins{$_} . "pt"; if( $_ eq 'Yahoo! Japan' ){ $_ = "$_"; } elsif( $_ eq 'Google' ){ $_ = "$_"; } elsif( $_ eq 'MSN Japan' ){ $_ = "$_"; } elsif( $_ eq 'goo' ){ $_ = "$_"; } elsif( $_ eq 'Infoseek楽天' ){ $_ = "$_"; } elsif( $_ eq 'BIGLOBE' ){ $_ = "$_"; } elsif( $_ eq 'Excite' ){ $_ = "$_"; } elsif( $_ eq 'fresh EYE' ){ $_ = "$_"; } elsif( $_ eq '@nifty' ){ $_ = "$_"; } elsif( $_ eq 'livedoor' ){ $_ = "$_"; } elsif( $_ eq 'DION' ){ $_ = "$_"; } elsif( $_ eq 'AOL' ){ $_ = "$_"; } elsif( $_ eq 'ODN' ){ $_ = "$_"; } elsif( $_ eq 'Ask.jp' ){ $_ = "$_"; } elsif( $_ eq 'So-net' ){ $_ = "$_"; } elsif( $_ eq 'OCN' ){ $_ = "$_"; } else{ $_ = $_; $seper = 100 - $per; } print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
$num\n"; print "\n"; print "\n"; print ""; print "
 $_
\n"; print "
"; print "\n"; print ""; print ""; print "
\n"; print "
"; print "\n"; print ""; print "
 $sengins ( $per% ) 
"; print "
"; $num++; $ranking++; } $seper = sprintf("%0.1f", $seper); print "\n"; print ""; print "
検索エンジンからの訪問者 : $seper
"; print "
"; print "
"; &footer; } #検索エンジン昇順サブルーチン sub by_sengins { if( $sengins{$b} != $sengins{$a} ){ $sengins{$b} <=> $sengins{$a}; }else{ $a cmp $b; } } #------------------------------------------------- # OS別ログ一覧 #------------------------------------------------- sub os { &decode; &header; print <<"EOF";
O S 別 ロ グ 一 覧
EOF &menu; print "\n"; &head_data; if( $total == 0 ){ $ErrNo = 1; &error; } print "
\n"; if( $maxrank ne "" ){ print "\n"; print "\n"; } print "
ランキング $maxrank 位まで表\示中です。
\n"; @sortoss = sort by_oss keys(%oss); $num = 1; $ranking = 1; foreach( @sortoss ){ if( $maxrank ne "" ){ if( $ranking > $maxrank ){ last; } } $per = sprintf("%.01f", $oss{$_} / $cntOs * 100); $perGraph = sprintf("%.01f", $oss{$_} / $maxOss * 100); $clrwidth = 440 * ( $perGraph / 100 ); $clrwidot = 440 - $clrwidth; $oss = $oss{$_} . "pt"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
$num\n"; print "\n"; print "\n"; print ""; print "
 $_
\n"; print "
"; print "\n"; print ""; print ""; print "
\n"; print "
"; print "\n"; print ""; print "
 $oss ( $per% ) 
"; print "
"; $num++; $ranking++; } $seper = sprintf("%0.1f", $seper); print "
"; print "
"; &footer; } #OS昇順サブルーチン sub by_oss { if( $oss{$b} != $oss{$a} ){ $oss{$b} <=> $oss{$a}; }else{ $a cmp $b; } } #------------------------------------------------- # ブラウザ別ログ一覧 #------------------------------------------------- sub brows { &decode; &header; print <<"EOF";
ブ ラ ウ ザ 別 ロ グ 一 覧
EOF &menu; print "\n"; &head_data; if( $total == 0 ){ $ErrNo = 1; &error; } print "
\n"; if( $maxrank ne "" ){ print "\n"; print "\n"; } print "
ランキング $maxrank 位まで表\示中です。
\n"; @sortbrowss = sort by_browss keys(%browss); $num = 1; $ranking = 1; foreach( @sortbrowss ){ if( $maxrank ne "" ){ if( $ranking > $maxrank ){ last; } } $per = sprintf("%.01f", $browss{$_} / $cntBrows * 100); $perGraph = sprintf("%.01f", $browss{$_} / $maxBrowss * 100); $clrwidth = 620 * ( $perGraph / 100 ); $clrwidot = 620 - $clrwidth; $browss = $browss{$_} . "pt"; print "\n"; print "\n"; print "\n"; print "\n"; print "
$num\n"; print "\n"; print "\n"; print ""; print "
 $_
\n"; print "
"; print "\n"; print ""; print "
 $browss ( $per% ) 
\n"; print "
\n"; print "\n"; print ""; print "
"; print "\n"; print ""; print ""; print "
\n"; print "
"; $num++; $ranking++; } $seper = sprintf("%0.1f", $seper); print "
"; print "
"; &footer; } #ブラウザ昇順サブルーチン sub by_browss { if( $browss{$b} != $browss{$a} ){ $browss{$b} <=> $browss{$a}; }else{ $a cmp $b; } } #------------------------------------------------- # 検索 #------------------------------------------------- sub kensaku { &header; print <<"EOF";
ロ グ 検 索
EOF &menu; print <<"EOF";
検索キーワードを入力し [ 検索 ] を押して下さい。

項 目 検索キーワード 検索
 ログ番号
 ホスト
 IPアドレス
 エージェント
 参照ページ
 リンク元
 解像度
 表\示可能\色数 

EOF print "
"; print "
"; &footer; } #------------------------------------------------- # 項目別リスト抽出ルーチン #------------------------------------------------- sub list_extract{ #メッセージの編集 if($FORM{'key'} ne ""){ if ($FORM{'search'} eq "jikan") { $message = "" . $FORM{'option'} . $FORM{'key'} . "時台 のリストです。"; } elsif ($FORM{'search'} eq "youbi") { $message = "" . $FORM{'key'} . "曜日 のリストです。"; } else { $message = "" . &convColorText($FORM{'key'}) . " のリストです。"; } } else { $message = "" . $nodata . " のリストです。"; } #データ配列編集 foreach $line(@logs) { ($count,$date,$youbi,$hour,$min,$sec,$addr,$host,$agent,$referer,$referrer,$swh,$scd,) = split(/<>/, $line); if($FORM{'search'} eq "referer" || $FORM{'search'} eq "referrer"){ #同一ページ扱い処理 $disp_referer = $referer; $disp_referrer = $referrer; foreach $same_url(@SamePage) { ($same_url1, $same_url2) = split(/==/, $same_url); if($referer eq $same_url1){ $referer = $same_url2; } if($referrer eq $same_url1){ $referrer = $same_url2; } } } if ($FORM{'search'} eq "date" && $date eq $FORM{'key'}) { $line = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$referrer<>$swh<>" . &convColorText($scd) . "<>"; push(@displog, $line); } elsif ($FORM{'search'} eq "jikan" && $hour eq $FORM{'key'}) { if(($FORM{'option'} eq "") || ($FORM{'option'} ne "" && $FORM{'option'} eq $date)){ $line = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$referrer<>$swh<>" . &convColorText($scd) . "<>"; push(@displog, $line); } } elsif ($FORM{'search'} eq "youbi" && $youbi eq $FORM{'key'}) { $line = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$referrer<>$swh<>" . &convColorText($scd) . "<>"; push(@displog, $line); } elsif($FORM{'search'} eq "addr" && $addr eq $FORM{'key'}) { $line = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$referrer<>$swh<>" . &convColorText($scd) . "<>"; push(@displog, $line); } elsif($FORM{'search'} eq "host" && $host eq $FORM{'key'}) { $line = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$referrer<>$swh<>" . &convColorText($scd) . "<>"; push(@displog, $line); } elsif($FORM{'search'} eq "domain") { if ($host =~ /(.*)\.(\d+)$/) { $domain = $host; $host = "$host"; } elsif ($host =~ /(.*)\.(.*)\.(.*)\.(.*)$/) { $domain = "\*\.$2\.$3\.$4"; $host = "$1\.$2\.$3\.$4"; } elsif ($host =~ /(.*)\.(.*)\.(.*)$/) { $domain = "\*\.$2\.$3"; $host = "$1\.$2\.$3\"; } else { $domain = $host; $host = "$host"; } if( $FORM{'key'} eq $domain ){ $line = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$referrer<>$swh<>" . &convColorText($scd) . "<>"; push(@displog, $line); } } elsif ($FORM{'search'} eq "agent" && $agent eq $FORM{'key'}) { $line = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$referrer<>$swh<>" . &convColorText($scd) . "<>"; push(@displog, $line); } elsif ($FORM{'search'} eq "referer" && $referer eq $FORM{'key'}) { $line = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$disp_referer<>$referrer<>$swh<>" . &convColorText($scd) . "<>"; push(@displog, $line); } elsif ($FORM{'search'} eq "referrer" && $referrer eq $FORM{'key'}) { $line = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$disp_referrer<>$swh<>" . &convColorText($scd) . "<>"; push(@displog, $line); } elsif ($FORM{'search'} eq "swh" && $swh eq $FORM{'key'}) { $line = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$referrer<>$swh<>" . &convColorText($scd) . "<>"; push(@displog, $line); } elsif ($FORM{'search'} eq "scd" && $scd eq $FORM{'key'}) { $line = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$referrer<>$swh<>" . &convColorText($scd) . "<>"; push(@displog, $line); } } } #------------------------------------------------- # 検索実行ルーチン #------------------------------------------------- sub search_exec{ # 検索用キーワード退避(括弧問題) $key1 = $FORM{'key'}; if( $FORM{'key'} eq "" ){ $ErrNo = 3; &error; } #メッセージの編集 if( $FORM{'search'} eq "log_no") { $message = "LogNo :"; } if( $FORM{'search'} eq "addr" ) { $message = "IPアドレス :"; } if( $FORM{'search'} eq "host" ) { $message = "ホスト名 :"; } if( $FORM{'search'} eq "agent" ) { $message = "エージェント :"; } if( $FORM{'search'} eq "referer" ) { $message = "参照ページ :"; } if( $FORM{'search'} eq "referrer" ){ $message = "リンク元 :"; } if( $FORM{'search'} eq "swh" ) { $message = "解像度 :"; } if( $FORM{'search'} eq "scd" ) { $message = "表\示可能\色数 :"; } $message = $message . " [ " . $FORM{'key'} . " ] の検索結果です。 "; # 特殊文字エスケープ $key1 =~ s/\+/ /g; $key1 =~ s/\(/\\(/g; $key1 =~ s/\)/\\)/g; $key1 =~ s/\[/\\[/g; $key1 =~ s/\]/\\]/g; # データ配列編集 foreach $line(@logs){ ($count,$date,$youbi,$hour,$min,$sec,$addr,$host,$agent,$referer,$referrer,$swh,$scd,)=split(/<>/,$line); if($FORM{'search'} eq "log_no" && $count == $key1){ $count =~ s/$FORM{'key'}/\$FORM{'key'}\<\/b\>/g; $line = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$referrer<>$swh<>" . &convColorText($scd) . "<>"; push(@displog, $line); } if ($FORM{'search'} eq "addr" && $addr =~ /$key1/) { $addr =~ s/$FORM{'key'}/\$FORM{'key'}\<\/b\>/g; $line = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$referrer<>$swh<>" . &convColorText($scd) . "<>"; push(@displog, $line); } if($FORM{'search'} eq "host" && $host =~ /$key1/){ $host =~ s/$FORM{'key'}/\$FORM{'key'}\<\/b\>/g; $line = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$referrer<>$swh<>" . &convColorText($scd) . "<>"; push(@displog, $line); } if($FORM{'search'} eq "agent" && $agent =~ /$key1/){ $agent =~ s/$FORM{'key'}/\$FORM{'key'}\<\/b\>/g; $line = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$referrer<>$swh<>" . &convColorText($scd) . "<>"; push(@displog, $line); } if($FORM{'search'} eq "referer" && $referer =~ /$key1/){ $referer =~ s/$FORM{'key'}/\$FORM{'key'}\<\/b\>/g; $line = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$referrer<>$swh<>" . &convColorText($scd) . "<>"; push(@displog, $line); } if($FORM{'search'} eq "referrer" && $referrer =~ /$key1/){ $referrer =~ s/$FORM{'key'}/\$FORM{'key'}\<\/b\>/g; $line = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$referrer<>$swh<>" . &convColorText($scd) . "<>"; push(@displog, $line); } if($FORM{'search'} eq "swh" && $swh =~ /$key1/){ $swh =~ s/$FORM{'key'}/\$FORM{'key'}\<\/b\>/g; $line = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$referrer<>$swh<>" . &convColorText($scd) . "<>"; push(@displog, $line); } if($FORM{'search'} eq "scd" && &convColorText($scd) =~ /$key1/){ $scd = &convColorText($scd); $scd =~ s/$FORM{'key'}/\$FORM{'key'}\<\/b\>/g; $line = "$count<>$date<>$youbi<>$hour<>$min<>$sec<>$addr<>$host<>$agent<>$referer<>$referrer<>$swh<>" . &convColorText($scd) . "<>"; push(@displog, $line); } } } #------------------------------------------------- # ログ削除 #------------------------------------------------- sub delete{ if( $FORM{'delmode'} eq '1' ){ $FORM{'delcode'} = $FORM{'delno'}; } $FORM{'delcode'} =~ s/ / /g; @CODE = split(/ /,$FORM{'delcode'}); ($renban1, $renban2) = split(/-/,$FORM{'delcode'}); if( $renban1 == null ){ $renban1 = $renban2; } if( $renban2 == null ){ $renban2 = $renban1; } if( $renban1 > $renban2 ){ $temp = $renban1; $renban1 = $renban2; $renban2 = $temp; } for( $i=$renban1 ; $i<=$renban2 ; $i++ ){ push(@CODE, $i); } $keycount = @CODE; if( $keycount < 1 ){ &log_list; exit; } $flgDeleted = 0; foreach $line(@logs){ ($count,$date,$youbi,$hour,$min,$sec,$addr,$host,$agent,$referer,$referrer,$swh,$scd,) = split(/<>/, $line); $match = 0; foreach $delcode(@CODE) { if( $delcode > 0 ){ if( $count == $delcode ){ $match = 1; $flgDeleted = 1; } } } if( $match == 0 ){ push( @newlog , $line ); } } # 削除された場合 if ($flgDeleted == 1) { # 記録ファイルへ出力 &File_Write; } } #------------------------------------------------- # エイリアス変換 #------------------------------------------------- sub convURL(){ my $orgURL = $_[0]; my $cnvURL = $orgURL; foreach $alias(@ALIAS) { (my $alias_url, my $alias_name, my $conv_switch) = split(/==/, $alias); if( $conv_switch eq "1" ){ # 部分一致で変換 if($orgURL =~ /$alias_url/){ $cnvURL =~ s/$alias_url/$alias_name/g; } }else{ # 完全一致で変換 if($orgURL eq $alias_url){ $cnvURL = $alias_name; } } } return $cnvURL; } #------------------------------------------------- # 表示可能色数表示変換 #------------------------------------------------- sub convColorText(){ my $orgColorText = $_[0]; my $cnvColorText = $orgColorText; if( $orgColorText eq "0" ) { $cnvColorText = "1色"; } if( $orgColorText eq "1" ) { $cnvColorText = "モノクロ"; } if( $orgColorText eq "4" ) { $cnvColorText = "16色"; } if( $orgColorText eq "8") { $cnvColorText = "256色"; } if( $orgColorText eq "16") { $cnvColorText = "High Color ( 16bit )"; } if( $orgColorText eq "24") { $cnvColorText = "True Color ( 24bit )"; } if( $orgColorText eq "32") { $cnvColorText = "True Color ( 32bit )"; } if( $orgColorText eq "") { $cnvColorText = "$nodata"; } return $cnvColorText; } #------------------------------------------------- # 記録ファイル出力 #------------------------------------------------- sub File_Write{ if ($file_lock == 0) { # flock関数使用 open(LOG, ">$logfile"); flock(LOG, 2); seek(LOG, 0, 0); print LOG @newlog; truncate(LOG, tell(LOG)); close(LOG); } else { # ロックディレクトリ使用 for ($i = 0; $i <= 10; $i++) { if (mkdir($lockdir, 0755)) { last; } else { sleep($retry_interval); } } open(LOG, ">$logfile"); print LOG @newlog; close(LOG); rmdir($lockdir); } } #------------------------------------------------- # エラー処理 #------------------------------------------------- sub error { if( $ErrNo eq '' ) { $ErrMsg = "予\期せぬエラーが発生しました。"; } if( $ErrNo eq 1 ){ $ErrMsg = "ログファイルが空または存在しません。"; } if( $ErrNo eq 2 ){ $ErrMsg = "該当するログは見つかりませんでした。"; } if( $ErrNo eq 3 ){ $ErrMsg = "検索キーワードを入力してください。"; } print <<"EOF";



$ErrMsg


EOF &footer; exit; }