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