mirror of
https://github.com/puma/puma.git
synced 2022-11-09 13:48:40 -05:00
Move more logic out of CLI
Focus on removing @options. Delegate all actions to launcher.
This commit is contained in:
parent
182c836869
commit
6ca4c4ca0a
4 changed files with 160 additions and 123 deletions
134
lib/puma/cli.rb
134
lib/puma/cli.rb
|
@ -50,7 +50,6 @@ module Puma
|
|||
@config = nil
|
||||
|
||||
setup_options
|
||||
generate_restart_data
|
||||
|
||||
@binder = Binder.new(@events)
|
||||
@binder.import_from_env
|
||||
|
@ -67,12 +66,22 @@ module Puma
|
|||
@launcher.events = self.events
|
||||
@launcher.config = self.config
|
||||
@launcher.binder = self.binder
|
||||
@launcher.argv = @argv
|
||||
|
||||
@launcher.setup(@options)
|
||||
|
||||
end
|
||||
|
||||
## BACKWARDS COMPAT FOR TESTS
|
||||
|
||||
def error(str)
|
||||
@launcher.error(str)
|
||||
end
|
||||
|
||||
def debug(str)
|
||||
@launcher.debug(str)
|
||||
end
|
||||
|
||||
def delete_pidfile
|
||||
@launcher.delete_pidfile
|
||||
end
|
||||
|
@ -121,29 +130,17 @@ module Puma
|
|||
# The Events object used to output information.
|
||||
attr_reader :events
|
||||
|
||||
# Delegate +error+ to +@events+
|
||||
#
|
||||
def error(str)
|
||||
@events.error str
|
||||
end
|
||||
|
||||
def debug(str)
|
||||
@events.log "- #{str}" if @options[:debug]
|
||||
end
|
||||
|
||||
def clustered?
|
||||
# remove eventually
|
||||
@options[:workers] > 0
|
||||
@launcher.clustered?
|
||||
end
|
||||
|
||||
def jruby?
|
||||
# remove eventually
|
||||
IS_JRUBY
|
||||
Puma.jruby?
|
||||
end
|
||||
|
||||
def windows?
|
||||
# remove eventually
|
||||
RUBY_PLATFORM =~ /mswin32|ming32/
|
||||
Puma.windows?
|
||||
end
|
||||
|
||||
<<<<<<< HEAD
|
||||
|
@ -195,63 +192,30 @@ module Puma
|
|||
=======
|
||||
>>>>>>> Initial Seperation of CLI and Server Launcher work
|
||||
def jruby_daemon_start
|
||||
require 'puma/jruby_restart'
|
||||
JRubyRestart.daemon_start(@restart_dir, restart_args)
|
||||
@launcher.jruby_daemon_start
|
||||
end
|
||||
|
||||
def restart!
|
||||
@options[:on_restart].each do |block|
|
||||
block.call self
|
||||
end
|
||||
|
||||
if jruby?
|
||||
close_binder_listeners
|
||||
|
||||
require 'puma/jruby_restart'
|
||||
JRubyRestart.chdir_exec(@restart_dir, restart_args)
|
||||
elsif windows?
|
||||
close_binder_listeners
|
||||
|
||||
argv = restart_args
|
||||
Dir.chdir(@restart_dir)
|
||||
argv += [redirects] if RUBY_VERSION >= '1.9'
|
||||
Kernel.exec(*argv)
|
||||
else
|
||||
redirects = {:close_others => true}
|
||||
@binder.listeners.each_with_index do |(l, io), i|
|
||||
ENV["PUMA_INHERIT_#{i}"] = "#{io.to_i}:#{l}"
|
||||
redirects[io.to_i] = io.to_i
|
||||
end
|
||||
|
||||
argv = restart_args
|
||||
Dir.chdir(@restart_dir)
|
||||
argv += [redirects] if RUBY_VERSION >= '1.9'
|
||||
Kernel.exec(*argv)
|
||||
end
|
||||
@launcher.restart!
|
||||
end
|
||||
|
||||
# Parse the options, load the rackup, start the server and wait
|
||||
# for it to finish.
|
||||
#
|
||||
def run
|
||||
@runner = @launcher.runner
|
||||
@launcher.run
|
||||
end
|
||||
|
||||
def reload_worker_directory
|
||||
@runner.reload_worker_directory if @runner.respond_to?(:reload_worker_directory)
|
||||
@launcher.reload_worker_directory
|
||||
end
|
||||
|
||||
def phased_restart
|
||||
unless @runner.respond_to?(:phased_restart) and @runner.phased_restart
|
||||
log "* phased-restart called but not available, restarting normally."
|
||||
return restart
|
||||
end
|
||||
true
|
||||
@launcher.phased_restart
|
||||
end
|
||||
|
||||
def redirect_io
|
||||
@runner.redirect_io
|
||||
@launcher.redirect_io
|
||||
end
|
||||
|
||||
def stats
|
||||
|
@ -259,8 +223,7 @@ module Puma
|
|||
end
|
||||
|
||||
def halt
|
||||
@status = :halt
|
||||
@runner.halt
|
||||
@launcher.halt
|
||||
end
|
||||
|
||||
private
|
||||
|
@ -269,15 +232,6 @@ module Puma
|
|||
raise UnsupportedOption
|
||||
end
|
||||
|
||||
def restart_args
|
||||
cmd = @options[:restart_cmd]
|
||||
if cmd
|
||||
cmd.split(' ') + @original_argv
|
||||
else
|
||||
@restart_argv
|
||||
end
|
||||
end
|
||||
|
||||
# Build the OptionParser object to handle the available options.
|
||||
#
|
||||
|
||||
|
@ -412,55 +366,5 @@ module Puma
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
def generate_restart_data
|
||||
# Use the same trick as unicorn, namely favor PWD because
|
||||
# it will contain an unresolved symlink, useful for when
|
||||
# the pwd is /data/releases/current.
|
||||
if dir = ENV['PWD']
|
||||
s_env = File.stat(dir)
|
||||
s_pwd = File.stat(Dir.pwd)
|
||||
|
||||
if s_env.ino == s_pwd.ino and (jruby? or s_env.dev == s_pwd.dev)
|
||||
@restart_dir = dir
|
||||
@options[:worker_directory] = dir
|
||||
end
|
||||
end
|
||||
|
||||
@restart_dir ||= Dir.pwd
|
||||
|
||||
@original_argv = @argv.dup
|
||||
|
||||
require 'rubygems'
|
||||
|
||||
# if $0 is a file in the current directory, then restart
|
||||
# it the same, otherwise add -S on there because it was
|
||||
# picked up in PATH.
|
||||
#
|
||||
if File.exist?($0)
|
||||
arg0 = [Gem.ruby, $0]
|
||||
else
|
||||
arg0 = [Gem.ruby, "-S", $0]
|
||||
end
|
||||
|
||||
# Detect and reinject -Ilib from the command line
|
||||
lib = File.expand_path "lib"
|
||||
arg0[1,0] = ["-I", lib] if $:[0] == lib
|
||||
|
||||
if defined? Puma::WILD_ARGS
|
||||
@restart_argv = arg0 + Puma::WILD_ARGS + @original_argv
|
||||
else
|
||||
@restart_argv = arg0 + @original_argv
|
||||
end
|
||||
end
|
||||
|
||||
def close_binder_listeners
|
||||
@binder.listeners.each do |l, io|
|
||||
io.close
|
||||
uri = URI.parse(l)
|
||||
next unless uri.scheme == 'unix'
|
||||
File.unlink("#{uri.host}#{uri.path}")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,4 +1,11 @@
|
|||
module Puma
|
||||
IS_JRUBY = defined?(JRUBY_VERSION)
|
||||
end
|
||||
|
||||
def self.jruby?
|
||||
IS_JRUBY
|
||||
end
|
||||
|
||||
def self.windows?
|
||||
RUBY_PLATFORM =~ /mswin32|ming32/
|
||||
end
|
||||
end
|
||||
|
|
|
@ -34,6 +34,16 @@ module Puma
|
|||
@events
|
||||
end
|
||||
|
||||
# Delegate +error+ to +@events+
|
||||
#
|
||||
def error(str)
|
||||
@events.error str
|
||||
end
|
||||
|
||||
def debug(str)
|
||||
@events.log "- #{str}" if @options[:debug]
|
||||
end
|
||||
|
||||
def write_state
|
||||
write_pid
|
||||
|
||||
|
@ -74,11 +84,14 @@ module Puma
|
|||
end
|
||||
end
|
||||
|
||||
attr_accessor :options, :binder, :config, :events
|
||||
attr_accessor :options, :binder, :config, :events, :argv
|
||||
## THIS STUFF IS NEEDED FOR RUNNER
|
||||
|
||||
|
||||
def setup(options)
|
||||
@options = options
|
||||
generate_restart_data
|
||||
|
||||
parse_options
|
||||
|
||||
dir = @options[:directory]
|
||||
|
@ -101,7 +114,6 @@ module Puma
|
|||
end
|
||||
|
||||
|
||||
|
||||
attr_accessor :runner
|
||||
|
||||
def stop
|
||||
|
@ -139,13 +151,11 @@ module Puma
|
|||
end
|
||||
|
||||
def jruby?
|
||||
# remove eventually
|
||||
IS_JRUBY
|
||||
Puma.jruby?
|
||||
end
|
||||
|
||||
def windows?
|
||||
# remove eventually
|
||||
RUBY_PLATFORM =~ /mswin32|ming32/
|
||||
Puma.windows?
|
||||
end
|
||||
|
||||
|
||||
|
@ -176,6 +186,71 @@ module Puma
|
|||
end
|
||||
end
|
||||
|
||||
def redirect_io
|
||||
@runner.redirect_io
|
||||
end
|
||||
|
||||
def phased_restart
|
||||
unless @runner.respond_to?(:phased_restart) and @runner.phased_restart
|
||||
log "* phased-restart called but not available, restarting normally."
|
||||
return restart
|
||||
end
|
||||
true
|
||||
end
|
||||
|
||||
private
|
||||
def restart_args
|
||||
cmd = @options[:restart_cmd]
|
||||
if cmd
|
||||
cmd.split(' ') + @original_argv
|
||||
else
|
||||
@restart_argv
|
||||
end
|
||||
end
|
||||
public
|
||||
|
||||
|
||||
def jruby_daemon_start
|
||||
require 'puma/jruby_restart'
|
||||
JRubyRestart.daemon_start(@restart_dir, restart_args)
|
||||
end
|
||||
|
||||
def reload_worker_directory
|
||||
@launcher.reload_worker_directory
|
||||
end
|
||||
|
||||
def restart!
|
||||
@options[:on_restart].each do |block|
|
||||
block.call self
|
||||
end
|
||||
|
||||
if jruby?
|
||||
close_binder_listeners
|
||||
|
||||
require 'puma/jruby_restart'
|
||||
JRubyRestart.chdir_exec(@restart_dir, restart_args)
|
||||
elsif windows?
|
||||
close_binder_listeners
|
||||
|
||||
argv = restart_args
|
||||
Dir.chdir(@restart_dir)
|
||||
argv += [redirects] if RUBY_VERSION >= '1.9'
|
||||
Kernel.exec(*argv)
|
||||
else
|
||||
redirects = {:close_others => true}
|
||||
@binder.listeners.each_with_index do |(l, io), i|
|
||||
ENV["PUMA_INHERIT_#{i}"] = "#{io.to_i}:#{l}"
|
||||
redirects[io.to_i] = io.to_i
|
||||
end
|
||||
|
||||
argv = restart_args
|
||||
Dir.chdir(@restart_dir)
|
||||
argv += [redirects] if RUBY_VERSION >= '1.9'
|
||||
Kernel.exec(*argv)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
private
|
||||
def unsupported(str)
|
||||
@events.error(str)
|
||||
|
@ -243,6 +318,57 @@ module Puma
|
|||
@options[:prune_bundler] && clustered? && !@options[:preload_app]
|
||||
end
|
||||
|
||||
def close_binder_listeners
|
||||
@binder.listeners.each do |l, io|
|
||||
io.close
|
||||
uri = URI.parse(l)
|
||||
next unless uri.scheme == 'unix'
|
||||
File.unlink("#{uri.host}#{uri.path}")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def generate_restart_data
|
||||
# Use the same trick as unicorn, namely favor PWD because
|
||||
# it will contain an unresolved symlink, useful for when
|
||||
# the pwd is /data/releases/current.
|
||||
if dir = ENV['PWD']
|
||||
s_env = File.stat(dir)
|
||||
s_pwd = File.stat(Dir.pwd)
|
||||
|
||||
if s_env.ino == s_pwd.ino and (jruby? or s_env.dev == s_pwd.dev)
|
||||
@restart_dir = dir
|
||||
@options[:worker_directory] = dir
|
||||
end
|
||||
end
|
||||
|
||||
@restart_dir ||= Dir.pwd
|
||||
|
||||
@original_argv = @argv.nil? ? "puma" : @argv.dup
|
||||
|
||||
require 'rubygems'
|
||||
|
||||
# if $0 is a file in the current directory, then restart
|
||||
# it the same, otherwise add -S on there because it was
|
||||
# picked up in PATH.
|
||||
#
|
||||
if File.exist?($0)
|
||||
arg0 = [Gem.ruby, $0]
|
||||
else
|
||||
arg0 = [Gem.ruby, "-S", $0]
|
||||
end
|
||||
|
||||
# Detect and reinject -Ilib from the command line
|
||||
lib = File.expand_path "lib"
|
||||
arg0[1,0] = ["-I", lib] if $:[0] == lib
|
||||
|
||||
if defined? Puma::WILD_ARGS
|
||||
@restart_argv = arg0 + Puma::WILD_ARGS + @original_argv
|
||||
else
|
||||
@restart_argv = arg0 + @original_argv
|
||||
end
|
||||
end
|
||||
|
||||
def setup_signals
|
||||
begin
|
||||
Signal.trap "SIGUSR2" do
|
||||
|
|
|
@ -17,7 +17,7 @@ class TestCLI < Test::Unit::TestCase
|
|||
|
||||
@wait, @ready = IO.pipe
|
||||
|
||||
@events = Events.strings
|
||||
@events = Puma::Events.strings
|
||||
@events.on_booted { @ready << "!" }
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue