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