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/js/popup.itemtestedit.view.js.php

592 lines
18 KiB

<?php
/*
** 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
*/
?>
/**
* Make step result UI element.
*
* @param {array} step Step object returned from server.
*
* @return {jQuery}
*/
function makeStepResult(step) {
if (typeof step.error !== 'undefined') {
return jQuery(new Template(jQuery('#preprocessing-step-error-icon').html()).evaluate(
{error: step.error || <?= json_encode(_('<empty string>')) ?>}
));
}
else if (typeof step.result === 'undefined' || step.result === null) {
return jQuery('<span>', {'class': '<?= ZBX_STYLE_GREY ?>'}).text(<?= json_encode(_('No value')) ?>);
}
else if (step.result === '') {
return jQuery('<span>', {'class': '<?= ZBX_STYLE_GREY ?>'}).text(<?= json_encode(_('<empty string>')) ?>);
}
else if (step.result.indexOf("\n") != -1 || step.result.length > 25) {
return jQuery(new Template(jQuery('#preprocessing-step-result').html()).evaluate(
jQuery.extend({result: step.result})
));
}
else {
return jQuery('<span>').text(step.result);
}
}
/**
* Disable item test form.
*/
function disableItemTestForm() {
jQuery('#value, #time, [name^=macros]').prop('disabled', true);
<?php if ($data['is_item_testable']): ?>
jQuery('#get_value, #get_value_btn').prop('disabled', true);
<?php if ($data['interface_address_enabled']): ?>
jQuery('#interface_address').prop('disabled', true);
<?php endif ?>
<?php if ($data['interface_port_enabled']): ?>
jQuery('#interface_port').prop('disabled', true);
<?php endif ?>
<?php if ($data['proxies_enabled']): ?>
jQuery('#proxyid').prop('disabled', true);
<?php endif ?>
<?php else: ?>
jQuery('#get_value, #get_value_btn').prop('disabled', true);
<?php endif ?>
<?php if ($data['show_prev']): ?>
jQuery('#prev_time').prop('readonly', true);
<?php endif ?>
jQuery('#eol input').prop('disabled', true);
}
/**
* Enable item test form.
*/
function enableItemTestForm() {
jQuery('#value, #time, [name^=macros]').prop('disabled', false);
<?php if ($data['is_item_testable']): ?>
jQuery('#get_value, #get_value_btn').prop('disabled', false);
<?php if ($data['interface_address_enabled']): ?>
jQuery('#interface_address').prop('disabled', false);
<?php endif ?>
<?php if ($data['interface_port_enabled']): ?>
jQuery('#interface_port').prop('disabled', false);
<?php endif ?>
<?php if ($data['proxies_enabled']): ?>
jQuery('#proxyid').prop('disabled', false);
<?php endif ?>
<?php else: ?>
jQuery('#get_value, #get_value_btn').prop('disabled', false);
<?php endif ?>
<?php if ($data['show_prev']): ?>
if (!jQuery('#get_value').is(':checked')) {
jQuery('#prev_value').multilineInput('unsetReadOnly');
jQuery('#prev_time').prop('readonly', false);
}
<?php endif ?>
jQuery('#eol input').prop('disabled', false);
}
/**
* Clear previous test results.
*/
function cleanPreviousTestResults() {
var $form = jQuery('#preprocessing-test-form');
jQuery('[id^="preproc-test-step-"][id$="-result"]', $form).empty();
jQuery('[id^="preproc-test-step-"][id$="-name"] > div', $form).remove();
jQuery('.js-final-result', $form)
.hide()
.next()
.empty()
.hide();
}
/**
* Send item get value request and display retrieved results.
*
* @param {object} overlay Overlay dialog object.
*/
function itemGetValueTest(overlay) {
var $body = overlay.$dialogue.$body,
$form = overlay.$dialogue.find('form'),
form_data = $form.serializeJSON(),
post_data = getItemTestProperties('#preprocessing-test-form'),
interface = (typeof form_data['interface'] !== 'undefined') ? form_data['interface'] : null,
url = new Curl('zabbix.php');
url.setArgument('action', 'popup.itemtest.getvalue');
url.setArgument('<?= CCsrfTokenHelper::CSRF_TOKEN_NAME ?>', <?= json_encode(CCsrfTokenHelper::get('itemtest')) ?>);
post_data = jQuery.extend(post_data, {
interface: {
address: interface ? interface['address'].trim() : '',
port: (interface && interface['port']) ? interface['port'].trim() : '',
interfaceid: interface ? interface['interfaceid'] : null,
useip: interface ? interface['useip'] : null,
details: interface ? interface['details'] : null
},
macros: form_data['macros'],
proxyid: form_data['proxyid'],
test_type: <?= $data['test_type'] ?>,
hostid: <?= $data['hostid'] ?>,
value: form_data['value']
});
<?php if ($data['show_prev']): ?>
post_data['time_change'] = (form_data['upd_prev'] !== '')
? parseInt(form_data['upd_last']) - parseInt(form_data['upd_prev'])
: Math.ceil(+new Date() / 1000) - parseInt(form_data['upd_last']);
<?php endif ?>
delete post_data.interfaceid;
delete post_data.delay;
overlay.xhr = jQuery.ajax({
url: url.getUrl(),
data: post_data,
beforeSend: function() {
jQuery('#get_value_btn').blur().addClass('is-loading');
overlay.setLoading();
disableItemTestForm();
cleanPreviousTestResults();
},
complete: function() {
jQuery('#get_value_btn').removeClass('is-loading');
enableItemTestForm();
overlay.unsetLoading();
},
success: function(ret) {
overlay.$dialogue.find('.msg-bad, .msg-good, .msg-warning').remove();
if ('error' in ret) {
const message_box = makeMessageBox('bad', ret.error.messages, ret.error.title);
jQuery($body).prepend(message_box);
return;
}
<?php if ($data['show_prev']): ?>
if (typeof ret.prev_value !== 'undefined') {
jQuery('#prev_value', $form).multilineInput('value', ret.prev_value);
jQuery('#prev_time', $form).val(ret.prev_time);
jQuery('#upd_prev', $form).val(form_data['upd_last']);
jQuery('#upd_last', $form).val(Math.ceil(+new Date() / 1000));
}
<?php endif ?>
jQuery('#value', $form).multilineInput('value', ret.value);
if (typeof ret.eol !== 'undefined') {
jQuery("input[value=" + ret.eol + "]", jQuery("#eol")).prop("checked", "checked");
}
},
dataType: 'json',
type: 'post'
});
}
/**
* Send item preprocessing test details and display results in table.
*
* @param {object} overlay Overlay dialog object.
*/
function itemCompleteTest(overlay) {
var $body = overlay.$dialogue.$body,
$form = overlay.$dialogue.find('form'),
form_data = $form.serializeJSON(),
post_data = getItemTestProperties('#preprocessing-test-form'),
interface = (typeof form_data['interface'] !== 'undefined') ? form_data['interface'] : null,
url = new Curl('zabbix.php');
url.setArgument('action', 'popup.itemtest.send');
url.setArgument('<?= CCsrfTokenHelper::CSRF_TOKEN_NAME ?>', <?= json_encode(CCsrfTokenHelper::get('itemtest')) ?>);
post_data = jQuery.extend(post_data, {
get_value: form_data['get_value'] || 0,
steps: form_data['steps'],
interface: {
address: interface ? interface['address'].trim() : '',
port: (interface && interface['port']) ? interface['port'].trim() : '',
interfaceid: interface ? interface['interfaceid'] : null,
useip: interface ? interface['useip'] : null,
details: interface ? interface['details'] : null
},
macros: form_data['macros'],
proxyid: form_data['proxyid'],
show_final_result: <?= $data['show_final_result'] ? 1 : 0 ?>,
test_type: <?= $data['test_type'] ?>,
hostid: <?= $data['hostid'] ?>,
valuemapid: <?= $data['valuemapid'] ?>,
value: form_data['value'],
not_supported: form_data['not_supported']
});
<?php if ($data['show_prev']): ?>
if (post_data.get_value) {
post_data['time_change'] = (form_data['upd_prev'] !== '')
? parseInt(form_data['upd_last']) - parseInt(form_data['upd_prev'])
: Math.ceil(+new Date() / 1000) - parseInt(form_data['upd_last']);
}
post_data = jQuery.extend(post_data, {
prev_time: form_data['prev_time'],
prev_value: form_data['prev_value']
});
<?php endif ?>
overlay.xhr = jQuery.ajax({
url: url.getUrl(),
data: post_data,
beforeSend: function() {
overlay.setLoading();
disableItemTestForm();
cleanPreviousTestResults();
},
complete: function() {
enableItemTestForm();
overlay.unsetLoading();
},
success: function(ret) {
overlay.$dialogue.find('.msg-bad, .msg-good, .msg-warning').remove();
if ('error' in ret) {
const message_box = makeMessageBox('bad', ret.error.messages, ret.error.title);
jQuery($body).prepend(message_box);
}
processItemPreprocessingTestResults(ret.steps ?? []);
<?php if ($data['show_prev']): ?>
if (typeof ret.prev_value !== 'undefined') {
jQuery('#prev_value', $form).multilineInput('value', ret.prev_value);
jQuery('#prev_time', $form).val(ret.prev_time);
jQuery('#upd_prev', $form).val(post_data['upd_last']);
jQuery('#upd_last', $form).val(Math.ceil(+new Date() / 1000));
}
<?php endif ?>
jQuery('#value', $form).multilineInput('value', ret.value);
if (typeof ret.eol !== 'undefined') {
jQuery("input[value=" + ret.eol + "]", jQuery("#eol")).prop("checked", "checked");
}
if (typeof ret.final !== 'undefined') {
var result = makeStepResult(ret.final);
if (result !== null) {
$result = jQuery(result).css('float', 'right');
}
$result_row = jQuery('<div>', {'class': '<?= ZBX_STYLE_TABLE_FORMS_SEPARATOR ?>'})
.css({whiteSpace: 'normal'})
.append(jQuery('<div>').append(ret.final.action, $result))
.css({display: 'block', width: '675px'});
if (typeof ret.mapped_value !== 'undefined') {
$mapped_value = makeStepResult({result: ret.mapped_value});
$mapped_value.css('float', 'right');
$result_row.append(jQuery('<div>')
.append(
jQuery('<span>', {'class': '<?= ZBX_STYLE_GREY ?>'})
.text('<?= _('Result with value map applied') ?>'),
$mapped_value
)
);
}
jQuery('.js-final-result')
.show()
.next()
.append($result_row)
.show();
}
},
dataType: 'json',
type: 'post'
});
return false;
}
/**
* Process test results and make visual changes in test dialog results block.
*
* @param {array} steps Array of objects containing details about each preprocessing step test results.
*/
function processItemPreprocessingTestResults(steps) {
var tmpl_gray_label = new Template(jQuery('#preprocessing-gray-label').html()),
tmpl_act_done = new Template(jQuery('#preprocessing-step-action-done').html());
steps.forEach(function(step, i) {
if (typeof step.action !== 'undefined') {
switch (step.action) {
case <?= ZBX_PREPROC_FAIL_DEFAULT ?>:
step.action = null;
break;
case <?= ZBX_PREPROC_FAIL_DISCARD_VALUE ?>:
step.action = jQuery(tmpl_gray_label.evaluate(<?= json_encode([
'label' => _('Discard value')
]) ?>));
break;
case <?= ZBX_PREPROC_FAIL_SET_VALUE ?>:
step.action = jQuery(tmpl_act_done.evaluate(jQuery.extend(<?= json_encode([
'action_name' => _('Set value to')
]) ?>, {failed: step.result})));
break;
case <?= ZBX_PREPROC_FAIL_SET_ERROR ?>:
step.action = jQuery(tmpl_act_done.evaluate(jQuery.extend(<?= json_encode([
'action_name' => _('Set error to')
]) ?>, {failed: step.failed})));
break;
}
}
step.result = makeStepResult(step);
if (typeof step.action !== 'undefined' && step.action !== null) {
jQuery('#preproc-test-step-' + i + '-name').append(jQuery(tmpl_gray_label.evaluate(<?= json_encode([
'label' => _('Custom on fail')
]) ?>)));
}
jQuery('#preproc-test-step-' + i + '-result').append(step.result, step.action);
});
}
/**
* Collect values from opened item test dialog and save input values for repeated use.
*/
function saveItemTestInputs() {
var $form = jQuery('#preprocessing-test-form'),
$test_obj,
input_values = {
value: jQuery('#value').multilineInput('value'),
eol: jQuery('#eol').find(':checked').val()
},
form_data = $form.serializeJSON(),
interface = (typeof form_data['interface'] !== 'undefined') ? form_data['interface'] : null,
macros = {};
<?php if ($data['is_item_testable']): ?>
input_values = jQuery.extend(input_values, {
get_value: jQuery('#get_value', $form).is(':checked') ? 1 : 0,
proxyid: jQuery('#proxyid', $form).val(),
interfaceid: <?= $data['interfaceid'] ?> || 0,
address: jQuery('#interface_address', $form).val(),
port: jQuery('#interface_port', $form).val(),
interface_details: (interface && 'details' in interface) ? interface['details'] : null
});
<?php endif ?>
<?php if ($data['show_prev']): ?>
input_values = jQuery.extend(input_values, {
prev_value: jQuery('#prev_value').multilineInput('value'),
prev_time: jQuery('#prev_time').val()
});
<?php endif ?>
jQuery('[name^=macros]').each(function(i, macro) {
var name = macro.name.toString();
macros[name.substr(7, name.length - 8)] = macro.value;
});
input_values.macros = macros;
<?php if ($data['step_obj'] == -2): ?>
$test_obj = jQuery('.tfoot-buttons');
<?php elseif ($data['step_obj'] == -1): ?>
$test_obj = jQuery('.preprocessing-list-foot', jQuery('#preprocessing'));
<?php else: ?>
$test_obj = jQuery('.preprocessing-list-item[data-step=<?= $data['step_obj'] ?>]', jQuery('#preprocessing'));
<?php endif ?>
$test_obj.data('test-data', input_values);
}
jQuery(document).ready(function($) {
$('.js-final-result').hide().next().hide();
<?php if ($data['show_prev']): ?>
jQuery('#upd_last').val(Math.ceil(+new Date() / 1000));
<?php endif ?>
$('#value').multilineInput({
placeholder: <?= json_encode(_('value')) ?>,
value: <?= json_encode($data['value']) ?>,
monospace_font: false,
autofocus: true,
readonly: false,
grow: 'auto',
rows: 0
});
$('#prev_value').multilineInput({
placeholder: <?= $data['show_prev'] ? json_encode(_('value')) : '""' ?>,
value: <?= json_encode($data['prev_value']) ?>,
monospace_font: false,
disabled: <?= $data['show_prev'] ? 'false' : 'true' ?>,
grow: 'auto',
rows: 0
});
<?php if ($data['is_item_testable']): ?>
$('#not_supported').on('change', function() {
var $form = $('#preprocessing-test-form');
if ($(this).is(':checked')) {
$('#value', $form).multilineInput('setReadOnly');
}
else {
$('#value', $form).multilineInput('unsetReadOnly');
}
});
$('#get_value').on('change', function() {
var $rows = $('.js-host-address-row, .js-proxy-hostid-row, .js-get-value-row, [class*=js-popup-row-snmp]'),
$form = $('#preprocessing-test-form'),
$submit_btn = overlays_stack.getById('item-test').$btn_submit,
$not_supported = $('#not_supported', $form);
if ($(this).is(':checked')) {
$('#value', $form).multilineInput('setReadOnly');
$not_supported.prop('disabled', true);
<?php if ($data['show_prev']): ?>
$('#prev_value', $form).multilineInput('setReadOnly');
$('#prev_time', $form).prop('readonly', true);
<?php endif ?>
<?php if ($data['proxies_enabled']): ?>
$('#proxyid').prop('disabled', false);
<?php endif ?>
<?php if ($data['interface_address_enabled']): ?>
$('#interface_address').prop('disabled', false);
<?php endif ?>
<?php if ($data['interface_port_enabled']): ?>
$('#interface_port').prop('disabled', false);
<?php endif ?>
$submit_btn.html('<?= _('Get value and test') ?>');
$rows.show();
<?php if ($data['show_snmp_form']): ?>
$('#interface_details_version').on('change', function (e) {
$(`.js-popup-row-snmp-community, .js-popup-row-snmp-max-repetition,
.js-popup-row-snmpv3-contextname, .js-popup-row-snmpv3-securityname,
.js-popup-row-snmpv3-securitylevel, .js-popup-row-snmpv3-authprotocol,
.js-popup-row-snmpv3-authpassphrase, .js-popup-row-snmpv3-privprotocol,
.js-popup-row-snmpv3-privpassphrase`).hide();
switch (e.target.value) {
case '<?= SNMP_V1 ?>':
$('#interface_details_securitylevel').off('change');
$('.js-popup-row-snmp-community').show();
break;
case '<?= SNMP_V2C ?>':
$('#interface_details_securitylevel').off('change');
$('.js-popup-row-snmp-community').show();
$('.js-popup-row-snmp-max-repetition').show();
break;
case '<?= SNMP_V3 ?>':
$(`.js-popup-row-snmpv3-contextname, .js-popup-row-snmpv3-securityname,
.js-popup-row-snmpv3-securitylevel, .js-popup-row-snmp-max-repetition`).show();
$('#interface_details_securitylevel').on('change', function (e) {
$(`.js-popup-row-snmpv3-authprotocol, .js-popup-row-snmpv3-authpassphrase,
.js-popup-row-snmpv3-privprotocol, .js-popup-row-snmpv3-privpassphrase`).hide();
switch (e.target.value) {
case '<?= ITEM_SNMPV3_SECURITYLEVEL_AUTHNOPRIV ?>':
$(`.js-popup-row-snmpv3-authprotocol, .js-popup-row-snmpv3-authpassphrase`)
.show();
break;
case '<?= ITEM_SNMPV3_SECURITYLEVEL_AUTHPRIV ?>':
$(`.js-popup-row-snmpv3-authprotocol, .js-popup-row-snmpv3-authpassphrase,
.js-popup-row-snmpv3-privprotocol, .js-popup-row-snmpv3-privpassphrase`)
.show();
break;
}
overlays_stack.end().centerDialog();
}).trigger('change');
break;
}
overlays_stack.end().centerDialog();
}).trigger('change');
<?php endif ?>
}
else {
!$not_supported.is(':checked') && $('#value', $form).multilineInput('unsetReadOnly');
$not_supported.prop('disabled', false);
<?php if ($data['show_prev']): ?>
$('#prev_value', $form).multilineInput('unsetReadOnly');
$('#prev_time', $form).prop('readonly', false);
<?php endif ?>
<?php if ($data['proxies_enabled']): ?>
$('#proxyid').prop('disabled', true);
<?php endif ?>
<?php if ($data['interface_address_enabled']): ?>
$('#interface_address').prop('disabled', false);
<?php endif ?>
<?php if ($data['interface_port_enabled']): ?>
$('#interface_port').prop('disabled', false);
<?php endif ?>
$submit_btn.html('<?= _('Test') ?>');
$rows.hide();
}
}).trigger('change');
$('#get_value_btn').on('click', function() {
itemGetValueTest(overlays_stack.getById('item-test'));
});
<?php endif ?>
$('#preprocessing-test-form .<?= ZBX_STYLE_TEXTAREA_FLEXIBLE ?>').textareaFlexible();
});