From a93bb6635ddd070e185d12837decb7a61487c1db Mon Sep 17 00:00:00 2001 From: Tony Murray Date: Sat, 28 Oct 2017 05:53:05 -0500 Subject: [PATCH] refactor: Use one snmpget during os discovery (#7566) Use only one snmpget to fetch sysObjectId and sysDescr fix multiline data in snmp_get_multi_oid() add snmp_get_multi_oid() to mock.snmp.inc.php --- includes/functions.php | 13 +++++++------ includes/snmp.inc.php | 20 +++++++++++++++----- tests/mocks/mock.snmp.inc.php | 30 ++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/includes/functions.php b/includes/functions.php index 206216d91e..5853944793 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -95,17 +95,18 @@ function getHostOS($device) { global $config; + $res = snmp_get_multi_oid($device, array('SNMPv2-MIB::sysDescr.0', 'SNMPv2-MIB::sysObjectID.0')); + $sysDescr = isset($res['.1.3.6.1.2.1.1.1.0']) ? $res['.1.3.6.1.2.1.1.1.0'] : ''; + $sysObjectId = isset($res['.1.3.6.1.2.1.1.2.0']) ? $res['.1.3.6.1.2.1.1.2.0'] : ''; + + d_echo("| $sysDescr | $sysObjectId | \n"); + $deferred_os = array( 'freebsd', 'linux', 'ibmtl' //only has snmpget check ); - - $sysDescr = snmp_get($device, "SNMPv2-MIB::sysDescr.0", "-Ovq"); - $sysObjectId = snmp_get($device, "SNMPv2-MIB::sysObjectID.0", "-Ovqn"); - - d_echo("| $sysDescr | $sysObjectId | \n"); - + // check yaml files $os_defs = Config::get('os'); foreach ($os_defs as $os => $def) { diff --git a/includes/snmp.inc.php b/includes/snmp.inc.php index 66ec195a60..9cd87d8551 100644 --- a/includes/snmp.inc.php +++ b/includes/snmp.inc.php @@ -231,12 +231,22 @@ function snmp_get_multi_oid($device, $oids, $options = '-OUQn', $mib = null, $mi $data = trim(external_exec($cmd)); $array = array(); + $oid = ''; foreach (explode("\n", $data) as $entry) { - list($oid,$value) = explode('=', $entry, 2); - $oid = trim($oid); - $value = trim($value, "\" \n\r"); - if (!strstr($value, 'at this OID') && isset($oid)) { - $array[$oid] = $value; + if (str_contains($entry, '=')) { + list($oid,$value) = explode('=', $entry, 2); + $oid = trim($oid); + $value = trim($value, "\" \n\r"); + if (!strstr($value, 'at this OID') && isset($oid)) { + $array[$oid] = $value; + } + } else { + if (isset($array[$oid])) { + // if appending, add a line return + $array[$oid] .= PHP_EOL . $entry; + } else { + $array[$oid] = $entry; + } } } diff --git a/tests/mocks/mock.snmp.inc.php b/tests/mocks/mock.snmp.inc.php index 9bc93f4e5a..d102c4db51 100644 --- a/tests/mocks/mock.snmp.inc.php +++ b/tests/mocks/mock.snmp.inc.php @@ -227,6 +227,36 @@ function snmp_get($device, $oid, $options = null, $mib = null, $mibdir = null) } } + +function snmp_get_multi_oid($device, $oids, $options = '-OUQn', $mib = null, $mibdir = null) +{ + if (!is_array($oids)) { + $oids = explode(' ', $oids); + } + + $data = array(); + foreach ($oids as $index => $oid) { + if (str_contains($options, 'n')) { + $oid_name = '.' . snmp_translate_number($oid, $mib, $mibdir); + $val = snmp_get($device, $oid_name, $options, $mib, $mibdir); + } elseif (str_contains($options, 's') + && str_contains($oid, '::')) { + $tmp = explode('::', $oid); + $oid_name = $tmp[1]; + $val = snmp_get($device, $oid, $options, $mib, $mibdir); + } else { + $oid_name = $oid; + $val = snmp_get($device, $oid, $options, $mib, $mibdir); + } + + if ($val !== false) { + $data[$oid_name] = $val; + } + } + + return $data; +} + function snmp_walk($device, $oid, $options = null, $mib = null, $mibdir = null) { $community = $device['community'];