Refactor MAC utilities into a single class (#15379)

* Refactor MAC utils to a new utility class

* Apply fixes from StyleCI

* Inline functions
Add tests
Handle bridgeid format

* Apply fixes from StyleCI

* Dedicated code path for stp bridge parsing, and improve STP output a bit

* Correctly parse dot1dBaseBridgeAddress and don't store int in bool field

* trim any unexpected character from bridge addresses, add extra test data.

* better comment

* barsBridge can handle dot1dBaseBridgeAddress correctly now

* parseBridge, check for properly formatted mac first.

* update test data, empty data = empty mac

* Fix new usage after rebase

* import

---------

Co-authored-by: StyleCI Bot <bot@styleci.io>
This commit is contained in:
Tony Murray
2023-10-06 07:34:14 -05:00
committed by GitHub
parent 908aef6596
commit d8c372bbf4
36 changed files with 340 additions and 264 deletions

View File

@@ -42,8 +42,8 @@ use LibreNMS\Exceptions\InvalidTableColumnException;
use LibreNMS\Util\Graph;
use LibreNMS\Util\IP;
use LibreNMS\Util\IPv4;
use LibreNMS\Util\Mac;
use LibreNMS\Util\Number;
use LibreNMS\Util\Rewrite;
function api_success($result, $result_name, $message = null, $code = 200, $count = null, $extra = null): JsonResponse
{
@@ -2460,30 +2460,23 @@ function list_fdb(Illuminate\Http\Request $request)
function list_fdb_detail(Illuminate\Http\Request $request)
{
$macAddress = Rewrite::macToHex((string) $request->route('mac'));
$macAddress = Mac::parse($request->route('mac'));
$rules = [
'macAddress' => 'required|string|regex:/^[0-9a-fA-F]{12}$/',
];
$validate = Validator::make(['macAddress' => $macAddress], $rules);
if ($validate->fails()) {
return api_error(422, $validate->messages());
if (! $macAddress->isValid()) {
return api_error(422, 'Invalid MAC address');
}
$extras = ['mac' => Rewrite::readableMac($macAddress), 'mac_oui' => Rewrite::readableOUI($macAddress)];
$extras = ['mac' => $macAddress->readable(), 'mac_oui' => $macAddress->vendor()];
$fdb = PortsFdb::hasAccess(Auth::user())
->when(! empty($macAddress), function (Builder $query) use ($macAddress) {
return $query->leftJoin('ports', 'ports_fdb.port_id', 'ports.port_id')
->leftJoin('devices', 'ports_fdb.device_id', 'devices.device_id')
->where('mac_address', $macAddress)
->orderBy('ports_fdb.updated_at', 'desc')
->select('devices.hostname', 'ports.ifName', 'ports_fdb.updated_at');
})
->limit(1000)->get();
->leftJoin('ports', 'ports_fdb.port_id', 'ports.port_id')
->leftJoin('devices', 'ports_fdb.device_id', 'devices.device_id')
->where('mac_address', $macAddress->hex())
->orderBy('ports_fdb.updated_at', 'desc')
->select('devices.hostname', 'ports.ifName', 'ports_fdb.updated_at')
->limit(1000)->get();
if (count($fdb) == 0) {
if ($fdb->isEmpty()) {
return api_error(404, 'Fdb entry does not exist');
}
@@ -2558,7 +2551,7 @@ function list_arp(Illuminate\Http\Request $request)
return api_error(400, 'Invalid Network Address');
}
} elseif (filter_var($query, FILTER_VALIDATE_MAC)) {
$mac = \LibreNMS\Util\Rewrite::macToHex($query);
$mac = Mac::parse($query)->hex();
$arp = dbFetchRows('SELECT * FROM `ipv4_mac` WHERE `mac_address`=?', [$mac]);
} else {
$arp = dbFetchRows('SELECT * FROM `ipv4_mac` WHERE `ipv4_address`=?', [$query]);
@@ -2967,7 +2960,7 @@ function del_service_from_host(Illuminate\Http\Request $request)
function search_by_mac(Illuminate\Http\Request $request)
{
$macAddress = Rewrite::macToHex((string) $request->route('search'));
$macAddress = Mac::parse((string) $request->route('search'))->hex();
$rules = [
'macAddress' => 'required|string|regex:/^[0-9a-fA-F]{12}$/',