You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
410 lines
8.9 KiB
410 lines
8.9 KiB
1 year ago
|
<?php
|
||
|
/*
|
||
|
** Zabbix
|
||
|
** Copyright (C) 2001-2023 Zabbix SIA
|
||
|
**
|
||
|
** This program is free software; you can redistribute it and/or modify
|
||
|
** it under the terms of the GNU General Public License as published by
|
||
|
** the Free Software Foundation; either version 2 of the License, or
|
||
|
** (at your option) any later version.
|
||
|
**
|
||
|
** This program is distributed in the hope that it will be useful,
|
||
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
** GNU General Public License for more details.
|
||
|
**
|
||
|
** You should have received a copy of the GNU General Public License
|
||
|
** along with this program; if not, write to the Free Software
|
||
|
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||
|
**/
|
||
|
|
||
|
|
||
|
class CScreenBase {
|
||
|
|
||
|
/**
|
||
|
* Switch on/off flicker-free screens auto refresh.
|
||
|
*
|
||
|
* @var boolean
|
||
|
*/
|
||
|
public $isFlickerfree;
|
||
|
|
||
|
/**
|
||
|
* Page file.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
public $pageFile;
|
||
|
|
||
|
/**
|
||
|
* Display mode
|
||
|
*
|
||
|
* @var int
|
||
|
*/
|
||
|
public $mode;
|
||
|
|
||
|
/**
|
||
|
* @see Request timestamp
|
||
|
*/
|
||
|
public $timestamp;
|
||
|
|
||
|
/**
|
||
|
* Resource (screen) type
|
||
|
*
|
||
|
* @var int
|
||
|
*/
|
||
|
public $resourcetype;
|
||
|
|
||
|
/**
|
||
|
* Screen id
|
||
|
*
|
||
|
* @var int
|
||
|
*/
|
||
|
public $screenid;
|
||
|
|
||
|
/**
|
||
|
* Screen item data
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
public $screenitem;
|
||
|
|
||
|
/**
|
||
|
* Action
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
public $action;
|
||
|
|
||
|
/**
|
||
|
* Group id
|
||
|
*
|
||
|
* @var int
|
||
|
*/
|
||
|
public $groupid;
|
||
|
|
||
|
/**
|
||
|
* Host id
|
||
|
*
|
||
|
* @var int
|
||
|
*/
|
||
|
public $hostid;
|
||
|
|
||
|
/**
|
||
|
* Time control timeline
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
public $timeline;
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Profile table entity name #1
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
public $profileIdx;
|
||
|
|
||
|
/**
|
||
|
* Profile table record id belongs to #1
|
||
|
*
|
||
|
* @var int
|
||
|
*/
|
||
|
public $profileIdx2;
|
||
|
|
||
|
/**
|
||
|
* Time control dom element id
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
public $dataId;
|
||
|
|
||
|
/**
|
||
|
* Page number.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
public $page;
|
||
|
|
||
|
/**
|
||
|
* Screen parameters with default values.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
public $parameters;
|
||
|
|
||
|
/**
|
||
|
* Screen parameters config.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
private $required_parameters;
|
||
|
|
||
|
/**
|
||
|
* Init screen data.
|
||
|
*
|
||
|
* @param array $options
|
||
|
* @param boolean $options['isFlickerfree']
|
||
|
* @param string $options['pageFile']
|
||
|
* @param int $options['mode']
|
||
|
* @param int $options['timestamp']
|
||
|
* @param int $options['resourcetype']
|
||
|
* @param int $options['screenid']
|
||
|
* @param array $options['screenitem']
|
||
|
* @param string $options['action']
|
||
|
* @param int $options['groupid']
|
||
|
* @param int $options['hostid']
|
||
|
* @param string $options['profileIdx'] Profile idx value.
|
||
|
* @param int $options['profileIdx2'] Profile idx2 value.
|
||
|
* @param string $options['from'] Start time of selected time period.
|
||
|
* @param string $options['to'] End time of selected time period.
|
||
|
* @param array $options['timeline']
|
||
|
* @param string $options['dataId']
|
||
|
*/
|
||
|
public function __construct(array $options = []) {
|
||
|
$this->parameters = [
|
||
|
'isFlickerfree' => true,
|
||
|
'mode' => SCREEN_MODE_SLIDESHOW,
|
||
|
'timestamp' => time(),
|
||
|
'resourcetype' => null,
|
||
|
'screenid' => null,
|
||
|
'action' => null,
|
||
|
'groupid' => null,
|
||
|
'hostid' => 0,
|
||
|
'pageFile' => null,
|
||
|
'profileIdx' => '',
|
||
|
'profileIdx2' => null,
|
||
|
'timeline' => null,
|
||
|
'dataId' => null,
|
||
|
'page' => 1
|
||
|
];
|
||
|
|
||
|
$this->resourcetype = array_key_exists('resourcetype', $options) ? $options['resourcetype'] : null;
|
||
|
|
||
|
$this->required_parameters = [
|
||
|
'isFlickerfree' => true,
|
||
|
'mode' => true,
|
||
|
'timestamp' => true,
|
||
|
'resourcetype' => true,
|
||
|
'dataId' => true
|
||
|
];
|
||
|
|
||
|
switch ($this->resourcetype) {
|
||
|
case SCREEN_RESOURCE_HTTPTEST_DETAILS:
|
||
|
$this->required_parameters += [
|
||
|
'screenid' => false,
|
||
|
'action' => false,
|
||
|
'groupid' => false,
|
||
|
'hostid' => false,
|
||
|
'pageFile' => false,
|
||
|
'profileIdx' => false,
|
||
|
'profileIdx2' => true,
|
||
|
'timeline' => false,
|
||
|
'page' => false
|
||
|
];
|
||
|
break;
|
||
|
|
||
|
case SCREEN_RESOURCE_DISCOVERY:
|
||
|
$this->required_parameters += [
|
||
|
'screenid' => false,
|
||
|
'action' => false,
|
||
|
'groupid' => false,
|
||
|
'hostid' => false,
|
||
|
'pageFile' => false,
|
||
|
'profileIdx' => false,
|
||
|
'profileIdx2' => false,
|
||
|
'timeline' => false,
|
||
|
'page' => false
|
||
|
];
|
||
|
break;
|
||
|
|
||
|
case SCREEN_RESOURCE_HTTPTEST:
|
||
|
$this->required_parameters += [
|
||
|
'screenid' => false,
|
||
|
'action' => false,
|
||
|
'groupid' => true,
|
||
|
'hostid' => true,
|
||
|
'pageFile' => false,
|
||
|
'profileIdx' => false,
|
||
|
'profileIdx2' => false,
|
||
|
'timeline' => false,
|
||
|
'page' => true
|
||
|
];
|
||
|
break;
|
||
|
|
||
|
case SCREEN_RESOURCE_PROBLEM:
|
||
|
$this->required_parameters += [
|
||
|
'screenid' => false,
|
||
|
'action' => false,
|
||
|
'groupid' => false,
|
||
|
'hostid' => false,
|
||
|
'pageFile' => false,
|
||
|
'profileIdx' => true,
|
||
|
'profileIdx2' => true,
|
||
|
'timeline' => true,
|
||
|
'page' => true
|
||
|
];
|
||
|
break;
|
||
|
|
||
|
case SCREEN_RESOURCE_HISTORY:
|
||
|
$this->required_parameters += [
|
||
|
'screenid' => true,
|
||
|
'action' => true,
|
||
|
'groupid' => false,
|
||
|
'hostid' => false,
|
||
|
'pageFile' => true,
|
||
|
'profileIdx' => true,
|
||
|
'profileIdx2' => true,
|
||
|
'timeline' => true,
|
||
|
'page' => true
|
||
|
];
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
$this->required_parameters += [
|
||
|
'screenid' => true,
|
||
|
'action' => true,
|
||
|
'groupid' => true,
|
||
|
'hostid' => true,
|
||
|
'pageFile' => true,
|
||
|
'profileIdx' => true,
|
||
|
'profileIdx2' => true,
|
||
|
'timeline' => true,
|
||
|
'page' => false
|
||
|
];
|
||
|
}
|
||
|
|
||
|
// Get screenitem if its required or resource type is null.
|
||
|
$this->screenitem = [];
|
||
|
if (array_key_exists('screenitem', $options) && is_array($options['screenitem'])) {
|
||
|
$this->screenitem = $options['screenitem'];
|
||
|
}
|
||
|
|
||
|
// Get resourcetype.
|
||
|
if ($this->resourcetype === null && array_key_exists('resourcetype',$this->screenitem)) {
|
||
|
$this->resourcetype = $this->screenitem['resourcetype'];
|
||
|
}
|
||
|
|
||
|
foreach ($this->parameters as $pname => $default_value) {
|
||
|
if ($this->required_parameters[$pname]) {
|
||
|
$this->$pname = array_key_exists($pname, $options) ? $options[$pname] : $default_value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Get page file.
|
||
|
if ($this->required_parameters['pageFile'] && $this->pageFile === null) {
|
||
|
global $page;
|
||
|
$this->pageFile = ($page === null) ? null : $page['file'];
|
||
|
}
|
||
|
|
||
|
// Calculate timeline.
|
||
|
if ($this->required_parameters['timeline'] && $this->timeline === null) {
|
||
|
$this->timeline = getTimeSelectorPeriod([
|
||
|
'profileIdx' => $this->profileIdx,
|
||
|
'profileIdx2' => $this->profileIdx2,
|
||
|
'from' => array_key_exists('from', $options) ? $options['from'] : null,
|
||
|
'to' => array_key_exists('to', $options) ? $options['to'] : null
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
// Get screenid.
|
||
|
if ($this->required_parameters['screenid'] && $this->screenid === null && $this->screenitem) {
|
||
|
$this->screenid = $this->screenitem['screenid'];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Create and get unique screen id for time control.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getDataId() {
|
||
|
if ($this->dataId === null) {
|
||
|
$this->dataId = $this->screenitem
|
||
|
? $this->screenitem['screenitemid'].'_'.$this->screenitem['screenid']
|
||
|
: 1;
|
||
|
}
|
||
|
|
||
|
return $this->dataId;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get unique screen container id.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getScreenId() {
|
||
|
return 'flickerfreescreen_'.$this->getDataId();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get enveloped screen inside container.
|
||
|
*
|
||
|
* @param object $item
|
||
|
* @param boolean $insertFlickerfreeJs
|
||
|
* @param array $flickerfreeData
|
||
|
*
|
||
|
* @return CDiv
|
||
|
*/
|
||
|
public function getOutput($item = null, $insertFlickerfreeJs = true, $flickerfreeData = []) {
|
||
|
if ($insertFlickerfreeJs) {
|
||
|
$this->insertFlickerfreeJs($flickerfreeData);
|
||
|
}
|
||
|
|
||
|
$div = (new CDiv($item))
|
||
|
->addClass('flickerfreescreen')
|
||
|
->setAttribute('data-timestamp', $this->timestamp)
|
||
|
->setId($this->getScreenId());
|
||
|
|
||
|
if ($this->mode == SCREEN_MODE_EDIT) {
|
||
|
$div->addItem(
|
||
|
(new CDiv([
|
||
|
new CLink(_x('Change', 'verb'), $this->action)
|
||
|
]))->addClass(ZBX_STYLE_CENTER)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
return $div;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Insert javascript flicker-free screen data.
|
||
|
*
|
||
|
* @param array $data
|
||
|
*/
|
||
|
public function insertFlickerfreeJs(array $data = []) {
|
||
|
$jsData = [
|
||
|
'id' => $this->getDataId(),
|
||
|
'interval' => CWebUser::getRefresh()
|
||
|
];
|
||
|
|
||
|
$parameters = $this->parameters;
|
||
|
|
||
|
// unset redundant parameters
|
||
|
unset($parameters['action'], $parameters['dataId']);
|
||
|
|
||
|
foreach ($parameters as $pname => $default_value) {
|
||
|
if ($this->required_parameters[$pname]) {
|
||
|
$jsData[$pname] = $this->$pname;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ($this->screenitem) {
|
||
|
$jsData['screenitemid'] = array_key_exists('screenitemid', $this->screenitem)
|
||
|
? $this->screenitem['screenitemid']
|
||
|
: null;
|
||
|
}
|
||
|
|
||
|
if ($this->required_parameters['screenid']) {
|
||
|
$jsData['screenid'] = array_key_exists('screenid', $this->screenitem)
|
||
|
? $this->screenitem['screenid']
|
||
|
: $this->screenid;
|
||
|
}
|
||
|
|
||
|
if ($data) {
|
||
|
$jsData['data'] = $data;
|
||
|
}
|
||
|
|
||
|
zbx_add_post_js('window.flickerfreeScreen.add('.zbx_jsvalue($jsData).');');
|
||
|
}
|
||
|
}
|