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