363 lines
12 KiB
PHP
363 lines
12 KiB
PHP
<?php
|
|
/**
|
|
* Extension to self monitor Pandora FMS Console
|
|
*
|
|
* @category Main page
|
|
* @package Pandora FMS
|
|
* @subpackage Introduction
|
|
* @version 1.0.0
|
|
* @license See below
|
|
*
|
|
* ______ ___ _______ _______ ________
|
|
* | __ \.-----.--.--.--| |.-----.----.-----. | ___| | | __|
|
|
* | __/| _ | | _ || _ | _| _ | | ___| |__ |
|
|
* |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______|
|
|
*
|
|
* ============================================================================
|
|
* Copyright (c) 2005-2023 Pandora FMS
|
|
* Please see http://pandorafms.org for full contribution list
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation for version 2.
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
* ============================================================================
|
|
*/
|
|
|
|
// Config functions.
|
|
require_once 'include/config.php';
|
|
|
|
// This solves problems in enterprise load.
|
|
global $config;
|
|
|
|
check_login();
|
|
// ACL Check.
|
|
if (check_acl($config['id_user'], 0, 'AR') === 0) {
|
|
db_pandora_audit(
|
|
AUDIT_LOG_ACL_VIOLATION,
|
|
'Trying to access Default view'
|
|
);
|
|
include 'general/noaccess.php';
|
|
exit;
|
|
}
|
|
|
|
require_once 'include/functions_reporting.php';
|
|
require_once 'include/functions_tactical.php';
|
|
require_once $config['homedir'].'/include/functions_graph.php';
|
|
|
|
if (tags_has_user_acl_tags()) {
|
|
ui_print_tags_warning();
|
|
}
|
|
|
|
$all_data = tactical_status_modules_agents(
|
|
$config['id_user'],
|
|
false,
|
|
'AR'
|
|
);
|
|
$data = [];
|
|
|
|
$data['monitor_not_init'] = (int) $all_data['_monitors_not_init_'];
|
|
$data['monitor_unknown'] = (int) $all_data['_monitors_unknown_'];
|
|
$data['monitor_ok'] = (int) $all_data['_monitors_ok_'];
|
|
$data['monitor_warning'] = (int) $all_data['_monitors_warning_'];
|
|
$data['monitor_critical'] = (int) $all_data['_monitors_critical_'];
|
|
$data['monitor_not_normal'] = (int) $all_data['_monitor_not_normal_'];
|
|
$data['monitor_alerts'] = (int) $all_data['_monitors_alerts_'];
|
|
$data['monitor_alerts_fired'] = (int) $all_data['_monitors_alerts_fired_'];
|
|
$data['monitor_total'] = (int) $all_data['_monitor_total_'];
|
|
|
|
|
|
$data['total_agents'] = (int) $all_data['_total_agents_'];
|
|
|
|
$data['monitor_checks'] = (int) $all_data['_monitor_checks_'];
|
|
if (!empty($all_data)) {
|
|
if ($data['monitor_not_normal'] > 0 && $data['monitor_checks'] > 0) {
|
|
$data['monitor_health'] = format_numeric((100 - ($data['monitor_not_normal'] / ($data['monitor_checks'] / 100))), 1);
|
|
} else {
|
|
$data['monitor_health'] = 100;
|
|
}
|
|
|
|
if ($data['monitor_not_init'] > 0 && $data['monitor_checks'] > 0) {
|
|
$data['module_sanity'] = format_numeric((100 - ($data['monitor_not_init'] / ($data['monitor_checks'] / 100))), 1);
|
|
} else {
|
|
$data['module_sanity'] = 100;
|
|
}
|
|
|
|
if (isset($data['alerts'])) {
|
|
if ($data['monitor_alerts_fired'] > 0 && $data['alerts'] > 0) {
|
|
$data['alert_level'] = format_numeric((100 - ($data['monitor_alerts_fired'] / ($data['alerts'] / 100))), 1);
|
|
} else {
|
|
$data['alert_level'] = 100;
|
|
}
|
|
} else {
|
|
$data['alert_level'] = 100;
|
|
$data['alerts'] = 0;
|
|
}
|
|
|
|
$data['monitor_bad'] = ($data['monitor_critical'] + $data['monitor_warning']);
|
|
|
|
if ($data['monitor_bad'] > 0 && $data['monitor_checks'] > 0) {
|
|
$data['global_health'] = format_numeric((100 - ($data['monitor_bad'] / ($data['monitor_checks'] / 100))), 1);
|
|
} else {
|
|
$data['global_health'] = 100;
|
|
}
|
|
|
|
$data['server_sanity'] = format_numeric((100 - $data['module_sanity']), 1);
|
|
}
|
|
|
|
ui_require_css_file('logon');
|
|
|
|
echo '<div id="welcome_panel">';
|
|
|
|
//
|
|
// Overview Table.
|
|
//
|
|
$table = new stdClass();
|
|
$table->class = 'no-class';
|
|
$table->cellpadding = 4;
|
|
$table->cellspacing = 4;
|
|
$table->head = [];
|
|
$table->data = [];
|
|
$table->headstyle[0] = 'text-align:center;';
|
|
$table->width = '100%';
|
|
$table->head_colspan[0] = 4;
|
|
|
|
// Indicators.
|
|
$tdata = [];
|
|
$stats = reporting_get_stats_indicators($data, 120, 10, false);
|
|
$status = '<table class="status_tactical">';
|
|
foreach ($stats as $stat) {
|
|
$status .= '<tr><td><b>'.$stat['title'].'</b></td><td>'.$stat['graph'].'</td></tr>';
|
|
}
|
|
|
|
$status .= '</table>';
|
|
$table->rowclass = [];
|
|
$table->rowclass[0] = 'w100p';
|
|
$table->rowclass[1] = 'w100p';
|
|
$table->rowclass[2] = 'w100p';
|
|
$table->rowclass[3] = 'w100p';
|
|
$table->rowclass[4] = 'w100p';
|
|
$table->rowclass[5] = 'w100p';
|
|
$table->data[0][0] = $status;
|
|
|
|
$table->data[] = $tdata;
|
|
|
|
// Alerts.
|
|
$tdata = [];
|
|
$tdata[0] = reporting_get_stats_alerts($data);
|
|
$table->rowclass[] = '';
|
|
$table->data[] = $tdata;
|
|
|
|
// Modules by status.
|
|
$tdata = [];
|
|
|
|
$data_agents = [
|
|
__('Critical') => $data['monitor_critical'],
|
|
__('Warning') => $data['monitor_warning'],
|
|
__('Normal') => $data['monitor_ok'],
|
|
__('Unknown') => $data['monitor_unknown'],
|
|
__('Not init') => $data['monitor_not_init'],
|
|
];
|
|
|
|
$tdata[0] = reporting_get_stats_modules_status($data, 180, 100, false, $data_agents);
|
|
$table->rowclass[] = '';
|
|
$table->data[] = $tdata;
|
|
|
|
// Total agents and modules.
|
|
$tdata = [];
|
|
$tdata[0] = reporting_get_stats_agents_monitors($data);
|
|
$table->rowclass[] = '';
|
|
$table->data[] = $tdata;
|
|
|
|
// Users.
|
|
if (users_is_admin() || check_acl($config['id_user'], 0, 'UM')) {
|
|
$tdata = [];
|
|
$tdata[0] = reporting_get_stats_users($data);
|
|
$table->rowclass[] = '';
|
|
$table->data[] = $tdata;
|
|
}
|
|
|
|
ui_toggle(
|
|
html_print_table($table, true),
|
|
__('%s Overview', get_product_name()),
|
|
'',
|
|
'overview',
|
|
false
|
|
);
|
|
unset($table);
|
|
|
|
echo '<div id="right">';
|
|
|
|
// News.
|
|
require_once 'general/news_dialog.php';
|
|
$options = [];
|
|
$options['id_user'] = $config['id_user'];
|
|
$options['modal'] = false;
|
|
$options['limit'] = 3;
|
|
$news = get_news($options);
|
|
|
|
|
|
if (!empty($news)) {
|
|
ui_require_css_file('news');
|
|
// NEWS BOARD.
|
|
if ($config['prominent_time'] == 'timestamp') {
|
|
$comparation_suffix = '';
|
|
} else {
|
|
$comparation_suffix = __('ago');
|
|
}
|
|
|
|
|
|
$output_news = '<div id="news_board" class="new">';
|
|
foreach ($news as $article) {
|
|
$default = false;
|
|
if ($article['text'] == '&lt;p style="text-align: center; font-size: 13px;"&gt;Hello, congratulations, if you've arrived here you already have an operational monitoring console. Remember that our forums and online documentation are available 24x7 to get you out of any trouble. You can replace this message with a personalized one at Admin tools -&amp;gt; Site news.&lt;/p&gt; ') {
|
|
$article['subject'] = __('Welcome to Pandora FMS Console');
|
|
$default = true;
|
|
}
|
|
|
|
$text_bbdd = io_safe_output($article['text']);
|
|
$text = html_entity_decode($text_bbdd);
|
|
|
|
$output_news .= '<div class="new-board">';
|
|
$output_news .= '<div class="new-board-header">';
|
|
$output_news .= '<span class="new-board-title">'.$article['subject'].'</span>';
|
|
$output_news .= '<span class="new-board-author">'.__('By').' '.$article['author'].' '.ui_print_timestamp($article['timestamp'], true).'</span>';
|
|
$output_news .= '</div>';
|
|
$output_news .= '<div class="new content">';
|
|
|
|
if ($default) {
|
|
$output_news .= '<div class="default-new">';
|
|
$output_news .= '<div class="default-image-new">';
|
|
$output_news .= '<img src="./images/welcome_image.svg" alt="img colabora con nosotros - Support">';
|
|
$output_news .= '</div><div class="default-text-new">';
|
|
|
|
$output_news .= '
|
|
<p>'.__('Welcome to our monitoring tool so grand,').'
|
|
<br>'.__('Where data insights are at your command.').'
|
|
<br>'.__('Sales, marketing, operations too,').'
|
|
<br>'.__("Customer support, we've got you.").'
|
|
</p>
|
|
|
|
<p>'.__('Our interface is user-friendly,').'
|
|
<br>'.__("Customize your dashboard, it's easy.").'
|
|
<br>'.__('Set up alerts and gain insights so keen,').'
|
|
<br>'.__("Optimize your data, like you've never seen.").'
|
|
</p>
|
|
|
|
<p>'.__('Unleash its power now, and join the pro league,').'
|
|
<br>'.__('Unlock the potential of your data to intrigue.').'
|
|
<br>'.__('Monitoring made simple, efficient and fun,').'
|
|
<br>'.__('Discover a whole new way to get things done.').'
|
|
</p>
|
|
|
|
<p>'.__('And take control of your IT once and for all.').'</p>
|
|
|
|
<span>'.__('You can replace this message with a personalized one at Admin tools -> Site news.').'</span>
|
|
';
|
|
|
|
$output_news .= '</div></div>';
|
|
} else {
|
|
$output_news .= nl2br($text);
|
|
}
|
|
|
|
$output_news .= '</div></div>';
|
|
}
|
|
|
|
$output_news .= '</div>';
|
|
|
|
// News board.
|
|
ui_toggle(
|
|
$output_news,
|
|
__('News board'),
|
|
'',
|
|
'news',
|
|
false
|
|
);
|
|
// END OF NEWS BOARD.
|
|
}
|
|
|
|
// LAST ACTIVITY.
|
|
// Show last activity from this user.
|
|
$table = new stdClass();
|
|
$table->class = 'no-td-padding info_table';
|
|
$table->cellpadding = 0;
|
|
$table->cellspacing = 0;
|
|
$table->width = '100%';
|
|
// Don't specify px.
|
|
$table->data = [];
|
|
$table->size = [];
|
|
$table->headstyle = [];
|
|
$table->size[0] = '5%';
|
|
$table->size[1] = '15%';
|
|
$table->headstyle[1] = 'min-width: 12em;';
|
|
$table->size[2] = '5%';
|
|
$table->headstyle[2] = 'min-width: 65px;';
|
|
$table->size[3] = '10%';
|
|
$table->size[4] = '25%';
|
|
$table->head = [];
|
|
$table->head[0] = __('User');
|
|
$table->head[1] = __('Action');
|
|
$table->head[2] = __('Date');
|
|
$table->head[3] = __('Source IP');
|
|
$table->head[4] = __('Comments');
|
|
$table->align[4] = 'left';
|
|
$sql = sprintf(
|
|
'SELECT id_usuario,accion, ip_origen,descripcion,utimestamp
|
|
FROM tsesion
|
|
WHERE (`utimestamp` > UNIX_TIMESTAMP(NOW()) - '.SECONDS_1WEEK.")
|
|
AND `id_usuario` = '%s' ORDER BY `utimestamp` DESC LIMIT 10",
|
|
$config['id_user']
|
|
);
|
|
|
|
|
|
$sessions = db_get_all_rows_sql($sql);
|
|
|
|
if ($sessions === false) {
|
|
$sessions = [];
|
|
}
|
|
|
|
foreach ($sessions as $session) {
|
|
$data = [];
|
|
$session_id_usuario = $session['id_usuario'];
|
|
$session_ip_origen = $session['ip_origen'];
|
|
|
|
|
|
$data[0] = '<strong>'.$session_id_usuario.'</strong>';
|
|
$data[1] = ui_print_session_action_icon($session['accion'], true).' '.$session['accion'];
|
|
$data[2] = ui_print_help_tip(
|
|
date($config['date_format'], $session['utimestamp']),
|
|
true
|
|
).human_time_comparation($session['utimestamp'], 'tiny');
|
|
$data[3] = $session_ip_origen;
|
|
$description = io_safe_output(str_replace([',', ', '], ', ', $session['descripcion']));
|
|
if (strlen($description) > 100) {
|
|
$data[4] = '<div >'.io_safe_input(substr($description, 0, 150)).'...</div>';
|
|
} else {
|
|
$data[4] = '<div >'.io_safe_input($description).'</div>';
|
|
}
|
|
|
|
array_push($table->data, $data);
|
|
}
|
|
|
|
$activity = html_print_table($table, true);
|
|
unset($table);
|
|
|
|
ui_toggle(
|
|
$activity,
|
|
__('Latest activity'),
|
|
'',
|
|
'activity',
|
|
false,
|
|
false,
|
|
'',
|
|
'white-box-content padded'
|
|
);
|
|
// END OF LAST ACTIVIYY.
|
|
// Close right panel.
|
|
echo '</div>';
|
|
|
|
// Close welcome panel.
|
|
echo '</div>';
|