1<?php 2/* 3** Zabbix 4** Copyright (C) 2001-2021 Zabbix SIA 5** 6** This program is free software; you can redistribute it and/or modify 7** it under the terms of the GNU General Public License as published by 8** the Free Software Foundation; either version 2 of the License, or 9** (at your option) any later version. 10** 11** This program is distributed in the hope that it will be useful, 12** but WITHOUT ANY WARRANTY; without even the implied warranty of 13** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14** GNU General Public License for more details. 15** 16** You should have received a copy of the GNU General Public License 17** along with this program; if not, write to the Free Software 18** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 19**/ 20 21 22require_once dirname(__FILE__).'/include/config.inc.php'; 23require_once dirname(__FILE__).'/include/actions.inc.php'; 24require_once dirname(__FILE__).'/include/events.inc.php'; 25require_once dirname(__FILE__).'/include/triggers.inc.php'; 26require_once dirname(__FILE__).'/include/users.inc.php'; 27require_once dirname(__FILE__).'/include/html.inc.php'; 28 29$page['title'] = _('Event details'); 30$page['file'] = 'tr_events.php'; 31$page['type'] = detect_page_type(); 32$page['scripts'] = ['layout.mode.js']; 33 34CView::$has_web_layout_mode = true; 35$page['web_layout_mode'] = CView::getLayoutMode(); 36 37require_once dirname(__FILE__).'/include/page_header.php'; 38 39// VAR TYPE OPTIONAL FLAGS VALIDATION EXCEPTION 40$fields = [ 41 'triggerid' => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, PAGE_TYPE_HTML.'=='.$page['type']], 42 'eventid' => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, PAGE_TYPE_HTML.'=='.$page['type']], 43 // Ajax 44 'widget' => [T_ZBX_STR, O_OPT, P_ACT, IN('"'.WIDGET_HAT_EVENTACTIONS.'","'.WIDGET_HAT_EVENTLIST.'"'), null], 45 'state' => [T_ZBX_INT, O_OPT, P_ACT, IN('0,1'), null] 46]; 47check_fields($fields); 48 49/* 50 * Ajax 51 */ 52if (hasRequest('widget') && hasRequest('state')) { 53 CProfile::update('web.tr_events.hats.'.getRequest('widget').'.state', getRequest('state'), PROFILE_TYPE_INT); 54} 55 56if ($page['type'] == PAGE_TYPE_JS || $page['type'] == PAGE_TYPE_HTML_BLOCK) { 57 require_once dirname(__FILE__).'/include/page_footer.php'; 58 exit; 59} 60 61// triggers 62$triggers = API::Trigger()->get([ 63 'output' => API_OUTPUT_EXTEND, 64 'selectHosts' => API_OUTPUT_EXTEND, 65 'triggerids' => getRequest('triggerid') 66]); 67 68if (!$triggers) { 69 access_deny(); 70} 71 72$trigger = reset($triggers); 73 74$events = API::Event()->get([ 75 'output' => ['eventid', 'r_eventid', 'clock', 'ns', 'objectid', 'name', 'acknowledged', 'severity'], 76 'selectTags' => ['tag', 'value'], 77 'select_acknowledges' => ['clock', 'message', 'action', 'userid', 'old_severity', 'new_severity'], 78 'source' => EVENT_SOURCE_TRIGGERS, 79 'object' => EVENT_OBJECT_TRIGGER, 80 'eventids' => getRequest('eventid'), 81 'objectids' => getRequest('triggerid'), 82 'value' => TRIGGER_VALUE_TRUE 83]); 84 85if (!$events) { 86 access_deny(); 87} 88$event = reset($events); 89 90if ($event['r_eventid'] != 0) { 91 $r_events = API::Event()->get([ 92 'output' => ['correlationid', 'userid'], 93 'source' => EVENT_SOURCE_TRIGGERS, 94 'object' => EVENT_OBJECT_TRIGGER, 95 'eventids' => [$event['r_eventid']], 96 'objectids' => getRequest('triggerid') 97 ]); 98 99 if ($r_events) { 100 $r_event = reset($r_events); 101 102 $event['correlationid'] = $r_event['correlationid']; 103 $event['userid'] = $r_event['userid']; 104 } 105} 106 107$config = select_config(); 108$severity_config = [ 109 'severity_name_0' => $config['severity_name_0'], 110 'severity_name_1' => $config['severity_name_1'], 111 'severity_name_2' => $config['severity_name_2'], 112 'severity_name_3' => $config['severity_name_3'], 113 'severity_name_4' => $config['severity_name_4'], 114 'severity_name_5' => $config['severity_name_5'] 115]; 116$actions = getEventDetailsActions($event); 117$users = API::User()->get([ 118 'output' => ['alias', 'name', 'surname'], 119 'userids' => array_keys($actions['userids']), 120 'preservekeys' => true 121]); 122$mediatypes = API::Mediatype()->get([ 123 'output' => ['maxattempts'], 124 'mediatypeids' => array_keys($actions['mediatypeids']), 125 'preservekeys' => true 126]); 127 128/* 129 * Display 130 */ 131$eventTab = (new CTable()) 132 ->addRow([ 133 new CDiv([ 134 (new CUiWidget(WIDGET_HAT_TRIGGERDETAILS, make_trigger_details($trigger)))->setHeader(_('Trigger details')), 135 (new CUiWidget(WIDGET_HAT_EVENTDETAILS, 136 make_event_details($event, 137 $page['file'].'?triggerid='.getRequest('triggerid').'&eventid='.getRequest('eventid') 138 ) 139 ))->setHeader(_('Event details')) 140 ]), 141 new CDiv([ 142 (new CCollapsibleUiWidget(WIDGET_HAT_EVENTACTIONS, 143 makeEventDetailsActionsTable($actions, $users, $mediatypes, $severity_config) 144 )) 145 ->setExpanded((bool) CProfile::get('web.tr_events.hats.'.WIDGET_HAT_EVENTACTIONS.'.state', true)) 146 ->setHeader(_('Actions'), [], 'tr_events.php'), 147 (new CCollapsibleUiWidget(WIDGET_HAT_EVENTLIST, 148 make_small_eventlist($event, 149 $page['file'].'?triggerid='.getRequest('triggerid').'&eventid='.getRequest('eventid') 150 ) 151 )) 152 ->setExpanded((bool) CProfile::get('web.tr_events.hats.'.WIDGET_HAT_EVENTLIST.'.state', true)) 153 ->setHeader(_('Event list [previous 20]'), [], 'tr_events.php') 154 ]) 155 ]); 156 157$eventWidget = (new CWidget()) 158 ->setTitle(_('Event details')) 159 ->setWebLayoutMode($page['web_layout_mode']) 160 ->setControls((new CTag('nav', true, 161 (new CList()) 162 ->addItem(get_icon('fullscreen')) 163 )) 164 ->setAttribute('aria-label', _('Content controls')) 165 ) 166 ->addItem($eventTab) 167 ->show(); 168 169require_once dirname(__FILE__).'/include/page_footer.php'; 170