diff --git a/lib/App/Netdisco/DB/Result/DevicePortProperties.pm b/lib/App/Netdisco/DB/Result/DevicePortProperties.pm index 7ebb64c5..80d4a3e8 100644 --- a/lib/App/Netdisco/DB/Result/DevicePortProperties.pm +++ b/lib/App/Netdisco/DB/Result/DevicePortProperties.pm @@ -13,6 +13,18 @@ __PACKAGE__->add_columns( { data_type => "text", is_nullable => 0 }, "error_disable_cause", { data_type => "text", is_nullable => 1 }, + "remote_is_wap", + { data_type => "boolean", is_nullable => 1 }, + "remote_is_phone", + { data_type => "boolean", is_nullable => 1 }, + "remote_vendor", + { data_type => "text", is_nullable => 1 }, + "remote_os_ver", + { data_type => "text", is_nullable => 1 }, + "remote_model", + { data_type => "text", is_nullable => 1 }, + "remote_serial", + { data_type => "text", is_nullable => 1 }, ); __PACKAGE__->set_primary_key("port", "ip"); diff --git a/lib/App/Netdisco/Worker/Plugin/Discover/PortProperties.pm b/lib/App/Netdisco/Worker/Plugin/Discover/PortProperties.pm index e837b452..a3bb2a91 100644 --- a/lib/App/Netdisco/Worker/Plugin/Discover/PortProperties.pm +++ b/lib/App/Netdisco/Worker/Plugin/Discover/PortProperties.pm @@ -15,33 +15,54 @@ register_worker({ phase => 'main', driver => 'snmp' }, sub { my $snmp = App::Netdisco::Transport::SNMP->reader_for($device) or return Status->defer("discover failed: could not SNMP connect to $device"); - my $interfaces = $snmp->interfaces; - my $err_cause = $snmp->i_err_disable_cause; + my $interfaces = $snmp->interfaces || {}; + my $err_cause = $snmp->i_err_disable_cause || {}; - if (!defined $err_cause or !defined $interfaces) { - return Status->info(sprintf ' [%s] props - 0 errored ports', $device->ip); + my %properties = (); + foreach my $idx (keys %$err_cause) { + my $port = $interfaces->{$idx}; + next unless $port; + + $properties{ $port }->{error_disable_cause} = $err_cause->{$idx}; } - # build device port properties info suitable for DBIC - my @portproperties; - foreach my $entry (keys %$err_cause) { - my $port = $interfaces->{$entry}; - next unless $port; + my $lldp_if = $snmp->lldp_if || {}; + my $lldp_cap = $snmp->lldp_cap || {}; + my $rem_media_cap = $snmp->lldp_media_cap || {}; + my $rem_vendor = $snmp->lldp_rem_vendor || {}; + my $rem_model = $snmp->lldp_rem_model || {}; + my $rem_os_ver = $snmp->lldp_rem_sw_rev || {}; + my $rem_serial = $snmp->lldp_rem_serial || {}; - push @portproperties, { - port => $port, - error_disable_cause => $err_cause->{$entry}, - }; + foreach my $idx (keys %$lldp_if) { + my $port = $interfaces->{ $lldp_if->{$idx} }; + next unless $port; + + $properties{ $port }->{remote_is_wap} = 'true' + if scalar grep {defined && m/^wlanAccessPoint$/} @{ $lldp_cap->{$idx} }; + $properties{ $port }->{remote_is_phone} = 'true' + if scalar grep {defined && m/^telephone$/} @{ $lldp_cap->{$idx} }; + + next unless scalar grep {defined && m/^inventory$/} @{ $rem_media_cap->{$idx} }; + + $properties{ $port }->{remote_vendor} = $rem_vendor->{ $idx }; + $properties{ $port }->{remote_model} = $rem_model->{ $idx }; + $properties{ $port }->{remote_os_ver} = $rem_os_ver->{ $idx }; + $properties{ $port }->{remote_serial} = $rem_serial->{ $idx }; } + return Status->info(" [$device] no port properties to record") + unless scalar keys %properties; + schema('netdisco')->txn_do(sub { my $gone = $device->properties_ports->delete; debug sprintf ' [%s] props - removed %d ports with properties', $device->ip, $gone; - $device->properties_ports->populate(\@portproperties); + $device->properties_ports->populate( + [map {{ port => $_, %{ $properties{$_} } }} keys %properties] ); return Status->info(sprintf ' [%s] props - added %d new port properties', - $device->ip, scalar @portproperties); + $device->ip, scalar keys %properties); }); }); diff --git a/share/schema_versions/App-Netdisco-DB-47-48-PostgreSQL.sql b/share/schema_versions/App-Netdisco-DB-47-48-PostgreSQL.sql index a7eebc4d..254fa650 100644 --- a/share/schema_versions/App-Netdisco-DB-47-48-PostgreSQL.sql +++ b/share/schema_versions/App-Netdisco-DB-47-48-PostgreSQL.sql @@ -1,7 +1,7 @@ BEGIN; -ALTER TABLE device_port_properties ADD COLUMN "remote_is_wap" bool DEFAULT false NOT NULL; -ALTER TABLE device_port_properties ADD COLUMN "remote_is_phone" bool DEFAULT false NOT NULL; +ALTER TABLE device_port_properties ADD COLUMN "remote_is_wap" bool DEFAULT false; +ALTER TABLE device_port_properties ADD COLUMN "remote_is_phone" bool DEFAULT false; ALTER TABLE device_port_properties ADD COLUMN "remote_vendor" text; ALTER TABLE device_port_properties ADD COLUMN "remote_model" text; ALTER TABLE device_port_properties ADD COLUMN "remote_os_ver" text;