You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
532 lines
16 KiB
532 lines
16 KiB
<?php declare(strict_types = 0);
|
|
/*
|
|
** Zabbix
|
|
** Copyright (C) 2001-2023 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.
|
|
**/
|
|
|
|
|
|
/**
|
|
* @var CPartial $this
|
|
* @var array $data
|
|
*/
|
|
|
|
$this->includeJsFile('configuration.host.edit.html.js.php');
|
|
|
|
$host_is_discovered = ($data['host']['flags'] == ZBX_FLAG_DISCOVERY_CREATED);
|
|
|
|
$host_form = (new CForm())
|
|
->addItem((new CVar(CCsrfTokenHelper::CSRF_TOKEN_NAME, CCsrfTokenHelper::get('host')))->removeId())
|
|
->setId($data['form_name'])
|
|
->setName($data['form_name'])
|
|
->setAction((new CUrl('zabbix.php'))
|
|
->setArgument('action', $data['form_action'])
|
|
->getUrl()
|
|
)
|
|
->addVar('hostid', $data['hostid'])
|
|
->addVar('clone_hostid', $data['clone_hostid'])
|
|
->addVar('clone', $data['clone'])
|
|
->addItem((new CSubmitButton())->addClass(ZBX_STYLE_FORM_SUBMIT_HIDDEN));
|
|
|
|
// Host tab.
|
|
$discovered_by = null;
|
|
$interfaces_row = null;
|
|
|
|
if ($host_is_discovered) {
|
|
if ($data['host']['discoveryRule']) {
|
|
if ($data['is_discovery_rule_editable']) {
|
|
$discovery_rule = (new CLink($data['host']['discoveryRule']['name'],
|
|
(new CUrl('host_prototypes.php'))
|
|
->setArgument('form', 'update')
|
|
->setArgument('parent_discoveryid', $data['host']['discoveryRule']['itemid'])
|
|
->setArgument('hostid', $data['host']['hostDiscovery']['parent_hostid'])
|
|
->setArgument('context', 'host')
|
|
))->setAttribute('target', '_blank');
|
|
}
|
|
else {
|
|
$discovery_rule = new CSpan($data['host']['discoveryRule']['name']);
|
|
}
|
|
}
|
|
else {
|
|
$discovery_rule = (new CSpan(_('Inaccessible discovery rule')))->addClass(ZBX_STYLE_GREY);
|
|
}
|
|
|
|
$discovered_by = [new CLabel(_('Discovered by')), new CFormField($discovery_rule)];
|
|
}
|
|
|
|
$agent_interfaces = (new CDiv())
|
|
->setId('agentInterfaces')
|
|
->addClass(ZBX_STYLE_HOST_INTERFACE_CONTAINER)
|
|
->setAttribute('data-type', 'agent');
|
|
|
|
$snmp_interfaces = (new CDiv())
|
|
->setId('SNMPInterfaces')
|
|
->addClass(ZBX_STYLE_HOST_INTERFACE_CONTAINER.' '.ZBX_STYLE_LIST_VERTICAL_ACCORDION)
|
|
->setAttribute('data-type', 'snmp');
|
|
|
|
$jmx_interfaces = (new CDiv())
|
|
->setId('JMXInterfaces')
|
|
->addClass(ZBX_STYLE_HOST_INTERFACE_CONTAINER)
|
|
->setAttribute('data-type', 'jmx');
|
|
|
|
$ipmi_interfaces = (new CDiv())
|
|
->setId('IPMIInterfaces')
|
|
->addClass(ZBX_STYLE_HOST_INTERFACE_CONTAINER)
|
|
->setAttribute('data-type', 'ipmi');
|
|
|
|
$host_tab = (new CFormGrid())
|
|
->addItem($discovered_by)
|
|
->addItem([
|
|
(new CLabel(_('Host name'), 'host'))->setAsteriskMark(),
|
|
new CFormField(
|
|
(new CTextBox('host', $data['host']['host'], $host_is_discovered, DB::getFieldLength('hosts', 'host')))
|
|
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
|
|
->setAriaRequired()
|
|
->setAttribute('autofocus', 'autofocus')
|
|
)
|
|
])
|
|
->addItem([
|
|
new CLabel(_('Visible name'), 'visiblename'),
|
|
new CFormField(
|
|
(new CTextBox('visiblename', $data['host']['visiblename'], $host_is_discovered, DB::getFieldLength('hosts', 'name')))
|
|
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
|
|
)
|
|
]);
|
|
|
|
$templates_field_items = [];
|
|
|
|
if ($data['host']['parentTemplates']) {
|
|
$linked_templates = (new CTable())
|
|
->setHeader([_('Name'), _('Action')])
|
|
->setId('linked-templates')
|
|
->addClass(ZBX_STYLE_TABLE_FORMS)
|
|
->addStyle('width: '.ZBX_TEXTAREA_STANDARD_WIDTH.'px;');
|
|
|
|
foreach ($data['host']['parentTemplates'] as $template) {
|
|
if ($data['allowed_ui_conf_templates']
|
|
&& array_key_exists($template['templateid'], $data['editable_templates'])) {
|
|
$template_link = (new CLink($template['name']))
|
|
->addClass('js-edit-linked-template')
|
|
->setAttribute('data-templateid', $template['templateid']);
|
|
}
|
|
else {
|
|
$template_link = new CSpan($template['name']);
|
|
}
|
|
|
|
$template_row = [$template_link];
|
|
|
|
if ($template['link_type'] == TEMPLATE_LINK_LLD) {
|
|
$template_row[] = (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN);
|
|
$template_row[] = new CSup(_('(linked by host discovery)'));
|
|
}
|
|
|
|
$template_row[] = (new CVar('templates[]', $template['templateid']))->removeId();
|
|
|
|
$linked_templates->addRow([
|
|
(new CCol($template_row))
|
|
->addClass(ZBX_STYLE_WORDWRAP)
|
|
->addStyle('max-width: '.ZBX_TEXTAREA_BIG_WIDTH.'px;'),
|
|
(new CCol(
|
|
($template['link_type'] == TEMPLATE_LINK_MANUAL)
|
|
? new CHorList([
|
|
(new CButtonLink(_('Unlink')))->onClick('host_edit.unlinkTemplate(this)'),
|
|
($data['clone_hostid'] === null)
|
|
? (new CButtonLink(_('Unlink and clear')))
|
|
->setAttribute('data-templateid', $template['templateid'])
|
|
->onClick('host_edit.unlinkAndClearTemplate(this, this.dataset.templateid)')
|
|
: null
|
|
])
|
|
: ''
|
|
))->addClass(ZBX_STYLE_NOWRAP)
|
|
]);
|
|
}
|
|
|
|
$templates_field_items[] = $linked_templates;
|
|
}
|
|
|
|
$templates_field_items[] = (new CMultiSelect([
|
|
'name' => 'add_templates[]',
|
|
'object_name' => 'templates',
|
|
'data' => array_key_exists('add_templates', $data['host'])
|
|
? $data['host']['add_templates']
|
|
: [],
|
|
'popup' => [
|
|
'parameters' => [
|
|
'srctbl' => 'templates',
|
|
'srcfld1' => 'hostid',
|
|
'srcfld2' => 'host',
|
|
'dstfrm' => $host_form->getName(),
|
|
'dstfld1' => 'add_templates_',
|
|
'disableids' => array_column($data['host']['parentTemplates'], 'templateid')
|
|
]
|
|
]
|
|
]))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH);
|
|
|
|
$host_tab
|
|
->addItem([
|
|
new CLabel([
|
|
_('Templates'),
|
|
$host_is_discovered
|
|
? makeHelpIcon([
|
|
(new CList([
|
|
_('Templates linked by host discovery cannot be unlinked.'),
|
|
_('Use host prototype configuration form to remove automatically linked templates on upcoming discovery.')
|
|
]))
|
|
])
|
|
: null
|
|
], 'add_templates__ms'),
|
|
(new CFormField(
|
|
(count($templates_field_items) > 1)
|
|
? (new CDiv($templates_field_items))->addClass('linked-templates')
|
|
: $templates_field_items
|
|
))
|
|
])
|
|
->addItem([
|
|
(new CLabel(_('Host groups'), 'groups__ms'))->setAsteriskMark(),
|
|
new CFormField(
|
|
(new CMultiSelect([
|
|
'name' => 'groups[]',
|
|
'object_name' => 'hostGroup',
|
|
'disabled' => $host_is_discovered,
|
|
'add_new' => (CWebUser::$data['type'] == USER_TYPE_SUPER_ADMIN),
|
|
'data' => $data['groups_ms'],
|
|
'popup' => [
|
|
'parameters' => [
|
|
'srctbl' => 'host_groups',
|
|
'srcfld1' => 'groupid',
|
|
'dstfrm' => $host_form->getName(),
|
|
'dstfld1' => 'groups_',
|
|
'editable' => true,
|
|
'disableids' => array_column($data['groups_ms'], 'id')
|
|
]
|
|
]
|
|
]))
|
|
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
|
|
->setAriaRequired()
|
|
)
|
|
])
|
|
->addItem([
|
|
new CLabel(_('Interfaces')),
|
|
new CFormField([
|
|
(new CDiv([
|
|
renderInterfaceHeaders(),
|
|
$agent_interfaces,
|
|
$snmp_interfaces,
|
|
$jmx_interfaces,
|
|
$ipmi_interfaces
|
|
]))->addClass(ZBX_STYLE_HOST_INTERFACES),
|
|
$host_is_discovered
|
|
? null
|
|
: new CDiv(
|
|
(new CButtonLink(_('Add')))
|
|
->addClass('add-interface')
|
|
->setMenuPopup([
|
|
'type' => 'submenu',
|
|
'data' => [
|
|
'submenu' => getAddNewInterfaceSubmenu()
|
|
]
|
|
])
|
|
->setAttribute('aria-label', _('Add new interface'))
|
|
)
|
|
])
|
|
])
|
|
->addItem([
|
|
new CLabel(_('Description'), 'description'),
|
|
new CFormField(
|
|
(new CTextArea('description', $data['host']['description']))
|
|
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
|
|
->setMaxlength(DB::getFieldLength('hosts', 'description'))
|
|
)
|
|
])
|
|
->addItem([
|
|
new CLabel(_('Monitored by proxy'), 'label-proxy'),
|
|
new CFormField(
|
|
(new CSelect('proxyid'))
|
|
->setValue($data['host']['proxyid'])
|
|
->setFocusableElementId('label-proxy')
|
|
->setReadonly($host_is_discovered)
|
|
->addOptions(CSelect::createOptionsFromArray([0 => _('(no proxy)')] + $data['proxies']))
|
|
)
|
|
])
|
|
->addItem([
|
|
new CLabel(_('Enabled'), 'status'),
|
|
new CFormField(
|
|
(new CCheckBox('status', HOST_STATUS_MONITORED))
|
|
->setChecked($data['host']['status'] == HOST_STATUS_MONITORED)
|
|
)
|
|
]);
|
|
|
|
$ipmi_tab = (new CFormGrid())
|
|
->addItem([
|
|
new CLabel(_('Authentication algorithm'), 'label_ipmi_authtype'),
|
|
new CFormField(
|
|
(new CSelect('ipmi_authtype'))
|
|
->setValue($data['host']['ipmi_authtype'])
|
|
->setFocusableElementId('label_ipmi_authtype')
|
|
->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
|
|
->addOptions(CSelect::createOptionsFromArray(ipmiAuthTypes()))
|
|
->setReadonly($host_is_discovered)
|
|
->setId('ipmi_authtype')
|
|
)
|
|
])
|
|
->addItem([
|
|
new CLabel(_('Privilege level'), 'label_ipmi_privilege'),
|
|
new CFormField(
|
|
(new CSelect('ipmi_privilege'))
|
|
->setValue($data['host']['ipmi_privilege'])
|
|
->setFocusableElementId('label_ipmi_privilege')
|
|
->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
|
|
->addOptions(CSelect::createOptionsFromArray(ipmiPrivileges()))
|
|
->setReadonly($host_is_discovered)
|
|
->setId('ipmi_privilege')
|
|
)
|
|
])
|
|
->addItem([
|
|
new CLabel(_('Username'), 'ipmi_username'),
|
|
new CFormField(
|
|
(new CTextBox('ipmi_username', $data['host']['ipmi_username'], $host_is_discovered))
|
|
->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
|
|
->disableAutocomplete()
|
|
)
|
|
])
|
|
->addItem([
|
|
new CLabel(_('Password'), 'ipmi_password'),
|
|
new CFormField(
|
|
(new CTextBox('ipmi_password', $data['host']['ipmi_password'], $host_is_discovered))
|
|
->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
|
|
->disableAutocomplete()
|
|
)
|
|
]);
|
|
|
|
// Tags tab.
|
|
$tags_tab = new CPartial('configuration.tags.tab', [
|
|
'source' => 'host',
|
|
'tags' => $data['host']['tags'],
|
|
'with_automatic' => true,
|
|
'readonly' => false,
|
|
'tabs_id' => 'host-tabs',
|
|
'tags_tab_id' => 'host-tags-tab'
|
|
]);
|
|
|
|
// Macros tab.
|
|
$macros_tab = (new CFormList('macrosFormList'))
|
|
->addRow(null, (new CRadioButtonList('show_inherited_macros', (int) $data['show_inherited_macros']))
|
|
->addValue(_('Host macros'), 0)
|
|
->addValue(_('Inherited and host macros'), 1)
|
|
->setModern(true)
|
|
)
|
|
->addRow(null,
|
|
new CPartial('hostmacros.list.html', [
|
|
'macros' => $data['host']['macros'],
|
|
'readonly' => false
|
|
]), 'macros_container'
|
|
);
|
|
|
|
// Inventory tab.
|
|
$inventory_tab = (new CFormGrid())
|
|
->addItem([
|
|
null,
|
|
new CFormField([
|
|
(new CRadioButtonList('inventory_mode', (int) $data['host']['inventory_mode']))
|
|
->addValue(_('Disabled'), HOST_INVENTORY_DISABLED)
|
|
->addValue(_('Manual'), HOST_INVENTORY_MANUAL)
|
|
->addValue(_('Automatic'), HOST_INVENTORY_AUTOMATIC)
|
|
->setEnabled(!$host_is_discovered)
|
|
->setModern(true),
|
|
$host_is_discovered ? new CInput('hidden', 'inventory_mode', $data['host']['inventory_mode']) : null
|
|
])
|
|
]);
|
|
|
|
foreach ($data['inventory_fields'] as $inventory_no => $inventory_field) {
|
|
$field_name = $inventory_field['db_field'];
|
|
|
|
if (!array_key_exists($field_name, $data['host']['inventory'])) {
|
|
$data['host']['inventory'][$field_name] = '';
|
|
}
|
|
|
|
if ($inventory_field['type'] == DB::FIELD_TYPE_TEXT) {
|
|
$input_field = (new CTextArea('host_inventory['.$field_name.']', $data['host']['inventory'][$field_name]))
|
|
->setWidth(ZBX_TEXTAREA_BIG_WIDTH);
|
|
}
|
|
else {
|
|
$input_field = (new CTextBox('host_inventory['.$field_name.']', $data['host']['inventory'][$field_name]))
|
|
->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
|
|
->setAttribute('maxlength', $inventory_field['length']);
|
|
}
|
|
|
|
if ($data['host']['inventory_mode'] == HOST_INVENTORY_DISABLED) {
|
|
$input_field->setAttribute('disabled', 'disabled');
|
|
}
|
|
|
|
// Link to populating item at the right side (if any).
|
|
if (array_key_exists($inventory_no, $data['inventory_items'])) {
|
|
$item_name = $data['inventory_items'][$inventory_no]['name'];
|
|
|
|
$link = (new CLink($item_name,
|
|
(new CUrl('items.php'))
|
|
->setArgument('form', 'update')
|
|
->setArgument('itemid', $data['inventory_items'][$inventory_no]['itemid'])
|
|
->setArgument('context', 'host')
|
|
->getUrl()
|
|
))->setTitle(_s('This field is automatically populated by item "%1$s".', $item_name));
|
|
|
|
$inventory_item = (new CSpan([' ', LARR(), ' ', $link]))->addClass('populating_item');
|
|
$input_field->addClass('linked_to_item');
|
|
|
|
if ($data['host']['inventory_mode'] == HOST_INVENTORY_AUTOMATIC) {
|
|
// This will be used for disabling fields via jquery.
|
|
$input_field->setAttribute('disabled', 'disabled');
|
|
}
|
|
else {
|
|
// Item links are visible only in automatic mode.
|
|
$inventory_item->addStyle('display: none');
|
|
}
|
|
}
|
|
else {
|
|
$inventory_item = null;
|
|
}
|
|
|
|
$inventory_tab->addItem([
|
|
new CLabel($inventory_field['title'], 'host_inventory['.$field_name.']'),
|
|
new CFormField([$input_field, $inventory_item])
|
|
]);
|
|
}
|
|
|
|
// Encryption tab.
|
|
$tls_accept = (int) $data['host']['tls_accept'];
|
|
$is_psk_set = ($data['host']['tls_connect'] == HOST_ENCRYPTION_PSK || $tls_accept & HOST_ENCRYPTION_PSK);
|
|
|
|
$encryption_tab = (new CFormGrid())
|
|
->addItem([
|
|
new CLabel(_('Connections to host')),
|
|
new CFormField(
|
|
(new CRadioButtonList('tls_connect', (int) $data['host']['tls_connect']))
|
|
->addValue(_('No encryption'), HOST_ENCRYPTION_NONE)
|
|
->addValue(_('PSK'), HOST_ENCRYPTION_PSK)
|
|
->addValue(_('Certificate'), HOST_ENCRYPTION_CERTIFICATE)
|
|
->setModern(true)
|
|
->setEnabled(!$host_is_discovered)
|
|
)
|
|
])
|
|
->addItem([
|
|
new CLabel(_('Connections from host')),
|
|
new CFormField([
|
|
(new CList([
|
|
(new CCheckBox('tls_in_none'))
|
|
->setChecked(($tls_accept & HOST_ENCRYPTION_NONE))
|
|
->setLabel(_('No encryption'))
|
|
->setEnabled(!$host_is_discovered),
|
|
(new CCheckBox('tls_in_psk'))
|
|
->setChecked(($tls_accept & HOST_ENCRYPTION_PSK))
|
|
->setLabel(_('PSK'))
|
|
->setEnabled(!$host_is_discovered),
|
|
(new CCheckBox('tls_in_cert'))
|
|
->setChecked(($tls_accept & HOST_ENCRYPTION_CERTIFICATE))
|
|
->setLabel(_('Certificate'))
|
|
->setEnabled(!$host_is_discovered)
|
|
]))
|
|
->addClass(ZBX_STYLE_LIST_CHECK_RADIO),
|
|
new CInput('hidden', 'tls_accept', $tls_accept)
|
|
])
|
|
])
|
|
->addItem(
|
|
($is_psk_set && !$data['is_psk_edit'] && ($data['hostid'] || $data['clone_hostid']))
|
|
? [
|
|
(new CLabel(_('PSK'), 'change_psk'))->setAsteriskMark(),
|
|
new CFormField(
|
|
(new CSimpleButton(_('Change PSK')))
|
|
->setId('change_psk')
|
|
->addClass(ZBX_STYLE_BTN_GREY)
|
|
->setEnabled(!$host_is_discovered)
|
|
)
|
|
]
|
|
: null
|
|
)
|
|
->addItem([
|
|
(new CLabel(_('PSK identity'), 'tls_psk_identity'))->setAsteriskMark(),
|
|
new CFormField(
|
|
(new CTextBox('tls_psk_identity', $data['host']['tls_psk_identity'], false,
|
|
DB::getFieldLength('hosts', 'tls_psk_identity')
|
|
))
|
|
->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
|
|
->setAriaRequired()
|
|
)
|
|
])
|
|
->addItem([
|
|
(new CLabel(_('PSK'), 'tls_psk'))->setAsteriskMark(),
|
|
new CFormField(
|
|
(new CTextBox('tls_psk', $data['host']['tls_psk'], false, DB::getFieldLength('hosts', 'tls_psk')))
|
|
->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
|
|
->setAriaRequired()
|
|
->disableAutocomplete()
|
|
)
|
|
])
|
|
->addItem([
|
|
new CLabel(_('Issuer'), 'tls_issuer'),
|
|
new CFormField(
|
|
(new CTextBox('tls_issuer', $data['host']['tls_issuer'], $host_is_discovered,
|
|
DB::getFieldLength('hosts', 'tls_issuer')
|
|
))->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
|
|
)
|
|
])
|
|
->addItem([
|
|
new CLabel(_x('Subject', 'encryption certificate'), 'tls_subject'),
|
|
new CFormField(
|
|
(new CTextBox('tls_subject', $data['host']['tls_subject'], $host_is_discovered,
|
|
DB::getFieldLength('hosts', 'tls_subject')
|
|
))->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
|
|
)
|
|
]);
|
|
|
|
// Value mapping tab.
|
|
if (!$host_is_discovered) {
|
|
$value_mapping_tab = (new CFormList('valuemap-formlist'))
|
|
->addRow(null, new CPartial('configuration.valuemap', [
|
|
'source' => 'host',
|
|
'valuemaps' => $data['host']['valuemaps'],
|
|
'readonly' => $host_is_discovered,
|
|
'form' => 'host',
|
|
'table_id' => 'valuemap-table'
|
|
]));
|
|
}
|
|
|
|
// main output
|
|
$tabs = (new CTabView(['id' => 'host-tabs']))
|
|
->setSelected(0)
|
|
->addTab('host-tab', _('Host'), $host_tab)
|
|
->addTab('ipmi-tab', _('IPMI'), $ipmi_tab, TAB_INDICATOR_IPMI)
|
|
->addTab('host-tags-tab', _('Tags'), $tags_tab, TAB_INDICATOR_TAGS)
|
|
->addTab('macros-tab', _('Macros'), $macros_tab, TAB_INDICATOR_HOST_MACROS)
|
|
->addTab('inventory-tab', _('Inventory'), $inventory_tab, TAB_INDICATOR_INVENTORY)
|
|
->addTab('encryption-tab', _('Encryption'), $encryption_tab, TAB_INDICATOR_ENCRYPTION);
|
|
|
|
if (!$host_is_discovered) {
|
|
$tabs->addTab('valuemap-tab', _('Value mapping'), $value_mapping_tab, TAB_INDICATOR_VALUEMAPS);
|
|
}
|
|
|
|
// Add footer buttons.
|
|
if (array_key_exists('buttons', $data)) {
|
|
$primary_btn = array_shift($data['buttons']);
|
|
$tabs->setFooter(makeFormFooter(
|
|
$primary_btn,
|
|
$data['buttons']
|
|
));
|
|
}
|
|
|
|
$host_form
|
|
->addItem($tabs)
|
|
->show();
|