class Goliath::Runner

rack application, creating a logger, and then executing the Goliath::Server with the loaded information.
The Goliath::Runner is responsible for parsing any provided options, setting up the

def initialize(argv, api)

Returns:
  • (Goliath::Runner) - An initialized Goliath::Runner

Parameters:
  • api (Object | nil) -- The Goliath::API this runner is for, can be nil
  • argv (Array) -- The command line arguments
def initialize(argv, api)
  api.options_parser(options_parser, options) if api
  options_parser.parse!(argv)
  # We've already dealt with the environment, so just discard it.
  options.delete(:env)
  @api = api
  @address = options.delete(:address)
  @port = options.delete(:port)
  @log_file = options.delete(:log_file)
  @pid_file = options.delete(:pid_file)
  @log_stdout = options.delete(:log_stdout)
  @daemonize = options.delete(:daemonize)
  @verbose = options.delete(:verbose)
  @server_options = options
end

def load_plugins(plugins)

Returns:
  • (Nil) -

Parameters:
  • plugins (Array) -- The list of plugins to use
def load_plugins(plugins)
  @plugins = plugins
end

def options_parser

Returns:
  • (OptionParser) - Creates the options parser for the runner with the default options
def options_parser
  @options ||= {
    :address => Goliath::Server::DEFAULT_ADDRESS,
    :port => Goliath::Server::DEFAULT_PORT,
    :daemonize => false,
    :verbose => false,
    :log_stdout => false,
    :env => Goliath::DEFAULT_ENV
  }
  @options_parser ||= OptionParser.new do |opts|
    opts.banner = "Usage: <server> [options]"
    opts.separator ""
    opts.separator "Server options:"
    # The environment isn't set as part of this option parsing routine, but
    # we'll leave the flag here so a call to --help shows it correctly.
    opts.on('-e', '--environment NAME', "Set the execution environment (default: #{@options[:env]})") { |val| @options[:env] = val }
    opts.on('-a', '--address HOST', "Bind to HOST address (default: #{@options[:address]})") { |addr| @options[:address] = addr }
    opts.on('-p', '--port PORT', "Use PORT (default: #{@options[:port]})") { |port| @options[:port] = port.to_i }
    opts.on('-S', '--socket FILE', "Bind to unix domain socket") { |v| @options[:address] = v; @options[:port] = nil }
    opts.on('-E', '--einhorn', "Use Einhorn socket manager") { |v| @options[:einhorn] = true }
    opts.separator ""
    opts.separator "Daemon options:"
    opts.on('-u', '--user USER', "Run as specified user") {|v| @options[:user] = v }
    opts.on('-c', '--config FILE', "Config file (default: ./config/<server>.rb)") { |v| @options[:config] = v }
    opts.on('-d', '--daemonize', "Run daemonized in the background (default: #{@options[:daemonize]})") { |v| @options[:daemonize] = v }
    opts.on('-l', '--log FILE', "Log to file (default: off)") { |file| @options[:log_file] = file }
    opts.on('-s', '--stdout', "Log to stdout (default: #{@options[:log_stdout]})") { |v| @options[:log_stdout] = v }
    opts.on('-P', '--pid FILE', "Pid file (default: off)") { |file| @options[:pid_file] = file }
    opts.separator ""
    opts.separator "SSL options:"
    opts.on('--ssl', 'Enables SSL (default: off)') {|v| @options[:ssl] = v }
    opts.on('--ssl-key FILE', 'Path to private key') {|v| @options[:ssl_key] = v }
    opts.on('--ssl-cert FILE', 'Path to certificate') {|v| @options[:ssl_cert] = v }
    opts.on('--ssl-verify', 'Enables SSL certificate verification') {|v| @options[:ssl_verify] = v }
    opts.separator ""
    opts.separator "Common options:"
    opts.on('-C', '--console', 'Start a console') { @options[:console] = true }
    opts.on('-v', '--verbose', "Enable verbose logging (default: #{@options[:verbose]})") { |v| @options[:verbose] = v }
    opts.on('-h', '--help', 'Display help message') { show_options(opts) }
  end
end

def remove_pid

Returns:
  • (Nil) -
def remove_pid
  File.delete(@pid_file)
end

def run

Returns:
  • (Nil) -
def run
  if options[:console]
    Goliath::Console.run!(setup_server)
    return
  end
  unless Goliath.env?(:test)
    $LOADED_FEATURES.unshift(File.basename($0))
    Dir.chdir(File.expand_path(File.dirname($0)))
  end
  if @daemonize
    Process.fork do
      Process.setsid
      exit if fork
      @pid_file ||= './goliath.pid'
      @log_file ||= File.expand_path('goliath.log')
      store_pid(Process.pid)
      File.umask(0000)
      log_extension = File.extname(@log_file)
      stdout_log_file = "#{File.dirname(@log_file)}/#{File.basename(@log_file, log_extension)}_stdout#{log_extension}"
      STDIN.reopen("/dev/null")
      STDOUT.reopen(stdout_log_file, "a")
      STDERR.reopen(STDOUT)
      run_server
      remove_pid
    end
  else
    run_server
  end
end

def run_server

Returns:
  • (Nil) -
def run_server
  log = setup_logger
  log.info("Starting server on http#{ @server_options[:ssl] ? 's' : nil }://#{@address}:#{@port} in #{Goliath.env} mode. Watch out for stones.")
  server = setup_server(log)
  server.api.setup if server.api.respond_to?(:setup)
  server.start
end

def setup_file_logger(log, log_format)

Returns:
  • (Nil) -

Parameters:
  • log_format (Log4r::Formatter) -- The log format to use
  • log (Logger) -- The logger to add file logging too
def setup_file_logger(log, log_format)
  FileUtils.mkdir_p(File.dirname(@log_file))
  log.add(Log4r::FileOutputter.new('fileOutput', {:filename => @log_file,
                                                  :trunc => false,
                                                  :formatter => log_format}))
end

def setup_logger

Returns:
  • (Logger) - The logger object
def setup_logger
  if logger
    warn_on_custom_logger
    return logger
  end
  log = Log4r::Logger.new('goliath')
  log_format = Log4r::PatternFormatter.new(:pattern => "[#{Process.pid}:%l] %d :: %m")
  setup_file_logger(log, log_format) if @log_file
  setup_stdout_logger(log, log_format) if @log_stdout
  log.level = @verbose ? Log4r::DEBUG : Log4r::INFO
  log
end

def setup_server(log = setup_logger)

Returns:
  • (Server) - an instance of a Goliath server

Parameters:
  • log (Logger) -- The logger to configure the server to log to
def setup_server(log = setup_logger)
  server = Goliath::Server.new(@address, @port)
  server.logger = log
  server.app = @app
  server.api = @api
  server.plugins = @plugins || []
  server.options = @server_options
  server
end

def setup_stdout_logger(log, log_format)

Returns:
  • (Nil) -

Parameters:
  • log_format (Log4r::Formatter) -- The log format to use
  • log (Logger) -- The logger to add stdout logging too
def setup_stdout_logger(log, log_format)
  log.add(Log4r::StdoutOutputter.new('console', :formatter => log_format))
end

def show_options(opts)

Returns:
  • (exit) - This will exit the server

Parameters:
  • opts (OptionsParser) -- The options parser
def show_options(opts)
  puts opts
  at_exit { exit! }
  exit
end

def store_pid(pid)

Returns:
  • (Nil) -

Parameters:
  • pid (Integer) -- The pid to store
def store_pid(pid)
  FileUtils.mkdir_p(File.dirname(@pid_file))
  File.open(@pid_file, 'w') { |f| f.write(pid) }
end

def warn_on_custom_logger

def warn_on_custom_logger
  warn "log_file option will not take effect with a custom logger" if @log_file
  warn "log_stdout option will not take effect with a custom logger" if @log_stdout
  warn "verbose option will not take effect with a custom logger" if @verbose
end