Merge branch 'ent-12032-refactoring-visual-de-la-vista-de-clusters' into 'develop'
refactor cluster view pandora_enterprise#12032 See merge request artica/pandorafms!6476
This commit is contained in:
commit
03700d2653
|
@ -2092,7 +2092,6 @@ if ($create_module) {
|
|||
|
||||
if ($disable_module) {
|
||||
|
||||
hd($disable_module, true);
|
||||
$result = modules_change_disabled($disable_module, 1);
|
||||
$module_name = modules_get_agentmodule_name($disable_module);
|
||||
|
||||
|
@ -2116,13 +2115,11 @@ if ($create_module) {
|
|||
|
||||
|
||||
if ($result === NOERR) {
|
||||
hd($disable_module, true);
|
||||
db_pandora_audit(
|
||||
AUDIT_LOG_MODULE_MANAGEMENT,
|
||||
'Disable #'.$disable_module.' | '.$module_name.' | '.io_safe_output($agent['alias'])
|
||||
);
|
||||
} else {
|
||||
hd($disable_module, true);
|
||||
db_pandora_audit(
|
||||
AUDIT_LOG_MODULE_MANAGEMENT,
|
||||
'Fail to disable #'.$disable_module.' | '.$module_name.' | '.io_safe_output($agent['alias'])
|
||||
|
|
|
@ -751,6 +751,10 @@ if ($agents !== false) {
|
|||
'index.php?sec=reporting&sec2=operation/cluster/cluster&op=view&id=%s',
|
||||
$cluster->id()
|
||||
);
|
||||
$agentAlertUrl = sprintf(
|
||||
'index.php?sec=estado&sec2=operation/cluster/cluster&op=update&id=%s&page=6',
|
||||
$cluster->id()
|
||||
);
|
||||
} else {
|
||||
$main_tab = ($check_aw === true) ? 'main' : 'module';
|
||||
$agentNameUrl = sprintf(
|
||||
|
@ -762,6 +766,10 @@ if ($agents !== false) {
|
|||
'index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=%s',
|
||||
$agent['id_agente']
|
||||
);
|
||||
$agentAlertUrl = sprintf(
|
||||
'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=alert&id_agente=%s',
|
||||
$agent['id_agente']
|
||||
);
|
||||
}
|
||||
|
||||
if (empty($agent['alias']) === true) {
|
||||
|
@ -825,7 +833,7 @@ if ($agents !== false) {
|
|||
);
|
||||
}
|
||||
|
||||
if ((int) $agent['id_os'] !== 100) {
|
||||
if ((int) $agent['id_os'] != CLUSTER_OS_ID) {
|
||||
$additionalOptionsAgentName[] = html_print_anchor(
|
||||
[
|
||||
'href' => ui_get_full_url('index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=module&id_agente='.$agent['id_agente']),
|
||||
|
@ -837,7 +845,7 @@ if ($agents !== false) {
|
|||
|
||||
$additionalOptionsAgentName[] = html_print_anchor(
|
||||
[
|
||||
'href' => ui_get_full_url('index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=alert&id_agente='.$agent['id_agente']),
|
||||
'href' => ui_get_full_url($agentAlertUrl),
|
||||
'content' => __('Alerts'),
|
||||
],
|
||||
true
|
||||
|
@ -942,7 +950,7 @@ if ($agents !== false) {
|
|||
$os
|
||||
)
|
||||
),
|
||||
'onClick' => ($agent['id_os'] === CLUSTER_OS_ID) ? sprintf('if (!confirm(\'%s\')) return false', $agentDisableEnableCaption) : 'return true;',
|
||||
'onClick' => ($agent['id_os'] == CLUSTER_OS_ID) ? sprintf('if (!confirm(\'%s\')) return false', $agentDisableEnableCaption) : 'return true;',
|
||||
'image' => sprintf('images/%s', $agentDisableEnableIcon),
|
||||
'title' => $agentDisableEnableTitle,
|
||||
],
|
||||
|
@ -950,7 +958,7 @@ if ($agents !== false) {
|
|||
);
|
||||
|
||||
if ($check_aw === true && is_management_allowed() === true) {
|
||||
if ($agent['id_os'] !== CLUSTER_OS_ID) {
|
||||
if ($agent['id_os'] != CLUSTER_OS_ID) {
|
||||
$onClickActionDeleteAgent = 'if (!confirm(\' '.__('Are you sure?').'\')) return false;';
|
||||
} else {
|
||||
$onClickActionDeleteAgent = 'if (!confirm(\' '.__('WARNING! - You are going to delete a cluster agent. Are you sure?').'\')) return false;';
|
||||
|
|
|
@ -206,9 +206,10 @@ $table->data[2][0] = html_print_label_input_block(
|
|||
|
||||
if (isset($step) === false) {
|
||||
echo '<form id="form_alerts" class="add_alert_form max_floating_element_size" method="post">';
|
||||
html_print_table($table);
|
||||
}
|
||||
|
||||
html_print_table($table);
|
||||
|
||||
if (isset($step) === false) {
|
||||
$output = '';
|
||||
|
||||
|
|
|
@ -620,7 +620,21 @@ foreach ($simple_alerts as $alert) {
|
|||
$main_tab = 'module';
|
||||
}
|
||||
|
||||
$data[0] = '<a href="index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab='.$main_tab.'&id_agente='.$id_agent.'">';
|
||||
if ((int) agents_get_os($id_agent) === CLUSTER_OS_ID) {
|
||||
$cluster = PandoraFMS\Cluster::loadFromAgentId($id_agent);
|
||||
$agentAlertUrl = sprintf(
|
||||
'index.php?sec=estado&sec2=operation/cluster/cluster&op=update&id=%s&page=6',
|
||||
$cluster->id()
|
||||
);
|
||||
} else {
|
||||
$agentAlertUrl = sprintf(
|
||||
'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=%s&id_agente=%s',
|
||||
$main_tab,
|
||||
$id_agent
|
||||
);
|
||||
}
|
||||
|
||||
$data[0] = '<a href="'.$agentAlertUrl.'">';
|
||||
|
||||
if ($alert['disabled']) {
|
||||
$data[0] .= '<span class="italic_a">';
|
||||
|
|
|
@ -650,6 +650,11 @@ if ($id_agente) {
|
|||
echo $messageAction;
|
||||
|
||||
include_once 'godmode/alerts/alert_list.list.php';
|
||||
|
||||
if (isset($step) === true && $step === true) {
|
||||
return;
|
||||
}
|
||||
|
||||
$all_groups = agents_get_all_groups_agent($id_agente, $agent['id_grupo']);
|
||||
if (check_acl_one_of_groups($config['id_user'], $all_groups, 'LW') || check_acl_one_of_groups($config['id_user'], $all_groups, 'LM')) {
|
||||
include_once 'godmode/alerts/alert_list.builder.php';
|
||||
|
|
|
@ -80,6 +80,7 @@ if (check_login()) {
|
|||
$save_monitor_filter = get_parameter('save_monitor_filter', 0);
|
||||
$update_monitor_filter = get_parameter('update_monitor_filter', 0);
|
||||
$delete_monitor_filter = get_parameter('delete_monitor_filter', 0);
|
||||
$get_cluster_module_detail = (bool) get_parameter('get_cluster_module_detail', 0);
|
||||
|
||||
if ($get_agent_modules_json_by_name === true) {
|
||||
$agent_name = get_parameter('agent_name');
|
||||
|
@ -742,13 +743,6 @@ if (check_login()) {
|
|||
include_once $config['homedir'].'/include/functions_tags.php';
|
||||
include_once $config['homedir'].'/include/functions_clippy.php';
|
||||
|
||||
|
||||
// Disable module edition in cluster module list.
|
||||
$cluster_view = (bool) preg_match(
|
||||
'/operation\/cluster\/cluster/',
|
||||
$_SERVER['HTTP_REFERER']
|
||||
);
|
||||
|
||||
$agent_a = (bool) check_acl($config['id_user'], 0, 'AR');
|
||||
$agent_w = (bool) check_acl($config['id_user'], 0, 'AW');
|
||||
$access = ($agent_a === true) ? 'AR' : (($agent_w === true) ? 'AW' : 'AR');
|
||||
|
@ -758,7 +752,19 @@ if (check_login()) {
|
|||
$cluster_list = (int) get_parameter('cluster_list');
|
||||
$sortField = (string) get_parameter('sort_field');
|
||||
$sort = (string) get_parameter('sort', 'none');
|
||||
|
||||
// Disable module edition in cluster module list.
|
||||
$cluster_view = false;
|
||||
$url = 'index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$id_agent;
|
||||
if ((int) agents_get_os($id_agent) === CLUSTER_OS_ID) {
|
||||
$cluster = PandoraFMS\Cluster::loadFromAgentId($id_agent);
|
||||
$url = sprintf(
|
||||
'index.php?sec=estado&sec2=operation/cluster/cluster&op=view&id=%s',
|
||||
$cluster->id()
|
||||
);
|
||||
$cluster_view = true;
|
||||
}
|
||||
|
||||
$selectTypeUp = false;
|
||||
$selectTypeDown = false;
|
||||
$selectNameUp = false;
|
||||
|
@ -1248,7 +1254,6 @@ if (check_login()) {
|
|||
$graph_type = return_graphtype($module['id_tipo_modulo']);
|
||||
$nombre_tipo_modulo = modules_get_moduletype_name($module['id_tipo_modulo']);
|
||||
$handle = 'stat'.$nombre_tipo_modulo.'_'.$module['id_agente_modulo'];
|
||||
$url = 'include/procesos.php?agente='.$module['id_agente_modulo'];
|
||||
$win_handle = dechex(crc32($module['id_agente_modulo'].$module['nombre']));
|
||||
// Show events for boolean modules by default.
|
||||
$draw_events = ($graph_type === 'boolean') ? 1 : 0;
|
||||
|
@ -1314,6 +1319,23 @@ if (check_login()) {
|
|||
true
|
||||
);
|
||||
|
||||
if ($cluster_view === true) {
|
||||
$graphButtons[] = html_print_anchor(
|
||||
[
|
||||
'href' => 'javascript: show_cluster_module_detail('.$cluster->id().', \''.$modules_get_agentmodule_name.'\')',
|
||||
'content' => html_print_image(
|
||||
'images/plus@svg.svg',
|
||||
true,
|
||||
[
|
||||
'title' => __('Module cluster detail'),
|
||||
'class' => 'main_menu_icon forced_title',
|
||||
]
|
||||
),
|
||||
],
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
$data[8] = html_print_div(
|
||||
[
|
||||
'class' => 'table_action_buttons',
|
||||
|
@ -1340,7 +1362,7 @@ if (check_login()) {
|
|||
|
||||
$moduleActionButtons[] = html_print_anchor(
|
||||
[
|
||||
'href' => 'index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$id_agente.'&id_agente_modulo='.$module['id_agente_modulo'].'&refr=60'.$additionalLinkAction.'"',
|
||||
'href' => $url.'&id_agente_modulo='.$module['id_agente_modulo'].'&refr=60'.$additionalLinkAction.'"',
|
||||
'content' => html_print_image(
|
||||
$imgaction,
|
||||
true,
|
||||
|
@ -1756,14 +1778,75 @@ if (check_login()) {
|
|||
return;
|
||||
}
|
||||
|
||||
if ($get_cluster_module_detail === true) {
|
||||
global $config;
|
||||
$data = [];
|
||||
|
||||
$cluster_id = get_parameter('cluster_id', 0);
|
||||
$cluster = new PandoraFMS\Cluster($cluster_id);
|
||||
$modules_ids = $cluster->getIdsModulesInvolved();
|
||||
$module_name = get_parameter('module_name', '');
|
||||
|
||||
try {
|
||||
$column_names = [
|
||||
__('Module name'),
|
||||
__('Agent'),
|
||||
__('Last status change'),
|
||||
__('Status'),
|
||||
];
|
||||
|
||||
$columns = [
|
||||
'nombre',
|
||||
'alias',
|
||||
'last_status_change',
|
||||
'estado',
|
||||
];
|
||||
|
||||
$tableId = 'ModuleByStatus';
|
||||
// Load datatables user interface.
|
||||
ui_print_datatable(
|
||||
[
|
||||
'id' => $tableId,
|
||||
'class' => 'info_table align-left-important',
|
||||
'style' => 'width: 100%',
|
||||
'columns' => $columns,
|
||||
'column_names' => $column_names,
|
||||
'ajax_url' => 'include/ajax/module',
|
||||
'ajax_data' => [
|
||||
'get_data_ModulesByStatus' => 1,
|
||||
'table_id' => $tableId,
|
||||
'module_name' => $module_name,
|
||||
'modules_ids' => $modules_ids,
|
||||
'search' => '',
|
||||
],
|
||||
'default_pagination' => 5,
|
||||
'order' => [
|
||||
'field' => 'last_status_change',
|
||||
'direction' => 'desc',
|
||||
],
|
||||
'csv' => 0,
|
||||
'dom_elements' => 'frtip',
|
||||
'no_move_elements_to_action' => true,
|
||||
'mini_pagination' => true,
|
||||
]
|
||||
);
|
||||
} catch (\Exception $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ($get_data_ModulesByStatus === true) {
|
||||
global $config;
|
||||
$data = [];
|
||||
|
||||
$table_id = get_parameter('table_id', '');
|
||||
$search = get_parameter('search', '');
|
||||
$module_name = get_parameter('module_name', '');
|
||||
$status = get_parameter('status', '');
|
||||
$start = get_parameter('start', 0);
|
||||
$modules_ids = get_parameter('modules_ids', []);
|
||||
$length = get_parameter('length', $config['block_size']);
|
||||
// There is a limit of (2^32)^2 (18446744073709551615) rows in a MyISAM table, show for show all use max nrows.
|
||||
$length = ($length != '-1') ? $length : '18446744073709551615';
|
||||
|
@ -1771,12 +1854,11 @@ if (check_login()) {
|
|||
$nodes = get_parameter('nodes', 0);
|
||||
$disabled_modules = (bool) get_parameter('disabled_modules', false);
|
||||
|
||||
$where = '';
|
||||
$where = '1=1';
|
||||
$recordsTotal = 0;
|
||||
|
||||
|
||||
if (empty($search) === false) {
|
||||
$where = 'tagente_modulo.nombre LIKE "%%'.$search.'%%" AND ';
|
||||
$where .= ' AND tagente_modulo.nombre LIKE "%%'.$search.'%%"';
|
||||
}
|
||||
|
||||
if (str_contains($status, '6') === true) {
|
||||
|
@ -1791,16 +1873,32 @@ if (check_login()) {
|
|||
$status = implode(',', $expl);
|
||||
}
|
||||
|
||||
$where .= sprintf(
|
||||
'tagente_estado.estado IN (%s)
|
||||
AND tagente_modulo.delete_pending = 0',
|
||||
$status,
|
||||
);
|
||||
if (empty($status) === false) {
|
||||
$where .= sprintf(
|
||||
' AND tagente_estado.estado IN (%s)
|
||||
AND tagente_modulo.delete_pending = 0',
|
||||
$status,
|
||||
);
|
||||
}
|
||||
|
||||
if ($disabled_modules === false) {
|
||||
$where .= ' AND tagente_modulo.disabled = 0';
|
||||
}
|
||||
|
||||
if (empty($modules_ids) === false && is_array($modules_ids) === true) {
|
||||
$where .= sprintf(
|
||||
' AND tagente_modulo.id_agente_modulo IN (%s)',
|
||||
implode(',', $modules_ids)
|
||||
);
|
||||
}
|
||||
|
||||
if (empty($module_name) === false) {
|
||||
$where .= sprintf(
|
||||
' AND tagente_modulo.nombre = "%s"',
|
||||
$module_name
|
||||
);
|
||||
}
|
||||
|
||||
if (is_metaconsole() === false) {
|
||||
$order_by = '';
|
||||
switch ($order['field']) {
|
||||
|
|
|
@ -1261,4 +1261,51 @@ var simTree_'.$target.';
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Build Steps.
|
||||
*
|
||||
* @param array $steps Steps.
|
||||
* @param null|boolean $return Output mode.
|
||||
*
|
||||
* @return string.
|
||||
*/
|
||||
public static function printSteps(array $steps, ?bool $return=false)
|
||||
{
|
||||
$i = 1;
|
||||
|
||||
$count = count($steps);
|
||||
$output = '<ol class="steps">';
|
||||
foreach ($steps as $step) {
|
||||
$class = '';
|
||||
if ((int) $step['selected'] === 1) {
|
||||
$class = 'current';
|
||||
}
|
||||
|
||||
if ($i === 1) {
|
||||
$class .= ' first';
|
||||
}
|
||||
|
||||
if ($i === $count) {
|
||||
$class .= ' last';
|
||||
}
|
||||
|
||||
$output .= '<li class="'.$class.'">';
|
||||
$output .= '<a href="'.$step['link'].'">';
|
||||
$output .= __('Step').' '.$i.' » ';
|
||||
$output .= '<span>'.$step['label'].'</span>';
|
||||
$output .= '</a>';
|
||||
$output .= '</li>';
|
||||
$i++;
|
||||
}
|
||||
|
||||
$output .= '</ol>';
|
||||
|
||||
if ($return === true) {
|
||||
return $output;
|
||||
}
|
||||
|
||||
echo $output;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -3179,6 +3179,38 @@ function agents_detail_view_status_img($critical, $warning, $unknown, $total, $n
|
|||
}
|
||||
|
||||
|
||||
// Returns the status div to display agent detail view
|
||||
function agents_detail_view_status_div($critical, $warning, $unknown, $total, $notinit)
|
||||
{
|
||||
if ($total == 0 || $total == $notinit) {
|
||||
return ui_print_status_agent_div(
|
||||
AGENT_STATUS_NOT_INIT,
|
||||
__('No Monitors')
|
||||
);
|
||||
} else if ($critical > 0) {
|
||||
return ui_print_status_agent_div(
|
||||
AGENT_STATUS_CRITICAL,
|
||||
__('At least one module in CRITICAL status')
|
||||
);
|
||||
} else if ($warning > 0) {
|
||||
return ui_print_status_agent_div(
|
||||
AGENT_STATUS_WARNING,
|
||||
__('At least one module in WARNING status')
|
||||
);
|
||||
} else if ($unknown > 0) {
|
||||
return ui_print_status_agent_div(
|
||||
AGENT_STATUS_UNKNOWN,
|
||||
__('At least one module is in UKNOWN status')
|
||||
);
|
||||
} else {
|
||||
return ui_print_status_agent_div(
|
||||
AGENT_STATUS_NORMAL,
|
||||
__('All Monitors OK')
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function agents_update_gis(
|
||||
$idAgente,
|
||||
$latitude,
|
||||
|
@ -4386,23 +4418,26 @@ function agents_get_offspring(int $id_agent)
|
|||
}
|
||||
|
||||
|
||||
function agents_get_starmap(int $id_agent, float $width=0, float $height=0)
|
||||
{
|
||||
function agents_get_starmap(
|
||||
int $id_agent,
|
||||
float $width=0,
|
||||
float $height=0,
|
||||
?array $all_modules=null
|
||||
) {
|
||||
ui_require_css_file('heatmap');
|
||||
|
||||
$all_modules = agents_get_modules($id_agent, 'id_agente_modulo', ['disabled' => 0]);
|
||||
if (empty($all_modules)) {
|
||||
return null;
|
||||
if (empty($all_modules) === true) {
|
||||
$all_modules = agents_get_modules($id_agent, 'id_agente_modulo', ['disabled' => 0]);
|
||||
if (empty($all_modules)) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
$total_modules = count($all_modules);
|
||||
|
||||
if ($width !== 0 && $height !== 0) {
|
||||
$measuresProvided = false;
|
||||
$width = 200;
|
||||
$height = 50;
|
||||
} else {
|
||||
$measuresProvided = true;
|
||||
}
|
||||
|
||||
// Best square.
|
||||
|
@ -4421,7 +4456,6 @@ function agents_get_starmap(int $id_agent, float $width=0, float $height=0)
|
|||
|
||||
$square_length = min(($width / floor($width / $low)), ($height / floor($height / $low)));
|
||||
|
||||
// $measureSymbol = ($measuresProvided === true) ? '' : '%';
|
||||
// Print starmap.
|
||||
$html = sprintf(
|
||||
'<svg id="svg_%s" style="width: %spx; height: %spx;">',
|
||||
|
@ -4544,4 +4578,290 @@ function agents_get_starmap(int $id_agent, float $width=0, float $height=0)
|
|||
function hash_agent_name(string $alias, string $nombre_agente)
|
||||
{
|
||||
return hash('sha256', $alias.'|'.$nombre_agente.'|'.time().'|'.sprintf('%04d', rand(0, 10000)));
|
||||
}
|
||||
|
||||
|
||||
function get_resume_agent_status_header($agent)
|
||||
{
|
||||
global $config;
|
||||
|
||||
$agentCaptionAddedMessage = [];
|
||||
$agentCaption = '<span class="subsection_header_title">'.ucfirst(agents_get_alias($agent['id_agente'])).'</span>';
|
||||
$in_planned_downtime = (bool) 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 = '.$agent['id_agente'].' AND tplanned_downtime.executed = 1'
|
||||
);
|
||||
|
||||
if ((bool) $agent['disabled'] === true) {
|
||||
$agentCaptionAddedMessage[] = __('Disabled');
|
||||
} else if ((bool) $agent['quiet'] === true) {
|
||||
$agentCaptionAddedMessage[] = __('Quiet');
|
||||
}
|
||||
|
||||
if ($in_planned_downtime === true) {
|
||||
$agentCaptionAddedMessage[] = __('In scheduled downtime');
|
||||
}
|
||||
|
||||
if (empty($agentCaptionAddedMessage) === false) {
|
||||
$agentCaption .= ' <span class="result_info_text">('.implode(' - ', $agentCaptionAddedMessage).')</span>';
|
||||
}
|
||||
|
||||
$agentIconGroup = ((bool) $config['show_group_name'] === false) ? ui_print_group_icon(
|
||||
$agent['id_grupo'],
|
||||
true,
|
||||
'',
|
||||
'padding-right: 6px;',
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
'',
|
||||
true
|
||||
) : '';
|
||||
|
||||
$agentIconStatus = agents_detail_view_status_img(
|
||||
$agent['critical_count'],
|
||||
$agent['warning_count'],
|
||||
$agent['unknown_count'],
|
||||
$agent['total_count'],
|
||||
$agent['notinit_count']
|
||||
);
|
||||
|
||||
$agent_details_agent_caption = html_print_div(
|
||||
[
|
||||
'class' => 'agent_details_agent_caption',
|
||||
'content' => $agentCaption,
|
||||
],
|
||||
true
|
||||
);
|
||||
|
||||
$agent_details_agent_data = html_print_div(
|
||||
[
|
||||
'class' => 'agent_details_agent_data',
|
||||
'content' => $agentIconGroup,
|
||||
],
|
||||
true
|
||||
);
|
||||
|
||||
$agent_details_agent_status_image = html_print_div(
|
||||
[
|
||||
'class' => 'icono_right',
|
||||
'content' => $agentIconStatus,
|
||||
],
|
||||
true
|
||||
);
|
||||
|
||||
$agentStatusHeader = html_print_div(
|
||||
[
|
||||
'class' => 'agent_details_header',
|
||||
'content' => $agent_details_agent_caption.$agent_details_agent_data.$agent_details_agent_status_image,
|
||||
],
|
||||
true
|
||||
);
|
||||
|
||||
return $agentStatusHeader;
|
||||
}
|
||||
|
||||
|
||||
function get_status_agent_chart_pie($id_agente, $graph_width, $data=null)
|
||||
{
|
||||
// Fixed width non interactive charts.
|
||||
$agentStatusGraph = html_print_div(
|
||||
[
|
||||
'id' => 'status_pie',
|
||||
'style' => 'width: '.$graph_width.'px;',
|
||||
'content' => graph_agent_status(
|
||||
$id_agente,
|
||||
$graph_width,
|
||||
$graph_width,
|
||||
true,
|
||||
true,
|
||||
(empty($data) === true) ? false : $data,
|
||||
true
|
||||
),
|
||||
],
|
||||
true
|
||||
);
|
||||
|
||||
return $agentStatusGraph;
|
||||
}
|
||||
|
||||
|
||||
function get_resume_agent_concat($id_agente, $all_groups, $agent)
|
||||
{
|
||||
global $config;
|
||||
|
||||
$table_contact = new stdClass();
|
||||
$table_contact->id = 'agent_contact_main';
|
||||
$table_contact->width = '100%';
|
||||
$table_contact->cellspacing = 0;
|
||||
$table_contact->cellpadding = 0;
|
||||
$table_contact->class = 'floating_form';
|
||||
$table_contact->style[0] = 'height: 32px; width: 30%; padding-right: 5px; text-align: end; vertical-align: top';
|
||||
$table_contact->style[1] = 'height: 32px; width: 70%; padding-left: 5px; font-weight: lighter; vertical-align: top';
|
||||
|
||||
$agentContactCaption = html_print_div(
|
||||
[
|
||||
'class' => 'agent_details_agent_caption',
|
||||
'content' => '<span class="subsection_header_title">'.__('Agent contact').'</span>',
|
||||
],
|
||||
true
|
||||
);
|
||||
|
||||
if ($agent['id_os'] == CLUSTER_OS_ID) {
|
||||
$cluster = PandoraFMS\Cluster::loadFromAgentId(
|
||||
$agent['id_agente']
|
||||
);
|
||||
$url = 'index.php?sec=reporting&sec2=';
|
||||
$url .= 'operation/cluster/cluster';
|
||||
$url .= '&op=view&id='.$cluster->id();
|
||||
} else {
|
||||
$url = 'index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$agent['id_agente'];
|
||||
}
|
||||
|
||||
$buttonsRefreshAgent = html_print_button(
|
||||
__('Refresh data'),
|
||||
'refresh_data',
|
||||
false,
|
||||
'window.location.assign("'.$url.'&refr=60")',
|
||||
[ 'mode' => 'link' ],
|
||||
true
|
||||
);
|
||||
|
||||
if (check_acl_one_of_groups($config['id_user'], $all_groups, 'AW') === true) {
|
||||
$buttonsRefreshAgent .= html_print_button(
|
||||
__('Force checks'),
|
||||
'force_checks',
|
||||
false,
|
||||
'window.location.assign("'.$url.'&flag_agent=1")',
|
||||
[ 'mode' => 'link' ],
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
$buttons_refresh_agent_view = html_print_div(
|
||||
[
|
||||
'class' => 'buttons_agent_view',
|
||||
'content' => $buttonsRefreshAgent,
|
||||
],
|
||||
true
|
||||
);
|
||||
|
||||
// Data for agent contact.
|
||||
$intervalHumanTime = human_time_description_raw($agent['intervalo']);
|
||||
$lastContactDate = ui_print_timestamp($agent['ultimo_contacto'], true);
|
||||
$remoteContactDate = ($agent['ultimo_contacto_remoto'] === '01-01-1970 00:00:00') ? __('Never') : date_w_fixed_tz($agent['ultimo_contacto_remoto']);
|
||||
$lastAndRemoteContact = sprintf('%s / %s', $lastContactDate, $remoteContactDate);
|
||||
$progress = agents_get_next_contact($id_agente);
|
||||
$tempTimeToShow = ($agent['intervalo'] - (strtotime('now') - strtotime($agent['ultimo_contacto'])));
|
||||
$progressCaption = ($tempTimeToShow >= 0) ? sprintf('%d s', $tempTimeToShow) : __('Out of bounds');
|
||||
$ajaxNextContactInterval = (empty($agent['intervalo']) === true) ? 0 : (100 / $agent['intervalo']);
|
||||
$secondary_groups = enterprise_hook('agents_get_secondary_groups', [$id_agente]);
|
||||
$secondaryLinks = [];
|
||||
if (empty($secondary_groups['for_select']) === true) {
|
||||
$secondaryLinks[] = '<em>'.__('N/A').'</em>';
|
||||
} else {
|
||||
foreach ($secondary_groups['for_select'] as $id => $name) {
|
||||
$secondaryLinks[] = html_print_anchor(
|
||||
[
|
||||
'href' => 'index.php?sec=estado&sec2=operation/agentes/estado_agente&refr=60&group_id='.$id,
|
||||
'content' => $name,
|
||||
],
|
||||
true
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$last_status_change_agent = agents_get_last_status_change($agent['id_agente']);
|
||||
$time_elapsed = (empty($last_status_change_agent) === false) ? human_time_comparation($last_status_change_agent) : '<em>'.__('N/A').'</em>';
|
||||
|
||||
// Agent Interval.
|
||||
$data = [];
|
||||
$data[0] = __('Interval');
|
||||
$data[1] = $intervalHumanTime;
|
||||
$table_contact->data[] = $data;
|
||||
|
||||
// Last & Remote contact.
|
||||
$data = [];
|
||||
$data[0] = __('Last contact').' / '.__('Remote');
|
||||
$data[1] = $lastAndRemoteContact;
|
||||
$table_contact->data[] = $data;
|
||||
|
||||
// Next contact progress.
|
||||
$data = [];
|
||||
$data[0] = __('Next contact');
|
||||
$data[1] = ui_progress(
|
||||
$progress,
|
||||
'80%',
|
||||
'1.2',
|
||||
'#ececec',
|
||||
true,
|
||||
$progressCaption,
|
||||
[
|
||||
'page' => 'operation/agentes/ver_agente',
|
||||
'interval' => $ajaxNextContactInterval,
|
||||
'data' => [
|
||||
'id_agente' => $id_agente,
|
||||
'refresh_contact' => 1,
|
||||
],
|
||||
|
||||
]
|
||||
);
|
||||
$table_contact->data[] = $data;
|
||||
|
||||
// Group line.
|
||||
$data = [];
|
||||
$data[0] = '<b>'.__('Group').'</b>';
|
||||
$data[1] = html_print_anchor(
|
||||
[
|
||||
'href' => 'index.php?sec=gagente&sec2=godmode/groups/tactical&id_group='.$agent['id_grupo'],
|
||||
'content' => groups_get_name($agent['id_grupo']),
|
||||
],
|
||||
true
|
||||
);
|
||||
$table_contact->data[] = $data;
|
||||
|
||||
// Secondary groups.
|
||||
$data = [];
|
||||
$data[0] = '<b>'.__('Secondary groups').'</b>';
|
||||
$data[1] = implode(', ', $secondaryLinks);
|
||||
$table_contact->data[] = $data;
|
||||
|
||||
// Parent agent line.
|
||||
if (enterprise_installed() === true) {
|
||||
$data = [];
|
||||
$data[0] = '<b>'.__('Parent').'</b>';
|
||||
if ((int) $agent['id_parent'] === 0) {
|
||||
$data[1] = '<em>'.__('N/A').'</em>';
|
||||
} else {
|
||||
$data[1] = html_print_anchor(
|
||||
[
|
||||
'href' => 'index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$agent['id_parent'],
|
||||
'content' => agents_get_alias($agent['id_parent']),
|
||||
],
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
$table_contact->data[] = $data;
|
||||
}
|
||||
|
||||
// Last status change line.
|
||||
$data = [];
|
||||
$data[0] = '<b>'.__('Last status change').'</b>';
|
||||
$data[1] = $time_elapsed;
|
||||
$table_contact->data[] = $data;
|
||||
|
||||
$agent_contact = html_print_div(
|
||||
[
|
||||
'class' => 'agent_details_header',
|
||||
'content' => $agentContactCaption.$buttons_refresh_agent_view,
|
||||
],
|
||||
true
|
||||
);
|
||||
|
||||
$agent_contact .= html_print_table($table_contact, true);
|
||||
|
||||
return $agent_contact;
|
||||
}
|
|
@ -5019,9 +5019,6 @@ function events_page_general($event)
|
|||
}
|
||||
|
||||
$data[1] = $user_ack.' ( ';
|
||||
// hd($config['date_format'], true);
|
||||
// hd($event['ack_utimestamp_raw'], true);
|
||||
// TODO: mirar en el manage y en la api que este ack de venir vacio lo herede del anterior que hubiera.
|
||||
if ($event['ack_utimestamp_raw'] !== false
|
||||
&& $event['ack_utimestamp_raw'] !== 'false'
|
||||
&& empty($event['ack_utimestamp_raw']) === false
|
||||
|
|
|
@ -4011,6 +4011,10 @@ function ui_print_datatable(array $parameters)
|
|||
$parameters['csv'] = 1;
|
||||
}
|
||||
|
||||
if (isset($parameters['no_move_elements_to_action']) === false) {
|
||||
$parameters['no_move_elements_to_action'] = false;
|
||||
}
|
||||
|
||||
$filter = '';
|
||||
// Datatable filter.
|
||||
if (isset($parameters['form']) && is_array($parameters['form'])) {
|
||||
|
@ -7980,6 +7984,54 @@ function ui_print_status_div($status)
|
|||
}
|
||||
|
||||
|
||||
function ui_print_div(?string $class='', ?string $title='')
|
||||
{
|
||||
$return = '<div class="'.$class.'" title="'.$title.'" data-title="'.$title.'" data-use_title_for_force_title="1">';
|
||||
$return .= ' ';
|
||||
$return .= '</div>';
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
|
||||
function ui_print_status_agent_div(int $status, ?string $title=null)
|
||||
{
|
||||
$return = '';
|
||||
$class = 'status_rounded_rectangles forced_title';
|
||||
switch ((int) $status) {
|
||||
case AGENT_STATUS_CRITICAL:
|
||||
$return = ui_print_div('group_view_crit '.$class, $title);
|
||||
break;
|
||||
|
||||
case AGENT_STATUS_NORMAL:
|
||||
$return = ui_print_div('group_view_ok '.$class, $title);
|
||||
break;
|
||||
|
||||
case AGENT_STATUS_NOT_INIT:
|
||||
$return = ui_print_div('group_view_not_init '.$class, $title);
|
||||
break;
|
||||
|
||||
case AGENT_STATUS_UNKNOWN:
|
||||
$return = ui_print_div('group_view_unk '.$class, $title);
|
||||
break;
|
||||
|
||||
case AGENT_STATUS_WARNING:
|
||||
$return = ui_print_div('group_view_warn '.$class, $title);
|
||||
break;
|
||||
|
||||
case AGENT_STATUS_ALERT_FIRED:
|
||||
$return = ui_print_div('group_view_alrm '.$class, $title);
|
||||
break;
|
||||
|
||||
default:
|
||||
// Not posible.
|
||||
break;
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
|
||||
function ui_print_fav_menu($id_element, $url, $label, $section)
|
||||
{
|
||||
global $config;
|
||||
|
|
|
@ -131,6 +131,11 @@ if (dt.startDisabled === true) {
|
|||
startDisabled = true;
|
||||
}
|
||||
|
||||
var noMoveElementsToAction = false;
|
||||
if (dt.no_move_elements_to_action === true) {
|
||||
noMoveElementsToAction = true;
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
function checkPages() {
|
||||
if (dt_table.page.info().pages > 1) {
|
||||
|
@ -226,7 +231,9 @@ $(document).ready(function() {
|
|||
]
|
||||
: [],
|
||||
initComplete: function(settings, json) {
|
||||
moveElementsToActionButtons();
|
||||
if (noMoveElementsToAction === false) {
|
||||
moveElementsToActionButtons();
|
||||
}
|
||||
|
||||
checkPages();
|
||||
|
||||
|
|
|
@ -205,6 +205,92 @@ class Cluster extends Entity
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Counters modules involved status.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getCounters() :array
|
||||
{
|
||||
$id_agent_modules = $this->getIdsModulesInvolved();
|
||||
$sql = sprintf(
|
||||
'SELECT SUM( IF(estado = 1, 1, 0) ) AS critical,
|
||||
SUM( IF(estado = 2, 1, 0) ) AS warning,
|
||||
SUM( IF(estado = 0, 1, 0) ) AS normal,
|
||||
SUM( IF(estado = 3, 1, 0) ) AS unknown,
|
||||
SUM( IF(estado = 4 OR estado = 5, 1, 0) ) AS not_init,
|
||||
COUNT(id_agente_modulo) AS total
|
||||
FROM tagente_estado
|
||||
WHERE id_agente_modulo IN (%s)',
|
||||
implode(',', $id_agent_modules)
|
||||
);
|
||||
|
||||
$counters = db_get_row_sql($sql);
|
||||
if ($counters === false) {
|
||||
$counters = [];
|
||||
}
|
||||
|
||||
return $counters;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return Ids modules involved.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getIdsModulesInvolved(): array
|
||||
{
|
||||
$members = $this->getMembers();
|
||||
$modules_ids = [];
|
||||
$modules_names = $this->getItemNames();
|
||||
if (empty($members) === false) {
|
||||
foreach ($members as $agent) {
|
||||
$modules_filtered = $agent->searchModules(['nombre' => $modules_names], 0);
|
||||
if (empty($modules_filtered) === false) {
|
||||
foreach ($modules_filtered as $idAgent => $module) {
|
||||
$modules_ids[] = $module->id_agente_modulo();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $modules_ids;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return names modules involved.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getItemNames(): array
|
||||
{
|
||||
$result = [];
|
||||
if (empty($this->getItems()) === false) {
|
||||
$result = array_keys($this->getItems());
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return name type.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getStringTypeName(): string
|
||||
{
|
||||
$result = __('Active').' / '.__('Active');
|
||||
if ($this->cluster_type() === 'AP') {
|
||||
$result = __('Active').' / '.__('Pasive');
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Cleans members from cluster object.
|
||||
*
|
||||
|
|
|
@ -216,15 +216,27 @@ class ClusterManager
|
|||
|
||||
$err = '';
|
||||
$id = get_parameter('id', null);
|
||||
|
||||
try {
|
||||
$cluster = new Cluster($id);
|
||||
} catch (\Exception $e) {
|
||||
$err = ui_print_error_message(
|
||||
__('Cluster not found: '.$e->getMessage()),
|
||||
'',
|
||||
true
|
||||
);
|
||||
if (empty($id) === true) {
|
||||
$id_agente = get_parameter('id_agente', null);
|
||||
try {
|
||||
$cluster = Cluster::loadFromAgentId($id_agente, true);
|
||||
} catch (\Exception $e) {
|
||||
$err = ui_print_error_message(
|
||||
__('Cluster not found: '.$e->getMessage()),
|
||||
'',
|
||||
true
|
||||
);
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
$cluster = new Cluster($id);
|
||||
} catch (\Exception $e) {
|
||||
$err = ui_print_error_message(
|
||||
__('Cluster not found: '.$e->getMessage()),
|
||||
'',
|
||||
true
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if ($cluster->agent()->id_agente() === null) {
|
||||
|
@ -237,15 +249,60 @@ class ClusterManager
|
|||
$critical = true;
|
||||
}
|
||||
|
||||
$allGroups = agents_get_all_groups_agent(
|
||||
$cluster->agent()->id_agente(),
|
||||
$cluster->agent()->id_grupo()
|
||||
);
|
||||
|
||||
$flag = (int) get_parameter('flag', 0);
|
||||
if ($flag === 1 && check_acl_one_of_groups($config['id_user'], $allGroups, 'AW') === true) {
|
||||
$id_agent_module = get_parameter('id_agente_modulo');
|
||||
db_process_sql_update(
|
||||
'tagente_modulo',
|
||||
['flag' => 1],
|
||||
['id_agente_modulo' => $id_agent_module]
|
||||
);
|
||||
}
|
||||
|
||||
$flag_agent = (int) get_parameter('flag_agent', 0);
|
||||
if ($flag_agent === 1 && check_acl_one_of_groups($config['id_user'], $allGroups, 'AW') === true) {
|
||||
db_process_sql_update(
|
||||
'tagente_modulo',
|
||||
['flag' => 1],
|
||||
['id_agente' => $cluster->agent()->id_agente()]
|
||||
);
|
||||
}
|
||||
|
||||
$counters = $cluster->getCounters();
|
||||
$counters_chart = [];
|
||||
$counters_bullet = [];
|
||||
foreach ($counters as $key => $value) {
|
||||
if ($key === 'not_init') {
|
||||
$counters_chart['Not init'] = $value;
|
||||
} else {
|
||||
$counters_chart[ucfirst($key)] = $value;
|
||||
}
|
||||
|
||||
$counters_bullet[$key.'_count'] = $value;
|
||||
}
|
||||
|
||||
unset($counters_chart['Total']);
|
||||
|
||||
$module_involved_ids = $cluster->getIdsModulesInvolved();
|
||||
|
||||
View::render(
|
||||
'cluster/view',
|
||||
[
|
||||
'message' => $msg,
|
||||
'error' => $err,
|
||||
'config' => $config,
|
||||
'model' => $this,
|
||||
'cluster' => $cluster,
|
||||
'critical' => $critical,
|
||||
'message' => $msg,
|
||||
'error' => $err,
|
||||
'config' => $config,
|
||||
'model' => $this,
|
||||
'cluster' => $cluster,
|
||||
'critical' => $critical,
|
||||
'allGroups' => $allGroups,
|
||||
'counters_chart' => $counters_chart,
|
||||
'counters_bullet' => $counters_bullet,
|
||||
'module_involved_ids' => array_combine($module_involved_ids, $module_involved_ids),
|
||||
]
|
||||
);
|
||||
}
|
||||
|
|
|
@ -725,14 +725,11 @@ class ClusterWizard extends \HTML
|
|||
}
|
||||
|
||||
if ($this->page === 7) {
|
||||
/*
|
||||
*
|
||||
* PARSE ALERTS
|
||||
*
|
||||
*/
|
||||
|
||||
// There is no need to parse anything. Already managed by alert
|
||||
// builder.
|
||||
global $config;
|
||||
$step = true;
|
||||
$id_agente = $this->cluster->agent()->id_agente();
|
||||
$dont_display_alert_create_bttn = true;
|
||||
include_once $config['homedir'].'/godmode/alerts/alert_list.php';
|
||||
header('Location: '.$this->url.'&op=view&id='.$this->cluster->id());
|
||||
}
|
||||
|
||||
|
@ -1212,26 +1209,15 @@ class ClusterWizard extends \HTML
|
|||
'block_content' => $inputs,
|
||||
];
|
||||
} else if ($this->page === 6) {
|
||||
/*
|
||||
*
|
||||
* Page: Alerts.
|
||||
*
|
||||
*/
|
||||
|
||||
ob_start();
|
||||
global $config;
|
||||
|
||||
$step = true;
|
||||
$id_agente = $this->cluster->agent()->id_agente();
|
||||
$dont_display_alert_create_bttn = true;
|
||||
include_once $config['homedir'].'/godmode/alerts/alert_list.php';
|
||||
ob_start();
|
||||
include_once $config['homedir'].'/godmode/alerts/alert_list.builder.php';
|
||||
|
||||
// XXX: Please do not use this kind of thing never more.
|
||||
$hack = ob_get_clean();
|
||||
|
||||
// TODO: Alert form.
|
||||
$form['pre-content'] = $hack;
|
||||
|
||||
html_print_input_hidden('create_alert', 1);
|
||||
$hack_form = ob_get_clean();
|
||||
$form['inputs'][] = ['extra' => $hack_form];
|
||||
$final = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -6215,19 +6215,18 @@ div#status_pie {
|
|||
padding: 15px;
|
||||
}
|
||||
|
||||
/*
|
||||
.agent_details_content {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
padding: 20px;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
*/
|
||||
.agent_details_content {
|
||||
|
||||
.agent_details_content_cluster {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
align-items: flex-start;
|
||||
padding: 20px;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.agent_details_content .agent_details_graph {
|
||||
|
@ -6240,10 +6239,69 @@ div#status_pie {
|
|||
justify-content: center;
|
||||
}
|
||||
|
||||
.agent_details_content .agent_details_info {
|
||||
flex: 1 1 70%;
|
||||
overflow: hidden;
|
||||
padding-left: 15px;
|
||||
.agent_details_content_cluster .agent_details_graph {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
margin-left: 10px;
|
||||
min-width: 35%;
|
||||
max-width: 50%;
|
||||
}
|
||||
|
||||
.agent_details_content_cluster .agent_details_graph > div {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.agent_details_content_cluster div#status_pie {
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
.agent_details_content_cluster .agent_details_info {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
margin-right: 10px;
|
||||
min-width: 35%;
|
||||
max-width: 50%;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
height: 180px;
|
||||
}
|
||||
|
||||
.agent_details_content_cluster .agent_details_info > div {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-around;
|
||||
align-items: flex-end;
|
||||
width: 100%;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.agent_details_content_cluster .agent_details_info {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
margin-left: 10px;
|
||||
min-width: 35%;
|
||||
max-width: 50%;
|
||||
justify-content: space-around;
|
||||
align-items: flex-end;
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
.agent_event_chart_cluster {
|
||||
margin-left: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.agent_event_chart_cluster div b {
|
||||
margin-left: 0px;
|
||||
}
|
||||
|
||||
.agent_event_chart_cluster .white-table-graph-content {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.agent_details_info {
|
||||
|
@ -6280,6 +6338,17 @@ div#status_pie {
|
|||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
.agent_details_bullets_cluster #bullets_modules {
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.agent_details_bullets_cluster #bullets_modules > div {
|
||||
padding: 0px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.agent_details_bullets #bullets_modules > div {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
|
|
@ -109,6 +109,7 @@ $sec = safe_url_extraclean($sec);
|
|||
$flag_alert = (bool) get_parameter('force_execution', 0);
|
||||
$alert_validate = (bool) get_parameter('alert_validate', 0);
|
||||
$tab = get_parameter_get('tab', null);
|
||||
$op = get_parameter('op', null);
|
||||
|
||||
$refr = (int) get_parameter('refr', 0);
|
||||
$pure = get_parameter('pure', 0);
|
||||
|
@ -119,8 +120,11 @@ if ($flag_alert == 1 && check_acl($config['id_user'], $id_group, 'AW')) {
|
|||
forceExecution($id_group);
|
||||
}
|
||||
|
||||
|
||||
$idAgent = get_parameter_get('id_agente', 0);
|
||||
if (isset($id_agente) === false || empty($id_agente) === true) {
|
||||
$idAgent = get_parameter_get('id_agente', 0);
|
||||
} else {
|
||||
$idAgent = $id_agente;
|
||||
}
|
||||
|
||||
// Show alerts for specific agent.
|
||||
if ($idAgent != 0) {
|
||||
|
@ -207,6 +211,10 @@ if ($idAgent != 0) {
|
|||
|
||||
$alerts = [];
|
||||
|
||||
if ($op != null) {
|
||||
$url = $url.'&op='.$op;
|
||||
}
|
||||
|
||||
if ($tab != null) {
|
||||
$url = $url.'&tab='.$tab;
|
||||
}
|
||||
|
|
|
@ -1153,11 +1153,8 @@ foreach ($agents as $agent) {
|
|||
$cluster = PandoraFMS\Cluster::loadFromAgentId(
|
||||
$agent['id_agente']
|
||||
);
|
||||
$url = 'index.php?sec=reporting&sec2=';
|
||||
$url .= 'operation/cluster/cluster';
|
||||
$url = ui_get_full_url(
|
||||
$url.'&op=view&id='.$cluster->id()
|
||||
);
|
||||
$url_cluster = 'index.php?sec=reporting&sec2=operation/cluster/cluster';
|
||||
$url = $url_cluster.'&op=view&id='.$cluster->id();
|
||||
} else {
|
||||
$url = 'index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$agent['id_agente'];
|
||||
}
|
||||
|
|
|
@ -79,215 +79,11 @@ $alive_animation = agents_get_starmap($id_agente, 200, 50);
|
|||
/*
|
||||
* START: TABLE AGENT BUILD.
|
||||
*/
|
||||
$agentCaptionAddedMessage = [];
|
||||
$agentCaption = '<span class="subsection_header_title">'.ucfirst(agents_get_alias($agent['id_agente'])).'</span>';
|
||||
$in_planned_downtime = (bool) 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 = '.$agent['id_agente'].' AND tplanned_downtime.executed = 1'
|
||||
);
|
||||
|
||||
if ((bool) $agent['disabled'] === true) {
|
||||
$agentCaptionAddedMessage[] = __('Disabled');
|
||||
} else if ((bool) $agent['quiet'] === true) {
|
||||
$agentCaptionAddedMessage[] = __('Quiet');
|
||||
}
|
||||
|
||||
if ($in_planned_downtime === true) {
|
||||
$agentCaptionAddedMessage[] = __('In scheduled downtime');
|
||||
}
|
||||
|
||||
if (empty($agentCaptionAddedMessage) === false) {
|
||||
$agentCaption .= ' <span class="result_info_text">('.implode(' - ', $agentCaptionAddedMessage).')</span>';
|
||||
}
|
||||
|
||||
$agentIconGroup = ((bool) $config['show_group_name'] === false) ? ui_print_group_icon(
|
||||
$agent['id_grupo'],
|
||||
true,
|
||||
'',
|
||||
'padding-right: 6px;',
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
'',
|
||||
true
|
||||
) : '';
|
||||
|
||||
$agentIconStatus = agents_detail_view_status_img(
|
||||
$agent['critical_count'],
|
||||
$agent['warning_count'],
|
||||
$agent['unknown_count'],
|
||||
$agent['total_count'],
|
||||
$agent['notinit_count']
|
||||
);
|
||||
|
||||
$agent_details_agent_caption = html_print_div(
|
||||
[
|
||||
'class' => 'agent_details_agent_caption',
|
||||
'content' => $agentCaption,
|
||||
],
|
||||
true
|
||||
);
|
||||
|
||||
$agent_details_agent_data = html_print_div(
|
||||
[
|
||||
'class' => 'agent_details_agent_data',
|
||||
'content' => $agentIconGroup,
|
||||
],
|
||||
true
|
||||
);
|
||||
|
||||
$agent_details_agent_status_image = html_print_div(
|
||||
[
|
||||
'class' => 'icono_right',
|
||||
'content' => $agentIconStatus,
|
||||
],
|
||||
true
|
||||
);
|
||||
|
||||
$agentStatusHeader = html_print_div(
|
||||
[
|
||||
'class' => 'agent_details_header',
|
||||
'content' => $agent_details_agent_caption.$agent_details_agent_data.$agent_details_agent_status_image,
|
||||
],
|
||||
true
|
||||
);
|
||||
$agentStatusHeader = get_resume_agent_status_header($agent);
|
||||
|
||||
// Fixed width non interactive charts.
|
||||
$status_chart_width = 150;
|
||||
$graph_width = 150;
|
||||
|
||||
$table_status = new stdClass();
|
||||
$table_status->id = 'agent_status_main';
|
||||
$table_status->width = '100%';
|
||||
$table_status->cellspacing = 0;
|
||||
$table_status->cellpadding = 0;
|
||||
$table_status->class = 'floating_form';
|
||||
$table_status->style[0] = 'height: 32px; width: 30%; padding-right: 5px; text-align: end; vertical-align: top';
|
||||
$table_status->style[1] = 'height: 32px; width: 70%; padding-left: 5px; font-weight: lighter; vertical-align: top';
|
||||
|
||||
$agentStatusGraph = html_print_div(
|
||||
[
|
||||
'id' => 'status_pie',
|
||||
'style' => 'width: '.$graph_width.'px;',
|
||||
'content' => graph_agent_status(
|
||||
$id_agente,
|
||||
$graph_width,
|
||||
$graph_width,
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
true
|
||||
),
|
||||
],
|
||||
true
|
||||
);
|
||||
|
||||
/*
|
||||
$table_agent_graph = '<div id="status_pie" style="width: '.$graph_width.'px;">';
|
||||
$table_agent_graph .= graph_agent_status(
|
||||
$id_agente,
|
||||
$graph_width,
|
||||
$graph_width,
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
true
|
||||
);
|
||||
$table_agent_graph .= '</div>';*/
|
||||
|
||||
/*
|
||||
$table_agent_os = '<p>'.ui_print_os_icon(
|
||||
$agent['id_os'],
|
||||
false,
|
||||
true,
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
[
|
||||
'title' => get_os_name($agent['id_os']),
|
||||
'width' => '20px;',
|
||||
]
|
||||
);
|
||||
*/
|
||||
|
||||
$table_status->data['agent_os'][0] = __('OS');
|
||||
$agentOS = [];
|
||||
$agentOS[] = html_print_div([ 'content' => (empty($agent['os_version']) === true) ? get_os_name((int) $agent['id_os']) : $agent['os_version']], true);
|
||||
$agentOS[] = html_print_div([ 'style' => 'width: 16px;padding-left: 5px', 'content' => ui_print_os_icon($agent['id_os'], false, true, true, false, false, false, ['width' => '16px'])], true);
|
||||
$table_status->data['agent_os'][1] = html_print_div(['class' => 'agent_details_agent_data', 'content' => implode('', $agentOS)], true);
|
||||
|
||||
// $table_agent_os .= (empty($agent['os_version']) === true) ? get_os_name((int) $agent['id_os']) : $agent['os_version'].'</p>';
|
||||
$addresses = agents_get_addresses($id_agente);
|
||||
$address = agents_get_address($id_agente);
|
||||
|
||||
foreach ($addresses as $k => $add) {
|
||||
if ($add == $address) {
|
||||
unset($addresses[$k]);
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($address) === false) {
|
||||
$table_status->data['ip_address'][0] = __('IP address');
|
||||
$table_status->data['ip_address'][1] = (empty($address) === true) ? '<em>'.__('N/A').'</em>' : $address;
|
||||
/*
|
||||
$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) === true) ? '<em>'.__('N/A').'</em>' : $address;
|
||||
$table_agent_ip .= '</span></p>';
|
||||
*/
|
||||
}
|
||||
|
||||
$table_status->data['agent_version'][0] = __('Agent Version');
|
||||
$table_status->data['agent_version'][1] = (empty($agent['agent_version']) === true) ? '<i>'.__('N/A').'</i>' : $agent['agent_version'];
|
||||
|
||||
$table_status->data['description'][0] = __('Description');
|
||||
$table_status->data['description'][1] = (empty($agent['comentarios']) === true) ? '<em>'.__('N/A').'</em>' : $agent['comentarios'];
|
||||
|
||||
/*
|
||||
$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($agent['agent_version']) === true) ? '<i>'.__('N/A').'</i>' : $agent['agent_version'];
|
||||
$table_agent_version .= '</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($agent['comentarios']) === true) ? '<em>'.__('N/A').'</em>' : $agent['comentarios'];
|
||||
$table_agent_description .= '</span></p>';
|
||||
*/
|
||||
|
||||
/*
|
||||
$table_agent_count_modules = reporting_tiny_stats(
|
||||
$agent,
|
||||
true,
|
||||
'agent',
|
||||
// Useless.
|
||||
':',
|
||||
true
|
||||
);*/
|
||||
$agentStatusGraph = get_status_agent_chart_pie($id_agente, 150);
|
||||
|
||||
$agentCountModules = html_print_div(
|
||||
[
|
||||
|
@ -304,6 +100,40 @@ $agentCountModules = html_print_div(
|
|||
true
|
||||
);
|
||||
|
||||
$table_status = new stdClass();
|
||||
$table_status->id = 'agent_status_main';
|
||||
$table_status->width = '100%';
|
||||
$table_status->cellspacing = 0;
|
||||
$table_status->cellpadding = 0;
|
||||
$table_status->class = 'floating_form';
|
||||
$table_status->style[0] = 'height: 32px; width: 30%; padding-right: 5px; text-align: end; vertical-align: top';
|
||||
$table_status->style[1] = 'height: 32px; width: 70%; padding-left: 5px; font-weight: lighter; vertical-align: top';
|
||||
$table_status->data['agent_os'][0] = __('OS');
|
||||
$agentOS = [];
|
||||
$agentOS[] = html_print_div([ 'content' => (empty($agent['os_version']) === true) ? get_os_name((int) $agent['id_os']) : $agent['os_version']], true);
|
||||
$agentOS[] = html_print_div([ 'style' => 'width: 16px;padding-left: 5px', 'content' => ui_print_os_icon($agent['id_os'], false, true, true, false, false, false, ['width' => '16px'])], true);
|
||||
$table_status->data['agent_os'][1] = html_print_div(['class' => 'agent_details_agent_data', 'content' => implode('', $agentOS)], true);
|
||||
|
||||
$addresses = agents_get_addresses($id_agente);
|
||||
$address = agents_get_address($id_agente);
|
||||
|
||||
foreach ($addresses as $k => $add) {
|
||||
if ($add == $address) {
|
||||
unset($addresses[$k]);
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($address) === false) {
|
||||
$table_status->data['ip_address'][0] = __('IP address');
|
||||
$table_status->data['ip_address'][1] = (empty($address) === true) ? '<em>'.__('N/A').'</em>' : $address;
|
||||
}
|
||||
|
||||
$table_status->data['agent_version'][0] = __('Agent Version');
|
||||
$table_status->data['agent_version'][1] = (empty($agent['agent_version']) === true) ? '<i>'.__('N/A').'</i>' : $agent['agent_version'];
|
||||
|
||||
$table_status->data['description'][0] = __('Description');
|
||||
$table_status->data['description'][1] = (empty($agent['comentarios']) === true) ? '<em>'.__('N/A').'</em>' : $agent['comentarios'];
|
||||
|
||||
$has_remote_conf = enterprise_hook(
|
||||
'config_agents_has_remote_configuration',
|
||||
[$agent['id_agente']]
|
||||
|
@ -347,163 +177,6 @@ $table_agent = $agentStatusHeader.'
|
|||
* END: TABLE AGENT BUILD.
|
||||
*/
|
||||
|
||||
/*
|
||||
*START: TABLE CONTACT BUILD.
|
||||
*/
|
||||
|
||||
$table_contact = new stdClass();
|
||||
$table_contact->id = 'agent_contact_main';
|
||||
$table_contact->width = '100%';
|
||||
$table_contact->cellspacing = 0;
|
||||
$table_contact->cellpadding = 0;
|
||||
$table_contact->class = 'floating_form';
|
||||
$table_contact->style[0] = 'height: 32px; width: 30%; padding-right: 5px; text-align: end; vertical-align: top';
|
||||
$table_contact->style[1] = 'height: 32px; width: 70%; padding-left: 5px; font-weight: lighter; vertical-align: top';
|
||||
|
||||
$agentContactCaption = html_print_div(
|
||||
[
|
||||
'class' => 'agent_details_agent_caption',
|
||||
'content' => '<span class="subsection_header_title">'.__('Agent contact').'</span>',
|
||||
],
|
||||
true
|
||||
);
|
||||
|
||||
$buttonsRefreshAgent = html_print_button(
|
||||
__('Refresh data'),
|
||||
'refresh_data',
|
||||
false,
|
||||
'window.location.assign("index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$id_agente.'&refr=60")',
|
||||
[ 'mode' => 'link' ],
|
||||
true
|
||||
);
|
||||
|
||||
if (check_acl_one_of_groups($config['id_user'], $all_groups, 'AW') === true) {
|
||||
$buttonsRefreshAgent .= html_print_button(
|
||||
__('Force checks'),
|
||||
'force_checks',
|
||||
false,
|
||||
'window.location.assign("index.php?sec=estado&sec2=operation/agentes/ver_agente&flag_agent=1&id_agente='.$id_agente.'")',
|
||||
[ 'mode' => 'link' ],
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
$buttons_refresh_agent_view = html_print_div(
|
||||
[
|
||||
'class' => 'buttons_agent_view',
|
||||
'content' => $buttonsRefreshAgent,
|
||||
],
|
||||
true
|
||||
);
|
||||
|
||||
// Data for agent contact.
|
||||
$intervalHumanTime = human_time_description_raw($agent['intervalo']);
|
||||
$lastContactDate = ui_print_timestamp($agent['ultimo_contacto'], true);
|
||||
$remoteContactDate = ($agent['ultimo_contacto_remoto'] === '01-01-1970 00:00:00') ? __('Never') : date_w_fixed_tz($agent['ultimo_contacto_remoto']);
|
||||
$lastAndRemoteContact = sprintf('%s / %s', $lastContactDate, $remoteContactDate);
|
||||
$progress = agents_get_next_contact($id_agente);
|
||||
$tempTimeToShow = ($agent['intervalo'] - (strtotime('now') - strtotime($agent['ultimo_contacto'])));
|
||||
$progressCaption = ($tempTimeToShow >= 0) ? sprintf('%d s', $tempTimeToShow) : __('Out of bounds');
|
||||
$ajaxNextContactInterval = (empty($agent['intervalo']) === true) ? 0 : (100 / $agent['intervalo']);
|
||||
$secondary_groups = enterprise_hook('agents_get_secondary_groups', [$id_agente]);
|
||||
$secondaryLinks = [];
|
||||
if (empty($secondary_groups['for_select']) === true) {
|
||||
$secondaryLinks[] = '<em>'.__('N/A').'</em>';
|
||||
} else {
|
||||
foreach ($secondary_groups['for_select'] as $id => $name) {
|
||||
$secondaryLinks[] = html_print_anchor(
|
||||
[
|
||||
'href' => 'index.php?sec=estado&sec2=operation/agentes/estado_agente&refr=60&group_id='.$id,
|
||||
'content' => $name,
|
||||
],
|
||||
true
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$last_status_change_agent = agents_get_last_status_change($agent['id_agente']);
|
||||
$time_elapsed = (empty($last_status_change_agent) === false) ? human_time_comparation($last_status_change_agent) : '<em>'.__('N/A').'</em>';
|
||||
|
||||
// Agent Interval.
|
||||
$data = [];
|
||||
$data[0] = __('Interval');
|
||||
$data[1] = $intervalHumanTime;
|
||||
$table_contact->data[] = $data;
|
||||
|
||||
// Last & Remote contact.
|
||||
$data = [];
|
||||
$data[0] = __('Last contact').' / '.__('Remote');
|
||||
$data[1] = $lastAndRemoteContact;
|
||||
$table_contact->data[] = $data;
|
||||
|
||||
// Next contact progress.
|
||||
$data = [];
|
||||
$data[0] = __('Next contact');
|
||||
$data[1] = ui_progress(
|
||||
$progress,
|
||||
'80%',
|
||||
'1.2',
|
||||
'#ececec',
|
||||
true,
|
||||
$progressCaption,
|
||||
[
|
||||
'page' => 'operation/agentes/ver_agente',
|
||||
'interval' => $ajaxNextContactInterval,
|
||||
'data' => [
|
||||
'id_agente' => $id_agente,
|
||||
'refresh_contact' => 1,
|
||||
],
|
||||
|
||||
]
|
||||
);
|
||||
$table_contact->data[] = $data;
|
||||
|
||||
// Group line.
|
||||
$data = [];
|
||||
$data[0] = '<b>'.__('Group').'</b>';
|
||||
$data[1] = html_print_anchor(
|
||||
[
|
||||
'href' => 'index.php?sec=gagente&sec2=godmode/groups/tactical&id_group='.$agent['id_grupo'],
|
||||
'content' => groups_get_name($agent['id_grupo']),
|
||||
],
|
||||
true
|
||||
);
|
||||
$table_contact->data[] = $data;
|
||||
|
||||
// Secondary groups.
|
||||
$data = [];
|
||||
$data[0] = '<b>'.__('Secondary groups').'</b>';
|
||||
$data[1] = implode(', ', $secondaryLinks);
|
||||
$table_contact->data[] = $data;
|
||||
|
||||
// Parent agent line.
|
||||
if (enterprise_installed() === true) {
|
||||
$data = [];
|
||||
$data[0] = '<b>'.__('Parent').'</b>';
|
||||
if ((int) $agent['id_parent'] === 0) {
|
||||
$data[1] = '<em>'.__('N/A').'</em>';
|
||||
} else {
|
||||
$data[1] = html_print_anchor(
|
||||
[
|
||||
'href' => 'index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$agent['id_parent'],
|
||||
'content' => agents_get_alias($agent['id_parent']),
|
||||
],
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
$table_contact->data[] = $data;
|
||||
}
|
||||
|
||||
// Last status change line.
|
||||
$data = [];
|
||||
$data[0] = '<b>'.__('Last status change').'</b>';
|
||||
$data[1] = $time_elapsed;
|
||||
$table_contact->data[] = $data;
|
||||
|
||||
/*
|
||||
* END: TABLE CONTACT BUILD
|
||||
*/
|
||||
|
||||
/*
|
||||
* START: TABLE DATA BUILD
|
||||
|
@ -881,15 +554,7 @@ if (empty($network_interfaces) === false) {
|
|||
});
|
||||
</script>
|
||||
<?php
|
||||
$agent_contact = html_print_div(
|
||||
[
|
||||
'class' => 'agent_details_header',
|
||||
'content' => $agentContactCaption.$buttons_refresh_agent_view,
|
||||
],
|
||||
true
|
||||
);
|
||||
|
||||
$agent_contact .= html_print_table($table_contact, true);
|
||||
$agent_contact = get_resume_agent_concat($id_agente, $all_groups, $agent);
|
||||
|
||||
$agentDetails = html_print_div(
|
||||
[
|
||||
|
|
|
@ -371,6 +371,7 @@ ui_require_css_file('cluetip', 'include/styles/js/');
|
|||
ui_require_jquery_file('cluetip');
|
||||
|
||||
echo "<div id='module_details_dialog' class='display:none'></div>";
|
||||
echo "<div id='cluster_module_detail' class='display:none'></div>";
|
||||
|
||||
ui_include_time_picker();
|
||||
ui_require_jquery_file('ui.datepicker-'.get_user_language(), 'include/javascript/i18n/');
|
||||
|
@ -453,6 +454,34 @@ ui_require_jquery_file('ui.datepicker-'.get_user_language(), 'include/javascript
|
|||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Show the modal window of an module
|
||||
function show_cluster_module_detail(cluster_id, module_name) {
|
||||
title = <?php echo '"'.__('Modules: ').'"'; ?>;
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: "<?php echo ui_get_full_url('ajax.php', false, false, false); ?>",
|
||||
data: "page=include/ajax/module&get_cluster_module_detail=1&cluster_id="+cluster_id+"&module_name="+module_name,
|
||||
dataType: "html",
|
||||
success: function(data) {
|
||||
$("#cluster_module_detail").hide ()
|
||||
.empty ()
|
||||
.append (data)
|
||||
.dialog ({
|
||||
resizable: true,
|
||||
draggable: true,
|
||||
modal: true,
|
||||
title: title + module_name,
|
||||
overlay: {
|
||||
opacity: 0.5,
|
||||
background: "black"
|
||||
},
|
||||
width: "auto"
|
||||
}).css({"min-width": "650px"})
|
||||
.show ();
|
||||
}
|
||||
});
|
||||
}
|
||||
function datetime_picker_callback() {
|
||||
|
||||
$("#text-time_from, #text-time_to").timepicker({
|
||||
|
|
|
@ -126,6 +126,9 @@ if (empty($form) === false) {
|
|||
$submit = $form['submit-external-input'];
|
||||
unset($form['submit-external-input']);
|
||||
|
||||
unset($bc[0]);
|
||||
$wizard->printSteps($bc);
|
||||
|
||||
HTML::printForm($form, false, ($wizard->page < 6));
|
||||
$buttons_input .= HTML::printInput($submit);
|
||||
}
|
||||
|
|
|
@ -115,260 +115,17 @@ if ($critical === true) {
|
|||
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/clock.svg'
|
||||
).'</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 mrgn_lft_10px">';
|
||||
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/force@svg.svg',
|
||||
true,
|
||||
[
|
||||
'title' => __('Force cluster status calculation'),
|
||||
'alt' => '',
|
||||
'class' => 'main_menu_icon 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/web@groups.svg',
|
||||
true,
|
||||
[
|
||||
'title' => __('IP address'),
|
||||
'class' => 'main_menu_icon 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/logs@svg.svg',
|
||||
true,
|
||||
[
|
||||
'title' => __('Description'),
|
||||
'class' => 'main_menu_icon 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" style="width:100%">';
|
||||
$table_events .= '<div class="agent_details_header">';
|
||||
$table_events .= '<b><span style="font-size: medium;font-weight:bold">';
|
||||
$table_events = '<div class="agent_event_chart_cluster">';
|
||||
$table_events .= '<div>';
|
||||
$table_events .= '<b>';
|
||||
$table_events .= __('Events (Last 24h)');
|
||||
$table_events .= '</span></b>';
|
||||
$table_events .= '</b>';
|
||||
$table_events .= '</div>';
|
||||
$table_events .= '<div class="white-table-graph-content">';
|
||||
$table_events .= graph_graphic_agentevents(
|
||||
$cluster->agent()->id_agente(),
|
||||
95,
|
||||
70,
|
||||
50,
|
||||
SECONDS_1DAY,
|
||||
'',
|
||||
true,
|
||||
|
@ -378,53 +135,89 @@ $table_events .= graph_graphic_agentevents(
|
|||
$table_events .= '</div>';
|
||||
$table_events .= '</div>';
|
||||
|
||||
?>
|
||||
<div id="agent_details_first_row" class="w100p cluster-agent-data">
|
||||
<div class="flex">
|
||||
<div class="box-flat agent_details_col agent_details_col_left" style="width:50%">
|
||||
<div class="agent_details_header">
|
||||
<?php echo $table_agent_header; ?>
|
||||
</div>
|
||||
<div class="agent_details_content pdd_l_50px">
|
||||
<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-flat agent_details_col" style="width:50%">
|
||||
<?php echo $table_events; ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box-flat agent_details_col agent_details_col_right">
|
||||
<div class="cluster-map">
|
||||
<?php $map_manager->printMap(); ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
$agentCountModules = html_print_div(
|
||||
[
|
||||
'class' => 'agent_details_bullets_cluster',
|
||||
'content' => reporting_tiny_stats(
|
||||
$counters_bullet,
|
||||
true,
|
||||
'modules',
|
||||
// Useless.
|
||||
':',
|
||||
true
|
||||
),
|
||||
],
|
||||
true
|
||||
);
|
||||
|
||||
<div id='cluster-modules' class="w100p modules">
|
||||
<?php
|
||||
$alive_animation = agents_get_starmap(0, 180, 30, $module_involved_ids);
|
||||
$output = '<div id="agent_details_first_row" class="w100p cluster-agent-data">';
|
||||
|
||||
$output .= '<div class="flex">';
|
||||
$output .= '<div class="box-flat agent_details_col">';
|
||||
$output .= get_resume_agent_status_header($cluster->agent()->toArray());
|
||||
$output .= '<div class="agent_details_content_cluster">';
|
||||
$output .= '<div class="agent_details_graph">';
|
||||
$output .= '<div>';
|
||||
$output .= get_status_agent_chart_pie($cluster->agent()->id_agente(), 150, $counters_chart);
|
||||
$output .= $agentCountModules;
|
||||
$output .= '</div>';
|
||||
$output .= '<div>';
|
||||
$output .= '<div><b>'.__('Cluster Status').'</b></div>';
|
||||
$output .= '<div>';
|
||||
$output .= agents_detail_view_status_div(
|
||||
$cluster->agent()->critical_count(),
|
||||
$cluster->agent()->warning_count(),
|
||||
$cluster->agent()->unknown_count(),
|
||||
$cluster->agent()->total_count(),
|
||||
$cluster->agent()->notinit_count()
|
||||
);
|
||||
$output .= '</div>';
|
||||
$output .= '</div>';
|
||||
$output .= '</div>';
|
||||
$output .= '<div class="agent_details_info">';
|
||||
$output .= $alive_animation;
|
||||
$output .= '<div>';
|
||||
$output .= '<div><b>'.__('Cluster Mode').' : '.$cluster->getStringTypeName().'</b></div>';
|
||||
$output .= '<div><b>'.$cluster->name().'</b></div>';
|
||||
$output .= '</div>';
|
||||
$output .= '</div>';
|
||||
$output .= '</div>';
|
||||
|
||||
$output .= $table_events;
|
||||
|
||||
$output .= '</div>';
|
||||
|
||||
$output .= '<div class="box-flat agent_details_col">';
|
||||
$output .= get_resume_agent_concat(
|
||||
$cluster->agent()->id_agente(),
|
||||
$allGroups,
|
||||
$cluster->agent()->toArray()
|
||||
);
|
||||
$output .= '</div>';
|
||||
|
||||
$output .= '</div>';
|
||||
$output .= '</div>';
|
||||
echo $output;
|
||||
|
||||
echo '<div id="cluster-modules" class="w100p modules">';
|
||||
$id_agente = $cluster->agent()->id_agente();
|
||||
$id_cluster = $cluster->id();
|
||||
$agent = $cluster->agent()->toArray();
|
||||
require_once $config['homedir'].'/operation/agentes/estado_monitores.php';
|
||||
?>
|
||||
</div>
|
||||
echo '</div>';
|
||||
|
||||
require_once $config['homedir'].'/operation/agentes/alerts_status.php';
|
||||
|
||||
<?php
|
||||
$buttons[] = html_print_submit_button(
|
||||
// Check permissions to read events.
|
||||
if (check_acl($config['id_user'], 0, 'ER')) {
|
||||
include_once $config['homedir'].'/operation/agentes/status_events.php';
|
||||
}
|
||||
|
||||
$buttons = [];
|
||||
$reload = '<form action="'.$model->url.'&op=view&id='.$cluster->id().'" method="POST">';
|
||||
$reload .= html_print_submit_button(
|
||||
__('Reload'),
|
||||
'submit',
|
||||
false,
|
||||
|
@ -434,12 +227,14 @@ $buttons[] = html_print_submit_button(
|
|||
],
|
||||
true
|
||||
);
|
||||
echo '<form action="'.$model->url.'&op=view&id='.$cluster->id().'" method="POST">';
|
||||
$reload .= '</form>';
|
||||
|
||||
$buttons[] = $reload;
|
||||
|
||||
// Print always go back button.
|
||||
$buttons[] = HTML::printForm($model->getGoBackForm(), true);
|
||||
|
||||
html_print_action_buttons(
|
||||
implode('', $buttons),
|
||||
['type' => 'form_action']
|
||||
);
|
||||
echo '</form>';
|
||||
|
||||
// Print always go back button.
|
||||
HTML::printForm($model->getGoBackForm(), false);
|
||||
|
|
Loading…
Reference in New Issue