Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/zabbix/zabbix.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'ui/widgets/graph/actions/WidgetView.php')
-rw-r--r--ui/widgets/graph/actions/WidgetView.php407
1 files changed, 407 insertions, 0 deletions
diff --git a/ui/widgets/graph/actions/WidgetView.php b/ui/widgets/graph/actions/WidgetView.php
new file mode 100644
index 00000000000..e42e320df37
--- /dev/null
+++ b/ui/widgets/graph/actions/WidgetView.php
@@ -0,0 +1,407 @@
+<?php declare(strict_types = 0);
+/*
+** Zabbix
+** Copyright (C) 2001-2022 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.
+**/
+
+
+namespace Widgets\Graph\Actions;
+
+use API,
+ CControllerDashboardWidgetView,
+ CControllerResponseData,
+ CGraphDraw,
+ CMacrosResolverHelper,
+ CRoleHelper,
+ CUrl,
+ CWebUser;
+
+use Zabbix\Core\CWidget;
+
+class WidgetView extends CControllerDashboardWidgetView {
+
+ protected function init(): void {
+ parent::init();
+
+ $this->addValidationRules([
+ 'edit_mode' => 'in 0,1',
+ 'dashboardid' => 'db dashboard.dashboardid',
+ 'dynamic_hostid' => 'db hosts.hostid',
+ 'content_width' => 'int32',
+ 'content_height' => 'int32'
+ ]);
+ }
+
+ protected function doAction(): void {
+ $edit_mode = (int) $this->getInput('edit_mode', 0);
+
+ $width = (int) $this->getInput('content_width', 100);
+ $height = (int) $this->getInput('content_height', 100);
+
+ $dynamic_hostid = $this->getInput('dynamic_hostid', 0);
+ $resourceid = null;
+ $profileIdx = 'web.dashboard.filter';
+ $profileIdx2 = $this->getInput('dashboardid', 0);
+ $is_resource_available = true;
+ $header_name = $this->widget->getDefaultName();
+
+ if ($this->fields_values['source_type'] == ZBX_WIDGET_FIELD_RESOURCE_GRAPH && $this->fields_values['graphid']) {
+ $resource_type = SCREEN_RESOURCE_GRAPH;
+ $resourceid = reset($this->fields_values['graphid']);
+ $graph_dims = getGraphDims($resourceid);
+ $graph_dims['graphHeight'] = $height;
+ $graph_dims['width'] = $width;
+ }
+ elseif ($this->fields_values['source_type'] == ZBX_WIDGET_FIELD_RESOURCE_SIMPLE_GRAPH
+ && $this->fields_values['itemid']) {
+
+ $resource_type = SCREEN_RESOURCE_SIMPLE_GRAPH;
+ $resourceid = $this->fields_values['itemid'][0];
+ $graph_dims = getGraphDims();
+ $graph_dims['graphHeight'] = $height;
+ $graph_dims['width'] = $width;
+ }
+ else {
+ $resource_type = null;
+ $graph_dims = getGraphDims();
+ }
+ $graph_dims['shiftYtop'] = CGraphDraw::DEFAULT_TOP_BOTTOM_PADDING;
+
+ $time_control_data = [
+ 'id' => '',
+ 'containerid' => '',
+ 'objDims' => $graph_dims,
+ 'loadSBox' => 0,
+ 'loadImage' => 1,
+ 'reloadOnAdd' => 1
+ ];
+
+ $flickerfreescreen_data = [
+ 'id' => '',
+ 'interval' => CWebUser::getRefresh(),
+ 'timeline' => [],
+ 'resourcetype' => $resource_type,
+ 'profileIdx' => $profileIdx,
+ 'profileIdx2' => $profileIdx2
+ ];
+
+ $is_template_dashboard = $this->hasInput('templateid');
+ $is_dynamic_item = ($is_template_dashboard || $this->fields_values['dynamic'] == CWidget::DYNAMIC_ITEM);
+
+ // Replace graph item by particular host item if dynamic items are used.
+ if ($is_dynamic_item && $dynamic_hostid != 0 && $resourceid) {
+ // Find same simple-graph item in selected $dynamic_hostid host.
+ if ($this->fields_values['source_type'] == ZBX_WIDGET_FIELD_RESOURCE_SIMPLE_GRAPH) {
+ $src_items = API::Item()->get([
+ 'output' => ['key_'],
+ 'itemids' => $resourceid,
+ 'webitems' => true
+ ]);
+
+ $items = API::Item()->get([
+ 'output' => ['itemid', 'name'],
+ 'selectHosts' => ['name'],
+ 'hostids' => $dynamic_hostid,
+ 'filter' => [
+ 'key_' => $src_items[0]['key_'],
+ 'value_type' => [ITEM_VALUE_TYPE_FLOAT, ITEM_VALUE_TYPE_UINT64]
+ ],
+ 'webitems' => true
+ ]);
+
+ $item = reset($items);
+ $resourceid = $items ? $item['itemid'] : null;
+
+ if ($resourceid === null) {
+ $is_resource_available = false;
+ }
+ }
+ // Find requested host and change graph details.
+ elseif ($this->fields_values['source_type'] == ZBX_WIDGET_FIELD_RESOURCE_GRAPH) {
+ // get host
+ $hosts = API::Host()->get([
+ 'output' => ['hostid', 'host', 'name'],
+ 'hostids' => $dynamic_hostid
+ ]);
+ $host = reset($hosts);
+
+ // get graph
+ $graph = API::Graph()->get([
+ 'output' => API_OUTPUT_EXTEND,
+ 'selectGraphItems' => API_OUTPUT_EXTEND,
+ 'selectHosts' => [],
+ 'graphids' => $resourceid
+ ]);
+ $graph = reset($graph);
+
+ // If all items are from one host we change them, or set calculated if not exist on that host.
+ if ($graph && count($graph['hosts']) == 1) {
+ if ($graph['ymax_type'] == GRAPH_YAXIS_TYPE_ITEM_VALUE && $graph['ymax_itemid']) {
+ $new_dynamic = getSameGraphItemsForHost(
+ [['itemid' => $graph['ymax_itemid']]],
+ $dynamic_hostid,
+ false
+ );
+ $new_dynamic = reset($new_dynamic);
+
+ if ($new_dynamic && array_key_exists('itemid', $new_dynamic) && $new_dynamic['itemid'] > 0) {
+ $graph['ymax_itemid'] = $new_dynamic['itemid'];
+ }
+ else {
+ $graph['ymax_type'] = GRAPH_YAXIS_TYPE_CALCULATED;
+ }
+ }
+
+ if ($graph['ymin_type'] == GRAPH_YAXIS_TYPE_ITEM_VALUE && $graph['ymin_itemid']) {
+ $new_dynamic = getSameGraphItemsForHost(
+ [['itemid' => $graph['ymin_itemid']]],
+ $dynamic_hostid,
+ false
+ );
+ $new_dynamic = reset($new_dynamic);
+
+ if ($new_dynamic && array_key_exists('itemid', $new_dynamic) && $new_dynamic['itemid'] > 0) {
+ $graph['ymin_itemid'] = $new_dynamic['itemid'];
+ }
+ else {
+ $graph['ymin_type'] = GRAPH_YAXIS_TYPE_CALCULATED;
+ }
+ }
+ }
+
+ if ($graph) {
+ $graph['hosts'] = $hosts;
+
+ // Search if there are any items available for this dynamic host.
+ $new_dynamic = getSameGraphItemsForHost($graph['gitems'], $dynamic_hostid, false);
+
+ if ($new_dynamic) {
+ // Add destination host data required by CMacrosResolver::resolveGraphNames().
+ foreach ($new_dynamic as &$item) {
+ $item['host'] = $host['host'];
+ }
+ unset($item);
+
+ $graph['name'] = CMacrosResolverHelper::resolveGraphName($graph['name'], $new_dynamic);
+ }
+ else {
+ $is_resource_available = false;
+ }
+ }
+ else {
+ $is_resource_available = false;
+ }
+ }
+ }
+ else {
+ if (!$resourceid) {
+ $is_resource_available = false;
+ }
+ elseif ($this->fields_values['source_type'] == ZBX_WIDGET_FIELD_RESOURCE_SIMPLE_GRAPH) {
+ $items = API::Item()->get([
+ 'output' => ['name', 'key_', 'delay', 'hostid'],
+ 'selectHosts' => ['name'],
+ 'itemids' => $resourceid,
+ 'filter' => ['value_type' => [ITEM_VALUE_TYPE_FLOAT, ITEM_VALUE_TYPE_UINT64]],
+ 'webitems' => true
+ ]);
+ $item = reset($items);
+
+ if (!$item) {
+ $is_resource_available = false;
+ }
+ }
+ elseif ($this->fields_values['source_type'] == ZBX_WIDGET_FIELD_RESOURCE_GRAPH) {
+ // get graph, used below
+ $graph = API::Graph()->get([
+ 'output' => API_OUTPUT_EXTEND,
+ 'selectHosts' => ['hostid', 'name'],
+ 'graphids' => $resourceid,
+ 'expandName' => true
+ ]);
+ $graph = reset($graph);
+
+ if (!$graph) {
+ $is_resource_available = false;
+ }
+ }
+ }
+
+ if ($is_resource_available) {
+ // Build graph action and data source links.
+ if ($this->fields_values['source_type'] == ZBX_WIDGET_FIELD_RESOURCE_SIMPLE_GRAPH) {
+ if (!$edit_mode) {
+ $time_control_data['loadSBox'] = 1;
+ }
+
+ if ($resourceid) {
+ $graph_src = (new CUrl('chart.php'))
+ ->setArgument('itemids', [$resourceid])
+ ->setArgument('width', $width)
+ ->setArgument('height', $height)
+ ->setArgument('legend', $this->fields_values['show_legend']);
+ }
+ else {
+ $graph_src = new CUrl('chart3.php');
+ }
+
+ $graph_src
+ ->setArgument('from')
+ ->setArgument('to');
+
+ $header_name = $is_template_dashboard
+ ? $item['name']
+ : $item['hosts'][0]['name'].NAME_DELIMITER.$item['name'];
+ }
+ elseif ($this->fields_values['source_type'] == ZBX_WIDGET_FIELD_RESOURCE_GRAPH) {
+ $graph_src = '';
+
+ $prepend_host_name = $is_template_dashboard
+ ? false
+ : count($graph['hosts']) == 1 || ($is_dynamic_item && $dynamic_hostid != 0);
+
+ $header_name = $prepend_host_name
+ ? $graph['hosts'][0]['name'].NAME_DELIMITER.$graph['name']
+ : $graph['name'];
+
+ if ($is_dynamic_item && $dynamic_hostid != 0 && $resourceid) {
+ if ($graph['graphtype'] == GRAPH_TYPE_PIE || $graph['graphtype'] == GRAPH_TYPE_EXPLODED) {
+ $graph_src = (new CUrl('chart7.php'))
+ ->setArgument('name', $host['name'].NAME_DELIMITER.$graph['name'])
+ ->setArgument('graphtype', $graph['graphtype'])
+ ->setArgument('graph3d', $graph['show_3d']);
+ }
+ else {
+ $graph_src = (new CUrl('chart3.php'))
+ ->setArgument('name', $host['name'].NAME_DELIMITER.$graph['name'])
+ ->setArgument('ymin_type', $graph['ymin_type'])
+ ->setArgument('ymax_type', $graph['ymax_type'])
+ ->setArgument('ymin_itemid', $graph['ymin_itemid'])
+ ->setArgument('ymax_itemid', $graph['ymax_itemid'])
+ ->setArgument('showworkperiod', $graph['show_work_period'])
+ ->setArgument('showtriggers', $graph['show_triggers'])
+ ->setArgument('graphtype', $graph['graphtype'])
+ ->setArgument('yaxismin', $graph['yaxismin'])
+ ->setArgument('yaxismax', $graph['yaxismax'])
+ ->setArgument('percent_left', $graph['percent_left'])
+ ->setArgument('percent_right', $graph['percent_right']);
+ }
+
+ $new_graph_items = getSameGraphItemsForHost($graph['gitems'], $dynamic_hostid, false);
+
+ foreach ($new_graph_items as &$new_graph_item) {
+ unset($new_graph_item['gitemid'], $new_graph_item['graphid']);
+ }
+ unset($new_graph_item);
+
+ $graph_src->setArgument('items', $new_graph_items);
+ }
+
+ if ($graph_dims['graphtype'] == GRAPH_TYPE_PIE || $graph_dims['graphtype'] == GRAPH_TYPE_EXPLODED) {
+ if (!$is_dynamic_item || $graph_src === '') {
+ $graph_src = (new CUrl('chart6.php'))
+ ->setArgument('graphid', $resourceid)
+ ->setArgument('graph3d', $graph['show_3d']);
+ }
+ }
+ else {
+ if (!$is_dynamic_item || $graph_src === '') {
+ $graph_src = (new CUrl('chart2.php'))->setArgument('graphid', $resourceid);
+ }
+
+ if (!$edit_mode) {
+ $time_control_data['loadSBox'] = 1;
+ }
+ }
+
+ $graph_src
+ ->setArgument('width', $width)
+ ->setArgument('height', $height)
+ ->setArgument('legend', $this->fields_values['show_legend'] && $graph['show_legend'] ? 1 : 0)
+ ->setArgument('from')
+ ->setArgument('to');
+ }
+
+ $graph_src
+ ->setArgument('profileIdx', $profileIdx)
+ ->setArgument('profileIdx2', $profileIdx2);
+
+ if ($graph_dims['graphtype'] != GRAPH_TYPE_PIE && $graph_dims['graphtype'] != GRAPH_TYPE_EXPLODED) {
+ $graph_src->setArgument('outer', '1');
+ }
+
+ $graph_src->setArgument('widget_view', '1');
+ $time_control_data['src'] = $graph_src->getUrl();
+
+ if ($edit_mode || ($is_template_dashboard && !$this->hasInput('dynamic_hostid'))) {
+ $graph_url = null;
+ }
+ else {
+ if ($this->fields_values['source_type'] == ZBX_WIDGET_FIELD_RESOURCE_GRAPH) {
+ $has_host_graph = $is_dynamic_item && $dynamic_hostid != 0
+ ? (bool) API::Graph()->get([
+ 'output' => [],
+ 'hostids' => [$dynamic_hostid],
+ 'filter' => [
+ 'name' => $graph['name']
+ ]
+ ])
+ : true;
+
+ if ($has_host_graph) {
+ $graph_url = $this->checkAccess(CRoleHelper::UI_MONITORING_HOSTS)
+ ? (new CUrl('zabbix.php'))
+ ->setArgument('action', 'charts.view')
+ ->setArgument('filter_hostids', [$graph['hosts'][0]['hostid']])
+ ->setArgument('filter_name', $graph['name'])
+ ->setArgument('filter_show', GRAPH_FILTER_HOST)
+ ->setArgument('filter_set', '1')
+ ->setArgument('from')
+ ->setArgument('to')
+ : null;
+ }
+ else {
+ $graph_url = null;
+ }
+ }
+ else {
+ $graph_url = $this->checkAccess(CRoleHelper::UI_MONITORING_LATEST_DATA)
+ ? (new CUrl('history.php'))
+ ->setArgument('itemids', [$resourceid])
+ ->setArgument('from')
+ ->setArgument('to')
+ : null;
+ }
+ }
+ }
+
+ $response = [
+ 'name' => $this->getInput('name', $header_name),
+ 'is_resource_available' => $is_resource_available,
+ 'widget' => [
+ 'graph_url' => ($is_resource_available && $graph_url !== null) ? $graph_url->getUrl() : null,
+ 'time_control_data' => $time_control_data,
+ 'flickerfreescreen_data' => $flickerfreescreen_data
+ ],
+ 'user' => [
+ 'debug_mode' => $this->getDebugMode()
+ ]
+ ];
+
+ $this->setResponse(new CControllerResponseData($response));
+ }
+}