$hostIds = array_keys($hosts); $applications = null; // if an application filter is set, fetch the applications and then use them to filter items if ($filter['application'] !== '') { $applications = API::Application()->get(array('output' => API_OUTPUT_EXTEND, 'hostids' => $hostIds, 'search' => array('name' => $filter['application']), 'preservekeys' => true)); } $items = API::Item()->get(array('hostids' => array_keys($hosts), 'output' => array('itemid', 'name', 'type', 'value_type', 'units', 'hostid', 'state', 'valuemapid', 'status', 'error', 'trends', 'history', 'delay', 'key_', 'flags'), 'selectApplications' => array('applicationid'), 'selectItemDiscovery' => array('ts_delete'), 'applicationids' => $applications !== null ? zbx_objectValues($applications, 'applicationid') : null, 'webitems' => true, 'filter' => array('status' => array(ITEM_STATUS_ACTIVE)), 'preservekeys' => true)); // if the applications haven't been loaded when filtering, load them based on the retrieved items to avoid // fetching applications from hosts that may not be displayed if ($applications === null) { $applications = API::Application()->get(array('output' => API_OUTPUT_EXTEND, 'hostids' => array_keys(array_flip(zbx_objectValues($items, 'hostid'))), 'search' => array('name' => $filter['application']), 'preservekeys' => true)); } } if ($items) { // macros $items = CMacrosResolverHelper::resolveItemKeys($items); $items = CMacrosResolverHelper::resolveItemNames($items); // filter items by name foreach ($items as $key => $item) { if ($filter['select'] !== '') { $haystack = mb_strtolower($item['name_expanded']); $needle = mb_strtolower($filter['select']); if (mb_strpos($haystack, $needle) === false) { unset($items[$key]); } } } if ($items) { // get history $history = Manager::History()->getLast($items, 2, ZBX_HISTORY_PERIOD); // filter items without history
function explode_exp($expressionCompressed, $html = false, $resolveMacro = false, $sourceHost = null, $destinationHost = null) { $expressionExpanded = $html ? array() : ''; $trigger = array(); for ($i = 0, $state = '', $max = zbx_strlen($expressionCompressed); $i < $max; $i++) { if ($expressionCompressed[$i] == '{') { if ($expressionCompressed[$i + 1] == '$') { $state = 'USERMACRO'; $userMacro = ''; } elseif ($expressionCompressed[$i + 1] == '#') { $state = 'LLDMACRO'; $lldMacro = ''; } else { $state = 'FUNCTIONID'; $functionId = ''; continue; } } elseif ($expressionCompressed[$i] == '}') { if ($state == 'USERMACRO') { $state = ''; $userMacro .= '}'; if ($resolveMacro) { $functionData['expression'] = $userMacro; $userMacro = CMacrosResolverHelper::resolveTriggerExpressionUserMacro($functionData); } if ($html) { $expressionExpanded[] = $userMacro; } else { $expressionExpanded .= $userMacro; } continue; } elseif ($state == 'LLDMACRO') { $state = ''; $lldMacro .= '}'; if ($html) { $expressionExpanded[] = $lldMacro; } else { $expressionExpanded .= $lldMacro; } continue; } elseif ($functionId == 'TRIGGER.VALUE') { $state = ''; if ($html) { $expressionExpanded[] = '{' . $functionId . '}'; } else { $expressionExpanded .= '{' . $functionId . '}'; } continue; } $state = ''; $error = true; if (is_numeric($functionId)) { $functionData = DBfetch(DBselect('SELECT h.host,h.hostid,i.itemid,i.key_,f.function,f.triggerid,f.parameter,i.itemid,i.status,i.type,i.flags' . ' FROM items i,functions f,hosts h' . ' WHERE f.functionid=' . zbx_dbstr($functionId) . ' AND i.itemid=f.itemid' . ' AND h.hostid=i.hostid')); if ($functionData) { $error = false; if ($resolveMacro) { $trigger = $functionData; // expand macros in item key $items = CMacrosResolverHelper::resolveItemKeys(array($functionData)); $item = reset($items); $functionData['key_'] = $item['key_expanded']; // expand macros in function parameter $functionParameters = CMacrosResolverHelper::resolveFunctionParameters(array($functionData)); $functionParameter = reset($functionParameters); $functionData['parameter'] = $functionParameter['parameter_expanded']; } if ($sourceHost !== null && $destinationHost !== null && $sourceHost === $functionData['host']) { $functionData['host'] = $destinationHost; } if ($html) { if ($functionData['status'] == ITEM_STATUS_DISABLED) { $style = 'disabled'; } elseif ($functionData['status'] == ITEM_STATUS_ACTIVE) { $style = 'enabled'; } else { $style = 'unknown'; } if ($functionData['flags'] == ZBX_FLAG_DISCOVERY_CREATED || $functionData['type'] == ITEM_TYPE_HTTPTEST) { $link = new CSpan($functionData['host'] . ':' . $functionData['key_'], $style); } elseif ($functionData['flags'] == ZBX_FLAG_DISCOVERY_PROTOTYPE) { $link = new CLink($functionData['host'] . ':' . $functionData['key_'], 'disc_prototypes.php?form=update&itemid=' . $functionData['itemid'] . '&parent_discoveryid=' . $trigger['discoveryRuleid'] . '&switch_node=' . id2nodeid($functionData['itemid']), $style); } else { $link = new CLink($functionData['host'] . ':' . $functionData['key_'], 'items.php?form=update&itemid=' . $functionData['itemid'] . '&switch_node=' . id2nodeid($functionData['itemid']), $style); } $expressionExpanded[] = array('{', $link, '.', bold($functionData['function'] . '('), $functionData['parameter'], bold(')'), '}'); } else { $expressionExpanded .= '{' . $functionData['host'] . ':' . $functionData['key_'] . '.' . $functionData['function'] . '(' . $functionData['parameter'] . ')}'; } } } if ($error) { if ($html) { $expressionExpanded[] = new CSpan('*ERROR*', 'on'); } else { $expressionExpanded .= '*ERROR*'; } } continue; } switch ($state) { case 'FUNCTIONID': $functionId .= $expressionCompressed[$i]; break; case 'USERMACRO': $userMacro .= $expressionCompressed[$i]; break; case 'LLDMACRO': $lldMacro .= $expressionCompressed[$i]; break; default: if ($html) { $expressionExpanded[] = $expressionCompressed[$i]; } else { $expressionExpanded .= $expressionCompressed[$i]; } } } return $expressionExpanded; }