Poll device job (#16306)

* Split out single device polling to a Laravel Job
Probably totally broken :)

* Add dispatch option to device:poll

* Fix up submodules

* Add missing logger parameter

* Apply fixes from StyleCI

* Update module format in test helper

* Apply fixes from StyleCI

* Use Log facade to match other code

---------

Co-authored-by: Tony Murray <murrant@users.noreply.github.com>
This commit is contained in:
Tony Murray
2024-08-25 19:56:50 -05:00
committed by GitHub
parent 2face4bc4a
commit db5fdf705d
5 changed files with 354 additions and 340 deletions

View File

@@ -34,7 +34,11 @@ class Module
{
public static function exists(string $module_name): bool
{
return class_exists(StringHelpers::toClass($module_name, '\\LibreNMS\\Modules\\'));
if (class_exists(StringHelpers::toClass($module_name, '\\LibreNMS\\Modules\\'))) {
return true;
}
return Config::has('discovery_modules.' . $module_name) || Config::has('poller_modules.' . $module_name);
}
public static function fromName(string $module_name): \LibreNMS\Interfaces\Module
@@ -57,10 +61,27 @@ class Module
public static function pollingStatus(string $module_name, Device $device, ?bool $manual = null): ModuleStatus
{
return new ModuleStatus(
Config::get("poller_modules.$module_name"),
Config::get("poller_modules.$module_name", false),
Config::get("os.{$device->os}.poller_modules.$module_name"),
$device->getAttrib("poll_$module_name"),
$manual,
);
}
public static function parseUserOverrides(array $overrides): array
{
$modules = [];
foreach ($overrides as $index => $module) {
// parse submodules (only supported by some modules)
if (str_contains($module, '/')) {
[$module, $submodule] = explode('/', $module, 2);
$modules[$module][] = $submodule;
} elseif (self::exists($module)) {
$modules[$module] = true;
}
}
return $modules;
}
}

View File

@@ -26,6 +26,7 @@
namespace LibreNMS\Util;
use App\Actions\Device\ValidateDeviceAndCreate;
use App\Jobs\PollDevice;
use App\Models\Device;
use DeviceCache;
use Illuminate\Database\Eloquent\Model;
@@ -35,7 +36,6 @@ use LibreNMS\Config;
use LibreNMS\Data\Source\SnmpResponse;
use LibreNMS\Exceptions\FileNotFoundException;
use LibreNMS\Exceptions\InvalidModuleException;
use LibreNMS\Poller;
class ModuleTestHelper
{
@@ -178,8 +178,7 @@ class ModuleTestHelper
Debug::set();
Debug::setVerbose();
discover_device($device, $this->parseArgs('discovery'));
$poller = app(Poller::class, ['device_spec' => $device_id, 'module_override' => $this->modules]);
$poller->poll();
(new PollDevice($device_id, $this->modules))->handle();
Debug::set($save_debug);
Debug::setVerbose($save_vdebug);
$collection_output = ob_get_contents();
@@ -312,7 +311,7 @@ class ModuleTestHelper
* Probably needs to be more robust
*
* @param array $modules
* @return array
* @return array<string, bool|string[]>
*
* @throws InvalidModuleException
*/
@@ -320,17 +319,22 @@ class ModuleTestHelper
{
// generate a full list of modules
$full_list = [];
foreach ($modules as $module) {
foreach ($modules as $index => $module) {
$module = is_string($index) ? $index : $module;
// only allow valid modules
if (! (Config::has("poller_modules.$module") || Config::has("discovery_modules.$module"))) {
if (! Module::exists($module)) {
throw new InvalidModuleException("Invalid module name: $module");
}
$full_list = array_merge($full_list, Module::fromName($module)->dependencies());
$full_list[] = $module;
foreach (Module::fromName($module)->dependencies() as $dependency) {
$full_list[$dependency] = true;
}
$full_list[$module] = true;
}
return array_unique($full_list);
return $full_list;
}
private function parseArgs($type)
@@ -339,7 +343,7 @@ class ModuleTestHelper
return false;
}
return parse_modules($type, ['m' => implode(',', $this->modules)]);
return parse_modules($type, ['m' => implode(',', array_keys($this->modules))]);
}
private function qPrint($var)
@@ -627,8 +631,7 @@ class ModuleTestHelper
ob_start();
\Log::setDefaultDriver('console');
$poller = app(Poller::class, ['device_spec' => $device_id, 'module_override' => $this->modules]);
$poller->poll();
(new PollDevice($device_id, $this->modules))->handle();
$this->poller_output = ob_get_contents();
if ($this->quiet) {