diff --git a/frontends/php/events.php b/frontends/php/events.php index 54dd796..c9198bb 100644 --- a/frontends/php/events.php +++ b/frontends/php/events.php @@ -70,6 +70,11 @@ $fields = array( 'csv_export'=> array(T_ZBX_STR, O_OPT, P_SYS, null, null), 'filter_rst'=> array(T_ZBX_STR, O_OPT, P_SYS, null, null), 'filter_set'=> array(T_ZBX_STR, O_OPT, P_SYS, null, null), + 'txt_select'=> array(T_ZBX_STR, O_OPT, null, null, null), + // Severity filters + 'show_triggers'=> array(T_ZBX_INT, O_OPT, P_SYS, IN(array(0,1,2,3)), null), + 'ack_status'=> array(T_ZBX_INT, O_OPT, P_SYS, IN(array(0,1,2)), null), + 'show_severity'=> array(T_ZBX_INT, O_OPT, P_SYS, IN(array(-1,0,1,2,3,4,5)), null), // ajax 'filterState' => array(T_ZBX_INT, O_OPT, P_ACT, null, null), 'favobj'=> array(T_ZBX_STR, O_OPT, P_ACT, null, null), @@ -117,14 +122,26 @@ $source = getRequest('source', CProfile::get('web.events.source', EVENT_SOURCE_T */ if (hasRequest('filter_set')) { CProfile::update('web.events.filter.triggerid', getRequest('triggerid', 0), PROFILE_TYPE_ID); + CProfile::update('web.events.filter.txt_select', getRequest('txt_select', ''), PROFILE_TYPE_STR); + CProfile::update('web.events.filter.show_triggers',getRequest('show_triggers', EVENTS_SHOW_TRIGGERS_ALL), PROFILE_TYPE_INT); + CProfile::update('web.events.filter.ack_status',getRequest('ack_status', EVENTS_SHOW_ALL), PROFILE_TYPE_INT); + CProfile::update('web.events.filter.show_severity',getRequest('show_severity', TRIGGER_SEVERITY_NOT_CLASSIFIED), PROFILE_TYPE_INT); } elseif (hasRequest('filter_rst')) { DBStart(); CProfile::delete('web.events.filter.triggerid'); + CProfile::delete('web.events.filter.txt_select'); + CProfile::delete('web.events.filter.show_triggers'); + CProfile::delete('web.events.filter.ack_status'); + CProfile::delete('web.events.filter.show_severity'); DBend(); } $triggerId = CProfile::get('web.events.filter.triggerid', 0); +$txtSelect = CProfile::get('web.events.filter.txt_select', ''); +$showTriggers = CProfile::get('web.events.filter.show_triggers', EVENTS_SHOW_TRIGGERS_ALL); +$ackStatus = CProfile::get('web.events.filter.ack_status', EVENTS_SHOW_ALL); +$showSeverity = CProfile::get('web.events.filter.show_severity', TRIGGER_SEVERITY_NOT_CLASSIFIED); CProfile::update('web.events.source', $source, PROFILE_TYPE_INT); @@ -392,6 +409,35 @@ else { ), 'form_row_r') ))); + $triggerStatusComboBox = new CComboBox('show_triggers', $showTriggers); + $triggerStatusComboBox->addItem(EVENTS_SHOW_TRIGGERS_ALL, _('Any')); + $triggerStatusComboBox->addItem(EVENTS_SHOW_TRIGGERS_OK, _('Ok')); + $triggerStatusComboBox->additem(EVENTS_SHOW_TRIGGERS_PROBLEM, _('Problem')); + $filterForm->addRow(_('Triggers status'), $triggerStatusComboBox); + + $config = select_config(); + if($config['event_ack_enable']){ + $ackStatusComboBox = new CComboBox('ack_status', $ackStatus); + $ackStatusComboBox->addItem(EVENTS_SHOW_ALL, _('Any')); + $ackStatusComboBox->additem(EVENTS_SHOW_ZBX_ACK, _('Yes')); + $ackStatusComboBox->additem(EVENTS_SHOW_ZBX_UNACK, _('No')); + $filterForm->addRow(_('Acknowledge status'), $ackStatusComboBox); + } + $severityComboBox = new CComboBox('show_severity', $showSeverity); + $severityComboBox->addItems(array( + TRIGGER_SEVERITY_NOT_CLASSIFIED => getSeverityCaption(TRIGGER_SEVERITY_NOT_CLASSIFIED), + TRIGGER_SEVERITY_INFORMATION => getSeverityCaption(TRIGGER_SEVERITY_INFORMATION), + TRIGGER_SEVERITY_WARNING => getSeverityCaption(TRIGGER_SEVERITY_WARNING), + TRIGGER_SEVERITY_AVERAGE => getSeverityCaption(TRIGGER_SEVERITY_AVERAGE), + TRIGGER_SEVERITY_HIGH => getSeverityCaption(TRIGGER_SEVERITY_HIGH), + TRIGGER_SEVERITY_DISASTER => getSeverityCaption(TRIGGER_SEVERITY_DISASTER) + )); + + $filterForm->addRow(_('Minimum trigger severity'), $severityComboBox); + $filterForm->addRow(_('Filter by name'), new CTextBox('txt_select', $txtSelect, 40)); + + $reset = new CButton('filter_rst', _('Reset'), 'javascript: var uri = new Curl(location.href); uri.setArgument("filter_rst",1); location.href = uri.getUrl();'); + $filterForm->addItemToBottomRow(new CSubmit('filter_set', _('Filter'))); $filterForm->addItemToBottomRow(new CSubmit('filter_rst', _('Reset'))); } @@ -667,6 +713,32 @@ else { $triggerOptions['groupids'] = $pageFilter->groupid; } + if($showTriggers == EVENTS_SHOW_TRIGGERS_OK) { + $eventOptions['value'] = array(0, 2); + } + elseif($showTriggers == EVENTS_SHOW_TRIGGERS_PROBLEM) { + $eventOptions['value'] = array(1, 2); + } + + if($ackStatus == EVENTS_SHOW_ZBX_ACK) { + $eventOptions['acknowledged'] = EVENTS_SHOW_ZBX_ACK; + } + elseif($ackStatus == EVENTS_SHOW_ZBX_UNACK) { + $eventOptions['acknowledged'] = EVENTS_SHOW_ZBX_UNACK; + } + + #TODO: Use $config instead + if(isset($showSeverity)) { + # There's no min_severity option as there is for triggers + $eventOptions['severity'] = range($showSeverity, TRIGGER_SEVERITY_DISASTER); + } + + // Trigger description filter string + if(!zbx_empty($txtSelect)){ + $eventOptions['description'] = $txtSelect; + } + $events = API::Event()->get($eventOptions); + $events = array(); while (true) { @@ -718,8 +790,13 @@ else { // get paging $paging = getPagingLine($events, ZBX_SORT_DOWN); + // Remove value filtering and query again + // This allows for a correct counter and correct status filtering results + unset($eventOptions['value']); + $events = API::Event()->get($eventOptions); + // query event with extend data - $events = API::Event()->get(array( + $eventOptions = array( 'source' => EVENT_SOURCE_TRIGGERS, 'object' => EVENT_OBJECT_TRIGGER, 'eventids' => zbx_objectValues($events, 'eventid'), @@ -728,7 +805,34 @@ else { 'sortfield' => array('clock', 'eventid'), 'sortorder' => ZBX_SORT_DOWN, 'nopermissions' => true - )); + ); + + if($showTriggers == EVENTS_SHOW_TRIGGERS_OK) { + $eventOptions['value'] = array(0, 2); + } + elseif($showTriggers == EVENTS_SHOW_TRIGGERS_PROBLEM) { + $eventOptions['value'] = array(1, 2); + } + + if($ackStatus == EVENTS_SHOW_ZBX_ACK) { + $eventOptions['acknowledged'] = EVENTS_SHOW_ZBX_ACK; + } + elseif($ackStatus == EVENTS_SHOW_ZBX_UNACK) { + $eventOptions['acknowledged'] = EVENTS_SHOW_ZBX_UNACK; + } + + #TODO: Use $config instead + if(isset($showSeverity)) { + # There's no min_severity option as there is for triggers + $eventOptions['severity'] = range($showSeverity, TRIGGER_SEVERITY_DISASTER); + } + + // Trigger description filter string + if(!zbx_empty($txtSelect)){ + $eventOptions['description'] = $txtSelect; + } + + $events = API::Event()->get($eventOptions); if (!$csvExport) { $csvDisabled = zbx_empty($events); @@ -788,6 +901,12 @@ else { ? zbx_date2age($event['clock'], $nextEvent['clock']) : zbx_date2age($event['clock']); + // Only abandon an event after calculating the duration + // if it doesn't match the status filter + if (!($showTriggers == $event['value'] || $showTriggers == EVENTS_SHOW_TRIGGERS_ALL)) { + continue; + } + // action $action = isset($actions[$event['eventid']]) ? $actions[$event['eventid']] : ' - '; diff --git a/frontends/php/include/classes/api/services/CEvent.php b/frontends/php/include/classes/api/services/CEvent.php index e44cc7c..1f2a05c 100644 --- a/frontends/php/include/classes/api/services/CEvent.php +++ b/frontends/php/include/classes/api/services/CEvent.php @@ -92,6 +92,7 @@ class CEvent extends CApiService { 'object' => EVENT_OBJECT_TRIGGER, 'source' => EVENT_SOURCE_TRIGGERS, 'acknowledged' => null, + 'severity' => null, 'nopermissions' => null, // filter 'value' => null, @@ -102,6 +103,7 @@ class CEvent extends CApiService { // filter 'filter' => null, 'search' => null, + 'description' => null, 'searchByAny' => null, 'startSearch' => null, 'excludeSearch' => null, @@ -270,6 +272,29 @@ class CEvent extends CApiService { if (!is_null($options['acknowledged'])) { $sqlParts['where'][] = 'e.acknowledged='.($options['acknowledged'] ? 1 : 0); } + + // severity + if (!is_null($options['severity'])) { + zbx_value2array($options['severity']); + $sqlParts['from']['triggers'] = 'triggers t'; + $sqlParts['where'][] = 'e.objectid=t.triggerid'; + $sqlParts['where'][] = dbConditionInt('t.priority', $options['severity']); + } + + // description + if (!is_null($options['description'])) { + $sqlParts['from']['triggers'] = 'triggers t'; + $sqlParts['where'][] = 'e.objectid=t.triggerid'; + $descriptionSearch = array( + 'search' => array( + 'description' => $options['description'], + ), + 'startSearch' => null, + 'searchByAny' => null, + 'excludeSearch' => null + ); + zbx_db_search('triggers t', $descriptionSearch, $sqlParts); + } // time_from if (!is_null($options['time_from'])) { diff --git a/frontends/php/include/defines.inc.php b/frontends/php/include/defines.inc.php index ea74a91..b69c94c 100644 --- a/frontends/php/include/defines.inc.php +++ b/frontends/php/include/defines.inc.php @@ -89,6 +89,16 @@ define('EVENTS_OPTION_NOEVENT', 1); define('EVENTS_OPTION_ALL', 2); define('EVENTS_OPTION_NOT_ACK', 3); +// Event tracking +define('EVENTS_SHOW_ZBX_UNACK', 0); +define('EVENTS_SHOW_ZBX_ACK', 1); +define('EVENTS_SHOW_ALL', 2); + +define('EVENTS_SHOW_TRIGGERS_OK', 0); +define('EVENTS_SHOW_TRIGGERS_PROBLEM', 1); +define('EVENTS_SHOW_TRIGGERS_UNKNOWN', 2); +define('EVENTS_SHOW_TRIGGERS_ALL', 3); + define('ZBX_FONT_NAME', 'graphfont'); define('ZBX_AUTH_INTERNAL', 0);