line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Haineko::CLI::Daemon; |
2
|
1
|
|
|
1
|
|
5337
|
use parent 'Haineko::CLI'; |
|
1
|
|
|
|
|
724
|
|
|
1
|
|
|
|
|
9
|
|
3
|
1
|
|
|
1
|
|
48
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
41
|
|
4
|
1
|
|
|
1
|
|
8
|
use warnings; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
512
|
|
5
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
sub options { |
7
|
|
|
|
|
|
|
return { |
8
|
0
|
|
|
0
|
|
|
'exec' => ( 1 << 0 ), |
9
|
|
|
|
|
|
|
'test' => ( 1 << 1 ), |
10
|
|
|
|
|
|
|
'auth' => ( 1 << 2 ), |
11
|
|
|
|
|
|
|
}; |
12
|
|
|
|
|
|
|
} |
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
sub default { |
15
|
|
|
|
|
|
|
return { |
16
|
0
|
|
|
0
|
|
|
'env' => 'production', |
17
|
|
|
|
|
|
|
'app' => '', |
18
|
|
|
|
|
|
|
'root' => '', |
19
|
|
|
|
|
|
|
'host' => '127.0.0.1', |
20
|
|
|
|
|
|
|
'port' => 2794, |
21
|
|
|
|
|
|
|
'config' => '', |
22
|
|
|
|
|
|
|
'server' => 'Standalone', |
23
|
|
|
|
|
|
|
'logging' => { 'disabled' => 1, 'facility' => 'user', 'file' => '' }, |
24
|
|
|
|
|
|
|
'workers' => 2, |
25
|
|
|
|
|
|
|
'maxreqs' => 100, |
26
|
|
|
|
|
|
|
'interval'=> 2, |
27
|
|
|
|
|
|
|
}; |
28
|
|
|
|
|
|
|
} |
29
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
sub run { |
31
|
|
|
|
|
|
|
my $self = shift; |
32
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
my $o = __PACKAGE__->options; |
34
|
|
|
|
|
|
|
my $r = $self->r; |
35
|
|
|
|
|
|
|
my $p = $self->{'params'}; |
36
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
return 0 unless $r & $o->{'exec'}; |
38
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
my $runnerprog = undef; |
40
|
|
|
|
|
|
|
my $watchingon = []; |
41
|
|
|
|
|
|
|
my $plackuparg = []; |
42
|
|
|
|
|
|
|
my $commandarg = q(); |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
$ENV{'PLACKENV'} = $p->{'env'}; |
45
|
|
|
|
|
|
|
$ENV{'HAINEKO_ROOT'} = $p->{'root'}; |
46
|
|
|
|
|
|
|
$ENV{'HAINEKO_CONF'} = $p->{'config'}; |
47
|
|
|
|
|
|
|
$ENV{'HAINEKO_AUTH'} = $p->{'root'}.'/etc/password'; |
48
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
push @$watchingon, './lib' if -d './lib'; |
50
|
|
|
|
|
|
|
push @$watchingon, './etc' if -d './etc'; |
51
|
|
|
|
|
|
|
push @$watchingon, $p->{'root'}.'/etc'; |
52
|
|
|
|
|
|
|
push @$watchingon, $p->{'root'}.'/lib'; |
53
|
|
|
|
|
|
|
push @$plackuparg, '-R', join( ',', @$watchingon ); |
54
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
push @$plackuparg, '-a', $p->{'app'}; |
56
|
|
|
|
|
|
|
push @$plackuparg, '-o', $p->{'host'}; |
57
|
|
|
|
|
|
|
push @$plackuparg, '-p', $p->{'port'}; |
58
|
|
|
|
|
|
|
push @$plackuparg, '-L', 'Restarter'; |
59
|
|
|
|
|
|
|
push @$plackuparg, '-s', $p->{'server'}; |
60
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
if( $p->{'server'} eq 'Starlet' ) { |
63
|
|
|
|
|
|
|
# −−max−workers=# |
64
|
|
|
|
|
|
|
# number of worker processes (default: 10) |
65
|
|
|
|
|
|
|
push @$plackuparg, '--max-workers', $p->{'workers'}; |
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
# −−max−reqs−per−child=# |
68
|
|
|
|
|
|
|
# max. number of requests to be handled before a worker process exits |
69
|
|
|
|
|
|
|
# (default: 100) |
70
|
|
|
|
|
|
|
push @$plackuparg, '--max-reqs-per-child', $p->{'maxreqs'}; |
71
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
} elsif( $p->{'server'} eq 'Starman' ) { |
73
|
|
|
|
|
|
|
# −−workers |
74
|
|
|
|
|
|
|
# Specifies the number of worker pool. Defaults to 5. |
75
|
|
|
|
|
|
|
push @$plackuparg, '--workers', $p->{'workers'}; |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
# −−max−requests |
78
|
|
|
|
|
|
|
# Number of the requests to process per one worker process. Defaults |
79
|
|
|
|
|
|
|
# to 1000. |
80
|
|
|
|
|
|
|
push @$plackuparg, '--max-requests', $p->{'maxreqs'}; |
81
|
|
|
|
|
|
|
} |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
if( length $self->{'logging'}->{'file'} ) { |
84
|
|
|
|
|
|
|
# --access-log /path/to/logfile |
85
|
|
|
|
|
|
|
push @$plackuparg, '--access-log', $self->{'logging'}->{'file'}; |
86
|
|
|
|
|
|
|
} |
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
if( $r & $o->{'test'} ) { |
90
|
|
|
|
|
|
|
# Development mode |
91
|
|
|
|
|
|
|
require Plack::Runner; |
92
|
|
|
|
|
|
|
$runnerprog = Plack::Runner->new; |
93
|
|
|
|
|
|
|
$ENV{'HAINEKO_DEBUG'} = 1; |
94
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
if( $r & $o->{'auth'} ) { |
96
|
|
|
|
|
|
|
# Require Basic-Authentication when connected to Haineko server |
97
|
|
|
|
|
|
|
if( -f $p->{'root'}.'/etc/password-debug' && -r _ && -e _ ) { |
98
|
|
|
|
|
|
|
# Use etc/password-debug if it exists |
99
|
|
|
|
|
|
|
$ENV{'HAINEKO_AUTH'} = $p->{'root'}.'/etc/password-debug'; |
100
|
|
|
|
|
|
|
$self->p( 'Require Basic-Authentication: '.$ENV{'HAINEKO_AUTH'}, 1 ); |
101
|
|
|
|
|
|
|
} |
102
|
|
|
|
|
|
|
} |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
$self->makepf; |
105
|
|
|
|
|
|
|
$runnerprog->parse_options( @$plackuparg ); |
106
|
|
|
|
|
|
|
$runnerprog->run; |
107
|
|
|
|
|
|
|
$self->p( 'Start Haineko server', 0 ); |
108
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
} else { |
110
|
|
|
|
|
|
|
# Production mode |
111
|
1
|
|
|
1
|
|
1962
|
use Server::Starter qw(start_server restart_server); |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
112
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
if( $r & $o->{'auth'} ) { |
114
|
|
|
|
|
|
|
# Require Basic-Authentication when connected to Haineko server |
115
|
|
|
|
|
|
|
if( -f $p->{'root'}.'/etc/password' && -r _ && -e _ ) { |
116
|
|
|
|
|
|
|
# Use etc/password-debug if it exists |
117
|
|
|
|
|
|
|
$ENV{'HAINEKO_AUTH'} = $p->{'root'}.'/etc/password'; |
118
|
|
|
|
|
|
|
$self->p( 'Require Basic-Authentication: '.$ENV{'HAINEKO_AUTH'}, 1 ); |
119
|
|
|
|
|
|
|
} |
120
|
|
|
|
|
|
|
} |
121
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
# Status file is saved in the same directory of pid file. |
123
|
|
|
|
|
|
|
my $s = $self->{'pidfile'}; $s =~ s|[.]pid|.status|; |
124
|
|
|
|
|
|
|
|
125
|
|
|
|
|
|
|
unshift @$plackuparg, __PACKAGE__->which('plackup'); |
126
|
|
|
|
|
|
|
push @$plackuparg, '--daemonize'; |
127
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
$commandarg .= 'nohup '; |
129
|
|
|
|
|
|
|
$commandarg .= __PACKAGE__->which('start_server'); |
130
|
|
|
|
|
|
|
$commandarg .= ' --port='.$p->{'port'}; |
131
|
|
|
|
|
|
|
$commandarg .= ' --interval='.$p->{'interval'}; |
132
|
|
|
|
|
|
|
$commandarg .= ' --pid-file='.$self->{'pidfile'}; |
133
|
|
|
|
|
|
|
$commandarg .= ' --status-file='.$s; |
134
|
|
|
|
|
|
|
$commandarg .= ' -- '; |
135
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
if( $self->makerf( $plackuparg ) ) { |
137
|
|
|
|
|
|
|
# command line for starting plackup is saved in run/haineko.sh, and |
138
|
|
|
|
|
|
|
# the file is the argument of start_server. |
139
|
|
|
|
|
|
|
$commandarg .= $self->{'runfile'}; |
140
|
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
} else { |
142
|
|
|
|
|
|
|
# command line for starting plackup is the argument of start_server. |
143
|
|
|
|
|
|
|
$commandarg .= join( ' ', @$plackuparg ); |
144
|
|
|
|
|
|
|
} |
145
|
|
|
|
|
|
|
$commandarg .= ' > /dev/null &'; |
146
|
|
|
|
|
|
|
|
147
|
|
|
|
|
|
|
$self->p( 'Start Haineko server', 0 ); |
148
|
|
|
|
|
|
|
exec $commandarg; |
149
|
|
|
|
|
|
|
} |
150
|
|
|
|
|
|
|
} |
151
|
|
|
|
|
|
|
|
152
|
|
|
|
|
|
|
sub ctrl { |
153
|
|
|
|
|
|
|
my $self = shift; |
154
|
|
|
|
|
|
|
my $argv = shift || return undef; |
155
|
|
|
|
|
|
|
my $sigs = { |
156
|
|
|
|
|
|
|
'stop' => 'TERM', |
157
|
|
|
|
|
|
|
'reload' => 'USR1', |
158
|
|
|
|
|
|
|
'restart' => 'HUP', |
159
|
|
|
|
|
|
|
}; |
160
|
|
|
|
|
|
|
|
161
|
|
|
|
|
|
|
return undef unless $argv =~ m/\A(?:start|stop|reload|restart)\z/; |
162
|
|
|
|
|
|
|
if( $argv eq 'start' ) { |
163
|
|
|
|
|
|
|
# start haineko server |
164
|
|
|
|
|
|
|
$self->run; |
165
|
|
|
|
|
|
|
|
166
|
|
|
|
|
|
|
} else { |
167
|
|
|
|
|
|
|
# stop, reload, and restart haineko server |
168
|
|
|
|
|
|
|
my $p = $self->readpf; |
169
|
|
|
|
|
|
|
my $s = 0; |
170
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
$self->e( sprintf( "Cannot read %s", $self->pidfile ) ) unless $p; |
172
|
|
|
|
|
|
|
$s = kill( $sigs->{ $argv }, $p ); |
173
|
|
|
|
|
|
|
|
174
|
|
|
|
|
|
|
if( $argv eq 'stop' ) { |
175
|
|
|
|
|
|
|
# Sleep for a few seconds until the process exits |
176
|
|
|
|
|
|
|
sleep $self->{'params'}->{'interval'}; |
177
|
|
|
|
|
|
|
|
178
|
|
|
|
|
|
|
if( kill( 0, $p ) ) { |
179
|
|
|
|
|
|
|
# If the process is still running, send 'KILL' signal to the |
180
|
|
|
|
|
|
|
# process |
181
|
|
|
|
|
|
|
kill( 'KILL', $p ); |
182
|
|
|
|
|
|
|
sleep $self->{'params'}->{'interval'}; |
183
|
|
|
|
|
|
|
} |
184
|
|
|
|
|
|
|
|
185
|
|
|
|
|
|
|
$self->{'runfile'} = $self->{'pidfile'}; |
186
|
|
|
|
|
|
|
$self->{'runfile'} =~ s|[.]pid|.sh|; |
187
|
|
|
|
|
|
|
$self->removepf; |
188
|
|
|
|
|
|
|
$self->removerf; |
189
|
|
|
|
|
|
|
} |
190
|
|
|
|
|
|
|
$self->p( ucfirst $argv.' Haineko server', 0 ); |
191
|
|
|
|
|
|
|
return $s; |
192
|
|
|
|
|
|
|
} |
193
|
|
|
|
|
|
|
} |
194
|
|
|
|
|
|
|
|
195
|
|
|
|
|
|
|
sub parseoptions { |
196
|
|
|
|
|
|
|
my $self = shift; |
197
|
|
|
|
|
|
|
my $dirs = [ '.', '/usr/local/haineko', '/usr/local' ]; |
198
|
|
|
|
|
|
|
my $opts = __PACKAGE__->options; |
199
|
|
|
|
|
|
|
my $defs = __PACKAGE__->default; |
200
|
|
|
|
|
|
|
my $conf = {}; %$conf = %$defs; |
201
|
|
|
|
|
|
|
|
202
|
|
|
|
|
|
|
my $r = 0; # Run mode value |
203
|
|
|
|
|
|
|
my $p = {}; # Parsed options |
204
|
|
|
|
|
|
|
my $q = undef; # Path::Class::File |
205
|
|
|
|
|
|
|
|
206
|
|
|
|
|
|
|
use Getopt::Long qw/:config posix_default no_ignore_case bundling auto_help/; |
207
|
|
|
|
|
|
|
Getopt::Long::GetOptions( $p, |
208
|
|
|
|
|
|
|
'app|a=s', # Path to psgi file |
209
|
|
|
|
|
|
|
'auth|A', # Require basic-authenticaion |
210
|
|
|
|
|
|
|
'conf|C=s', # Configuration file |
211
|
|
|
|
|
|
|
'devel|d', # Developement mode |
212
|
|
|
|
|
|
|
'debug', # same as --devel |
213
|
|
|
|
|
|
|
'help', # --help |
214
|
|
|
|
|
|
|
'host|h=s', # Hostname |
215
|
|
|
|
|
|
|
'log|l=s', # Access log |
216
|
|
|
|
|
|
|
'port|p=i', # Port |
217
|
|
|
|
|
|
|
'server|s=s', # Server, -s option of plackup |
218
|
|
|
|
|
|
|
'workers|w=i', # --max-workers of plackup |
219
|
|
|
|
|
|
|
'maxreqs|x=i', # --max-requests |
220
|
|
|
|
|
|
|
'verbose|v+', # Verbose |
221
|
|
|
|
|
|
|
); |
222
|
|
|
|
|
|
|
|
223
|
|
|
|
|
|
|
if( $p->{'help'} ) { |
224
|
|
|
|
|
|
|
# --help |
225
|
|
|
|
|
|
|
require Haineko::CLI::Help; |
226
|
|
|
|
|
|
|
my $o = Haineko::CLI::Help->new( 'command' => [ caller ]->[1] ); |
227
|
|
|
|
|
|
|
$o->add( __PACKAGE__->help('s'), 'subcommand' ); |
228
|
|
|
|
|
|
|
$o->add( __PACKAGE__->help('o'), 'option' ); |
229
|
|
|
|
|
|
|
$o->add( __PACKAGE__->help('e'), 'example' ); |
230
|
|
|
|
|
|
|
$o->mesg; |
231
|
|
|
|
|
|
|
exit(0); |
232
|
|
|
|
|
|
|
} |
233
|
|
|
|
|
|
|
|
234
|
|
|
|
|
|
|
if( defined $p->{'devel'} || defined $p->{'debug'} ) { |
235
|
|
|
|
|
|
|
# Turn on the development mode |
236
|
|
|
|
|
|
|
$r |= $opts->{'test'}; |
237
|
|
|
|
|
|
|
$conf->{'env'} = 'development'; |
238
|
|
|
|
|
|
|
} |
239
|
|
|
|
|
|
|
|
240
|
|
|
|
|
|
|
# Require Basic-Authentication |
241
|
|
|
|
|
|
|
$r |= $opts->{'auth'} if defined $p->{'auth'}; |
242
|
|
|
|
|
|
|
|
243
|
|
|
|
|
|
|
if( $p->{'conf'} ) { |
244
|
|
|
|
|
|
|
# Load configuration file specified with -C or --conf option |
245
|
|
|
|
|
|
|
if( -f $p->{'conf'} && -r _ && -s _ ) { |
246
|
|
|
|
|
|
|
$conf->{'config'} = $p->{'conf'}; |
247
|
|
|
|
|
|
|
|
248
|
|
|
|
|
|
|
} else { |
249
|
|
|
|
|
|
|
$self->e( sprintf( "Config file: %s not found", $p->{'conf'} ) ) unless -f $p->{'conf'}; |
250
|
|
|
|
|
|
|
$self->e( sprintf( "Config file: %s is empty", $p->{'conf'} ) ) unless -s $p->{'conf'}; |
251
|
|
|
|
|
|
|
$self->e( sprintf( "Config file: cannot read %s", $p->{'conf'} ) ) unless -r $p->{'conf'}; |
252
|
|
|
|
|
|
|
} |
253
|
|
|
|
|
|
|
|
254
|
|
|
|
|
|
|
} else { |
255
|
|
|
|
|
|
|
# No configuration file specified at -C option |
256
|
|
|
|
|
|
|
for my $g ( @$dirs ) { |
257
|
|
|
|
|
|
|
# Find haineko.cf |
258
|
|
|
|
|
|
|
my $f = sprintf( "%s/etc/haineko.cf", $g ); |
259
|
|
|
|
|
|
|
my $v = $r & $opts->{'test'} ? $f.'-debug' : q(); |
260
|
|
|
|
|
|
|
|
261
|
|
|
|
|
|
|
if( $v && -f $v && -s _ && -r _ ) { |
262
|
|
|
|
|
|
|
# etc/haineko.cf-debug exists; |
263
|
|
|
|
|
|
|
$conf->{'config'} = $v; |
264
|
|
|
|
|
|
|
last; |
265
|
|
|
|
|
|
|
} |
266
|
|
|
|
|
|
|
next unless -f $f; |
267
|
|
|
|
|
|
|
next unless -s $f; |
268
|
|
|
|
|
|
|
next unless -r $f; |
269
|
|
|
|
|
|
|
|
270
|
|
|
|
|
|
|
$conf->{'config'} = $f; |
271
|
|
|
|
|
|
|
last; |
272
|
|
|
|
|
|
|
} |
273
|
|
|
|
|
|
|
} |
274
|
|
|
|
|
|
|
|
275
|
|
|
|
|
|
|
if( $conf->{'config'} ) { |
276
|
|
|
|
|
|
|
$q = Path::Class::File->new( $conf->{'config'} )->dir; |
277
|
|
|
|
|
|
|
$conf->{'root'} = $q->resolve->absolute->parent; |
278
|
|
|
|
|
|
|
|
279
|
|
|
|
|
|
|
} else { |
280
|
|
|
|
|
|
|
$conf->{'config'} = '/dev/null'; |
281
|
|
|
|
|
|
|
$q = Path::Class::Dir->new( './' ); |
282
|
|
|
|
|
|
|
$conf->{'root'} = $q->resolve->absolute; |
283
|
|
|
|
|
|
|
} |
284
|
|
|
|
|
|
|
|
285
|
|
|
|
|
|
|
if( $p->{'app'} ) { |
286
|
|
|
|
|
|
|
if( -f $p->{'app'} && -s _ && -r _ ) { |
287
|
|
|
|
|
|
|
# Set the path to haineko.psgi |
288
|
|
|
|
|
|
|
$conf->{'app'} = $p->{'app'}; |
289
|
|
|
|
|
|
|
|
290
|
|
|
|
|
|
|
} else { |
291
|
|
|
|
|
|
|
# haineko.psgi not found |
292
|
|
|
|
|
|
|
$self->e( sprintf( "PSGI file: %s not found", $p->{'app'} ) ) unless -f $p->{'app'}; |
293
|
|
|
|
|
|
|
$self->e( sprintf( "PSGI file: %s is empty", $p->{'app'} ) ) unless -s $p->{'app'}; |
294
|
|
|
|
|
|
|
$self->e( sprintf( "PSGI file: cannot read %s", $p->{'app'} ) ) unless -r $p->{'app'}; |
295
|
|
|
|
|
|
|
} |
296
|
|
|
|
|
|
|
|
297
|
|
|
|
|
|
|
} else { |
298
|
|
|
|
|
|
|
for my $g ( @$dirs ) { |
299
|
|
|
|
|
|
|
# Find haineko.psgi |
300
|
|
|
|
|
|
|
my $f = sprintf( "%s/libexec/haineko.psgi", $g ); |
301
|
|
|
|
|
|
|
next unless -f $f; |
302
|
|
|
|
|
|
|
next unless -s $f; |
303
|
|
|
|
|
|
|
next unless -r $f; |
304
|
|
|
|
|
|
|
|
305
|
|
|
|
|
|
|
$conf->{'app'} = $f; |
306
|
|
|
|
|
|
|
last; |
307
|
|
|
|
|
|
|
} |
308
|
|
|
|
|
|
|
} |
309
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
for my $e ( 'host', 'port' ) { |
311
|
|
|
|
|
|
|
# Host, Port and PSGI file |
312
|
|
|
|
|
|
|
next unless defined $p->{ $e }; |
313
|
|
|
|
|
|
|
$conf->{ $e } = $p->{ $e }; |
314
|
|
|
|
|
|
|
} |
315
|
|
|
|
|
|
|
for my $e ( 'server', 'workers' ) { |
316
|
|
|
|
|
|
|
# Override the value with the value in argument |
317
|
|
|
|
|
|
|
next unless $p->{ $e }; |
318
|
|
|
|
|
|
|
$conf->{ $e } = $p->{ $e }; |
319
|
|
|
|
|
|
|
} |
320
|
|
|
|
|
|
|
|
321
|
|
|
|
|
|
|
$self->v( $p->{'verbose'} ); |
322
|
|
|
|
|
|
|
$self->p( sprintf( "Run mode = %d", $r ), 1 ); |
323
|
|
|
|
|
|
|
$self->p( sprintf( "Debug level = %d", $self->v ), 1 ); |
324
|
|
|
|
|
|
|
$self->p( sprintf( "Hostname = %s", $conf->{'host'} ), 1 ); |
325
|
|
|
|
|
|
|
$self->p( sprintf( "Port = %d", $conf->{'port'} ), 1 ); |
326
|
|
|
|
|
|
|
$self->p( sprintf( "Server = %s", $conf->{'server'} ), 1 ); |
327
|
|
|
|
|
|
|
$self->p( sprintf( "PSGI application file = %s", $conf->{'app'} ), 1 ); |
328
|
|
|
|
|
|
|
$self->p( sprintf( "PLACKENV value = %s", $conf->{'env'} ), 1 ); |
329
|
|
|
|
|
|
|
$self->p( sprintf( "Configuration file = %s", $conf->{'config'} ), 1 ); |
330
|
|
|
|
|
|
|
|
331
|
|
|
|
|
|
|
if( $p->{'log'} ) { |
332
|
|
|
|
|
|
|
|
333
|
|
|
|
|
|
|
$self->{'logging'}->{'disabled'} = 0; |
334
|
|
|
|
|
|
|
$self->{'logging'}->{'file'} = $p->{'log'}; |
335
|
|
|
|
|
|
|
$self->p( sprintf( "Access log file = %s", $p->{'log'} ) ); |
336
|
|
|
|
|
|
|
|
337
|
|
|
|
|
|
|
} else { |
338
|
|
|
|
|
|
|
|
339
|
|
|
|
|
|
|
$self->{'logging'} = $conf->{'logging'} // $defs->{'logging'}; |
340
|
|
|
|
|
|
|
if( not $self->{'logging'}->{'disabled'} ) { |
341
|
|
|
|
|
|
|
# syslog |
342
|
|
|
|
|
|
|
$self->p( sprintf( "Syslog disabled = %d", $self->{'logging'}->{'disabled'} ), 2 ); |
343
|
|
|
|
|
|
|
$self->p( sprintf( "Syslog facility = %s", $self->{'logging'}->{'facility'} ), 2 ); |
344
|
|
|
|
|
|
|
} |
345
|
|
|
|
|
|
|
} |
346
|
|
|
|
|
|
|
|
347
|
|
|
|
|
|
|
$r |= $opts->{'exec'}; |
348
|
|
|
|
|
|
|
$self->r( $r ); |
349
|
|
|
|
|
|
|
$self->{'params'} = $conf; |
350
|
|
|
|
|
|
|
return $r; |
351
|
|
|
|
|
|
|
} |
352
|
|
|
|
|
|
|
|
353
|
|
|
|
|
|
|
sub help { |
354
|
|
|
|
|
|
|
my $class = shift; |
355
|
|
|
|
|
|
|
my $argvs = shift || q(); |
356
|
|
|
|
|
|
|
|
357
|
|
|
|
|
|
|
my $d = __PACKAGE__->default; |
358
|
|
|
|
|
|
|
my $commoption = [ |
359
|
|
|
|
|
|
|
'-A, --auth' => 'Require Basic Authentication.', |
360
|
|
|
|
|
|
|
'-a, --app ' => 'Path to a psgi file.', |
361
|
|
|
|
|
|
|
'-C, --conf ' => 'Path to a configuration file.', |
362
|
|
|
|
|
|
|
'-d, --devel,--debug' => 'Run on developement mode.', |
363
|
|
|
|
|
|
|
'-h, --host ' => 'Binds to a TCP interface. default: '.$d->{'host'}, |
364
|
|
|
|
|
|
|
'-l, --log ' => 'Access log.', |
365
|
|
|
|
|
|
|
'-p, --port ' => 'Binds to a TCP port. default: '.$d->{'port'}, |
366
|
|
|
|
|
|
|
'-s, --server '=> 'Server implementation to run on for plackup -s. default: '.$d->{'server'}, |
367
|
|
|
|
|
|
|
'-w, --workers ' => 'The number of max workers for Handler(-s option). default: '.$d->{'workers'}, |
368
|
|
|
|
|
|
|
'-x, --maxreqs ' => 'The number of max requests per child. default: '.$d->{'maxreqs'}, |
369
|
|
|
|
|
|
|
'-v, --verbose' => 'Verbose mode.', |
370
|
|
|
|
|
|
|
'--help' => 'This screen', |
371
|
|
|
|
|
|
|
]; |
372
|
|
|
|
|
|
|
my $subcommand = [ |
373
|
|
|
|
|
|
|
'start' => 'Start haineko server', |
374
|
|
|
|
|
|
|
'reload' => 'Send "USR1" signal to the server', |
375
|
|
|
|
|
|
|
'restart' => 'Restart the server, send "HUP" signal', |
376
|
|
|
|
|
|
|
'stop' => 'Stop the server, send "TERM" signal', |
377
|
|
|
|
|
|
|
'status' => 'Show the process id of running haineko server', |
378
|
|
|
|
|
|
|
]; |
379
|
|
|
|
|
|
|
my $forexample = [ |
380
|
|
|
|
|
|
|
'hainekoctl start -s Starlet -w 4 -x 1000', |
381
|
|
|
|
|
|
|
'hainekoctl start -d -h 127.0.0.1 -p 2222 -C /tmp/neko.cf', |
382
|
|
|
|
|
|
|
]; |
383
|
|
|
|
|
|
|
|
384
|
|
|
|
|
|
|
return $commoption if $argvs eq 'o' || $argvs eq 'option'; |
385
|
|
|
|
|
|
|
return $subcommand if $argvs eq 's' || $argvs eq 'subcommand'; |
386
|
|
|
|
|
|
|
return $forexample if $argvs eq 'e' || $argvs eq 'example'; |
387
|
|
|
|
|
|
|
return undef; |
388
|
|
|
|
|
|
|
} |
389
|
|
|
|
|
|
|
|
390
|
|
|
|
|
|
|
1; |
391
|
|
|
|
|
|
|
__END__ |