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
22/**
23 * Create a table with trigger events and, if defined, trigger description and a clickable URL.
24 *
25 * @param array $data
26 *
27 * @return CDiv
28 */
29function makeEventList(array $data) {
30	// Show trigger description and URL.
31	$div = new CDiv();
32
33	if ($data['trigger']['comments'] !== '') {
34		$div->addItem(
35			(new CDiv())
36				->addItem(zbx_str2links($data['trigger']['comments']))
37				->addClass(ZBX_STYLE_OVERLAY_DESCR)
38				->addStyle('max-width: 500px')
39		);
40	}
41
42	if ($data['trigger']['url'] !== '') {
43		$trigger_url = CHtmlUrlValidator::validate($data['trigger']['url'], false)
44			? $data['trigger']['url']
45			: 'javascript: alert(\''._s('Provided URL "%1$s" is invalid.',
46					zbx_jsvalue($data['trigger']['url'], false, false)).
47				'\');';
48
49		$div->addItem(
50			(new CDiv())
51				->addItem(new CLink(CHtml::encode($data['trigger']['url']), $trigger_url))
52				->addClass(ZBX_STYLE_OVERLAY_DESCR_URL)
53				->addStyle('max-width: 500px')
54		);
55	}
56
57	// sort field indicator
58	$sort_div = (new CSpan())->addClass(ZBX_STYLE_ARROW_DOWN);
59
60	if ($data['show_timeline']) {
61		$header = [
62			(new CColHeader([_('Time'), $sort_div]))->addClass(ZBX_STYLE_RIGHT),
63			(new CColHeader())->addClass(ZBX_STYLE_TIMELINE_TH),
64			(new CColHeader())->addClass(ZBX_STYLE_TIMELINE_TH)
65		];
66	}
67	else {
68		$header = [[_('Time'), $sort_div]];
69	}
70
71	// Show events.
72	$table = (new CTableInfo())
73		->setHeader(array_merge($header, [
74			_('Recovery time'),
75			_('Status'),
76			_('Duration'),
77			_('Ack'),
78			($data['show_tags'] != PROBLEMS_SHOW_TAGS_NONE) ? _('Tags') : null
79		]));
80
81	$today = strtotime('today');
82	$last_clock = 0;
83
84	if ($data['problems'] && $data['show_tags'] != PROBLEMS_SHOW_TAGS_NONE) {
85		$tags = makeTags($data['problems'], true, 'eventid', $data['show_tags'], $data['filter_tags'],
86			$data['tag_name_format'], $data['tag_priority']
87		);
88	}
89
90	$url_details = (new CUrl('tr_events.php'))
91		->setArgument('triggerid', $data['trigger']['triggerid'])
92		->setArgument('eventid', '');
93
94	foreach ($data['problems'] as $problem) {
95		if ($problem['r_eventid'] != 0) {
96			$value = TRIGGER_VALUE_FALSE;
97			$value_str = _('RESOLVED');
98			$value_clock = $problem['r_clock'];
99		}
100		else {
101			$in_closing = false;
102
103			foreach ($problem['acknowledges'] as $acknowledge) {
104				if (($acknowledge['action'] & ZBX_PROBLEM_UPDATE_CLOSE) == ZBX_PROBLEM_UPDATE_CLOSE) {
105					$in_closing = true;
106					break;
107				}
108			}
109
110			$value = $in_closing ? TRIGGER_VALUE_FALSE : TRIGGER_VALUE_TRUE;
111			$value_str = $in_closing ? _('CLOSING') : _('PROBLEM');
112			$value_clock = $in_closing ? time() : $problem['clock'];
113		}
114
115		$url_details->setArgument('eventid', $problem['eventid']);
116
117		$cell_clock = ($problem['clock'] >= $today)
118			? zbx_date2str(TIME_FORMAT_SECONDS, $problem['clock'])
119			: zbx_date2str(DATE_TIME_FORMAT_SECONDS, $problem['clock']);
120		$cell_clock = new CCol(new CLink($cell_clock, $url_details));
121		if ($problem['r_eventid'] != 0) {
122			$cell_r_clock = ($problem['r_clock'] >= $today)
123				? zbx_date2str(TIME_FORMAT_SECONDS, $problem['r_clock'])
124				: zbx_date2str(DATE_TIME_FORMAT_SECONDS, $problem['r_clock']);
125			$cell_r_clock = (new CCol(new CLink($cell_r_clock, $url_details)))
126				->addClass(ZBX_STYLE_NOWRAP)
127				->addClass(ZBX_STYLE_RIGHT);
128		}
129		else {
130			$cell_r_clock = '';
131		}
132
133		$cell_status = new CSpan($value_str);
134
135		// Add colors and blinking to span depending on configuration and trigger parameters.
136		addTriggerValueStyle($cell_status, $value, $value_clock, $problem['acknowledged'] == EVENT_ACKNOWLEDGED);
137
138		if ($data['show_timeline']) {
139			if ($last_clock != 0) {
140				CScreenProblem::addTimelineBreakpoint($table, $last_clock, $problem['clock'], ZBX_SORT_DOWN);
141			}
142			$last_clock = $problem['clock'];
143
144			$row = [
145				$cell_clock->addClass(ZBX_STYLE_TIMELINE_DATE),
146				(new CCol())
147					->addClass(ZBX_STYLE_TIMELINE_AXIS)
148					->addClass(ZBX_STYLE_TIMELINE_DOT),
149				(new CCol())->addClass(ZBX_STYLE_TIMELINE_TD)
150			];
151		}
152		else {
153			$row = [
154				$cell_clock
155					->addClass(ZBX_STYLE_NOWRAP)
156					->addClass(ZBX_STYLE_RIGHT)
157			];
158		}
159
160		// Create acknowledge link.
161		$problem_update_url = (new CUrl('zabbix.php'))
162			->setArgument('action', 'acknowledge.edit')
163			->setArgument('eventids', [$problem['eventid']])
164			->setArgument('backurl', $data['backurl'])
165			->getUrl();
166
167		$acknowledged = ($problem['acknowledged'] == EVENT_ACKNOWLEDGED);
168		$problem_update_link = (new CLink($acknowledged ? _('Yes') : _('No'), $problem_update_url))
169			->addClass($acknowledged ? ZBX_STYLE_GREEN : ZBX_STYLE_RED)
170			->addClass(ZBX_STYLE_LINK_ALT);
171
172		$table->addRow(array_merge($row, [
173			$cell_r_clock,
174			$cell_status,
175			(new CCol(
176				($problem['r_eventid'] != 0)
177					? zbx_date2age($problem['clock'], $problem['r_clock'])
178					: zbx_date2age($problem['clock'])
179			))
180				->addClass(ZBX_STYLE_NOWRAP),
181			$problem_update_link,
182			($data['show_tags'] != PROBLEMS_SHOW_TAGS_NONE) ? $tags[$problem['eventid']] : null
183		]));
184	}
185
186	$div->addItem($table);
187
188	return $div;
189}
190
191$output = [];
192
193if (($messages = getMessages()) !== null) {
194	$output['messages'] = $messages->toString();
195}
196
197if (array_key_exists('data', $data)) {
198	$output['data'] = makeEventList($data['data'])->toString();
199}
200
201echo (new CJson())->encode($output);
202