lib/protobuf/cli.rb in protobuf-3.3.6 vs lib/protobuf/cli.rb in protobuf-3.4.0

- old
+ new

@@ -1,5 +1,7 @@ +require 'active_support/core_ext/hash/keys' + require 'thor' require 'protobuf/version' require 'protobuf/logging' require 'protobuf/rpc/servers/socket_runner' require 'protobuf/rpc/servers/zmq_runner' @@ -7,12 +9,16 @@ module Protobuf class CLI < ::Thor include ::Thor::Actions include ::Protobuf::Logging - attr_accessor :runner, :mode + attr_accessor :runner, :mode, :exit_requested + no_commands do + alias_method :exit_requested?, :exit_requested + end + default_task :start desc 'start APP_FILE', 'Run the RPC server in the given mode, preloading the given APP_FILE. This is the default task.' option :host, :type => :string, :default => '127.0.0.1', :aliases => %w(-o), :desc => 'Host to bind.' @@ -98,75 +104,72 @@ end # Re-write the $0 var to have a nice process name in ps. def configure_process_name(app_file) debug_say('Configuring process name') - $0 = "rpc_server --#{@runner_mode} #{options.host}:#{options.port} #{app_file}" + $0 = "rpc_server --#{mode} #{options.host}:#{options.port} #{app_file}" end # Configure the mode of the server and the runner class. def configure_runner_mode debug_say('Configuring runner mode') - if multi_mode? + self.mode = if multi_mode? say('WARNING: You have provided multiple mode options. Defaulting to socket mode.', :yellow) - @runner_mode = :socket + :socket elsif options.zmq? - @runner_mode = :zmq - else + :zmq + else # rubocop:disable Style/ElseAlignment + # above: https://github.com/bbatsov/rubocop/pull/1470/files case server_type = ENV["PB_SERVER_TYPE"] when nil, /socket/i - @runner_mode = :socket + :socket when /zmq/i - @runner_mode = :zmq + :zmq else say "WARNING: You have provided incorrect option 'PB_SERVER_TYPE=#{server_type}'. Defaulting to socket mode.", :yellow - @runner_mode = :socket + :socket end end end # Configure signal traps. - # TODO add signal handling for hot-reloading the application. + # TODO: add signal handling for hot-reloading the application. def configure_traps debug_say('Configuring traps') exit_signals = [:INT, :TERM] exit_signals << :QUIT unless defined?(JRUBY_VERSION) exit_signals.each do |signal| debug_say("Registering trap for exit signal #{signal}", :blue) trap(signal) do - @exit_requested = true + self.exit_requested = true shutdown_server end end end # Create the runner for the configured mode def create_runner - debug_say("Creating #{@runner_mode} runner") - @runner = case @runner_mode - when :zmq - create_zmq_runner - when :socket - create_socket_runner - else - say_and_exit("Unknown runner mode: #{@runner_mode}") - end + debug_say("Creating #{mode} runner") + self.runner = case mode + when :zmq + create_zmq_runner + when :socket + create_socket_runner + else + say_and_exit("Unknown runner mode: #{mode}") + end end # Say something if we're in debug mode. def debug_say(message, color = :yellow) say(message, color) if options.debug? end - def exit_requested? - !!@exit_requested - end - # Internal helper to determine if the modes are multi-set which is not valid. def multi_mode? options.zmq? && options.socket? end @@ -177,12 +180,11 @@ rescue LoadError => e say_and_exit("Failed to load application file #{app_file}", e) end def runner_options - # Symbolize keys - opt = options.inject({}) { |h, (k, v)| h[k.to_sym] = v; h } + opt = options.symbolize_keys opt[:workers_only] = (!!ENV['PB_WORKERS_ONLY']) || options.workers_only opt end @@ -204,39 +206,37 @@ end def create_socket_runner require 'protobuf/socket' - @runner = ::Protobuf::Rpc::SocketRunner.new(runner_options) + self.runner = ::Protobuf::Rpc::SocketRunner.new(runner_options) end def create_zmq_runner require 'protobuf/zmq' - @runner = ::Protobuf::Rpc::ZmqRunner.new(runner_options) + self.runner = ::Protobuf::Rpc::ZmqRunner.new(runner_options) end def shutdown_server logger.info { 'RPC Server shutting down...' } - @runner.try(:stop) + runner.stop ::Protobuf::Rpc::ServiceDirectory.instance.stop end # Start the runner and log the relevant options. def start_server debug_say('Running server') - @runner.run do - logger.info { - "pid #{::Process.pid} -- #{@runner_mode} RPC Server listening at #{options.host}:#{options.port}" - } + runner.run do + logger.info do + "pid #{::Process.pid} -- #{mode} RPC Server listening at #{options.host}:#{options.port}" + end ::ActiveSupport::Notifications.instrument("after_server_bind") end logger.info { 'Shutdown complete' } - - exit 0 end end end end