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