class PhusionPassenger::Config::InstallStandaloneRuntimeCommand

def self.create_option_parser(options)

def self.create_option_parser(options)
  OptionParser.new do |opts|
    nl = "\n" + ' ' * 37
    opts.banner = "Usage: passenger-config install-standalone-runtime [OPTIONS]\n"
    opts.separator ""
    opts.separator "  Install the #{PROGRAM_NAME} Standalone runtime. This runtime consists of"
    opts.separator "  the #{PROGRAM_NAME} agent, and an Nginx engine. Installation is done either"
    opts.separator "  by downloading the necessary files from the #{PROGRAM_NAME} website, or"
    opts.separator "  by compiling them from source."
    opts.separator ""
    opts.separator "Options:"
    opts.on("--working-dir PATH", String, "Store temporary files in the given#{nl}" +
      "directory, instead of creating one") do |val|
      options[:install_agent_args] << "--working-dir"
      options[:install_agent_args] << val
      options[:compile_args] << "--working-dir"
      options[:compile_args] << val
    end
    opts.on("--url-root URL", String, "Download binaries from a custom URL") do |value|
      options[:install_agent_args] << "--url-root"
      options[:install_agent_args] << value
      options[:download_args] << "--url-root"
      options[:download_args] << value
    end
    opts.on("--nginx-version VERSION", String, "Nginx version to compile. " +
      "Default: #{PREFERRED_NGINX_VERSION}") do |val|
      options[:nginx_version] = val
    end
    opts.on("--nginx-tarball PATH", String, "Use the given Nginx tarball instead of#{nl}" +
      "downloading it. You MUST also specify the#{nl}" +
      "Nginx version with --nginx-version") do |val|
      options[:nginx_tarball] = val
    end
    opts.on("--brief", "Report progress in a brief style") do
      options[:brief] = true
      options[:install_agent_args] << "--brief"
      options[:download_args] << "--log-level"
      options[:download_args] << "warn"
      options[:download_args] << "--log-prefix"
      options[:download_args] << "     "
      options[:download_args] << "--no-download-progress"
    end
    opts.on("-f", "--force", "Skip sanity checks") do
      options[:force] = true
      options[:install_agent_args] << "--force"
      options[:download_args] << "--force"
      options[:compile_args] << "--force"
    end
    opts.on("--no-force-tip", "Do not print any tips regarding the#{nl}" +
      "--force parameter") do
      options[:force_tip] = false
      options[:install_agent_args] << "--no-force-tip"
      options[:download_args] << "--no-force-tip"
      options[:compile_args] << "--no-force-tip"
    end
    opts.on("--no-compile", "Download, but do not compile") do
      options[:compile] = false
      options[:install_agent_args] << "--no-compile"
    end
    opts.on("--skip-agent", "Do not install the agent") do
      options[:install_agent] = false
    end
    opts.on("--skip-cache", "Do not copy the binaries from cache") do
      options[:install_agent_args] << "--skip-cache"
      options[:download_args] << "--skip-cache"
    end
    opts.on("--connect-timeout SECONDS", Integer,
      "The maximum amount of time to spend on DNS#{nl}" +
      "lookup and establishing the TCP connection.#{nl}" +
      "Default: 30") do |val|
      options[:install_agent_args] << "--connect-timeout"
      options[:install_agent_args] << val.to_s
      options[:download_args] << "--connect-timeout"
      options[:download_args] << val.to_s
      options[:compile_args] << "--connect-timeout"
      options[:compile_args] << val.to_s
    end
    opts.on("--idle-timeout SECONDS", Integer, "The maximum idle read time. Default: 30") do |val|
      options[:install_agent_args] << "--idle-timeout"
      options[:install_agent_args] << val.to_s
      options[:download_args] << "--idle-timeout"
      options[:download_args] << val.to_s
      options[:compile_args] << "--idle-timeout"
      options[:compile_args] << val.to_s
    end
    opts.on("-h", "--help", "Show this help") do
      options[:help] = true
    end
  end
end

def compile_nginx_engine(tmpdir)

def compile_nginx_engine(tmpdir)
  puts
  puts "---------------------------------------"
  puts
  if @options[:compile]
    puts "No precompiled Nginx engine could be downloaded. Compiling it from source instead."
    puts
    args = @options[:compile_args].dup
    args << "--working-dir"
    args << tmpdir
    CompileNginxEngineCommand.new(args).run
  else
    abort "No precompiled Nginx engine could be downloaded. Refusing to compile because --no-compile is given."
  end
end

def download_nginx_engine

def download_nginx_engine
  if @options[:brief]
    puts " --> Installing Nginx #{@options[:nginx_version]} engine"
  else
    puts "#{@colors.blue_bg}#{@colors.yellow}#{@colors.bold}" +
      "Downloading an Nginx #{@options[:nginx_version]} engine " +
      "for your platform#{@colors.reset}"
    puts
  end
  begin
    DownloadNginxEngineCommand.new(@options[:download_args]).run
    true
  rescue SystemExit => e
    e.success?
  end
end

def help

def help
  puts @parser
end

def initialize_objects

def initialize_objects
  @colors = Utils::AnsiColors.new(@options[:colorize])
  @logger = Logger.new(STDOUT)
  @logger.level = @options[:log_level]
  @logger.formatter = proc do |severity, datetime, progname, msg|
    if severity == "FATAL" || severity == "ERROR"
      color = @colors.red
    else
      color = nil
    end
    result = ""
    msg.split("\n", -1).map do |line|
      result << "#{color}#{@options[:log_prefix]}#{line}#{@colors.reset}\n"
    end
    result
  end
  if !@options[:nginx_version]
    if @options[:nginx_tarball]
      abort "#{@colors.red}Error: if you specify --nginx-tarball, " +
        "you must also specify --nginx-version.#{@colors.reset}"
    else
      @options[:nginx_version] = PREFERRED_NGINX_VERSION
    end
  end
end

def install_agent(tmpdir)

def install_agent(tmpdir)
  if @options[:install_agent]
    args = @options[:install_agent_args].dup
    args << "--working-dir"
    args << tmpdir
    begin
      InstallAgentCommand.new(args).run
    rescue SystemExit => e
      raise e if !e.success?
    end
    puts
  end
end

def run

def run
  @options = {
    :log_level => Logger::INFO,
    :colorize => :auto,
    :force => false,
    :force_tip => true,
    :compile => true,
    :install_agent => true,
    :install_agent_args => [],
    :download_args => [
      "--no-error-colors",
      "--no-compilation-tip"
    ],
    :compile_args => []
  }
  parse_options
  initialize_objects
  sanity_check
  PhusionPassenger::Utils.mktmpdir("passenger-install.", PlatformInfo.tmpexedir) do |tmpdir|
    install_agent(tmpdir)
    if !download_nginx_engine
      compile_nginx_engine(tmpdir)
    end
  end
end

def sanity_check

def sanity_check
  return if @options[:force]
  all_installed = PhusionPassenger.find_support_binary(AGENT_EXE) &&
    PhusionPassenger.find_support_binary("nginx-#{@options[:nginx_version]}")
  if all_installed
    @logger.warn "#{@colors.green}The #{PROGRAM_NAME} Standalone runtime is already installed."
    if @options[:force_tip]
      @logger.warn "If you want to redownload it, re-run this program with the --force parameter."
    end
    exit
  end
end