addValidationRules([ 'dynamic_hostid' => 'db hosts.hostid' ]); } protected function doAction(): void { $interface_types = 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']) ); $hosts_types = $this->fields_values['interface_type'] ?: $interface_types; $hosts_total = array_fill_keys($interface_types, 0); $hosts_count = array_fill_keys($interface_types, [ INTERFACE_AVAILABLE_UNKNOWN => 0, INTERFACE_AVAILABLE_TRUE => 0, INTERFACE_AVAILABLE_FALSE => 0 ]); if ($this->isTemplateDashboard() && $this->hasInput('dynamic_hostid') || !$this->isTemplateDashboard()) { $options = [ 'output' => [], 'selectInterfaces' => ['type', 'available'], 'filter' => $this->fields_values['maintenance'] == HOST_MAINTENANCE_STATUS_OFF ? ['status' => HOST_STATUS_MONITORED, 'maintenance_status' => HOST_MAINTENANCE_STATUS_OFF] : ['status' => HOST_STATUS_MONITORED] ]; if ($this->isTemplateDashboard() && $this->hasInput('dynamic_hostid')) { $options['hostids'] = [$this->getInput('dynamic_hostid')]; } else { $options['groupids'] = !$this->isTemplateDashboard() && $this->fields_values['groupids'] ? getSubGroups($this->fields_values['groupids']) : null; } $db_hosts = API::Host()->get($options); $availability_priority = [INTERFACE_AVAILABLE_FALSE, INTERFACE_AVAILABLE_UNKNOWN, INTERFACE_AVAILABLE_TRUE]; foreach ($db_hosts as $host) { $host_interfaces = array_fill_keys($interface_types, []); foreach ($host['interfaces'] as $interface) { $host_interfaces[$interface['type']][] = $interface['available']; } $host_interfaces = array_filter($host_interfaces); foreach ($host_interfaces as $type => $interfaces) { $interfaces_availability = array_intersect($availability_priority, $interfaces); $available = reset($interfaces_availability); $hosts_count[$type][$available]++; $hosts_total[$type]++; } } } $this->setResponse(new CControllerResponseData([ 'name' => $this->getInput('name', $this->widget->getDefaultName()), 'layout' => $this->fields_values['layout'], 'hosts_types' => $hosts_types, 'hosts_count' => $hosts_count, 'hosts_total' => $hosts_total, 'user' => [ 'debug_mode' => $this->getDebugMode() ] ])); } }