/** * アクションプラグイン処理 */ function plugin_log_whois_convert() { global $log; global $log_ua; global $_log_whois_msg; if (!$log['guess_user']['use']) { return ''; } // 推定ユーザ処理が無効の場合 $filename = log::set_filename('guess_user', ''); // ログファイル名 // ログの読み込み if (!file_exists($filename)) { return ''; } $src = @file($filename); $guess = array(); foreach ($src as $_src) { $data = log::table2array($_src); // 0:ua 1:host 2:user $guess[$data[0]][$data[1]][$data[2]] = ''; } $host = log::ip2host(); if (!isset($guess[$log_ua][$host])) { return ''; } $uname = ''; foreach ($guess[$log_ua][$host] as $user => $val) { $uname .= !empty($uname) ? ',' . $user : $user; } return sprintf($_log_whois_msg['msg_whois'], $uname); }
/** * アクションプラグイン処理 */ function plugin_log_guess_user_convert() { global $_log_guess_user_msg; global $log; // ユーザを推測する // $user = log::guess_user( $data['user'], $data['ntlm'], $data['sig'] ); $filename = log::set_filename('guess_user', ''); // ログファイル名 $src = array(); $master = array(); if (file_exists($filename)) { $src = @file($filename); } // ログの読み込み foreach ($src as $_src) { $data = log::table2array($_src); // 0:ua 1:host 2:user $master[$data[0]][$data[1]][$data[2]] = ''; } // 更新ログから署名情報の収集 // $guess[ USER-AGENT ][ ホスト名 ][ ユーザ名 ][任意欄] の配列を戻す $guess = log::summary_signature(); $i = 0; foreach ($guess as $ua => $val1) { foreach ($val1 as $host => $val2) { foreach ($val2 as $user => $val3) { if (isset($master[$ua][$host][$user])) { continue; } log_put($filename, '|' . $ua . '|' . $host . '|' . $user . '||'); $i++; } } } $msg = sprintf($_log_guess_user_msg['msg_put'], $i); return $msg; }
/** * 推測ユーザデータから署名情報の収集 * @return array * $rc[ USER-AGENT ][ ホスト名 ][ ユーザ名 ] の配列を戻す * @static */ function read_guess() { global $log; if (!$log['guess_user']['use']) { return ''; } $filename = log::set_filename('guess_user', ''); // ログファイル名 $src = @file($filename); $sum = array(); foreach ($src as $_src) { $x = trim($_src); $field = log::table2array($x); // PukiWiki 表形式データを配列データに変換 if (count($field) == 0) { continue; } $user = empty($field[3]) ? $field[2] : $field[3]; // 任意欄が記入されていれば、それを採用 $sum[$field[0]][$field[1]][$user] = ''; } return $sum; }
<?php // // logクラス(テスト) // require_once "./log.php"; // 基本設定 $log = new log(); $log->set_filename("./test.log"); // ログを書き出すファイル名(パス) $log->set_pname("winny"); // プログラム名 // デフォルトonのものたち //$log->spreadtime_off(); // offならエポックで出るはず。。 //$log->off(); // offならファイルに書き込まれないはず。。 // ログを残したいなと思ったら... $log->add("ultra fatal error!"); // 残す! $log->pause(); // 区切りを入れて.. $log->add("--"); // 残す! $log->add("ろぐをしっかり残そう"); // 残す! //var_dump($log); $log->flush(); // ファイルに書き出し // そのまま次のログに使える。 $log->add("2回目"); // 残す! $log->add(": fatal error.");
/** * アクションプラグイン処理 */ function plugin_logview_action() { global $vars, $_logview_msg; global $log, $sortable_tracker; static $count = 0; $kind = isset($vars['kind']) ? $vars['kind'] : 'update'; $title = sprintf($_logview_msg['msg_title'], $kind); // タイトルを設定 $page = isset($vars['page']) ? $vars['page'] : ''; // ゲスト表示ができない場合は、認証を要求する if ($log[$kind]['guest'] == '') { $obj = new auth(); $user = $obj->check_auth(); if (empty($user)) { if (exist_plugin('login')) { do_plugin_action('login'); } unset($obj); return array('msg' => $title, 'body' => $_logview_msg['msg_not_auth']); } } unset($obj); check_readable($page, false); // 保存データの項目名を取得 $name = log::get_log_field($kind); $view = log::get_view_field($kind); // 表示したい項目設定 if ($sortable_tracker && $count == 0) { global $head_tags; $head_tags[] = ' <script type="text/javascript" charset="utf-8" src="' . SKIN_URI . 'sortabletable.js"></script>'; } $count++; $body = <<<EOD <table id="logview{$count}" class="style_table" cellspacing="1" border="0"> <thead> <tr> EOD; $cols = 0; $is_role_adm = auth::check_role('role_adm'); // タイトルの処理 foreach ($view as $_view) { if ($_view === 'local_id' && $is_role_adm) { continue; } $body .= '<td class="style_td">' . $_logview_msg[$_view] . '</td>' . "\n"; $cols++; } $body .= <<<EOD </tr> </thead> <tbody> EOD; // データを取得 $fld = logview_get_data(log::set_filename($kind, $page), $name); if (empty($fld)) { return array('msg' => $title, 'body' => 'no data'); } // USER-AGENT クラス $obj_ua = new user_agent(USE_UA_OPTION); $path_flag = IMAGE_URI . 'icon/flags/'; $path_browser = IMAGE_URI . 'icon/browser/'; $path_os = IMAGE_URI . 'icon/os/'; $path_domain = IMAGE_URI . 'icon/option/domain/'; $guess = $log['guess_user']['use'] ? log::read_guess() : log::summary_signature(); $ctr = 0; // データの編集 foreach ($fld as $data) { if (!VIEW_ROBOTS && $obj_ua->is_robots($data['ua'])) { continue; } // ロボットは対象外 $body .= "<tr>\n"; foreach ($view as $field) { switch ($field) { case 'ts': // タイムスタンプ (UTIME) $body .= ' <td class="style_td">' . get_date('Y-m-d H:i:s', $data['ts']) . ' ' . get_passage($data['ts']) . "</td>\n"; break; case '@guess_diff': case '@diff': // 差分内容 $update = $field == '@diff' ? true : false; // FIXME: バックアップ/差分 なしの新規の場合 // バックアップデータの確定 $body .= ' <td class="style_td">'; $age = log::get_backup_age($page, $data['ts'], $update); switch ($age) { case -1: // データなし $body .= '<a class="ext" href="' . get_page_uri($page) . '" rel="nofollow">none</a>'; break; case 0: // diff $body .= '<a class="ext" href="'; $body .= log::diff_exist($page) ? get_cmd_uri('diff', $page) : get_page_uri($page); $body .= '" rel="nofollow">now</a>'; break; default: // あり $body .= '<a class="ext" href="' . get_cmd_uri('backup', $page, '', array('age' => $age, 'action' => 'visualdiff')) . '"' . ' rel="nofollow">' . $age . '</a>'; break; } $body .= "</td>\n"; break; case 'host': // ホスト名 (FQDN) $body .= ' <td class="style_td">'; if ($data['ip'] != $data['host']) { // 国名取得 list($flag_icon, $flag_name) = $obj_ua->get_icon_flag($data['host']); if (!empty($flag_icon) && $flag_icon != 'jp') { $body .= '<img src="' . $path_flag . $flag_icon . '.png"' . ' alt="' . $flag_name . '" title="' . $flag_name . '" />'; } // ドメイン取得 $domain = $obj_ua->get_icon_domain($data['host']); if (!empty($domain)) { $body .= '<img src="' . $path_domain . $domain . '.png"' . ' alt="' . $data['host'] . '" title="' . $data['host'] . '" />'; } } $body .= $data['host'] . "</td>\n"; break; case '@guess': // 推測 $body .= ' <td class="style_td">' . htmlspecialchars(logview_guess_user($data, $guess), ENT_QUOTES) . "</td>\n"; break; case 'ua': // ブラウザ情報 (USER-AGENT) $body .= ' <td class="style_td">'; $os = $obj_ua->get_icon_os($data['ua']); if (!empty($os)) { $body .= '<img src="' . $path_os . $os . '.png"' . ' alt="' . $os . '" title="' . $os . '" />'; } $browser = $obj_ua->get_icon_broeswes($data['ua']); if (!empty($browser)) { $body .= '<img src="' . $path_browser . $browser . '.png"' . ' alt="' . htmlspecialchars($data['ua'], ENT_QUOTES) . '" title="' . htmlspecialchars($data['ua'], ENT_QUOTES) . '" />'; } $body .= "</td>\n"; break; case 'local_id': if ($is_role_adm) { continue; } default: $body .= ' <td class="style_td">' . htmlspecialchars($data[$field], ENT_QUOTES) . "</td>\n"; } } $body .= "</tr>\n"; $ctr++; } unset($obj_ua); if ($ctr == 0) { return array('msg' => $title, 'body' => 'no data'); } $body .= <<<EOD </tbody> </table> EOD; switch ($kind) { case 'login': case 'check': $body .= logview_user_list($fld, $page, $kind); break; } if ($sortable_tracker) { $logviewso = join(',', array_fill(0, $cols, '"String"')); $body .= <<<EOD <script type="text/javascript"> <!-- <![CDATA[ var st = new SortableTable(document.getElementById('logview{$count}'),[{$logviewso}]); //]]>--> </script> EOD; } return array('msg' => $title, 'body' => $body); }