pandorafms/pandora_console/include/functions_groupview.php

250 lines
9.3 KiB
PHP

<?php
// Pandora FMS - https://pandorafms.com
// ==================================================
// Copyright (c) 2005-2023 Pandora FMS
// Please see https://pandorafms.com/community/ for full contribution list
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License
// as published by the Free Software Foundation; 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.
require_once $config['homedir'].'/include/functions_groups.php';
require_once $config['homedir'].'/include/functions_tags.php';
require_once $config['homedir'].'/include/class/Tree.class.php';
require_once $config['homedir'].'/include/class/TreeGroup.class.php';
function groupview_plain_groups($groups)
{
$group_result = [];
foreach ($groups as $group) {
$plain_child = [];
if (!empty($group['children'])) {
$plain_child = groupview_plain_groups($group['children']);
unset($group['children']);
}
$group_result[] = $group;
$group_result = array_merge($group_result, $plain_child);
}
return $group_result;
}
function groupview_get_modules_counters($groups_ids=false)
{
if (empty($groups_ids)) {
return [];
}
$groups_ids = implode(',', $groups_ids);
$table = is_metaconsole() ? 'tmetaconsole_agent' : 'tagente';
$table_sec = is_metaconsole() ? 'tmetaconsole_agent_secondary_group' : 'tagent_secondary_group';
$fields = [
'g',
'SUM(module_normal) AS total_module_normal',
'SUM(module_critical) AS total_module_critical',
'SUM(module_warning) AS total_module_warning',
'SUM(module_unknown) AS total_module_unknown',
'SUM(module_not_init) AS total_module_not_init',
'SUM(module_alerts) AS total_module_alerts',
'SUM(module_total) AS total_module',
];
$fields_impl = implode(',', $fields);
$sql = "SELECT $fields_impl FROM
(
SELECT SUM(ta.normal_count) AS module_normal,
SUM(ta.critical_count) AS module_critical,
SUM(ta.warning_count) AS module_warning,
SUM(ta.unknown_count) AS module_unknown,
SUM(ta.notinit_count) AS module_not_init,
SUM(ta.fired_count) AS module_alerts,
SUM(ta.total_count) AS module_total,
ta.id_grupo AS g
FROM $table ta
WHERE ta.id_grupo IN ($groups_ids)
AND ta.disabled = 0
GROUP BY ta.id_grupo
UNION ALL
SELECT SUM(ta.normal_count) AS module_normal,
SUM(ta.critical_count) AS module_critical,
SUM(ta.warning_count) AS module_warning,
SUM(ta.unknown_count) AS module_unknown,
SUM(ta.notinit_count) AS module_not_init,
SUM(ta.fired_count) AS module_alerts,
SUM(ta.total_count) AS module_total,
tasg.id_group AS g
FROM $table ta
INNER JOIN $table_sec tasg
ON ta.id_agente = tasg.id_agent
WHERE tasg.id_group IN ($groups_ids)
AND ta.disabled = 0
GROUP BY tasg.id_group
) x GROUP BY g";
$data = db_get_all_rows_sql($sql);
return $data;
}
function groupview_get_all_counters($tree_group)
{
$all_name = __('All');
$group_acl = $tree_group->getGroupAclCondition();
$table = is_metaconsole() ? 'tmetaconsole_agent' : 'tagente';
$table_sec = is_metaconsole() ? 'tmetaconsole_agent_secondary_group' : 'tagent_secondary_group';
$sql = "SELECT SUM(ta.critical_count) AS _monitors_critical_,
SUM(ta.warning_count) AS _monitors_warning_,
SUM(ta.unknown_count) AS _monitors_unknown_,
SUM(ta.notinit_count) AS _monitors_not_init_,
SUM(ta.normal_count) AS _monitors_ok_,
SUM(ta.total_count) AS _monitor_checks_,
SUM(ta.fired_count) AS _monitors_alerts_fired_,
SUM(IF(ta.critical_count > 0, 1, 0)) AS _agents_critical_,
SUM(IF(ta.critical_count = 0 AND ta.warning_count > 0, 1, 0)) AS _agents_warning_,
SUM(IF(ta.critical_count = 0 AND ta.warning_count = 0 AND ta.unknown_count > 0, 1, 0)) AS _agents_unknown_,
SUM(IF(ta.total_count = ta.notinit_count, 1, 0)) AS _agents_not_init_,
SUM(IF(ta.total_count = ta.normal_count AND ta.total_count <> ta.notinit_count, 1, 0)) AS _agents_ok_,
COUNT(ta.id_agente) AS _total_agents_,
'$all_name' AS _name_,
0 AS _id_,
'' AS _icon_
FROM $table ta
WHERE ta.disabled = 0
AND ta.id_agente IN (
SELECT ta.id_agente FROM $table ta
LEFT JOIN $table_sec tasg
ON ta.id_agente = tasg.id_agent
WHERE ta.disabled = 0
$group_acl
GROUP BY ta.id_agente
)
";
$data = db_get_row_sql($sql);
$data['_monitor_not_normal_'] = ($data['_monitor_checks_'] - $data['_monitors_ok_']);
return $data;
}
function groupview_get_groups_list($id_user=false, $access='AR', $is_not_paginated=false)
{
global $config;
if ($id_user == false) {
$id_user = $config['id_user'];
}
$tree_group = new TreeGroup('group', 'group');
$tree_group->setPropagateCounters(false);
$tree_group->setFilter(
[
'searchAgent' => '',
'statusAgent' => AGENT_STATUS_ALL,
'searchModule' => '',
'statusModule' => -1,
'groupID' => 0,
'tagID' => 0,
'show_not_init_agents' => 1,
'show_not_init_modules' => 1,
]
);
$info = $tree_group->getArray();
$info = groupview_plain_groups($info);
$counter = count($info);
$offset = get_parameter('offset', 0);
$groups_view = $is_not_paginated ? $info : array_slice($info, $offset, $config['block_size']);
$agents_counters = array_reduce(
$groups_view,
function ($carry, $item) {
$carry[$item['id']] = $item;
return $carry;
},
[]
);
$modules_counters = groupview_get_modules_counters(array_keys($agents_counters));
$modules_counters = array_reduce(
$modules_counters,
function ($carry, $item) {
$carry[$item['g']] = $item;
return $carry;
},
[]
);
$list = [];
foreach ($agents_counters as $id_group => $agent_counter) {
$list[$id_group]['_name_'] = $agent_counter['name'];
$list[$id_group]['_id_'] = $agent_counter['id'];
$list[$id_group]['_iconImg_'] = $agent_counter['icon'];
$list[$id_group]['_agents_critical_'] = $agent_counter['counters']['critical'];
$list[$id_group]['_agents_warning_'] = $agent_counter['counters']['warning'];
$list[$id_group]['_agents_unknown_'] = $agent_counter['counters']['unknown'];
$list[$id_group]['_agents_not_init_'] = $agent_counter['counters']['not_init'];
$list[$id_group]['_agents_ok_'] = $agent_counter['counters']['ok'];
$list[$id_group]['_total_agents_'] = $agent_counter['counters']['total'];
$list[$id_group]['_monitors_critical_'] = (int) $modules_counters[$id_group]['total_module_critical'];
$list[$id_group]['_monitors_warning_'] = (int) $modules_counters[$id_group]['total_module_warning'];
$list[$id_group]['_monitors_unknown_'] = (int) $modules_counters[$id_group]['total_module_unknown'];
$list[$id_group]['_monitors_not_init_'] = (int) $modules_counters[$id_group]['total_module_not_init'];
$list[$id_group]['_monitors_ok_'] = (int) $modules_counters[$id_group]['total_module_normal'];
$list[$id_group]['_monitor_checks_'] = (int) $modules_counters[$id_group]['total_module'];
$list[$id_group]['_monitor_not_normal_'] = ($modules_counters[$id_group]['total_module'] - $modules_counters[$id_group]['total_module_normal']);
$list[$id_group]['_monitors_alerts_fired_'] = (int) $modules_counters[$id_group]['total_module_alerts'];
}
array_unshift($list, groupview_get_all_counters($tree_group));
return [
'groups' => $list,
'counter' => $counter,
];
}
function get_recursive_groups_heatmap($parent_group, $acl)
{
if ($parent_group['counter'] > 0) {
foreach ($parent_group['groups'] as $group_key => $group_value) {
if ((int) $group_value['_id_'] === 0) {
continue;
}
$childrens = groups_get_children($group_value['_id_'], true, $acl, false);
if (empty($childrens) === false) {
foreach ($childrens as $children) {
$children_status = groups_get_status($children['id_grupo']);
$parent_group['groups'][$group_key]['_monitor_checks_']++;
switch ($children_status) {
case AGENT_STATUS_CRITICAL:
$parent_group['groups'][$group_key]['_monitors_critical_']++;
break;
case AGENT_STATUS_WARNING:
$parent_group['groups'][$group_key]['_monitors_warning_']++;
break;
case AGENT_STATUS_UNKNOWN:
$parent_group['groups'][$group_key]['_monitors_unknown_']++;
break;
case AGENT_STATUS_NORMAL:
default:
$parent_group['groups'][$group_key]['_monitors_ok_']++;
break;
}
}
}
}
}
return $parent_group;
}