#!/usr/bin/perl #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ # Web Access Log Analyzer - ぽけろぐ。 # Copyright(C) 2001-2006 た。 # Create : 2001/07/01 # UpDate : 2006/07/07 # http://www.5jigenpocket.com/pokelog/ #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ $ver = '1.51a'; # # このスクリプトはフリーソフトです。 # 著作権は た。 が保有しております。商利用厳禁。 # 個人的な改造は自由に行って頂いて構いません。 # このスクリプトを使用したいかなる損害に対して作者は一切の責任を負いません。 # Webサイト等での再配布の際はご一報ください。 # # [ ファイル構成例 ] : [ ] 内は一般的なパーミッション値 # # / # | # +-- index.html (ホームページなど) # | # +-- cgi-bin [777] # | # +-- pokelog.cgi [755] ... プログラム本体 # pokelog.dat [666] ... データファイル # # [1] 任意のディレクトリを作成し、pokelog.cgi と pokelog.dat を # アスキーモードで転送し、パーミッションを設定する。 # # [2] ログをとりたいページソースの〜間の任意の場所に、 # 下記ののタグを埋め込む。 # # # # ☆ SSIを使用して記録する場合 # (日時, IPアドレス, ホスト名, UserAgent, リンク元のみ記録可能) # ページに次のタグを埋め込みます。 # # # ☆ ダウンロードカウンタとして動作させる場合 # ページに次のリンクを張って下さい。 # pokelog.cgi?mode=dl&file=ファイル名 # # [3] ログの閲覧方法 # PCで閲覧 # pokelog.cgi?mode=admin にアクセスし、パスワードを入力するか # pokelog.cgi?mode=admin&pass=パスワード にアクセスする。 # # 携帯で閲覧 # pokelog.cgi?mode=k にアクセスし、パスワードを入力するか # pokelog.cgi?mode=k&pass=パスワード にアクセスする。 #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ #------------------------------------------------------------------------------ # ↓↓↓ 初期設定ここから ↓↓↓ #------------------------------------------------------------------------------ # タイトル $title = 'GOLDEN GLORY ACCESS LOG'; # スクリプトファイル名 $script = 'gglog.cgi'; # アクセスログファイル名 $logfile = 'gglog.dat'; # パスワード $pass = 'ggweb'; # ログ件数の最大数指定 $maxlog = 1000000; # 1ページで表示する件数 $pageview = 50; # 初期表示モード(0=ログ一覧 / 1=日付 / 2=時間 / 3=曜日 / 4=ホスト / 5=エージェント / 6=ページ / 7=リンク元 / 8=検索) $init_mode = 6; # 文字配色設定 $bgcolor = '#000000'; # 背景色 初期値(#000000) $text = '#FFFFFF'; # テキスト 初期値(#FFFFFF) $link = '#FFFFFF'; # リンク 初期値(#FFFFFF) $vlink = '#FFFFFF'; # 既に訪れたリンク 初期値(#FFFFFF) $alink = '#00FF00'; # リンククリック時 初期値(#00FF00) $hovercolor = '#00BFFF'; # リンクonMOUSE 初期値(#00BFFF) $cnt_color = '#FFFFFF'; # カウント 初期値(#FFFFFF) $date_color = '#FFFFFF'; # アクセス日時 初期値(#FFFFFF) $addr_color = '#FFFFFF'; # IPアドレス 初期値(#FFFFFF) $host_color = '#FFFFFF'; # ホスト名 初期値(#FFFFFF) $agent_color = '#FFFFFF'; # UserAgent情報 初期値(#FFFFFF) $referer_color = '#FFFFFF'; # 参照ページ 初期値(#FFFFFF) $referrer_color = '#FFFFFF'; # リンク元 初期値(#FFFFFF) $swh_color = '#FFFFFF'; # 解像度 初期値(#FFFFFF) $scd_color = '#FFFFFF'; # 表示可能色数 初期値(#FFFFEE) $name_color = '#50FFFF'; # 名前 初期値(#50FFFF) $titlecolor = '#FFFFFF'; # タイトルの色 初期値(#FFFFFF) $msgcolor1 = '#AAFFEE'; # メッセージ色1 初期値(#AAFFEE) $msgcolor2 = '#FFFFC0'; # メッセージ色2 初期値(#FFFFC0) $msgcolor3 = '#FFC0C0'; # メッセージ色3 初期値(#FFC0C0) $msgcolor4 = '#CCCCCC'; # メッセージ色4 初期値(#CCCCCC) $sun_color = '#FFAA88'; # 日曜日の色 初期値(#FFAA88) $mon_color = '#DDDDFF'; # 月曜日の色 初期値(#DDDDFF) $tue_color = '#FF7A7A'; # 火曜日の色 初期値(#FF7A7A) $wed_color = '#80DFFF'; # 水曜日の色 初期値(#80DFFF) $thu_color = '#D0B060'; # 木曜日の色 初期値(#D0B060) $fri_color = '#FFFF88'; # 金曜日の色 初期値(#FFFF88) $sat_color = '#A0FFEE'; # 土曜日の色 初期値(#A0FFEE) $bar_color = '#FF0000'; # 棒グラフ色 初期値(#FF0000) $titleface = 'STOP'; # タイトルフォント $bgimage = ''; # 背景画像 # テーブル配色設定 $table_color = '#0066AA'; # テーブル枠 初期値(#0066AA) $table_bgcolor = '#000030'; # タイトル枠背景 初期値(#000030) $table_bgcolor1 = '#000070'; # カウント,日時背景 初期値(#000070) $table_bgcolor2 = '#000060'; # IP背景 初期値(#000060) $table_bgcolor3 = '#000060'; # ホスト名背景 初期値(#000060) $table_bgcolor4 = '#000050'; # UserAgent情報背景 初期値(#000050) $table_bgcolor5 = '#000040'; # 参照ページ背景 初期値(#000040) $table_bgcolor6 = '#000030'; # リンク元背景 初期値(#000030) $table_bgcolor7 = '#000020'; # 解像度背景 初期値(#000020) $table_bgcolor8 = '#000030'; # 統計画面用 初期値(#000030) # 画像棒グラフの色(0=画像使用しない / 1=赤 / 2=青 / 3=水 / 4=緑 / 5=黄 / 6=橙 / 7=紫) $barcolor = 1; # ボタンにスタイルシートを適用(0=NO / 1=YES) $useBtnStyle = 1; $btn_frame = '#0066AA'; # ボタンの枠 初期値(#0066AA) $btn_bgcolor = '#000030'; # ボタン背景 初期値(#000030) $btn_text = '#FFFFFF'; # ボタンのテキスト 初期値(#FFFFFF) #スクロールバーの色設定(0=設定しない / 1=設定する) $useBarStyle = 1; $bar_face = '#000010'; # 表面 初期値(#000010) $bar_shadow = '#333399'; # 影 初期値(#333399) $bar_highlight = '#6666CC'; # ハイライト 初期値(#6666CC) $bar_3dlight = '#E0E0F6'; # 左端・上端 初期値(#E0E0F6) $bar_darkshadow = '#330066'; # 右端・下端 初期値(#330066) $bar_track = '#000000'; # 軌道 初期値(#000000) $bar_arrow = '#CCCCFF'; # 矢印 初期値(#CCCCFF) # フォントサイズ $fontsize = '3'; # テーブルの幅 $table_width = '600'; # 曜日表示 @WDAY_STR = ('日', '月', '火', '水', '木', '金', '土'); # データ取得不可表示 $not_applicable_str = 'N/A'; # 表示文言 $not_applicable_color = '#888888'; # 表示色 # ダウンロード表示文字 $download_str = 'DownLoad'; # 表示文言 $download_color = '#FFAAFF'; # 表示色 # IP連続チェック(0=NO / 1=YES) # → YESの場合、一定時間同一ページの連続したIPアドレスは記録しません。 $ip_chk = 1; # IP連続記録禁止の場合、禁止時間(分) $not_logging_time = 5; # エイリアス( 'URL1==表示名1==変換方式1','URL2==表示名2==変換方式2' の形式で複数指定可能) # → ページに任意の名前を付けられます。 # 変換方式は 0=部分一致 / 1=完全一致 # 省略した場合は完全一致で変換します。 @ALIAS = (''); # 同一ページとして扱うアドレス #('同一扱いの対象URL1==同一扱いの基準URL1', # '同一扱いの対象URL2==同一扱いの基準URL2' の形式で複数指定可能) # → 対象URLは基準URLにアクセスされたものとして扱う。 @SamePage = (''); # 集計除外対象指定( '対象1','対象2' の形式で複数指定可能) # 部分一致:指定した文字列が含まれていれば除外します。 # 完全一致:指定した文字列が完全に一致すれば除外します。 @EXCEPT_ADDR = (''); # IPアドレス(部分一致) @EXCEPT_HOST = (''); # ホスト名 (部分一致) @EXCEPT_REF = (''); # リンク元 (完全一致) @EXCEPT_NAME = (''); # 名前 (完全一致) # 時差(国内サーバは 0) $TimeDifference = 0; # ホスト別デフォルトモード(1=IPアドレス別 / 2=ホスト名別 / 3=ドメイン別) $host_mode = 3; # グラフの表示方法(0=通常の割合で表示 / 1=最多の件数を100%として表示) $graphMethod = 1; # 削除機能の使用(0=OFF / 1=ON) $useDelMode = 1; # 外部Cookie取得ライブラリの指定(訪問者名(Cookie)取得を行う場合) $cookie_lib_file = ''; # メソッドの指定(POST / GET) $method = 'POST'; # ファイルロックの種類(0=flock関数使用 / 1=ロックディレクトリ使用) $file_lock = 0; #------------------------ ロックディレクトリ使用時設定 ------------------------ # ロックディレクトリ名 $lockdir = 'lockdir'; # ファイル書き込み失敗時の設定 $waitTime = 1; # リトライ間隔(秒) $retryMax = 5; # リトライ回数 #------------------------------- 携帯閲覧用設定 ------------------------------- # 携帯で1ページに表示する件数 $k_pageview = 10; # 項目表示/非表示設定(1=表示 / 0=非表示) $k_disp_1 = 0; # カウント $k_disp_2 = 1; # 日付・時刻 $k_disp_3 = 0; # IPアドレス $k_disp_4 = 1; # ホスト名 $k_disp_5 = 0; # エージェント $k_disp_6 = 1; # 参照ページ $k_disp_7 = 1; # リンク元 $k_disp_8 = 1; # 名前(クッキー) # 携帯用配色 $k_color_0 = '#FFFFFF'; # 通常テキスト $k_color_1 = '#FFFFFF'; # カウント $k_color_2 = '#FFFFFF'; # 日付・時刻 $k_color_3 = '#FFFFFF'; # IPアドレス $k_color_4 = '#FFFFFF'; # ホスト名 $k_color_5 = '#FFFFFF'; # エージェント $k_color_6 = '#FFFFFF'; # 参照ページ $k_color_7 = '#FFFFFF'; # リンク元 $k_color_8 = '#50FFFF'; # 名前(クッキー) $k_color_9 = '#00BFFF'; # 区切り線 $k_color_a = '#888888'; # N/A $k_color_b = '#000000'; # 背景 #------------------------------------------------------------------------------ # ↑↑↑ 初期設定ここまで ↑↑↑ #------------------------------------------------------------------------------ if (0) { print "Content-Type: text/html\n\n"; } #------------------------------------------------------------------------------ # DEFINITIONS #------------------------------------------------------------------------------ $MODE_PC = 0; $MODE_KEITAI = 1; $KEY_DATE = 1; $KEY_DATEHOUR = 2; $KEY_HOUR = 3; $KEY_WDAY = 4; $KEY_ADDR = 5; $KEY_HOST = 6; $KEY_DOMAIN = 7; $KEY_AGENT = 8; $KEY_REFERER = 9; $KEY_REFERRER = 10; $KEY_SWH = 11; $KEY_SCD = 12; $KEY_NAME = 13; $MATCH_PTN_PART = "0"; $MATCH_PTN_COMP = "1"; $MATCH_PTN_LIST = "2"; $OPEN_MODE_NORMAL = 0; $OPEN_MODE_CREATE = 1; $ERR_NO_LOG_DATA = 1; $ERR_NO_HIT = 2; $ERR_CPU_HIGH_LOAD = 3; $LIMITER_LV1 = 30000; $LIMITER_LV2 = 1000000; #------------------------------------------------------------------------------ # クエリー取得 #------------------------------------------------------------------------------ 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{'mode'} eq "admin") { &auth; if ($init_mode == 8) { &kensaku; } elsif ($init_mode == 7) { &analyzeReferrer; &createTable($KEY_REFERRER); } elsif ($init_mode == 6) { &analyzeReferer; &createTable($KEY_REFERER); } elsif ($init_mode == 5) { &analyzeAgent; &createTable($KEY_AGENT); } elsif ($init_mode == 4) { &analyzeHost; &createTable($KEY_HOST); } elsif ($init_mode == 3) { &analyzeWday; &createTable($KEY_WDAY); } elsif ($init_mode == 2) { &analyzeHour; &createTable($KEY_HOUR); } elsif ($init_mode == 1) { # 日付別 &analyzeDate; &createTable($KEY_DATE); } else { &loadLog; &log_list; } } elsif ($FORM{'mode'} eq "list_log") { # ログ一覧 &auth; &loadLog; &log_list; } elsif ($FORM{'mode'} eq "list_date") { # 日付別リスト表示 &auth; &analyzeDate; &createTable($KEY_DATE); } elsif ($FORM{'mode'} eq "list_datehour") { # 日付別リスト表示 &auth; &analyzeDateHour; &createTable($KEY_DATEHOUR); } elsif ($FORM{'mode'} eq "list_hour") { # 時間帯別リスト表示 &auth; &analyzeHour; &createTable($KEY_HOUR); } elsif ($FORM{'mode'} eq "list_wday") { # 曜日別リスト表示 &auth; &analyzeWday; &createTable($KEY_WDAY); } elsif ($FORM{'mode'} eq "list_addr") { &auth; &analyzeAddr; &createTable($KEY_ADDR); } elsif ($FORM{'mode'} eq "list_host") { # IPアドレス別リスト表示 &auth; &analyzeHost; &createTable($KEY_HOST); } elsif ($FORM{'mode'} eq "list_domain") { # ドメイン別リスト表示 &auth; &analyzeDomain; &createTable($KEY_DOMAIN); } elsif ($FORM{'mode'} eq "list_agent") { # UserAgent別リスト表示 &auth; &analyzeAgent; &createTable($KEY_AGENT); } elsif ($FORM{'mode'} eq "list_referer") { # 参照ページ別リスト表示 &auth; &analyzeReferer; &createTable($KEY_REFERER); } elsif ($FORM{'mode'} eq "list_referrer") { # リンク元別リスト表示 &auth; &analyzeReferrer; &createTable($KEY_REFERRER); } elsif ($FORM{'mode'} eq "list_swh") { # 解像度別リスト表示 &auth; &analyzeSwh; &createTable($KEY_SWH); } elsif ($FORM{'mode'} eq "list_scd") { # 表示可能色数別リスト表示 &auth; &analyzeScd; &createTable($KEY_SCD); } elsif ($FORM{'mode'} eq "list_name") { # 訪問者名別リスト表示 &auth; &analyzeName; &createTable($KEY_NAME); } elsif ($FORM{'mode'} eq "search_input") { # 検索条件入力 &auth; &loadLog; &search_input; } elsif ($FORM{'mode'} eq "search") { # 検索実行 &auth; &loadLog; &search; @LOGS = @LOG_LIST; $g_list_total = @LOGS; &log_list; } elsif ($FORM{'mode'} eq "delete") { # ログ削除 &auth; &loadLog; &deleteLog; @LOGS = @NEWLOG; $g_total = @LOGS; $g_list_total = $g_total; &log_list; } elsif ($FORM{'mode'} eq "k") { # 携帯用認証実行 &admin_k; exit; } elsif ($FORM{'mode'} eq "bar") { # 棒グラフ &drawBar; } elsif ($FORM{'mode'} eq "dl") { # ダウンロード &saveLog; print "Location: $FORM{'file'}\n\n"; } elsif ($FORM{'mode'} eq "logging") { # ログ記録 &saveLog; # ダミー画像出力 &dummy_img; } else { # ログ記録(SSI) &saveLog; # ダミーテキスト出力 &dummy_txt; } #============================================================================== # 認証実行 #============================================================================== sub auth { if ($FORM{'pass'} ne $pass) { # 認証失敗、パスワード入力画面を表示して終了 &login; exit; } } #============================================================================== # 環境変数取得 #============================================================================== sub get_env { $time = time + ($TimeDifference * 60 * 60); $agent = $ENV{'HTTP_USER_AGENT'}; # UserAgent $addr = $ENV{'REMOTE_ADDR'}; # IPアドレス $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); # ホスト名 if ($host eq "") { $host = $addr; } # 参照ページ・リンク元取得 if ($FORM{'mode'} eq "dl") { # DL MODE時 $referer = $FORM{'file'}; $referrer = $download_str; } elsif ($FORM{'mode'} eq "") { # SSI記録時 $referer = ""; $referrer = $ENV{'HTTP_REFERER'}; } elsif ($FORM{'pg'} ne "") { $referer = $FORM{'pg'}; } else { $referer = $ENV{'HTTP_REFERER'}; } # 画面情報取得 $swh = $FORM{'swh'}; # サイズ $scd = $FORM{'scd'}; # 色数 # 訪問者名(クッキー)取得 $visitor_name = ""; if ($cookie_lib_file ne "") { require $cookie_lib_file; $visitor_name = &pokelog'get_cookie; } # タグ置換処理 $agent =~ s//>/g; $referer =~ s//>/g; $referrer =~ s//>/g; $swh =~ s//>/g; $scd =~ s//>/g; $visitor_name =~ s//>/g; } #============================================================================== # ログ記録 #============================================================================== sub saveLog { my $logging_except = 0; my $flgFileExist = 1; my $line = ""; my $open_mode = $OPEN_MODE_NORMAL; my $logid = 0; # 各種情報取得 &get_env; # 記録除外判定 $logging_except = &isLoggingExcept; # 記録除外フラグが立ってればサブルーチンを抜ける if ($logging_except != 0) { return; } # ログファイル存在チェック if (!-e $logfile) { $flgFileExist = 0; $open_mode = $OPEN_MODE_CREATE; } # 既存のログ取得 &loadLog; # ログの件数カウンタを初期化 $cntNewLog = 0; if ($g_total == 0) { # 新規ログデータの編集 $new_log = "1\t" . $time . "\t" . $addr . "\t" . $host . "\t" . $agent . "\t" . $referer . "\t" . $referrer . "\t" . $swh . "\t" . $scd . "\t" . $visitor_name . "\n"; # 新規ログデータを配列に追加 push(@NEWLOG, $new_log); } else { # 既存ログ分ループ foreach $line(@LOGS) { # 先頭に来る新規ログデータの編集 if ($cntNewLog == 0) { # ログ内容を各変数に格納 (my $tmp_logid, my $tmp_time, my $tmp_addr, my $tmp_host, my $tmp_agent, my $tmp_referer, my $tmp_referrer, my $tmp_swh, my $tmp_scd, my $tmp_cname) = split(/\t/, $line); # 連続IP記録禁止判定 if ($ip_chk == 1) { if (($addr eq $tmp_addr) && ($referer eq $tmp_referer)) { if ($time < ($tmp_time + ($not_logging_time * 60))) { return; } } } # ログ番号のカウントアップ $logid = $tmp_logid + 1; # 新規ログデータの編集 $new_log = $logid . "\t" . $time . "\t" . $addr . "\t" . $host . "\t" . $agent . "\t" . $referer . "\t" . $referrer . "\t" . $swh . "\t" . $scd . "\t" . $visitor_name . "\n"; # 新規ログデータを配列に追加 push(@NEWLOG, $new_log); # ログカウンタをインクリメント $cntNewLog++; } # 最大ログ件数に達した場合ループ終了 if ($cntNewLog == $maxlog) { last; } # 既存ログデータを配列に追加 push(@NEWLOG, $line); # ログカウンタをインクリメント $cntNewLog++; } } if ($logging_except == 0) { # 記録ファイルへ出力 &File_Write($open_mode); } } #============================================================================== # 記録除外判定 #============================================================================== sub isLoggingExcept { my $ret = 0; # IPアドレス除外判定 foreach (@EXCEPT_ADDR) { if ($_) { if ($addr =~ /$_/) { $ret = 1; last; } } } # ホスト名除外判定 foreach (@EXCEPT_HOST) { if ($_) { if ($host =~ /$_/) { $ret = 1; last; } } } # リンク元除外判定 foreach (@EXCEPT_REF) { if ($_) { if ($referrer eq $_) { $ret = 1; last; } } } # 名前除外判定 foreach (@EXCEPT_NAME) { if ($_) { if ($visitor_name eq $_) { $ret = 1; last; } } } return $ret; } #============================================================================== # ログ取得 #============================================================================== sub loadLog { # ログの取得 if ($file_lock == 0) { # flock関数使用 open(IN, "<$logfile"); flock(IN, 1); @LOGS = ; close(IN); } else { # ロックディレクトリ使用 for ($i = 0; $i < $retryMax; $i++) { if (mkdir($lockdir, 0755)) { last; } else { sleep($waitTime); } } open(IN, "<$logfile"); @LOGS = ; close(IN); rmdir($lockdir); } # 現存件数の取得 $g_total = @LOGS; $g_list_total = $g_total; # メニュー欄用表示項目設定 if ($g_total >= 2) { $line = @LOGS[$g_total - 1]; (my $logid, my $time, my $addr, my $host, my $agent, my $referer, my $referrer, my $swh, my $scd, my $visitor_name) = split(/\t/, $line); &getDateTime($time); $g_DayFrom = $date . "(" . $youbi . ") " . $hour . ":" . $min . ":" . $sec; $line = @LOGS[0]; (my $logid, my $time, my $addr, my $host, my $agent, my $referer, my $referrer, my $swh, my $scd, my $visitor_name) = split(/\t/, $line); &getDateTime($time); $g_DayTo = $date . "(" . $youbi . ") " . $hour . ":" . $min . ":" . $sec; } } #============================================================================== # ログ集計(日付別) #============================================================================== sub analyzeDate { $g_average = 0; my $wday_color = $text; my $rate = 0; my $rateForGraph = 0; # ログデータ取得 &loadLog; # ログが存在しない場合、即時リターン if ($g_total == 0) { return; } # 日付別に集計 foreach my $line(@LOGS) { (my $logid, my $time, my $addr, my $host, my $agent, my $referer, my $referrer, my $swh, my $scd, my $visitor_name) = split(/\t/, $line); # 日時フォーマット変換 &getDateTime($time); # 日付ごとのアクセス数をカウント $items{$date}++; $w_day{$date} = $youbi; $w_day_color{$date} = getWdayColor($youbi); } # 最多の件数を100%として表示する場合の準備 if ($graphMethod == 1) { $maxItems = 0; foreach (%items) { if ($items{$_} > $maxItems) { $maxItems = $items{$_}; } } } else { $maxItems = $g_total; } # 集計済データを配列に格納 foreach (sort keys %items) { # 曜日色取得 $wday_color = &getWdayColor($yobi{$_}); $rate = sprintf("%.01f", ($items{$_} / $g_total) * 100); if ($rate eq "0.0") { $rate = 0; } $rateForGraph = sprintf("%.01f", ($items{$_} / $maxItems) * 100); $analyzed_item = $_ . "(" . $w_day{$_} . ")" . "\t" . $items{$_} . "\t" . $rate . "\t" . $rateForGraph . "\t" . $_ . "\t"; push(@ANALYZED_LIST, $analyzed_item); } $g_average = sprintf("%.f", $g_total / keys(%items)); } #============================================================================== # ログ集計(日付時間別) #============================================================================== sub analyzeDateHour { my $wday_color = $text; my $rate = 0; my $rateForGraph = 0; my $flagProc = 0; # ログデータ取得 &loadLog; # ログが存在しない場合、即時リターン if ($g_total == 0) { return; } # ハッシュテーブル初期化 for (my $i = 0; $i <=23; $i++) { if ($i <= 9) { $items{'0' . $i} = 0; } else { $items{$i} = 0; } } # 日付時間別に集計 foreach my $line(@LOGS) { (my $logid, my $time, my $addr, my $host, my $agent, my $referer, my $referrer, my $swh, my $scd, my $visitor_name) = split(/\t/, $line); # 日時フォーマット変換 &getDateTime($time); # 指定日付の場合にカウント if ($date eq $FORM{'srch_date'}) { if ($flagProc == 0) { $srch_condition = $FORM{'srch_date'} . "(" . &getWdayStr($wday) . ")"; $flagProc = 1; } # 日付時間ごとのアクセス数をカウント $items{$hour}++; } } # 最多の件数を100%として表示する場合の準備 if ($graphMethod == 1) { $maxItems = 0; foreach (%items) { if ($items{$_} > $maxItems) { $maxItems = $items{$_}; } } } else { $maxItems = $g_total; } # 集計済データを配列に格納 foreach (sort keys %items) { # 曜日色取得 $wday_color = &getWdayColor($yobi{$_}); $rate = sprintf("%.01f", ($items{$_} / $g_total) * 100); if ($rate eq "0.0") { $rate = 0; } $rateForGraph = sprintf("%.01f", ($items{$_} / $maxItems) * 100); $analyzed_item = $_ . "時台" . $w_day{$_} . "\t" . $items{$_} . "\t" . $rate . "\t" . $rateForGraph . "\t" . $_ . "\t" . $FORM{'srch_date'}; push(@ANALYZED_LIST, $analyzed_item); } } #============================================================================== # ログ集計(時間別) #============================================================================== sub analyzeHour { my $rate = 0; my $rateForGraph = 0; # ログデータ取得 &loadLog; # ログが存在しない場合、即時リターン if ($g_total == 0) { return; } # ハッシュテーブル初期化 for (my $i = 0; $i <=23; $i++) { if ($i <= 9) { $items{'0' . $i} = 0; } else { $items{$i} = 0; } } # 時間別に集計 foreach my $line(@LOGS) { (my $logid, my $time, my $addr, my $host, my $agent, my $referer, my $referrer, my $swh, my $scd, my $visitor_name) = split(/\t/, $line); # 日時フォーマット変換 &getDateTime($time); # 時間ごとのアクセス数をカウント $items{$hour}++; } # 最多の件数を100%として表示する場合の準備 if ($graphMethod == 1) { $maxItems = 0; foreach (%items) { if ($items{$_} > $maxItems) { $maxItems = $items{$_}; } } } else { $maxItems = $g_total; } # 集計済データを配列に格納 foreach (sort keys %items) { $rate = sprintf("%.01f", ($items{$_} / $g_total) * 100); if ($rate eq "0.0") { $rate = 0; } $rateForGraph = sprintf("%.01f", ($items{$_} / $maxItems) * 100); $analyzed_item = $_ . "時台\t" . $items{$_} . "\t" . $rate . "\t" . $rateForGraph . "\t" . $_ . "\t"; push(@ANALYZED_LIST, $analyzed_item); } } #============================================================================== # ログ集計(曜日別) #============================================================================== sub analyzeWday { my $rate = 0; my $rateForGraph = 0; # ログデータ取得 &loadLog; # ログが存在しない場合、即時リターン if ($g_total == 0) { return; } # ハッシュテーブル初期化 for (my $i = 0; $i <=6; $i++) { $items{$i} = 0; } # 曜日別に集計 foreach my $line(@LOGS) { (my $logid, my $time, my $addr, my $host, my $agent, my $referer, my $referrer, my $swh, my $scd, my $visitor_name) = split(/\t/, $line); # 日時フォーマット変換 &getDateTime($time); # 曜日ごとのアクセス数をカウント $items{$wday}++; } # 最多の件数を100%として表示する場合の準備 if ($graphMethod == 1) { $maxItems = 0; foreach (%items) { if ($items{$_} > $maxItems) { $maxItems = $items{$_}; } } } else { $maxItems = $g_total; } # 集計済データを配列に格納 foreach (sort keys %items) { $rate = sprintf("%.01f", ($items{$_} / $g_total) * 100); if ($rate eq "0.0") { $rate = 0; } $rateForGraph = sprintf("%.01f", ($items{$_} / $maxItems) * 100); $analyzed_item = "" . @WDAY_STR[$_] . "\t" . $items{$_} . "\t" . $rate . "\t" . $rateForGraph . "\t" . $_ . "\t"; push(@ANALYZED_LIST, $analyzed_item); } } #============================================================================== # ログ集計(IP ADDRESS別) #============================================================================== sub analyzeAddr { my $rate = 0; my $rateForGraph = 0; # ログデータ取得 &loadLog; # ログが存在しない場合、即時リターン if ($g_total == 0) { return; } # IP ADDRESS別に集計 foreach my $line(@LOGS) { (my $logid, my $time, my $addr, my $host, my $agent, my $referer, my $referrer, my $swh, my $scd, my $visitor_name) = split(/\t/, $line); # IP ADDRESSごとのアクセス数をカウント $items{$addr}++; } # 最多の件数を100%として表示する場合の準備 if ($graphMethod == 1) { $maxItems = 0; foreach (%items) { if ($items{$_} > $maxItems) { $maxItems = $items{$_}; } } } else { $maxItems = $g_total; } # 集計済データを配列に格納 @SORTED_ITEMS = sort sort_items keys(%items); foreach (@SORTED_ITEMS) { $rate = sprintf("%.01f", ($items{$_} / $g_total) * 100); if ($rate eq "0.0") { $rate = 0; } $rateForGraph = sprintf("%.01f", ($items{$_} / $maxItems) * 100); $analyzed_item = $_ . "\t" . $items{$_} . "\t" . $rate . "\t" . $rateForGraph . "\t" . $_ . "\t"; push(@ANALYZED_LIST, $analyzed_item); } } #============================================================================== # ログ集計(ホスト名別) #============================================================================== sub analyzeHost { my $rate = 0; my $rateForGraph = 0; # ログデータ取得 &loadLog; # ログが存在しない場合、即時リターン if ($g_total == 0) { return; } # ホスト名に集計 foreach my $line(@LOGS) { (my $logid, my $time, my $addr, my $host, my $agent, my $referer, my $referrer, my $swh, my $scd, my $visitor_name) = split(/\t/, $line); # ホスト名ごとのアクセス数をカウント $items{$host}++; } # 最多の件数を100%として表示する場合の準備 if ($graphMethod == 1) { $maxItems = 0; foreach (%items) { if ($items{$_} > $maxItems) { $maxItems = $items{$_}; } } } else { $maxItems = $g_total; } # 集計済データを配列に格納 @SORTED_ITEMS = sort sort_items keys(%items); foreach (@SORTED_ITEMS) { $rate = sprintf("%.01f", ($items{$_} / $g_total) * 100); if ($rate eq "0.0") { $rate = 0; } $rateForGraph = sprintf("%.01f", ($items{$_} / $maxItems) * 100); $analyzed_item = $_ . "\t" . $items{$_} . "\t" . $rate . "\t" . $rateForGraph . "\t" . $_ . "\t"; push(@ANALYZED_LIST, $analyzed_item); } } #============================================================================== # ログ集計(ドメイン名別) #============================================================================== sub analyzeDomain { my $rate = 0; my $rateForGraph = 0; my $domein = ""; my $srch_key = ""; # ログデータ取得 &loadLog; # ログが存在しない場合、即時リターン if ($g_total == 0) { return; } # ドメイン名別に集計 foreach my $line(@LOGS) { (my $logid, my $time, my $addr, my $host, my $agent, my $referer, my $referrer, my $swh, my $scd, my $visitor_name) = split(/\t/, $line); # ホスト名をドメイン名に変換 if ($host =~ /(.*)\.(\D+)$/) { if ($host =~ /(.*)\.(.*)\.(.*)\.(.*)$/) { $domain = "\*\." . $2 . "\." . $3 . "\." . $4; } elsif ($host =~ /(.*)\.(.*)\.(.*)$/) { $domain = "\*\." . $2 . "\." . $3; } else { $domain = $host; } } else { $domain = $host; } # ドメイン名ごとのアクセス数をカウント $items{$domain}++; } # 最多の件数を100%として表示する場合の準備 if ($graphMethod == 1) { $maxItems = 0; foreach (%items) { if ($items{$_} > $maxItems) { $maxItems = $items{$_}; } } } else { $maxItems = $g_total; } # 集計済データを配列に格納 @SORTED_ITEMS = sort sort_items keys(%items); foreach (@SORTED_ITEMS) { $rate = sprintf("%.01f", ($items{$_} / $g_total) * 100); if ($rate eq "0.0") { $rate = 0; } $rateForGraph = sprintf("%.01f", ($items{$_} / $maxItems) * 100); $srch_key = $_; $srch_key =~ s/\*.//; $analyzed_item = $_ . "\t" . $items{$_} . "\t" . $rate . "\t" . $rateForGraph . "\t" . $srch_key . "\t"; push(@ANALYZED_LIST, $analyzed_item); } } #============================================================================== # ログ集計(UserAgent別) #============================================================================== sub analyzeAgent { my $rate = 0; my $rateForGraph = 0; # ログデータ取得 &loadLog; # ログが存在しない場合、即時リターン if ($g_total == 0) { return; } # エージェント別に集計 foreach my $line(@LOGS) { (my $logid, my $time, my $addr, my $host, my $agent, my $referer, my $referrer, my $swh, my $scd, my $visitor_name) = split(/\t/, $line); # エージェントごとのアクセス数をカウント $items{$agent}++; } # 最多の件数を100%として表示する場合の準備 if ($graphMethod == 1) { $maxItems = 0; foreach (%items) { if ($items{$_} > $maxItems) { $maxItems = $items{$_}; } } } else { $maxItems = $g_total; } # 集計済データを配列に格納 @SORTED_ITEMS = sort sort_items keys(%items); foreach (@SORTED_ITEMS) { $rate = sprintf("%.01f", ($items{$_} / $g_total) * 100); if ($rate eq "0.0") { $rate = 0; } $rateForGraph = sprintf("%.01f", ($items{$_} / $maxItems) * 100); $analyzed_item = $_ . "\t" . $items{$_} . "\t" . $rate . "\t" . $rateForGraph . "\t" . $_ . "\t"; push(@ANALYZED_LIST, $analyzed_item); } } #============================================================================== # ログ集計(参照ページ別) #============================================================================== sub analyzeReferer { my $rate = 0; my $rateForGraph = 0; my $item = ""; my $srch_key = ""; my $analyzed_item_na = ""; # ログデータ取得 &loadLog; # ログが存在しない場合、即時リターン if ($g_total == 0) { return; } # 参照ページ別に集計 foreach my $line(@LOGS) { (my $logid, my $time, my $addr, my $host, my $agent, my $referer, my $referrer, my $swh, my $scd, my $visitor_name) = split(/\t/, $line); # 同一ページ扱い処理 $referer_pg = $referer; foreach $same_url(@SamePage) { (my $same_url1, my $same_url2) = split(/==/, $same_url); if ($referer eq $same_url1) { $referer_pg = $same_url2; } } # 参照ページごとのアクセス数をカウント $items{$referer_pg}++; } # 最多の件数を100%として表示する場合の準備 if ($graphMethod == 1) { $maxItems = 0; foreach (%items) { if ($items{$_} > $maxItems) { $maxItems = $items{$_}; } } } else { $maxItems = $g_total; } # 集計済データを配列に格納 @SORTED_ITEMS = sort sort_items keys(%items); foreach (@SORTED_ITEMS) { $rate = sprintf("%.01f", ($items{$_} / $g_total) * 100); if ($rate eq "0.0") { $rate = 0; } $rateForGraph = sprintf("%.01f", ($items{$_} / $maxItems) * 100); if ($_ ne "") { $item = "" . &convURLtoAlias($_) . ""; $srch_key = $_; $analyzed_item = $item . "\t" . $items{$_} . "\t" . $rate . "\t" . $rateForGraph . "\t" . $srch_key . "\t"; push(@ANALYZED_LIST, $analyzed_item); } else { $item = "" . $not_applicable_str . ""; $srch_key = $not_applicable_str; $analyzed_item_na = $item . "\t" . $items{$_} . "\t" . $rate . "\t" . $rateForGraph . "\t" . $srch_key . "\t"; } } # 最後にN/Aのデータを配列に格納 if ($analyzed_item_na ne "") { push(@ANALYZED_LIST, $analyzed_item_na); } } #============================================================================== # ログ集計(リンク元別) #============================================================================== sub analyzeReferrer { my $rate = 0; my $rateForGraph = 0; my $item = ""; my $srch_key = ""; my $analyzed_item_na = ""; my $aliased_url = ""; # ログデータ取得 &loadLog; # ログが存在しない場合、即時リターン if ($g_total == 0) { return; } # リンク元別に集計 foreach my $line(@LOGS) { (my $logid, my $time, my $addr, my $host, my $agent, my $referer, my $referrer, my $swh, my $scd, my $visitor_name) = split(/\t/, $line); # 同一ページ扱い処理 $referrer_pg = $referrer; foreach $same_url(@SamePage) { (my $same_url1, my $same_url2) = split(/==/, $same_url); if ($referrer eq $same_url1) { $referrer_pg = $same_url2; } } # リンク元ごとのアクセス数をカウント $items{$referrer_pg}++; } # 最多の件数を100%として表示する場合の準備 if ($graphMethod == 1) { $maxItems = 0; foreach (%items) { if ($items{$_} > $maxItems) { $maxItems = $items{$_}; } } } else { $maxItems = $g_total; } # 集計済データを配列に格納 @SORTED_ITEMS = sort sort_items keys(%items); foreach (@SORTED_ITEMS) { $rate = sprintf("%.01f", ($items{$_} / $g_total) * 100); if ($rate eq "0.0") { $rate = 0; } $rateForGraph = sprintf("%.01f", ($items{$_} / $maxItems) * 100); if ($_ ne "") { $aliased_url = &convURLtoAlias($_); if ($_ eq $download_str) { $item = &getDisp_Str($aliased_url); } else { if ($aliased_url =~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}|) { $item = "" . $aliased_url . "
(クエリーがUTF-8でエンコードされています。)"; } elsif ($aliased_url =~ m/%u[0-9a-fA-F]{3,4}/) { $item = "" . $aliased_url . "
(クエリーがUTF-16でエンコードされています。)"; } else { $item = "" . $aliased_url . ""; } } $srch_key = $_; $analyzed_item = $item . "\t" . $items{$_} . "\t" . $rate . "\t" . $rateForGraph . "\t" . $srch_key . "\t"; push(@ANALYZED_LIST, $analyzed_item); } else { $item = "" . $not_applicable_str . ""; $srch_key = $not_applicable_str; $analyzed_item_na = $item . "\t" . $items{$_} . "\t" . $rate . "\t" . $rateForGraph . "\t" . $srch_key . "\t"; } } # 最後にN/Aのデータを配列に格納 if ($analyzed_item_na ne "") { push(@ANALYZED_LIST, $analyzed_item_na); } } #============================================================================== # ログ集計(解像度別) #============================================================================== sub analyzeSwh { my $rate = 0; my $rateForGraph = 0; my $item = ""; my $srch_key = ""; my $analyzed_item_na = ""; # ログデータ取得 &loadLog; # ログが存在しない場合、即時リターン if ($g_total == 0) { return; } # 解像度別に集計 foreach my $line(@LOGS) { (my $logid, my $time, my $addr, my $host, my $agent, my $referer, my $referrer, my $swh, my $scd, my $visitor_name) = split(/\t/, $line); # 解像度ごとのアクセス数をカウント $items{$swh}++; } # 最多の件数を100%として表示する場合の準備 if ($graphMethod == 1) { $maxItems = 0; foreach (%items) { if ($items{$_} > $maxItems) { $maxItems = $items{$_}; } } } else { $maxItems = $g_total; } # 集計済データを配列に格納 @SORTED_ITEMS = sort sort_items keys(%items); foreach (@SORTED_ITEMS) { $rate = sprintf("%.01f", ($items{$_} / $g_total) * 100); if ($rate eq "0.0") { $rate = 0; } $rateForGraph = sprintf("%.01f", ($items{$_} / $maxItems) * 100); if ($_ ne "") { $item = $_; $srch_key = $_; $analyzed_item = $item . "\t" . $items{$_} . "\t" . $rate . "\t" . $rateForGraph . "\t" . $srch_key . "\t"; push(@ANALYZED_LIST, $analyzed_item); } else { $item = "" . $not_applicable_str . ""; $srch_key = $not_applicable_str; $analyzed_item_na = $item . "\t" . $items{$_} . "\t" . $rate . "\t" . $rateForGraph . "\t" . $srch_key . "\t"; } } # 最後にN/Aのデータを配列に格納 if ($analyzed_item_na ne "") { push(@ANALYZED_LIST, $analyzed_item_na); } } #============================================================================== # ログ集計(表示可能色数別) #============================================================================== sub analyzeScd { my $rate = 0; my $rateForGraph = 0; my $item = ""; my $srch_key = ""; my $analyzed_item_na = ""; # ログデータ取得 &loadLog; # ログが存在しない場合、即時リターン if ($g_total == 0) { return; } # 表示可能色数別に集計 foreach my $line(@LOGS) { (my $logid, my $time, my $addr, my $host, my $agent, my $referer, my $referrer, my $swh, my $scd, my $visitor_name) = split(/\t/, $line); # 表示可能色数ごとのアクセス数をカウント $items{$scd}++; } # 最多の件数を100%として表示する場合の準備 if ($graphMethod == 1) { $maxItems = 0; foreach (%items) { if ($items{$_} > $maxItems) { $maxItems = $items{$_}; } } } else { $maxItems = $g_total; } # 集計済データを配列に格納 @SORTED_ITEMS = sort sort_items keys(%items); foreach (@SORTED_ITEMS) { $rate = sprintf("%.01f", ($items{$_} / $g_total) * 100); if ($rate eq "0.0") { $rate = 0; } $rateForGraph = sprintf("%.01f", ($items{$_} / $maxItems) * 100); if ($_ ne "") { $item = &getScdStr($_); $srch_key = $_; $analyzed_item = $item . "\t" . $items{$_} . "\t" . $rate . "\t" . $rateForGraph . "\t" . $srch_key . "\t"; push(@ANALYZED_LIST, $analyzed_item); } else { $item = "" . $not_applicable_str . ""; $srch_key = $not_applicable_str; $analyzed_item_na = $item . "\t" . $items{$_} . "\t" . $rate . "\t" . $rateForGraph . "\t" . $srch_key . "\t"; } } # 最後にN/Aのデータを配列に格納 if ($analyzed_item_na ne "") { push(@ANALYZED_LIST, $analyzed_item_na); } } #============================================================================== # ログ集計(訪問者名別) #============================================================================== sub analyzeName { my $rate = 0; my $rateForGraph = 0; my $item = ""; my $srch_key = ""; my $analyzed_item_na = ""; # ログデータ取得 &loadLog; # ログが存在しない場合、即時リターン if ($g_total == 0) { return; } # 訪問者名別に集計 foreach my $line(@LOGS) { # 行データから改行コード削除 $line =~ s/\r|\n//g; (my $logid, my $time, my $addr, my $host, my $agent, my $referer, my $referrer, my $swh, my $scd, my $visitor_name) = split(/\t/, $line); # 訪問者名ごとのアクセス数をカウント $items{$visitor_name}++; } # 最多の件数を100%として表示する場合の準備 if ($graphMethod == 1) { $maxItems = 0; foreach (%items) { if ($items{$_} > $maxItems) { $maxItems = $items{$_}; } } } else { $maxItems = $g_total; } # 集計済データを配列に格納 @SORTED_ITEMS = sort sort_items keys(%items); foreach (@SORTED_ITEMS) { $rate = sprintf("%.01f", ($items{$_} / $g_total) * 100); if ($rate eq "0.0") { $rate = 0; } $rateForGraph = sprintf("%.01f", ($items{$_} / $maxItems) * 100); if ($_ ne "") { $item = $_; $srch_key = $_; $analyzed_item = $item . "\t" . $items{$_} . "\t" . $rate . "\t" . $rateForGraph . "\t" . $srch_key . "\t"; push(@ANALYZED_LIST, $analyzed_item); } else { $item = "" . $not_applicable_str . ""; $srch_key = $not_applicable_str; $analyzed_item_na = $item . "\t" . $items{$_} . "\t" . $rate . "\t" . $rateForGraph . "\t" . $srch_key . "\t"; } } # 最後にN/Aのデータを配列に格納 if ($analyzed_item_na ne "") { push(@ANALYZED_LIST, $analyzed_item_na); } } #============================================================================== # 件数降順ソート #============================================================================== sub sort_items { if ($items{$b} != $items{$a}) { $items{$b} <=> $items{$a}; } else { $a cmp $b; } } #============================================================================== # HTMLヘッダ出力 #============================================================================== sub printHtmlHeader { print "Content-type: text/html\n\n"; print "\n"; print "\n"; print "" . $title . "\n"; print "\n"; print "\n"; print "\n"; print "\n"; if (($FORM{'mode'} eq "admin") && ($FORM{'pass'} ne $pass)) { print "\n"; } else { print "\n"; } print "
\n"; if ($FORM{'pass'} eq $pass) { print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; } } #============================================================================== # HTMLフッタ出力 #============================================================================== sub printHtmlFooter { print "\n"; print "\n"; print "\n"; } #============================================================================== # パスワード入力画面 #============================================================================== sub login { &printHtmlHeader; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "" . $title . "

\n"; print "パスワードを入力してください。
\n"; print "

\n"; print "\n"; print "\n"; print "
\n"; print "

\n"; print "ぽけろぐ。 Ver" . $ver . " Copyright (C) 2001-2006 た。 All Rights Reserved.\n"; print "

\n"; print "
\n"; print "
\n"; &printHtmlFooter; } #============================================================================== # メニュー項目表示 #============================================================================== sub printMenu { print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "" . $title . "\n"; print "
\n"; print "総件数:" . $g_total . " / 最大件数:" . $maxlog . "
\n"; # 2件以上ある場合、ログの保存期間を表示 if ($g_total >= 2) { print "" . $g_DayFrom . " 〜 " . $g_DayTo . "
"; } print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; if ($cookie_lib_file ne "") { print "\n"; print "\n"; } print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; if ($host_mode == 2) { print "\n"; } elsif ($host_mode == 3) { print "\n"; } else { print "\n"; } print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
ぽけろぐ。 Ver" . $ver . " by た。
\n"; print "
\n"; print "
\n"; print "
\n"; } #============================================================================== # ログ一覧 #============================================================================== sub log_list { my $totalpage = 0; my $i = 0; my $j = 0; my $decoded_line = ""; my $local_time = ""; my $logid = ""; my $time = ""; my $local_time = ""; my $addr = ""; my $host = ""; my $agent = ""; my $referer = ""; my $referrer = ""; my $swh = ""; my $scd = ""; my $visitor_name = ""; &printHtmlHeader; &printMenu; # ローカル変数初期化 my $youbi_color = $text; my $hidden_common_param = "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . ""; # 個別リスト表示用データ編集 if ($FORM{'mode'} eq "search") { $message = "
" . $g_serch_condition . "
該当:$g_list_total
"; # $message = "" . $g_serch_condition . "
該当:$g_list_total"; } # ページ指定が無い場合は1ページ目を設定 if ($FORM{'page'} eq "") { $FORM{'page'} = 1; } # 表示開始件数を計算 $i = ($FORM{'page'} - 1) * $pageview; # 総ページ数を計算 $totalpage = 0; $j = $g_list_total; while ($j > 0) { $totalpage++; $j = $j - $pageview; } if (($message ne "") || ($g_list_total != 0)) { print "\n"; if ($message ne "") { print "\n"; print "\n"; print "\n"; } print "\n"; print "\n"; print "\n"; print "
\n"; print "" . $message . "\n"; print "
\n"; if ($g_list_total != 0) { print "" . $pageview . "件ずつ表\示します。Page " . $FORM{'page'} . "/" . $totalpage . "\n"; } print "
\n"; } if ($g_list_total == 0) { if ($FORM{'mode'} eq "search") { &error($ERR_NO_HIT); } else { &error($ERR_NO_LOG_DATA); } } # 1ページ分をループして表示 foreach $line(@LOGS[$i .. ($i + $pageview - 1)]) { if ($FORM{'mode'} eq "search") { # 検索結果表示の場合 ($logid, $date, $local_time, $addr, $host, $agent, $referer, $referrer, $swh, $scd, $visitor_name) = split(/\t/, $line); } else { # ログ一覧表示の場合 ($logid, $time, $addr, $host, $agent, $referer, $referrer, $swh, $scd, $visitor_name) = split(/\t/, $line); # 日時フォーマット変換 &getDateTime($time); # 表示フォーマット整形 $date = $date . "(" . $youbi . ")"; $local_time = $hour . "時" . $min . "分" . $sec . "秒"; $referer = &getDisp_Str(&convURLtoAlias($referer), $MODE_PC); $referrer = &getDisp_Str(&convURLtoAlias($referrer), $MODE_PC); $swh = &getDisp_Str($swh, $MODE_PC); $scd = &getScdStr(&getDisp_Str($scd, $MODE_PC)); } # ログ表示 print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "[" . $logid . "]\n"; print "" . $date . " " . $local_time . " \n"; print "" . $visitor_name . "\n"; print "
\n"; print "" . $addr . "\n"; print "\n"; print "" . $host . "\n"; print "
\n"; print "" . $agent . "\n"; print "
\n"; print "
Page:" . $referer . "
\n"; print "
\n"; print "
From:" . $referrer . "
\n"; print "
\n"; print "解像度:" . $swh . "\n"; print "\n"; print "表\示可能\色数:" . $scd . "\n"; print "
\n"; print "

\n\n"; $i++; if ($i == $g_list_total) { last; } } print "\n"; # 前のページ if ($FORM{'page'} != 1) { my $pg_back = $FORM{'page'} - 1; print "\n"; print "\n"; } # 次のページ if ($i != $g_list_total) { my $pg_fwd = $FORM{'page'} + 1; print "\n"; } print "
\n"; print "
\n"; print "\n"; print $hidden_common_param; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print $hidden_common_param; print "\n"; print "\n"; print "
\n"; # 直接移動ボタン if ($totalpage >= 3) { $pg_no = 0; print "\n"; print "\n"; for($pg_no=1; $pg_no <= $totalpage; $pg_no++) { print "\n"; if (($pg_no % 15 == 0) && ($pg_no != 0)) { print "\n"; } } print "
[直接移動]\n"; print "
\n"; print "\n"; print $hidden_common_param; print "\n"; print "\n"; print "
 
\n"; } # 削除欄 if ($useDelMode == 1) { print "
\n"; print "

\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "削除するログ番号をスペースで区切って記述。
連番削除は 開始番号-終了番号 の形式で記述。
\n"; print "
\n"; } print "
\n"; print "
\n"; &printHtmlFooter; } #============================================================================== # 統計表示テーブル作成 #============================================================================== sub createTable { my $table_type = $_[0]; my $item_name = ""; my $item_align = "left"; my $match_ptn = $MATCH_PTN_LIST; # 項目名設定 if ($table_type eq $KEY_DATE) { $item_name = "日 付"; $item_align = "center"; $srch_item = "srch_date"; } elsif ($table_type eq $KEY_DATEHOUR) { $item_name = "時間"; $item_align = "center"; $srch_item = "srch_hour"; $srch_item2 = "srch_date"; } elsif ($table_type eq $KEY_HOUR) { $item_name = "時間"; $item_align = "center"; $srch_item = "srch_hour"; } elsif ($table_type eq $KEY_WDAY) { $item_name = "曜日"; $item_align = "center"; $srch_item = "srch_wday"; } elsif ($table_type eq $KEY_ADDR) { $item_name = "IPアドレス"; $item_align = "left"; $srch_item = "srch_addr"; } elsif ($table_type eq $KEY_HOST) { $item_name = "ホスト名"; $item_align = "left"; $srch_item = "srch_host"; } elsif ($table_type eq $KEY_DOMAIN) { $item_name = "ドメイン名"; $item_align = "left"; $srch_item = "srch_host"; $match_ptn = $MATCH_PTN_PART; } elsif ($table_type eq $KEY_AGENT) { $item_name = "エージェント"; $item_align = "left"; $srch_item = "srch_agent"; } elsif ($table_type eq $KEY_REFERER) { $item_name = "参照ページ"; $item_align = "left"; $srch_item = "srch_referer"; } elsif ($table_type eq $KEY_REFERRER) { $item_name = "リンク元"; $item_align = "left"; $srch_item = "srch_referrer"; } elsif ($table_type eq $KEY_SWH) { $item_name = "解像度"; $item_align = "left"; $srch_item = "srch_swh"; } elsif ($table_type eq $KEY_SCD) { $item_name = "表\示可能\色数"; $item_align = "left"; $srch_item = "srch_scd"; } elsif ($table_type eq $KEY_NAME) { $item_name = "名前"; $item_align = "left"; $srch_item = "srch_name"; } &printHtmlHeader; &printMenu; # ログが存在しない場合メッセージを表示して終了 if ($g_total == 0) { &error($ERR_NO_LOG_DATA); } print "
\n"; print "\n"; # 日付時間一覧表示時の日付表示 if ($table_type == $KEY_DATEHOUR) { print "\n"; } # ホスト一覧表示時のモード選択 if (($table_type == $KEY_ADDR) || ($table_type == $KEY_HOST) || ($table_type == $KEY_DOMAIN)) { print "\n"; } print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; # 日付別リストの場合、時間帯ボタンを作成 if ($table_type eq $KEY_DATE) { print "\n"; } print "\n"; foreach my $line(@ANALYZED_LIST) { # 行データ分解 (my $item, my $num_of_case, my $rate, my $rateForGraph, my $srch_key, my $srch_key2) = split(/\t/, $line); # N/A表示変換 if ($item eq "") { $item = "" . $not_applicable_str . ""; } print "\n"; print "\n"; print "\n"; print "\n"; if ($barcolor eq "0") { print "\n"; } else { print "\n"; } print "\n"; # 日付別リストの場合、時間帯ボタンを作成 if ($table_type eq $KEY_DATE) { print "\n"; } print "\n"; } print "
\n"; print "\n"; print "\n"; print "
" . $srch_condition . "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
表\示モード:
\n"; print "\n"; print "\n"; print "
\n"; print "
" . $item_name . "件数割合グラフ(%)List時間帯
" . $item . "
" . $num_of_case . "" . $rate . "%\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print " \n"; print "
\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; # 検索条件2がある場合、追加 if ($srch_item2 ne "") { print "\n"; } print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
"; if ($table_type eq $KEY_DATE) { print "
平均:" . $g_average . "access / day
"; } print "
\n"; &printHtmlFooter; } #============================================================================== # 検索入力画面 #============================================================================== sub search_input { &printHtmlHeader; &printMenu; my $search_input_size = "95"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; if ($cookie_lib_file ne "") { print "\n"; print "\n"; print "\n"; print "\n"; } print "\n"; print "\n"; print "\n"; print "\n"; print "
項 目検索キーワード
\n"; print "ログ番号\n"; print "\n"; print "\n"; print "
\n"; print "日付\n"; print "\n"; print "\n"; print "
\n"; print "時間帯\n"; print "\n"; print "\n"; print "
\n"; print "曜日\n"; print "\n"; print "\n"; print "
\n"; print "IPアドレス\n"; print "\n"; print "\n"; print "
\n"; print "ホスト名\n"; print "\n"; print "\n"; print "
\n"; print "エージェント\n"; print "\n"; print "\n"; print "
\n"; print "参照ページ\n"; print "\n"; print "\n"; print "
\n"; print "リンク元\n"; print "\n"; print "\n"; print "
\n"; print "解像度\n"; print "\n"; print "\n"; print "
\n"; print "表\示可能\色数\n"; print "\n"; print "\n"; print "
\n"; print "名前\n"; print "\n"; print "\n"; print "
\n"; print "部分一致\n"; print "完全一致 \n"; print "\n"; print "
\n"; print "
\n"; print "\n"; &printHtmlFooter; } #============================================================================== # 検索実行 #============================================================================== sub search { $g_serch_condition = "【検索条件】"; @LOG_LIST = (); my $decoded_line = ""; my %SRCH_KEY; $SRCH_KEY{'logid'} = $FORM{'srch_logid'}; $SRCH_KEY{'date'} = $FORM{'srch_date'}; $SRCH_KEY{'hour'} = $FORM{'srch_hour'}; $SRCH_KEY{'wday'} = $FORM{'srch_wday'}; $SRCH_KEY{'addr'} = $FORM{'srch_addr'}; $SRCH_KEY{'host'} = $FORM{'srch_host'}; $SRCH_KEY{'agent'} = $FORM{'srch_agent'}; $SRCH_KEY{'referer'} = $FORM{'srch_referer'}; $SRCH_KEY{'referrer'} = $FORM{'srch_referrer'}; $SRCH_KEY{'swh'} = $FORM{'srch_swh'}; $SRCH_KEY{'scd'} = $FORM{'srch_scd'}; $SRCH_KEY{'name'} = $FORM{'srch_name'}; my $flagSearchHit = 0; my %SRCH_HIT; $SRCH_HIT{'logid'} = 0; $SRCH_HIT{'date'} = 0; $SRCH_HIT{'hour'} = 0; $SRCH_HIT{'wday'} = 0; $SRCH_HIT{'addr'} = 0; $SRCH_HIT{'host'} = 0; $SRCH_HIT{'agent'} = 0; $SRCH_HIT{'referer'} = 0; $SRCH_HIT{'referrer'} = 0; $SRCH_HIT{'swh'} = 0; $SRCH_HIT{'scd'} = 0; $SRCH_HIT{'name'} = 0; # 検索条件の表示設定 if (($FORM{'srch_logid'} eq "") && ($FORM{'srch_date'} eq "") && ($FORM{'srch_hour'} eq "") && ($FORM{'srch_wday'} eq "") && ($FORM{'srch_addr'} eq "") && ($FORM{'srch_host'} eq "") && ($FORM{'srch_agent'} eq "") && ($FORM{'srch_referer'} eq "") && ($FORM{'srch_referrer'} eq "") && ($FORM{'srch_swh'} eq "") && ($FORM{'srch_scd'} eq "") && ($FORM{'srch_name'} eq "")) { $g_serch_condition = $g_serch_condition . "
指定なし"; return; } else { if ($FORM{'srch_logid'} ne "") { $g_serch_condition = $g_serch_condition . "
ログ番号:" . $FORM{'srch_logid'} . ""; } if ($FORM{'srch_date'} ne "") { $g_serch_condition = $g_serch_condition . "
日付:" . $FORM{'srch_date'} . ""; } if ($FORM{'srch_hour'} ne "") { $g_serch_condition = $g_serch_condition . "
時間帯:" . $FORM{'srch_hour'} . "時台"; if (($FORM{'srch_hour'} < 0) || ($FORM{'srch_hour'} > 23) || ($FORM{'srch_hour'} =~ /^[^0-9]+$/)) { $g_serch_condition = $g_serch_condition . "!?"; } } if ($FORM{'srch_wday'} ne "") { $g_serch_condition = $g_serch_condition . "
曜日:" . &getWdayStr($FORM{'srch_wday'}) . ""; } if ($FORM{'srch_addr'} ne "") { $g_serch_condition = $g_serch_condition . "
IPアドレス:" . $FORM{'srch_addr'} . ""; } if ($FORM{'srch_host'} ne "") { $g_serch_condition = $g_serch_condition . "
ホスト名:" . $FORM{'srch_host'} . ""; } if ($FORM{'srch_agent'} ne "") { $g_serch_condition = $g_serch_condition . "
エージェント:" . $FORM{'srch_agent'} . ""; } if ($FORM{'srch_referer'} ne "") { $g_serch_condition = $g_serch_condition . "
参照ページ:" . $FORM{'srch_referer'} . ""; } if ($FORM{'srch_referrer'} ne "") { $g_serch_condition = $g_serch_condition . "
リンク元:" . $FORM{'srch_referrer'} . ""; } if ($FORM{'srch_swh'} ne "") { $g_serch_condition = $g_serch_condition . "
解像度:" . $FORM{'srch_swh'} . ""; } if ($FORM{'srch_scd'} ne "") { if ($FORM{'match_ptn'} eq $MATCH_PTN_LIST) { $g_serch_condition = $g_serch_condition . "
表\示可能\色数:" . &getScdStr($FORM{'srch_scd'}) . ""; } else { $g_serch_condition = $g_serch_condition . "
表\示可能\色数:" . $FORM{'srch_scd'} . ""; } } if ($FORM{'srch_name'} ne "") { $g_serch_condition = $g_serch_condition . "
訪問者名:" . $FORM{'srch_name'} . ""; } if ($FORM{'match_ptn'} eq $MATCH_PTN_PART) { $g_serch_condition = $g_serch_condition . "
一致指定:部分一致"; } elsif ($FORM{'match_ptn'} eq $MATCH_PTN_COMP) { $g_serch_condition = $g_serch_condition . "
一致指定:完全一致"; } } # 特殊文字エスケープ対応 $SRCH_KEY{'logid'} =~ s/\(/\\(/g; $SRCH_KEY{'logid'} =~ s/\)/\\)/g; $SRCH_KEY{'logid'} =~ s/\[/\\[/g; $SRCH_KEY{'logid'} =~ s/\]/\\]/g; $SRCH_KEY{'date'} =~ s/\(/\\(/g; $SRCH_KEY{'date'} =~ s/\)/\\)/g; $SRCH_KEY{'date'} =~ s/\[/\\[/g; $SRCH_KEY{'date'} =~ s/\]/\\]/g; $SRCH_KEY{'hour'} =~ s/\(/\\(/g; $SRCH_KEY{'hour'} =~ s/\)/\\)/g; $SRCH_KEY{'hour'} =~ s/\[/\\[/g; $SRCH_KEY{'hour'} =~ s/\]/\\]/g; $SRCH_KEY{'wday'} =~ s/\(/\\(/g; $SRCH_KEY{'wday'} =~ s/\)/\\)/g; $SRCH_KEY{'wday'} =~ s/\[/\\[/g; $SRCH_KEY{'wday'} =~ s/\]/\\]/g; $SRCH_KEY{'addr'} =~ s/\(/\\(/g; $SRCH_KEY{'addr'} =~ s/\)/\\)/g; $SRCH_KEY{'addr'} =~ s/\[/\\[/g; $SRCH_KEY{'addr'} =~ s/\]/\\]/g; $SRCH_KEY{'host'} =~ s/\(/\\(/g; $SRCH_KEY{'host'} =~ s/\)/\\)/g; $SRCH_KEY{'host'} =~ s/\[/\\[/g; $SRCH_KEY{'host'} =~ s/\]/\\]/g; $SRCH_KEY{'agent'} =~ s/\(/\\(/g; $SRCH_KEY{'agent'} =~ s/\)/\\)/g; $SRCH_KEY{'agent'} =~ s/\[/\\[/g; $SRCH_KEY{'agent'} =~ s/\]/\\]/g; $SRCH_KEY{'referer'} =~ s/\(/\\(/g; $SRCH_KEY{'referer'} =~ s/\)/\\)/g; $SRCH_KEY{'referer'} =~ s/\[/\\[/g; $SRCH_KEY{'referer'} =~ s/\]/\\]/g; $SRCH_KEY{'referrer'} =~ s/\(/\\(/g; $SRCH_KEY{'referrer'} =~ s/\)/\\)/g; $SRCH_KEY{'referrer'} =~ s/\[/\\[/g; $SRCH_KEY{'referrer'} =~ s/\]/\\]/g; $SRCH_KEY{'swh'} =~ s/\(/\\(/g; $SRCH_KEY{'swh'} =~ s/\)/\\)/g; $SRCH_KEY{'swh'} =~ s/\[/\\[/g; $SRCH_KEY{'swh'} =~ s/\]/\\]/g; $SRCH_KEY{'scd'} =~ s/\(/\\(/g; $SRCH_KEY{'scd'} =~ s/\)/\\)/g; $SRCH_KEY{'scd'} =~ s/\[/\\[/g; $SRCH_KEY{'scd'} =~ s/\]/\\]/g; $SRCH_KEY{'name'} =~ s/\(/\\(/g; $SRCH_KEY{'name'} =~ s/\)/\\)/g; $SRCH_KEY{'name'} =~ s/\[/\\[/g; $SRCH_KEY{'name'} =~ s/\]/\\]/g; foreach my $line(@LOGS) { # 行データから改行コード削除 $line =~ s/\r|\n//g; (my $logid, my $time, my $addr, my $host, my $agent, my $referer, my $referrer, my $swh, my $scd, my $visitor_name) = split(/\t/, $line); # 日時フォーマット変換 &getDateTime($time); # 表示用文字列取得 my $wday_str = &getWdayStr($wday); my $referer_str = &getDisp_Str($referer); my $referrer_str = &getDisp_Str($referrer); my $swh_str = &getDisp_Str($swh); my $scd_str = &getDisp_Str(&getScdStr($scd)); # 検索HITフラグ初期化 $flagSearchHit = 1; $SRCH_HIT{'logid'} = 0; $SRCH_HIT{'date'} = 0; $SRCH_HIT{'hour'} = 0; $SRCH_HIT{'wday'} = 0; $SRCH_HIT{'addr'} = 0; $SRCH_HIT{'host'} = 0; $SRCH_HIT{'agent'} = 0; $SRCH_HIT{'referer'} = 0; $SRCH_HIT{'referrer'} = 0; $SRCH_HIT{'swh'} = 0; $SRCH_HIT{'scd'} = 0; $SRCH_HIT{'name'} = 0; # ログ番号検索 if ($FORM{'srch_logid'} ne "") { if ($FORM{'match_ptn'} eq $MATCH_PTN_PART) { # 部分一致検索 if ($logid =~ /$SRCH_KEY{'logid'}/) { $SRCH_HIT{'logid'} = 1; } } else { # 完全一致検索 if ($logid eq $FORM{'srch_logid'}) { $SRCH_HIT{'logid'} = 1; } } } # 日付検索 if ($FORM{'srch_date'} ne "") { if ($FORM{'match_ptn'} eq $MATCH_PTN_PART) { # 部分一致検索 if ($date =~ /$SRCH_KEY{'date'}/) { $SRCH_HIT{'date'} = 1; } } else { # 完全一致検索 if ($date eq $FORM{'srch_date'}) { $SRCH_HIT{'date'} = 1; } } } # 時間検索 if ($FORM{'srch_hour'} ne "") { if ($FORM{'match_ptn'} eq $MATCH_PTN_PART) { # 部分一致検索 if ($hour =~ /$SRCH_KEY{'hour'}/) { $SRCH_HIT{'hour'} = 1; } } else { # 完全一致検索 if ($hour eq $FORM{'srch_hour'}) { $SRCH_HIT{'hour'} = 1; } } } # 曜日検索 if ($FORM{'srch_wday'} ne "") { if ($FORM{'match_ptn'} eq $MATCH_PTN_PART) { # 部分一致検索 if (($wday =~ /$SRCH_KEY{'wday'}/) || (@WDAY_STR[$wday] =~ /$SRCH_KEY{'wday'}/)) { $SRCH_HIT{'wday'} = 1; } } else { # 完全一致検索 if (($wday eq $FORM{'srch_wday'}) || (@WDAY_STR[$wday] eq $FORM{'srch_wday'})) { $SRCH_HIT{'wday'} = 1; } } } # IPアドレス検索 if ($FORM{'srch_addr'} ne "") { if ($FORM{'match_ptn'} eq $MATCH_PTN_PART) { # 部分一致検索 if ($addr =~ /$SRCH_KEY{'addr'}/) { $SRCH_HIT{'addr'} = 1; } } else { # 完全一致検索 if ($addr eq $FORM{'srch_addr'}) { $SRCH_HIT{'addr'} = 1; } } } # ホスト名検索 if ($FORM{'srch_host'} ne "") { if ($FORM{'match_ptn'} eq $MATCH_PTN_PART) { # 部分一致検索 if ($host =~ /$SRCH_KEY{'host'}/) { $SRCH_HIT{'host'} = 1; } } else { # 完全一致検索 if ($host eq $FORM{'srch_host'}) { $SRCH_HIT{'host'} = 1; } } } # UserAgent検索 if ($FORM{'srch_agent'} ne "") { if ($FORM{'match_ptn'} eq $MATCH_PTN_PART) { # 部分一致検索 if ($agent =~ /$SRCH_KEY{'agent'}/) { $SRCH_HIT{'agent'} = 1; } } else { # 完全一致検索 if ($agent eq $FORM{'srch_agent'}) { $SRCH_HIT{'agent'} = 1; } } } # 参照ページ検索 if ($FORM{'srch_referer'} ne "") { # エイリアス変換 $referer_alias = &convURLtoAlias($referer); # N/A変換 if ($referer eq "") { $referer_alias = $not_applicable_str; } if ($FORM{'match_ptn'} eq $MATCH_PTN_PART) { # 部分一致検索 if (($referer =~ /$SRCH_KEY{'referer'}/) || ($referer_alias =~ /$SRCH_KEY{'referer'}/)) { $SRCH_HIT{'referer'} = 1; } } elsif ($FORM{'match_ptn'} eq $MATCH_PTN_LIST) { # 完全一致検索(リスト抽出用) if (($referer eq $FORM{'srch_referer'}) || ($referer_alias eq $FORM{'srch_referer'})) { $SRCH_HIT{'referer'} = 1; } else { # 同一ページ扱い検索処理 foreach my $same_url(@SamePage) { (my $same_url1, my $same_url2) = split(/==/, $same_url); if (($referer eq $same_url1) && ($same_url2 eq $FORM{'srch_referer'})) { $SRCH_HIT{'referer'} = 1; } } } } else { # 完全一致検索 if (($referer eq $FORM{'srch_referer'}) || ($referer_alias eq $FORM{'srch_referer'})) { $SRCH_HIT{'referer'} = 1; } } } # リンク元検索 if ($FORM{'srch_referrer'} ne "") { # エイリアス変換 $referrer_alias = &convURLtoAlias($referrer); # N/A変換 if ($referrer eq "") { $referrer_alias = $not_applicable_str; } if ($FORM{'match_ptn'} eq $MATCH_PTN_PART) { # 部分一致検索 if (($referrer =~ /$SRCH_KEY{'referrer'}/) || ($referrer_alias =~ /$SRCH_KEY{'referrer'}/)) { $SRCH_HIT{'referrer'} = 1; } } elsif ($FORM{'match_ptn'} eq $MATCH_PTN_LIST) { # 完全一致検索(リスト抽出用) if (($referrer eq $FORM{'srch_referrer'}) || ($referrer_alias eq $FORM{'srch_referrer'})) { $SRCH_HIT{'referrer'} = 1; } else { # 同一ページ扱い検索処理 foreach my $same_url(@SamePage) { (my $same_url1, my $same_url2) = split(/==/, $same_url); if (($referrer eq $same_url1) && ($same_url2 eq $FORM{'srch_referrer'})) { $SRCH_HIT{'referrer'} = 1; } } } } else { # 完全一致検索 if (($referrer eq $FORM{'srch_referrer'}) || ($referrer_alias eq $FORM{'srch_referrer'})) { $SRCH_HIT{'referrer'} = 1; } } } # 解像度検索 if ($FORM{'srch_swh'} ne "") { if ($FORM{'match_ptn'} eq $MATCH_PTN_PART) { # 部分一致検索 if ($swh =~ /$SRCH_KEY{'swh'}/) { $SRCH_HIT{'swh'} = 1; } elsif (($not_applicable_str =~ /$SRCH_KEY{'swh'}/) && ($swh eq "")) { $SRCH_HIT{'swh'} = 1; } } else { # 完全一致検索 if ($swh eq $FORM{'srch_swh'}) { $SRCH_HIT{'swh'} = 1; } elsif (($FORM{'srch_swh'} eq $not_applicable_str) && ($swh eq "")) { $SRCH_HIT{'swh'} = 1; } } } # 表示可能色数検索 if ($FORM{'srch_scd'} ne "") { if ($FORM{'match_ptn'} eq $MATCH_PTN_PART) { # 部分一致検索 if (($scd =~ /$SRCH_KEY{'scd'}/) || (&getScdStr($scd) =~ /$SRCH_KEY{'scd'}/)) { $SRCH_HIT{'scd'} = 1; } } else { # 完全一致検索 if (($scd eq $FORM{'srch_scd'}) || (&getScdStr($scd) eq $FORM{'srch_scd'})) { $SRCH_HIT{'scd'} = 1; } } } # 訪問者名検索 if ($FORM{'srch_name'} ne "") { if ($FORM{'match_ptn'} eq $MATCH_PTN_PART) { # 部分一致検索 if ($visitor_name =~ /$SRCH_KEY{'name'}/) { $SRCH_HIT{'name'} = 1; } } else { # 完全一致検索 if ($visitor_name eq $FORM{'srch_name'}) { $SRCH_HIT{'name'} = 1; } elsif (($FORM{'srch_name'} eq $not_applicable_str) && ($visitor_name eq "")) { $SRCH_HIT{'name'} = 1; } } } # 検索条件に該当した場合、配列にデータを格納 if (($FORM{'srch_logid'} ne "") && ($SRCH_HIT{'logid'} != 1)) { $flagSearchHit = 0; } if (($FORM{'srch_date'} ne "") && ($SRCH_HIT{'date'} != 1)) { $flagSearchHit = 0; } if (($FORM{'srch_hour'} ne "") && ($SRCH_HIT{'hour'} != 1)) { $flagSearchHit = 0; } if (($FORM{'srch_wday'} ne "") && ($SRCH_HIT{'wday'} != 1)) { $flagSearchHit = 0; } if (($FORM{'srch_addr'} ne "") && ($SRCH_HIT{'addr'} != 1)) { $flagSearchHit = 0; } if (($FORM{'srch_host'} ne "") && ($SRCH_HIT{'host'} != 1)) { $flagSearchHit = 0; } if (($FORM{'srch_agent'} ne "") && ($SRCH_HIT{'agent'} != 1)) { $flagSearchHit = 0; } if (($FORM{'srch_referer'} ne "") && ($SRCH_HIT{'referer'} != 1)) { $flagSearchHit = 0; } if (($FORM{'srch_referrer'} ne "") && ($SRCH_HIT{'referrer'} != 1)) { $flagSearchHit = 0; } if (($FORM{'srch_swh'} ne "") && ($SRCH_HIT{'swh'} != 1)) { $flagSearchHit = 0; } if (($FORM{'srch_scd'} ne "") && ($SRCH_HIT{'scd'} != 1)) { $flagSearchHit = 0; } if (($FORM{'srch_name'} ne "") && ($SRCH_HIT{'name'} != 1)) { $flagSearchHit = 0; } # 該当部分を太字に変換 if ($flagSearchHit == 1) { if ($FORM{'match_ptn'} eq $MATCH_PTN_PART) { # 部分一致検索 # ログ番号 if ($SRCH_HIT{'logid'} == 1) { $logid =~ s/$SRCH_KEY{'logid'}/\$SRCH_KEY{'logid'}\<\/b\>/g; } # 日付 if ($SRCH_HIT{'date'} == 1) { $date =~ s/$SRCH_KEY{'date'}/\$SRCH_KEY{'date'}\<\/b\>/g; } # 時間 if ($SRCH_HIT{'hour'} == 1) { $hour =~ s/$SRCH_KEY{'hour'}/\$SRCH_KEY{'hour'}\<\/b\>/g; } # 曜日 if ($SRCH_HIT{'wday'} == 1) { $wday_str =~ s/$SRCH_KEY{'wday'}/\$SRCH_KEY{'wday'}\<\/b\>/g; } # IPアドレス if ($SRCH_HIT{'addr'} == 1) { $addr =~ s/$SRCH_KEY{'addr'}/\$SRCH_KEY{'addr'}\<\/b\>/g; } # ホスト名 if ($SRCH_HIT{'host'} == 1) { $host =~ s/$SRCH_KEY{'host'}/\$SRCH_KEY{'host'}\<\/b\>/g; } # AGENT if ($SRCH_HIT{'agent'} == 1) { $agent =~ s/$SRCH_KEY{'agent'}/\$SRCH_KEY{'agent'}\<\/b\>/g; } # 参照ページ if ($SRCH_HIT{'referer'} == 1) { $referer_str =~ s/$SRCH_KEY{'referer'}/\$SRCH_KEY{'referer'}\<\/b\>/g; } # リンク元 if ($SRCH_HIT{'referrer'} == 1) { $referrer_str =~ s/$SRCH_KEY{'referrer'}/\$SRCH_KEY{'referrer'}\<\/b\>/g; } # 解像度 if ($SRCH_HIT{'swh'} == 1) { $swh_str =~ s/$SRCH_KEY{'swh'}/\$SRCH_KEY{'swh'}\<\/b\>/g; } # 表示可能色数 if ($SRCH_HIT{'scd'} == 1) { $scd_str =~ s/$SRCH_KEY{'scd'}/\$SRCH_KEY{'scd'}\<\/b\>/g; } # 訪問者名 if ($SRCH_HIT{'name'} == 1) { $visitor_name =~ s/$SRCH_KEY{'name'}/\$SRCH_KEY{'name'}\<\/b\>/g; } } else { # 完全一致検索 # ログ番号 if ($SRCH_HIT{'logid'} == 1) { $logid = "" . $logid . ""; } # 日付 if ($SRCH_HIT{'date'} == 1) { $date = "" . $date . ""; } # 時間 if ($SRCH_HIT{'hour'} == 1) { $hour = "" . $hour . ""; } # 曜日 if ($SRCH_HIT{'wday'} == 1) { $wday_str = "" . $wday_str . ""; } # IPアドレス if ($SRCH_HIT{'addr'} == 1) { $addr = "" . $addr . ""; } # ホスト名 if ($SRCH_HIT{'host'} == 1) { $host = "" . $host . ""; } # UserAgent if ($SRCH_HIT{'agent'} == 1) { $agent = "" . $agent . ""; } # 参照ページ if ($SRCH_HIT{'referer'} == 1) { $referer_str = "" . &getDisp_Str($referer, $MODE_PC) . ""; } # リンク元 if ($SRCH_HIT{'referrer'} == 1) { $referrer_str = "" . &getDisp_Str($referrer, $MODE_PC) . ""; } # 解像度 if ($SRCH_HIT{'swh'} == 1) { $swh_str = "" . &getDisp_Str($swh, $MODE_PC) . ""; } # 表示可能色数 if ($SRCH_HIT{'scd'} == 1) { $scd_str = "" . &getScdStr(&getDisp_Str($scd, $MODE_PC)) . ""; } # 訪問者名 if ($SRCH_HIT{'name'} == 1) { $visitor_name = "" . $visitor_name . ""; } } # デコード済行作成 $local_time = $hour . "時" . $min . "分" . $sec . "秒"; $decoded_line = $logid . "\t" . $date . "(" . $wday_str . ")" . "\t" . $local_time . "\t" . $addr . "\t" . $host . "\t" . $agent . "\t" . &getDisp_Str($referer_str, $MODE_PC) . "\t" . &getDisp_Str($referrer_str, $MODE_PC) . "\t" . &getDisp_Str($swh_str, $MODE_PC) . "\t" . &getScdStr(&getDisp_Str($scd_str, $MODE_PC)) . "\t" . $visitor_name; # 表示用ログ配列に格納 push(@LOG_LIST, $decoded_line); } } } #============================================================================== # ログ削除 #============================================================================== sub deleteLog { my $delcode_count = 0; $FORM{'delcode'} =~ s/ / /g; @CODE = split(/ /, $FORM{'delcode'}); # 連番 ($consecutive_num1, $consecutive_num2) = split(/-/, $FORM{'delcode'}); if ($consecutive_num1 == null) { $consecutive_num1 = $consecutive_num2; } if ($consecutive_num2 == null) { $consecutive_num2 = $consecutive_num1; } if ($consecutive_num1 > $consecutive_num2) { $temp = $consecutive_num1; $consecutive_num1 = $consecutive_num2; $consecutive_num2 = $temp; } # CPU高付加チェック if (($g_total > $LIMITER_LV1) || ((($consecutive_num2 - $consecutive_num1) * $g_total) > $LIMITER_LV2)) { &printHtmlHeader; &printMenu; &error($ERR_CPU_HIGH_LOAD); } for ($i = $consecutive_num1; $i <= $consecutive_num2; $i++) { push(@CODE, $i); } $delcode_count = @CODE; # 削除コードが指定されていない場合、即時リターン if ($delcode_count == 0) { return; } $flagDeleted = 0; foreach $line(@LOGS) { (my $logid, my $time, my $addr, my $host, my $agent, my $referer, my $referrer, my $swh, my $scd, my $visitor_name) = split(/\t/, $line); $match = 0; # 読み込んだ1行が指定された削除コードに該当するか判別 foreach $delcode(@CODE) { if ($delcode > 0) { if ($logid == $delcode) { $match = 1; $flagDeleted = 1; } } } # 指定された削除コードに該当しない場合、配列に格納 if ($match == 0) { push (@NEWLOG, $line); } } # 削除された場合、記録ファイルへ出力 if ($flagDeleted == 1) { &File_Write($OPEN_MODE_NORMAL); } } #============================================================================== # 携帯版ログイン画面表示 #============================================================================== sub admin_k { if ($FORM{'pass'} eq "$pass") { &loadLog; &log_list_k; } else { print "Content-type: text/html\n\n"; print "" . $title . "\n"; print "
\n"; print "
\n"; print $title . "

"; print ""; print ""; print ""; print "
\n"; print "ぽけろぐ。 Ver" . $ver . " by た。\n"; &printHtmlFooter; } } #============================================================================== # 携帯対応画面表示 #============================================================================== sub log_list_k { my $totalpage = 0; my $i = 0; my $j = 0; print "Content-type: text/html\n\n"; print "\n"; print "\n"; print "$title"; print ""; if ($FORM{'page'} eq "") { $FORM{'page'} = 1; } # 表示開始件数の計算 $i = ($FORM{'page'} - 1) * $k_pageview; # 最大ページの計算 $totalpage = 0; $j = $g_total; while ($j > 0) { $totalpage++; $j = $j - $k_pageview; } print "Page:" . $FORM{'page'} . "/" . $totalpage . " 全" . $g_total . "件
"; print "
"; foreach $line(@LOGS[$i .. $i + $k_pageview - 1]) { ($logid, $time, $addr, $host, $agent, $referer, $referrer, $swh, $scd, $visitor_name) = split(/\t/, $line); &getDateTime($time); # ログ番号 if ($k_disp_1 == 1) { print "" . $logid . ""; } # 日時 if ($k_disp_2 == 1) { # 曜日色取得 $youbi_color = &getWdayColor($youbi); print "|" . $date . "($youbi)" . $hour . ":" . $min . ":" . $sec . ""; } # IPアドレス if ($k_disp_3 == 1) { print "|" . $addr . ""; } # ホスト名 if ($k_disp_4 == 1) { print "|" . $host . ""; } # UserAgent if ($k_disp_5 == 1) { print "|" . $agent . ""; } # 参照ページ if ($k_disp_6 == 1) { $referer = &convURLtoAlias($referer); print "|" . &getDisp_Str($referer, $MODE_KEITAI) . ""; } # リンク元 if ($k_disp_7 == 1) { $referrer = &convURLtoAlias($referrer); print "|" . &getDisp_Str($referrer, $MODE_KEITAI) . ""; } # 名前 if ($k_disp_8 == 1) { print "|" . &getDisp_Str($visitor_name, $MODE_KEITAI) . ""; } print "
"; $i++; if ($i == $g_total) { last; } } print "
"; print ""; print ""; print ""; print ""; print ""; print "
"; # 前ページボタン if ($FORM{'page'} != 1) { $pg_back = $FORM{'page'} - 1; print "
"; print ""; print ""; print ""; print ""; print "
"; } print "
"; # 次ページボタン if ($i != $g_total) { $pg_fwd = $FORM{'page'} + 1; print "
"; print ""; print ""; print ""; print ""; print "
"; } print "
"; &printHtmlFooter; } #============================================================================== # 棒グラフ画像作成 #============================================================================== sub drawBar { if ($barcolor == 2) { # 青 @BAR_GIF = ('47','49','46','38','39','61','01','00','0C','00','82','00','00','30','70','FF','78','A0','FF','98','B8','FF','A8','C0','FF','58','90','FF','28','68','FF','20','60','FF','00','00','00','21','F9','04','02','00','00','00','00','2C','00','00','00','00','01','00','0C','00','02','03','08','08','21','23','41','A0','14','03','12','00','3B'); } elsif ($barcolor == 3) { # 水 @BAR_GIF = ('47','49','46','38','39','61','01','00','0C','00','82','00','00','48','B8','FF','88','D8','FF','B0','E0','FF','C0','E8','FF','70','C8','FF','38','B8','FF','30','B0','FF','00','00','00','21','F9','04','02','00','00','00','00','2C','00','00','00','00','01','00','0C','00','02','03','08','08','21','23','41','A0','14','03','12','00','3B'); } elsif ($barcolor == 4) { # 緑 @BAR_GIF = ('47','49','46','38','39','61','01','00','0C','00','82','00','00','48','FF','70','88','FF','A0','B0','FF','C0','C0','FF','C8','70','FF','90','38','FF','68','30','FF','60','00','00','00','21','F9','04','02','00','00','00','00','2C','00','00','00','00','01','00','0C','00','02','03','08','08','21','23','41','A0','14','03','12','00','3B'); } elsif ($barcolor == 5) { # 黄 @BAR_GIF = ('47','49','46','38','39','61','01','00','0C','00','82','00','00','FF','C8','48','FF','D8','88','FF','E8','B0','FF','E8','C0','FF','D0','70','FF','C8','38','FF','C0','30','00','00','00','21','F9','04','02','00','00','00','00','2C','00','00','00','00','01','00','0C','00','02','03','08','08','21','23','41','A0','14','03','12','00','3B'); } elsif ($barcolor == 6) { # 橙 @BAR_GIF = ('47','49','46','38','39','61','01','00','0C','00','82','00','00','FF','7F','47','FF','A9','87','FF','C7','AF','FF','CE','BF','FF','98','6F','FF','79','37','FF','6F','2F','00','00','00','21','F9','04','02','00','00','00','00','2C','00','00','00','00','01','00','0C','00','02','03','08','08','21','23','41','A0','14','63','12','00','3B'); } elsif ($barcolor == 7) { # 紫 @BAR_GIF = ('47','49','46','38','39','61','01','00','0C','00','82','00','00','C1','47','FF','D4','87','FF','E4','AF','FF','E5','BF','FF','CB','6F','FF','C1','37','FF','B9','2F','FF','00','00','00','21','F9','04','02','00','00','00','00','2C','00','00','00','00','01','00','0C','00','02','03','08','08','21','23','41','A0','14','63','12','00','3B'); } else { # 赤 @BAR_GIF = ('47','49','46','38','39','61','01','00','0C','00','82','00','00','FF','38','30','FF','78','78','FF','98','98','FF','A8','A8','FF','60','60','FF','28','28','FF','20','20','00','00','00','21','F9','04','02','00','00','00','00','2C','00','00','00','00','01','00','0C','00','02','03','08','08','21','23','41','A0','14','03','12','00','3B'); } print "Content-type: image/gif\n\n"; foreach (@BAR_GIF) { $bar_data = pack('C*', hex($_)); print $bar_data; } } #============================================================================== # ダミー画像(1ドット透過GIF)出力 #============================================================================== sub dummy_img { @IMG_BODY = ('47','49','46','38','39','61','01','00','01','00','80','00','00','FF','FF','FF','00','00','00','21','F9','04','03','00','00','00','00','2C','00','00','00','00','01','00','01','00','00','02','02','44','01','00','3B'); print "Content-type: image/gif\n\n"; foreach (@IMG_BODY) { $img = pack('C*', hex($_)); print $img; } } #============================================================================== # ダミーテキスト出力 #============================================================================== sub dummy_txt { print "Content-type: text/plain\n\n"; print ""; } #============================================================================== # エイリアス変換 #============================================================================== sub convURLtoAlias { my $orgURL = $_[0]; my $cnvURL = $orgURL; foreach $alias(@ALIAS) { (my $alias_url, my $alias_name, my $conv_switch) = split(/==/, $alias); if ($conv_switch eq "0") { # 部分一致で変換 if ($orgURL =~ /$alias_url/) { $cnvURL =~ s/$alias_url/$alias_name/g; } } else { # 完全一致で変換 if ($orgURL eq $alias_url) { $cnvURL = $alias_name; } } } return $cnvURL; } #============================================================================== # 表示可能色数表示変換 #============================================================================== sub getScdStr { my $orgColorText = $_[0]; my $cnvColorText = $orgColorText; if ($orgColorText eq "1") { $cnvColorText = "モノクロ"; } elsif ($orgColorText eq "4") { $cnvColorText = "16色"; } elsif ($orgColorText eq "8") { $cnvColorText = "256色"; } elsif ($orgColorText eq "16") { $cnvColorText = "High Color (16bit)"; } elsif ($orgColorText eq "24") { $cnvColorText = "True Color (24bit)"; } elsif ($orgColorText eq "32") { $cnvColorText = "True Color (32bit)"; } elsif ($orgColorText eq "") { $cnvColorText = $not_applicable_str; } return $cnvColorText; } #============================================================================== # 曜日文字列取得 #============================================================================== sub getWdayStr { my $argWday = $_[0]; my $ret = $argWday; if ($argWday eq "0") { $ret = @WDAY_STR[0]; } elsif ($argWday eq "1") { $ret = @WDAY_STR[1]; } elsif ($argWday eq "2") { $ret = @WDAY_STR[2]; } elsif ($argWday eq "3") { $ret = @WDAY_STR[3]; } elsif ($argWday eq "4") { $ret = @WDAY_STR[4]; } elsif ($argWday eq "5") { $ret = @WDAY_STR[5]; } elsif ($argWday eq "6") { $ret = @WDAY_STR[6]; } return $ret; } #============================================================================== # 曜日色取得 #============================================================================== sub getWdayColor { my $argWday = $_[0]; my $retWdayColor = $text; if ($argWday eq @WDAY_STR[0]) { $retWdayColor = $sun_color; } elsif ($argWday eq @WDAY_STR[1]) { $retWdayColor = $mon_color; } elsif ($argWday eq @WDAY_STR[2]) { $retWdayColor = $tue_color; } elsif ($argWday eq @WDAY_STR[3]) { $retWdayColor = $wed_color; } elsif ($argWday eq @WDAY_STR[4]) { $retWdayColor = $thu_color; } elsif ($argWday eq @WDAY_STR[5]) { $retWdayColor = $fri_color; } elsif ($argWday eq @WDAY_STR[6]) { $retWdayColor = $sat_color; } return $retWdayColor; } #============================================================================== # 表示用文字列取得(N/A, DownLoad) #============================================================================== sub getDisp_Str { my $argStr = $_[0]; my $argMode = $_[1]; my $ret = $argStr; if ($argStr eq "") { if ($argMode == $MODE_KEITAI) { $ret = "" . $not_applicable_str . ""; } else { $ret = "" . $not_applicable_str . ""; } } elsif (($argStr eq $not_applicable_str) || ($argStr eq "" . $not_applicable_str . "")) { if ($argMode == $MODE_KEITAI) { $ret = "" . $argStr . ""; } else { $ret = "" . $argStr . ""; } } elsif ($argStr eq $download_str) { $ret = "" . $argStr . ""; } return $ret; } #============================================================================== # 記録ファイル出力 #============================================================================== sub File_Write { my $open_mode = $_[0]; if ($file_lock == 0) { # flock関数使用 if ($open_mode == $OPEN_MODE_CREATE) { open(OUT, "+> $logfile"); } else { open(OUT, "+< $logfile"); } flock(OUT, 2); truncate(OUT, 0); seek(OUT, 0, 0); print OUT @NEWLOG; close(OUT); } else { # ロックディレクトリ使用 for ($i = 0; $i < $retryMax; $i++) { if (mkdir($lockdir, 0755)) { last; } else { sleep($waitTime); } } if ($open_mode == $OPEN_MODE_CREATE) { open(OUT, "+> $logfile"); } else { open(OUT, "+< $logfile"); } print OUT @NEWLOG; close(OUT); rmdir($lockdir); } } #============================================================================== # 日時フォーマット変換 #============================================================================== sub getDateTime { my $local_time = $_[0]; ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($local_time); $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_STR[$wday]; $year = sprintf("%02d", $year + 1900); $date = $year . "年" . $mon . "月" . $mday . "日"; } #============================================================================== # エラー処理 #============================================================================== sub error { my $ErrNo = $_[0]; print "

\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; if ($ErrNo == $ERR_NO_LOG_DATA) {print "ログファイルが空または存在しません。\n"; } elsif ($ErrNo == $ERR_NO_HIT) { print "該当するログは見つかりませんでした。\n"; } elsif ($ErrNo == $ERR_CPU_HIGH_LOAD) { print "CPU負荷防止の為、処理を中止しました。\n"; } else { print "予\期せぬエラーが発生しました。\n"; } print "
\n"; &printHtmlFooter; exit; }