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.

267 lines
7.6 KiB

<?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.
**/
/**
* Template dashboard importer.
*/
class CTemplateDashboardImporter extends CImporter {
/**
* Import template dashboard.
*
* @param array $template_dashboards
*
* @throws Exception
*/
public function import(array $template_dashboards): void {
$dashboards_to_create = [];
$dashboards_to_update = [];
foreach ($template_dashboards as $template_name => $dashboards) {
$templateid = $this->referencer->findTemplateidByHost($template_name);
if ($templateid === null || !$this->importedObjectContainer->isTemplateProcessed($templateid)) {
continue;
}
foreach ($dashboards as $name => $dashboard) {
foreach ($dashboard['pages'] as &$dashboard_page) {
$dashboard_page['widgets'] = $this->resolveDashboardWidgetReferences($dashboard_page['widgets'],
$name
);
}
unset($dashboard_page);
$dashboardid = $this->referencer->findTemplateDashboardidByUuid($dashboard['uuid']);
if ($dashboardid === null) {
$dashboardid = $this->referencer->findTemplateDashboardidByNameAndId($dashboard['name'],
$templateid
);
}
if ($dashboardid !== null) {
$dashboard['dashboardid'] = $dashboardid;
$dashboards_to_update[] = $dashboard;
}
else {
$dashboard['templateid'] = $templateid;
$dashboards_to_create[] = $dashboard;
}
}
}
if ($this->options['templateDashboards']['updateExisting'] && $dashboards_to_update) {
API::TemplateDashboard()->update($dashboards_to_update);
}
if ($this->options['templateDashboards']['createMissing'] && $dashboards_to_create) {
API::TemplateDashboard()->create($dashboards_to_create);
}
}
/**
* Deletes missing template dashboards.
*
* @param array $template_dashboards
*
* @throws APIException
*/
public function delete(array $template_dashboards): void {
$templateids = $this->importedObjectContainer->getTemplateids();
if (!$templateids) {
return;
}
$dashboardids = [];
foreach ($template_dashboards as $template_name => $dashboards) {
$templateid = $this->referencer->findTemplateidByHost($template_name);
if ($templateid !== null) {
foreach ($dashboards as $dashboard) {
$dashboardid = $this->referencer->findTemplateDashboardidByUuid($dashboard['uuid']);
if ($dashboardid === null) {
$dashboardid = $this->referencer->findTemplateDashboardidByNameAndId($dashboard['name'],
$templateid
);
}
if ($dashboardid !== null) {
$dashboardids[$dashboardid] = true;
}
}
}
}
$db_dashboardids = API::TemplateDashboard()->get([
'output' => [],
'templateids' => $templateids,
'preservekeys' => true
]);
$dashboardids_to_delete = array_diff_key($db_dashboardids, $dashboardids);
if ($dashboardids_to_delete) {
API::TemplateDashboard()->delete(array_keys($dashboardids_to_delete));
}
}
/**
* Prepare dashboard data for import.
* Each widget field "value" has reference to resource it represents, reference structure may differ depending on
* widget field "type".
*
* @param array $widgets
* @param string $dashboard_name for error purpose
*
* @return array
*
* @throws Exception if referenced object is not found in database
*/
protected function resolveDashboardWidgetReferences(array $widgets, string $dashboard_name): array {
foreach ($widgets as &$widget) {
foreach ($widget['fields'] as &$field) {
switch ($field['type']) {
case ZBX_WIDGET_FIELD_TYPE_HOST:
$host_name = $field['value']['host'];
$field['value'] = $this->referencer->findHostidByHost($host_name);
if ($field['value'] === null) {
throw new Exception(_s('Cannot find host "%1$s" used in dashboard "%2$s".',
$host_name, $dashboard_name
));
}
break;
case ZBX_WIDGET_FIELD_TYPE_ITEM:
case ZBX_WIDGET_FIELD_TYPE_ITEM_PROTOTYPE:
$host_name = $field['value']['host'];
$item_key = $field['value']['key'];
$hostid = $this->referencer->findTemplateidOrHostidByHost($host_name);
$field['value'] = $this->referencer->findItemidByKey($hostid, $item_key, true);
if ($field['value'] === null) {
throw new Exception(_s('Cannot find item "%1$s" used in dashboard "%2$s".',
$host_name.':'.$item_key, $dashboard_name
));
}
break;
case ZBX_WIDGET_FIELD_TYPE_GRAPH:
case ZBX_WIDGET_FIELD_TYPE_GRAPH_PROTOTYPE:
$host_name = $field['value']['host'];
$graph_name = $field['value']['name'];
$hostid = $this->referencer->findTemplateidOrHostidByHost($host_name);
$field['value'] = $this->referencer->findGraphidByName($hostid, $graph_name, true);
if ($field['value'] === null) {
throw new Exception(_s('Cannot find graph "%1$s" used in dashboard "%2$s".',
$graph_name, $dashboard_name
));
}
break;
case ZBX_WIDGET_FIELD_TYPE_MAP:
$name = $field['value']['name'];
$field['value'] = $this->referencer->findMapidByName($name);
if ($field['value'] === null) {
throw new Exception(_s('Cannot find map "%1$s" used in dashboard "%2$s".',
$name, $dashboard_name
));
}
break;
case ZBX_WIDGET_FIELD_TYPE_SERVICE:
$name = $field['value']['name'];
$field['value'] = $this->referencer->findServiceidByName($name);
if ($field['value'] === null) {
throw new Exception(_s('Cannot find service "%1$s" used in dashboard "%2$s".',
$name, $dashboard_name
));
}
break;
case ZBX_WIDGET_FIELD_TYPE_SLA:
$name = $field['value']['name'];
$field['value'] = $this->referencer->findSlaidByName($name);
if ($field['value'] === null) {
throw new Exception(_s('Cannot find SLA "%1$s" used in dashboard "%2$s".',
$name, $dashboard_name
));
}
break;
case ZBX_WIDGET_FIELD_TYPE_USER:
$username = $field['value']['username'];
$field['value'] = $this->referencer->findUseridByUsername($username);
if ($field['value'] === null) {
throw new Exception(_s('Cannot find user "%1$s" used in dashboard "%2$s".',
$username, $dashboard_name
));
}
break;
case ZBX_WIDGET_FIELD_TYPE_ACTION:
$name = $field['value']['name'];
$field['value'] = $this->referencer->findActionidByName($name);
if ($field['value'] === null) {
throw new Exception(_s('Cannot find action "%1$s" used in dashboard "%2$s".',
$name, $dashboard_name
));
}
break;
case ZBX_WIDGET_FIELD_TYPE_MEDIA_TYPE:
$name = $field['value']['name'];
$field['value'] = $this->referencer->findMediaTypeidByName($name);
if ($field['value'] === null) {
throw new Exception(_s('Cannot find media type "%1$s" used in dashboard "%2$s".',
$name, $dashboard_name
));
}
break;
}
}
unset($field);
}
unset($widget);
return $widgets;
}
}