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.
140 lines
4.3 KiB
140 lines
4.3 KiB
1 year ago
|
<?php declare(strict_types = 0);
|
||
|
/*
|
||
|
** 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 CValueMapHelper {
|
||
|
|
||
|
/**
|
||
|
* Apply value mapping to value.
|
||
|
* If value map or mapping is not found, unchanged value is returned,
|
||
|
* otherwise mapped value returned in format: "<mapped_value> (<initial_value>)".
|
||
|
*
|
||
|
* @param int $value_type Item value type.
|
||
|
* @param string $value Value that mapping should be applied to.
|
||
|
* @param array $valuemap Valuemap array.
|
||
|
* @param array $valuemap['mappings'] (optional) Valuemap mappings array.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public static function applyValueMap($value_type, string $value, array $valuemap): string {
|
||
|
$newvalue = static::getMappedValue($value_type, $value, $valuemap);
|
||
|
|
||
|
return ($newvalue !== false) ? $newvalue.' ('.$value.')' : $value;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get mapping for value.
|
||
|
*
|
||
|
* @param int $value_type Item value type.
|
||
|
* @param string $value Value that mapping should be applied to.
|
||
|
* @param array $valuemap Valuemap array.
|
||
|
* @param array $valuemap['mappings'] Valuemap mappings array.
|
||
|
*
|
||
|
* @return string|bool If there is no mapping return false, return mapped value otherwise.
|
||
|
*/
|
||
|
public static function getMappedValue($value_type, string $value, array $valuemap) {
|
||
|
$newvalue = false;
|
||
|
|
||
|
if (array_key_exists('mappings', $valuemap)) {
|
||
|
foreach ($valuemap['mappings'] as $mapping) {
|
||
|
if ($mapping['type'] == VALUEMAP_MAPPING_TYPE_DEFAULT) {
|
||
|
$newvalue = $mapping['newvalue'];
|
||
|
}
|
||
|
elseif (static::matchMapping($value_type, $value, $mapping)) {
|
||
|
$newvalue = $mapping['newvalue'];
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $newvalue;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check value match against single mapping. Return true on success, false otherwise.
|
||
|
*
|
||
|
* @param int $value_type Item value type.
|
||
|
* @param string $value Value to check against mapping.
|
||
|
* @param array $mapping Array of single mapping.
|
||
|
* @param string $mapping['type'] Type of mapping.
|
||
|
* @param string $mapping['value] Value of mapping.
|
||
|
*/
|
||
|
public static function matchMapping($value_type, string $value, array $mapping): bool {
|
||
|
$match_numeric = ($value_type == ITEM_VALUE_TYPE_FLOAT || $value_type == ITEM_VALUE_TYPE_UINT64);
|
||
|
$result = false;
|
||
|
|
||
|
switch ($mapping['type']) {
|
||
|
case VALUEMAP_MAPPING_TYPE_EQUAL:
|
||
|
$result = $match_numeric
|
||
|
? (is_numeric($mapping['value']) && floatval($value) == floatval($mapping['value']))
|
||
|
: ($value === $mapping['value']);
|
||
|
|
||
|
break;
|
||
|
|
||
|
case VALUEMAP_MAPPING_TYPE_GREATER_EQUAL:
|
||
|
$result = ($match_numeric && floatval($value) >= floatval($mapping['value']));
|
||
|
|
||
|
break;
|
||
|
|
||
|
case VALUEMAP_MAPPING_TYPE_LESS_EQUAL:
|
||
|
$result = ($match_numeric && floatval($value) <= floatval($mapping['value']));
|
||
|
|
||
|
break;
|
||
|
|
||
|
case VALUEMAP_MAPPING_TYPE_IN_RANGE:
|
||
|
if (!$match_numeric) {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
$ranges_parser = new CRangesParser(['with_minus' => true, 'with_float' => true, 'with_suffix' => true]);
|
||
|
|
||
|
if ($ranges_parser->parse($mapping['value']) == CParser::PARSE_SUCCESS) {
|
||
|
$value = floatval($value);
|
||
|
|
||
|
foreach ($ranges_parser->getRanges() as $ranges) {
|
||
|
if ($value == floatval($ranges[0])
|
||
|
|| (count($ranges) == 2 && $value >= floatval($ranges[0])
|
||
|
&& $value <= floatval($ranges[1]))) {
|
||
|
$result = true;
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case VALUEMAP_MAPPING_TYPE_REGEXP:
|
||
|
$result = (!$match_numeric
|
||
|
&& @preg_match('/'.str_replace('/', '\/', $mapping['value']).'/', $value) == 1);
|
||
|
|
||
|
break;
|
||
|
|
||
|
case VALUEMAP_MAPPING_TYPE_DEFAULT:
|
||
|
$result = true;
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return $result;
|
||
|
}
|
||
|
}
|