rsense-server 0.5.0
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/.gitignore +23 -0
- data/Gemfile +14 -0
- data/Guardfile +5 -0
- data/LICENSE.txt +1 -0
- data/README.md +51 -0
- data/Rakefile +9 -0
- data/bin/_rsense.rb +115 -0
- data/config/puma.rb +2 -0
- data/lib/rsense/server/code.rb +38 -0
- data/lib/rsense/server/command/completion_result.rb +11 -0
- data/lib/rsense/server/command/special_meth.rb +18 -0
- data/lib/rsense/server/command/type_inference_method.rb +24 -0
- data/lib/rsense/server/command.rb +239 -0
- data/lib/rsense/server/config.rb +70 -0
- data/lib/rsense/server/gem_path.rb +18 -0
- data/lib/rsense/server/listeners/find_definition_event_listener.rb +91 -0
- data/lib/rsense/server/listeners/where_event_listener.rb +39 -0
- data/lib/rsense/server/load_path.rb +62 -0
- data/lib/rsense/server/options.rb +85 -0
- data/lib/rsense/server/parser.rb +17 -0
- data/lib/rsense/server/path_info.rb +17 -0
- data/lib/rsense/server/project.rb +24 -0
- data/lib/rsense/server/version.rb +5 -0
- data/lib/rsense/server.rb +18 -0
- data/rsense-server.gemspec +35 -0
- data/spec/fixtures/config_fixture/.rsense +4 -0
- data/spec/fixtures/deeply/nested/thing.rb +0 -0
- data/spec/fixtures/find_def_sample.json +10 -0
- data/spec/fixtures/sample.json +10 -0
- data/spec/fixtures/test_gem/.gitignore +22 -0
- data/spec/fixtures/test_gem/Gemfile +4 -0
- data/spec/fixtures/test_gem/LICENSE.txt +22 -0
- data/spec/fixtures/test_gem/README.md +29 -0
- data/spec/fixtures/test_gem/Rakefile +2 -0
- data/spec/fixtures/test_gem/lib/sample/version.rb +3 -0
- data/spec/fixtures/test_gem/lib/sample.rb +16 -0
- data/spec/fixtures/test_gem/sample.gemspec +23 -0
- data/spec/fixtures/test_gem/test.json +10 -0
- data/spec/rsense/server/code_spec.rb +44 -0
- data/spec/rsense/server/command/special_meth_spec.rb +23 -0
- data/spec/rsense/server/command_spec.rb +108 -0
- data/spec/rsense/server/config_spec.rb +27 -0
- data/spec/rsense/server/gem_path_spec.rb +16 -0
- data/spec/rsense/server/load_path_spec.rb +63 -0
- data/spec/rsense/server/options_spec.rb +33 -0
- data/spec/rsense/server/path_info_spec.rb +11 -0
- data/spec/rsense/server/project_spec.rb +18 -0
- data/spec/rsense/server_spec.rb +7 -0
- data/spec/spec_helper.rb +16 -0
- data/vendor/gems/puma-2.8.2-java/COPYING +55 -0
- data/vendor/gems/puma-2.8.2-java/DEPLOYMENT.md +92 -0
- data/vendor/gems/puma-2.8.2-java/Gemfile +17 -0
- data/vendor/gems/puma-2.8.2-java/History.txt +532 -0
- data/vendor/gems/puma-2.8.2-java/LICENSE +26 -0
- data/vendor/gems/puma-2.8.2-java/Manifest.txt +68 -0
- data/vendor/gems/puma-2.8.2-java/README.md +251 -0
- data/vendor/gems/puma-2.8.2-java/Rakefile +158 -0
- data/vendor/gems/puma-2.8.2-java/bin/puma +10 -0
- data/vendor/gems/puma-2.8.2-java/bin/puma-wild +17 -0
- data/vendor/gems/puma-2.8.2-java/bin/pumactl +12 -0
- data/vendor/gems/puma-2.8.2-java/docs/config.md +0 -0
- data/vendor/gems/puma-2.8.2-java/docs/nginx.md +80 -0
- data/vendor/gems/puma-2.8.2-java/docs/signals.md +42 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/PumaHttp11Service.java +17 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/ext_help.h +15 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/extconf.rb +8 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/http11_parser.c +1225 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/http11_parser.h +64 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/http11_parser.java.rl +161 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/http11_parser.rl +146 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/http11_parser_common.rl +54 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/io_buffer.c +155 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/mini_ssl.c +195 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/org/jruby/puma/Http11.java +225 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/org/jruby/puma/Http11Parser.java +488 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/org/jruby/puma/MiniSSL.java +289 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/puma_http11.c +491 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/accept_nonblock.rb +23 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/app/status.rb +59 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/binder.rb +298 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/capistrano.rb +86 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/cli.rb +587 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/client.rb +289 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/cluster.rb +389 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/compat.rb +18 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/configuration.rb +377 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/const.rb +165 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/control_cli.rb +251 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/daemon_ext.rb +25 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/delegation.rb +11 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/detect.rb +4 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/events.rb +130 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/io_buffer.rb +7 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/java_io_buffer.rb +45 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/jruby_restart.rb +83 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/minissl.rb +148 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/null_io.rb +34 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/puma_http11.jar +0 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/rack_default.rb +7 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/rack_patch.rb +45 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/reactor.rb +183 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/runner.rb +146 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/server.rb +801 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/single.rb +102 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/tcp_logger.rb +32 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/thread_pool.rb +185 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/util.rb +9 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma.rb +14 -0
- data/vendor/gems/puma-2.8.2-java/lib/rack/handler/puma.rb +66 -0
- data/vendor/gems/puma-2.8.2-java/puma.gemspec +55 -0
- data/vendor/gems/puma-2.8.2-java/test/test_app_status.rb +92 -0
- data/vendor/gems/puma-2.8.2-java/test/test_cli.rb +173 -0
- data/vendor/gems/puma-2.8.2-java/test/test_config.rb +26 -0
- data/vendor/gems/puma-2.8.2-java/test/test_http10.rb +27 -0
- data/vendor/gems/puma-2.8.2-java/test/test_http11.rb +144 -0
- data/vendor/gems/puma-2.8.2-java/test/test_integration.rb +165 -0
- data/vendor/gems/puma-2.8.2-java/test/test_iobuffer.rb +38 -0
- data/vendor/gems/puma-2.8.2-java/test/test_minissl.rb +25 -0
- data/vendor/gems/puma-2.8.2-java/test/test_null_io.rb +31 -0
- data/vendor/gems/puma-2.8.2-java/test/test_persistent.rb +238 -0
- data/vendor/gems/puma-2.8.2-java/test/test_puma_server.rb +323 -0
- data/vendor/gems/puma-2.8.2-java/test/test_rack_handler.rb +10 -0
- data/vendor/gems/puma-2.8.2-java/test/test_rack_server.rb +141 -0
- data/vendor/gems/puma-2.8.2-java/test/test_tcp_rack.rb +42 -0
- data/vendor/gems/puma-2.8.2-java/test/test_thread_pool.rb +156 -0
- data/vendor/gems/puma-2.8.2-java/test/test_unix_socket.rb +39 -0
- data/vendor/gems/puma-2.8.2-java/test/test_ws.rb +89 -0
- data/vendor/gems/puma-2.8.2-java/tools/jungle/README.md +9 -0
- data/vendor/gems/puma-2.8.2-java/tools/jungle/init.d/README.md +54 -0
- data/vendor/gems/puma-2.8.2-java/tools/jungle/init.d/puma +332 -0
- data/vendor/gems/puma-2.8.2-java/tools/jungle/init.d/run-puma +3 -0
- data/vendor/gems/puma-2.8.2-java/tools/jungle/upstart/README.md +61 -0
- data/vendor/gems/puma-2.8.2-java/tools/jungle/upstart/puma-manager.conf +31 -0
- data/vendor/gems/puma-2.8.2-java/tools/jungle/upstart/puma.conf +63 -0
- data/vendor/gems/puma-2.8.2-java/tools/trickletest.rb +45 -0
- metadata +389 -0
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
require 'puma/const'
|
|
2
|
+
|
|
3
|
+
module Puma
|
|
4
|
+
class Binder
|
|
5
|
+
include Puma::Const
|
|
6
|
+
|
|
7
|
+
def initialize(events)
|
|
8
|
+
@events = events
|
|
9
|
+
@listeners = []
|
|
10
|
+
@inherited_fds = {}
|
|
11
|
+
@unix_paths = []
|
|
12
|
+
|
|
13
|
+
@proto_env = {
|
|
14
|
+
"rack.version".freeze => Rack::VERSION,
|
|
15
|
+
"rack.errors".freeze => events.stderr,
|
|
16
|
+
"rack.multithread".freeze => true,
|
|
17
|
+
"rack.multiprocess".freeze => false,
|
|
18
|
+
"rack.run_once".freeze => false,
|
|
19
|
+
"SCRIPT_NAME".freeze => ENV['SCRIPT_NAME'] || "",
|
|
20
|
+
|
|
21
|
+
# Rack blows up if this is an empty string, and Rack::Lint
|
|
22
|
+
# blows up if it's nil. So 'text/plain' seems like the most
|
|
23
|
+
# sensible default value.
|
|
24
|
+
"CONTENT_TYPE".freeze => "text/plain",
|
|
25
|
+
|
|
26
|
+
"QUERY_STRING".freeze => "",
|
|
27
|
+
SERVER_PROTOCOL => HTTP_11,
|
|
28
|
+
SERVER_SOFTWARE => PUMA_VERSION,
|
|
29
|
+
GATEWAY_INTERFACE => CGI_VER
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@envs = {}
|
|
33
|
+
@ios = []
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
attr_reader :listeners, :ios
|
|
37
|
+
|
|
38
|
+
def env(sock)
|
|
39
|
+
@envs.fetch(sock, @proto_env)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def close
|
|
43
|
+
@ios.each { |i| i.close }
|
|
44
|
+
@unix_paths.each { |i| File.unlink i }
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def import_from_env
|
|
48
|
+
remove = []
|
|
49
|
+
|
|
50
|
+
ENV.each do |k,v|
|
|
51
|
+
if k =~ /PUMA_INHERIT_\d+/
|
|
52
|
+
fd, url = v.split(":", 2)
|
|
53
|
+
@inherited_fds[url] = fd.to_i
|
|
54
|
+
remove << k
|
|
55
|
+
end
|
|
56
|
+
if k =~ /LISTEN_FDS/ && ENV['LISTEN_PID'].to_i == $$
|
|
57
|
+
v.to_i.times do |num|
|
|
58
|
+
fd = num + 3
|
|
59
|
+
sock = TCPServer.for_fd(fd)
|
|
60
|
+
begin
|
|
61
|
+
url = "unix://" + Socket.unpack_sockaddr_un(sock.getsockname)
|
|
62
|
+
rescue ArgumentError
|
|
63
|
+
port, addr = Socket.unpack_sockaddr_in(sock.getsockname)
|
|
64
|
+
if addr =~ /\:/
|
|
65
|
+
addr = "[#{addr}]"
|
|
66
|
+
end
|
|
67
|
+
url = "tcp://#{addr}:#{port}"
|
|
68
|
+
end
|
|
69
|
+
@inherited_fds[url] = sock
|
|
70
|
+
end
|
|
71
|
+
ENV.delete k
|
|
72
|
+
ENV.delete 'LISTEN_PID'
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
remove.each do |k|
|
|
77
|
+
ENV.delete k
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def parse(binds, logger)
|
|
82
|
+
binds.each do |str|
|
|
83
|
+
uri = URI.parse str
|
|
84
|
+
case uri.scheme
|
|
85
|
+
when "tcp"
|
|
86
|
+
if fd = @inherited_fds.delete(str)
|
|
87
|
+
logger.log "* Inherited #{str}"
|
|
88
|
+
io = inherit_tcp_listener uri.host, uri.port, fd
|
|
89
|
+
else
|
|
90
|
+
params = Rack::Utils.parse_query uri.query
|
|
91
|
+
|
|
92
|
+
opt = params.key?('low_latency')
|
|
93
|
+
bak = params.fetch('backlog', 1024).to_i
|
|
94
|
+
|
|
95
|
+
logger.log "* Listening on #{str}"
|
|
96
|
+
io = add_tcp_listener uri.host, uri.port, opt, bak
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
@listeners << [str, io]
|
|
100
|
+
when "unix"
|
|
101
|
+
path = "#{uri.host}#{uri.path}"
|
|
102
|
+
|
|
103
|
+
if fd = @inherited_fds.delete(str)
|
|
104
|
+
logger.log "* Inherited #{str}"
|
|
105
|
+
io = inherit_unix_listener path, fd
|
|
106
|
+
else
|
|
107
|
+
logger.log "* Listening on #{str}"
|
|
108
|
+
|
|
109
|
+
umask = nil
|
|
110
|
+
|
|
111
|
+
if uri.query
|
|
112
|
+
params = Rack::Utils.parse_query uri.query
|
|
113
|
+
if u = params['umask']
|
|
114
|
+
# Use Integer() to respect the 0 prefix as octal
|
|
115
|
+
umask = Integer(u)
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
io = add_unix_listener path, umask
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
@listeners << [str, io]
|
|
123
|
+
when "ssl"
|
|
124
|
+
if IS_JRUBY
|
|
125
|
+
@events.error "SSL not supported on JRuby"
|
|
126
|
+
raise UnsupportedOption
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
params = Rack::Utils.parse_query uri.query
|
|
130
|
+
require 'puma/minissl'
|
|
131
|
+
|
|
132
|
+
ctx = MiniSSL::Context.new
|
|
133
|
+
unless params['key']
|
|
134
|
+
@events.error "Please specify the SSL key via 'key='"
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
ctx.key = params['key']
|
|
138
|
+
|
|
139
|
+
unless params['cert']
|
|
140
|
+
@events.error "Please specify the SSL cert via 'cert='"
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
ctx.cert = params['cert']
|
|
144
|
+
|
|
145
|
+
ctx.verify_mode = MiniSSL::VERIFY_NONE
|
|
146
|
+
|
|
147
|
+
if fd = @inherited_fds.delete(str)
|
|
148
|
+
logger.log "* Inherited #{str}"
|
|
149
|
+
io = inherited_ssl_listener fd, ctx
|
|
150
|
+
else
|
|
151
|
+
logger.log "* Listening on #{str}"
|
|
152
|
+
io = add_ssl_listener uri.host, uri.port, ctx
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
@listeners << [str, io]
|
|
156
|
+
else
|
|
157
|
+
logger.error "Invalid URI: #{str}"
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# If we inherited fds but didn't use them (because of a
|
|
162
|
+
# configuration change), then be sure to close them.
|
|
163
|
+
@inherited_fds.each do |str, fd|
|
|
164
|
+
logger.log "* Closing unused inherited connection: #{str}"
|
|
165
|
+
|
|
166
|
+
begin
|
|
167
|
+
if fd.kind_of? TCPServer
|
|
168
|
+
fd.close
|
|
169
|
+
else
|
|
170
|
+
IO.for_fd(fd).close
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
rescue SystemCallError
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
# We have to unlink a unix socket path that's not being used
|
|
177
|
+
uri = URI.parse str
|
|
178
|
+
if uri.scheme == "unix"
|
|
179
|
+
path = "#{uri.host}#{uri.path}"
|
|
180
|
+
File.unlink path
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# Tell the server to listen on host +host+, port +port+.
|
|
187
|
+
# If +optimize_for_latency+ is true (the default) then clients connecting
|
|
188
|
+
# will be optimized for latency over throughput.
|
|
189
|
+
#
|
|
190
|
+
# +backlog+ indicates how many unaccepted connections the kernel should
|
|
191
|
+
# allow to accumulate before returning connection refused.
|
|
192
|
+
#
|
|
193
|
+
def add_tcp_listener(host, port, optimize_for_latency=true, backlog=1024)
|
|
194
|
+
host = host[1..-2] if host[0..0] == '['
|
|
195
|
+
s = TCPServer.new(host, port)
|
|
196
|
+
if optimize_for_latency
|
|
197
|
+
s.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
|
|
198
|
+
end
|
|
199
|
+
s.setsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR, true)
|
|
200
|
+
s.listen backlog
|
|
201
|
+
@ios << s
|
|
202
|
+
s
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def inherit_tcp_listener(host, port, fd)
|
|
206
|
+
if fd.kind_of? TCPServer
|
|
207
|
+
s = fd
|
|
208
|
+
else
|
|
209
|
+
s = TCPServer.for_fd(fd)
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
@ios << s
|
|
213
|
+
s
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def add_ssl_listener(host, port, ctx,
|
|
217
|
+
optimize_for_latency=true, backlog=1024)
|
|
218
|
+
if IS_JRUBY
|
|
219
|
+
@events.error "SSL not supported on JRuby"
|
|
220
|
+
raise UnsupportedOption
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
require 'puma/minissl'
|
|
224
|
+
|
|
225
|
+
s = TCPServer.new(host, port)
|
|
226
|
+
if optimize_for_latency
|
|
227
|
+
s.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
|
|
228
|
+
end
|
|
229
|
+
s.setsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR, true)
|
|
230
|
+
s.listen backlog
|
|
231
|
+
|
|
232
|
+
ssl = MiniSSL::Server.new s, ctx
|
|
233
|
+
env = @proto_env.dup
|
|
234
|
+
env[HTTPS_KEY] = HTTPS
|
|
235
|
+
@envs[ssl] = env
|
|
236
|
+
|
|
237
|
+
@ios << ssl
|
|
238
|
+
s
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
def inherited_ssl_listener(fd, ctx)
|
|
242
|
+
if IS_JRUBY
|
|
243
|
+
@events.error "SSL not supported on JRuby"
|
|
244
|
+
raise UnsupportedOption
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
require 'puma/minissl'
|
|
248
|
+
s = TCPServer.for_fd(fd)
|
|
249
|
+
@ios << MiniSSL::Server.new(s, ctx)
|
|
250
|
+
s
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
# Tell the server to listen on +path+ as a UNIX domain socket.
|
|
254
|
+
#
|
|
255
|
+
def add_unix_listener(path, umask=nil)
|
|
256
|
+
@unix_paths << path
|
|
257
|
+
|
|
258
|
+
# Let anyone connect by default
|
|
259
|
+
umask ||= 0
|
|
260
|
+
|
|
261
|
+
begin
|
|
262
|
+
old_mask = File.umask(umask)
|
|
263
|
+
|
|
264
|
+
if File.exist? path
|
|
265
|
+
begin
|
|
266
|
+
old = UNIXSocket.new path
|
|
267
|
+
rescue SystemCallError, IOError
|
|
268
|
+
File.unlink path
|
|
269
|
+
else
|
|
270
|
+
old.close
|
|
271
|
+
raise "There is already a server bound to: #{path}"
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
s = UNIXServer.new(path)
|
|
276
|
+
@ios << s
|
|
277
|
+
ensure
|
|
278
|
+
File.umask old_mask
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
s
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
def inherit_unix_listener(path, fd)
|
|
285
|
+
@unix_paths << path
|
|
286
|
+
|
|
287
|
+
if fd.kind_of? TCPServer
|
|
288
|
+
s = fd
|
|
289
|
+
else
|
|
290
|
+
s = UNIXServer.for_fd fd
|
|
291
|
+
end
|
|
292
|
+
@ios << s
|
|
293
|
+
|
|
294
|
+
s
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
end
|
|
298
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
|
2
|
+
|
|
3
|
+
# Ensure the tmp/sockets directory is created by the deploy:setup task and
|
|
4
|
+
# symlinked in by the deploy:update task. This is not handled by Capistrano
|
|
5
|
+
# v2 but is fixed in v3.
|
|
6
|
+
shared_children.push('tmp/sockets')
|
|
7
|
+
|
|
8
|
+
_cset(:puma_default_hooks) { true }
|
|
9
|
+
_cset(:puma_cmd) { "#{fetch(:bundle_cmd, 'bundle')} exec puma" }
|
|
10
|
+
_cset(:pumactl_cmd) { "#{fetch(:bundle_cmd, 'bundle')} exec pumactl" }
|
|
11
|
+
_cset(:puma_env) { fetch(:rack_env, fetch(:rails_env, 'production')) }
|
|
12
|
+
_cset(:puma_state) { "#{shared_path}/sockets/puma.state" }
|
|
13
|
+
_cset(:puma_socket) { "unix://#{shared_path}/sockets/puma.sock" }
|
|
14
|
+
_cset(:puma_role) { :app }
|
|
15
|
+
|
|
16
|
+
if fetch(:puma_default_hooks)
|
|
17
|
+
after 'deploy:stop', 'puma:stop'
|
|
18
|
+
after 'deploy:start', 'puma:start'
|
|
19
|
+
after 'deploy:restart', 'puma:restart'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
namespace :puma do
|
|
23
|
+
desc 'Start puma'
|
|
24
|
+
task :start, :roles => lambda { puma_role }, :on_no_matching_servers => :continue do
|
|
25
|
+
run "cd #{current_path} && #{puma_cmd} #{start_options}", :pty => false
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
desc 'Stop puma'
|
|
29
|
+
task :stop, :roles => lambda { puma_role }, :on_no_matching_servers => :continue do
|
|
30
|
+
run "cd #{current_path} && #{pumactl_cmd} -S #{state_path} stop"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
desc 'Restart puma'
|
|
34
|
+
task :restart, :roles => lambda { puma_role }, :on_no_matching_servers => :continue do
|
|
35
|
+
begin
|
|
36
|
+
run "cd #{current_path} && #{pumactl_cmd} -S #{state_path} restart"
|
|
37
|
+
rescue Capistrano::CommandError => ex
|
|
38
|
+
puts "Failed to restart puma: #{ex}\nAssuming not started."
|
|
39
|
+
start
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
desc 'Restart puma (phased restart)'
|
|
44
|
+
task :phased_restart, :roles => lambda { puma_role }, :on_no_matching_servers => :continue do
|
|
45
|
+
begin
|
|
46
|
+
run "cd #{current_path} && #{pumactl_cmd} -S #{state_path} phased-restart"
|
|
47
|
+
rescue Capistrano::CommandError => ex
|
|
48
|
+
puts "Failed to restart puma: #{ex}\nAssuming not started."
|
|
49
|
+
start
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def start_options
|
|
56
|
+
if config_file
|
|
57
|
+
"-q -d -e #{puma_env} -C #{config_file}"
|
|
58
|
+
else
|
|
59
|
+
"-q -d -e #{puma_env} -b '#{puma_socket}' -S #{state_path} --control 'unix://#{shared_path}/sockets/pumactl.sock'"
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def config_file
|
|
64
|
+
@_config_file ||= begin
|
|
65
|
+
file = fetch(:puma_config_file, nil)
|
|
66
|
+
file = "./config/puma/#{puma_env}.rb" if !file && File.exists?("./config/puma/#{puma_env}.rb")
|
|
67
|
+
file
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def puma_env
|
|
72
|
+
fetch(:rack_env, fetch(:rails_env, 'production'))
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def state_path
|
|
76
|
+
(config_file ? configuration.options[:state] : nil) || puma_state
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def configuration
|
|
80
|
+
require 'puma/configuration'
|
|
81
|
+
|
|
82
|
+
config = Puma::Configuration.new(:config_file => config_file)
|
|
83
|
+
config.load
|
|
84
|
+
config
|
|
85
|
+
end
|
|
86
|
+
end
|