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.

298 lines
8.2 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.
**/
/**
* Converter for converting import data from 3.2 to 3.4
*/
class C32ImportConverter extends CConverter {
public function convert($data) {
$data['zabbix_export']['version'] = '3.4';
if (array_key_exists('hosts', $data['zabbix_export'])) {
$data['zabbix_export']['hosts'] = $this->convertHosts($data['zabbix_export']['hosts']);
}
if (array_key_exists('templates', $data['zabbix_export'])) {
$data['zabbix_export']['templates'] = $this->convertHosts($data['zabbix_export']['templates']);
}
if (array_key_exists('maps', $data['zabbix_export'])) {
$data['zabbix_export']['maps'] = $this->convertMaps($data['zabbix_export']['maps']);
}
return $data;
}
/**
* Convert hosts.
*
* @param array $hosts
*
* @return array
*/
protected function convertHosts(array $hosts) {
foreach ($hosts as &$host) {
if (array_key_exists('discovery_rules', $host)) {
$host['discovery_rules'] = $this->convertDiscoveryRules($host['discovery_rules']);
}
if (array_key_exists('items', $host)) {
$host['items'] = $this->convertItems($host['items'], [
'master_item' => []
]);
}
if (array_key_exists('httptests', $host)) {
$host['httptests'] = $this->convertHttpTests($host['httptests']);
}
}
unset($host);
return $hosts;
}
/**
* Convert item elements.
*
* @param array $items
* @param array $default_fields Default values to add to every item.
*
* @return array
*/
protected function convertItems(array $items,array $default_fields) {
foreach ($items as &$item) {
// Item preprocessing.
$item['preprocessing'] = [];
if ($item['data_type'] != ITEM_DATA_TYPE_DECIMAL) {
switch ($item['data_type']) {
case ITEM_DATA_TYPE_OCTAL:
$type = ZBX_PREPROC_OCT2DEC;
break;
case ITEM_DATA_TYPE_HEXADECIMAL:
$type = ZBX_PREPROC_HEX2DEC;
break;
case ITEM_DATA_TYPE_BOOLEAN:
$type = ZBX_PREPROC_BOOL2DEC;
break;
}
$item['preprocessing'][] = ['type' => (string) $type, 'params' => ''];
}
if ($item['delta'] == 1) {
$item['preprocessing'][] = ['type' => (string) ZBX_PREPROC_DELTA_SPEED, 'params' => ''];
}
elseif ($item['delta'] == 2) {
$item['preprocessing'][] = ['type' => (string) ZBX_PREPROC_DELTA_VALUE, 'params' => ''];
}
if ($item['multiplier'] == 1) {
$item['preprocessing'][] = ['type' => (string) ZBX_PREPROC_MULTIPLIER, 'params' => $item['formula']];
}
unset($item['data_type'], $item['delta'], $item['multiplier'], $item['formula']);
if (!$item['preprocessing']) {
$item['preprocessing'] = '';
}
// Merge delay_flex into delay separated by a semicolon.
$item['delay'] = (string) $item['delay'];
if ($item['delay_flex'] !== '') {
$item['delay'] .= ';'.$item['delay_flex'];
}
unset($item['delay_flex']);
// Convert to days.
$item['history'] = (string) $item['history'];
if ($item['history'] != 0) {
$item['history'] .= 'd';
}
$item['trends'] = (string) $item['trends'];
if ($item['trends'] != 0) {
$item['trends'] .= 'd';
}
$item['jmx_endpoint'] = ($item['type'] == ITEM_TYPE_JMX) ? ZBX_DEFAULT_JMX_ENDPOINT : '';
$item = $item + $default_fields;
}
unset($item);
return $items;
}
/**
* Convert discovery rule elements.
*
* @param array $discovery_rules
*
* @return array
*/
protected function convertDiscoveryRules(array $discovery_rules) {
foreach ($discovery_rules as &$discovery_rule) {
$discovery_rule['item_prototypes'] = $this->convertItems($discovery_rule['item_prototypes'], [
'master_item_prototype' => []
]);
$discovery_rule['jmx_endpoint'] = ($discovery_rule['type'] == ITEM_TYPE_JMX)
? ZBX_DEFAULT_JMX_ENDPOINT
: '';
// Merge delay_flex into delay separated by a semicolon.
$discovery_rule['delay'] = (string) $discovery_rule['delay'];
if ($discovery_rule['delay_flex'] !== '') {
$discovery_rule['delay'] .= ';'.$discovery_rule['delay_flex'];
}
unset($discovery_rule['delay_flex']);
// Convert to days.
if (ctype_digit($discovery_rule['lifetime']) && $discovery_rule['lifetime'] != 0) {
$discovery_rule['lifetime'] .= 'd';
}
}
unset($discovery_rule);
return $discovery_rules;
}
/**
* Convert maps.
*
* @param array $maps
*
* @return array
*/
protected function convertMaps(array $maps) {
$default_shape = [
'type' => (string) SYSMAP_SHAPE_TYPE_RECTANGLE,
'x' => DB::getDefault('sysmap_shape', 'x'),
'y' => DB::getDefault('sysmap_shape', 'y'),
'height' => '15',
'text' => '{MAP.NAME}',
'font' => DB::getDefault('sysmap_shape', 'font'),
'font_size' => DB::getDefault('sysmap_shape', 'font_size'),
'font_color' => DB::getDefault('sysmap_shape', 'font_color'),
'text_halign' => DB::getDefault('sysmap_shape', 'text_halign'),
'text_valign' => DB::getDefault('sysmap_shape', 'text_valign'),
'border_type' => DB::getDefault('sysmap_shape', 'border_type'),
'border_width' => DB::getDefault('sysmap_shape', 'border_width'),
'border_color' => DB::getDefault('sysmap_shape', 'border_color'),
'background_color' => DB::getDefault('sysmap_shape', 'background_color'),
'zindex' => DB::getDefault('sysmap_shape', 'zindex')
];
foreach ($maps as &$map) {
$map['selements'] = $this->convertMapElements($map['selements']);
$map['shapes'] = [['width' => $map['width']] + $default_shape];
$map['lines'] = [];
}
unset($map);
return $maps;
}
/**
* Convert map elements.
*
* @param array $selements
*
* @return array
*/
protected function convertMapElements(array $selements) {
foreach ($selements as &$selement) {
if (zbx_is_int($selement['elementtype'])) {
switch ($selement['elementtype']) {
case SYSMAP_ELEMENT_TYPE_HOST:
case SYSMAP_ELEMENT_TYPE_MAP:
case SYSMAP_ELEMENT_TYPE_HOST_GROUP:
case SYSMAP_ELEMENT_TYPE_TRIGGER:
$selement['elements'] = [$selement['element']];
break;
}
}
unset($selement['element']);
}
unset($selement);
return $selements;
}
/**
* Convert HTTP fields (headers / variables) into http pair array
*
* @param string $value
* @param string $delimiter
*
* @return array
*/
protected function convertHttpFields($value, $delimiter) {
$pairs = array_values(array_filter(explode("\n", str_replace("\r", "\n", $value))));
foreach ($pairs as &$pair) {
$pair = explode($delimiter, $pair, 2);
$pair = [
'name' => $pair[0],
'value' => array_key_exists(1, $pair) ? $pair[1] : ''
];
}
unset($pair);
return $pairs;
}
/**
* Convert httptest step elements.
*
* @param array $http_test_steps
*
* @return array
*/
protected function convertHttpTestSteps(array $http_test_steps) {
foreach ($http_test_steps as &$http_test_step) {
$http_test_step['headers'] = $this->convertHttpFields($http_test_step['headers'], ':');
$http_test_step['variables'] = $this->convertHttpFields($http_test_step['variables'], '=');
$http_test_step['query_fields'] = [];
}
unset($http_test_step);
return $http_test_steps;
}
/**
* Convert httptest elements.
*
* @param array $http_tests
*
* @return array
*/
protected function convertHttpTests(array $http_tests) {
foreach ($http_tests as &$http_test) {
$http_test['headers'] = $this->convertHttpFields($http_test['headers'], ':');
$http_test['variables'] = $this->convertHttpFields($http_test['variables'], '=');
if (array_key_exists('steps', $http_test)) {
$http_test['steps'] = $this->convertHttpTestSteps($http_test['steps']);
}
}
unset($http_test);
return $http_tests;
}
}