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)); }
function make_system_status($filter, $backurl) { $config = select_config(); $table = new CTableInfo(); // set trigger severities as table header starting from highest severity $header = []; for ($severity = TRIGGER_SEVERITY_NOT_CLASSIFIED; $severity < TRIGGER_SEVERITY_COUNT; $severity++) { $header[] = $filter['severity'] === null || isset($filter['severity'][$severity]) ? getSeverityName($severity, $config) : null; } krsort($header); array_unshift($header, _('Host group')); $table->setHeader($header); // get host groups $groups = API::HostGroup()->get(['groupids' => $filter['groupids'], 'hostids' => isset($filter['hostids']) ? $filter['hostids'] : null, 'monitored_hosts' => true, 'output' => ['groupid', 'name'], 'preservekeys' => true]); CArrayHelper::sort($groups, [['field' => 'name', 'order' => ZBX_SORT_UP]]); $groupIds = []; foreach ($groups as $group) { $groupIds[$group['groupid']] = $group['groupid']; $group['tab_priority'] = [TRIGGER_SEVERITY_DISASTER => ['count' => 0, 'triggers' => [], 'count_unack' => 0, 'triggers_unack' => []], TRIGGER_SEVERITY_HIGH => ['count' => 0, 'triggers' => [], 'count_unack' => 0, 'triggers_unack' => []], TRIGGER_SEVERITY_AVERAGE => ['count' => 0, 'triggers' => [], 'count_unack' => 0, 'triggers_unack' => []], TRIGGER_SEVERITY_WARNING => ['count' => 0, 'triggers' => [], 'count_unack' => 0, 'triggers_unack' => []], TRIGGER_SEVERITY_INFORMATION => ['count' => 0, 'triggers' => [], 'count_unack' => 0, 'triggers_unack' => []], TRIGGER_SEVERITY_NOT_CLASSIFIED => ['count' => 0, 'triggers' => [], 'count_unack' => 0, 'triggers_unack' => []]]; $groups[$group['groupid']] = $group; } // get triggers $triggers = API::Trigger()->get(['output' => ['triggerid', 'priority', 'state', 'description', 'error', 'value', 'lastchange', 'expression'], 'selectGroups' => ['groupid'], 'selectHosts' => ['name'], 'selectLastEvent' => ['eventid', 'acknowledged', 'objectid', 'clock', 'ns'], 'withLastEventUnacknowledged' => $filter['extAck'] == EXTACK_OPTION_UNACK ? true : null, 'skipDependent' => true, 'groupids' => $groupIds, 'hostids' => isset($filter['hostids']) ? $filter['hostids'] : null, 'monitored' => true, 'maintenance' => $filter['maintenance'], 'search' => $filter['trigger_name'] !== '' ? ['description' => $filter['trigger_name']] : null, 'filter' => ['priority' => $filter['severity'], 'value' => TRIGGER_VALUE_TRUE], 'sortfield' => 'lastchange', 'sortorder' => ZBX_SORT_DOWN, 'preservekeys' => true]); $eventIds = []; foreach ($triggers as $triggerId => $trigger) { if ($trigger['lastEvent']) { $eventIds[$trigger['lastEvent']['eventid']] = $trigger['lastEvent']['eventid']; } $triggers[$triggerId]['event'] = $trigger['lastEvent']; unset($triggers[$triggerId]['lastEvent']); } // get acknowledges if ($eventIds) { $eventAcknowledges = API::Event()->get(['output' => ['eventid'], 'eventids' => $eventIds, 'select_acknowledges' => ['eventid', 'clock', 'message', 'alias', 'name', 'surname'], 'preservekeys' => true]); } // actions $actions = makeEventsActions($eventIds); // triggers foreach ($triggers as $trigger) { // event if ($trigger['event']) { $trigger['event']['acknowledges'] = isset($eventAcknowledges[$trigger['event']['eventid']]) ? $eventAcknowledges[$trigger['event']['eventid']]['acknowledges'] : 0; } else { $trigger['event'] = ['acknowledged' => false, 'clock' => $trigger['lastchange'], 'ns' => '999999999', 'value' => $trigger['value']]; } // groups foreach ($trigger['groups'] as $group) { if (!isset($groups[$group['groupid']])) { continue; } if (in_array($filter['extAck'], [EXTACK_OPTION_ALL, EXTACK_OPTION_BOTH])) { if ($groups[$group['groupid']]['tab_priority'][$trigger['priority']]['count'] < ZBX_WIDGET_ROWS) { $groups[$group['groupid']]['tab_priority'][$trigger['priority']]['triggers'][] = $trigger; } $groups[$group['groupid']]['tab_priority'][$trigger['priority']]['count']++; } if (in_array($filter['extAck'], [EXTACK_OPTION_UNACK, EXTACK_OPTION_BOTH]) && isset($trigger['event']) && !$trigger['event']['acknowledged']) { if ($groups[$group['groupid']]['tab_priority'][$trigger['priority']]['count_unack'] < ZBX_WIDGET_ROWS) { $groups[$group['groupid']]['tab_priority'][$trigger['priority']]['triggers_unack'][] = $trigger; } $groups[$group['groupid']]['tab_priority'][$trigger['priority']]['count_unack']++; } } } unset($triggers); foreach ($groups as $group) { $groupRow = new CRow(); $name = new CLink($group['name'], 'tr_status.php?filter_set=1&groupid=' . $group['groupid'] . '&hostid=0' . '&show_triggers=' . TRIGGERS_OPTION_RECENT_PROBLEM); $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))->addClass(ZBX_STYLE_LINK_ACTION)->setHint(makeTriggersPopup($data['triggers'], $backurl, $actions, $config)); } $unackTriggersNum = $data['count_unack']; if ($unackTriggersNum) { $unackTriggersNum = (new CSpan($unackTriggersNum))->addClass(ZBX_STYLE_LINK_ACTION)->setHint(makeTriggersPopup($data['triggers_unack'], $backurl, $actions, $config)); } switch ($filter['extAck']) { case EXTACK_OPTION_ALL: $groupRow->addItem(getSeverityCell($severity, $config, $allTriggersNum, $data['count'] == 0)); break; case EXTACK_OPTION_UNACK: $groupRow->addItem(getSeverityCell($severity, $config, $unackTriggersNum, $data['count_unack'] == 0)); break; case EXTACK_OPTION_BOTH: if ($data['count_unack'] != 0) { $groupRow->addItem(getSeverityCell($severity, $config, [$unackTriggersNum, ' ' . _('of') . ' ', $allTriggersNum])); } else { $groupRow->addItem(getSeverityCell($severity, $config, $allTriggersNum, $data['count'] == 0)); } break; } } $table->addRow($groupRow); } return $table; }