. **/ /** * Get data for LLD rule edit page. * * @param array $item LLD rule to take the data from. * * @return array */ function getItemFormData(array $item = []) { // Default script value for browser type items. $browser_script = <<<'JAVASCRIPT' var browser = new Browser(Browser.chromeOptions()); try { browser.navigate("https://example.com"); browser.collectPerfEntries(); } finally { return JSON.stringify(browser.getResult()); } JAVASCRIPT; $data = [ 'form' => getRequest('form'), 'form_refresh' => getRequest('form_refresh', 0), 'is_discovery_rule' => true, 'parent_discoveryid' => getRequest('parent_discoveryid', 0), 'itemid' => getRequest('itemid'), 'limited' => false, 'interfaceid' => getRequest('interfaceid', 0), 'name' => getRequest('name', ''), 'description' => getRequest('description', ''), 'key' => getRequest('key', ''), 'master_itemid' => getRequest('master_itemid', 0), 'hostname' => getRequest('hostname'), 'delay' => getRequest('delay', ZBX_LLD_RULE_DELAY_DEFAULT), 'history' => getRequest('history', DB::getDefault('items', 'history')), 'status' => getRequest('status', isset($_REQUEST['form_refresh']) ? 1 : 0), 'type' => getRequest('type', ITEM_TYPE_ZABBIX), 'snmp_oid' => getRequest('snmp_oid', ''), 'value_type' => getRequest('value_type', ITEM_VALUE_TYPE_UINT64), 'trapper_hosts' => getRequest('trapper_hosts', ''), 'units' => getRequest('units', ''), 'valuemapid' => getRequest('valuemapid', 0), 'params' => getRequest('params', ''), 'browser_script' => getRequest('browser_script', $browser_script), 'trends' => getRequest('trends', DB::getDefault('items', 'trends')), 'delay_flex' => array_values(getRequest('delay_flex', [])), 'ipmi_sensor' => getRequest('ipmi_sensor', ''), 'authtype' => getRequest('authtype', 0), 'username' => getRequest('username', ''), 'password' => getRequest('password', ''), 'publickey' => getRequest('publickey', ''), 'privatekey' => getRequest('privatekey', ''), 'logtimefmt' => getRequest('logtimefmt', ''), 'possibleHostInventories' => null, 'alreadyPopulated' => null, 'initial_item_type' => null, 'templates' => [], 'jmx_endpoint' => getRequest('jmx_endpoint', ZBX_DEFAULT_JMX_ENDPOINT), 'timeout' => getRequest('timeout', DB::getDefault('items', 'timeout')), 'url' => getRequest('url'), 'query_fields' => getRequest('query_fields', []), 'parameters' => getRequest('parameters', []), 'posts' => getRequest('posts'), 'status_codes' => getRequest('status_codes', DB::getDefault('items', 'status_codes')), 'follow_redirects' => hasRequest('form_refresh') ? (int) getRequest('follow_redirects') : getRequest('follow_redirects', DB::getDefault('items', 'follow_redirects')), 'post_type' => getRequest('post_type', DB::getDefault('items', 'post_type')), 'http_proxy' => getRequest('http_proxy'), 'headers' => getRequest('headers', []), 'retrieve_mode' => getRequest('retrieve_mode', DB::getDefault('items', 'retrieve_mode')), 'request_method' => getRequest('request_method', DB::getDefault('items', 'request_method')), 'output_format' => getRequest('output_format', DB::getDefault('items', 'output_format')), 'allow_traps' => getRequest('allow_traps', DB::getDefault('items', 'allow_traps')), 'ssl_cert_file' => getRequest('ssl_cert_file'), 'ssl_key_file' => getRequest('ssl_key_file'), 'ssl_key_password' => getRequest('ssl_key_password'), 'verify_peer' => getRequest('verify_peer', DB::getDefault('items', 'verify_peer')), 'verify_host' => getRequest('verify_host', DB::getDefault('items', 'verify_host')), 'http_authtype' => getRequest('http_authtype', ZBX_HTTP_AUTH_NONE), 'http_username' => getRequest('http_username', ''), 'http_password' => getRequest('http_password', ''), 'preprocessing' => getRequest('preprocessing', []), 'preprocessing_script_maxlength' => DB::getFieldLength('item_preproc', 'params'), 'context' => getRequest('context'), 'show_inherited_tags' => getRequest('show_inherited_tags', 0), 'tags' => getRequest('tags', []), 'backurl' => getRequest('backurl'), 'lifetime_type' => getRequest('lifetime_type', DB::getDefault('items', 'lifetime_type')), 'lifetime' => getRequest('lifetime', DB::getDefault('items', 'lifetime')), 'enabled_lifetime_type' => getRequest('enabled_lifetime_type', DB::getDefault('items', 'enabled_lifetime_type')), 'enabled_lifetime' => getRequest('enabled_lifetime', ZBX_LLD_RULE_ENABLED_LIFETIME) ]; CArrayHelper::sort($data['preprocessing'], ['sortorder']); // Unset empty and inherited tags. foreach ($data['tags'] as $key => $tag) { if ($tag['tag'] === '' && $tag['value'] === '') { unset($data['tags'][$key]); } elseif (array_key_exists('type', $tag) && !($tag['type'] & ZBX_PROPERTY_OWN)) { unset($data['tags'][$key]); } else { unset($data['tags'][$key]['type']); } } if ($data['parent_discoveryid'] != 0) { $data['discover'] = hasRequest('form_refresh') ? getRequest('discover', DB::getDefault('items', 'discover')) : (($item && array_key_exists('discover', $item)) ? $item['discover'] : DB::getDefault('items', 'discover') ); } if ($data['type'] != ITEM_TYPE_HTTPAGENT) { $data['headers'] = []; $data['query_fields'] = []; } if (in_array($data['type'], [ITEM_TYPE_SCRIPT, ITEM_TYPE_BROWSER])) { CArrayHelper::sort($data['parameters'], ['name']); $data['parameters'] = array_values($data['parameters']); } else { $data['parameters'] = []; } // Dependent item initialization by master_itemid. if (array_key_exists('master_item', $item)) { $data['master_itemid'] = $item['master_item']['itemid']; $data['master_itemname'] = $item['master_item']['name']; // Do not initialize item data if only master_item array was passed. unset($item['master_item']); } // hostid if ($data['parent_discoveryid'] != 0) { $discoveryRule = API::DiscoveryRule()->get([ 'output' => ['hostid'], 'selectHosts' => ['flags'], 'itemids' => $data['parent_discoveryid'], 'editable' => true ]); $discoveryRule = reset($discoveryRule); $data['hostid'] = $discoveryRule['hostid']; $data['host'] = $discoveryRule['hosts'][0]; } else { $data['hostid'] = getRequest('hostid', 0); } foreach ($data['preprocessing'] as &$step) { $step += [ 'error_handler' => ZBX_PREPROC_FAIL_DEFAULT, 'error_handler_params' => '' ]; } unset($step); // types, http items only for internal processes $data['types'] = item_type2str(); unset($data['types'][ITEM_TYPE_HTTPTEST]); unset($data['types'][ITEM_TYPE_CALCULATED], $data['types'][ITEM_TYPE_SNMPTRAP]); // item if (array_key_exists('itemid', $item)) { $data['item'] = $item; $data['hostid'] = !empty($data['hostid']) ? $data['hostid'] : $data['item']['hostid']; $data['limited'] = ($data['item']['templateid'] != 0); $data['interfaceid'] = $item['interfaceid']; // discovery rule $flag = ZBX_FLAG_DISCOVERY_RULE; $data['templates'] = makeItemTemplatesHtml($item['itemid'], getItemParentTemplates([$item], $flag), $flag, CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_TEMPLATES) ); } // caption $data['caption'] = _('Discovery rule'); // fill data from item if (!hasRequest('form_refresh') && ($item || $data['limited'])) { $data['name'] = $data['item']['name']; $data['description'] = $data['item']['description']; $data['key'] = $data['item']['key_']; $data['interfaceid'] = $data['item']['interfaceid']; $data['type'] = $data['item']['type']; $data['snmp_oid'] = $data['item']['snmp_oid']; $data['value_type'] = $data['item']['value_type']; $data['trapper_hosts'] = $data['item']['trapper_hosts']; $data['units'] = $data['item']['units']; $data['valuemapid'] = $data['item']['valuemapid']; $data['hostid'] = $data['item']['hostid']; $data['ipmi_sensor'] = $data['item']['ipmi_sensor']; $data['authtype'] = $data['item']['authtype']; $data['username'] = $data['item']['username']; $data['password'] = $data['item']['password']; $data['publickey'] = $data['item']['publickey']; $data['privatekey'] = $data['item']['privatekey']; $data['logtimefmt'] = $data['item']['logtimefmt']; $data['jmx_endpoint'] = $data['item']['jmx_endpoint']; // ITEM_TYPE_HTTPAGENT $data['timeout'] = $data['item']['timeout']; $data['url'] = $data['item']['url']; $data['query_fields'] = $data['item']['query_fields']; $data['parameters'] = $data['item']['parameters']; $data['posts'] = $data['item']['posts']; $data['status_codes'] = $data['item']['status_codes']; $data['follow_redirects'] = $data['item']['follow_redirects']; $data['post_type'] = $data['item']['post_type']; $data['http_proxy'] = $data['item']['http_proxy']; $data['headers'] = $data['item']['headers']; $data['retrieve_mode'] = $data['item']['retrieve_mode']; $data['request_method'] = $data['item']['request_method']; $data['allow_traps'] = $data['item']['allow_traps']; $data['ssl_cert_file'] = $data['item']['ssl_cert_file']; $data['ssl_key_file'] = $data['item']['ssl_key_file']; $data['ssl_key_password'] = $data['item']['ssl_key_password']; $data['verify_peer'] = $data['item']['verify_peer']; $data['verify_host'] = $data['item']['verify_host']; $data['http_authtype'] = $data['item']['authtype']; $data['http_username'] = $data['item']['username']; $data['http_password'] = $data['item']['password']; if ($data['item']['type'] == ITEM_TYPE_BROWSER) { $data['browser_script'] = $data['item']['params']; } else { $data['params'] = $data['item']['params']; } if (in_array($data['type'], [ITEM_TYPE_SCRIPT, ITEM_TYPE_BROWSER]) && $data['parameters']) { CArrayHelper::sort($data['parameters'], ['name']); $data['parameters'] = array_values($data['parameters']); } $data['preprocessing'] = $data['item']['preprocessing']; if (!$data['limited'] || !isset($_REQUEST['form_refresh'])) { $data['delay'] = $data['item']['delay']; $update_interval_parser = new CUpdateIntervalParser([ 'usermacros' => true, 'lldmacros' => ($data['parent_discoveryid'] != 0) ]); if ($update_interval_parser->parse($data['delay']) == CParser::PARSE_SUCCESS) { $data['delay'] = $update_interval_parser->getDelay(); if ($data['delay'][0] !== '{') { $delay = timeUnitToSeconds($data['delay']); if ($delay == 0 && ($data['type'] == ITEM_TYPE_TRAPPER || $data['type'] == ITEM_TYPE_SNMPTRAP || $data['type'] == ITEM_TYPE_DEPENDENT || ($data['type'] == ITEM_TYPE_ZABBIX_ACTIVE && strncmp($data['key'], 'mqtt.get', 8) == 0))) { $data['delay'] = ZBX_LLD_RULE_DELAY_DEFAULT; } } foreach ($update_interval_parser->getIntervals() as $interval) { if ($interval['type'] == ITEM_DELAY_FLEXIBLE) { $data['delay_flex'][] = [ 'delay' => $interval['update_interval'], 'period' => $interval['time_period'], 'type' => ITEM_DELAY_FLEXIBLE ]; } else { $data['delay_flex'][] = [ 'schedule' => $interval['interval'], 'type' => ITEM_DELAY_SCHEDULING ]; } } } else { $data['delay'] = ZBX_LLD_RULE_DELAY_DEFAULT; } $data['history'] = $data['item']['history']; $data['status'] = $data['item']['status']; $data['trends'] = $data['item']['trends']; } } if (!$data['delay_flex']) { $data['delay_flex'][] = ['delay' => '', 'period' => '', 'type' => ITEM_DELAY_FLEXIBLE]; } // interfaces $data['interfaces'] = API::HostInterface()->get([ 'hostids' => $data['hostid'], 'output' => API_OUTPUT_EXTEND ]); // Sort interfaces to be listed starting with one selected as 'main'. CArrayHelper::sort($data['interfaces'], [ ['field' => 'main', 'order' => ZBX_SORT_DOWN], ['field' => 'interfaceid','order' => ZBX_SORT_UP] ]); unset($data['valuemapid']); // unset ssh auth fields if ($data['type'] != ITEM_TYPE_SSH) { $data['authtype'] = ITEM_AUTHTYPE_PASSWORD; $data['publickey'] = ''; $data['privatekey'] = ''; } if ($data['type'] != ITEM_TYPE_DEPENDENT) { $data['master_itemid'] = 0; } return $data; } /** * Get list of item pre-processing data and return a prepared HTML object. * * @param array $preprocessing Array of item pre-processing steps. * @param string $preprocessing[]['type'] Pre-processing step type. * @param array $preprocessing[]['params'] Additional parameters used by pre-processing. * @param string $preprocessing[]['error_handler'] Action type used in case of pre-processing step failure. * @param string $preprocessing[]['error_handler_params'] Error handler parameters. * @param bool $readonly True if fields should be read only. * @param array $types Supported pre-processing types. * * @return CList */ function getItemPreprocessing(array $preprocessing, $readonly, array $types) { $script_maxlength = DB::getFieldLength('item_preproc', 'params'); $preprocessing_list = (new CList()) ->setId('preprocessing') ->addClass('preprocessing-list') ->addClass(ZBX_STYLE_LIST_NUMBERED) ->setAttribute('data-readonly', $readonly) ->addItem( (new CListItem([ (new CDiv(_('Name')))->addClass('step-name'), (new CDiv(_('Parameters')))->addClass('step-parameters'), (new CDiv(_('Custom on fail'))) ->addClass('step-on-fail') ->setTitle(_('Custom on fail')), (new CDiv(_('Actions')))->addClass('step-action') ])) ->addClass('preprocessing-list-head') ->addStyle(!$preprocessing ? 'display: none;' : null) ); $i = 0; foreach ($preprocessing as $step) { // Create a select with preprocessing types. $preproc_types_select = (new CSelect('preprocessing['.$i.'][type]')) ->setId('preprocessing_'.$i.'_type') ->setValue($step['type']) ->setReadonly($readonly) ->setWidthAuto(); foreach (get_preprocessing_types(null, true, $types) as $group) { $opt_group = new CSelectOptionGroup($group['label']); foreach ($group['types'] as $type => $label) { $opt_group->addOption((new CSelectOption($type, $label))->setDisabled( $step['type'] != ZBX_PREPROC_VALIDATE_NOT_SUPPORTED && $type == $step['type'] )); } $preproc_types_select->addOptionGroup($opt_group); } // Depending on preprocessing type, display corresponding params field and placeholders. $params = ''; if ($step['type'] != ZBX_PREPROC_SNMP_WALK_TO_JSON) { // Create a primary param text box, so it can be hidden if necessary. $step_param_0_value = array_key_exists('params', $step) ? $step['params'][0] : ''; $step_param_0 = (new CTextBox('preprocessing['.$i.'][params][0]', $step_param_0_value)) ->setReadonly($readonly); // Create a secondary param text box, so it can be hidden if necessary. $step_param_1_value = (array_key_exists('params', $step) && array_key_exists(1, $step['params'])) ? $step['params'][1] : ''; $step_param_1 = (new CTextBox('preprocessing['.$i.'][params][1]', $step_param_1_value)) ->setReadonly($readonly); } // Add corresponding placeholders and show or hide text boxes. switch ($step['type']) { case ZBX_PREPROC_MULTIPLIER: $params = $step_param_0 ->setAttribute('placeholder', _('number')) ->setWidth(ZBX_TEXTAREA_NUMERIC_BIG_WIDTH); break; case ZBX_PREPROC_RTRIM: case ZBX_PREPROC_LTRIM: case ZBX_PREPROC_TRIM: $params = $step_param_0 ->setAttribute('placeholder', _('list of characters')) ->setWidth(ZBX_TEXTAREA_SMALL_WIDTH); break; case ZBX_PREPROC_XPATH: case ZBX_PREPROC_ERROR_FIELD_XML: $params = $step_param_0->setAttribute('placeholder', _('XPath')); break; case ZBX_PREPROC_JSONPATH: case ZBX_PREPROC_ERROR_FIELD_JSON: $params = $step_param_0->setAttribute('placeholder', _('$.path.to.node')); break; case ZBX_PREPROC_REGSUB: case ZBX_PREPROC_ERROR_FIELD_REGEX: $params = [ $step_param_0->setAttribute('placeholder', _('pattern')), $step_param_1->setAttribute('placeholder', _('output')) ]; break; case ZBX_PREPROC_VALIDATE_RANGE: $params = [ $step_param_0->setAttribute('placeholder', _('min')), $step_param_1->setAttribute('placeholder', _('max')) ]; break; case ZBX_PREPROC_VALIDATE_REGEX: case ZBX_PREPROC_VALIDATE_NOT_REGEX: $params = $step_param_0->setAttribute('placeholder', _('pattern')); break; case ZBX_PREPROC_THROTTLE_TIMED_VALUE: $params = $step_param_0 ->setAttribute('placeholder', _('seconds')) ->setWidth(ZBX_TEXTAREA_NUMERIC_BIG_WIDTH); break; case ZBX_PREPROC_SCRIPT: $params = new CMultilineInput($step_param_0->getName(), $step_param_0_value, [ 'title' => _('JavaScript'), 'placeholder' => _('script'), 'placeholder_textarea' => 'return value', 'label_before' => 'function (value) {', 'label_after' => '}', 'grow' => 'auto', 'rows' => 0, 'maxlength' => $script_maxlength, 'readonly' => $readonly ]); break; case ZBX_PREPROC_PROMETHEUS_PATTERN: $step_param_2_value = (array_key_exists('params', $step) && array_key_exists(2, $step['params'])) ? $step['params'][2] : ''; if ($step_param_1_value === ZBX_PREPROC_PROMETHEUS_FUNCTION) { $step_param_1_value = $step_param_2_value; $step_param_2_value = ''; } $params = [ $step_param_0->setAttribute('placeholder', _('{