1<?php
2/*
3** Zabbix
4** Copyright (C) 2001-2021 Zabbix SIA
5**
6** This program is free software; you can redistribute it and/or modify
7** it under the terms of the GNU General Public License as published by
8** the Free Software Foundation; either version 2 of the License, or
9** (at your option) any later version.
10**
11** This program is distributed in the hope that it will be useful,
12** but WITHOUT ANY WARRANTY; without even the implied warranty of
13** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14** GNU General Public License for more details.
15**
16** You should have received a copy of the GNU General Public License
17** along with this program; if not, write to the Free Software
18** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19**/
20
21
22/**
23 * @var CView $this
24 */
25
26$form = (new CForm())
27	->cleanItems()
28	->setId('preprocessing-test-form');
29
30if ($data['show_prev']) {
31	$form
32		->addVar('upd_last', '')
33		->addVar('upd_prev', '');
34}
35
36foreach ($data['inputs'] as $name => $value) {
37	if ($name === 'interface') {
38		// SNMPv3 additional details about interface.
39		if (array_key_exists('useip', $value)) {
40			$form->addVar('interface[useip]', $value['useip']);
41		}
42		if (array_key_exists('interfaceid', $value)) {
43			$form->addVar('interface[interfaceid]', $value['interfaceid']);
44		}
45		continue;
46	}
47	elseif ($name === 'host' && array_key_exists('hostid', $value)) {
48		$form->addVar('hostid', $value['hostid']);
49		continue;
50	}
51	elseif ($name === 'proxy_hostid') {
52		continue;
53	}
54	elseif ($name === 'query_fields' || $name === 'headers' || $name === 'parameters') {
55		foreach (['name', 'value'] as $key) {
56			if (array_key_exists($key, $value)) {
57				$form->addVar($name.'['.$key.']', $value[$key]);
58			}
59		}
60		continue;
61	}
62
63	$form->addItem((new CInput('hidden', $name, $value))->removeId());
64}
65
66// Create macros table.
67$macros_table = $data['macros'] ? (new CTable())->addClass(ZBX_STYLE_TEXTAREA_FLEXIBLE_CONTAINER) : null;
68
69$i = 0;
70foreach ($data['macros'] as $macro_name => $macro_value) {
71	$macros_table->addRow([
72		(new CCol(
73			(new CTextAreaFlexible('macro_rows['.$i++.']', $macro_name, ['readonly' => true]))
74				->setWidth(ZBX_TEXTAREA_MACRO_WIDTH)
75				->removeAttribute('name')
76				->removeId()
77		))->addClass(ZBX_STYLE_TEXTAREA_FLEXIBLE_PARENT),
78		(new CCol('&rArr;'))->addStyle('vertical-align: top;'),
79		(new CCol(
80			(new CTextAreaFlexible('macros['.$macro_name.']', $macro_value))
81				->setWidth(ZBX_TEXTAREA_MACRO_VALUE_WIDTH)
82				->setMaxlength(CControllerPopupItemTest::INPUT_MAX_LENGTH)
83				->setAttribute('placeholder', _('value'))
84				->removeId()
85		))->addClass(ZBX_STYLE_TEXTAREA_FLEXIBLE_PARENT)
86	]);
87}
88
89$form_grid = (new CFormGrid())->addClass(CFormGrid::ZBX_STYLE_FORM_GRID_3_1);
90
91if ($data['is_item_testable']) {
92	$form_grid->addItem([
93		new CLabel(_('Get value from host'), 'get_value'),
94		(new CFormField(
95			(new CCheckBox('get_value', 1))->setChecked($data['get_value'])
96		))->addClass(CFormField::ZBX_STYLE_FORM_FIELD_FLUID),
97
98		(new CLabel(_('Host address'), 'interface_address'))
99			->setAsteriskMark($data['interface_address_enabled'])
100			->addClass('js-host-address-row'),
101		(new CFormField(
102			$data['interface_address_enabled']
103				? (new CTextBox('interface[address]', $data['inputs']['interface']['address'], false,
104						CControllerPopupItemTest::INPUT_MAX_LENGTH
105					))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
106				: (new CTextBox('interface[address]', '', false, CControllerPopupItemTest::INPUT_MAX_LENGTH))
107					->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
108					->setEnabled(false)
109		))->addClass('js-host-address-row'),
110
111		(new CLabel(_('Port'), 'interface_port'))->addClass('js-host-address-row'),
112		(new CFormField(
113			$data['interface_port_enabled']
114				? (new CTextBox('interface[port]', $data['inputs']['interface']['port'], '', 64))
115					->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
116				: (new CTextBox('interface[port]'))
117					->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
118					->setEnabled(false)
119		))->addClass('js-host-address-row')
120	]);
121
122	if ($data['show_snmp_form']) {
123		$form_grid->addItem([
124			(new CLabel(_('SNMP version'), 'label-interface-details-version'))
125				->addClass('js-popup-row-snmp-version'),
126			(new CFormField(
127				(new CSelect('interface[details][version]'))
128					->setId('interface_details_version')
129					->setFocusableElementId('label-interface-details-version')
130					->setValue($data['inputs']['interface']['details']['version'])
131					->addOptions(CSelect::createOptionsFromArray([
132						SNMP_V1 => _('SNMPv1'),
133						SNMP_V2C => _('SNMPv2'),
134						SNMP_V3 => _('SNMPv3')
135					]))
136			))
137				->addClass(CFormField::ZBX_STYLE_FORM_FIELD_FLUID)
138				->addClass('js-popup-row-snmp-version'),
139
140			(new CLabel(_('SNMP community'), 'interface[details][community]'))
141				->setAsteriskMark()
142				->addClass('js-popup-row-snmp-community'),
143			(new CFormField(
144				(new CTextBox('interface[details][community]', $data['inputs']['interface']['details']['community'],
145					false, CControllerPopupItemTest::INPUT_MAX_LENGTH
146				))
147					->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
148					->setAriaRequired()
149			))
150				->addClass(CFormField::ZBX_STYLE_FORM_FIELD_FLUID)
151				->addClass('js-popup-row-snmp-community'),
152
153			(new CLabel(_('Context name'), 'interface[details][contextname]'))
154				->addClass('js-popup-row-snmpv3-contextname'),
155			(new CFormField(
156				(new CTextBox('interface[details][contextname]', $data['inputs']['interface']['details']['contextname'],
157					false, CControllerPopupItemTest::INPUT_MAX_LENGTH
158				))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
159			))
160				->addClass(CFormField::ZBX_STYLE_FORM_FIELD_FLUID)
161				->addClass('js-popup-row-snmpv3-contextname'),
162
163			(new CLabel(_('Security name'), 'interface[details][securityname]'))
164				->addClass('js-popup-row-snmpv3-securityname'),
165			(new CFormField(
166				(new CTextBox('interface[details][securityname]',
167					$data['inputs']['interface']['details']['securityname'], false,
168					CControllerPopupItemTest::INPUT_MAX_LENGTH
169				))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
170			))
171				->addClass(CFormField::ZBX_STYLE_FORM_FIELD_FLUID)
172				->addClass('js-popup-row-snmpv3-securityname'),
173
174			(new CLabel(_('Security level'), 'label-interface-details-securitylevel'))
175				->addClass('js-popup-row-snmpv3-securitylevel'),
176			(new CFormField(
177				(new CSelect('interface[details][securitylevel]'))
178					->setId('interface_details_securitylevel')
179					->setValue($data['inputs']['interface']['details']['securitylevel'])
180					->setFocusableElementId('label-interface-details-securitylevel')
181					->addOptions(CSelect::createOptionsFromArray([
182						ITEM_SNMPV3_SECURITYLEVEL_NOAUTHNOPRIV => 'noAuthNoPriv',
183						ITEM_SNMPV3_SECURITYLEVEL_AUTHNOPRIV => 'authNoPriv',
184						ITEM_SNMPV3_SECURITYLEVEL_AUTHPRIV => 'authPriv'
185					]))
186			))
187				->addClass(CFormField::ZBX_STYLE_FORM_FIELD_FLUID)
188				->addClass('js-popup-row-snmpv3-securitylevel'),
189
190			(new CLabel(_('Authentication protocol'), 'label-authprotocol'))
191				->addClass('js-popup-row-snmpv3-authprotocol'),
192			(new CFormField(
193				(new CSelect('interfaces[details][authprotocol]'))
194					->setValue((int) $data['inputs']['interface']['details']['authprotocol'])
195					->setFocusableElementId('label-authprotocol')
196					->addOptions(CSelect::createOptionsFromArray(getSnmpV3AuthProtocols()))
197			))
198				->addClass(CFormField::ZBX_STYLE_FORM_FIELD_FLUID)
199				->addClass('js-popup-row-snmpv3-authprotocol'),
200
201			(new CLabel(_('Authentication passphrase'), 'interface[details][authpassphrase]'))
202				->addClass('js-popup-row-snmpv3-authpassphrase'),
203			(new CFormField(
204				(new CTextBox('interface[details][authpassphrase]',
205					$data['inputs']['interface']['details']['authpassphrase'], false,
206					CControllerPopupItemTest::INPUT_MAX_LENGTH
207				))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
208			))
209				->addClass(CFormField::ZBX_STYLE_FORM_FIELD_FLUID)
210				->addClass('js-popup-row-snmpv3-authpassphrase'),
211
212			(new CLabel(_('Privacy protocol'), 'label-privprotocol'))->addClass('js-popup-row-snmpv3-privprotocol'),
213			(new CFormField(
214				(new CSelect('interfaces[details][privprotocol]'))
215					->setValue((int) $data['inputs']['interface']['details']['privprotocol'])
216					->setFocusableElementId('label-privprotocol')
217					->addOptions(CSelect::createOptionsFromArray(getSnmpV3PrivProtocols()))
218			))
219				->addClass(CFormField::ZBX_STYLE_FORM_FIELD_FLUID)
220				->addClass('js-popup-row-snmpv3-privprotocol'),
221
222			(new CLabel(_('Privacy passphrase'), 'interface[details][privpassphrase]'))
223				->addClass('js-popup-row-snmpv3-privpassphrase'),
224			(new CFormField(
225				(new CTextBox('interface[details][privpassphrase]',
226					$data['inputs']['interface']['details']['privpassphrase'], false,
227					CControllerPopupItemTest::INPUT_MAX_LENGTH
228				))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
229			))
230				->addClass(CFormField::ZBX_STYLE_FORM_FIELD_FLUID)
231				->addClass('js-popup-row-snmpv3-privpassphrase')
232		]);
233	}
234
235	$form_grid->addItem([
236		(new CLabel(_('Proxy'), 'label-proxy-hostid'))->addClass('js-proxy-hostid-row'),
237		(new CFormField(
238			(new CSelect('proxy_hostid'))
239				->setReadonly(!$data['proxies_enabled'])
240				->addOptions(CSelect::createOptionsFromArray([0 => _('(no proxy)')] + $data['proxies']))
241				->setFocusableElementId('label-proxy-hostid')
242				->setValue(array_key_exists('proxy_hostid', $data['inputs']) ? $data['inputs']['proxy_hostid'] : 0)
243				->setId('proxy_hostid')
244				->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
245		))
246			->addClass(CFormField::ZBX_STYLE_FORM_FIELD_FLUID)
247			->addClass('js-proxy-hostid-row'),
248
249		(new CFormField(
250			(new CSimpleButton(_('Get value')))
251				->setId('get_value_btn')
252				->addClass(ZBX_STYLE_BTN_ALT)
253		))
254			->addClass(CFormField::ZBX_STYLE_FORM_FIELD_OFFSET_3)
255			->addClass('js-get-value-row')
256			->addStyle('text-align: right;')
257	]);
258}
259
260$form_grid->addItem([
261	new CLabel(_('Value'), 'value'),
262	new CFormField(
263		(new CMultilineInput('value', '', [
264			'disabled' => false,
265			'readonly' => false
266		]))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
267	),
268
269	new CLabel(_('Time'), 'time'),
270	new CFormField(
271		(new CTextBox(null, 'now', true))
272			->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
273			->setId('time')
274	),
275
276	($data['preproc_item'] instanceof CDiscoveryRule)
277		? null
278		: (new CFormField((new CCheckBox('not_supported'))->setLabel(_('Not supported'))))
279			->addClass(CFormField::ZBX_STYLE_FORM_FIELD_FLUID),
280
281	new CLabel(_('Previous value'), 'prev_item_value'),
282	new CFormField(
283		(new CMultilineInput('prev_value', '', [
284			'disabled' => !$data['show_prev']
285		]))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
286	),
287
288	new CLabel(_('Prev. time'), 'prev_time'),
289	new CFormField(
290		(new CTextBox('prev_time', $data['prev_time']))
291			->setEnabled($data['show_prev'])
292			->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
293	),
294
295	new CLabel(_('End of line sequence'), 'eol'),
296	(new CFormField(
297		(new CRadioButtonList('eol', $data['eol']))
298			->addValue(_('LF'), ZBX_EOL_LF)
299			->addValue(_('CRLF'), ZBX_EOL_CRLF)
300			->setModern(true)
301	))->addClass(CFormField::ZBX_STYLE_FORM_FIELD_FLUID)
302]);
303
304if ($macros_table) {
305	$form_grid->addItem([
306		new CLabel(_('Macros')),
307		(new CFormField(
308			(new CDiv($macros_table))
309				->addStyle('width: 675px;')
310				->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
311		))->addClass(CFormField::ZBX_STYLE_FORM_FIELD_FLUID)
312	]);
313}
314
315if (count($data['steps']) > 0) {
316	// Create results table.
317	$result_table = (new CTable())
318		->setId('preprocessing-steps')
319		->addClass('table-forms preprocessing-test-results')
320		->addStyle('width: 100%;')
321		->setHeader([
322			'',
323			(new CColHeader(_('Name')))->addStyle('width: 100%;'),
324			(new CColHeader(_('Result')))->addClass(ZBX_STYLE_RIGHT)
325		]);
326
327	foreach ($data['steps'] as $i => $step) {
328		$form
329			->addVar('steps['.$i.'][type]', $step['type'])
330			->addVar('steps['.$i.'][error_handler]', $step['error_handler'])
331			->addVar('steps['.$i.'][error_handler_params]', $step['error_handler_params']);
332
333		// Temporary solution to fix "\n\n1" conversion to "\n1" in the hidden textarea field after jQuery.append().
334		if ($step['type'] == ZBX_PREPROC_CSV_TO_JSON || $step['type'] == ZBX_PREPROC_VALIDATE_RANGE) {
335			$form->addItem(new CInput('hidden', 'steps['.$i.'][params]', $step['params']));
336		}
337		else {
338			$form->addVar('steps['.$i.'][params]', $step['params']);
339		}
340
341		$result_table->addRow([
342			(new CCol($step['num'].':')),
343			(new CCol($step['name']))
344				->setId('preproc-test-step-'.$i.'-name')
345				->addClass(ZBX_STYLE_WORDBREAK),
346			(new CCol())
347				->addClass(ZBX_STYLE_RIGHT)
348				->setId('preproc-test-step-'.$i.'-result')
349		]);
350	}
351
352	$form_grid->addItem([
353		new CLabel(_('Preprocessing steps')),
354		(new CFormField(
355			(new CDiv($result_table))
356				->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
357				->addStyle('width: 675px;')
358		))->addClass(CFormField::ZBX_STYLE_FORM_FIELD_FLUID)
359	]);
360}
361
362if ($data['show_final_result']) {
363	$form_grid->addItem([
364		(new CLabel(_('Result')))->addClass('js-final-result'),
365		(new CFormField())->addClass(CFormField::ZBX_STYLE_FORM_FIELD_FLUID)
366	]);
367}
368
369$form
370	->addItem($form_grid)
371	->addItem((new CInput('submit', 'submit'))->addStyle('display: none;'));
372
373$templates = [
374	(new CTag('script', true))
375		->setAttribute('type', 'text/x-jquery-tmpl')
376		->setId('preprocessing-step-error-icon')
377		->addItem(makeErrorIcon('#{error}')),
378	(new CTag('script', true))
379		->setAttribute('type', 'text/x-jquery-tmpl')
380		->setId('preprocessing-gray-label')
381		->addItem(
382			(new CDiv('#{label}'))
383				->addStyle('margin-top: 5px;')
384				->addClass(ZBX_STYLE_GREY)
385		),
386	(new CTag('script', true))
387		->setAttribute('type', 'text/x-jquery-tmpl')
388		->setId('preprocessing-step-result')
389		->addItem(
390			(new CDiv(
391				(new CSpan('#{result}'))
392					->addClass(ZBX_STYLE_LINK_ACTION)
393					->setHint('#{result}', 'hintbox-wrap')
394			))
395				->addStyle('max-width: '.ZBX_TEXTAREA_STANDARD_WIDTH.'px;')
396				->addClass(ZBX_STYLE_OVERFLOW_ELLIPSIS)
397		),
398	(new CTag('script', true))
399		->setAttribute('type', 'text/x-jquery-tmpl')
400		->setId('preprocessing-step-action-done')
401		->addItem(
402			(new CDiv([
403				'#{action_name} ',
404				(new CDiv(
405					(new CSpan('#{failed}'))
406						->addClass(ZBX_STYLE_LINK_ACTION)
407						->setHint('#{failed}', 'hintbox-wrap')
408				))
409					->addStyle('max-width: '.ZBX_TEXTAREA_STANDARD_WIDTH.'px;')
410					->addClass(ZBX_STYLE_OVERFLOW_ELLIPSIS)
411					->addClass(ZBX_STYLE_REL_CONTAINER)
412			]))
413				->addStyle('margin-top: 1px;')
414				->addClass(ZBX_STYLE_GREY)
415		)
416];
417
418$warning_box = $data['show_warning']
419	? makeMessageBox(ZBX_STYLE_MSG_WARNING, [[
420		'message' => _('Item contains user-defined macros with secret values. Values of these macros should be entered manually.')
421	]])
422	: null;
423
424$output = [
425	'header' => $data['title'],
426	'script_inline' => $this->readJsFile('popup.itemtestedit.view.js.php'),
427	'body' => (new CDiv([$warning_box, $form, $templates]))->toString(),
428	'cancel_action' => 'return saveItemTestInputs();',
429	'buttons' => [
430		[
431			'title' => ($data['is_item_testable'] && $data['get_value']) ? _('Get value and test') : _('Test'),
432			'keepOpen' => true,
433			'enabled' => true,
434			'isSubmit' => true,
435			'action' => 'return itemCompleteTest(overlay);'
436		]
437	]
438];
439
440if ($data['user']['debug_mode'] == GROUP_DEBUG_MODE_ENABLED) {
441	CProfiler::getInstance()->stop();
442	$output['debug'] = CProfiler::getInstance()->make()->toString();
443}
444
445echo json_encode($output);
446