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/screens.inc.php'; 24require_once dirname(__FILE__).'/include/forms.inc.php'; 25require_once dirname(__FILE__).'/include/blocks.inc.php'; 26 27$page['title'] = _('Configuration of screens'); 28$page['file'] = 'screenedit.php'; 29$page['scripts'] = ['class.cscreen.js', 'class.calendar.js', 'gtlc.js', 'class.svg.canvas.js', 'class.svg.map.js', 30 'flickerfreescreen.js', 'multiselect.js' 31]; 32$page['type'] = detect_page_type(PAGE_TYPE_HTML); 33 34require_once dirname(__FILE__).'/include/page_header.php'; 35 36$knownResourceTypes = [ 37 SCREEN_RESOURCE_GRAPH, 38 SCREEN_RESOURCE_SIMPLE_GRAPH, 39 SCREEN_RESOURCE_MAP, 40 SCREEN_RESOURCE_PLAIN_TEXT, 41 SCREEN_RESOURCE_HOST_INFO, 42 SCREEN_RESOURCE_TRIGGER_INFO, 43 SCREEN_RESOURCE_SERVER_INFO, 44 SCREEN_RESOURCE_CLOCK, 45 SCREEN_RESOURCE_TRIGGER_OVERVIEW, 46 SCREEN_RESOURCE_DATA_OVERVIEW, 47 SCREEN_RESOURCE_URL, 48 SCREEN_RESOURCE_ACTIONS, 49 SCREEN_RESOURCE_EVENTS, 50 SCREEN_RESOURCE_HOSTGROUP_TRIGGERS, 51 SCREEN_RESOURCE_SYSTEM_STATUS, 52 SCREEN_RESOURCE_HOST_TRIGGERS, 53 SCREEN_RESOURCE_HISTORY, 54 SCREEN_RESOURCE_LLD_SIMPLE_GRAPH, 55 SCREEN_RESOURCE_LLD_GRAPH 56]; 57 58// VAR TYPE OPTIONAL FLAGS VALIDATION EXCEPTION 59$fields = [ 60 'screenid' => [T_ZBX_INT, O_MAND, P_SYS, DB_ID, null], 61 'screenitemid' => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, null], 62 'resourcetype' => [T_ZBX_INT, O_OPT, null, IN($knownResourceTypes), 'isset({add}) || isset({update})'], 63 'caption' => [T_ZBX_STR, O_OPT, null, null, null], 64 'resourceid' => [T_ZBX_INT, O_OPT, null, DB_ID, null, 65 hasRequest('add') || hasRequest('update') ? getResourceNameByType(getRequest('resourcetype')) : null], 66 'templateid' => [T_ZBX_INT, O_OPT, null, DB_ID, null], 67 'width' => [T_ZBX_INT, O_OPT, null, BETWEEN(0, 65535), null, _('Width')], 68 'height' => [T_ZBX_INT, O_OPT, null, BETWEEN(0, 65535), null, _('Height')], 69 'max_columns' => [T_ZBX_INT, O_OPT, null, 70 BETWEEN(SCREEN_SURROGATE_MAX_COLUMNS_MIN, SCREEN_SURROGATE_MAX_COLUMNS_MAX), null, _('Max columns') 71 ], 72 'colspan' => [T_ZBX_INT, O_OPT, null, BETWEEN(1, 100), null, _('Column span')], 73 'rowspan' => [T_ZBX_INT, O_OPT, null, BETWEEN(1, 100), null, _('Row span')], 74 'elements' => [T_ZBX_INT, O_OPT, null, BETWEEN(1, 100), null, _('Show lines')], 75 'sort_triggers' => [T_ZBX_INT, O_OPT, null, BETWEEN(SCREEN_SORT_TRIGGERS_DATE_DESC, SCREEN_SORT_TRIGGERS_RECIPIENT_DESC), null], 76 'valign' => [T_ZBX_INT, O_OPT, null, BETWEEN(VALIGN_MIDDLE, VALIGN_BOTTOM), null], 77 'halign' => [T_ZBX_INT, O_OPT, null, BETWEEN(HALIGN_CENTER, HALIGN_RIGHT), null], 78 'style' => [T_ZBX_INT, O_OPT, null, BETWEEN(0, 2), 'isset({add}) || isset({update})'], 79 'url' => [T_ZBX_STR, O_OPT, null, null, 'isset({add}) || isset({update})'], 80 'dynamic' => [T_ZBX_INT, O_OPT, null, null, null], 81 'x' => [T_ZBX_INT, O_OPT, null, BETWEEN(1, 100), '(isset({add}) || isset({update})) && isset({form}) && {form} != "update"'], 82 'y' => [T_ZBX_INT, O_OPT, null, BETWEEN(1, 100), '(isset({add}) || isset({update})) && isset({form}) && {form} != "update"'], 83 'screen_type' => [T_ZBX_INT, O_OPT, null, null, null], 84 'tr_groupid' => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, null], 85 'tr_hostid' => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, null], 86 'application' => [T_ZBX_STR, O_OPT, null, null, null], 87 // actions 88 'add' => [T_ZBX_STR, O_OPT, P_SYS|P_ACT, null, null], 89 'update' => [T_ZBX_STR, O_OPT, P_SYS|P_ACT, null, null], 90 'delete' => [T_ZBX_STR, O_OPT, P_SYS|P_ACT, null, null], 91 'cancel' => [T_ZBX_STR, O_OPT, P_SYS, null, null], 92 'form' => [T_ZBX_STR, O_OPT, P_SYS, null, null], 93 'form_refresh' => [T_ZBX_INT, O_OPT, null, null, null], 94 'add_row' => [T_ZBX_INT, O_OPT, P_SYS|P_ACT, BETWEEN(0, 100), null], 95 'add_col' => [T_ZBX_INT, O_OPT, P_SYS|P_ACT, BETWEEN(0, 100), null], 96 'rmv_row' => [T_ZBX_INT, O_OPT, P_SYS|P_ACT, BETWEEN(0, 100), null], 97 'rmv_col' => [T_ZBX_INT, O_OPT, P_SYS|P_ACT, BETWEEN(0, 100), null], 98 'sw_pos' => [T_ZBX_INT, O_OPT, null, BETWEEN(0, 100), null], 99 'ajaxAction' => [T_ZBX_STR, O_OPT, P_ACT, null, null] 100]; 101check_fields($fields); 102$_REQUEST['dynamic'] = getRequest('dynamic', SCREEN_SIMPLE_ITEM); 103 104/* 105 * Permissions 106 */ 107$options = [ 108 'screenids' => $_REQUEST['screenid'], 109 'editable' => true, 110 'output' => API_OUTPUT_EXTEND, 111 'selectScreenItems' => API_OUTPUT_EXTEND 112]; 113$screens = API::Screen()->get($options); 114if (empty($screens)) { 115 $screens = API::TemplateScreen()->get($options); 116 if (empty($screens)) { 117 access_deny(); 118 } 119} 120$screen = reset($screens); 121 122/* 123 * Ajax 124 */ 125if (!empty($_REQUEST['ajaxAction']) && $_REQUEST['ajaxAction'] == 'sw_pos') { 126 $sw_pos = getRequest('sw_pos', []); 127 if (count($sw_pos) > 3) { 128 DBstart(); 129 130 $fitem = DBfetch(DBselect( 131 'SELECT s.screenitemid,s.colspan,s.rowspan'. 132 ' FROM screens_items s'. 133 ' WHERE s.y='.zbx_dbstr($sw_pos[0]). 134 ' AND s.x='.zbx_dbstr($sw_pos[1]). 135 ' AND s.screenid='.zbx_dbstr($screen['screenid']) 136 )); 137 138 $sitem = DBfetch(DBselect( 139 'SELECT s.screenitemid,s.colspan,s.rowspan'. 140 ' FROM screens_items s'. 141 ' WHERE s.y='.zbx_dbstr($sw_pos[2]). 142 ' AND s.x='.zbx_dbstr($sw_pos[3]). 143 ' AND s.screenid='.zbx_dbstr($screen['screenid']) 144 )); 145 146 if ($fitem) { 147 DBexecute('UPDATE screens_items'. 148 ' SET y='.zbx_dbstr($sw_pos[2]).',x='.zbx_dbstr($sw_pos[3]). 149 ',colspan='.(isset($sitem['colspan']) ? zbx_dbstr($sitem['colspan']) : 1). 150 ',rowspan='.(isset($sitem['rowspan']) ? zbx_dbstr($sitem['rowspan']) : 1). 151 ' WHERE y='.zbx_dbstr($sw_pos[0]). 152 ' AND x='.zbx_dbstr($sw_pos[1]). 153 ' AND screenid='.zbx_dbstr($screen['screenid']). 154 ' AND screenitemid='.zbx_dbstr($fitem['screenitemid']) 155 ); 156 } 157 if ($sitem) { 158 DBexecute('UPDATE screens_items '. 159 ' SET y='.zbx_dbstr($sw_pos[0]).',x='.zbx_dbstr($sw_pos[1]). 160 ',colspan='.(isset($fitem['colspan']) ? zbx_dbstr($fitem['colspan']) : 1). 161 ',rowspan='.(isset($fitem['rowspan']) ? zbx_dbstr($fitem['rowspan']) : 1). 162 ' WHERE y='.zbx_dbstr($sw_pos[2]). 163 ' AND x='.zbx_dbstr($sw_pos[3]). 164 ' AND screenid='.zbx_dbstr($screen['screenid']). 165 ' AND screenitemid='.zbx_dbstr($sitem['screenitemid']) 166 ); 167 } 168 add_audit_details(AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_SCREEN, $screen['screenid'], $screen['name'], 'Screen items switched'); 169 170 DBend(true); 171 } 172 echo '{"result": true}'; 173} 174if ($page['type'] == PAGE_TYPE_JS || $page['type'] == PAGE_TYPE_HTML_BLOCK) { 175 require_once dirname(__FILE__).'/include/page_footer.php'; 176 exit; 177} 178 179/* 180 * Actions 181 */ 182if (hasRequest('add') || hasRequest('update')) { 183 $screenItem = [ 184 'screenid' => getRequest('screenid'), 185 'resourcetype' => getRequest('resourcetype'), 186 'caption' => getRequest('caption'), 187 'style' => getRequest('style'), 188 'url' => getRequest('url'), 189 'width' => getRequest('width'), 190 'height' => getRequest('height'), 191 'halign' => getRequest('halign'), 192 'valign' => getRequest('valign'), 193 'colspan' => getRequest('colspan'), 194 'rowspan' => getRequest('rowspan'), 195 'max_columns' => getRequest('max_columns'), 196 'dynamic' => getRequest('dynamic'), 197 'elements' => getRequest('elements', 0), 198 'sort_triggers' => getRequest('sort_triggers', SCREEN_SORT_TRIGGERS_DATE_DESC), 199 'application' => getRequest('application', '') 200 ]; 201 202 if (hasRequest('resourceid')) { 203 $screenItem['resourceid'] = getRequest('resourceid'); 204 } 205 206 DBstart(); 207 208 if (hasRequest('update')) { 209 $screenItem['screenitemid'] = getRequest('screenitemid'); 210 211 $result = API::ScreenItem()->update($screenItem); 212 } 213 else { 214 $screenItem['x'] = getRequest('x'); 215 $screenItem['y'] = getRequest('y'); 216 217 $result = API::ScreenItem()->create($screenItem); 218 } 219 220 if ($result) { 221 add_audit_details(AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_SCREEN, $screen['screenid'], $screen['name'], 'Cell changed '. 222 (hasRequest('screenitemid') ? 'screen itemid "'.getRequest('screenitemid').'"' : ''). 223 (hasRequest('x') && hasRequest('y') ? ' coordinates "'.getRequest('x').','.getRequest('y').'"' : ''). 224 (hasRequest('resourcetype') ? ' resource type "'.getRequest('resourcetype').'"' : '') 225 ); 226 unset($_REQUEST['form']); 227 } 228 229 $result = DBend($result); 230 show_messages($result, _('Screen updated'), _('Cannot update screen')); 231} 232elseif (hasRequest('delete')) { 233 DBstart(); 234 235 $screenitemid = API::ScreenItem()->delete([getRequest('screenitemid')]); 236 237 if ($screenitemid) { 238 $screenitemid = reset($screenitemid); 239 $screenitemid = reset($screenitemid); 240 add_audit_details(AUDIT_ACTION_DELETE, AUDIT_RESOURCE_SCREEN, $screen['screenid'], $screen['name'], 241 'Screen itemid "'.$screenitemid.'"' 242 ); 243 } 244 unset($_REQUEST['x']); 245 246 $result = DBend($screenitemid); 247 show_messages($result, _('Screen updated'), _('Cannot update screen')); 248} 249elseif (hasRequest('add_row')) { 250 addScreenRow($screen, getRequest('add_row')); 251} 252elseif (hasRequest('add_col')) { 253 addScreenColumn($screen, getRequest('add_col')); 254} 255elseif (hasRequest('rmv_row')) { 256 delScreenRow($screen, getRequest('rmv_row')); 257} 258elseif (hasRequest('rmv_col')) { 259 delScreenColumn($screen, getRequest('rmv_col')); 260} 261 262show_messages(); 263 264/* 265 * Display 266 */ 267$data = [ 268 'screenid' => getRequest('screenid', 0) 269]; 270 271// Getting updated screen, so we won't have to refresh the page to see changes. 272$data['screen'] = API::Screen()->get($options); 273if (empty($data['screen'])) { 274 $data['screen'] = API::TemplateScreen()->get($options); 275 if (empty($data['screen'])) { 276 access_deny(); 277 } 278} 279$data['screen'] = reset($data['screen']); 280 281// render view 282echo (new CView('monitoring.screen.constructor.list', $data))->getOutput(); 283 284require_once dirname(__FILE__).'/include/page_footer.php'; 285