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
27<script type="text/x-jquery-tmpl" id="delayFlexRow">
28	<tr class="form_row">
29		<td>
30			<ul class="<?= CRadioButtonList::ZBX_STYLE_CLASS ?>" id="delay_flex_#{rowNum}_type">
31				<li>
32					<input type="radio" id="delay_flex_#{rowNum}_type_0" name="delay_flex[#{rowNum}][type]" value="0" checked="checked">
33					<label for="delay_flex_#{rowNum}_type_0"><?= _('Flexible') ?></label>
34				</li><li>
35					<input type="radio" id="delay_flex_#{rowNum}_type_1" name="delay_flex[#{rowNum}][type]" value="1">
36					<label for="delay_flex_#{rowNum}_type_1"><?= _('Scheduling') ?></label>
37				</li>
38			</ul>
39		</td>
40		<td>
41			<input type="text" id="delay_flex_#{rowNum}_delay" name="delay_flex[#{rowNum}][delay]" maxlength="255" placeholder="<?= ZBX_ITEM_FLEXIBLE_DELAY_DEFAULT ?>">
42			<input type="text" id="delay_flex_#{rowNum}_schedule" name="delay_flex[#{rowNum}][schedule]" maxlength="255" placeholder="<?= ZBX_ITEM_SCHEDULING_DEFAULT ?>" style="display: none;">
43		</td>
44		<td>
45			<input type="text" id="delay_flex_#{rowNum}_period" name="delay_flex[#{rowNum}][period]" maxlength="255" placeholder="<?= ZBX_DEFAULT_INTERVAL ?>">
46		</td>
47		<td>
48			<button type="button" id="delay_flex_#{rowNum}_remove" name="delay_flex[#{rowNum}][remove]" class="<?= ZBX_STYLE_BTN_LINK ?> element-table-remove"><?= _('Remove') ?></button>
49		</td>
50	</tr>
51</script>
52<script type="text/javascript">
53	jQuery(function($) {
54		$('#delayFlexTable').on('click', 'input[type="radio"]', function() {
55			var rowNum = $(this).attr('id').split('_')[2];
56
57			if ($(this).val() == <?= ITEM_DELAY_FLEXIBLE; ?>) {
58				$('#delay_flex_' + rowNum + '_schedule').hide();
59				$('#delay_flex_' + rowNum + '_delay').show();
60				$('#delay_flex_' + rowNum + '_period').show();
61			}
62			else {
63				$('#delay_flex_' + rowNum + '_delay').hide();
64				$('#delay_flex_' + rowNum + '_period').hide();
65				$('#delay_flex_' + rowNum + '_schedule').show();
66			}
67		});
68
69		$('#delayFlexTable').dynamicRows({
70			template: '#delayFlexRow'
71		});
72	});
73</script>
74<?php
75
76/*
77 * Visibility
78 */
79$this->data['typeVisibility'] = [];
80
81if (!empty($this->data['interfaces'])) {
82	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_ZABBIX, 'interface_row');
83	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_ZABBIX, 'interfaceid');
84	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SIMPLE, 'interface_row');
85	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SIMPLE, 'interfaceid');
86	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SNMP, 'interface_row');
87	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SNMP, 'interfaceid');
88	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_EXTERNAL, 'interface_row');
89	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_EXTERNAL, 'interfaceid');
90	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_IPMI, 'interface_row');
91	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_IPMI, 'interfaceid');
92	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SSH, 'interface_row');
93	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SSH, 'interfaceid');
94	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_TELNET, 'interface_row');
95	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_TELNET, 'interfaceid');
96	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_JMX, 'interface_row');
97	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_JMX, 'interfaceid');
98	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SNMPTRAP, 'interface_row');
99	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SNMPTRAP, 'interfaceid');
100	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_HTTPAGENT, 'interface_row');
101	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_HTTPAGENT, 'interfaceid');
102}
103zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SIMPLE, 'row_username');
104zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SIMPLE, 'username');
105zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SIMPLE, 'row_password');
106zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SIMPLE, 'password');
107zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SNMP, 'snmp_oid');
108zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SNMP, 'row_snmp_oid');
109zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_IPMI, 'ipmi_sensor');
110zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_IPMI, 'row_ipmi_sensor');
111zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SSH, 'authtype');
112zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SSH, 'row_authtype');
113zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SSH, 'username');
114zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SSH, 'row_username');
115zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_TELNET, 'username');
116zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_TELNET, 'row_username');
117zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_DB_MONITOR, 'username');
118zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_DB_MONITOR, 'row_username');
119zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_JMX, 'username');
120zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_JMX, 'row_username');
121zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_JMX, 'jmx_endpoint');
122zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_JMX, 'row_jmx_endpoint');
123zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SSH, 'password');
124zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SSH, 'row_password');
125zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_TELNET, 'password');
126zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_TELNET, 'row_password');
127zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_DB_MONITOR, 'password');
128zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_DB_MONITOR, 'row_password');
129zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_JMX, 'password');
130zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_JMX, 'row_password');
131zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SSH, 'label_executed_script');
132zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_TELNET, 'label_executed_script');
133zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_DB_MONITOR, 'label_params');
134zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_CALCULATED, 'label_formula');
135zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SSH, 'params_script');
136zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_SSH, 'row_params');
137zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_TELNET, 'params_script');
138zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_TELNET, 'row_params');
139zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_DB_MONITOR, 'params_dbmonitor');
140zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_DB_MONITOR, 'row_params');
141zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_CALCULATED, 'params_calculted');
142zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_CALCULATED, 'row_params');
143zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_TRAPPER, 'trapper_hosts');
144zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_TRAPPER, 'row_trapper_hosts');
145zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_DEPENDENT, 'row_master_item');
146$ui_rows = [
147	ITEM_TYPE_HTTPAGENT => [
148		'url_row', 'query_fields_row', 'request_method_row', 'timeout_row', 'post_type_row', 'posts_row', 'headers_row',
149		'status_codes_row', 'follow_redirects_row', 'retrieve_mode_row', 'output_format_row', 'allow_traps_row',
150		'request_method', 'http_proxy_row', 'http_authtype_row', 'http_authtype', 'verify_peer_row', 'verify_host_row',
151		'ssl_key_file_row', 'ssl_cert_file_row', 'ssl_key_password_row', 'trapper_hosts', 'allow_traps'
152	]
153];
154foreach ($ui_rows[ITEM_TYPE_HTTPAGENT] as $row) {
155	zbx_subarray_push($this->data['typeVisibility'], ITEM_TYPE_HTTPAGENT, $row);
156}
157
158foreach ($this->data['types'] as $type => $label) {
159	switch ($type) {
160		case ITEM_TYPE_DB_MONITOR:
161			$defaultKey = $this->data['is_discovery_rule']
162				? ZBX_DEFAULT_KEY_DB_MONITOR_DISCOVERY
163				: ZBX_DEFAULT_KEY_DB_MONITOR;
164			zbx_subarray_push($this->data['typeVisibility'], $type,
165				['id' => 'key', 'defaultValue' => $defaultKey]
166			);
167			break;
168		case ITEM_TYPE_SSH:
169			zbx_subarray_push($this->data['typeVisibility'], $type,
170				['id' => 'key', 'defaultValue' => ZBX_DEFAULT_KEY_SSH]
171			);
172			break;
173		case ITEM_TYPE_TELNET:
174			zbx_subarray_push($this->data['typeVisibility'], $type,
175				['id' => 'key', 'defaultValue' => ZBX_DEFAULT_KEY_TELNET]
176			);
177			break;
178		default:
179			zbx_subarray_push($this->data['typeVisibility'], $type, ['id' => 'key', 'defaultValue' => '']);
180	}
181}
182foreach ($this->data['types'] as $type => $label) {
183	if ($type == ITEM_TYPE_TRAPPER || $type == ITEM_TYPE_SNMPTRAP || $type == ITEM_TYPE_DEPENDENT) {
184		continue;
185	}
186
187	zbx_subarray_push($this->data['typeVisibility'], $type, 'row_flex_intervals');
188}
189foreach ($this->data['types'] as $type => $label) {
190	if ($type == ITEM_TYPE_TRAPPER || $type == ITEM_TYPE_SNMPTRAP || $type == ITEM_TYPE_DEPENDENT) {
191		continue;
192	}
193	zbx_subarray_push($this->data['typeVisibility'], $type, 'delay');
194	zbx_subarray_push($this->data['typeVisibility'], $type, 'row_delay');
195}
196
197// disable dropdown items for calculated and aggregate items
198foreach ([ITEM_TYPE_CALCULATED, ITEM_TYPE_AGGREGATE] as $type) {
199	// set to disable character, log and text items in value type
200	zbx_subarray_push($this->data['typeDisable'], $type, [ITEM_VALUE_TYPE_STR, ITEM_VALUE_TYPE_LOG, ITEM_VALUE_TYPE_TEXT], 'value_type');
201}
202
203$this->data['authTypeVisibility'] = [];
204zbx_subarray_push($this->data['authTypeVisibility'], ITEM_AUTHTYPE_PUBLICKEY, 'publickey');
205zbx_subarray_push($this->data['authTypeVisibility'], ITEM_AUTHTYPE_PUBLICKEY, 'row_publickey');
206zbx_subarray_push($this->data['authTypeVisibility'], ITEM_AUTHTYPE_PUBLICKEY, 'privatekey');
207zbx_subarray_push($this->data['authTypeVisibility'], ITEM_AUTHTYPE_PUBLICKEY, 'row_privatekey');
208
209?>
210<script type="text/javascript">
211	function setAuthTypeLabel() {
212		if (jQuery('#authtype').val() == <?= json_encode(ITEM_AUTHTYPE_PUBLICKEY) ?>
213				&& jQuery('#type').val() == <?= json_encode(ITEM_TYPE_SSH) ?>) {
214			jQuery('#row_password label').html(<?= json_encode(_('Key passphrase')) ?>);
215		}
216		else {
217			jQuery('#row_password label').html(<?= json_encode(_('Password')) ?>);
218		}
219	}
220
221	function updateItemTestBtn() {
222		var testable_item_types = <?= json_encode(CControllerPopupItemTest::getTestableItemTypes($this->data['hostid'])) ?>,
223			type = parseInt(jQuery('#type').val()),
224			key = jQuery('#key').val();
225
226		if (type == <?= ITEM_TYPE_SIMPLE ?> && (key.substr(0, 7) === 'vmware.' || key.substr(0, 8) === 'icmpping')) {
227			jQuery('#test_item').prop('disabled', true);
228		}
229		else {
230			jQuery('#test_item').prop('disabled', (testable_item_types.indexOf(type) == -1));
231		}
232	}
233
234	jQuery(document).ready(function($) {
235		<?php
236		if (!empty($this->data['authTypeVisibility'])) { ?>
237			var authTypeSwitcher = new CViewSwitcher('authtype', 'change',
238				<?php echo zbx_jsvalue($this->data['authTypeVisibility'], true); ?>);
239		<?php }
240		if (!empty($this->data['typeVisibility'])) { ?>
241			var typeSwitcher = new CViewSwitcher('type', 'change',
242				<?php echo zbx_jsvalue($this->data['typeVisibility'], true); ?>,
243				<?php echo zbx_jsvalue($this->data['typeDisable'], true); ?>);
244		<?php } ?>
245		if ($('#http_authtype').length) {
246			new CViewSwitcher('http_authtype', 'change', <?= zbx_jsvalue([
247				HTTPTEST_AUTH_BASIC => ['http_username_row', 'http_password_row'],
248				HTTPTEST_AUTH_NTLM => ['http_username_row', 'http_password_row'],
249				HTTPTEST_AUTH_KERBEROS => ['http_username_row', 'http_password_row']
250			], true) ?>);
251		}
252
253		if ($('#allow_traps').length) {
254			new CViewSwitcher('allow_traps', 'change', <?= zbx_jsvalue([
255				HTTPCHECK_ALLOW_TRAPS_ON => ['row_trapper_hosts']
256			], true) ?>);
257		}
258
259		$("#key").on('keyup change', updateItemTestBtn);
260
261		$('#type')
262			.change(function() {
263				// update the interface select with each item type change
264				var item_interface_types = <?= json_encode(itemTypeInterface()) ?>,
265					interface_ids_by_types = <?= json_encode($interface_ids_by_types) ?>;
266
267				updateItemTestBtn();
268				organizeInterfaces(interface_ids_by_types, item_interface_types, parseInt($(this).val()));
269
270				setAuthTypeLabel();
271			})
272			.trigger('change');
273
274		$('#test_item').on('click', function() {
275			var step_nums = [];
276			$('z-select[name^="preprocessing"][name$="[type]"]', $('#preprocessing')).each(function() {
277				var str = $(this).attr('name');
278				step_nums.push(str.substr(14, str.length - 21));
279			});
280
281			openItemTestDialog(step_nums, true, true, this, -2);
282		});
283
284		$('#authtype').bind('change', function() {
285			setAuthTypeLabel();
286		});
287
288		$('[data-action="parse_url"]').click(function(e) {
289			var url_node = $(this).siblings('[name="url"]'),
290				table = $('#query_fields_pairs').data('editableTable'),
291				url = parseUrlString(url_node.val())
292
293			if (typeof url === 'object') {
294				if (url.pairs.length > 0) {
295					table.addRows(url.pairs);
296					table.getTableRows().map(function() {
297						var empty = $(this).find('input[type="text"]').map(function() {
298							return $(this).val() == '' ? this : null;
299						});
300
301						return empty.length == 2 ? this : null;
302					}).map(function() {
303						table.removeRow(this);
304					});
305				}
306
307				url_node.val(url.url);
308			}
309			else {
310				overlayDialogue({
311					'title': <?= json_encode(_('Error')); ?>,
312					'content': $('<span>').html(<?=
313						json_encode(_('Failed to parse URL.').'<br><br>'._('URL is not properly encoded.'));
314					?>),
315					'buttons': [
316						{
317							title: <?= json_encode(_('Ok')); ?>,
318							class: 'btn-alt',
319							focused: true,
320							action: function() {}
321						}
322					]
323				}, e.target);
324			}
325		});
326
327		$('#request_method').change(function() {
328			if ($(this).val() == <?= HTTPCHECK_REQUEST_HEAD ?>) {
329				$(':radio', '#retrieve_mode')
330					.filter('[value=<?= HTTPTEST_STEP_RETRIEVE_MODE_HEADERS ?>]').click()
331					.end()
332					.prop('disabled', true);
333			}
334			else {
335				$(':radio', '#retrieve_mode').prop('disabled', false);
336			}
337		});
338	});
339</script>
340