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;
 |