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.
zabbix/ui/app/views/administration.script.edit.php

422 lines
13 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 CView $this
* @var array $data
*/
$csrf_token = CCsrfTokenHelper::get('script');
$form = (new CForm())
->addItem((new CVar(CCsrfTokenHelper::CSRF_TOKEN_NAME, $csrf_token))->removeId())
->setId('script-form')
->setName('scripts')
->addVar('scriptid', $data['scriptid'])
->addItem((new CInput('submit', null))->addStyle('display: none;'));
$parameters_table = (new CTable())
->setId('parameters-table')
->setHeader([
(new CColHeader(_('Name')))->setWidth('50%'),
(new CColHeader(_('Value')))->setWidth('50%'),
_('Action')
])
->setAttribute('style', 'width: 100%;')
->addItem(
(new CTag('tfoot', true))
->addItem(
(new CCol(
(new CButtonLink(_('Add')))->addClass('js-parameter-add')
))->setColSpan(2)
)
);
$row_template = (new CTemplateTag('script-parameter-template'))
->addItem(
(new CRow([
(new CTextBox('parameters[name][]', '', false, DB::getFieldLength('script_param', 'name')))
->setAttribute('style', 'width: 100%;')
->setAttribute('value', '#{name}')
->removeId(),
(new CTextBox('parameters[value][]', '', false, DB::getFieldLength('script_param', 'value')))
->setAttribute('style', 'width: 100%;')
->setAttribute('value', '#{value}')
->removeId(),
(new CButtonLink(_('Remove')))->addClass('js-remove')
]))->addClass('form_row')
);
$form_grid = (new CFormGrid())
->addItem([
(new CLabel(_('Name'), 'name'))
->setAsteriskMark(),
(new CFormField(
(new CTextBox('name', $data['name'], false, DB::getFieldLength('scripts', 'name')))
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
->setAriaRequired()
))
])
->addItem([
new CLabel(_('Scope'), 'scope'),
new CFormField(
(new CRadioButtonList('scope', (int) $data['scope']))
->addValue(_('Action operation'), ZBX_SCRIPT_SCOPE_ACTION)
->addValue(_('Manual host action'), ZBX_SCRIPT_SCOPE_HOST)
->addValue(_('Manual event action'), ZBX_SCRIPT_SCOPE_EVENT)
->setModern()
->setEnabled(!$data['actions'])
)
])
->addItem([
(new CLabel(_('Menu path'), 'menu_path'))->setId('menu-path-label'),
(new CFormField(
(new CTextBox('menu_path', $data['menu_path'], false, DB::getFieldLength('scripts', 'menu_path')))
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
->setAttribute('placeholder', _('<sub-menu/sub-menu/...>'))
))->setId('menu-path')
])
->addItem([
(new CLabel(_('Type'), 'type')),
new CFormField(
(new CRadioButtonList('type', (int) $data['type']))
->addValue(_('URL'), ZBX_SCRIPT_TYPE_URL)
->addValue(_('Webhook'), ZBX_SCRIPT_TYPE_WEBHOOK)
->addValue(_('Script'), ZBX_SCRIPT_TYPE_CUSTOM_SCRIPT)
->addValue(_('SSH'), ZBX_SCRIPT_TYPE_SSH)
->addValue(_('Telnet'), ZBX_SCRIPT_TYPE_TELNET)
->addValue(_('IPMI'), ZBX_SCRIPT_TYPE_IPMI)
->setModern()
)
])
->addItem([
(new CLabel(_('Execute on'), 'execute_on'))->setId('execute-on-label'),
(new CFormField(
(new CRadioButtonList('execute_on', (int) $data['execute_on']))
->addValue(_('Zabbix agent'), ZBX_SCRIPT_EXECUTE_ON_AGENT)
->addValue(_('Zabbix server (proxy)'), ZBX_SCRIPT_EXECUTE_ON_PROXY)
->addValue(_('Zabbix server'), ZBX_SCRIPT_EXECUTE_ON_SERVER)
->setModern()
->setId('execute-on')
))->setId('execute-on')
])
->addItem([
(new CLabel(_('Authentication method'), 'authentication'))->setId('auth-type-label'),
(new CFormField(
(new CSelect('authtype'))
->setId('authtype')
->setValue($data['authtype'])
->setFocusableElementId('authentication')
->addOptions(CSelect::createOptionsFromArray([
ITEM_AUTHTYPE_PASSWORD => _('Password'),
ITEM_AUTHTYPE_PUBLICKEY => _('Public key')
]))
))->setId('auth-type')
])
->addItem([
(new CLabel(_('Username'), 'username'))
->setId('username-label')
->setAsteriskMark(),
(new CFormField(
(new CTextBox('username', $data['username'], false, DB::getFieldLength('scripts', 'username')))
->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
->setAriaRequired()
))->setId('username-field')
])
->addItem([
(new CLabel(_('Public key file'), 'publickey'))
->setId('publickey-label')
->setAsteriskMark(),
(new CFormField(
(new CTextBox('publickey', $data['publickey'], false, DB::getFieldLength('scripts', 'publickey')))
->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
->setAriaRequired()
))->setId('publickey-field')
])
->addItem([
(new CLabel(_('Private key file'), 'privatekey'))
->setId('privatekey-label')
->setAsteriskMark(),
(new CFormField(
(new CTextBox('privatekey', $data['privatekey'], false, DB::getFieldLength('scripts', 'privatekey')))
->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
->setAriaRequired()
))->setId('privatekey-field')
])
->addItem([
(new CLabel(_('Password'), 'password'))->setId('password-label'),
(new CFormField(
(new CTextBox('password', $data['password'], false, DB::getFieldLength('scripts', 'password')))
->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
))->setId('password-field')
])
->addItem([
(new CLabel(_('Key passphrase'), 'passphrase'))->setId('passphrase-label'),
(new CFormField(
(new CTextBox('passphrase', $data['passphrase'], false, DB::getFieldLength('scripts', 'password')))
->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
))->setId('passphrase-field')
])
->addItem([
(new CLabel(_('Port'), 'port'))->setId('port-label'),
(new CFormField(
(new CTextBox('port', $data['port'], false, DB::getFieldLength('scripts', 'port')))
->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
))->setId('port-field')
])
->addItem([
(new CLabel(_('Commands'), 'command'))
->setId('commands-label')
->setAsteriskMark(),
(new CFormField(
(new CTextArea('command', $data['command']))
->addClass(ZBX_STYLE_MONOSPACE_FONT)
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
->setMaxlength(DB::getFieldLength('scripts', 'command'))
->setAriaRequired()
->disableSpellcheck()
))->setId('commands')
])
->addItem([
(new CLabel(_('Command'), 'commandipmi'))
->setId('command-ipmi-label')
->setAsteriskMark(),
(new CFormField(
(new CTextBox('commandipmi', $data['commandipmi'], false, DB::getFieldLength('scripts', 'command')))
->addClass(ZBX_STYLE_MONOSPACE_FONT)
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
->setAriaRequired()
))->setId('command-ipmi')
])
->addItem([
(new CLabel(_('Parameters'), $parameters_table->getId()))->setId('webhook-parameters-label'),
(new CFormField(
(new CDiv($parameters_table))
->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_STANDARD_WIDTH.'px;')
))->setId('webhook-parameters')
])
->addItem([
(new CLabel(_('URL'), 'url'))
->setId('url-label')
->setAsteriskMark(),
(new CFormField(
(new CTextBox('url', $data['url'], false, DB::getFieldLength('scripts', 'url')))
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
->setAriaRequired()
))->setId('url')
])
->addItem([
(new CLabel(_('Open in a new window')))->setId('new-window-label'),
(new CFormField(
(new CCheckBox('new_window'))
->setChecked($data['new_window'])
->setUncheckedValue(ZBX_SCRIPT_URL_NEW_WINDOW_NO)
))->setId('new-window')
])
->addItem([
(new CLabel(_('Script'), 'script'))
->setAsteriskMark()
->setId('script-label'),
(new CFormField(
(new CMultilineInput('script', $data['script'], [
'title' => _('JavaScript'),
'placeholder' => _('script'),
'placeholder_textarea' => 'return value',
'grow' => 'auto',
'rows' => 0,
'maxlength' => DB::getFieldLength('scripts', 'command')
]))
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
->setAriaRequired()
))->setId('js-item-script-field')
])
->addItem([
(new CLabel(_('Timeout'), 'timeout'))
->setAsteriskMark()
->setId('timeout-label'),
(new CFormField(
(new CTextBox('timeout', $data['timeout'], false, DB::getFieldLength('scripts', 'timeout')))
->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
->setAriaRequired()
))->setId('timeout-field')
])
->addItem([
(new CLabel(_('Description'), 'description')),
new CFormField(
(new CTextArea('description', $data['description']))
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
->setMaxlength(DB::getFieldLength('scripts', 'description'))
)
]);
$select_usrgrpid = (new CSelect('usrgrpid'))
->setId('user-group')
->setValue($data['usrgrpid'])
->setFocusableElementId('usrgrpid')
->addOption(new CSelectOption(0, _('All')))
->addOptions(CSelect::createOptionsFromArray($data['usergroups']));
$select_hgstype = (new CSelect('hgstype'))
->setId('hgstype-select')
->setValue($data['hgstype'])
->setFocusableElementId('hgstype')
->addOption(new CSelectOption(0, _('All')))
->addOption(new CSelectOption(1, _('Selected')));
$form_grid
->addItem([
new CLabel(_('Host group'), $select_hgstype->getFocusableElementId()),
new CFormField($select_hgstype)
])
->addItem(
(new CFormField(
(new CMultiSelect([
'name' => 'groupid',
'object_name' => 'hostGroup',
'multiple' => false,
'data' => $data['hostgroup'],
'popup' => [
'parameters' => [
'srctbl' => 'host_groups',
'srcfld1' => 'groupid',
'dstfrm' => $form->getName(),
'dstfld1' => 'groupid'
]
]
]))
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
))->setId('host-group-selection')
)
->addItem([
(new CLabel(_('User group'), $select_usrgrpid->getFocusableElementId()))->setId('usergroup-label'),
(new CFormField($select_usrgrpid))->setId('usergroup')
])
->addItem([
(new CLabel(_('Required host permissions'), 'host_access'))->setId('host-access-label'),
(new CFormField(
(new CRadioButtonList('host_access', (int) $data['host_access']))
->addValue(_('Read'), PERM_READ)
->addValue(_('Write'), PERM_READ_WRITE)
->setModern()
->setId('host-access')
))->setId('host-access-field')
])
->addItem([
(new CLabel(_('Enable confirmation'), 'enable-confirmation'))->setId('enable-confirmation-label'),
(new CFormField(
(new CCheckBox('enable_confirmation'))
->setChecked($data['enable_confirmation'])
->setId('enable-confirmation')
))->setId('enable-confirmation-field')
])
->addItem([
(new CLabel(_('Confirmation text'), 'confirmation'))->setId('confirmation-label'),
(new CFormField([
(new CTextBox('confirmation', $data['confirmation'], false, DB::getFieldLength('scripts', 'confirmation')))
->setAttribute('disabled', $data['enable_confirmation'])
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH),
NBSP(),
(new CButton('testConfirmation', _('Test confirmation')))
->addClass(ZBX_STYLE_BTN_GREY)
->setAttribute('disabled', $data['enable_confirmation'])
->setId('test-confirmation')
]))->setId('confirmation-field')
]);
if ($data['scriptid'] === null) {
$buttons = [
[
'title' => _('Add'),
'keepOpen' => true,
'isSubmit' => true,
'action' => 'script_edit_popup.submit();'
]
];
}
else {
$buttons = [
[
'title' => _('Update'),
'keepOpen' => true,
'isSubmit' => true,
'action' => 'script_edit_popup.submit();'
],
[
'title' => _('Clone'),
'class' => ZBX_STYLE_BTN_ALT, 'js-clone',
'keepOpen' => true,
'isSubmit' => false,
'action' => 'script_edit_popup.clone('.json_encode([
'title' => _('New script'),
'buttons' => [
[
'title' => _('Add'),
'class' => 'js-add',
'keepOpen' => true,
'isSubmit' => true,
'action' => 'script_edit_popup.submit();'
],
[
'title' => _('Cancel'),
'class' => ZBX_STYLE_BTN_ALT,
'cancel' => true,
'action' => ''
]
]
]).');'
],
[
'title' => _('Delete'),
'confirmation' => _('Delete script?'),
'class' => ZBX_STYLE_BTN_ALT,
'keepOpen' => true,
'isSubmit' => false,
'action' => 'script_edit_popup.delete();'
]
];
}
$form
->addItem($form_grid)
->addItem($row_template)
->addItem(
(new CScriptTag('script_edit_popup.init('.json_encode([
'script' => $data
]).');'))->setOnDocumentReady()
)
->addStyle('display: none;');
$output = [
'header' => $data['scriptid'] === null ? _('New script') : _('Script'),
'doc_url' => CDocHelper::getUrl(CDocHelper::ALERTS_SCRIPT_EDIT),
'body' => $form->toString(),
'buttons' => $buttons,
'script_inline' => getPagePostJs().$this->readJsFile('administration.script.edit.js.php')
];
if ($data['user']['debug_mode'] == GROUP_DEBUG_MODE_ENABLED) {
CProfiler::getInstance()->stop();
$output['debug'] = CProfiler::getInstance()->make()->toString();
}
echo json_encode($output);