. * * @package LibreNMS * @link http://librenms.org * @copyright 2023 Tony Murray * @author Tony Murray */ namespace LibreNMS\Modules; use App\Models\Device; use App\Observers\ModuleModelObserver; use LibreNMS\Config; use LibreNMS\DB\SyncsModels; use LibreNMS\Interfaces\Data\DataStorageInterface; use LibreNMS\Interfaces\Discovery\VminfoDiscovery; use LibreNMS\Interfaces\Polling\VminfoPolling; use LibreNMS\OS; use LibreNMS\Polling\ModuleStatus; class Vminfo implements \LibreNMS\Interfaces\Module { use SyncsModels; /** * @inheritDoc */ public function dependencies(): array { return []; } public function shouldDiscover(OS $os, ModuleStatus $status): bool { // libvirt does not use snmp, only ssh tunnels if (! Config::get('enable_libvirt') && $os->getDevice()->snmp_disable) { return false; } return $status->isEnabled() && $os->getDevice()->status && $os instanceof VminfoDiscovery; } /** * @inheritDoc */ public function discover(OS $os): void { if ($os instanceof VminfoDiscovery) { $vms = $os->discoverVminfo(); ModuleModelObserver::observe(\App\Models\Vminfo::class); $this->syncModels($os->getDevice(), 'vminfo', $vms); } echo PHP_EOL; } public function shouldPoll(OS $os, ModuleStatus $status): bool { return $status->isEnabled() && ! $os->getDevice()->snmp_disable && $os->getDevice()->status && $os instanceof VminfoPolling; } /** * @inheritDoc */ public function poll(OS $os, DataStorageInterface $datastore): void { if ($os->getDevice()->vminfo->isEmpty()) { return; } if ($os instanceof VminfoPolling) { $vms = $os->pollVminfo($os->getDevice()->vminfo); ModuleModelObserver::observe(\App\Models\Vminfo::class); $this->syncModels($os->getDevice(), 'vminfo', $vms); return; } // just run discovery again $this->discover($os); } /** * @inheritDoc */ public function cleanup(Device $device): void { $device->vminfo()->delete(); } /** * @inheritDoc */ public function dump(Device $device) { return [ 'vminfo' => $device->vminfo()->orderBy('vmwVmVMID') ->get()->map->makeHidden(['id', 'device_id']), ]; } }