use Dancer ':syntax';
use App::Netdisco::Util::DNS 'hostname_from_ip';
use App::Netdisco::Util::Statistics 'pretty_version';
use NetAddr::IP::Lite ':lower';
register_worker({ phase => 'check' }, sub {
my ($job, $workerconf) = @_;
my $name = $job->extra;
my $ports = $job->port;
return Status->error('Missing or invalid device IP (-d).')
unless $job->device;
my $devip = $job->device->ip;
return Status->error('Missing or invalid device name (-e).')
unless $name
and $name =~ m/^[[:print:]]+$/
and $name !~ m/[[:space:]]/;
my $ip = NetAddr::IP::Lite->new($devip);
return Status->error('Missing or invalid device IP (-d).')
unless ($ip and $ip->addr ne '0.0.0.0');
return Status->error('Missing or invalid number of device ports (-p).')
unless $ports
and $ports =~ m/^[[:digit:]]+$/;
return Status->done('Pseudo Devive can be added');
});
register_worker({ phase => 'main' }, sub {
my ($job, $workerconf) = @_;
my $devip = $job->device->ip;
my $name = $job->extra;
my $ports = $job->port;
schema('netdisco')->txn_do(sub {
my $device = schema('netdisco')->resultset('Device')
->create({
ip => $devip,
dns => (hostname_from_ip($devip) || ''),
name => $name,
vendor => 'netdisco',
model => 'pseudodevice',
num_ports => $ports,
os => 'netdisco',
os_ver => pretty_version($App::Netdisco::VERSION, 3),
layers => '00000100',
last_discover => \'LOCALTIMESTAMP',
is_pseudo => \'true',
});
return unless $device;
$device->ports->populate([
[qw/port type descr/],
map {["Port$_", 'other', "Port$_"]} @{[1 .. $ports]},
]);
# device_ip table is used to show whether topo is "broken"
schema('netdisco')->resultset('DeviceIp')
->create({
ip => $devip,
alias => $devip,
});
});
return Status->done(
sprintf "Pseudo Devive %s (%s) added", $devip, $name);
});
true;