[#197] Change IP address of device with "renumber" option to netdisco-do
This commit is contained in:
		| @@ -6,6 +6,7 @@ package App::Netdisco::DB::Result::Device; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use NetAddr::IP::Lite ':lower'; | ||||
|  | ||||
| use base 'DBIx::Class::Core'; | ||||
| __PACKAGE__->table("device"); | ||||
| @@ -186,6 +187,69 @@ Returns the row from the community string table, if one exists. | ||||
| __PACKAGE__->might_have( | ||||
|     community => 'App::Netdisco::DB::Result::Community', 'ip'); | ||||
|  | ||||
| =head1 ADDITIONAL METHODS | ||||
|  | ||||
| =head2 renumber( $new_ip ) | ||||
|  | ||||
| Will update this device and all related database records to use the new IP | ||||
| C<$new_ip>. Returns C<undef> if $new_ip seems invalid, otherwise returns the | ||||
| Device row object. | ||||
|  | ||||
| =cut | ||||
|  | ||||
| sub renumber { | ||||
|   my ($device, $ip) = @_; | ||||
|   my $schema = $device->result_source->schema; | ||||
|  | ||||
|   my $new_ip = NetAddr::IP::Lite->new($ip) | ||||
|     or return; | ||||
|  | ||||
|   foreach my $set (qw/ | ||||
|     DeviceIp | ||||
|     DeviceModule | ||||
|     DevicePower | ||||
|     DeviceVlan | ||||
|     DevicePort | ||||
|     DevicePortLog | ||||
|     DevicePortPower | ||||
|     DevicePortSsid | ||||
|     DevicePortVlan | ||||
|     DevicePortWireless | ||||
|     Community | ||||
|   /) { | ||||
|     $schema->resultset($set) | ||||
|       ->search({ip => $device->ip}) | ||||
|       ->update({ip => $new_ip->addr}); | ||||
|   } | ||||
|  | ||||
|   $schema->resultset('DevicePort') | ||||
|     ->search({remote_ip => $device->ip}) | ||||
|     ->update({remote_ip => $new_ip->addr}); | ||||
|  | ||||
|   $schema->resultset('DeviceIp') | ||||
|     ->search({alias => $device->ip}) | ||||
|     ->update({alias => $new_ip->addr}); | ||||
|  | ||||
|   $schema->resultset('Admin') | ||||
|     ->search({device => $device->ip}) | ||||
|     ->update({device => $new_ip->addr}); | ||||
|  | ||||
|   $schema->resultset('Node') | ||||
|     ->search({switch => $device->ip}) | ||||
|     ->update({switch => $new_ip->addr}); | ||||
|  | ||||
|   $schema->resultset('Topology') | ||||
|     ->search({dev1 => $device->ip}) | ||||
|     ->update({dev1 => $new_ip->addr}); | ||||
|   $schema->resultset('Topology') | ||||
|     ->search({dev2 => $device->ip}) | ||||
|     ->update({dev2 => $new_ip->addr}); | ||||
|  | ||||
|   $device->update({ip => $new_ip->addr}); | ||||
|  | ||||
|   return $device; | ||||
| } | ||||
|  | ||||
| =head1 ADDITIONAL COLUMNS | ||||
|  | ||||
| =head2 port_count | ||||
|   | ||||
| @@ -195,20 +195,6 @@ __PACKAGE__->might_have( | ||||
|     } | ||||
| ); | ||||
|  | ||||
| =head2 ssid | ||||
|  | ||||
| Returns a row from the C<device_port_ssid> table if one refers to this | ||||
| device port. | ||||
|  | ||||
| =cut | ||||
|  | ||||
| __PACKAGE__->might_have( | ||||
|     ssid => 'App::Netdisco::DB::Result::DevicePortSsid', | ||||
|     {   'foreign.ip'   => 'self.ip', | ||||
|         'foreign.port' => 'self.port', | ||||
|     } | ||||
| ); | ||||
|  | ||||
| =head2 wireless | ||||
|  | ||||
| Returns a row from the C<device_port_wireless> table if one refers to this | ||||
|   | ||||
| @@ -9,6 +9,7 @@ our @EXPORT = (); | ||||
| our @EXPORT_OK = qw/ | ||||
|   get_device | ||||
|   delete_device | ||||
|   renumber_device | ||||
|   check_device_no | ||||
|   check_device_only | ||||
|   is_discoverable | ||||
| @@ -95,6 +96,36 @@ sub delete_device { | ||||
|   return $happy; | ||||
| } | ||||
|  | ||||
| =head2 renumber_device( $current_ip, $new_ip ) | ||||
|  | ||||
| Will update all records in Netdisco referring to the device with | ||||
| C<$current_ip> to use C<$new_ip> instead, followed by renumbering the device | ||||
| iteself. | ||||
|  | ||||
| Returns true if the transaction completes, else returns false. | ||||
|  | ||||
| =cut | ||||
|  | ||||
| sub renumber_device { | ||||
|   my ($ip, $new_ip) = @_; | ||||
|   my $device = get_device($ip) or return 0; | ||||
|   return 0 if not $device->in_storage; | ||||
|  | ||||
|   my $happy = 0; | ||||
|   schema('netdisco')->txn_do(sub { | ||||
|     schema('netdisco')->resultset('UserLog')->create({ | ||||
|       username => session('logged_in_user'), | ||||
|       userip => scalar eval {request->remote_address}, | ||||
|       event => "Renumbered device from $ip to $new_ip", | ||||
|     }); | ||||
|  | ||||
|     $device->renumber($new_ip); | ||||
|     $happy = 1; | ||||
|   }); | ||||
|  | ||||
|   return $happy; | ||||
| } | ||||
|  | ||||
| =head2 check_device_no( $ip, $setting_name ) | ||||
|  | ||||
| Given the IP address of a device, returns true if the configuration setting | ||||
|   | ||||
		Reference in New Issue
	
	Block a user