455 lines
12 KiB
PHP
455 lines
12 KiB
PHP
<?php
|
|
/**
|
|
* Cluster View: View
|
|
*
|
|
* @category View
|
|
* @package Pandora FMS
|
|
* @subpackage Cluster View
|
|
* @version 1.0.0
|
|
* @license See below
|
|
*
|
|
* ______ ___ _______ _______ ________
|
|
* | __ \.-----.--.--.--| |.-----.----.-----. | ___| | | __|
|
|
* | __/| _ | | _ || _ | _| _ | | ___| |__ |
|
|
* |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______|
|
|
*
|
|
* ============================================================================
|
|
* Copyright (c) 2005-2021 Artica Soluciones Tecnologicas
|
|
* 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.
|
|
* ============================================================================
|
|
*/
|
|
|
|
ui_require_css_file('discovery');
|
|
ui_require_css_file('agent_view');
|
|
ui_require_css_file('cluster_view');
|
|
|
|
$html = new HTML();
|
|
|
|
// Begin.
|
|
// Prepare header and breadcrums.
|
|
$i = 0;
|
|
$bc = [];
|
|
|
|
$bc[] = [
|
|
'link' => $model->url,
|
|
'label' => __('Cluster list'),
|
|
'selected' => false,
|
|
];
|
|
|
|
$bc[] = [
|
|
'link' => $model->url.'&op=view&id='.$cluster->id(),
|
|
'label' => __('Cluster details'),
|
|
'selected' => true,
|
|
];
|
|
|
|
|
|
$html->prepareBreadcrum($bc);
|
|
|
|
// Header.
|
|
$main_page = '<a href="'.$model->url.'">';
|
|
$main_page .= html_print_image(
|
|
'images/list.png',
|
|
true,
|
|
[
|
|
'title' => __('Cluster list'),
|
|
'class' => 'invert_filter',
|
|
]
|
|
);
|
|
$main_page .= '</a>';
|
|
|
|
$edit = '<a href="'.$model->url.'&op=update&id='.$cluster->id().'">';
|
|
$edit .= html_print_image(
|
|
'images/setup.png',
|
|
true,
|
|
[
|
|
'title' => __('Edit this cluster'),
|
|
'class' => 'invert_filter',
|
|
]
|
|
);
|
|
$edit .= '</a>';
|
|
|
|
ui_print_page_header(
|
|
__('Cluster details').' » '.$cluster->name(),
|
|
'',
|
|
false,
|
|
// Help link.
|
|
'cluster_view',
|
|
true,
|
|
// Buttons.
|
|
[
|
|
[
|
|
'active' => false,
|
|
'text' => $main_page,
|
|
],
|
|
[
|
|
'active' => false,
|
|
'text' => $edit,
|
|
],
|
|
],
|
|
false,
|
|
'',
|
|
GENERIC_SIZE_TEXT,
|
|
'',
|
|
$html->printHeader(true)
|
|
);
|
|
|
|
|
|
if (empty($error) === false) {
|
|
echo $error;
|
|
}
|
|
|
|
if (empty($message) === false) {
|
|
echo $message;
|
|
}
|
|
|
|
if ($critical === true) {
|
|
// Print always go back button.
|
|
HTML::printForm($model->getGoBackForm(), false);
|
|
return;
|
|
}
|
|
|
|
|
|
/*
|
|
*
|
|
* All this block has been retrieved from 'estado_generalagente.php' as
|
|
* described in issue #5755.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
*
|
|
*
|
|
* CLUSTER AGENT DETAILS.
|
|
*
|
|
*/
|
|
|
|
// Prepare information for view.
|
|
$alive_animation = agents_get_status_animation(
|
|
agents_get_interval_status($cluster->agent()->toArray(), false)
|
|
);
|
|
|
|
|
|
$agent_name = ui_print_agent_name(
|
|
$cluster->agent()->id_agente(),
|
|
true,
|
|
500,
|
|
'font-size: medium;font-weight:bold',
|
|
true,
|
|
'',
|
|
'',
|
|
false,
|
|
false
|
|
);
|
|
$in_planned_downtime = db_get_sql(
|
|
'SELECT executed FROM tplanned_downtime
|
|
INNER JOIN tplanned_downtime_agents
|
|
ON tplanned_downtime.id = tplanned_downtime_agents.id_downtime
|
|
WHERE tplanned_downtime_agents.id_agent = '.$cluster->agent()->id_agente().' AND tplanned_downtime.executed = 1'
|
|
);
|
|
|
|
if ($cluster->agent()->disabled()) {
|
|
if ($in_planned_downtime) {
|
|
$agent_name = '<em>'.$agent_name.ui_print_help_tip(__('Disabled'), true);
|
|
} else {
|
|
$agent_name = '<em>'.$agent_name.'</em>'.ui_print_help_tip(__('Disabled'), true);
|
|
}
|
|
} else if ($cluster->agent()->quiet()) {
|
|
if ($in_planned_downtime) {
|
|
$agent_name = "<em'>".$agent_name.' '.html_print_image('images/dot_blue.png', true, ['border' => '0', 'title' => __('Quiet'), 'alt' => '']);
|
|
} else {
|
|
$agent_name = "<em'>".$agent_name.' '.html_print_image('images/dot_blue.png', true, ['border' => '0', 'title' => __('Quiet'), 'alt' => '']).'</em>';
|
|
}
|
|
} else {
|
|
$agent_name = $agent_name;
|
|
}
|
|
|
|
if ($in_planned_downtime && !$cluster->agent()->disabled() && !$cluster->agent()->quiet()) {
|
|
$agent_name .= '<em> '.ui_print_help_tip(
|
|
__('Agent in scheduled downtime'),
|
|
true,
|
|
'images/minireloj-16.png'
|
|
).'</em>';
|
|
} else if (($in_planned_downtime && !$cluster->agent()->disabled())
|
|
|| ($in_planned_downtime && !$cluster->agent()->quiet())
|
|
) {
|
|
$agent_name .= ' '.ui_print_help_tip(
|
|
__('Agent in scheduled downtime'),
|
|
true,
|
|
'images/minireloj-16.png'
|
|
).'</em>';
|
|
}
|
|
|
|
|
|
$table_agent_header = '<div class="agent_details_agent_alias">';
|
|
$table_agent_header .= $agent_name;
|
|
$table_agent_header .= '</div>';
|
|
$table_agent_header .= '<div class="agent_details_agent_name">';
|
|
if (!$config['show_group_name']) {
|
|
$table_agent_header .= ui_print_group_icon(
|
|
$cluster->agent()->id_grupo(),
|
|
true,
|
|
'groups_small',
|
|
'padding-right: 6px;'
|
|
);
|
|
}
|
|
|
|
$table_agent_header .= '</div>';
|
|
|
|
$status_img = agents_detail_view_status_img(
|
|
$cluster->agent()->critical_count(),
|
|
$cluster->agent()->warning_count(),
|
|
$cluster->agent()->unknown_count(),
|
|
$cluster->agent()->total_count(),
|
|
$cluster->agent()->notinit_count()
|
|
);
|
|
|
|
$table_agent_header .= '<div class="icono_right">'.$status_img.'</div>';
|
|
$table_agent_header .= ' ';
|
|
$table_agent_header .= '<a href="'.$model->url.'&op=force&id='.$cluster->id();
|
|
$table_agent_header .= '">'.html_print_image(
|
|
'images/target.png',
|
|
true,
|
|
[
|
|
'title' => __('Force cluster status calculation'),
|
|
'alt' => '',
|
|
'class' => 'invert_filter',
|
|
|
|
]
|
|
).'</a>';
|
|
// Fixed width non interactive charts.
|
|
$status_chart_width = 180;
|
|
$graph_width = 180;
|
|
|
|
$table_agent_graph = '<div id="status_pie" style="width: '.$status_chart_width.'px;">';
|
|
$table_agent_graph .= graph_agent_status(
|
|
$cluster->agent()->id_agente(),
|
|
$graph_width,
|
|
$graph_width,
|
|
true,
|
|
false,
|
|
false,
|
|
true
|
|
);
|
|
$table_agent_graph .= '</div>';
|
|
|
|
$table_agent_os = '<p>'.ui_print_os_icon(
|
|
$cluster->agent()->id_os(),
|
|
false,
|
|
true,
|
|
true,
|
|
false,
|
|
false,
|
|
false,
|
|
['title' => __('OS').': '.get_os_name($cluster->agent()->id_os())]
|
|
);
|
|
$table_agent_os .= (empty($cluster->agent()->os_version()) === true) ? get_os_name((int) $cluster->agent()->id_os()) : $cluster->agent()->os_version().'</p>';
|
|
|
|
|
|
|
|
$addresses = agents_get_addresses($cluster->agent()->id_agente());
|
|
$address = agents_get_address($cluster->agent()->id_agente());
|
|
|
|
foreach ($addresses as $k => $add) {
|
|
if ($add == $address) {
|
|
unset($addresses[$k]);
|
|
}
|
|
}
|
|
|
|
if (empty($address) === false) {
|
|
$table_agent_ip = '<p>'.html_print_image(
|
|
'images/world.png',
|
|
true,
|
|
[
|
|
'title' => __('IP address'),
|
|
'class' => 'invert_filter',
|
|
]
|
|
);
|
|
$table_agent_ip .= '<span class="align-top inline">';
|
|
$table_agent_ip .= empty($address) ? '<em>'.__('N/A').'</em>' : $address;
|
|
$table_agent_ip .= '</span></p>';
|
|
}
|
|
|
|
$table_agent_description = '<p>'.html_print_image(
|
|
'images/list.png',
|
|
true,
|
|
[
|
|
'title' => __('Description'),
|
|
'class' => 'invert_filter',
|
|
]
|
|
);
|
|
$table_agent_description .= '<span class="align-top inline">';
|
|
$table_agent_description .= empty(
|
|
$cluster->description()
|
|
) ? '<em>'.__('N/A').'</em>' : $cluster->description();
|
|
$table_agent_description .= '</span></p>';
|
|
|
|
$table_agent_count_modules = reporting_tiny_stats(
|
|
$cluster->agent()->toArray(),
|
|
true,
|
|
'agent',
|
|
// Useless.
|
|
':',
|
|
true
|
|
);
|
|
|
|
$table_agent_version = '<p>'.html_print_image(
|
|
'images/version.png',
|
|
true,
|
|
[
|
|
'title' => __('Agent Version'),
|
|
'class' => 'invert_filter',
|
|
]
|
|
);
|
|
$table_agent_version .= '<span class="align-top inline">';
|
|
$table_agent_version .= empty($cluster->agent()->agent_version()) ? '<i>'.__('Cluster agent').'</i>' : $cluster->agent()->agent_version();
|
|
$table_agent_version .= '</span></p>';
|
|
|
|
/*
|
|
*
|
|
* MAP
|
|
*
|
|
*/
|
|
|
|
$nodes = $cluster->getNodes();
|
|
|
|
$font_size = 20;
|
|
$width = '45%';
|
|
$height = '500';
|
|
$node_radius = 40;
|
|
|
|
// Generate map.
|
|
$map_manager = new NetworkMap(
|
|
[
|
|
'nodes' => $nodes,
|
|
'no_pandora_node' => 1,
|
|
'pure' => 1,
|
|
'map_options' => [
|
|
'generation_method' => LAYOUT_SPRING1,
|
|
'font_size' => $font_size,
|
|
'node_radius' => $node_radius,
|
|
'height' => $height,
|
|
'width' => '100%',
|
|
'tooltip' => true,
|
|
'size_image' => 50,
|
|
'z_dash' => 0.5,
|
|
'map_filter' => [
|
|
'node_sep' => 7,
|
|
'node_radius' => 50,
|
|
'x_offs' => 130,
|
|
'y_offs' => -70,
|
|
],
|
|
],
|
|
]
|
|
);
|
|
|
|
|
|
/*
|
|
*
|
|
* EVENTS 24h
|
|
*
|
|
*/
|
|
|
|
$table_events = '<div class="white_table_graph" id="table_events">';
|
|
$table_events .= '<div class="white_table_graph_header">';
|
|
$table_events .= html_print_image(
|
|
'images/arrow_down_green.png',
|
|
true
|
|
);
|
|
$table_events .= '<span>';
|
|
$table_events .= __('Events (Last 24h)');
|
|
$table_events .= '</span>';
|
|
$table_events .= '</div>';
|
|
$table_events .= '<div class="white_table_graph_content white-table-graph-content">';
|
|
$table_events .= graph_graphic_agentevents(
|
|
$cluster->agent()->id_agente(),
|
|
95,
|
|
70,
|
|
SECONDS_1DAY,
|
|
'',
|
|
true,
|
|
true,
|
|
500
|
|
);
|
|
$table_events .= '</div>';
|
|
$table_events .= '</div>';
|
|
|
|
?>
|
|
<div id="agent_details_first_row" class="w100p cluster-agent-data">
|
|
<div class="box-shadow agent_details_col agent_details_col_left">
|
|
<div class="agent_details_header">
|
|
<?php echo $table_agent_header; ?>
|
|
</div>
|
|
<div class="agent_details_content">
|
|
<div class="agent_details_graph">
|
|
<?php echo $table_agent_graph; ?>
|
|
<div class="agent_details_bullets">
|
|
<?php echo $table_agent_count_modules; ?>
|
|
</div>
|
|
</div>
|
|
<div class="agent_details_info">
|
|
<?php
|
|
echo $alive_animation;
|
|
echo $table_agent_os;
|
|
echo $table_agent_ip;
|
|
echo $table_agent_version;
|
|
echo $table_agent_description;
|
|
?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="box-shadow agent_details_col agent_details_col_right">
|
|
<div class="cluster-map">
|
|
<?php $map_manager->printMap(); ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="w100p cluster-events-graph">
|
|
<?php echo $table_events; ?>
|
|
</div>
|
|
|
|
<div id='cluster-modules' class="w100p modules">
|
|
<?php
|
|
$id_agente = $cluster->agent()->id_agente();
|
|
require_once $config['homedir'].'/operation/agentes/estado_monitores.php';
|
|
?>
|
|
</div>
|
|
|
|
|
|
<?php
|
|
HTML::printForm(
|
|
[
|
|
'form' => [
|
|
'action' => $model->url.'&op=view&id='.$cluster->id(),
|
|
'method' => 'POST',
|
|
],
|
|
'inputs' => [
|
|
[
|
|
'arguments' => [
|
|
'name' => 'submit',
|
|
'label' => __('Reload'),
|
|
'type' => 'submit',
|
|
'attributes' => 'class="sub cancel"',
|
|
'return' => true,
|
|
],
|
|
],
|
|
],
|
|
],
|
|
false
|
|
);
|
|
|
|
echo '<br/>';
|
|
|
|
// Print always go back button.
|
|
HTML::printForm($model->getGoBackForm(), false);
|