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 }); |
9fcdac6d |
34 | # because this is funnier than "no warnings 'once'". Also because |
35 | # I don't have to stop and think "what else is in this lexical scope?" |
2bb8737c |
36 | $Tak::STDIOSetup::Next = $Tak::STDIOSetup::Next = sub { |
9fcdac6d |
37 | my $x = $self; # close over while evading void context warnings |
2bb8737c |
38 | $0 = 'tak-daemon-node'; |
39 | Tak->loop_until($done); |
40 | }; |
41 | return 'done'; |
42 | } |
43 | |
44 | sub handle_shutdown { |
45 | my ($self) = @_; |
46 | $self->set_done_cb->(); |
47 | return 'done'; |
48 | } |
49 | |
50 | sub start_router_request { |
51 | shift->router->start_request(@_); |
52 | } |
53 | |
54 | sub receive_router { |
55 | shift->router->receive(@_); |
56 | } |
57 | |
58 | 1; |