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.

631 lines
17 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.
**/
/**
* Import formatter
*/
class CImportDataAdapter {
/**
* @var array configuration import data
*/
protected $data;
/**
* Current import version.
*
* @var string
*/
protected $currentVersion;
/**
* Set the data and initialize the adapter.
*
* @param array $data import data
*/
public function load(array $data) {
$this->data = $data['zabbix_export'];
}
public function getData(): array {
return $this->data;
}
/**
* Get template groups from the imported data.
*
* @return array
*/
public function getTemplateGroups(): array {
return array_key_exists('template_groups', $this->data) ? $this->data['template_groups'] : [];
}
/**
* Get host groups from the imported data.
*
* @return array
*/
public function getHostGroups(): array {
return array_key_exists('host_groups', $this->data) ? $this->data['host_groups'] : [];
}
/**
* Get templates from the imported data.
*
* @return array
*/
public function getTemplates(): array {
$templates = [];
if (array_key_exists('templates', $this->data)) {
foreach ($this->data['templates'] as $template) {
$template = CArrayHelper::renameKeys($template, ['template' => 'host']);
if ($template['vendor']) {
$template['vendor_name'] = $template['vendor']['name'];
$template['vendor_version'] = $template['vendor']['version'];
}
else {
$template += array_fill_keys(['vendor_name', 'vendor_version'], '');
}
$templates[] = CArrayHelper::getByKeys($template, [
'uuid', 'groups', 'macros', 'templates', 'host', 'status', 'name', 'description', 'tags',
'valuemaps', 'vendor_name', 'vendor_version'
]);
}
}
return $templates;
}
/**
* Get hosts from the imported data.
*
* @return array
*/
public function getHosts(): array {
$hosts = [];
if (array_key_exists('hosts', $this->data)) {
foreach ($this->data['hosts'] as $host) {
if (array_key_exists('interfaces', $host)) {
foreach ($host['interfaces'] as $index => $interface) {
$host['interfaces'][$index] = CArrayHelper::renameKeys($interface, ['default' => 'main']);
}
}
$hosts[] = CArrayHelper::getByKeys($host, [
'inventory', 'proxy', 'groups', 'templates', 'macros', 'interfaces', 'host', 'status',
'description', 'ipmi_authtype', 'ipmi_privilege', 'ipmi_username', 'ipmi_password', 'name',
'inventory_mode', 'tags', 'valuemaps'
]);
}
}
return $hosts;
}
/**
* Get items from the imported data.
*
* @return array
*/
public function getItems(): array {
$items = [];
if (array_key_exists('hosts', $this->data)) {
foreach ($this->data['hosts'] as $host) {
if (array_key_exists('items', $host)) {
foreach ($host['items'] as $item) {
$items[$host['host']][$item['key']] = $this->renameItemFields($item);
}
}
}
}
if (array_key_exists('templates', $this->data)) {
foreach ($this->data['templates'] as $template) {
if (array_key_exists('items', $template)) {
foreach ($template['items'] as $item) {
$items[$template['template']][$item['key']] = $this->renameItemFields($item);
}
}
}
}
return $items;
}
/**
* Get discovery rules from the imported data.
*
* @return array
*/
public function getDiscoveryRules(): array {
$discovery_rules = [];
if (array_key_exists('hosts', $this->data)) {
foreach ($this->data['hosts'] as $host) {
if (array_key_exists('discovery_rules', $host)) {
foreach ($host['discovery_rules'] as $discovery_rule) {
$discovery_rules[$host['host']][$discovery_rule['key']] =
$this->formatDiscoveryRule($discovery_rule, $host['host']);
}
}
}
}
if (array_key_exists('templates', $this->data)) {
foreach ($this->data['templates'] as $template) {
if (array_key_exists('discovery_rules', $template)) {
foreach ($template['discovery_rules'] as $discovery_rule) {
$discovery_rules[$template['template']][$discovery_rule['key']] =
$this->formatDiscoveryRule($discovery_rule, $template['template']);
}
}
}
}
return $discovery_rules;
}
/**
* Get web scenarios from the imported data.
*
* @return array
*/
public function getHttpTests(): array {
$httptests = [];
if (array_key_exists('hosts', $this->data)) {
foreach ($this->data['hosts'] as $host) {
if (array_key_exists('httptests', $host)) {
foreach ($host['httptests'] as $httptest) {
$httptests[$host['host']][$httptest['name']] = $this->formatHttpTest($httptest);
}
}
}
}
if (array_key_exists('templates', $this->data)) {
foreach ($this->data['templates'] as $template) {
if (array_key_exists('httptests', $template)) {
foreach ($template['httptests'] as $httptest) {
$httptests[$template['template']][$httptest['name']] = $this->formatHttpTest($httptest);
}
}
}
}
return $httptests;
}
/**
* Get web scenario steps from the imported data.
*
* @return array
*/
public function getHttpSteps(): array {
$httpsteps = [];
if (array_key_exists('hosts', $this->data)) {
foreach ($this->data['hosts'] as $host) {
if (array_key_exists('httptests', $host)) {
foreach ($host['httptests'] as $httptest) {
foreach ($httptest['steps'] as $httpstep) {
$httpsteps[$host['host']][$httptest['name']][$httpstep['name']] = $httpstep;
}
}
}
}
}
if (array_key_exists('templates', $this->data)) {
foreach ($this->data['templates'] as $template) {
if (array_key_exists('httptests', $template)) {
foreach ($template['httptests'] as $httptest) {
foreach ($httptest['steps'] as $httpstep) {
$httpsteps[$template['template']][$httptest['name']][$httpstep['name']] = $httpstep;
}
}
}
}
}
return $httpsteps;
}
/**
* Get graphs from the imported data.
*
* @return array
*/
public function getGraphs(): array {
$graphs = [];
if (array_key_exists('graphs', $this->data)) {
foreach ($this->data['graphs'] as $graph) {
if (array_key_exists('uuid', $graph) && $graph['uuid'] === '') {
unset($graph['uuid']);
}
$graphs[] = $this->renameGraphFields($graph);
}
}
return $graphs;
}
/**
* Get triggers from the imported data.
*
* @return array
*/
public function getTriggers() {
$triggers = [];
foreach (['hosts', 'templates'] as $source) {
if (array_key_exists($source, $this->data)) {
foreach ($this->data[$source] as $host) {
if (array_key_exists('items', $host)) {
foreach ($host['items'] as $item) {
if (array_key_exists('triggers', $item)) {
foreach ($item['triggers'] as $trigger) {
$triggers[] = $this->renameTriggerFields($trigger);
}
}
}
}
}
}
}
if (array_key_exists('triggers', $this->data)) {
foreach ($this->data['triggers'] as $trigger) {
if (array_key_exists('uuid', $trigger) && $trigger['uuid'] === '') {
unset($trigger['uuid']);
}
$triggers[] = $this->renameTriggerFields($trigger);
}
}
return $triggers;
}
/**
* Get images from the imported data.
*
* @return array
*/
public function getImages() {
$images = [];
if (array_key_exists('images', $this->data)) {
foreach ($this->data['images'] as $image) {
$images[] = CArrayHelper::renameKeys($image, ['encodedImage' => 'image']);
}
}
return $images;
}
/**
* Get maps from the imported data.
*
* @return array
*/
public function getMaps() {
return array_key_exists('maps', $this->data) ? $this->data['maps'] : [];
}
/**
* Get template dashboards from the imported data.
*
* @return array
*/
public function getTemplateDashboards() {
$dashboards = [];
if (array_key_exists('templates', $this->data)) {
foreach ($this->data['templates'] as $template) {
if (array_key_exists('dashboards', $template)) {
foreach ($template['dashboards'] as $dashboard) {
foreach ($dashboard['pages'] as &$dashboard_page) {
// Rename hide_header to view_mode in widgets.
if (array_key_exists('widgets', $dashboard_page)) {
$dashboard_page['widgets'] = array_map(function (array $widget): array {
$widget = CArrayHelper::renameKeys($widget, ['hide_header' => 'view_mode']);
return $widget;
}, $dashboard_page['widgets']);
}
}
unset($dashboard_page);
$dashboards[$template['template']][$dashboard['name']] = $dashboard;
}
}
}
}
return $dashboards;
}
/**
* Get media types from the imported data.
*
* @return array
*/
public function getMediaTypes() {
$media_types = [];
if (array_key_exists('media_types', $this->data)) {
$keys = [
'password' => 'passwd',
'script_name' => 'exec_path',
'max_sessions' => 'maxsessions',
'attempts' => 'maxattempts'
];
$message_template_keys = [
'event_source' => 'eventsource',
'operation_mode' => 'recovery'
];
foreach ($this->data['media_types'] as $media_type) {
if (array_key_exists('message_templates', $media_type)) {
foreach ($media_type['message_templates'] as &$message_template) {
$message_template = CArrayHelper::renameKeys($message_template, $message_template_keys);
}
unset($message_template);
}
$media_types[] = CArrayHelper::renameKeys($media_type, $keys);
}
}
return $media_types;
}
/**
* Format discovery rule.
*
* @param array $discovery_rule
* @param string $host
*
* @return array
*/
protected function formatDiscoveryRule(array $discovery_rule, $host) {
if (!$discovery_rule['filter']) {
unset($discovery_rule['filter']);
}
$discovery_rule = $this->renameItemFields($discovery_rule);
$discovery_rule = $this->formatDiscoveryRuleOverrideFields($discovery_rule);
foreach ($discovery_rule['item_prototypes'] as &$item_prototype) {
if (array_key_exists('trigger_prototypes', $item_prototype)) {
$discovery_rule['trigger_prototypes'] = array_merge($discovery_rule['trigger_prototypes'],
$item_prototype['trigger_prototypes']
);
}
$item_prototype = $this->renameItemFields($item_prototype);
}
unset($item_prototype);
foreach ($discovery_rule['trigger_prototypes'] as &$trigger_prototype) {
$trigger_prototype = $this->renameTriggerFields($trigger_prototype);
}
unset($trigger_prototype);
foreach ($discovery_rule['graph_prototypes'] as &$graph_prototype) {
$graph_prototype = $this->renameGraphFields($graph_prototype);
}
unset($graph_prototype);
foreach ($discovery_rule['host_prototypes'] as &$host_prototype) {
// Optionally remove interfaces array also if no custom interfaces are set.
if ($host_prototype['custom_interfaces'] == HOST_PROT_INTERFACES_INHERIT) {
unset($host_prototype['interfaces']);
}
if (array_key_exists('interfaces', $host_prototype)) {
foreach ($host_prototype['interfaces'] as &$interface) {
$interface = CArrayHelper::renameKeys($interface, ['default' => 'main']);
// Import creates empty arrays. Remove them, since they are not required.
if ($interface['type'] != INTERFACE_TYPE_SNMP) {
unset($interface['details']);
}
}
unset($interface);
}
}
unset($host_prototype);
return $discovery_rule;
}
/**
* Format low-level discovery rule overrides.
*
* @param array $discovery_rule Data of single low-level discovery rule.
*
* @return array
*/
protected function formatDiscoveryRuleOverrideFields(array $discovery_rule) {
if ($discovery_rule['overrides']) {
foreach ($discovery_rule['overrides'] as &$override) {
if (!$override['filter']) {
unset($override['filter']);
}
foreach ($override['operations'] as &$operation) {
if (array_key_exists('discover', $operation) && $operation['discover'] !== '') {
$operation['opdiscover']['discover'] = $operation['discover'];
}
switch ($operation['operationobject']) {
case OPERATION_OBJECT_ITEM_PROTOTYPE:
if (array_key_exists('status', $operation) && $operation['status'] !== '') {
$operation['opstatus']['status'] = $operation['status'];
}
if (array_key_exists('delay', $operation) && $operation['delay'] !== '') {
$operation['opperiod']['delay'] = $operation['delay'];
}
if (array_key_exists('history', $operation) && $operation['history'] !== '') {
$operation['ophistory']['history'] = $operation['history'];
}
if (array_key_exists('trends', $operation) && $operation['trends'] !== '') {
$operation['optrends']['trends'] = $operation['trends'];
}
if (array_key_exists('tags', $operation) && $operation['tags']) {
$operation['optag'] = [];
foreach ($operation['tags'] as $tag) {
$operation['optag'][] = $tag;
}
}
break;
case OPERATION_OBJECT_TRIGGER_PROTOTYPE:
if (array_key_exists('status', $operation) && $operation['status'] !== '') {
$operation['opstatus']['status'] = $operation['status'];
}
if (array_key_exists('severity', $operation) && $operation['severity'] !== '') {
$operation['opseverity']['severity'] = $operation['severity'];
}
if (array_key_exists('tags', $operation) && $operation['tags']) {
$operation['optag'] = [];
foreach ($operation['tags'] as $tag) {
$operation['optag'][] = $tag;
}
}
break;
case OPERATION_OBJECT_HOST_PROTOTYPE:
if (array_key_exists('status', $operation) && $operation['status'] !== '') {
$operation['opstatus']['status'] = $operation['status'];
}
if (array_key_exists('templates', $operation) && $operation['templates']) {
$operation['optemplate'] = [];
foreach ($operation['templates'] as $template) {
$operation['optemplate'][] = $template;
}
}
if (array_key_exists('tags', $operation) && $operation['tags']) {
$operation['optag'] = [];
foreach ($operation['tags'] as $tag) {
$operation['optag'][] = $tag;
}
}
if (array_key_exists('inventory_mode', $operation) && $operation['inventory_mode'] !== '') {
$operation['opinventory']['inventory_mode'] = $operation['inventory_mode'];
}
break;
}
unset($operation['status'], $operation['discover'], $operation['delay'], $operation['history'],
$operation['trends'], $operation['severity'], $operation['tags'], $operation['templates'],
$operation['inventory_mode']
);
}
unset($operation);
}
unset($override);
}
return $discovery_rule;
}
/**
* Rename items, discovery rules, item prototypes fields.
*
* @param array $item
*
* @return array
*/
protected function renameItemFields(array $item) {
return CArrayHelper::renameKeys($item, ['key' => 'key_', 'allowed_hosts' => 'trapper_hosts']);
}
/**
* Format web scenario.
*
* @param array $httptest
*
* @return array
*/
protected function formatHttpTest(array $httptest) {
$httptest = $this->renameHttpTestFields($httptest);
$no = 0;
foreach ($httptest['steps'] as &$step) {
$step['no'] = ++$no;
}
unset($step);
return $httptest;
}
/**
* Rename web scenarios fields.
*
* @param array $httptest
*
* @return array
*/
protected function renameHttpTestFields(array $httptest) {
return CArrayHelper::renameKeys($httptest, ['attempts' => 'retries']);
}
/**
* Rename triggers, trigger prototypes fields.
*
* @param array $trigger
*
* @return array
*/
protected function renameTriggerFields(array $trigger): array {
$trigger = CArrayHelper::renameKeys($trigger, ['description' => 'comments']);
return CArrayHelper::renameKeys($trigger, ['name' => 'description', 'severity' => 'priority']);
}
/**
* Rename graphs, graph prototypes fields.
*
* @param array $graph
*
* @return array
*/
protected function renameGraphFields(array $graph) {
return CArrayHelper::renameKeys($graph, [
'type' => 'graphtype',
'ymin_type_1' => 'ymin_type',
'ymax_type_1' => 'ymax_type',
'graph_items' => 'gitems'
]);
}
}