#721 redux - better MAC address support in searching
This commit is contained in:
1
Changes
1
Changes
@@ -2,6 +2,7 @@
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* #721 redux - better MAC address support in searching
|
||||
* #728 store SNMP Engine ID
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
@@ -7,6 +7,7 @@ use warnings;
|
||||
use Try::Tiny;
|
||||
use Regexp::Common 'net';
|
||||
use NetAddr::IP::Lite ':lower';
|
||||
use NetAddr::MAC ();
|
||||
|
||||
require Dancer::Logger;
|
||||
|
||||
@@ -181,6 +182,10 @@ Can match the C<location> field as a substring.
|
||||
Can match the C<description> field as a substring (usually this field contains
|
||||
a description of the vendor operating system).
|
||||
|
||||
=item mac
|
||||
|
||||
Will match exactly the C<mac> field of the Device or any of its Interfaces.
|
||||
|
||||
=item model
|
||||
|
||||
Will match exactly the C<model> field.
|
||||
@@ -245,6 +250,13 @@ sub search_by_field {
|
||||
\[ 'substring(me.layers,9-?, 1)::int = 1', $layers ];
|
||||
}
|
||||
|
||||
# get IEEE MAC format
|
||||
my $mac = NetAddr::MAC->new($p->{mac});
|
||||
undef $mac if
|
||||
($mac and $mac->as_ieee
|
||||
and (($mac->as_ieee eq '00:00:00:00:00:00')
|
||||
or ($mac->as_ieee !~ m/$RE{net}{MAC}/)));
|
||||
|
||||
return $rs
|
||||
->search_rs({}, $attrs)
|
||||
->search({
|
||||
@@ -256,6 +268,12 @@ sub search_by_field {
|
||||
($p->{description} ? ('me.description' =>
|
||||
{ '-ilike' => "\%$p->{description}\%" }) : ()),
|
||||
|
||||
($mac ? (
|
||||
-or => [
|
||||
'me.mac' => $mac->as_ieee,
|
||||
'ports.mac' => $mac->as_ieee,
|
||||
]) : ()),
|
||||
|
||||
($p->{model} ? ('me.model' =>
|
||||
{ '-in' => $p->{model} }) : ()),
|
||||
($p->{os} ? ('me.os' =>
|
||||
@@ -283,7 +301,7 @@ sub search_by_field {
|
||||
{
|
||||
order_by => [qw/ me.dns me.ip /],
|
||||
(($p->{dns} or $p->{ip}) ? (
|
||||
join => 'device_ips',
|
||||
join => [qw/device_ips ports/],
|
||||
distinct => 1,
|
||||
) : ()),
|
||||
}
|
||||
@@ -309,6 +327,8 @@ The following fields are inspected for a match:
|
||||
|
||||
=item name
|
||||
|
||||
=item mac (including port addresses)
|
||||
|
||||
=item description
|
||||
|
||||
=item dns
|
||||
@@ -341,6 +361,14 @@ sub search_fuzzy {
|
||||
];
|
||||
}
|
||||
|
||||
# get IEEE MAC format
|
||||
my $mac = NetAddr::MAC->new($q);
|
||||
undef $mac if
|
||||
($mac and $mac->as_ieee
|
||||
and (($mac->as_ieee eq '00:00:00:00:00:00')
|
||||
or ($mac->as_ieee !~ m/$RE{net}{MAC}/)));
|
||||
$mac = ($mac ? $mac->as_ieee : $q);
|
||||
|
||||
return $rs->search(
|
||||
{
|
||||
-or => [
|
||||
@@ -353,6 +381,10 @@ sub search_fuzzy {
|
||||
$rs->search({ 'modules.serial' => $qc },
|
||||
{ join => 'modules', columns => 'ip' })->as_query()
|
||||
},
|
||||
-or => [
|
||||
'me.mac::text' => { '-ilike' => $mac},
|
||||
'ports.mac::text' => { '-ilike' => $mac},
|
||||
],
|
||||
-or => [
|
||||
'me.dns' => { '-ilike' => $q },
|
||||
'device_ips.dns' => { '-ilike' => $q },
|
||||
@@ -362,7 +394,7 @@ sub search_fuzzy {
|
||||
},
|
||||
{
|
||||
order_by => [qw/ me.dns me.ip /],
|
||||
join => 'device_ips',
|
||||
join => [qw/device_ips ports/],
|
||||
distinct => 1,
|
||||
}
|
||||
);
|
||||
|
||||
@@ -32,6 +32,9 @@ register_search_tab({
|
||||
description => {
|
||||
description => 'Partial match of the Device description',
|
||||
},
|
||||
mac => {
|
||||
description => 'MAC Address of the Device or any of its Interfaces',
|
||||
},
|
||||
model => {
|
||||
description => 'Exact match of the Device model',
|
||||
},
|
||||
@@ -58,7 +61,7 @@ register_search_tab({
|
||||
# device with various properties or a default match-all
|
||||
get '/ajax/content/search/device' => require_login sub {
|
||||
my $has_opt = List::MoreUtils::any { param($_) }
|
||||
qw/name location dns ip description model os os_ver vendor layers/;
|
||||
qw/name location dns ip description model os os_ver vendor layers mac/;
|
||||
my $rs;
|
||||
|
||||
if ($has_opt) {
|
||||
|
||||
Reference in New Issue
Block a user