65 lines
1.6 KiB
Perl
65 lines
1.6 KiB
Perl
package App::Netdisco::Worker::Plugin::PrimeSkiplist;
|
||
|
||
use Dancer ':syntax';
|
||
use Dancer::Plugin::DBIC 'schema';
|
||
|
||
use App::Netdisco::Worker::Plugin;
|
||
use aliased 'App::Netdisco::Worker::Status';
|
||
|
||
use App::Netdisco::Util::Device 'get_denied_actions';
|
||
use App::Netdisco::Util::MCE 'parse_max_workers';
|
||
use App::Netdisco::Backend::Job;
|
||
|
||
use Try::Tiny;
|
||
|
||
register_worker({ phase => 'main' }, sub {
|
||
my ($job, $workerconf) = @_;
|
||
my $happy = false;
|
||
|
||
my $devices = schema(vars->{'tenant'})->resultset('Device');
|
||
my $rs = schema(vars->{'tenant'})->resultset('DeviceSkip');
|
||
my %actionset = ();
|
||
|
||
while (my $d = $devices->next) {
|
||
my @badactions = get_denied_actions($d);
|
||
$actionset{$d->ip} = \@badactions if scalar @badactions;
|
||
}
|
||
|
||
debug sprintf 'priming device action skip list for %d devices',
|
||
scalar keys %actionset;
|
||
|
||
my $max_workers = parse_max_workers( setting('workers')->{tasks} ) || 0;
|
||
|
||
try {
|
||
schema(vars->{'tenant'})->txn_do(sub {
|
||
$rs->update_or_create({
|
||
backend => setting('workers')->{'BACKEND'},
|
||
device => $_,
|
||
actionset => $actionset{$_},
|
||
}, { key => 'primary' }) for keys %actionset;
|
||
});
|
||
|
||
# add one faux record to allow *walk actions to see there is a backend running
|
||
$rs->update_or_create({
|
||
backend => setting('workers')->{'BACKEND'},
|
||
device => '255.255.255.255',
|
||
last_defer => \'LOCALTIMESTAMP',
|
||
deferrals => $max_workers,
|
||
}, { key => 'primary' });
|
||
|
||
$happy = true;
|
||
}
|
||
catch {
|
||
error $_;
|
||
};
|
||
|
||
if ($happy) {
|
||
return Status->done("Primed device action skip list");
|
||
}
|
||
else {
|
||
return Status->error("Failed to prime device action skip list");
|
||
}
|
||
});
|
||
|
||
true;
|