Files
librenms-librenms/LibreNMS/Modules/Stp.php
Tony Murray 29bd6789cb Stp module rewrite (#13570)
* STP module rewrite WIP

* Finish rewrite

* Ignore disabled and log root/topology changes

* Remove interfaces for now

* fix style

* Lint fixes

* Document ResolvesPortIds and hide map functions

* whitespace fixes

* Revert to stpInstances in case someone writes mstp support

* missed one

* phpstan fixes

* Handle table and oids separately

* forgot to register observer

* Test data and correct non-table handling in SnmpResponse->table()

* update test

* test data

* revert aos7 silly things

* minimal polling

* Update test data

* order ports_ntp and rename new field to port_index

* forgot the db_schema

* revert ciena-sds port things

* MSTP support, maybe

* Adding test data

* Filter bad lines instead of discarding the entire snmp response
and capture fixes and test data

* fresh data

* add os data

* update data, ignore unfound ports, obviously bad device implementation.

* fixes

* Ignore context files in os detection test

* Remove empty table data

* add ciena-sds vlan

* designatedCost column is too small

* Update stp webui

* Refactor code to interfaces, to allow vendor mibs

* update schema

* fix issues added by abstraction

* STP fixes

* Default to no context for vlan 1

* never store vlan 1

* Update test data

* remove eltex brokenness

* fix style

* fix stan

* Fix Rewrite MAC to Hex padding with floats

* fix sqlite migration
2022-01-30 16:28:18 -06:00

111 lines
3.5 KiB
PHP

<?php
/*
* Stp.php
*
* Spanning Tree
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @package LibreNMS
* @link http://librenms.org
* @copyright 2021 Tony Murray
* @author Tony Murray <murraytony@gmail.com>
*/
namespace LibreNMS\Modules;
use App\Models\PortStp;
use App\Observers\ModuleModelObserver;
use LibreNMS\DB\SyncsModels;
use LibreNMS\Interfaces\Discovery\StpInstanceDiscovery;
use LibreNMS\Interfaces\Discovery\StpPortDiscovery;
use LibreNMS\Interfaces\Module;
use LibreNMS\Interfaces\Polling\StpInstancePolling;
use LibreNMS\Interfaces\Polling\StpPortPolling;
use LibreNMS\OS;
class Stp implements Module
{
use SyncsModels;
public function discover(OS $os): void
{
$device = $os->getDevice();
if ($os instanceof StpInstanceDiscovery) {
echo 'Instances: ';
$instances = $os->discoverStpInstances();
ModuleModelObserver::observe(\App\Models\Stp::class);
$this->syncModels($device, 'stpInstances', $instances);
if ($os instanceof StpPortDiscovery) {
echo "\nPorts: ";
$ports = $os->discoverStpPorts($instances);
ModuleModelObserver::observe(PortStp::class);
$this->syncModels($device, 'stpPorts', $ports);
}
echo PHP_EOL;
}
}
public function poll(OS $os): void
{
$device = $os->getDevice();
if ($os instanceof StpInstancePolling) {
echo 'Instances: ';
$instances = $device->stpInstances;
$instances = $os->pollStpInstances($instances);
ModuleModelObserver::observe(\App\Models\Stp::class);
$this->syncModels($device, 'stpInstances', $instances);
}
if ($os instanceof StpPortPolling) {
echo "\nPorts: ";
$ports = $device->stpPorts;
ModuleModelObserver::observe(PortStp::class);
$this->syncModels($device, 'stpPorts', $ports);
}
}
public function cleanup(OS $os): void
{
$os->getDevice()->stpInstances()->delete();
$os->getDevice()->stpPorts()->delete();
}
/**
* designated root is stored in format 2 octet bridge priority + MAC address, so we need to normalize it
*/
public function rootToMac(string $root): string
{
$dr = str_replace(['.', ' ', ':', '-'], '', strtolower($root));
return substr($dr, -12); //remove first two octets
}
public function designatedPort(string $dp): int
{
if (preg_match('/-(\d+)/', $dp, $matches)) {
// Syntax with "priority" dash "portID" like so : 32768-54, both in decimal
return (int) $matches[1];
}
// Port saved in format priority+port (ieee 802.1d-1998: clause 8.5.5.1)
$dp = substr($dp, -2); //discard the first octet (priority part)
return (int) hexdec($dp);
}
}