diff options
author | Eric Wong <e@80x24.org> | 2017-04-06 05:15:29 +0000 |
---|---|---|
committer | Eric Wong <yahns-public@yhbt.net> | 2017-04-06 06:47:36 +0000 |
commit | 0a6f03cde0a336597358668041fa8eb6f463bac5 (patch) | |
tree | 911aca11655925d6dbad41afb3af91dcdbd2ead9 | |
parent | f76ff00466e679e367713bc6345d0a95191629cd (diff) | |
download | yahns-0a6f03cde0a336597358668041fa8eb6f463bac5.tar.gz |
Since the common case is still to run a single app inside yahns, we can simplify setup a bit for systemd (and like) users by allowing them to omit the "listen" directive when they are running a single app in yahns.
-rw-r--r-- | Documentation/yahns-rackup.pod | 4 | ||||
-rw-r--r-- | lib/yahns/config.rb | 5 | ||||
-rw-r--r-- | lib/yahns/rackup_handler.rb | 6 | ||||
-rw-r--r-- | lib/yahns/server.rb | 4 | ||||
-rw-r--r-- | test/test_bin.rb | 47 |
5 files changed, 39 insertions, 27 deletions
diff --git a/Documentation/yahns-rackup.pod b/Documentation/yahns-rackup.pod index 3fbde0e..de2d4b6 100644 --- a/Documentation/yahns-rackup.pod +++ b/Documentation/yahns-rackup.pod @@ -40,6 +40,10 @@ and PATH is meant to be a path to a UNIX domain socket. Defaults to "0.0.0.0:9292" (all addresses on TCP port 9292). Multiple addresses may be separated with commas. +For systemd users, a special value of "inherit" may be specified +to inherit FDs using the LISTEN_FDS and LISTEN_PID environment +variables described in L<sd_listen_fds(3)> + =item -O stderr_path=PATHNAME Allow redirecting $stderr to a given path. Unlike doing this from diff --git a/lib/yahns/config.rb b/lib/yahns/config.rb index e545d59..bcea0d4 100644 --- a/lib/yahns/config.rb +++ b/lib/yahns/config.rb @@ -438,4 +438,9 @@ class Yahns::Config # :nodoc: @app_ctx.each { |app| app.logger ||= server.logger } end + + def register_inherited(name) + return unless @config_listeners.empty? && @app_ctx.size == 1 + @config_listeners[name] = { :yahns_app_ctx => @app_ctx[0] } + end end diff --git a/lib/yahns/rackup_handler.rb b/lib/yahns/rackup_handler.rb index 63ab373..3f217af 100644 --- a/lib/yahns/rackup_handler.rb +++ b/lib/yahns/rackup_handler.rb @@ -16,10 +16,10 @@ module Yahns::RackupHandler # :nodoc: # fine for most apps, but we have SIGUSR2 restarts to support working_directory(Yahns::START[:cwd]) - app(:rack, app) do + app(:rack, app) do # Yahns::Config#app addr = o[:listen] || "#{o[:Host]||default_host}:#{o[:Port]||8080}" - # allow listening to multiple addresses - addr.split(',').each { |l| listen(l) } + # allow listening to multiple addresses (Yahns::Config#listen) + addr.split(',').each { |l| listen(l) } unless addr == 'inherit' val = o[:client_timeout] and client_timeout(val) end diff --git a/lib/yahns/server.rb b/lib/yahns/server.rb index 43caae6..efd6f05 100644 --- a/lib/yahns/server.rb +++ b/lib/yahns/server.rb @@ -327,7 +327,9 @@ class Yahns::Server # :nodoc: opts = sock_opts(io) io = server_cast(io, opts) set_server_sockopt(io, opts) - @logger.info "inherited addr=#{sock_name(io)} fd=#{io.fileno}" + name = sock_name(io) + @logger.info "inherited addr=#{name} fd=#{io.fileno}" + @config.register_inherited(name) io end diff --git a/test/test_bin.rb b/test/test_bin.rb index 579e39c..e59c9b4 100644 --- a/test/test_bin.rb +++ b/test/test_bin.rb @@ -14,35 +14,36 @@ class TestBin < Testcase def test_listen_fd3 return unless RUBY_VERSION.to_f > 2.3 # Fixed in ruby/trunk r51209, actually - @srv.setsockopt(:SOL_SOCKET, :SO_KEEPALIVE, 0) host, port = @srv.addr[3], @srv.addr[1] ru = tmpfile(%w(test_bin_daemon .ru)) ru.write("require 'rack/lobster'; run Rack::Lobster.new\n") - cmd = %W(#{RbConfig.ruby} -I lib bin/yahns-rackup - -E none -p #{port} -o #{host} #{ru.path}) - pid = fork do # emulate a systemd environment - env = { - 'LISTEN_PID' => $$.to_s, - 'LISTEN_FDS' => '1', - } - exec env, *cmd, 3 => @srv, err: @err.path - end - Net::HTTP.start(host, port) do |http| - req = Net::HTTP::Get.new("/") - res = http.request(req) - assert_equal 200, res.code.to_i - assert_equal "keep-alive", res["Connection"] + cmd = %W(#{RbConfig.ruby} -I lib bin/yahns-rackup -E none #{ru.path}) + [ %w(-O listen=inherit), %W(-p #{port} -o #{host}) ].each do |opt| + @srv.setsockopt(:SOL_SOCKET, :SO_KEEPALIVE, 0) + begin + pid = fork do # emulate a systemd environment + env = { 'LISTEN_PID' => $$.to_s, 'LISTEN_FDS' => '1' } + cmd.concat(opt) + exec env, *cmd, 3 => @srv, err: @err.path + end + Net::HTTP.start(host, port) do |http| + req = Net::HTTP::Get.new("/") + res = http.request(req) + assert_equal 200, res.code.to_i + assert_equal "keep-alive", res["Connection"] + end + assert @srv.getsockopt(:SOL_SOCKET, :SO_KEEPALIVE).bool, + 'ensure the inheriting process applies TCP socket options' + ensure + if pid + Process.kill(:QUIT, pid) + _, status = Process.waitpid2(pid) + assert status.success?, status.inspect + end + end end - - assert @srv.getsockopt(:SOL_SOCKET, :SO_KEEPALIVE).bool, - 'ensure the inheriting process applies TCP socket options' ensure - if pid - Process.kill(:QUIT, pid) - _, status = Process.waitpid2(pid) - assert status.success?, status.inspect - end ru.close! if ru end |