Remove load_os and load_discovery functions (#13345)

* Remove load_os and load_discovery functions
Put bits where they belong and use $os

* remove extra line return

* OS loading code in the wrong place

* fixes

* line
This commit is contained in:
Tony Murray
2021-10-08 14:04:11 -05:00
committed by GitHub
parent 4e94c1e0a1
commit 4bab6d7ed2
8 changed files with 63 additions and 88 deletions

View File

@@ -251,14 +251,15 @@ class Processor extends Model implements DiscoveryModule, PollerModule, Discover
public static function processYaml(OS $os)
{
$device = $os->getDeviceArray();
if (empty($device['dynamic_discovery']['modules']['processors'])) {
$discovery = $os->getDiscovery('processors');
if (empty($discovery)) {
d_echo("No YAML Discovery data.\n");
return [];
}
return YamlDiscovery::discover($os, get_class(), $device['dynamic_discovery']['modules']['processors']);
return YamlDiscovery::discover($os, get_class(), $discovery);
}
/**

View File

@@ -90,7 +90,7 @@ class YamlDiscovery
// determine numeric oid automatically if not specified
if (! isset($data['num_oid'])) {
try {
$data['num_oid'] = static::computeNumericalOID($device, $data);
$data['num_oid'] = static::computeNumericalOID($os, $data);
} catch (\Exception $e) {
d_echo('Error: We cannot find a numerical OID for ' . $data['value'] . '. Skipping this one...');
continue;
@@ -126,14 +126,16 @@ class YamlDiscovery
}
/**
* @param array $device Device we are working on
* @param \LibreNMS\OS $os OS/device we areworking on
* @param array $data Array derived from YAML
* @return string
*
* @throws \LibreNMS\Exceptions\InvalidOidException
*/
public static function computeNumericalOID($device, $data)
public static function computeNumericalOID(OS $os, array $data): string
{
d_echo('Info: Trying to find a numerical OID for ' . $data['value'] . '.');
$search_mib = $device['dynamic_discovery']['mib'];
$search_mib = $os->getDiscovery()['mib'];
$mib_prefix_data_oid = Str::before($data['oid'], '::');
if (! empty($mib_prefix_data_oid) && empty(Str::before($data['value'], '::'))) {
// We should search value in this mib first, as it is explicitely specified
@@ -141,7 +143,7 @@ class YamlDiscovery
}
try {
$num_oid = static::oidToNumeric($data['value'], $device, $search_mib, $device['mib_dir']);
$num_oid = static::oidToNumeric($data['value'], $os->getDeviceArray(), $search_mib);
} catch (\Exception $e) {
throw $e;
}
@@ -278,9 +280,9 @@ class YamlDiscovery
return $pre_cache;
}
if (! empty($device['dynamic_discovery']['modules'])) {
if (! empty($os->getDiscovery()['modules'])) {
echo 'Caching data: ';
foreach ($device['dynamic_discovery']['modules'] as $module => $discovery_data) {
foreach ($os->getDiscovery()['modules'] as $module => $discovery_data) {
echo "$module ";
foreach ($discovery_data as $key => $data_array) {
// find the data array, we could already be at for simple modules
@@ -309,7 +311,7 @@ class YamlDiscovery
Config::set('os.' . $os->getName() . '.snmp_bulk', (bool) $data['snmp_bulk']);
}
$mib = $device['dynamic_discovery']['mib'];
$mib = $os->getDiscovery()['mib'];
$pre_cache[$oid] = snmpwalk_cache_oid($device, $oid, $pre_cache[$oid] ?? [], $mib, null, $snmp_flag);
Config::set('os.' . $os->getName() . '.snmp_bulk', $saved_nobulk);
@@ -378,22 +380,21 @@ class YamlDiscovery
* @param string $oid
* @param array|null $device
* @param string $mib
* @param string|null $mibdir
* @return string numeric oid
*
* @throws \LibreNMS\Exceptions\InvalidOidException
*/
public static function oidToNumeric($oid, $device = null, $mib = 'ALL', $mibdir = null)
public static function oidToNumeric($oid, $device = null, $mib = 'ALL')
{
if (self::oidIsNumeric($oid)) {
return $oid;
}
$key = 'YamlDiscovery:oidToNumeric:' . $mibdir . '/' . $mib . '/' . $oid;
$key = 'YamlDiscovery:oidToNumeric:' . $mib . '/' . $oid;
if (Cache::has($key)) {
$numeric_oid = Cache::get($key);
} else {
foreach (explode(':', $mib) as $mib_name) {
$numeric_oid = snmp_translate($oid, $mib_name, $mibdir, null, $device);
$numeric_oid = snmp_translate($oid, $mib_name, null, null, $device);
if ($numeric_oid) {
break;
}

View File

@@ -203,23 +203,33 @@ class OS implements ProcessorDiscovery, OSDiscovery, MempoolsDiscovery
*/
public static function make(&$device)
{
$class = str_to_class($device['os'], 'LibreNMS\\OS\\');
d_echo('Attempting to initialize OS: ' . $device['os'] . PHP_EOL);
if (class_exists($class)) {
d_echo("OS initialized: $class\n");
if (isset($device['os'])) {
// load os definition and populate os_group
\LibreNMS\Util\OS::loadDefinition($device['os']);
if ($os_group = Config::get("os.{$device['os']}.group")) {
$device['os_group'] = $os_group;
} else {
unset($device['os_group']);
}
return new $class($device);
}
// If not a specific OS, check for a group one.
if (isset($device['os_group'])) {
$class = str_to_class($device['os_group'], 'LibreNMS\\OS\\Shared\\');
d_echo('Attempting to initialize OS: ' . $device['os_group'] . PHP_EOL);
$class = str_to_class($device['os'], 'LibreNMS\\OS\\');
d_echo('Attempting to initialize OS: ' . $device['os'] . PHP_EOL);
if (class_exists($class)) {
d_echo("OS initialized: $class\n");
return new $class($device);
}
// If not a specific OS, check for a group one.
if ($os_group) {
$class = str_to_class($device['os_group'], 'LibreNMS\\OS\\Shared\\');
d_echo('Attempting to initialize OS: ' . $device['os_group'] . PHP_EOL);
if (class_exists($class)) {
d_echo("OS initialized: $class\n");
return new $class($device);
}
}
}
d_echo("OS initialized as Generic\n");

View File

@@ -959,38 +959,6 @@ function get_sql_filter_min_severity($min_severity, $alert_rules_name)
return '';
}
/**
* Load the os definition for the device and set type and os_group
* $device['os'] must be set
*
* @param array $device
*/
function load_os(&$device)
{
if (! isset($device['os'])) {
d_echo("No OS to load\n");
return;
}
\LibreNMS\Util\OS::loadDefinition($device['os']);
// Set type to a predefined type for the OS if it's not already set
$loaded_os_type = Config::get("os.{$device['os']}.type");
$model = DeviceCache::get($device['device_id']);
if (! $model->getAttrib('override_device_type') && $loaded_os_type != $model->type) {
$model->type = $loaded_os_type;
$model->save();
Log::debug("Device type changed to $loaded_os_type!");
}
if ($os_group = Config::get("os.{$device['os']}.group")) {
$device['os_group'] = $os_group;
} else {
unset($device['os_group']);
}
}
/**
* Converts fahrenheit to celsius (with 2 decimal places)
* if $scale is not fahrenheit, it assumes celsius and returns the value

View File

@@ -28,9 +28,15 @@ if ($deviceModel->isDirty('os')) {
echo 'Changed ';
}
// Set type to a predefined type for the OS if it's not already set
$loaded_os_type = Config::get("os.{$device['os']}.type");
if (! $deviceModel->getAttrib('override_device_type') && $loaded_os_type != $deviceModel->type) {
$deviceModel->type = $loaded_os_type;
Log::debug("Device type changed to $loaded_os_type!");
}
$deviceModel->save();
load_os($device);
load_discovery($device);
$os = OS::make($device);
echo 'OS: ' . Config::getOsSetting($device['os'], 'text') . " ({$device['os']})\n\n";

View File

@@ -17,6 +17,7 @@ use LibreNMS\Config;
use LibreNMS\Device\YamlDiscovery;
use LibreNMS\Exceptions\HostExistsException;
use LibreNMS\Exceptions\InvalidIpException;
use LibreNMS\OS;
use LibreNMS\Util\IP;
use LibreNMS\Util\IPv6;
@@ -100,21 +101,6 @@ function discover_new_device($hostname, $device = [], $method = '', $interface =
}
//end discover_new_device()
/**
* @param $device
*/
function load_discovery(&$device)
{
$yaml_discovery = Config::get('install_dir') . '/includes/definitions/discovery/' . $device['os'] . '.yaml';
if (file_exists($yaml_discovery)) {
$device['dynamic_discovery'] = Symfony\Component\Yaml\Yaml::parse(
file_get_contents($yaml_discovery)
);
} else {
unset($device['dynamic_discovery']);
}
}
/**
* @param array $device The device to poll
* @param bool $force_module Ignore device module overrides
@@ -862,22 +848,25 @@ function ignore_storage($os, $descr)
/**
* @param $valid
* @param $device
* @param OS $os
* @param $sensor_type
* @param $pre_cache
*/
function discovery_process(&$valid, $device, $sensor_class, $pre_cache)
function discovery_process(&$valid, $os, $sensor_class, $pre_cache)
{
if (! empty($device['dynamic_discovery']['modules']['sensors'][$sensor_class]) && ! can_skip_sensor($device, $sensor_class, '')) {
$discovery = $os->getDiscovery('sensors');
$device = $os->getDeviceArray();
if (! empty($discovery[$sensor_class]) && ! can_skip_sensor($device, $sensor_class, '')) {
$sensor_options = [];
if (isset($device['dynamic_discovery']['modules']['sensors'][$sensor_class]['options'])) {
$sensor_options = $device['dynamic_discovery']['modules']['sensors'][$sensor_class]['options'];
if (isset($discovery[$sensor_class]['options'])) {
$sensor_options = $discovery[$sensor_class]['options'];
}
d_echo("Dynamic Discovery ($sensor_class): ");
d_echo($device['dynamic_discovery']['modules']['sensors'][$sensor_class]);
d_echo($discovery[$sensor_class]);
foreach ($device['dynamic_discovery']['modules']['sensors'][$sensor_class]['data'] as $data) {
foreach ($discovery[$sensor_class]['data'] as $data) {
$tmp_name = $data['oid'];
$raw_data = (array) $pre_cache[$tmp_name];
@@ -921,7 +910,7 @@ function discovery_process(&$valid, $device, $sensor_class, $pre_cache)
// Check if we have a "num_oid" value. If not, we'll try to compute it from textual OIDs with snmptranslate.
if (empty($data['num_oid'])) {
try {
$data['num_oid'] = YamlDiscovery::computeNumericalOID($device, $data);
$data['num_oid'] = YamlDiscovery::computeNumericalOID($os, $data);
} catch (\Exception $e) {
d_echo('Error: We cannot find a numerical OID for ' . $data['value'] . '. Skipping this one...');
$skippedFromYaml = true;
@@ -994,11 +983,12 @@ function discovery_process(&$valid, $device, $sensor_class, $pre_cache)
/**
* @param $types
* @param $device
* @param OS $os
* @param array $pre_cache
*/
function sensors($types, $device, $valid, $pre_cache = [])
function sensors($types, $os, $valid, $pre_cache = [])
{
$device = &$os->getDeviceArray();
foreach ((array) $types as $sensor_class) {
echo ucfirst($sensor_class) . ': ';
$dir = Config::get('install_dir') . '/includes/discovery/sensors/' . $sensor_class . '/';
@@ -1014,7 +1004,7 @@ function sensors($types, $device, $valid, $pre_cache = [])
include $dir . '/rfc1628.inc.php';
}
}
discovery_process($valid, $device, $sensor_class, $pre_cache);
discovery_process($valid, $os, $sensor_class, $pre_cache);
d_echo($valid['sensor'][$sensor_class] ?? []);
check_valid_sensors($device, $sensor_class, $valid['sensor']);
echo "\n";

View File

@@ -80,7 +80,7 @@ $run_sensors = [
// filter submodules
$run_sensors = array_intersect($run_sensors, Config::get('discovery_submodules.sensors', $run_sensors));
sensors($run_sensors, $device, $valid, $pre_cache);
sensors($run_sensors, $os, $valid, $pre_cache);
unset(
$pre_cache,
$run_sensors,

View File

@@ -240,7 +240,6 @@ function poll_device($device, $force_module = false)
$attribs = $deviceModel->getAttribs();
$device['attribs'] = $attribs;
load_os($device);
$os = \LibreNMS\OS::make($device);
unset($array);