0
AND dtr.local_data_id = ?',
array($local_data_id)), 'id', 'name');
}
function clog_purge_logfile() {
global $config;
$logfile = read_config_option('path_cactilog');
$logbase = basename($logfile);
if ($logfile == '') {
$logfile = $config['base_path'] . '/log/cacti.log';
}
if (get_nfilter_request_var('filename') != '') {
if (strpos(get_nfilter_request_var('filename'), $logbase) === false) {
raise_message('clog_invalid');
header('Location: ' . get_current_page() . '?filename=' . $logbase);
exit(0);
}
}
$purgefile = dirname($logfile) . '/' . get_nfilter_request_var('filename');
if (strstr($purgefile, $logfile) === false) {
raise_message('clog_invalid');
header('Location: ' . get_current_page() . '?header=false');
exit(0);
}
if (file_exists($purgefile)) {
if (is_writable($purgefile)) {
if ($logfile != $purgefile) {
unlink($purgefile);
raise_message('clog_remove');
} else {
$timestamp = date('Y-m-d H:i:s');
$log_fh = fopen($logfile, 'w');
fwrite($log_fh, "$timestamp - WEBUI: Cacti Log Cleared from Web Management Interface\n");
fclose($log_fh);
raise_message('clog_purged');
}
cacti_log('NOTE: Cacti Log file ' . $purgefile . ', Removed by user ' . get_username($_SESSION['sess_user_id']), false, 'WEBUI');
} else {
raise_message('clog_permissions');
}
} else {
raise_message('clog_missing');
}
}
function clog_view_logfile() {
global $config;
$exclude_reported = false;
$clogAdmin = clog_admin();
$logfile = read_config_option('path_cactilog');
$logbase = basename($logfile);
if (isset_request_var('filename')) {
$requestedFile = dirname($logfile) . '/' . basename(get_nfilter_request_var('filename'));
if (file_exists($requestedFile)) {
$logfile = $requestedFile;
}
} elseif ($logfile == '') {
$logfile = $config['base_path'] . '/log/cacti.log';
}
if (get_nfilter_request_var('filename') != '') {
if (strpos(get_nfilter_request_var('filename'), $logbase) === false) {
raise_message('clog_invalid');
header('Location: ' . get_current_page() . '?filename=' . $logbase);
exit(0);
}
}
/* ================= input validation and session storage ================= */
$filters = array(
'page' => array(
'filter' => FILTER_VALIDATE_INT,
'default' => '1'
),
'tail_lines' => array(
'filter' => FILTER_VALIDATE_INT,
'default' => read_config_option('num_rows_log'),
'pageset' => true
),
'message_type' => array(
'filter' => FILTER_VALIDATE_INT,
'default' => '-1',
'pageset' => true
),
'refresh' => array(
'filter' => FILTER_VALIDATE_INT,
'default' => read_config_option('log_refresh_interval')
),
'reverse' => array(
'filter' => FILTER_VALIDATE_INT,
'default' => '1'
),
'rfilter' => array(
'filter' => FILTER_VALIDATE_IS_REGEX,
'default' => '',
'pageset' => true
)
);
validate_store_request_vars($filters, 'sess_clog');
/* ================= input validation ================= */
/* enable page refreshes */
kill_session_var('custom');
set_request_var('page_referrer', 'view_logfile');
load_current_session_value('page_referrer', 'page_referrer', 'view_logfile');
if ($clogAdmin && isset_request_var('purge_continue')) {
clog_purge_logfile();
$logfile = read_config_option('path_cactilog');
}
$page_nr = get_request_var('page');
$page = $config['url_path'] . 'clog' . (!$clogAdmin ? '_user' : '') . '.php?header=false';
$page .= '&filename=' . basename($logfile) . '&page=' . $page_nr;
$refresh = array(
'seconds' => get_request_var('refresh'),
'page' => $page,
'logout' => 'false'
);
set_page_refresh($refresh);
general_header();
if ($clogAdmin && isset_request_var('purge')) {
form_start('clog.php');
html_start_box(__('Purge'), '50%', '', '3', 'center', '');
print "
|
" . __('Click \'Continue\' to purge the Log File.
Note: If logging is set to both Cacti and Syslog, the log information will remain in Syslog.') . "
|
|
 
|
\n";
html_end_box();
return;
}
html_start_box(__('Log Filters'), '100%', '', '3', 'center', '');
filter($clogAdmin);
html_end_box();
/* read logfile into an array and display */
$total_rows = 0;
$number_of_lines = get_request_var('tail_lines') < 0 ? read_config_option('max_display_rows') : get_request_var('tail_lines');
$logcontents = tail_file($logfile, $number_of_lines, get_request_var('message_type'), get_request_var('rfilter'), $page_nr, $total_rows);
if (get_request_var('reverse') == 1) {
$logcontents = array_reverse($logcontents);
}
if (!$clogAdmin) {
$exclude_regex = read_config_option('clog_exclude', true);
if ($exclude_regex != '') {
$ad_filter = __(' - Admin Filter active');
} else {
$ad_filter = __(' - Admin Unfiltered');
}
} else {
$ad_filter = __(' - Admin view');
$exclude_regex = '';
}
if (get_request_var('message_type') > 0 || get_request_var('rfilter') != '') {
$start_string = __('Log [Total Lines: %d %s - Filter active]', $total_rows, $ad_filter);
} else {
$start_string = __('Log [Total Lines: %d %s - Unfiltered]', $total_rows, $ad_filter);
}
$rfilter = get_request_var('rfilter');
$reverse = get_request_var('reverse');
$refreshTime = get_request_var('refresh');
$message_type = get_request_var('message_type');
$tail_lines = get_request_var('tail_lines');
$base_url = 'clog.php?rfilter='.$rfilter.'&reverse='.$reverse.'&refresh='.$refreshTime.'&message_type='.$message_type.'&tail_lines='.$tail_lines.'&filename='.basename($logfile);
$nav = html_nav_bar($base_url, MAX_DISPLAY_PAGES, $page_nr, $number_of_lines, $total_rows, 13, __('Entries'), 'page', 'main');
print $nav;
html_start_box($start_string, '100%', '', '3', 'center', '');
$linecolor = false;
$hosts = db_fetch_assoc_prepared('SELECT id, description FROM host');
$hostDescriptions = array();
foreach ($hosts as $host) {
$hostDescriptions[$host['id']] = html_escape($host['description']);
}
$regex_array = clog_get_regex_array();
foreach ($logcontents as $item) {
$new_item = html_escape($item);
$new_item = preg_replace_callback($regex_array['complete'],'clog_regex_parser',$new_item);
/* respect the exclusion filter */
if ($exclude_regex != '' && !$clogAdmin) {
if (validate_is_regex($exclude_regex)) {
if (preg_match($exclude_regex, $new_item)) {
continue;
}
} elseif (!$exclude_reported) {
cacti_log('Cacti Log Exclude Regex "' . $exclude_regex . '" is Invalid. Update your Exclude Regex to be valid!');
$exclude_reported = true;
}
}
/* get the background color */
if (strpos($new_item, 'ERROR') !== false || strpos($new_item, 'FATAL') !== false) {
$class = 'clogError';
} elseif (strpos($new_item, 'WARN') !== false) {
$class = 'clogWarning';
} elseif (strpos($new_item, ' SQL ') !== false) {
$class = 'clogSQL';
} elseif (strpos($new_item, 'DEBUG') !== false) {
$class = 'clogDebug';
} elseif (strpos($new_item, 'STATS') !== false) {
$class = 'clogStats';
} else {
if ($linecolor) {
$class = 'odd';
} else {
$class = 'even';
}
$linecolor = !$linecolor;
}
?>
|
|
|
|
array('name' => 'DS', 'regex' => '( DS\[)([, \d]+)(\])', 'func' => 'clog_regex_datasource'),
2 => array('name' => 'DQ', 'regex' => '( DQ\[)([, \d]+)(\])', 'func' => 'clog_regex_dataquery'),
3 => array('name' => 'Device', 'regex' => '( Device\[)([, \d]+)(\])', 'func' => 'clog_regex_device'),
4 => array('name' => 'Poller', 'regex' => '( Poller\[)([, \d]+)(\])', 'func' => 'clog_regex_poller'),
5 => array('name' => 'RRA', 'regex' => "([_\/])(\d+)(\.rrd')", 'func' => 'clog_regex_rra'),
6 => array('name' => 'GT', 'regex' => '( GT\[)([, \d]+)(\])', 'func' => 'clog_regex_graphtemplates'),
7 => array('name' => 'Graph', 'regex' => '( Graph\[)([, \d]+)(\])', 'func' => 'clog_regex_graphs'),
8 => array('name' => 'Graphs', 'regex' => '( Graphs\[)([, \d]+)(\])', 'func' => 'clog_regex_graphs')
);
$regex_array = api_plugin_hook_function('clog_regex_array',$regex_array);
$regex_complete = '';
foreach ($regex_array as $regex_key => $regex_setting) {
$regex_complete .= (strlen($regex_complete)?')|(':'').$regex_setting['regex'];
}
$regex_complete = '~('.$regex_complete.')~';
$regex_array['complete'] = $regex_complete;
}
return $regex_array;
}
function clog_regex_parser($matches) {
$result = $matches[0];
$match = $matches[0];
$key_match = -1;
for ($index = 1; $index < cacti_sizeof($matches); $index++) {
if ($match == $matches[$index]) {
$key_match = $index;
break;
}
}
if ($key_match != -1) {
$key_setting = ($key_match - 1) / 4 + 1;
$regex_array = clog_get_regex_array();
if (cacti_sizeof($regex_array)) {
if (array_key_exists($key_setting, $regex_array)) {
$regex_setting = $regex_array[$key_setting];
$rekey_array = array();
for ($j = 0; $j < 4; $j++) {
$rekey_array[$j] = $matches[$key_match + $j];
}
$result=call_user_func_array($regex_setting['func'],array($rekey_array));
}
}
}
return $result;
}
function clog_regex_device($matches) {
global $config;
$result = $matches[0];
$dev_ids = explode(',',str_replace(" ","",$matches[2]));
if (cacti_sizeof($dev_ids)) {
$result = '';
$hosts = db_fetch_assoc_prepared('SELECT id, description
FROM host
WHERE id in (?)',
array(implode(',',$dev_ids)));
$hostDescriptions = array();
if (cacti_sizeof($hosts)) {
foreach ($hosts as $host) {
$hostDescriptions[$host['id']] = html_escape($host['description']);
}
}
foreach ($dev_ids as $host_id) {
$result .= $matches[1].'' . (isset($hostDescriptions[$host_id]) ? $hostDescriptions[$host_id]:$host_id) . '' . $matches[3];
}
}
return $result;
}
function clog_regex_datasource($matches) {
global $config;
$result = $matches[0];
$ds_ids = explode(',',str_replace(" ","",$matches[2]));
if (cacti_sizeof($ds_ids)) {
$result = '';
$graph_rows = array_rekey(db_fetch_assoc_prepared('SELECT DISTINCT
gtg.local_graph_id AS id
FROM graph_templates_graph AS gtg
INNER JOIN graph_templates_item AS gti
ON gtg.local_graph_id=gti.local_graph_id
INNER JOIN data_template_rrd AS dtr
ON gti.task_item_id=dtr.id
WHERE gtg.local_graph_id>0
AND dtr.local_data_id iN (?)',
array($matches[2])),'id','id');
$graph_results = '';
if (cacti_sizeof($graph_rows)) {
$graph_ids = implode(',',$graph_rows);
$graph_array = array( 0 => '', 1 => ' Graphs[', 2 => $graph_ids, 3 => ']');
$graph_results = clog_regex_graphs($graph_array);
}
$result .= $matches[1];
$i = 0;
$ds_ids = array_unique($ds_ids);
$ds_titles = clog_get_datasource_titles($ds_ids);
if (!isset($ds_titles)) {
$ds_titles = array();
}
foreach($ds_ids as $ds_id) {
$ds_title = $ds_id;
if (array_key_exists($ds_id, $ds_titles)) {
$ds_title = $ds_titles[$ds_id];
}
$result .= ($i == 0 ? '':', ') . "" . $ds_title . '';
$i++;
}
$result .= $matches[3] . $graph_results;
}
return $result;
}
function clog_regex_poller($matches) {
global $config;
$result = $matches[0];
$poller_ids = explode(',',str_replace(" ","",$matches[2]));
if (cacti_sizeof($poller_ids)) {
$result = '';
$pollers = db_fetch_assoc_prepared('SELECT id, name
FROM poller
WHERE id in (?)',
array(implode(',',$poller_ids)));
$pollerDescriptions = array();
if (cacti_sizeof($pollers)) {
foreach ($pollers as $poller) {
$pollerDescriptions[$poller['id']] = html_escape($poller['name']);
}
}
foreach ($poller_ids as $poller_id) {
$result .= $matches[1].'' . (isset($pollerDescriptions[$poller_id]) ? $pollerDescriptions[$poller_id]:$poller_id) . '' . $matches[3];
}
}
return $result;
}
function clog_regex_dataquery($matches) {
global $config;
$result = $matches[0];
$query_ids = explode(',',str_replace(" ","",$matches[2]));
if (cacti_sizeof($query_ids)) {
$result = '';
$querys = db_fetch_assoc_prepared('SELECT id, name
FROM snmp_query
WHERE id in (?)',
array(implode(',',$query_ids)));
$queryDescriptions = array();
if (cacti_sizeof($querys)) {
foreach ($querys as $query) {
$queryDescriptions[$query['id']] = html_escape($query['name']);
}
}
foreach ($query_ids as $query_id) {
$result .= $matches[1].'' . (isset($queryDescriptions[$query_id]) ? $queryDescriptions[$query_id]:$query_id) . '' . $matches[3];
}
}
return $result;
}
function clog_regex_rra($matches) {
global $config;
$result = $matches[0];
$local_data_ids = $matches[2];
if (strlen($local_data_ids)) {
$datasource_array = array( 0 => '', 1 => ' DS[', 2 => $local_data_ids, 3 => ']');
$datasource_result = clog_regex_datasource($datasource_array);
if (strlen($datasource_result)) {
$result .= ' '. $datasource_result;
}
}
return $result;
}
function clog_regex_graphs($matches) {
global $config;
$result = $matches[0];
$query_ids = explode(',',str_replace(" ","",$matches[2]));
if (cacti_sizeof($query_ids)) {
$result = '';
$graph_add = $config['url_path'] . 'graph_view.php?page=1&style=selective&action=preview&graph_add=';
$title = '';
$i = 0;
$querys = db_fetch_assoc_prepared('SELECT DISTINCT
gtg.local_graph_id AS id,
gtg.title_cache AS title
FROM graph_templates_graph AS gtg
INNER JOIN graph_templates_item AS gti
ON gtg.local_graph_id=gti.local_graph_id
INNER JOIN data_template_rrd AS dtr
ON gti.task_item_id=dtr.id
WHERE gtg.local_graph_id in (?)',
array(implode(',',$query_ids)));
$result .= $matches[1] . " 0 ? '%2C' : '') . $query_id;
$title .= ($title != '' ? ', ':'') . html_escape((isset($queryDescriptions[$query_id]) ? $queryDescriptions[$query_id]:$query_id));
$i++;
}
$result .= html_escape($graph_add) . '\'>' . $title . '' . $matches[3];
}
return $result;
}
function clog_regex_graphtemplates($matches) {
global $config;
$result = $matches[0];
$query_ids = explode(',',str_replace(" ","",$matches[2]));
if (cacti_sizeof($query_ids)) {
$result = '';
$querys = db_fetch_assoc_prepared('SELECT id, name
FROM graph_templates
WHERE id in (?)',
array(implode(',',$query_ids)));
$queryDescriptions = array();
if (cacti_sizeof($querys)) {
foreach ($querys as $query) {
$queryDescriptions[$query['id']] = html_escape($query['name']);
}
}
foreach ($query_ids as $query_id) {
$result .= $matches[1].'' . (isset($queryDescriptions[$query_id]) ? $queryDescriptions[$query_id]:$query_id) . '' . $matches[3];
}
}
return $result;
}