#!/usr/bin/env perl
FindBin::again();
BEGIN {
unshift
@INC
,
dir(
$FindBin::RealBin
)->parent->subdir(
'lib'
)->stringify,
dir(
$FindBin::RealBin
,
'lib'
)->stringify;
unshift
@INC
,
split
m/:/, (
$ENV
{NETDISCO_INC} ||
''
);
}
use
Dancer
qw/:moose :script/
;
BEGIN {
warning
sprintf
"App::Netdisco %s backend"
, (
$App::Netdisco::VERSION
||
'HEAD'
);
info
'resolving backend hostname...'
;
setting(
'workers'
)->{
'BACKEND'
} ||= (hostfqdn ||
'fqdn-undefined'
);
}
my
$home
= (
$ENV
{NETDISCO_HOME} ||
$ENV
{HOME});
my
$tmp_dir
= (
$ENV
{NETDISCO_TEMP} || dir(
$home
,
'tmp'
));
mkdir
$tmp_dir
if
! -d
$tmp_dir
;
prctl
'nd2: master'
;
my
$queue
= MCE::Queue->new;
setting(
'workers'
)->{
'no_manager'
} = 1
if
setting(
'workers'
)->{tasks} eq
'0'
;
my
$max_workers
= parse_max_workers( setting(
'workers'
)->{tasks} ) || 0;
mce_flow {
task_name
=> [
qw/ scheduler manager poller /
],
max_workers
=> [ 1, 1,
$max_workers
],
tmp_dir
=>
$tmp_dir
,
on_post_exit
=>
sub
{ MCE->restart_worker },
}, _mk_wkr(
'Scheduler'
), _mk_wkr(
'Manager'
), _mk_wkr(
'Poller'
);
sub
_mk_wkr {
my
$role
=
shift
;
return
sub
{
my
$self
=
shift
;
$self
->{queue} =
$queue
;
prctl
sprintf
'nd2: #%s %s: init'
, MCE->wid,
lc
(
$role
);
info
sprintf
'applying role %s to worker %s'
,
$role
, MCE->wid;
Role::Tiny->apply_roles_to_object(
$self
=>
"App::Netdisco::Backend::Role::$role"
);
$self
->worker_begin
if
$self
->can(
'worker_begin'
);
$self
->worker_body;
};
}