Commit | Line | Data |
2bb8737c |
1 | package Tak::Daemon::DaemonService; |
2 | |
3 | use POSIX; |
4 | use Log::Contextual (); |
5 | use Log::Contextual::SimpleLogger; |
6 | use Tak::Router; |
7 | use Moo; |
8 | |
9 | with 'Tak::Role::Service'; |
10 | |
11 | has 'set_done_cb' => (is => 'rw'); |
12 | |
13 | has 'router' => (is => 'lazy'); |
14 | |
15 | sub _build_router { Tak::Router->new } |
16 | |
17 | sub handle_daemonize { |
18 | my ($self) = @_; |
19 | fork and exit; |
20 | POSIX::setsid or die "Couldn't setsid: $!"; |
21 | fork and exit; |
22 | close STDERR; |
23 | open STDERR, '>', '/dev/null' or die "Couldn't re-open stderr: $!"; |
24 | Log::Contextual::set_logger( # there's no NullLogger? I thought I wrote one |
25 | Log::Contextual::SimpleLogger->new({ levels => [] }) |
26 | ); |
27 | return 'done'; |
28 | } |
29 | |
30 | sub handle_become_successor { |
31 | my ($self) = @_; |
32 | my $done; |
33 | $self->set_done_cb(sub { $done = 1 }); |
34 | $Tak::STDIOSetup::Next = $Tak::STDIOSetup::Next = sub { |
35 | my $x = $self; # close over |
36 | $0 = 'tak-daemon-node'; |
37 | Tak->loop_until($done); |
38 | }; |
39 | return 'done'; |
40 | } |
41 | |
42 | sub handle_shutdown { |
43 | my ($self) = @_; |
44 | $self->set_done_cb->(); |
45 | return 'done'; |
46 | } |
47 | |
48 | sub start_router_request { |
49 | shift->router->start_request(@_); |
50 | } |
51 | |
52 | sub receive_router { |
53 | shift->router->receive(@_); |
54 | } |
55 | |
56 | 1; |