function make_system_status($filter) { $ackParams = array(); if (!empty($filter['screenid'])) { $ackParams['screenid'] = $filter['screenid']; } $table = new CTableInfo(_('No host groups found.')); $table->setHeader(array(is_show_all_nodes() ? _('Node') : null, _('Host group'), is_null($filter['severity']) || isset($filter['severity'][TRIGGER_SEVERITY_DISASTER]) ? getSeverityCaption(TRIGGER_SEVERITY_DISASTER) : null, is_null($filter['severity']) || isset($filter['severity'][TRIGGER_SEVERITY_HIGH]) ? getSeverityCaption(TRIGGER_SEVERITY_HIGH) : null, is_null($filter['severity']) || isset($filter['severity'][TRIGGER_SEVERITY_AVERAGE]) ? getSeverityCaption(TRIGGER_SEVERITY_AVERAGE) : null, is_null($filter['severity']) || isset($filter['severity'][TRIGGER_SEVERITY_WARNING]) ? getSeverityCaption(TRIGGER_SEVERITY_WARNING) : null, is_null($filter['severity']) || isset($filter['severity'][TRIGGER_SEVERITY_INFORMATION]) ? getSeverityCaption(TRIGGER_SEVERITY_INFORMATION) : null, is_null($filter['severity']) || isset($filter['severity'][TRIGGER_SEVERITY_NOT_CLASSIFIED]) ? getSeverityCaption(TRIGGER_SEVERITY_NOT_CLASSIFIED) : null)); // get host groups $groups = API::HostGroup()->get(array('groupids' => $filter['groupids'], 'hostids' => isset($filter['hostids']) ? $filter['hostids'] : null, 'nodeids' => get_current_nodeid(), 'monitored_hosts' => true, 'output' => array('groupid', 'name'), 'preservekeys' => true)); foreach ($groups as &$group) { $group['nodename'] = get_node_name_by_elid($group['groupid']); } unset($group); CArrayHelper::sort($groups, array(array('field' => 'nodename', 'order' => ZBX_SORT_UP), array('field' => 'name', 'order' => ZBX_SORT_UP))); $groupIds = array(); foreach ($groups as $group) { $groupIds[$group['groupid']] = $group['groupid']; $group['tab_priority'] = array(TRIGGER_SEVERITY_DISASTER => array('count' => 0, 'triggers' => array(), 'count_unack' => 0, 'triggers_unack' => array()), TRIGGER_SEVERITY_HIGH => array('count' => 0, 'triggers' => array(), 'count_unack' => 0, 'triggers_unack' => array()), TRIGGER_SEVERITY_AVERAGE => array('count' => 0, 'triggers' => array(), 'count_unack' => 0, 'triggers_unack' => array()), TRIGGER_SEVERITY_WARNING => array('count' => 0, 'triggers' => array(), 'count_unack' => 0, 'triggers_unack' => array()), TRIGGER_SEVERITY_INFORMATION => array('count' => 0, 'triggers' => array(), 'count_unack' => 0, 'triggers_unack' => array()), TRIGGER_SEVERITY_NOT_CLASSIFIED => array('count' => 0, 'triggers' => array(), 'count_unack' => 0, 'triggers_unack' => array())); $groups[$group['groupid']] = $group; } // get triggers $triggers = API::Trigger()->get(array('nodeids' => get_current_nodeid(), 'groupids' => $groupIds, 'hostids' => isset($filter['hostids']) ? $filter['hostids'] : null, 'monitored' => true, 'maintenance' => $filter['maintenance'], 'skipDependent' => true, 'withLastEventUnacknowledged' => $filter['extAck'] == EXTACK_OPTION_UNACK ? true : null, 'selectLastEvent' => API_OUTPUT_EXTEND, 'expandDescription' => true, 'filter' => array('priority' => $filter['severity'], 'value' => TRIGGER_VALUE_TRUE), 'sortfield' => 'lastchange', 'sortorder' => ZBX_SORT_DOWN, 'output' => API_OUTPUT_EXTEND, 'selectHosts' => array('name'), 'preservekeys' => true)); // get acknowledges $eventIds = array(); foreach ($triggers as $tnum => $trigger) { if (!empty($trigger['lastEvent'])) { $eventIds[$trigger['lastEvent']['eventid']] = $trigger['lastEvent']['eventid']; } $triggers[$tnum]['event'] = $trigger['lastEvent']; unset($triggers[$tnum]['lastEvent']); } if ($eventIds) { $eventAcknowledges = API::Event()->get(array('eventids' => $eventIds, 'select_acknowledges' => API_OUTPUT_EXTEND, 'preservekeys' => true)); } // actions $actions = getEventActionsStatus($eventIds); // triggers foreach ($triggers as $trigger) { // event if (empty($trigger['event'])) { $trigger['event'] = array('acknowledged' => false, 'clock' => $trigger['lastchange'], 'value' => $trigger['value']); } else { $trigger['event']['acknowledges'] = isset($eventAcknowledges[$trigger['event']['eventid']]) ? $eventAcknowledges[$trigger['event']['eventid']]['acknowledges'] : 0; } // groups foreach ($trigger['groups'] as $group) { if (!isset($groups[$group['groupid']])) { continue; } if (in_array($filter['extAck'], array(EXTACK_OPTION_ALL, EXTACK_OPTION_BOTH))) { $groups[$group['groupid']]['tab_priority'][$trigger['priority']]['count']++; if ($groups[$group['groupid']]['tab_priority'][$trigger['priority']]['count'] < 30) { $groups[$group['groupid']]['tab_priority'][$trigger['priority']]['triggers'][] = $trigger; } } if (in_array($filter['extAck'], array(EXTACK_OPTION_UNACK, EXTACK_OPTION_BOTH)) && isset($trigger['event']) && !$trigger['event']['acknowledged']) { $groups[$group['groupid']]['tab_priority'][$trigger['priority']]['count_unack']++; if ($groups[$group['groupid']]['tab_priority'][$trigger['priority']]['count_unack'] < 30) { $groups[$group['groupid']]['tab_priority'][$trigger['priority']]['triggers_unack'][] = $trigger; } } } } unset($triggers); foreach ($groups as $group) { $groupRow = new CRow(); if (is_show_all_nodes()) { $groupRow->addItem($group['nodename']); } $name = new CLink($group['name'], 'tr_status.php?groupid=' . $group['groupid'] . '&hostid=0&show_triggers=' . TRIGGERS_OPTION_ONLYTRUE); $groupRow->addItem($name); foreach ($group['tab_priority'] as $severity => $data) { if (!is_null($filter['severity']) && !isset($filter['severity'][$severity])) { continue; } $allTriggersNum = $data['count']; if ($allTriggersNum) { $allTriggersNum = new CSpan($allTriggersNum, 'pointer'); $allTriggersNum->setHint(makeTriggersPopup($data['triggers'], $ackParams, $actions)); } $unackTriggersNum = $data['count_unack']; if ($unackTriggersNum) { $unackTriggersNum = new CSpan($unackTriggersNum, 'pointer red bold'); $unackTriggersNum->setHint(makeTriggersPopup($data['triggers_unack'], $ackParams, $actions)); } switch ($filter['extAck']) { case EXTACK_OPTION_ALL: $groupRow->addItem(getSeverityCell($severity, $allTriggersNum, !$allTriggersNum)); break; case EXTACK_OPTION_UNACK: $groupRow->addItem(getSeverityCell($severity, $unackTriggersNum, !$unackTriggersNum)); break; case EXTACK_OPTION_BOTH: if ($unackTriggersNum) { $span = new CSpan(SPACE . _('of') . SPACE); $unackTriggersNum = new CSpan($unackTriggersNum); } else { $span = null; $unackTriggersNum = null; } $groupRow->addItem(getSeverityCell($severity, array($unackTriggersNum, $span, $allTriggersNum), !$allTriggersNum)); break; } } $table->addRow($groupRow); } $script = new CJSScript(get_js("jQuery('#hat_syssum_footer').html('" . _s('Updated: %s', zbx_date2str(_('H:i:s'))) . "')")); return new CDiv(array($table, $script)); }
$triggersOptions = array('triggerids' => zbx_objectValues($events, 'objectid'), 'selectHosts' => array('hostid'), 'selectItems' => array('name', 'value_type', 'key_'), 'output' => array('description', 'expression', 'priority')); $triggers = API::Trigger()->get($triggersOptions); $triggers = zbx_toHash($triggers, 'triggerid'); // fetch hosts $hosts = array(); foreach ($triggers as $trigger) { $hosts[] = reset($trigger['hosts']); } $hostids = zbx_objectValues($hosts, 'hostid'); $hosts = API::Host()->get(array('output' => array('name', 'hostid'), 'hostids' => $hostids, 'selectScreens' => API_OUTPUT_COUNT, 'selectInventory' => array('hostid'), 'preservekeys' => true)); // fetch scripts for the host JS menu if ($_REQUEST['hostid'] == 0) { $hostScripts = API::Script()->getScriptsByHosts($hostids); } // actions $actions = getEventActionsStatus(zbx_objectValues($events, 'eventid')); // events foreach ($events as $enum => $event) { $trigger = $triggers[$event['objectid']]; $host = reset($trigger['hosts']); $host = $hosts[$host['hostid']]; $items = array(); foreach ($trigger['items'] as $item) { $i = array(); $i['itemid'] = $item['itemid']; $i['value_type'] = $item['value_type']; // ZBX-3059: So it would be possible to show different caption for history for chars and numbers (KB) $i['action'] = str_in_array($item['value_type'], array(ITEM_VALUE_TYPE_FLOAT, ITEM_VALUE_TYPE_UINT64)) ? 'showgraph' : 'showvalues'; $i['name'] = itemName($item); $items[] = $i; }