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('⇒'))->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