diff options
Diffstat (limited to 'ui/widgets/problemhosts/actions/WidgetView.php')
-rw-r--r-- | ui/widgets/problemhosts/actions/WidgetView.php | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/ui/widgets/problemhosts/actions/WidgetView.php b/ui/widgets/problemhosts/actions/WidgetView.php new file mode 100644 index 00000000000..63ff9ee9947 --- /dev/null +++ b/ui/widgets/problemhosts/actions/WidgetView.php @@ -0,0 +1,246 @@ +<?php declare(strict_types = 0); +/* +** Zabbix +** Copyright (C) 2001-2022 Zabbix SIA +** +** 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; either version 2 of the License, or +** (at your option) any later version. +** +** 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. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +**/ + + +namespace Widgets\ProblemHosts\Actions; + +use API, + CArrayHelper, + CControllerDashboardWidgetView, + CControllerResponseData, + CRoleHelper; + +class WidgetView extends CControllerDashboardWidgetView { + + protected function doAction(): void { + $filter_groupids = $this->fields_values['groupids'] ? getSubGroups($this->fields_values['groupids']) : null; + $filter_hostids = $this->fields_values['hostids'] ?: null; + $filter_problem = $this->fields_values['problem'] !== '' ? $this->fields_values['problem'] : null; + $filter_severities = $this->fields_values['severities'] ?: range(TRIGGER_SEVERITY_NOT_CLASSIFIED, + TRIGGER_SEVERITY_COUNT - 1 + ); + $filter_show_suppressed = $this->fields_values['show_suppressed']; + $filter_ext_ack = $this->fields_values['ext_ack']; + + if ($this->fields_values['exclude_groupids']) { + $exclude_groupids = getSubGroups($this->fields_values['exclude_groupids']); + + if ($filter_hostids === null) { + // Get all groups if no selected groups defined. + if ($filter_groupids === null) { + $filter_groupids = array_keys(API::HostGroup()->get([ + 'output' => [], + 'with_hosts' => true, + 'preservekeys' => true + ])); + } + + $filter_groupids = array_diff($filter_groupids, $exclude_groupids); + + // Get available hosts. + $filter_hostids = array_keys(API::Host()->get([ + 'output' => [], + 'groupids' => $filter_groupids, + 'preservekeys' => true + ])); + } + + $exclude_hostids = array_keys(API::Host()->get([ + 'output' => [], + 'groupids' => $exclude_groupids, + 'preservekeys' => true + ])); + + $filter_hostids = array_diff($filter_hostids, $exclude_hostids); + } + + // Get host groups. + $groups = API::HostGroup()->get([ + 'output' => ['groupid', 'name'], + 'groupids' => $filter_groupids, + 'hostids' => $filter_hostids, + 'with_monitored_hosts' => true, + 'preservekeys' => true + ]); + + foreach ($groups as $groupid => $group) { + $groups[$groupid]['highest_severity'] = TRIGGER_SEVERITY_NOT_CLASSIFIED; + $groups[$groupid]['hosts_total_count'] = 0; + $groups[$groupid]['hosts_problematic_unack_count'] = 0; + $groups[$groupid]['hosts_problematic_unack_list'] = []; + + if ($filter_ext_ack != EXTACK_OPTION_UNACK) { + $groups[$groupid]['hosts_problematic_count'] = 0; + $groups[$groupid]['hosts_problematic_list'] = []; + } + } + + // Get hosts. + $hosts = API::Host()->get([ + 'output' => ['hostid', 'name', 'maintenanceid', 'maintenance_status', 'maintenance_type'], + 'selectHostGroups' => ['groupid'], + 'groupids' => array_keys($groups), + 'hostids' => $filter_hostids, + 'filter' => [ + 'maintenance_status' => null + ], + 'monitored_hosts' => true, + 'preservekeys' => true + ]); + + // Get triggers. + $triggers = API::Trigger()->get([ + 'output' => [], + 'selectHosts' => ['hostid'], + 'hostids' => array_keys($hosts), + 'groupids' => array_keys($groups), + 'filter' => [ + 'value' => TRIGGER_VALUE_TRUE + ], + 'monitored' => true, + 'preservekeys' => true + ]); + + // Add default values for each host group and count hosts inside. + foreach ($hosts as $host) { + foreach ($host['hostgroups'] as $group) { + if (array_key_exists($group['groupid'], $groups)) { + $groups[$group['groupid']]['hosts_total_count']++; + } + } + } + + // Get problems. + $problems = API::Problem()->get([ + 'output' => ['objectid', 'acknowledged', 'severity'], + 'groupids' => array_keys($groups), + 'hostids' => array_keys($hosts), + 'objectids' => array_keys($triggers), + 'search' => [ + 'name' => $filter_problem + ], + 'severities' => $filter_severities, + 'evaltype' => $this->fields_values['evaltype'], + 'tags' => $this->fields_values['tags'], + 'acknowledged' => ($filter_ext_ack == EXTACK_OPTION_UNACK) ? false : null, + 'suppressed' => ($filter_show_suppressed == ZBX_PROBLEM_SUPPRESSED_FALSE) ? false : null + ]); + + $hosts_data = []; + + // Process problems. + foreach ($problems as $problem) { + foreach ($triggers[$problem['objectid']]['hosts'] as $trigger_host) { + if (!array_key_exists($trigger_host['hostid'], $hosts)) { + continue; + } + + $host = $hosts[$trigger_host['hostid']]; + + // Prepare hosts data for tables displayed in hintboxes. + if (!array_key_exists($host['hostid'], $hosts_data)) { + $hosts_data[$host['hostid']] = [ + 'host' => $host['name'], + 'hostid' => $host['hostid'], + 'maintenanceid' => $host['maintenanceid'], + 'maintenance_status' => $host['maintenance_status'], + 'maintenance_type' => $host['maintenance_type'], + 'severities' => array_fill_keys($filter_severities, 0) + ]; + } + + // Count number of host problems per severity. + $hosts_data[$host['hostid']]['severities'][$problem['severity']]++; + + // Propagate problem to all host groups in which host is added. + foreach ($host['hostgroups'] as $group) { + $groupid = $group['groupid']; + + if (!array_key_exists($groupid, $groups)) { + continue; + } + + // Searches for the highest severity set for filtered problems in particular host group. + if ($problem['severity'] > $groups[$groupid]['highest_severity']) { + $groups[$groupid]['highest_severity'] = $problem['severity']; + } + + /** + * Counts: + * - problematic hosts (hosts with events in 'problem' state); + * - unacknowledged problematic hosts (hosts with unacknowledged events in 'problem' state). + * + * Creates a list of problematic hosts and unacknowledged problematic hosts for each host group. + * + * Each host need to be counted only one time in each host group. + * Host name is added for sorting. + */ + if ($filter_ext_ack != EXTACK_OPTION_UNACK + && !array_key_exists($host['hostid'], $groups[$groupid]['hosts_problematic_list'])) { + $groups[$groupid]['hosts_problematic_list'][$host['hostid']]['name'] = $host['name']; + $groups[$groupid]['hosts_problematic_count']++; + } + + if ($problem['acknowledged'] == EVENT_NOT_ACKNOWLEDGED + && !array_key_exists($host['hostid'], $groups[$groupid]['hosts_problematic_unack_list'])) { + $groups[$groupid]['hosts_problematic_unack_list'][$host['hostid']]['name'] = $host['name']; + $groups[$groupid]['hosts_problematic_unack_count']++; + } + } + } + } + + // Sort results. + foreach ($groups as $groupid => $group) { + if ($group['hosts_total_count'] != 0) { + CArrayHelper::sort($groups[$groupid]['hosts_problematic_unack_list'], ['name']); + + if ($filter_ext_ack != EXTACK_OPTION_UNACK) { + CArrayHelper::sort($groups[$groupid]['hosts_problematic_list'], ['name']); + } + } + else { + // Unset groups without any monitored hosts. + unset($groups[$groupid]); + } + } + + CArrayHelper::sort($groups, ['name']); + + // Pass results to view. + $this->setResponse(new CControllerResponseData([ + 'name' => $this->getInput('name', $this->widget->getDefaultName()), + 'filter' => [ + 'hostids' => $this->fields_values['hostids'], + 'problem' => $this->fields_values['problem'], + 'severities' => $filter_severities, + 'show_suppressed' => $this->fields_values['show_suppressed'], + 'hide_empty_groups' => $this->fields_values['hide_empty_groups'], + 'ext_ack' => $this->fields_values['ext_ack'] + ], + 'hosts_data' => $hosts_data, + 'groups' => $groups, + 'user' => [ + 'debug_mode' => $this->getDebugMode() + ], + 'allowed_ui_problems' => $this->checkAccess(CRoleHelper::UI_MONITORING_PROBLEMS) + ])); + } +} |