class PhusionPassenger::MessageClient

for example the ApplicationPool server.
A convenience class for communicating with MessageServer servers,

def auto_disconnect

def auto_disconnect
  if @channel
    @socket.close rescue nil
    @socket = @channel = nil
  end
end

def check_security_response

def check_security_response
  begin
    result = @channel.read
  rescue
    auto_disconnect
    raise
  end
  if result.nil?
    raise EOFError
  elsif result[0] != "Passed security"
    raise SecurityError, result[0]
  end
end

def close

def close
  @socket.close if @socket
  @channel = @socket = nil
end

def connected?

def connected?
  return !!@channel
end

def helper_agent_backtraces

def helper_agent_backtraces
  write("backtraces")
  check_security_response
  return read_scalar
end

def helper_agent_requests

def helper_agent_requests
  write("requests")
  check_security_response
  return read_scalar
end

def initialize(username, password, address)

generation's helper server.
Connect to the given server. By default it connects to the current
def initialize(username, password, address)
  @socket = connect_to_server(address)
  begin
    @channel = MessageChannel.new(@socket)
    result = @channel.read
    if result.nil?
      raise EOFError
    elsif result.size != 2 || result[0] != "version"
      raise IOError, "The message server didn't sent a valid version identifier"
    elsif result[1] != "1"
      raise IOError, "Unsupported message server protocol version #{result[1]}"
    end
    @channel.write_scalar(username)
    @channel.write_scalar(password)
    result = @channel.read
    if result.nil?
      raise EOFError
    elsif result[0] != "ok"
      raise SecurityError, result[0]
    end
  rescue Exception
    @socket.close
    raise
  end
end

def logging_agent_status

def logging_agent_status
  write("status")
  check_security_response
  return read_scalar
end

def pool_detach_process(pid)

def pool_detach_process(pid)
  write("detach_process", pid)
  check_security_response
  result = read
  if result.nil?
    raise EOFError
  else
    return result.first == "true"
  end
end

def pool_detach_process_by_key(detach_key)

def pool_detach_process_by_key(detach_key)
  write("detach_process_by_key", detach_key)
  check_security_response
  result = read
  if result.nil?
    raise EOFError
  else
    return result.first == "true"
  end
end

def pool_status(options = {})

def pool_status(options = {})
  write("inspect", *options.to_a.flatten)
  check_security_response
  return read_scalar
rescue
  auto_disconnect
  raise
end

def pool_xml

def pool_xml
  write("toXml", true)
  check_security_response
  return read_scalar
end

def read

def read
  return @channel.read
rescue
  auto_disconnect
  raise
end

def read_scalar

def read_scalar
  return @channel.read_scalar
rescue
  auto_disconnect
  raise
end

def recv_io(klass = IO, negotiate = true)

def recv_io(klass = IO, negotiate = true)
  return @channel.recv_io(klass, negotiate)
rescue
  auto_disconnect
  raise
end

def restart_app_group(app_group_name, options = {})

def restart_app_group(app_group_name, options = {})
  write("restart_app_group", app_group_name, *options.to_a.flatten)
  check_security_response
  result = read
  if result.nil?
    raise EOFError
  else
    return result.first == "true"
  end
end

def write(*args)

def write(*args)
  @channel.write(*args)
rescue
  auto_disconnect
  raise
end

def write_scalar(*args)

def write_scalar(*args)
  @channel.write_scalar(*args)
rescue
  auto_disconnect
  raise
end