implementation of store_power
This commit is contained in:
		| @@ -110,6 +110,14 @@ Returns the set of ports on this Device. | ||||
|  | ||||
| __PACKAGE__->has_many( ports => 'App::Netdisco::DB::Result::DevicePort', 'ip' ); | ||||
|  | ||||
| =head2 power_modules | ||||
|  | ||||
| Returns the set of power modules on this Device. | ||||
|  | ||||
| =cut | ||||
|  | ||||
| __PACKAGE__->has_many( power_modules => 'App::Netdisco::DB::Result::DevicePower', 'ip' ); | ||||
|  | ||||
| =head2 port_vlans | ||||
|  | ||||
| Returns the set of VLANs known to be configured on Ports on this Device, | ||||
|   | ||||
| @@ -25,6 +25,15 @@ __PACKAGE__->set_primary_key("ip", "module"); | ||||
| # Created by DBIx::Class::Schema::Loader v0.07015 @ 2012-01-07 14:20:02 | ||||
| # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:awZRI/IH2VewzGlxISsr7w | ||||
|  | ||||
| =head1 RELATIONSHIPS | ||||
|  | ||||
| =head2 device | ||||
|  | ||||
| Returns the entry from the C<device> table on which this power module 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; | ||||
|   | ||||
| @@ -45,7 +45,7 @@ sub discover { | ||||
|   store_interfaces($device, $snmp); | ||||
|   store_wireless($device, $snmp); | ||||
|   store_vlans($device, $snmp); | ||||
|   #store_power($device, $snmp); | ||||
|   store_power($device, $snmp); | ||||
|   #store_modules($device, $snmp); | ||||
|  | ||||
|   return job_done("Ended Discover for $host"); | ||||
|   | ||||
| @@ -10,7 +10,7 @@ use base 'Exporter'; | ||||
| our @EXPORT = (); | ||||
| our @EXPORT_OK = qw/ | ||||
|   store_device store_interfaces store_wireless | ||||
|   store_vlans | ||||
|   store_vlans store_power | ||||
| /; | ||||
| our %EXPORT_TAGS = (all => \@EXPORT_OK); | ||||
|  | ||||
| @@ -342,4 +342,73 @@ sub store_vlans { | ||||
|   }); | ||||
| } | ||||
|  | ||||
| =head2 store_power( $device, $snmp ) | ||||
|  | ||||
| Given a Device database object, and a working SNMP connection, discover and | ||||
| store the device's PoE information. | ||||
|  | ||||
| The Device database object can be a fresh L<DBIx::Class::Row> object which is | ||||
| not yet stored to the database. | ||||
|  | ||||
| =cut | ||||
|  | ||||
| sub store_power { | ||||
|   my ($device, $snmp) = @_; | ||||
|  | ||||
|   my $p_watts  = $snmp->peth_power_watts; | ||||
|   my $p_status = $snmp->peth_power_status; | ||||
|  | ||||
|   if (!defined $p_watts) { | ||||
|       # TODO log | ||||
|       return; | ||||
|   } | ||||
|  | ||||
|   # build device module power info suitable for DBIC | ||||
|   my @devicepower; | ||||
|   foreach my $entry (keys %$p_watts) { | ||||
|       push @devicepower, { | ||||
|           module => $entry, | ||||
|           power  => $p_watts->{$entry}, | ||||
|           status => $p_status->{$entry}, | ||||
|       }; | ||||
|   } | ||||
|  | ||||
|   my $interfaces = $snmp->interfaces; | ||||
|   my $p_ifindex  = $snmp->peth_port_ifindex; | ||||
|   my $p_admin    = $snmp->peth_port_admin; | ||||
|   my $p_pstatus  = $snmp->peth_port_status; | ||||
|   my $p_class    = $snmp->peth_port_class; | ||||
|   my $p_power    = $snmp->peth_port_power; | ||||
|  | ||||
|   # build device port power info suitable for DBIC | ||||
|   my %portpower; | ||||
|   foreach my $entry (keys %$p_ifindex) { | ||||
|       my $port = $interfaces->{ $p_ifindex->{$entry} }; | ||||
|       next unless $port; | ||||
|  | ||||
|       my ($module) = split m/\./, $entry; | ||||
|       $portpower{$port} = []; | ||||
|  | ||||
|       push @{$portpower{$port}}, { | ||||
|           module => $module, | ||||
|           admin  => $p_admin->{$entry}, | ||||
|           status => $p_pstatus->{$entry}, | ||||
|           class  => $p_class->{$entry}, | ||||
|           power  => $p_power->{$entry}, | ||||
|  | ||||
|       }; | ||||
|   } | ||||
|  | ||||
|   schema('netdisco')->txn_do(sub { | ||||
|     $device->power_modules->delete; | ||||
|     $device->power_modules->populate(\@devicepower); | ||||
|  | ||||
|     foreach my $port (keys %portpower) { | ||||
|         my $port = $device->ports->find({port => $port}); | ||||
|         $port->power->delete if $port->power; | ||||
|         $port->create_related('power', $portpower{$port}); | ||||
|     } | ||||
|   }); | ||||
| } | ||||
|  | ||||
| 1; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user