<?php declare(strict_types = 0); /* ** Copyright (C) 2001-2025 Zabbix SIA ** ** This program is free software: you can redistribute it and/or modify it under the terms of ** the GNU Affero General Public License as published by the Free Software Foundation, version 3. ** ** 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 Affero General Public License for more details. ** ** You should have received a copy of the GNU Affero General Public License along with this program. ** If not, see <https://www.gnu.org/licenses/>. **/ namespace Widgets\HostAvail\Actions; use API, CControllerDashboardWidgetView, CControllerResponseData, CItemGeneral; class WidgetView extends CControllerDashboardWidgetView { private const INTERFACE_STATUSES = [ INTERFACE_AVAILABLE_UNKNOWN, INTERFACE_AVAILABLE_TRUE, INTERFACE_AVAILABLE_FALSE, INTERFACE_AVAILABLE_MIXED ]; protected function doAction(): void { $interface_types = array_merge([INTERFACE_TYPE_AGENT_ACTIVE], CItemGeneral::INTERFACE_TYPES_BY_PRIORITY); // Sanitize non-existing interface types. $this->fields_values['interface_type'] = array_values( array_intersect($interface_types, $this->fields_values['interface_type']) ); $interface_types = $this->fields_values['interface_type'] ?: $interface_types; $interface_totals = array_fill_keys($interface_types, 0); $interface_type_count = array_fill_keys($interface_types, array_fill_keys(self::INTERFACE_STATUSES, 0)); $total_hosts = array_fill_keys(self::INTERFACE_STATUSES, 0); if (!$this->isTemplateDashboard() || $this->isTemplateDashboard() && $this->fields_values['override_hostid']) { $options = [ 'output' => in_array(INTERFACE_TYPE_AGENT_ACTIVE, $interface_types) ? ['active_available'] : [], 'selectInterfaces' => ['interfaceid', 'type', 'available'], 'monitored_hosts' => true, 'preservekeys' => true ]; if (!$this->isTemplateDashboard() && $this->fields_values['groupids']) { $options['groupids'] = getSubGroups($this->fields_values['groupids']); } if ($this->isTemplateDashboard()) { $options['hostids'] = $this->fields_values['override_hostid']; } if ($this->fields_values['maintenance'] == HOST_MAINTENANCE_STATUS_OFF) { $options['filter'] = ['maintenance_status' => HOST_MAINTENANCE_STATUS_OFF]; } $db_hosts = API::Host()->get($options); $db_items_active_count = in_array(INTERFACE_TYPE_AGENT_ACTIVE, $interface_types) ? array_filter(getEnabledItemTypeCountByHostId(ITEM_TYPE_ZABBIX_ACTIVE, array_keys($db_hosts))) : []; $interfaceids = []; foreach ($db_hosts as &$host) { $interfaces_to_keep = []; foreach ($host['interfaces'] as $interface) { if (in_array($interface['type'], $interface_types)) { $interfaces_to_keep[] = $interface; $interfaceids[] = $interface['interfaceid']; } } $host['interfaces'] = $interfaces_to_keep; } unset($host); $interface_enabled_items_count = getEnabledItemsCountByInterfaceIds($interfaceids); foreach ($db_hosts as $hostid => $host) { $host_interfaces = array_fill_keys($interface_types, []); foreach ($host['interfaces'] as $interface) { $interfaceid = $interface['interfaceid']; $interface['has_enabled_items'] = array_key_exists($interfaceid, $interface_enabled_items_count) && $interface_enabled_items_count[$interfaceid] > 0; $host_interfaces[$interface['type']][] = $interface; } if (array_key_exists('active_available', $host)) { $host_interfaces[INTERFACE_TYPE_AGENT_ACTIVE][] = $host['active_available']; } $host_interfaces = array_filter($host_interfaces); $host_interfaces_status = array_fill_keys(array_keys($host_interfaces), []); foreach ($host_interfaces as $type => $interfaces) { if ($type == INTERFACE_TYPE_AGENT_ACTIVE) { if (array_key_exists($hostid, $db_items_active_count)) { $status = $interfaces[0]; $has_enabled_items = true; } else { continue; } } else { $status = getInterfaceAvailabilityStatus($interfaces); $has_enabled_items = array_filter(array_column($interfaces, 'has_enabled_items')); } $interface_type_count[$type][$status]++; $interface_totals[$type]++; $host_interfaces_status[$type] = ['available' => $status, 'has_enabled_items' => $has_enabled_items ]; } $host_interfaces_status = array_filter($host_interfaces_status); if ($host_interfaces_status) { $total_hosts[getInterfaceAvailabilityStatus($host_interfaces_status)]++; } } } $this->setResponse(new CControllerResponseData([ 'name' => $this->getInput('name', $this->widget->getDefaultName()), 'layout' => $this->fields_values['layout'], 'only_totals' => $this->fields_values['only_totals'], 'interface_types' => $interface_types, 'interface_type_count' => $interface_type_count, 'interface_totals' => $interface_totals, 'total_hosts' => $total_hosts, 'total_hosts_sum' => array_sum($total_hosts), 'user' => [ 'debug_mode' => $this->getDebugMode() ] ])); } }