[#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