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