class PhusionPassenger::Config::DetachProcessCommand

def self.create_option_parser(options)

def self.create_option_parser(options)
  OptionParser.new do |opts|
    nl = "\n" + ' ' * 37
    opts.banner = "Usage: passenger-config detach-process [OPTIONS] <PID>\n"
    opts.separator ""
    opts.separator "  Remove an application process from the #{PROGRAM_NAME} process pool, and"
    opts.separator "  shut it down. Has a similar effect to killing the application process"
    opts.separator "  directly with `kill <PID>`. But `kill` aborts any active requests, while"
    opts.separator "  this command shuts down the process after active requests are finished."
    opts.separator ""
    opts.separator "  If you want to force abort a process and its active requests, just use `kill`."
    opts.separator ""
    opts.separator "Options:"
    opts.on("--instance NAME", String, "The #{PROGRAM_NAME} instance to select") do |value|
      options[:instance] = value
    end
    opts.on("--ignore-nonexistant-pid", "Exit successfully even if the specified#{nl}" +
      "PID is not in the process pool.") do
      options[:ignore_nonexistant_pid] = true
    end
    opts.on("-h", "--help", "Show this help") do
      options[:help] = true
    end
  end
end

def help

def help
  puts @parser
end

def parse_options

def parse_options
  super
  if @argv.empty?
    abort "Please pass a PID. " +
      "See --help for more information."
  elsif @argv.size == 1
    @pid = @argv[0].to_i
  elsif @argv.size > 1
    help
    abort
  end
end

def perform_detach

def perform_detach
  request = Net::HTTP::Post.new("/pool/detach_process.json")
  request.basic_auth("admin", obtain_full_admin_password(@instance))
  request.content_type = "application/json"
  request.body = PhusionPassenger::Utils::JSON.generate(:pid => @pid)
  response = @instance.http_request("agents.s/server_admin", request)
  if response.code.to_i / 100 == 2
    body = PhusionPassenger::Utils::JSON.parse(response.body)
    if body['detached']
      puts "Process #{@pid} detached."
    elsif @options[:ignore_nonexistant_pid]
      puts "Could not detach process #{@pid}."
    else
      abort "Could not detach process #{@pid}."
    end
  else
    STDERR.puts "*** An error occured while communicating with the #{PROGRAM_NAME} server:"
    STDERR.puts response.body
    abort
  end
end

def run

def run
  parse_options
  select_passenger_instance
  perform_detach
end