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
26require_once dirname(__FILE__).'/js/configuration.host.discovery.list.js.php';
27
28$widget = (new CWidget())
29	->setTitle(_('Discovery rules'))
30	->setControls(
31		(new CTag('nav', true,
32			(new CList())->addItem(
33				($data['hostid'] != 0)
34					? new CRedirectButton(_('Create discovery rule'),
35						(new CUrl('host_discovery.php'))
36							->setArgument('form', 'create')
37							->setArgument('hostid', $data['hostid'])
38							->setArgument('context', $data['context'])
39							->getUrl()
40					)
41					: (new CButton('form',
42						($data['context'] === 'host')
43							? _('Create discovery rule (select host first)')
44							: _('Create discovery rule (select template first)')
45					))->setEnabled(false)
46			)
47		))->setAttribute('aria-label', _('Content controls'))
48	);
49
50if ($data['hostid'] != 0) {
51	$widget->setNavigation(getHostNavigation('discoveries', $data['hostid']));
52}
53
54// Add filter tab.
55$filter = (new CFilter((new CUrl('host_discovery.php'))->setArgument('context', $data['context'])))
56	->setProfile($data['profileIdx'])
57	->setActiveTab($data['active_tab'])
58	->addvar('context', $data['context']);
59
60$hg_ms_params = ($data['context'] === 'host') ? ['real_hosts' => 1] : ['templated_hosts' => 1];
61
62$filter_column1 = (new CFormList())
63	->addRow((new CLabel(_('Host groups'), 'filter_groupids__ms')),
64		(new CMultiSelect([
65			'name' => 'filter_groupids[]',
66			'object_name' => 'hostGroup',
67			'data' => $data['filter']['groups'],
68			'popup' => [
69				'parameters' => [
70					'srctbl' => 'host_groups',
71					'srcfld1' => 'groupid',
72					'dstfrm' => $filter->getName(),
73					'dstfld1' => 'filter_groupids_',
74					'editable' => true,
75					'enrich_parent_groups' => true
76				] + $hg_ms_params
77			]
78		]))->setWidth(ZBX_TEXTAREA_FILTER_STANDARD_WIDTH)
79	)
80	->addRow((new CLabel(($data['context'] === 'host') ? _('Hosts') : _('Templates'), 'filter_hostids__ms')),
81		(new CMultiSelect([
82			'name' => 'filter_hostids[]',
83			'object_name' => ($data['context'] === 'host') ? 'hosts' : 'templates',
84			'data' => $data['filter']['hosts'],
85			'popup' => [
86				'filter_preselect_fields' => [
87					'hostgroups' => 'filter_groupids_'
88				],
89				'parameters' => [
90					'srctbl' => ($data['context'] === 'host') ? 'hosts' : 'templates',
91					'srcfld1' => 'hostid',
92					'dstfrm' => $filter->getName(),
93					'dstfld1' => 'filter_hostids_',
94					'editable' => true
95				]
96			]
97		]))->setWidth(ZBX_TEXTAREA_FILTER_STANDARD_WIDTH)
98	)
99	->addRow(_('Name'),
100		(new CTextBox('filter_name', $data['filter']['name']))->setWidth(ZBX_TEXTAREA_FILTER_STANDARD_WIDTH)
101	)
102	->addRow(_('Key'),
103		(new CTextBox('filter_key', $data['filter']['key']))->setWidth(ZBX_TEXTAREA_FILTER_STANDARD_WIDTH)
104	);
105
106// type select
107$filter_type_visibility = [];
108$type_select = (new CSelect('filter_type'))
109	->setId('filter_type')
110	->setFocusableElementId('label-type')
111	->addOption(new CSelectOption(-1, _('all')))
112	->setValue($data['filter']['type']);
113
114zbx_subarray_push($filter_type_visibility, -1, 'filter_delay_row');
115zbx_subarray_push($filter_type_visibility, -1, 'filter_delay');
116
117$lld_types = item_type2str();
118unset($lld_types[ITEM_TYPE_HTTPTEST], $lld_types[ITEM_TYPE_CALCULATED], $lld_types[ITEM_TYPE_SNMPTRAP]);
119
120$type_select->addOptions(CSelect::createOptionsFromArray($lld_types));
121
122foreach ($lld_types as $type => $name) {
123	if ($type != ITEM_TYPE_TRAPPER) {
124		zbx_subarray_push($filter_type_visibility, $type, 'filter_delay_row');
125		zbx_subarray_push($filter_type_visibility, $type, 'filter_delay');
126	}
127	if ($type == ITEM_TYPE_SNMP) {
128		zbx_subarray_push($filter_type_visibility, $type, 'filter_snmp_oid_row');
129	}
130}
131
132zbx_add_post_js(
133	'var filterTypeSwitcher = new CViewSwitcher("filter_type", "change", '.json_encode($filter_type_visibility).');'
134);
135
136$filter_column2 = (new CFormList())
137	->addRow(new CLabel(_('Type'), $type_select->getFocusableElementId()), $type_select)
138	->addRow(_('Update interval'),
139		(new CTextBox('filter_delay', $data['filter']['delay']))->setWidth(ZBX_TEXTAREA_FILTER_SMALL_WIDTH),
140		'filter_delay_row'
141	)
142	->addRow(_('Keep lost resources period'),
143		(new CTextBox('filter_lifetime', $data['filter']['lifetime']))->setWidth(ZBX_TEXTAREA_FILTER_SMALL_WIDTH)
144	)
145	->addRow(_('SNMP OID'),
146		(new CTextBox('filter_snmp_oid', $data['filter']['snmp_oid']))->setWidth(ZBX_TEXTAREA_FILTER_SMALL_WIDTH),
147		'filter_snmp_oid_row'
148	);
149
150$filter_column3 = (new CFormList());
151
152if ($data['context'] === 'host') {
153	$filter_column3->addRow(_('State'),
154		(new CRadioButtonList('filter_state', (int) $data['filter']['state']))
155			->addValue(_('all'), -1)
156			->addValue(_('Normal'), ITEM_STATE_NORMAL)
157			->addValue(_('Not supported'), ITEM_STATE_NOTSUPPORTED)
158			->setModern(true)
159	);
160}
161
162$filter_column3->addRow(_('Status'),
163	(new CRadioButtonList('filter_status', (int) $data['filter']['status']))
164		->addValue(_('all'), -1)
165		->addValue(_('Enabled'), ITEM_STATUS_ACTIVE)
166		->addValue(_('Disabled'), ITEM_STATUS_DISABLED)
167		->setModern(true)
168);
169
170$filter->addFilterTab(_('Filter'), [$filter_column1, $filter_column2, $filter_column3]);
171
172$widget->addItem($filter);
173
174$url = (new CUrl('host_discovery.php'))
175	->setArgument('context', $data['context'])
176	->getUrl();
177
178// create form
179$discoveryForm = (new CForm('post', $url))->setName('discovery');
180
181if ($data['hostid'] != 0) {
182	$discoveryForm->addVar('hostid', $data['hostid']);
183}
184
185// create table
186$discoveryTable = (new CTableInfo())
187	->setHeader([
188		(new CColHeader(
189			(new CCheckBox('all_items'))->onClick("checkAll('".$discoveryForm->getName()."', 'all_items', 'g_hostdruleid');")
190		))->addClass(ZBX_STYLE_CELL_WIDTH),
191		($data['context'] === 'host') ? _('Host') : _('Template'),
192		make_sorting_header(_('Name'), 'name', $data['sort'], $data['sortorder'], $url),
193		_('Items'),
194		_('Triggers'),
195		_('Graphs'),
196		_('Hosts'),
197		make_sorting_header(_('Key'), 'key_', $data['sort'], $data['sortorder'], $url),
198		make_sorting_header(_('Interval'), 'delay', $data['sort'], $data['sortorder'], $url),
199		make_sorting_header(_('Type'), 'type', $data['sort'], $data['sortorder'], $url),
200		make_sorting_header(_('Status'), 'status', $data['sort'], $data['sortorder'], $url),
201		($data['context'] === 'host') ? _('Info') : null
202	]);
203
204$update_interval_parser = new CUpdateIntervalParser(['usermacros' => true]);
205
206foreach ($data['discoveries'] as $discovery) {
207	// description
208	$description = [];
209	$description[] = makeItemTemplatePrefix($discovery['itemid'], $data['parent_templates'], ZBX_FLAG_DISCOVERY_RULE,
210		$data['allowed_ui_conf_templates']
211	);
212
213	if ($discovery['type'] == ITEM_TYPE_DEPENDENT) {
214		if ($discovery['master_item']['type'] == ITEM_TYPE_HTTPTEST) {
215			$description[] = CHtml::encode($discovery['master_item']['name_expanded']);
216		}
217		else {
218			$description[] = (new CLink(CHtml::encode($discovery['master_item']['name_expanded']),
219				(new CUrl('items.php'))
220					->setArgument('form', 'update')
221					->setArgument('itemid', $discovery['master_item']['itemid'])
222					->setArgument('context', $data['context'])
223					->getUrl()
224			))
225				->addClass(ZBX_STYLE_LINK_ALT)
226				->addClass(ZBX_STYLE_TEAL);
227		}
228
229		$description[] = NAME_DELIMITER;
230	}
231
232	$description[] = new CLink(
233		CHtml::encode($discovery['name_expanded']),
234		(new CUrl('host_discovery.php'))
235			->setArgument('form', 'update')
236			->setArgument('itemid', $discovery['itemid'])
237			->setArgument('context', $data['context'])
238	);
239
240	// status
241	$status = (new CLink(
242		itemIndicator($discovery['status'], $discovery['state']),
243		(new CUrl('host_discovery.php'))
244			->setArgument('hostid', $discovery['hostid'])
245			->setArgument('g_hostdruleid[]', $discovery['itemid'])
246			->setArgument('action', ($discovery['status'] == ITEM_STATUS_DISABLED)
247				? 'discoveryrule.massenable'
248				: 'discoveryrule.massdisable'
249			)
250			->setArgument('context', $data['context'])
251			->getUrl()
252		))
253			->addClass(ZBX_STYLE_LINK_ACTION)
254			->addClass(itemIndicatorStyle($discovery['status'], $discovery['state']))
255			->addSID();
256
257	// Hide zeros for trapper, SNMP trap and dependent items.
258	if ($discovery['type'] == ITEM_TYPE_TRAPPER || $discovery['type'] == ITEM_TYPE_SNMPTRAP
259			|| $discovery['type'] == ITEM_TYPE_DEPENDENT || ($discovery['type'] == ITEM_TYPE_ZABBIX_ACTIVE
260				&& strncmp($discovery['key_'], 'mqtt.get', 8) === 0)) {
261		$discovery['delay'] = '';
262	}
263	elseif ($update_interval_parser->parse($discovery['delay']) == CParser::PARSE_SUCCESS) {
264		$discovery['delay'] = $update_interval_parser->getDelay();
265	}
266
267	// info
268	if ($data['context'] === 'host') {
269		$info_icons = [];
270
271		if ($discovery['status'] == ITEM_STATUS_ACTIVE && $discovery['error'] !== '') {
272			$info_icons[] = makeErrorIcon($discovery['error']);
273		}
274	}
275
276	$discoveryTable->addRow([
277		new CCheckBox('g_hostdruleid['.$discovery['itemid'].']', $discovery['itemid']),
278		$discovery['hosts'][0]['name'],
279		$description,
280		[
281			new CLink(_('Item prototypes'),
282				(new CUrl('disc_prototypes.php'))
283					->setArgument('parent_discoveryid', $discovery['itemid'])
284					->setArgument('context', $data['context'])
285			),
286			CViewHelper::showNum($discovery['items'])
287		],
288		[
289			new CLink(_('Trigger prototypes'),
290				(new CUrl('trigger_prototypes.php'))
291					->setArgument('parent_discoveryid', $discovery['itemid'])
292					->setArgument('context', $data['context'])
293			),
294			CViewHelper::showNum($discovery['triggers'])
295		],
296		[
297			new CLink(_('Graph prototypes'),
298				(new CUrl('graphs.php'))
299					->setArgument('parent_discoveryid', $discovery['itemid'])
300					->setArgument('context', $data['context'])
301			),
302			CViewHelper::showNum($discovery['graphs'])
303		],
304		($discovery['hosts'][0]['flags'] == ZBX_FLAG_DISCOVERY_NORMAL)
305			? [
306				new CLink(_('Host prototypes'),
307					(new CUrl('host_prototypes.php'))
308						->setArgument('parent_discoveryid', $discovery['itemid'])
309						->setArgument('context', $data['context'])
310				),
311				CViewHelper::showNum($discovery['hostPrototypes'])
312			]
313			: '',
314		(new CDiv(CHtml::encode($discovery['key_'])))->addClass(ZBX_STYLE_WORDWRAP),
315		$discovery['delay'],
316		item_type2str($discovery['type']),
317		$status,
318		($data['context'] === 'host') ? makeInformationList($info_icons) : null
319	]);
320}
321
322$button_list = [
323	'discoveryrule.massenable' => ['name' => _('Enable'), 'confirm' =>_('Enable selected discovery rules?')],
324	'discoveryrule.massdisable' => ['name' => _('Disable'), 'confirm' =>_('Disable selected discovery rules?')]
325];
326
327if ($data['context'] === 'host') {
328	$button_list += ['discoveryrule.masscheck_now' => ['name' => _('Execute now'), 'disabled' => $data['is_template']]];
329}
330
331$button_list += [
332	'discoveryrule.massdelete' => ['name' => _('Delete'), 'confirm' =>_('Delete selected discovery rules?')]
333];
334
335// Append table to form.
336$discoveryForm->addItem([$discoveryTable, $data['paging'], new CActionButtonList('action', 'g_hostdruleid',
337	$button_list, $data['checkbox_hash']
338)]);
339
340// Append form to widget.
341$widget->addItem($discoveryForm);
342
343$widget->show();
344