From 926d8203053a208705f27b33fb5110c6648a5037 Mon Sep 17 00:00:00 2001 From: Johan Cwiklinski Date: Tue, 6 Feb 2024 10:32:06 +0100 Subject: [PATCH] Convert memory with unit to proper int --- lib/php/Converter.php | 97 +++++++++++++++++-- .../Glpi/Inventory/tests/units/Converter.php | 38 ++++++++ tests/data/1.xml | 2 +- 3 files changed, 126 insertions(+), 11 deletions(-) diff --git a/lib/php/Converter.php b/lib/php/Converter.php index e70b570..6e91274 100644 --- a/lib/php/Converter.php +++ b/lib/php/Converter.php @@ -420,8 +420,6 @@ private function convertTo01(array $data): array 'drives/free', 'drives/total', 'hardware/etime', - 'hardware/memory', - 'hardware/swap', 'storages/disksize', 'physical_volumes/free', 'physical_volumes/pe_size', @@ -433,16 +431,12 @@ private function convertTo01(array $data): array 'volume_groups/size', 'logical_volumes/seg_count', 'logical_volumes/size', - 'memories/capacity', 'memories/numslots', 'processes/pid', 'processes/virtualmemory', 'networks/mtu', 'softwares/filesize', - 'virtualmachines/memory', 'virtualmachines/vcpu', - 'videos/memory', - 'batteries/real_capacity', 'network_ports/ifinerrors', 'network_ports/ifinoctets', 'network_ports/ifinbytes', @@ -458,8 +452,6 @@ private function convertTo01(array $data): array 'network_ports/iftype', 'network_components/fru', 'network_components/index', - 'network_device/ram', - 'network_device/memory', 'network_device/credentials', 'pagecounters/total', 'pagecounters/black', @@ -845,7 +837,6 @@ private function convertTo01(array $data): array } } - //Fix batteries capacities & voltages if (isset($data['content']['batteries'])) { foreach ($data['content']['batteries'] as &$battery) { @@ -890,7 +881,6 @@ private function convertTo01(array $data): array } } - //type on ports is required if (isset($data['content']['ports'])) { foreach ($data['content']['ports'] as &$port) { @@ -917,6 +907,45 @@ private function convertTo01(array $data): array } } + //fix memories that can have a unit + if (isset($data['content']['hardware']['memory'])) { + $data['content']['hardware']['memory'] = $this->convertMemory($data['content']['hardware']['memory']); + } + if (isset($data['content']['hardware']['swap'])) { + $data['content']['hardware']['swap'] = $this->convertMemory($data['content']['hardware']['swap']); + } + if (isset($data['content']['memories'])) { + foreach ($data['content']['memories'] as &$memory) { + if (isset($memory['capacity'])) { + $memory['capacity'] = $this->convertMemory($memory['capacity']); + } + } + } + if (isset($data['content']['videos'])) { + foreach ($data['content']['videos'] as &$video) { + if (isset($video['memory'])) { + $video['memory'] = $this->convertMemory($video['memory']); + } + } + } + if (isset($data['content']['virtualmachines'])) { + foreach ($data['content']['virtualmachines'] as &$vm) { + if (isset($vm['memory'])) { + $vm['memory'] = $this->convertMemory($vm['memory']); + } + } + } + if (isset($data['content']['network_device'])) { + foreach ($data['content']['network_device'] as &$netdev) { + if (isset($netdev['memory'])) { + $netdev['memory'] = $this->convertMemory($netdev['memory']); + } + if (isset($netdev['ram'])) { + $netdev['ram'] = $this->convertMemory($netdev['ram']); + } + } + } + //no longer existing $drops = [ 'registry', @@ -1317,6 +1346,54 @@ public function convertBatteryVoltage(string $voltage) return false; } + /** + * Convert memory capacity + * + * @param string $capacity Inventoried capacity + * + * @return ?integer + */ + public function convertMemory(string $capacity) + { + if (is_int($casted_capa = $this->getCastedValue($capacity, 'integer'))) { + return $casted_capa; + } + + $mem_pattern = "/^([0-9]+([\.|,][0-9])?) ?(.?B)$/i"; + + $matches = []; + if (preg_match($mem_pattern, $capacity, $matches)) { + //we got a memory with a unit. first, convert to bytes + $real_value = $this->getCastedValue($matches[1], 'integer'); + switch (strtolower($matches[3])) { + case 'pb': + $real_value *= 1024; + //no break, continue to next + case 'tb': + $real_value *= 1024; + //no break, continue to next + case 'gb': + $real_value *= 1024; + //no break, continue to next + case 'mb': + $real_value *= 1024; + //no break, continue to next + case 'kb': + $real_value *= 1024; + //no break, continue to next + case 'b': + break; + default: + return null; + } + + //then return as Mb. + return $real_value / 1024 / 1024; + } + + return null; + } + /** * Handle network inventory XML format * diff --git a/tests/Glpi/Inventory/tests/units/Converter.php b/tests/Glpi/Inventory/tests/units/Converter.php index 1f78eb1..218bc2a 100644 --- a/tests/Glpi/Inventory/tests/units/Converter.php +++ b/tests/Glpi/Inventory/tests/units/Converter.php @@ -887,4 +887,42 @@ public function testAssetTagFromInventory() ); $this->assertCount(1, $json->content->network_ports); } + + /** + * Memory capacities convert provider + * + * @return array + */ + public static function memoryCapasToConvertProvider() + { + return [ + ['2048', 2048], + ['2048Mb', 2048], + ['2048MB', 2048], + ['2048 Mb', 2048], + ['2097152Kb', 2048], + ['2147483648b', 2048], + ['2.0Gb', 2048], + ['5Tb', 5242880], + ['3Pb', 3221225472] + ]; + } + + /** + * Test memory capacity conversion + * + * @dataProvider memoryCapasToConvertProvider + * + * @param string $orig Original data + * @param string $expected Expected result + * + * @return void + */ + public function testConvertMemoryCapacity($orig, $expected) + { + $instance = new \Glpi\Inventory\Converter(); + $this->assertSame($expected, $instance->convertMemory($orig)); + } + + } diff --git a/tests/data/1.xml b/tests/data/1.xml index c95bfe6..ecd4683 100644 --- a/tests/data/1.xml +++ b/tests/data/1.xml @@ -1713,7 +1713,7 @@ libvirt - 4194 + 4194MB win8.1 off kvm