puma-simon 3.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/issue_template.md +20 -0
- data/.gitignore +18 -0
- data/.hoeignore +12 -0
- data/.travis.yml +29 -0
- data/DEPLOYMENT.md +91 -0
- data/Gemfile +12 -0
- data/History.md +1254 -0
- data/LICENSE +26 -0
- data/Manifest.txt +78 -0
- data/README.md +353 -0
- data/Rakefile +158 -0
- data/Release.md +9 -0
- data/bin/puma +10 -0
- data/bin/puma-wild +31 -0
- data/bin/pumactl +12 -0
- data/docs/nginx.md +80 -0
- data/docs/signals.md +43 -0
- data/docs/systemd.md +197 -0
- data/examples/CA/cacert.pem +23 -0
- data/examples/CA/newcerts/cert_1.pem +19 -0
- data/examples/CA/newcerts/cert_2.pem +19 -0
- data/examples/CA/private/cakeypair.pem +30 -0
- data/examples/CA/serial +1 -0
- data/examples/config.rb +200 -0
- data/examples/plugins/redis_stop_puma.rb +46 -0
- data/examples/puma/cert_puma.pem +19 -0
- data/examples/puma/client-certs/ca.crt +19 -0
- data/examples/puma/client-certs/ca.key +27 -0
- data/examples/puma/client-certs/client.crt +19 -0
- data/examples/puma/client-certs/client.key +27 -0
- data/examples/puma/client-certs/client_expired.crt +19 -0
- data/examples/puma/client-certs/client_expired.key +27 -0
- data/examples/puma/client-certs/client_unknown.crt +19 -0
- data/examples/puma/client-certs/client_unknown.key +27 -0
- data/examples/puma/client-certs/generate.rb +78 -0
- data/examples/puma/client-certs/keystore.jks +0 -0
- data/examples/puma/client-certs/server.crt +19 -0
- data/examples/puma/client-certs/server.key +27 -0
- data/examples/puma/client-certs/server.p12 +0 -0
- data/examples/puma/client-certs/unknown_ca.crt +19 -0
- data/examples/puma/client-certs/unknown_ca.key +27 -0
- data/examples/puma/csr_puma.pem +11 -0
- data/examples/puma/keystore.jks +0 -0
- data/examples/puma/puma_keypair.pem +15 -0
- data/examples/qc_config.rb +13 -0
- data/ext/puma_http11/PumaHttp11Service.java +17 -0
- data/ext/puma_http11/ext_help.h +15 -0
- data/ext/puma_http11/extconf.rb +15 -0
- data/ext/puma_http11/http11_parser.c +1069 -0
- data/ext/puma_http11/http11_parser.h +65 -0
- data/ext/puma_http11/http11_parser.java.rl +161 -0
- data/ext/puma_http11/http11_parser.rl +147 -0
- data/ext/puma_http11/http11_parser_common.rl +54 -0
- data/ext/puma_http11/io_buffer.c +155 -0
- data/ext/puma_http11/mini_ssl.c +457 -0
- data/ext/puma_http11/org/jruby/puma/Http11.java +234 -0
- data/ext/puma_http11/org/jruby/puma/Http11Parser.java +473 -0
- data/ext/puma_http11/org/jruby/puma/MiniSSL.java +339 -0
- data/ext/puma_http11/puma_http11.c +500 -0
- data/gemfiles/2.1-Gemfile +12 -0
- data/lib/puma.rb +15 -0
- data/lib/puma/accept_nonblock.rb +23 -0
- data/lib/puma/app/status.rb +66 -0
- data/lib/puma/binder.rb +402 -0
- data/lib/puma/cli.rb +220 -0
- data/lib/puma/client.rb +434 -0
- data/lib/puma/cluster.rb +510 -0
- data/lib/puma/commonlogger.rb +106 -0
- data/lib/puma/compat.rb +14 -0
- data/lib/puma/configuration.rb +364 -0
- data/lib/puma/const.rb +224 -0
- data/lib/puma/control_cli.rb +259 -0
- data/lib/puma/convenient.rb +23 -0
- data/lib/puma/daemon_ext.rb +31 -0
- data/lib/puma/delegation.rb +11 -0
- data/lib/puma/detect.rb +13 -0
- data/lib/puma/dsl.rb +486 -0
- data/lib/puma/events.rb +152 -0
- data/lib/puma/io_buffer.rb +7 -0
- data/lib/puma/java_io_buffer.rb +45 -0
- data/lib/puma/jruby_restart.rb +83 -0
- data/lib/puma/launcher.rb +410 -0
- data/lib/puma/minissl.rb +221 -0
- data/lib/puma/null_io.rb +42 -0
- data/lib/puma/plugin.rb +115 -0
- data/lib/puma/plugin/tmp_restart.rb +35 -0
- data/lib/puma/rack/backports/uri/common_193.rb +33 -0
- data/lib/puma/rack/builder.rb +298 -0
- data/lib/puma/rack/urlmap.rb +91 -0
- data/lib/puma/rack_default.rb +7 -0
- data/lib/puma/reactor.rb +210 -0
- data/lib/puma/runner.rb +171 -0
- data/lib/puma/server.rb +949 -0
- data/lib/puma/single.rb +112 -0
- data/lib/puma/state_file.rb +29 -0
- data/lib/puma/tcp_logger.rb +39 -0
- data/lib/puma/thread_pool.rb +297 -0
- data/lib/puma/util.rb +128 -0
- data/lib/rack/handler/puma.rb +78 -0
- data/puma.gemspec +52 -0
- data/test/ab_rs.rb +22 -0
- data/test/config.rb +2 -0
- data/test/config/app.rb +9 -0
- data/test/config/plugin.rb +1 -0
- data/test/config/settings.rb +2 -0
- data/test/config/state_file_testing_config.rb +14 -0
- data/test/hello-bind.ru +2 -0
- data/test/hello-delay.ru +3 -0
- data/test/hello-map.ru +3 -0
- data/test/hello-post.ru +4 -0
- data/test/hello-stuck.ru +1 -0
- data/test/hello-tcp.ru +5 -0
- data/test/hello.ru +1 -0
- data/test/hijack.ru +6 -0
- data/test/hijack2.ru +5 -0
- data/test/lobster.ru +4 -0
- data/test/shell/run.sh +24 -0
- data/test/shell/t1.rb +19 -0
- data/test/shell/t1_conf.rb +3 -0
- data/test/shell/t2.rb +17 -0
- data/test/shell/t2_conf.rb +6 -0
- data/test/shell/t3.rb +25 -0
- data/test/shell/t3_conf.rb +5 -0
- data/test/slow.ru +4 -0
- data/test/ssl_config.rb +4 -0
- data/test/test_app_status.rb +93 -0
- data/test/test_binder.rb +31 -0
- data/test/test_cli.rb +209 -0
- data/test/test_config.rb +95 -0
- data/test/test_events.rb +161 -0
- data/test/test_helper.rb +50 -0
- data/test/test_http10.rb +27 -0
- data/test/test_http11.rb +186 -0
- data/test/test_integration.rb +247 -0
- data/test/test_iobuffer.rb +39 -0
- data/test/test_minissl.rb +29 -0
- data/test/test_null_io.rb +49 -0
- data/test/test_persistent.rb +245 -0
- data/test/test_puma_server.rb +626 -0
- data/test/test_puma_server_ssl.rb +222 -0
- data/test/test_rack_handler.rb +57 -0
- data/test/test_rack_server.rb +138 -0
- data/test/test_tcp_logger.rb +39 -0
- data/test/test_tcp_rack.rb +36 -0
- data/test/test_thread_pool.rb +250 -0
- data/test/test_unix_socket.rb +35 -0
- data/test/test_web_server.rb +88 -0
- data/tools/jungle/README.md +9 -0
- data/tools/jungle/init.d/README.md +59 -0
- data/tools/jungle/init.d/puma +421 -0
- data/tools/jungle/init.d/run-puma +18 -0
- data/tools/jungle/upstart/README.md +61 -0
- data/tools/jungle/upstart/puma-manager.conf +31 -0
- data/tools/jungle/upstart/puma.conf +69 -0
- data/tools/trickletest.rb +45 -0
- metadata +297 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
#! /bin/sh
|
|
2
|
+
### BEGIN INIT INFO
|
|
3
|
+
# Provides: puma
|
|
4
|
+
# Required-Start: $remote_fs $syslog
|
|
5
|
+
# Required-Stop: $remote_fs $syslog
|
|
6
|
+
# Default-Start: 2 3 4 5
|
|
7
|
+
# Default-Stop: 0 1 6
|
|
8
|
+
# Short-Description: Puma web server
|
|
9
|
+
# Description: A ruby web server built for concurrency http://puma.io
|
|
10
|
+
# initscript to be placed in /etc/init.d.
|
|
11
|
+
### END INIT INFO
|
|
12
|
+
|
|
13
|
+
# Author: Darío Javier Cravero <dario@exordo.com>
|
|
14
|
+
#
|
|
15
|
+
# Do NOT "set -e"
|
|
16
|
+
|
|
17
|
+
# PATH should only include /usr/* if it runs after the mountnfs.sh script
|
|
18
|
+
PATH=/usr/local/bin:/usr/local/sbin/:/sbin:/usr/sbin:/bin:/usr/bin
|
|
19
|
+
DESC="Puma rack web server"
|
|
20
|
+
NAME=puma
|
|
21
|
+
DAEMON=$NAME
|
|
22
|
+
SCRIPTNAME=/etc/init.d/$NAME
|
|
23
|
+
CONFIG=/etc/puma.conf
|
|
24
|
+
JUNGLE=`cat $CONFIG`
|
|
25
|
+
RUNPUMA=/usr/local/bin/run-puma
|
|
26
|
+
USE_LOCAL_BUNDLE=0
|
|
27
|
+
|
|
28
|
+
# Load the VERBOSE setting and other rcS variables
|
|
29
|
+
. /lib/init/vars.sh
|
|
30
|
+
|
|
31
|
+
# Define LSB log_* functions.
|
|
32
|
+
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
|
|
33
|
+
. /lib/lsb/init-functions
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
# Function that starts the jungle
|
|
37
|
+
#
|
|
38
|
+
do_start() {
|
|
39
|
+
log_daemon_msg "=> Running the jungle..."
|
|
40
|
+
for i in $JUNGLE; do
|
|
41
|
+
dir=`echo $i | cut -d , -f 1`
|
|
42
|
+
do_start_one $dir
|
|
43
|
+
done
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
do_start_one() {
|
|
47
|
+
PIDFILE=$1/tmp/puma/pid
|
|
48
|
+
if [ -e $PIDFILE ]; then
|
|
49
|
+
PID=`cat $PIDFILE`
|
|
50
|
+
# If the puma isn't running, run it, otherwise restart it.
|
|
51
|
+
if [ "`ps -A -o pid= | grep -c $PID`" -eq 0 ]; then
|
|
52
|
+
do_start_one_do $1
|
|
53
|
+
else
|
|
54
|
+
do_restart_one $1
|
|
55
|
+
fi
|
|
56
|
+
else
|
|
57
|
+
do_start_one_do $1
|
|
58
|
+
fi
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
do_start_one_do() {
|
|
62
|
+
i=`grep $1 $CONFIG`
|
|
63
|
+
dir=`echo $i | cut -d , -f 1`
|
|
64
|
+
user=`echo $i | cut -d , -f 2`
|
|
65
|
+
config_file=`echo $i | cut -d , -f 3`
|
|
66
|
+
if [ "$config_file" = "" ]; then
|
|
67
|
+
config_file="$dir/config/puma.rb"
|
|
68
|
+
fi
|
|
69
|
+
log_file=`echo $i | cut -d , -f 4`
|
|
70
|
+
if [ "$log_file" = "" ]; then
|
|
71
|
+
log_file="$dir/log/puma.log"
|
|
72
|
+
fi
|
|
73
|
+
environment=`echo $i | cut -d , -f 5`
|
|
74
|
+
|
|
75
|
+
log_daemon_msg "--> Woke up puma $dir"
|
|
76
|
+
log_daemon_msg "user $user"
|
|
77
|
+
log_daemon_msg "log to $log_file"
|
|
78
|
+
|
|
79
|
+
if [ ! -z "$environment" ]; then
|
|
80
|
+
for e in $(echo "$environment" | tr ';' '\n'); do
|
|
81
|
+
log_daemon_msg "environment $e"
|
|
82
|
+
v=${e%%\=*} ; eval "$e" ; export $v
|
|
83
|
+
done
|
|
84
|
+
fi
|
|
85
|
+
|
|
86
|
+
start-stop-daemon --verbose --start --chdir $dir --chuid $user --background --exec $RUNPUMA -- $dir $config_file $log_file
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
#
|
|
90
|
+
# Function that stops the jungle
|
|
91
|
+
#
|
|
92
|
+
do_stop() {
|
|
93
|
+
log_daemon_msg "=> Putting all the beasts to bed..."
|
|
94
|
+
for i in $JUNGLE; do
|
|
95
|
+
dir=`echo $i | cut -d , -f 1`
|
|
96
|
+
do_stop_one $dir
|
|
97
|
+
done
|
|
98
|
+
}
|
|
99
|
+
#
|
|
100
|
+
# Function that stops the daemon/service
|
|
101
|
+
#
|
|
102
|
+
do_stop_one() {
|
|
103
|
+
log_daemon_msg "--> Stopping $1"
|
|
104
|
+
PIDFILE=$1/tmp/puma/pid
|
|
105
|
+
STATEFILE=$1/tmp/puma/state
|
|
106
|
+
if [ -e $PIDFILE ]; then
|
|
107
|
+
PID=`cat $PIDFILE`
|
|
108
|
+
if [ "`ps -A -o pid= | grep -c $PID`" -eq 0 ]; then
|
|
109
|
+
log_daemon_msg "---> Puma $1 isn't running."
|
|
110
|
+
else
|
|
111
|
+
log_daemon_msg "---> About to kill PID `cat $PIDFILE`"
|
|
112
|
+
if [ "$USE_LOCAL_BUNDLE" -eq 1 ]; then
|
|
113
|
+
cd $1 && bundle exec pumactl --state $STATEFILE stop
|
|
114
|
+
else
|
|
115
|
+
pumactl --state $STATEFILE stop
|
|
116
|
+
fi
|
|
117
|
+
# Many daemons don't delete their pidfiles when they exit.
|
|
118
|
+
rm -f $PIDFILE $STATEFILE
|
|
119
|
+
fi
|
|
120
|
+
else
|
|
121
|
+
log_daemon_msg "---> No puma here..."
|
|
122
|
+
fi
|
|
123
|
+
return 0
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
#
|
|
127
|
+
# Function that restarts the jungle
|
|
128
|
+
#
|
|
129
|
+
do_restart() {
|
|
130
|
+
for i in $JUNGLE; do
|
|
131
|
+
dir=`echo $i | cut -d , -f 1`
|
|
132
|
+
do_restart_one $dir
|
|
133
|
+
done
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
#
|
|
137
|
+
# Function that sends a SIGUSR2 to the daemon/service
|
|
138
|
+
#
|
|
139
|
+
do_restart_one() {
|
|
140
|
+
PIDFILE=$1/tmp/puma/pid
|
|
141
|
+
|
|
142
|
+
if [ -e $PIDFILE ]; then
|
|
143
|
+
log_daemon_msg "--> About to restart puma $1"
|
|
144
|
+
kill -s USR2 `cat $PIDFILE`
|
|
145
|
+
# TODO Check if process exist
|
|
146
|
+
else
|
|
147
|
+
log_daemon_msg "--> Your puma was never playing... Let's get it out there first"
|
|
148
|
+
do_start_one $1
|
|
149
|
+
fi
|
|
150
|
+
return 0
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
#
|
|
154
|
+
# Function that phased restarts the jungle
|
|
155
|
+
#
|
|
156
|
+
do_phased_restart() {
|
|
157
|
+
for i in $JUNGLE; do
|
|
158
|
+
dir=`echo $i | cut -d , -f 1`
|
|
159
|
+
do_phased_restart_one $dir
|
|
160
|
+
done
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
#
|
|
164
|
+
# Function that sends a SIGUSR1 to the daemon/service
|
|
165
|
+
#
|
|
166
|
+
do_phased_restart_one() {
|
|
167
|
+
PIDFILE=$1/tmp/puma/pid
|
|
168
|
+
|
|
169
|
+
if [ -e $PIDFILE ]; then
|
|
170
|
+
log_daemon_msg "--> About to restart puma $1"
|
|
171
|
+
kill -s USR1 `cat $PIDFILE`
|
|
172
|
+
# TODO Check if process exist
|
|
173
|
+
else
|
|
174
|
+
log_daemon_msg "--> Your puma was never playing... Let's get it out there first"
|
|
175
|
+
do_start_one $1
|
|
176
|
+
fi
|
|
177
|
+
return 0
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
#
|
|
181
|
+
# Function that statuss the jungle
|
|
182
|
+
#
|
|
183
|
+
do_status() {
|
|
184
|
+
for i in $JUNGLE; do
|
|
185
|
+
dir=`echo $i | cut -d , -f 1`
|
|
186
|
+
do_status_one $dir
|
|
187
|
+
done
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
#
|
|
191
|
+
# Function that sends a SIGUSR2 to the daemon/service
|
|
192
|
+
#
|
|
193
|
+
do_status_one() {
|
|
194
|
+
PIDFILE=$1/tmp/puma/pid
|
|
195
|
+
i=`grep $1 $CONFIG`
|
|
196
|
+
dir=`echo $i | cut -d , -f 1`
|
|
197
|
+
|
|
198
|
+
if [ -e $PIDFILE ]; then
|
|
199
|
+
log_daemon_msg "--> About to status puma $1"
|
|
200
|
+
if [ "$USE_LOCAL_BUNDLE" -eq 1 ]; then
|
|
201
|
+
cd $1 && bundle exec pumactl --state $dir/tmp/puma/state stats
|
|
202
|
+
else
|
|
203
|
+
pumactl --state $dir/tmp/puma/state stats
|
|
204
|
+
fi
|
|
205
|
+
# kill -s USR2 `cat $PIDFILE`
|
|
206
|
+
# TODO Check if process exist
|
|
207
|
+
else
|
|
208
|
+
log_daemon_msg "--> $1 isn't there :(..."
|
|
209
|
+
fi
|
|
210
|
+
return 0
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
do_add() {
|
|
214
|
+
str=""
|
|
215
|
+
# App's directory
|
|
216
|
+
if [ -d "$1" ]; then
|
|
217
|
+
if [ "`grep -c "^$1" $CONFIG`" -eq 0 ]; then
|
|
218
|
+
str=$1
|
|
219
|
+
else
|
|
220
|
+
echo "The app is already being managed. Remove it if you want to update its config."
|
|
221
|
+
exit 1
|
|
222
|
+
fi
|
|
223
|
+
else
|
|
224
|
+
echo "The directory $1 doesn't exist."
|
|
225
|
+
exit 1
|
|
226
|
+
fi
|
|
227
|
+
# User to run it as
|
|
228
|
+
if [ "`grep -c "^$2:" /etc/passwd`" -eq 0 ]; then
|
|
229
|
+
echo "The user $2 doesn't exist."
|
|
230
|
+
exit 1
|
|
231
|
+
else
|
|
232
|
+
str="$str,$2"
|
|
233
|
+
fi
|
|
234
|
+
# Config file
|
|
235
|
+
if [ "$3" != "" ]; then
|
|
236
|
+
if [ -e $3 ]; then
|
|
237
|
+
str="$str,$3"
|
|
238
|
+
else
|
|
239
|
+
echo "The config file $3 doesn't exist."
|
|
240
|
+
exit 1
|
|
241
|
+
fi
|
|
242
|
+
fi
|
|
243
|
+
# Log file
|
|
244
|
+
if [ "$4" != "" ]; then
|
|
245
|
+
str="$str,$4"
|
|
246
|
+
fi
|
|
247
|
+
|
|
248
|
+
# Environment variables
|
|
249
|
+
if [ "$5" != "" ]; then
|
|
250
|
+
str="$str,$5"
|
|
251
|
+
fi
|
|
252
|
+
|
|
253
|
+
# Add it to the jungle
|
|
254
|
+
echo $str >> $CONFIG
|
|
255
|
+
log_daemon_msg "Added a Puma to the jungle: $str. You still have to start it though."
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
do_remove() {
|
|
259
|
+
if [ "`grep -c "^$1" $CONFIG`" -eq 0 ]; then
|
|
260
|
+
echo "There's no app $1 to remove."
|
|
261
|
+
else
|
|
262
|
+
# Stop it first.
|
|
263
|
+
do_stop_one $1
|
|
264
|
+
# Remove it from the config.
|
|
265
|
+
sed -i "\\:^$1:d" $CONFIG
|
|
266
|
+
log_daemon_msg "Removed a Puma from the jungle: $1."
|
|
267
|
+
fi
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
config_bundler() {
|
|
271
|
+
HOME="$(eval echo ~$(id -un))"
|
|
272
|
+
|
|
273
|
+
if [ -d "$1/.rbenv/bin" ]; then
|
|
274
|
+
PATH="$1/.rbenv/bin:$1/.rbenv/shims:$1"
|
|
275
|
+
eval "$(rbenv init -)"
|
|
276
|
+
USE_LOCAL_BUNDLE=1
|
|
277
|
+
return 0
|
|
278
|
+
|
|
279
|
+
elif [ -d "/usr/local/rbenv/bin" ]; then
|
|
280
|
+
PATH="/usr/local/rbenv/bin:/usr/local/rbenv/shims:$PATH"
|
|
281
|
+
eval "$(rbenv init -)"
|
|
282
|
+
USE_LOCAL_BUNDLE=1
|
|
283
|
+
return 0
|
|
284
|
+
|
|
285
|
+
elif [ -d "$HOME/.rbenv/bin" ]; then
|
|
286
|
+
PATH="$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH"
|
|
287
|
+
eval "$(rbenv init -)"
|
|
288
|
+
USE_LOCAL_BUNDLE=1
|
|
289
|
+
return 0
|
|
290
|
+
|
|
291
|
+
# TODO: test rvm
|
|
292
|
+
# elif [ -f /etc/profile.d/rvm.sh ]; then
|
|
293
|
+
# source /etc/profile.d/rvm.sh
|
|
294
|
+
# elif [ -f /usr/local/rvm/scripts/rvm ]; then
|
|
295
|
+
# source /etc/profile.d/rvm.sh
|
|
296
|
+
# elif [ -f "$HOME/.rvm/scripts/rvm" ]; then
|
|
297
|
+
# source "$HOME/.rvm/scripts/rvm"
|
|
298
|
+
# TODO: don't know what to do with chruby
|
|
299
|
+
# elif [ -f /usr/local/share/chruby/chruby.sh ]; then
|
|
300
|
+
# source /usr/local/share/chruby/chruby.sh
|
|
301
|
+
# if [ -f /usr/local/share/chruby/auto.sh ]; then
|
|
302
|
+
# source /usr/local/share/chruby/auto.sh
|
|
303
|
+
# fi
|
|
304
|
+
# if you aren't using auto, set your version here
|
|
305
|
+
# chruby 2.0.0
|
|
306
|
+
fi
|
|
307
|
+
|
|
308
|
+
return 1
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
config_bundler
|
|
312
|
+
|
|
313
|
+
case "$1" in
|
|
314
|
+
start)
|
|
315
|
+
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
|
|
316
|
+
if [ "$#" -eq 1 ]; then
|
|
317
|
+
do_start
|
|
318
|
+
else
|
|
319
|
+
i=`grep $2 $CONFIG`
|
|
320
|
+
dir=`echo $i | cut -d , -f 1`
|
|
321
|
+
do_start_one $dir
|
|
322
|
+
fi
|
|
323
|
+
case "$?" in
|
|
324
|
+
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
|
325
|
+
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
|
326
|
+
esac
|
|
327
|
+
;;
|
|
328
|
+
stop)
|
|
329
|
+
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
|
|
330
|
+
if [ "$#" -eq 1 ]; then
|
|
331
|
+
do_stop
|
|
332
|
+
else
|
|
333
|
+
i=`grep $2 $CONFIG`
|
|
334
|
+
dir=`echo $i | cut -d , -f 1`
|
|
335
|
+
do_stop_one $dir
|
|
336
|
+
fi
|
|
337
|
+
case "$?" in
|
|
338
|
+
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
|
339
|
+
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
|
340
|
+
esac
|
|
341
|
+
;;
|
|
342
|
+
status)
|
|
343
|
+
# TODO Implement.
|
|
344
|
+
log_daemon_msg "Status $DESC" "$NAME"
|
|
345
|
+
if [ "$#" -eq 1 ]; then
|
|
346
|
+
do_status
|
|
347
|
+
else
|
|
348
|
+
i=`grep $2 $CONFIG`
|
|
349
|
+
dir=`echo $i | cut -d , -f 1`
|
|
350
|
+
do_status_one $dir
|
|
351
|
+
fi
|
|
352
|
+
case "$?" in
|
|
353
|
+
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
|
354
|
+
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
|
355
|
+
esac
|
|
356
|
+
;;
|
|
357
|
+
restart)
|
|
358
|
+
log_daemon_msg "Restarting $DESC" "$NAME"
|
|
359
|
+
if [ "$#" -eq 1 ]; then
|
|
360
|
+
do_restart
|
|
361
|
+
else
|
|
362
|
+
i=`grep $2 $CONFIG`
|
|
363
|
+
dir=`echo $i | cut -d , -f 1`
|
|
364
|
+
do_restart_one $dir
|
|
365
|
+
fi
|
|
366
|
+
case "$?" in
|
|
367
|
+
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
|
368
|
+
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
|
369
|
+
esac
|
|
370
|
+
;;
|
|
371
|
+
phased-restart)
|
|
372
|
+
log_daemon_msg "Restarting (phased) $DESC" "$NAME"
|
|
373
|
+
if [ "$#" -eq 1 ]; then
|
|
374
|
+
do_phased_restart
|
|
375
|
+
else
|
|
376
|
+
i=`grep $2 $CONFIG`
|
|
377
|
+
dir=`echo $i | cut -d , -f 1`
|
|
378
|
+
do_phased_restart_one $dir
|
|
379
|
+
fi
|
|
380
|
+
case "$?" in
|
|
381
|
+
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
|
382
|
+
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
|
383
|
+
esac
|
|
384
|
+
;;
|
|
385
|
+
add)
|
|
386
|
+
if [ "$#" -lt 3 ]; then
|
|
387
|
+
echo "Please, specify the app's directory and the user that will run it at least."
|
|
388
|
+
echo " Usage: $SCRIPTNAME add /path/to/app user /path/to/app/config/puma.rb /path/to/app/config/log/puma.log"
|
|
389
|
+
echo " config and log are optionals."
|
|
390
|
+
exit 1
|
|
391
|
+
else
|
|
392
|
+
do_add $2 $3 $4 $5
|
|
393
|
+
fi
|
|
394
|
+
case "$?" in
|
|
395
|
+
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
|
396
|
+
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
|
397
|
+
esac
|
|
398
|
+
;;
|
|
399
|
+
remove)
|
|
400
|
+
if [ "$#" -lt 2 ]; then
|
|
401
|
+
echo "Please, specifiy the app's directory to remove."
|
|
402
|
+
exit 1
|
|
403
|
+
else
|
|
404
|
+
do_remove $2
|
|
405
|
+
fi
|
|
406
|
+
case "$?" in
|
|
407
|
+
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
|
408
|
+
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
|
409
|
+
esac
|
|
410
|
+
;;
|
|
411
|
+
*)
|
|
412
|
+
echo "Usage:" >&2
|
|
413
|
+
echo " Run the jungle: $SCRIPTNAME {start|stop|status|restart|phased-restart}" >&2
|
|
414
|
+
echo " Add a Puma: $SCRIPTNAME add /path/to/app user /path/to/app/config/puma.rb /path/to/app/config/log/puma.log"
|
|
415
|
+
echo " config and log are optionals."
|
|
416
|
+
echo " Remove a Puma: $SCRIPTNAME remove /path/to/app"
|
|
417
|
+
echo " On a Puma: $SCRIPTNAME {start|stop|status|restart|phased-restart} PUMA-NAME" >&2
|
|
418
|
+
exit 3
|
|
419
|
+
;;
|
|
420
|
+
esac
|
|
421
|
+
:
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# on system boot, and root have no rbenv installed,
|
|
4
|
+
# after start-stop-daemon switched to current user, we have to init rbenv
|
|
5
|
+
if [ -d "$HOME/.rbenv/bin" ]; then
|
|
6
|
+
PATH="$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH"
|
|
7
|
+
eval "$(rbenv init -)"
|
|
8
|
+
elif [ -d "/usr/local/rbenv/bin" ]; then
|
|
9
|
+
PATH="/usr/local/rbenv/bin:/usr/local/rbenv/shims:$PATH"
|
|
10
|
+
eval "$(rbenv init -)"
|
|
11
|
+
elif [ -f /usr/local/rvm/scripts/rvm ]; then
|
|
12
|
+
source /etc/profile.d/rvm.sh
|
|
13
|
+
elif [ -f "$HOME/.rvm/scripts/rvm" ]; then
|
|
14
|
+
source "$HOME/.rvm/scripts/rvm"
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
app=$1; config=$2; log=$3;
|
|
18
|
+
cd $app && exec bundle exec puma -C $config 2>&1 >> $log
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Puma as a service using Upstart
|
|
2
|
+
|
|
3
|
+
Manage multiple Puma servers as services on the same box using Ubuntu upstart.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
# Copy the scripts to services directory
|
|
8
|
+
sudo cp puma.conf puma-manager.conf /etc/init
|
|
9
|
+
|
|
10
|
+
# Create an empty configuration file
|
|
11
|
+
sudo touch /etc/puma.conf
|
|
12
|
+
|
|
13
|
+
## Managing the jungle
|
|
14
|
+
|
|
15
|
+
Puma apps are referenced in /etc/puma.conf by default. Add each app's path as a new line, e.g.:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
/home/apps/my-cool-ruby-app
|
|
19
|
+
/home/apps/another-app/current
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Start the jungle running:
|
|
23
|
+
|
|
24
|
+
`sudo start puma-manager`
|
|
25
|
+
|
|
26
|
+
This script will run at boot time.
|
|
27
|
+
|
|
28
|
+
Start a single puma like this:
|
|
29
|
+
|
|
30
|
+
`sudo start puma app=/path/to/app`
|
|
31
|
+
|
|
32
|
+
## Logs
|
|
33
|
+
|
|
34
|
+
Everything is logged by upstart, defaulting to `/var/log/upstart`.
|
|
35
|
+
|
|
36
|
+
Each puma instance is named after its directory, so for an app called `/home/apps/my-app` the log file would be `/var/log/upstart/puma-_home_apps_my-app.log`.
|
|
37
|
+
|
|
38
|
+
## Conventions
|
|
39
|
+
|
|
40
|
+
* The script expects:
|
|
41
|
+
* a config file to exist under `config/puma.rb` in your app. E.g.: `/home/apps/my-app/config/puma.rb`.
|
|
42
|
+
* a temporary folder to put the PID, socket and state files to exist called `tmp/puma`. E.g.: `/home/apps/my-app/tmp/puma`. Puma will take care of the files for you.
|
|
43
|
+
|
|
44
|
+
You can always change those defaults by editing the scripts.
|
|
45
|
+
|
|
46
|
+
## Here's what a minimal app's config file should have
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
pidfile "/path/to/app/tmp/puma/pid"
|
|
50
|
+
state_path "/path/to/app/tmp/puma/state"
|
|
51
|
+
activate_control_app
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Before starting...
|
|
55
|
+
|
|
56
|
+
You need to customise `puma.conf` to:
|
|
57
|
+
|
|
58
|
+
* Set the right user your app should be running on unless you want root to execute it!
|
|
59
|
+
* Look for `setuid apps` and `setgid apps`, uncomment those lines and replace `apps` to whatever your deployment user is.
|
|
60
|
+
* Replace `apps` on the paths (or set the right paths to your user's home) everywhere else.
|
|
61
|
+
* Uncomment the source lines for `rbenv` or `rvm` support unless you use a system wide installation of Ruby.
|