[#110] rules for IP Phone and Wireless AP identification now configurable
This commit is contained in:
@@ -4,17 +4,18 @@
|
|||||||
|
|
||||||
* macsuck_unsupported setting to allow node gathering on delinquent switches
|
* macsuck_unsupported setting to allow node gathering on delinquent switches
|
||||||
* netdisco-do -d accepts IP prefixes (subnet in CIDR format)
|
* netdisco-do -d accepts IP prefixes (subnet in CIDR format)
|
||||||
|
* [#110] rules for IP Phone and Wireless AP identification now configurable
|
||||||
|
|
||||||
[ENHANCEMENTS]
|
[ENHANCEMENTS]
|
||||||
|
|
||||||
* Show page and total records number on DataTables tables
|
* show page and total records number on DataTables tables
|
||||||
* Be more strict about Node Search matching ports/wifi within date range
|
* be more strict about Node Search matching ports/wifi within date range
|
||||||
* Allow filtering out of Device Ports on Node (MAC) search
|
* allow filtering out of Device Ports on Node (MAC) search
|
||||||
|
|
||||||
[BUG FIXES]
|
[BUG FIXES]
|
||||||
|
|
||||||
* Only exclude discover_no on Undiscovered Neighbors report when few (<50) results
|
* only exclude discover_no on Undiscovered Neighbors report when few (<50) results
|
||||||
* Mention expire in netdisco-do docs
|
* mention expire in netdisco-do docs
|
||||||
|
|
||||||
2.031012 - 2015-02-28
|
2.031012 - 2015-02-28
|
||||||
|
|
||||||
|
|||||||
@@ -3,11 +3,13 @@ package App::Netdisco::Core::Discover;
|
|||||||
use Dancer qw/:syntax :script/;
|
use Dancer qw/:syntax :script/;
|
||||||
use Dancer::Plugin::DBIC 'schema';
|
use Dancer::Plugin::DBIC 'schema';
|
||||||
|
|
||||||
use App::Netdisco::Util::Device qw/get_device is_discoverable/;
|
use App::Netdisco::Util::Device
|
||||||
|
qw/get_device match_devicetype is_discoverable/;
|
||||||
use App::Netdisco::Util::DNS ':all';
|
use App::Netdisco::Util::DNS ':all';
|
||||||
use App::Netdisco::JobQueue qw/jq_queued jq_insert/;
|
use App::Netdisco::JobQueue qw/jq_queued jq_insert/;
|
||||||
use NetAddr::IP::Lite ':lower';
|
use NetAddr::IP::Lite ':lower';
|
||||||
use List::MoreUtils ();
|
use List::MoreUtils ();
|
||||||
|
use Scalar::Util 'blessed';
|
||||||
use Encode;
|
use Encode;
|
||||||
use Try::Tiny;
|
use Try::Tiny;
|
||||||
use NetAddr::MAC;
|
use NetAddr::MAC;
|
||||||
@@ -723,14 +725,16 @@ sub store_neighbors {
|
|||||||
|
|
||||||
# IP Phone and WAP detection type fixup
|
# IP Phone and WAP detection type fixup
|
||||||
if (scalar @$remote_cap or $remote_type) {
|
if (scalar @$remote_cap or $remote_type) {
|
||||||
my $phone_flag = grep {/phone/i} @$remote_cap;
|
my $phone_flag = grep {match_devicetype($_, 'phone_capabilities')}
|
||||||
my $ap_flag = grep {/wlanAccessPoint/} @$remote_cap;
|
@$remote_cap;
|
||||||
|
my $ap_flag = grep {match_devicetype($_, 'wap_capabilities')}
|
||||||
|
@$remote_cap;
|
||||||
|
|
||||||
if ($phone_flag or $remote_type =~ m/mitel.5\d{3}/i) {
|
if ($phone_flag or match_devicetype($remote_type, 'phone_platforms')) {
|
||||||
$remote_type = 'IP Phone: '. $remote_type
|
$remote_type = 'IP Phone: '. $remote_type
|
||||||
if $remote_type !~ /ip phone/i;
|
if $remote_type !~ /ip.phone/i;
|
||||||
}
|
}
|
||||||
elsif ($ap_flag or $remote_type =~ m/\bw?ap\b/i) {
|
elsif ($ap_flag or match_devicetype($remote_type, 'wap_platforms')) {
|
||||||
$remote_type = 'AP: '. $remote_type;
|
$remote_type = 'AP: '. $remote_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -831,8 +835,21 @@ sub store_neighbors {
|
|||||||
push @to_discover, [$remote_ip, $remote_type];
|
push @to_discover, [$remote_ip, $remote_type];
|
||||||
}
|
}
|
||||||
|
|
||||||
$remote_port = $c_port->{$entry};
|
# further device type discovery using MAC OUI
|
||||||
|
# only works once device is fully discovered (so we have a MAC addr)
|
||||||
|
my $neigh = get_device($remote_ip);
|
||||||
|
if (blessed $neigh and $neigh->in_storage and $neigh->mac) {
|
||||||
|
if (match_devicetype($neigh->mac, 'phone_ouis')) {
|
||||||
|
$remote_type = 'IP Phone: '. $remote_type
|
||||||
|
if $remote_type !~ /ip.phone/i;
|
||||||
|
}
|
||||||
|
elsif (match_devicetype($neigh->mac, 'wap_ouis')) {
|
||||||
|
$remote_type = 'AP: '. $remote_type
|
||||||
|
if $remote_type !~ /^AP: /;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$remote_port = $c_port->{$entry};
|
||||||
if (defined $remote_port) {
|
if (defined $remote_port) {
|
||||||
# clean weird characters
|
# clean weird characters
|
||||||
$remote_port =~ s/[^\d\/\.,()\w:-]+//gi;
|
$remote_port =~ s/[^\d\/\.,()\w:-]+//gi;
|
||||||
|
|||||||
@@ -252,6 +252,14 @@ sub renumber {
|
|||||||
|
|
||||||
=head1 ADDITIONAL COLUMNS
|
=head1 ADDITIONAL COLUMNS
|
||||||
|
|
||||||
|
=head2 oui
|
||||||
|
|
||||||
|
Returns the first half of the device MAC address.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub oui { return substr( ((shift)->mac || ''), 0, 8 ) }
|
||||||
|
|
||||||
=head2 port_count
|
=head2 port_count
|
||||||
|
|
||||||
Returns the number of ports on this device. Enable this
|
Returns the number of ports on this device. Enable this
|
||||||
|
|||||||
@@ -961,6 +961,92 @@ Value: Boolean. Default: C<false>.
|
|||||||
Turn this on to have Netdisco do a reverse lookup of the device C<sysName.0>
|
Turn this on to have Netdisco do a reverse lookup of the device C<sysName.0>
|
||||||
field to use as the management IP address for a device.
|
field to use as the management IP address for a device.
|
||||||
|
|
||||||
|
=head3 C<phone_capabilities>
|
||||||
|
|
||||||
|
Value: List of Strings. Default:
|
||||||
|
|
||||||
|
phone_capabilities:
|
||||||
|
- '(?i:phone)'
|
||||||
|
|
||||||
|
Regular expressions to match the Capability field received within neighbor
|
||||||
|
discovery protocols such as CDP/FDP/LLDP. Netdisco uses this to display a
|
||||||
|
"phone" icon alongside devices or nodes in the Device Ports table.
|
||||||
|
|
||||||
|
To find the received Capabilities on an upstream device, run this command:
|
||||||
|
|
||||||
|
~netdisco/bin/netdisco-do show -d <IP-of-device> -e c_cap
|
||||||
|
|
||||||
|
=head3 C<phone_platforms>
|
||||||
|
|
||||||
|
Value: List of Strings. Default:
|
||||||
|
|
||||||
|
phone_platforms:
|
||||||
|
- '(?i:mitel.5\d{3})'
|
||||||
|
|
||||||
|
Regular expressions to match the Platform field received within neighbor
|
||||||
|
discovery protocols such as CDP/FDP/LLDP. Netdisco uses this to display a
|
||||||
|
"phone" icon alongside devices or nodes in the Device Ports table.
|
||||||
|
|
||||||
|
To find the received Platforms on an upstream device, run this command:
|
||||||
|
|
||||||
|
~netdisco/bin/netdisco-do show -d <IP-of-device> -e c_platform
|
||||||
|
|
||||||
|
=head3 C<phone_ouis>
|
||||||
|
|
||||||
|
Value: List of Strings. Default: Empty List.
|
||||||
|
|
||||||
|
If you can't get C<phone_capabilities> or C<phone_platforms> to match, as a
|
||||||
|
last ditch attempt you can match on the MAC address of the device (if it has
|
||||||
|
one). This is a set of regular expressions matched against the whole MAC
|
||||||
|
address (not only the OUI portion) in IEEE format. For example:
|
||||||
|
|
||||||
|
phone_ouis:
|
||||||
|
- '^a4:0c:c3'
|
||||||
|
|
||||||
|
=head3 C<wap_capabilities>
|
||||||
|
|
||||||
|
Value: List of Strings. Default:
|
||||||
|
|
||||||
|
wap_capabilities:
|
||||||
|
- 'wlanAccessPoint'
|
||||||
|
|
||||||
|
Regular expressions to match the Capability field received within neighbor
|
||||||
|
discovery protocols such as CDP/FDP/LLDP. Netdisco uses this to display a
|
||||||
|
"wireless signal" icon alongside devices or nodes in the Device Ports table.
|
||||||
|
|
||||||
|
To find the received Capabilities on an upstream device, run this command:
|
||||||
|
|
||||||
|
~netdisco/bin/netdisco-do show -d <IP-of-device> -e c_cap
|
||||||
|
|
||||||
|
=head3 C<wap_platforms>
|
||||||
|
|
||||||
|
Value: List of Strings. Default:
|
||||||
|
|
||||||
|
wap_platforms:
|
||||||
|
- '(?i:\bw?ap\b)'
|
||||||
|
- 'cisco\s+AIR-[L|C]?AP'
|
||||||
|
- '-K9W8-'
|
||||||
|
|
||||||
|
Regular expressions to match the Platform field received within neighbor
|
||||||
|
discovery protocols such as CDP/FDP/LLDP. Netdisco uses this to display a
|
||||||
|
"wireless signal" icon alongside devices or nodes in the Device Ports table.
|
||||||
|
|
||||||
|
To find the received Platforms on an upstream device, run this command:
|
||||||
|
|
||||||
|
~netdisco/bin/netdisco-do show -d <IP-of-device> -e c_platform
|
||||||
|
|
||||||
|
=head3 C<wap_ouis>
|
||||||
|
|
||||||
|
Value: List of Strings. Default: Empty List.
|
||||||
|
|
||||||
|
If you can't get C<wap_capabilities> or C<wap_platforms> to match, as a last
|
||||||
|
ditch attempt you can match on the MAC address of the device (if it has one).
|
||||||
|
This is a set of regular expressions matched against the whole MAC address
|
||||||
|
(not only the OUI portion) in IEEE format. For example:
|
||||||
|
|
||||||
|
wap_ouis:
|
||||||
|
- '^a4:0c:c3'
|
||||||
|
|
||||||
=head2 Backend Daemon
|
=head2 Backend Daemon
|
||||||
|
|
||||||
=head3 C<workers>
|
=head3 C<workers>
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ stored to the database.
|
|||||||
|
|
||||||
sub get_device {
|
sub get_device {
|
||||||
my $ip = shift;
|
my $ip = shift;
|
||||||
|
return unless $ip;
|
||||||
|
|
||||||
# naive check for existing DBIC object
|
# naive check for existing DBIC object
|
||||||
return $ip if ref $ip;
|
return $ip if ref $ip;
|
||||||
|
|||||||
@@ -177,6 +177,18 @@ ignore_interfaces:
|
|||||||
- '(E|T)\d \d\/\d\/\d'
|
- '(E|T)\d \d\/\d\/\d'
|
||||||
ignore_private_nets: false
|
ignore_private_nets: false
|
||||||
reverse_sysname: false
|
reverse_sysname: false
|
||||||
|
phone_capabilities:
|
||||||
|
- '(?i:phone)'
|
||||||
|
phone_platforms:
|
||||||
|
- '(?i:mitel.5\d{3})'
|
||||||
|
phone_ouis: []
|
||||||
|
wap_capabilities:
|
||||||
|
- 'wlanAccessPoint'
|
||||||
|
wap_platforms:
|
||||||
|
- '(?i:\bw?ap\b)'
|
||||||
|
- 'cisco\s+AIR-[L|C]?AP'
|
||||||
|
- '-K9W8-'
|
||||||
|
wap_ouis: []
|
||||||
|
|
||||||
# --------------
|
# --------------
|
||||||
# BACKEND DAEMON
|
# BACKEND DAEMON
|
||||||
|
|||||||
@@ -265,7 +265,7 @@
|
|||||||
<i class="icon-link[% ' text-warning' IF row.manual_topo %]"></i>
|
<i class="icon-link[% ' text-warning' IF row.manual_topo %]"></i>
|
||||||
[% IF row.remote_type AND row.remote_type.match('(?i)ip.phone') %]
|
[% IF row.remote_type AND row.remote_type.match('(?i)ip.phone') %]
|
||||||
<i class="icon-phone"></i>
|
<i class="icon-phone"></i>
|
||||||
[% ELSIF row.remote_type AND row.remote_type.match('(cisco\s+AIR-[L|C]?AP|-K9W8-|^AP:\s)') %]
|
[% ELSIF row.remote_type AND row.remote_type.match('^AP:\s') %]
|
||||||
<i class="icon-signal"></i>
|
<i class="icon-signal"></i>
|
||||||
[% END %]
|
[% END %]
|
||||||
<a href="[% uri_for('/device', self_options) %]&q=[% row.neighbor.ip | uri %]">
|
<a href="[% uri_for('/device', self_options) %]&q=[% row.neighbor.ip | uri %]">
|
||||||
@@ -284,7 +284,7 @@
|
|||||||
<i class="icon-unlink text-error"></i>
|
<i class="icon-unlink text-error"></i>
|
||||||
[% IF row.remote_type AND row.remote_type.match('(?i)ip.phone') %]
|
[% IF row.remote_type AND row.remote_type.match('(?i)ip.phone') %]
|
||||||
<i class="icon-phone"></i>
|
<i class="icon-phone"></i>
|
||||||
[% ELSIF row.remote_type AND row.remote_type.match('(cisco\s+AIR-[L|C]?AP|-K9W8-|^AP:\s)') %]
|
[% ELSIF row.remote_type AND row.remote_type.match('^AP:\s') %]
|
||||||
<i class="icon-signal"></i>
|
<i class="icon-signal"></i>
|
||||||
[% END %]
|
[% END %]
|
||||||
<a href="[% search_node %]&q=[% row.remote_ip | uri %]">
|
<a href="[% search_node %]&q=[% row.remote_ip | uri %]">
|
||||||
@@ -305,7 +305,7 @@
|
|||||||
[% IF row.remote_type AND row.remote_type.match('(?i)ip.phone') %]
|
[% IF row.remote_type AND row.remote_type.match('(?i)ip.phone') %]
|
||||||
<i class="icon-phone"></i>
|
<i class="icon-phone"></i>
|
||||||
[% ELSIF node.wireless.defined
|
[% ELSIF node.wireless.defined
|
||||||
OR (row.remote_type AND row.remote_type.match('(cisco\s+AIR-[L|c]?AP|-K9W8-|^AP:\s)')) %]
|
OR (row.remote_type AND row.remote_type.match('^AP:\s')) %]
|
||||||
<i class="icon-signal"></i>
|
<i class="icon-signal"></i>
|
||||||
[% END %]
|
[% END %]
|
||||||
<a href="[% search_node %]&q=[% node.net_mac.$mac_format_call | uri %]">
|
<a href="[% search_node %]&q=[% node.net_mac.$mac_format_call | uri %]">
|
||||||
|
|||||||
Reference in New Issue
Block a user