1package App::Netdisco::Worker::Plugin::Renumber; 2 3use Dancer ':syntax'; 4use App::Netdisco::Worker::Plugin; 5use aliased 'App::Netdisco::Worker::Status'; 6 7use NetAddr::IP qw/:rfc3021 :lower/; 8use App::Netdisco::Util::Device qw/get_device renumber_device/; 9 10register_worker({ phase => 'check' }, sub { 11 my ($job, $workerconf) = @_; 12 13 return Status->error('Missing device (-d).') 14 unless defined shift->device; 15 16 my $new_ip = NetAddr::IP->new($job->extra); 17 unless ($new_ip and $new_ip->addr ne '0.0.0.0') { 18 return Status->error("Bad host or IP: ".($job->extra || '0.0.0.0')); 19 } 20 21 return Status->done('Renumber is able to run'); 22}); 23 24register_worker({ phase => 'main' }, sub { 25 my ($job, $workerconf) = @_; 26 my ($device, $port, $extra) = map {$job->$_} qw/device port extra/; 27 28 my $old_ip = $device->ip; 29 my $new_ip = NetAddr::IP->new($extra); 30 31 my $new_dev = get_device($new_ip->addr); 32 if ($new_dev and $new_dev->in_storage and ($new_dev->ip ne $device->ip)) { 33 return Status->error(sprintf "Already know new device as: %s.", $new_dev->ip); 34 } 35 36 renumber_device($device, $new_ip); 37 return Status->done(sprintf 'Renumbered device %s to %s (%s).', 38 $device->ip, $new_ip, ($device->dns || '')); 39}); 40 41true; 42