예제 #1
0
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));
}
예제 #2
0
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;
}