addJsFile('class.tagfilteritem.js'); $this->includeJsFile('configuration.host.list.js.php'); if ($data['uncheck']) { uncheckTableRows('hosts'); } $html_page = (new CHtmlPage()) ->setTitle(_('Hosts')) ->setDocUrl(CDocHelper::getUrl(CDocHelper::DATA_COLLECTION_HOST_LIST)) ->setControls((new CTag('nav', true, (new CList()) ->addItem( (new CSimpleButton(_('Create host'))) ->onClick('view.createHost()') ) ->addItem( (new CButton('form', _('Import'))) ->onClick( 'return PopUp("popup.import", { rules_preset: "host", '. CCsrfTokenHelper::CSRF_TOKEN_NAME.': "'. CCsrfTokenHelper::get('import'). '"}, { dialogueid: "popup_import", dialogue_class: "modal-popup-generic" });' ) ->removeId() ) ))->setAttribute('aria-label', _('Content controls')) ); $action_url = (new CUrl('zabbix.php'))->setArgument('action', $data['action']); $filter = (new CFilter()) ->setResetUrl($action_url) ->setProfile($data['profileIdx']) ->setActiveTab($data['active_tab']) ->addVar('action', $data['action'], 'filter_action') ->addFilterTab(_('Filter'), [ (new CFormGrid()) ->addClass(CFormGrid::ZBX_STYLE_FORM_GRID_LABEL_WIDTH_TRUE) ->addItem([ new CLabel(_('Host groups'), 'filter_groups__ms'), new CFormField( (new CMultiSelect([ 'name' => 'filter_groups[]', 'object_name' => 'hostGroup', 'data' => $data['filter']['groups'], 'popup' => [ 'parameters' => [ 'srctbl' => 'host_groups', 'srcfld1' => 'groupid', 'dstfrm' => 'zbx_filter', 'dstfld1' => 'filter_groups_', 'with_hosts' => true, 'editable' => true, 'enrich_parent_groups' => true ] ] ]))->setWidth(ZBX_TEXTAREA_MEDIUM_WIDTH) ) ]) ->addItem([ new CLabel(_('Templates'), 'filter_templates__ms'), new CFormField( (new CMultiSelect([ 'name' => 'filter_templates[]', 'object_name' => 'templates', 'data' => $data['filter']['templates'], 'popup' => [ 'parameters' => [ 'srctbl' => 'templates', 'srcfld1' => 'hostid', 'srcfld2' => 'host', 'dstfrm' => 'zbx_filter', 'dstfld1' => 'filter_templates_' ] ] ]))->setWidth(ZBX_TEXTAREA_MEDIUM_WIDTH) ) ]) ->addItem([ new CLabel(_('Name'), 'filter_host'), new CFormField( (new CTextBox('filter_host', $data['filter']['host']))->setWidth(ZBX_TEXTAREA_MEDIUM_WIDTH) ) ]) ->addItem([ new CLabel(_('DNS'), 'filter_dns'), new CFormField( (new CTextBox('filter_dns', $data['filter']['dns']))->setWidth(ZBX_TEXTAREA_MEDIUM_WIDTH) ) ]) ->addItem([ new CLabel(_('IP'), 'filter_ip'), new CFormField( (new CTextBox('filter_ip', $data['filter']['ip']))->setWidth(ZBX_TEXTAREA_MEDIUM_WIDTH) ) ]) ->addItem([ new CLabel(_('Port'), 'filter_port'), new CFormField( (new CTextBox('filter_port', $data['filter']['port']))->setWidth(ZBX_TEXTAREA_MEDIUM_WIDTH) ) ]), (new CFormGrid()) ->addClass(CFormGrid::ZBX_STYLE_FORM_GRID_LABEL_WIDTH_TRUE) ->addItem([ new CLabel(_('Status'), 'filter_status'), new CFormField( (new CRadioButtonList('filter_status', (int) $data['filter']['status'])) ->addValue(_('Any'), -1) ->addValue(_('Enabled'), HOST_STATUS_MONITORED) ->addValue(_('Disabled'), HOST_STATUS_NOT_MONITORED) ->setModern(true) ) ]) ->addItem([ new CLabel(_('Monitored by'), 'filter_monitored_by'), new CFormField( (new CRadioButtonList('filter_monitored_by', (int) $data['filter']['monitored_by'])) ->addValue(_('Any'), ZBX_MONITORED_BY_ANY) ->addValue(_('Server'), ZBX_MONITORED_BY_SERVER) ->addValue(_('Proxy'), ZBX_MONITORED_BY_PROXY) ->setModern(true) ) ]) ->addItem([ new CLabel(_('Proxy'), 'filter_proxyids__ms'), new CFormField( (new CMultiSelect([ 'name' => 'filter_proxyids[]', 'object_name' => 'proxies', 'data' => $data['proxies_ms'], 'disabled' => ($data['filter']['monitored_by'] != ZBX_MONITORED_BY_PROXY), 'popup' => [ 'parameters' => [ 'srctbl' => 'proxies', 'srcfld1' => 'proxyid', 'srcfld2' => 'name', 'dstfrm' => 'zbx_filter', 'dstfld1' => 'filter_proxyids_' ] ] ]))->setWidth(ZBX_TEXTAREA_MEDIUM_WIDTH) ) ]) ->addItem([ new CLabel(_('Tags')), new CFormField( CTagFilterFieldHelper::getTagFilterField([ 'evaltype' => $data['filter']['evaltype'], 'tags' => $data['filter']['tags'] ]) ) ]) ]); $html_page->addItem($filter); // table hosts $form = (new CForm())->setName('hosts'); $header_checkbox = (new CCheckBox('all_hosts'))->onClick("checkAll('".$form->getName()."', 'all_hosts', 'hostids');"); $show_monitored_by = ($data['filter']['monitored_by'] == ZBX_MONITORED_BY_PROXY || $data['filter']['monitored_by'] == ZBX_MONITORED_BY_ANY); $header_sortable_name = make_sorting_header(_('Name'), 'name', $data['sortField'], $data['sortOrder'], $action_url->getUrl() ); $header_sortable_status = make_sorting_header(_('Status'), 'status', $data['sortField'], $data['sortOrder'], $action_url->getUrl() ); $table = (new CTableInfo()) ->setHeader([ (new CColHeader($header_checkbox))->addClass(ZBX_STYLE_CELL_WIDTH), $header_sortable_name, _('Items'), _('Triggers'), _('Graphs'), _('Discovery'), _('Web'), _('Interface'), $show_monitored_by ? _('Proxy') : null, _('Templates'), $header_sortable_status, _('Availability'), _('Agent encryption'), _('Info'), _('Tags') ]); $current_time = time(); $csrf_token_massupdate = CCsrfTokenHelper::get('host'); foreach ($data['hosts'] as $host) { // Select an interface from the list with highest priority. $interface = null; if ($host['interfaces']) { foreach (CItem::INTERFACE_TYPES_BY_PRIORITY as $interface_type) { $host_interfaces = array_filter($host['interfaces'], function(array $host_interface) use ($interface_type) { return ($host_interface['type'] == $interface_type); }); if ($host_interfaces) { $interface = reset($host_interfaces); break; } } } $description = []; if ($host['flags'] == ZBX_FLAG_DISCOVERY_CREATED) { if ($host['discoveryRule']) { if ($host['is_discovery_rule_editable']) { $description[] = (new CLink($host['discoveryRule']['name'], (new CUrl('host_prototypes.php')) ->setArgument('form', 'update') ->setArgument('parent_discoveryid', $host['discoveryRule']['itemid']) ->setArgument('hostid', $host['hostDiscovery']['parent_hostid']) ->setArgument('context', 'host') )) ->addClass(ZBX_STYLE_LINK_ALT) ->addClass(ZBX_STYLE_ORANGE); } else { $description[] = (new CSpan($host['discoveryRule']['name']))->addClass(ZBX_STYLE_ORANGE); } } else { $description[] = (new CSpan(_('Inaccessible discovery rule')))->addClass(ZBX_STYLE_ORANGE); } $description[] = NAME_DELIMITER; } $description[] = (new CLink($host['name'], (new CUrl('zabbix.php')) ->setArgument('action', 'host.edit') ->setArgument('hostid', $host['hostid']) )) ->setAttribute('data-hostid', $host['hostid']) ->onClick('view.editHost(event, this.dataset.hostid);'); $maintenance_icon = false; $status_toggle_url = (new CUrl('zabbix.php')) ->setArgument('action', 'popup.massupdate.host') ->setArgument('hostids', [$host['hostid']]) ->setArgument('visible[status]', 1) ->setArgument('update', 1) ->setArgument('backurl', (new CUrl('zabbix.php')) ->setArgument('action', 'host.list') ->setArgument('page', CPagerHelper::loadPage('host.list', null)) ->getUrl() ); if ($host['status'] == HOST_STATUS_MONITORED) { if ($host['maintenance_status'] == HOST_MAINTENANCE_STATUS_ON) { if (array_key_exists($host['maintenanceid'], $data['maintenances'])) { $maintenance = $data['maintenances'][$host['maintenanceid']]; $maintenance_icon = makeMaintenanceIcon($host['maintenance_type'], $maintenance['name'], $maintenance['description'] ); } else { $maintenance_icon = makeMaintenanceIcon($host['maintenance_type'], _('Inaccessible maintenance'), ''); } } $status_toggle_url->setArgument('status', HOST_STATUS_NOT_MONITORED); $toggle_status_link = (new CLink(_('Enabled'), $status_toggle_url->getUrl())) ->addClass(ZBX_STYLE_LINK_ACTION) ->addClass(ZBX_STYLE_GREEN) ->addConfirmation(_('Disable host?')) ->addCsrfToken($csrf_token_massupdate); } else { $status_toggle_url->setArgument('status', HOST_STATUS_MONITORED); $toggle_status_link = (new CLink(_('Disabled'), $status_toggle_url->getUrl())) ->addClass(ZBX_STYLE_LINK_ACTION) ->addClass(ZBX_STYLE_RED) ->addConfirmation(_('Enable host?')) ->addCsrfToken($csrf_token_massupdate); } if ($maintenance_icon) { $description[] = $maintenance_icon; } order_result($host['parentTemplates'], 'name'); $hostTemplates = []; $i = 0; foreach ($host['parentTemplates'] as $template) { $i++; if ($i > $data['config']['max_in_table']) { $hostTemplates[] = [' ', HELLIP()]; break; } if (array_key_exists($template['templateid'], $data['writable_templates']) && $data['allowed_ui_conf_templates']) { $caption = [ (new CLink($template['name'])) ->addClass('js-edit-template') ->setAttribute('data-templateid', $template['templateid']) ->addClass(ZBX_STYLE_LINK_ALT) ->addClass(ZBX_STYLE_GREY) ]; } else { $caption = [ (new CSpan($template['name']))->addClass(ZBX_STYLE_GREY) ]; } $parent_templates = $data['templates'][$template['templateid']]['parentTemplates']; if ($parent_templates) { order_result($parent_templates, 'name'); $caption[] = ' ('; foreach ($parent_templates as $parent_template) { if (array_key_exists($parent_template['templateid'], $data['writable_templates']) && $data['allowed_ui_conf_templates']) { $caption[] = (new CLink($parent_template['name'])) ->addClass('js-edit-template') ->setAttribute('data-templateid', $parent_template['templateid']) ->addClass(ZBX_STYLE_LINK_ALT) ->addClass(ZBX_STYLE_GREY); } else { $caption[] = (new CSpan($parent_template['name']))->addClass(ZBX_STYLE_GREY); } $caption[] = ', '; } array_pop($caption); $caption[] = ')'; } if ($hostTemplates) { $hostTemplates[] = ', '; } $hostTemplates[] = $caption; } $info_icons = []; if ($host['flags'] == ZBX_FLAG_DISCOVERY_CREATED && $host['hostDiscovery']['ts_delete'] != 0) { $info_icons[] = getHostLifetimeIndicator($current_time, (int) $host['hostDiscovery']['ts_delete']); } if ($host['tls_connect'] == HOST_ENCRYPTION_NONE && ($host['tls_accept'] & HOST_ENCRYPTION_NONE) == HOST_ENCRYPTION_NONE && ($host['tls_accept'] & HOST_ENCRYPTION_PSK) != HOST_ENCRYPTION_PSK && ($host['tls_accept'] & HOST_ENCRYPTION_CERTIFICATE) != HOST_ENCRYPTION_CERTIFICATE) { $encryption = (new CDiv((new CSpan(_('None')))->addClass(ZBX_STYLE_STATUS_GREEN))) ->addClass(ZBX_STYLE_STATUS_CONTAINER); } else { // Incoming encryption. if ($host['tls_connect'] == HOST_ENCRYPTION_NONE) { $in_encryption = (new CSpan(_('None')))->addClass(ZBX_STYLE_STATUS_GREEN); } elseif ($host['tls_connect'] == HOST_ENCRYPTION_PSK) { $in_encryption = (new CSpan(_('PSK')))->addClass(ZBX_STYLE_STATUS_GREEN); } else { $in_encryption = (new CSpan(_('CERT')))->addClass(ZBX_STYLE_STATUS_GREEN); } // Outgoing encryption. $out_encryption = []; if (($host['tls_accept'] & HOST_ENCRYPTION_NONE) == HOST_ENCRYPTION_NONE) { $out_encryption[] = (new CSpan(_('None')))->addClass(ZBX_STYLE_STATUS_GREEN); } else { $out_encryption[] = (new CSpan(_('None')))->addClass(ZBX_STYLE_STATUS_GREY); } if (($host['tls_accept'] & HOST_ENCRYPTION_PSK) == HOST_ENCRYPTION_PSK) { $out_encryption[] = (new CSpan(_('PSK')))->addClass(ZBX_STYLE_STATUS_GREEN); } else { $out_encryption[] = (new CSpan(_('PSK')))->addClass(ZBX_STYLE_STATUS_GREY); } if (($host['tls_accept'] & HOST_ENCRYPTION_CERTIFICATE) == HOST_ENCRYPTION_CERTIFICATE) { $out_encryption[] = (new CSpan(_('CERT')))->addClass(ZBX_STYLE_STATUS_GREEN); } else { $out_encryption[] = (new CSpan(_('CERT')))->addClass(ZBX_STYLE_STATUS_GREY); } $encryption = (new CDiv([new CSpan($in_encryption), ' ', new CSpan($out_encryption)])) ->addClass(ZBX_STYLE_STATUS_CONTAINER) ->addClass(ZBX_STYLE_NOWRAP); } $monitored_by = null; if ($show_monitored_by) { $monitored_by = ($host['proxyid'] != 0) ? $data['proxies'][$host['proxyid']]['name'] : ''; } $table->addRow([ new CCheckBox('hostids['.$host['hostid'].']', $host['hostid']), (new CCol($description))->addClass(ZBX_STYLE_NOWRAP), [ new CLink(_('Items'), (new CUrl('items.php')) ->setArgument('filter_set', '1') ->setArgument('filter_hostids', [$host['hostid']]) ->setArgument('context', 'host') ), CViewHelper::showNum($host['items']) ], [ new CLink(_('Triggers'), (new CUrl('triggers.php')) ->setArgument('filter_set', '1') ->setArgument('filter_hostids', [$host['hostid']]) ->setArgument('context', 'host') ), CViewHelper::showNum($host['triggers']) ], [ new CLink(_('Graphs'), (new CUrl('graphs.php')) ->setArgument('filter_set', '1') ->setArgument('filter_hostids', [$host['hostid']]) ->setArgument('context', 'host') ), CViewHelper::showNum($host['graphs']) ], [ new CLink(_('Discovery'), (new CUrl('host_discovery.php')) ->setArgument('filter_set', '1') ->setArgument('filter_hostids', [$host['hostid']]) ->setArgument('context', 'host') ), CViewHelper::showNum($host['discoveries']) ], [ new CLink(_('Web'), (new CUrl('httpconf.php')) ->setArgument('filter_set', '1') ->setArgument('filter_hostids', [$host['hostid']]) ->setArgument('context', 'host') ), CViewHelper::showNum($host['httpTests']) ], getHostInterface($interface), $monitored_by, $hostTemplates, $toggle_status_link, getHostAvailabilityTable($host['interfaces']), $encryption, makeInformationList($info_icons), $data['tags'][$host['hostid']] ]); } $status_toggle_url = (new CUrl('zabbix.php')) ->setArgument('action', 'popup.massupdate.host') ->setArgument(CCsrfTokenHelper::CSRF_TOKEN_NAME, $csrf_token_massupdate) ->setArgument('visible[status]', 1) ->setArgument('update', 1) ->setArgument('backurl', (new CUrl('zabbix.php')) ->setArgument('action', 'host.list') ->setArgument('page', CPagerHelper::loadPage('host.list', null)) ->getUrl() ); $form->addItem([ $table, $data['paging'], new CActionButtonList('action', 'hostids', [ 'enable-hosts' => [ 'name' => _('Enable'), 'confirm_singular' => _('Enable selected host?'), 'confirm_plural' => _('Enable selected hosts?'), 'redirect' => $status_toggle_url ->setArgument('status', HOST_STATUS_MONITORED) ->getUrl() ], 'disable-hosts' => [ 'name' => _('Disable'), 'confirm_singular' => _('Disable selected host?'), 'confirm_plural' => _('Disable selected hosts?'), 'redirect' => $status_toggle_url ->setArgument('status', HOST_STATUS_NOT_MONITORED) ->getUrl() ], 'host.export' => [ 'content' => new CButtonExport('export.hosts', $action_url ->setArgument('page', ($data['page'] == 1) ? null : $data['page']) ->getUrl() ) ], 'popup.massupdate.host' => [ 'content' => (new CSimpleButton(_('Mass update'))) ->addClass(ZBX_STYLE_BTN_ALT) ->addClass('js-no-chkbxrange') ->onClick( "openMassupdatePopup('popup.massupdate.host', {". CCsrfTokenHelper::CSRF_TOKEN_NAME.": '".$csrf_token_massupdate. "'}, { dialogue_class: 'modal-popup-static', trigger_element: this });" ) ], 'host.massdelete' => [ 'content' => (new CSimpleButton(_('Delete'))) ->onClick('view.massDeleteHosts(this);') ->addClass(ZBX_STYLE_BTN_ALT) ->addClass('js-no-chkbxrange') ->removeId() ] ], 'hosts') ]); $html_page ->addItem($form) ->show(); (new CScriptTag(' view.init('.json_encode([ 'applied_filter_groupids' => array_keys($data['filter']['groups']) ]).'); ')) ->setOnDocumentReady() ->show();