diff --git a/Netdisco/lib/App/Netdisco/DB/Result/Device.pm b/Netdisco/lib/App/Netdisco/DB/Result/Device.pm index d920b3df..8caeef7d 100644 --- a/Netdisco/lib/App/Netdisco/DB/Result/Device.pm +++ b/Netdisco/lib/App/Netdisco/DB/Result/Device.pm @@ -110,6 +110,14 @@ Returns the set of ports on this Device. __PACKAGE__->has_many( ports => 'App::Netdisco::DB::Result::DevicePort', 'ip' ); +=head2 modules + +Returns the set chassis modules on this Device. + +=cut + +__PACKAGE__->has_many( modules => 'App::Netdisco::DB::Result::DeviceModule', 'ip' ); + =head2 power_modules Returns the set of power modules on this Device. diff --git a/Netdisco/lib/App/Netdisco/DB/Result/DeviceModule.pm b/Netdisco/lib/App/Netdisco/DB/Result/DeviceModule.pm index f9ccc2fb..d7db3bab 100644 --- a/Netdisco/lib/App/Netdisco/DB/Result/DeviceModule.pm +++ b/Netdisco/lib/App/Netdisco/DB/Result/DeviceModule.pm @@ -54,6 +54,15 @@ __PACKAGE__->set_primary_key("ip", "index"); # Created by DBIx::Class::Schema::Loader v0.07015 @ 2012-01-07 14:20:02 # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:nuwxZBoiip9trdJFmgk3Fw +=head1 RELATIONSHIPS + +=head2 device + +Returns the entry from the C table on which this VLAN entry was discovered. + +=cut + +__PACKAGE__->belongs_to( device => 'App::Netdisco::DB::Result::Device', 'ip' ); # You can replace this text with custom code or comments, and it will be preserved on regeneration 1; diff --git a/Netdisco/lib/App/Netdisco/Daemon/Worker/Poller/Discover.pm b/Netdisco/lib/App/Netdisco/Daemon/Worker/Poller/Discover.pm index 074d9f81..6c365357 100644 --- a/Netdisco/lib/App/Netdisco/Daemon/Worker/Poller/Discover.pm +++ b/Netdisco/lib/App/Netdisco/Daemon/Worker/Poller/Discover.pm @@ -46,7 +46,7 @@ sub discover { store_wireless($device, $snmp); store_vlans($device, $snmp); store_power($device, $snmp); - #store_modules($device, $snmp); + store_modules($device, $snmp); return job_done("Ended Discover for $host"); } diff --git a/Netdisco/lib/App/Netdisco/Util/DiscoverAndStore.pm b/Netdisco/lib/App/Netdisco/Util/DiscoverAndStore.pm index 2fb815f2..6b2ef496 100644 --- a/Netdisco/lib/App/Netdisco/Util/DiscoverAndStore.pm +++ b/Netdisco/lib/App/Netdisco/Util/DiscoverAndStore.pm @@ -10,7 +10,7 @@ use base 'Exporter'; our @EXPORT = (); our @EXPORT_OK = qw/ store_device store_interfaces store_wireless - store_vlans store_power + store_vlans store_power store_modules /; our %EXPORT_TAGS = (all => \@EXPORT_OK); @@ -411,4 +411,64 @@ sub store_power { }); } +=head2 store_modules( $device, $snmp ) + +Given a Device database object, and a working SNMP connection, discover and +store the device's module information. + +The Device database object can be a fresh L object which is +not yet stored to the database. + +=cut + +sub store_modules { + my ($device, $snmp) = @_; + + my $e_index = $snmp->e_index; + + if (!defined $e_index) { + # TODO log + return; + } + + my $e_descr = $snmp->e_descr; + my $e_type = $snmp->e_type; + my $e_parent = $snmp->e_parent; + my $e_name = $snmp->e_name; + my $e_class = $snmp->e_class; + my $e_pos = $snmp->e_pos; + my $e_hwver = $snmp->e_hwver; + my $e_fwver = $snmp->e_fwver; + my $e_swver = $snmp->e_swver; + my $e_model = $snmp->e_model; + my $e_serial = $snmp->e_serial; + my $e_fru = $snmp->e_fru; + + # build device modules list for DBIC + my @modules; + foreach my $entry (keys %$e_class) { + push @modules, { + index => $e_index->{$entry}, + type => $e_type->{$entry}, + parent => $e_parent->{$entry}, + name => $e_name->{$entry}, + class => $e_class->{$entry}, + pos => $e_pos->{$entry}, + hw_ver => $e_hwver->{$entry}, + fw_ver => $e_fwver->{$entry}, + sw_ver => $e_swver->{$entry}, + model => $e_model->{$entry}, + serial => $e_serial->{$entry}, + fru => $e_fru->{$entry}, + description => $e_descr->{$entry}, + last_discover => \'now()', + }; + } + + schema('netdisco')->txn_do(sub { + $device->modules->delete; + $device->modules->populate(\@modules); + }); +} + 1;