#1111 Support for OUI28/MA-M and OUI36/MA-S

* new oui importer using IEEE csv for MA-L+M+S

* schema update for new vendor table

* change vendor to manufacturer because Device has a vendor field

* remove oui from manuf table, and update node oui after manuf update

* faster way to bulk update node oui

* switch from using oui table to manufacturer table for vendor lookup

* some other oui cleanup

* faster/scalable way to join a macaddr to manuf table

* remove device.oui support

* update node oui in bulk at end of macsuck run

* correct literal sql instead of bind

* more efficient to get oui base for each mac

* comment better the base lookup in macsuck
This commit is contained in:
Oliver Gorwits
2023-11-14 18:55:54 +00:00
committed by GitHub
parent 7766ce64d1
commit 534a9d9378
26 changed files with 427 additions and 193 deletions

View File

@@ -174,7 +174,7 @@ get '/ajax/content/device/ports' => require_login sub {
if param('n_netbios');
# retrieve vendor, if asked for
$set = $set->search({}, { prefetch => [{$nodes_name => 'oui'}] })
$set = $set->search({}, { prefetch => [{$nodes_name => 'manufacturer'}] })
if param('n_vendor');
}

View File

@@ -88,11 +88,11 @@ get '/ajax/content/report/ipinventory' => require_login sub {
my $rs2 = schema(vars->{'tenant'})->resultset('NodeIp')->search(
undef,
{ join => ['oui', 'netbios'],
{ join => ['manufacturer', 'netbios'],
columns => [qw( ip mac time_first time_last dns active)],
'+select' => [ \'true AS node',
\qq/replace( date_trunc( 'minute', age( LOCALTIMESTAMP, me.time_last ) ) ::text, 'mon', 'month') AS age/,
'oui.company',
'manufacturer.company',
'netbios.nbname',
],
'+as' => [ 'node', 'age', 'vendor', 'nbname' ],
@@ -101,14 +101,14 @@ get '/ajax/content/report/ipinventory' => require_login sub {
my $rs3 = schema(vars->{'tenant'})->resultset('NodeNbt')->search(
undef,
{ join => ['oui'],
{ join => ['manufacturer'],
columns => [qw( ip mac time_first time_last )],
'+select' => [
\'null AS dns',
'active',
\'true AS node',
\qq/replace( date_trunc( 'minute', age( LOCALTIMESTAMP, time_last ) ) ::text, 'mon', 'month') AS age/,
'oui.company',
'manufacturer.company',
'nbname'
],
'+as' => [ 'dns', 'active', 'node', 'age', 'vendor', 'nbname' ],

View File

@@ -19,15 +19,15 @@ get '/ajax/content/report/nodemultiips' => require_login sub {
my @results = schema(vars->{'tenant'})->resultset('Node')->search(
{},
{ select => [ 'mac', 'switch', 'port' ],
join => [qw/device ips oui/],
join => [qw/device ips manufacturer/],
'+columns' => [
{ 'dns' => 'device.dns' },
{ 'name' => 'device.name' },
{ 'ip_count' => { count => 'ips.ip' } },
{ 'vendor' => 'oui.company' }
{ 'vendor' => 'manufacturer.company' }
],
group_by => [
qw/ me.mac me.switch me.port device.dns device.name oui.company/
qw/ me.mac me.switch me.port device.dns device.name manufacturer.company/
],
having => \[ 'count(ips.ip) > ?', [ count => 1 ] ],
order_by => { -desc => [qw/count/] },

View File

@@ -46,9 +46,9 @@ get '/ajax/content/report/nodevendor/data' => require_login sub {
my $match = $vendor eq 'blank' ? undef : $vendor;
$rs = $rs->search( { 'oui.abbrev' => $match },
{ '+columns' => [qw/ device.dns device.name oui.abbrev oui.company /],
join => [qw/ oui device /],
$rs = $rs->search( { 'manufacturer.abbrev' => $match },
{ '+columns' => [qw/ device.dns device.name manufacturer.abbrev manufacturer.company /],
join => [qw/ manufacturer device /],
collapse => 1,
});
@@ -85,9 +85,9 @@ get '/ajax/content/report/nodevendor' => require_login sub {
my $match = $vendor eq 'blank' ? undef : $vendor;
$rs = $rs->search( { 'oui.abbrev' => $match },
{ '+columns' => [qw/ device.dns device.name oui.abbrev oui.company /],
join => [qw/ oui device /],
$rs = $rs->search( { 'manufacturer.abbrev' => $match },
{ '+columns' => [qw/ device.dns device.name manufacturer.abbrev manufacturer.company /],
join => [qw/ manufacturer device /],
collapse => 1,
});
@@ -101,10 +101,10 @@ get '/ajax/content/report/nodevendor' => require_login sub {
elsif ( !defined $vendor ) {
$rs = $rs->search(
{ },
{ join => 'oui',
select => [ 'oui.abbrev', 'oui.company', { count => {distinct => 'me.mac'}} ],
{ join => 'manufacturer',
select => [ 'manufacturer.abbrev', 'manufacturer.company', { count => {distinct => 'me.mac'}} ],
as => [qw/ abbrev vendor count /],
group_by => [qw/ oui.abbrev oui.company /]
group_by => [qw/ manufacturer.abbrev manufacturer.company /]
}
)->order_by( { -desc => 'count' } );

View File

@@ -148,36 +148,36 @@ get '/ajax/content/search/node' => require_login sub {
->search({-and => [@where_mac, @active, @times]}, {
order_by => {'-desc' => 'time_last'},
'+columns' => [
'oui.company',
'oui.abbrev',
'manufacturer.company',
'manufacturer.abbrev',
{ time_first_stamp => \"to_char(time_first, 'YYYY-MM-DD HH24:MI')" },
{ time_last_stamp => \"to_char(time_last, 'YYYY-MM-DD HH24:MI')" },
],
join => 'oui'
join => 'manufacturer'
});
my $netbios = schema(vars->{'tenant'})->resultset('NodeNbt')
->search({-and => [@where_mac, @active, @times]}, {
order_by => {'-desc' => 'time_last'},
'+columns' => [
'oui.company',
'oui.abbrev',
'manufacturer.company',
'manufacturer.abbrev',
{ time_first_stamp => \"to_char(time_first, 'YYYY-MM-DD HH24:MI')" },
{ time_last_stamp => \"to_char(time_last, 'YYYY-MM-DD HH24:MI')" },
],
join => 'oui'
join => 'manufacturer'
});
my $wireless = schema(vars->{'tenant'})->resultset('NodeWireless')->search(
{ -and => [@where_mac, @wifitimes] },
{ order_by => { '-desc' => 'time_last' },
'+columns' => [
'oui.company',
'oui.abbrev',
'manufacturer.company',
'manufacturer.abbrev',
{
time_last_stamp => \"to_char(time_last, 'YYYY-MM-DD HH24:MI')"
}],
join => 'oui'
join => 'manufacturer'
}
);
@@ -245,14 +245,14 @@ get '/ajax/content/search/node' => require_login sub {
}
# if the user selects Vendor search opt, then
# we'll try the OUI company name as a fallback
# we'll try the manufacturer company name as a fallback
if (param('show_vendor') and not $have_rows) {
$set = schema(vars->{'tenant'})->resultset('NodeIp')
->with_times
->search(
{'oui.company' => { -ilike => ''.sql_match($node)}, @times},
{'prefetch' => 'oui'},
{'manufacturer.company' => { -ilike => ''.sql_match($node)}, @times},
{'prefetch' => 'manufacturer'},
);
++$have_rows if $set->has_rows;
}