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/graphs.inc.php'; 24require_once dirname(__FILE__).'/include/screens.inc.php'; 25require_once dirname(__FILE__).'/include/blocks.inc.php'; 26 27$page['title'] = _('Custom slides'); 28$page['file'] = 'slides.php'; 29$page['scripts'] = ['class.pmaster.js', 'class.calendar.js', 'gtlc.js', 'flickerfreescreen.js']; 30$page['type'] = detect_page_type(PAGE_TYPE_HTML); 31 32define('ZBX_PAGE_DO_JS_REFRESH', 1); 33 34ob_start(); 35require_once dirname(__FILE__).'/include/page_header.php'; 36 37// VAR TYPE OPTIONAL FLAGS VALIDATION EXCEPTION 38$fields = [ 39 'groupid' => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, null], 40 'hostid' => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, null], 41 'elementid' => [T_ZBX_INT, O_OPT, P_SYS|P_NZERO, DB_ID, null], 42 'step' => [T_ZBX_INT, O_OPT, P_SYS, BETWEEN(0, 65535), null], 43 'period' => [T_ZBX_INT, O_OPT, P_SYS, null, null], 44 'stime' => [T_ZBX_STR, O_OPT, P_SYS, null, null], 45 'reset' => [T_ZBX_STR, O_OPT, P_SYS, IN('"reset"'), null], 46 'fullscreen' => [T_ZBX_INT, O_OPT, P_SYS, IN('0,1'), null], 47 // ajax 48 'widgetRefresh' => [T_ZBX_STR, O_OPT, null, null, null], 49 'widgetRefreshRate' => [T_ZBX_STR, O_OPT, P_ACT, null, null], 50 'favobj' => [T_ZBX_STR, O_OPT, P_ACT, null, null], 51 'favid' => [T_ZBX_INT, O_OPT, P_ACT, null, null], 52 'upd_counter' => [T_ZBX_INT, O_OPT, P_ACT, null, null] 53]; 54check_fields($fields); 55 56/* 57 * Permissions 58 */ 59$data = []; 60 61if (getRequest('groupid') && !API::HostGroup()->isReadable([getRequest('groupid')]) 62 || getRequest('hostid') && !API::Host()->isReadable([getRequest('hostid')])) { 63 access_deny(); 64} 65if (hasRequest('elementid')) { 66 $data['screen'] = get_slideshow_by_slideshowid(getRequest('elementid'), PERM_READ); 67 68 if (!$data['screen']) { 69 access_deny(); 70 } 71} 72else { 73 $data['screen'] = []; 74} 75 76/* 77 * Actions 78 */ 79if ((hasRequest('widgetRefresh') || hasRequest('widgetRefreshRate')) && $data['screen']) { 80 $elementId = getRequest('elementid'); 81 82 $screen = getSlideshowScreens($elementId, getRequest('upd_counter')); 83 84 // display screens 85 $dbScreens = $screen 86 ? API::Screen()->get([ 87 'screenids' => $screen['screenid'], 88 'output' => API_OUTPUT_EXTEND, 89 'selectScreenItems' => API_OUTPUT_EXTEND 90 ]) 91 : []; 92 93 if (!$dbScreens) { 94 echo (new CTableInfo()); 95 } 96 else { 97 $dbScreen = reset($dbScreens); 98 99 // get fresh widget data 100 if (hasRequest('widgetRefresh')) { 101 $screenBuilder = new CScreenBuilder([ 102 'screen' => $dbScreen, 103 'mode' => SCREEN_MODE_PREVIEW, 104 'profileIdx' => 'web.slides', 105 'profileIdx2' => $elementId, 106 'hostid' => getRequest('hostid'), 107 'period' => getRequest('period'), 108 'stime' => getRequest('stime') 109 ]); 110 111 CScreenBuilder::insertScreenCleanJs(); 112 113 echo (new CDiv($screenBuilder->show())) 114 ->addClass(ZBX_STYLE_TABLE_FORMS_CONTAINER) 115 ->toString(); 116 117 CScreenBuilder::insertScreenStandardJs([ 118 'timeline' => $screenBuilder->timeline, 119 'profileIdx' => $screenBuilder->profileIdx 120 ]); 121 122 insertPagePostJs(); 123 } 124 125 // refresh rate 126 if (hasRequest('widgetRefreshRate')) { 127 $widgetRefreshRate = substr(getRequest('widgetRefreshRate'), 1); 128 129 CProfile::update('web.slides.rf_rate.'.WIDGET_SLIDESHOW, $widgetRefreshRate, PROFILE_TYPE_STR, $elementId); 130 } 131 else { 132 $widgetRefreshRate = CProfile::get('web.slides.rf_rate.'.WIDGET_SLIDESHOW, 1, 133 getRequest('elementid', CProfile::get('web.slides.elementid')) 134 ); 135 } 136 137 $delay = ($screen['delay'] > 0) ? $screen['delay'] : $data['screen']['delay']; 138 139 insert_js( 140 'PMasters["slideshows"].dolls["'.WIDGET_SLIDESHOW.'"].frequency('. 141 CJs::encodeJson($delay * $widgetRefreshRate). 142 ');'. 143 "\n". 144 'PMasters["slideshows"].dolls["'.WIDGET_SLIDESHOW.'"].restartDoll();' 145 ); 146 } 147} 148 149// filter state 150if (hasRequest('favobj') && hasRequest('favid')) { 151 $favouriteObject = getRequest('favobj'); 152 $favouriteId = getRequest('favid'); 153 154 // saving fixed/dynamic setting to profile 155 if ($favouriteObject === 'timelinefixedperiod') { 156 CProfile::update('web.slides.timelinefixed', $favouriteId, PROFILE_TYPE_INT); 157 } 158} 159 160if ($page['type'] == PAGE_TYPE_JS || $page['type'] == PAGE_TYPE_HTML_BLOCK) { 161 require_once dirname(__FILE__).'/include/page_footer.php'; 162 exit; 163} 164 165/* 166 * Display 167 */ 168if ($data['screen']) { 169 $data['elementId'] = getRequest('elementid'); 170 CProfile::update('web.slides.elementid', getRequest('elementid'), PROFILE_TYPE_ID); 171} 172else { 173 $data['elementId'] = CProfile::get('web.slides.elementid'); 174 $data['screen'] = get_slideshow_by_slideshowid($data['elementId'], PERM_READ); 175 176 if (!$data['screen']) { 177 // Redirect to slide show list. 178 ob_end_clean(); 179 redirect('slideconf.php'); 180 } 181} 182 183$data['fullscreen'] = getRequest('fullscreen'); 184 185if ($data['screen']) { 186 // get groups and hosts 187 if (check_dynamic_items($data['elementId'], 1)) { 188 $data['isDynamicItems'] = true; 189 190 $data['pageFilter'] = new CPageFilter([ 191 'groups' => [ 192 'monitored_hosts' => true, 193 'with_items' => true 194 ], 195 'hosts' => [ 196 'monitored_hosts' => true, 197 'with_items' => true, 198 'DDFirstLabel' => _('not selected') 199 ], 200 'hostid' => getRequest('hostid'), 201 'groupid' => getRequest('groupid') 202 ]); 203 204 $data['groupid'] = $data['pageFilter']->groupid; 205 $data['hostid'] = $data['pageFilter']->hostid; 206 } 207 208 // get element 209 $data['element'] = get_slideshow_by_slideshowid($data['elementId'], PERM_READ); 210 $data['screen']['editable'] = (bool) get_slideshow_by_slideshowid($data['elementId'], PERM_READ_WRITE); 211 212 if ($data['screen']['delay'] > 0) { 213 $data['element']['delay'] = $data['screen']['delay']; 214 } 215 216 show_messages(); 217} 218 219// refresh 220$data['refreshMultiplier'] = CProfile::get('web.slides.rf_rate.'.WIDGET_SLIDESHOW, 1, $data['elementId']); 221 222// render view 223$slidesView = new CView('monitoring.slides', $data); 224$slidesView->render(); 225$slidesView->show(); 226 227require_once dirname(__FILE__).'/include/page_footer.php'; 228