Class: PhusionPassenger::MessageClient

Inherits:
Object
  • Object
show all
Includes:
Utils
Defined in:
lib/phusion_passenger/message_client.rb

Overview

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

Instance Method Summary collapse

Methods included from Utils

process_is_alive?

Constructor Details

#initialize(username, password, address = "unix:#{Utils.passenger_tmpdir}/socket") ⇒ MessageClient

Connect to the given server. By default it connects to the current generation's helper server.



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/phusion_passenger/message_client.rb', line 39

def initialize(username, password, address = "unix:#{Utils.passenger_tmpdir}/socket")
  @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

Instance Method Details

#backtracesObject

BacktracesServer methods ###



107
108
109
110
111
# File 'lib/phusion_passenger/message_client.rb', line 107

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

#check_security_responseObject



150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/phusion_passenger/message_client.rb', line 150

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

#closeObject



68
69
70
71
# File 'lib/phusion_passenger/message_client.rb', line 68

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

#connected?Boolean

Returns:

  • (Boolean)


73
74
75
# File 'lib/phusion_passenger/message_client.rb', line 73

def connected?
  return !!@channel
end

#detach(detach_key) ⇒ Object

ApplicationPool::Server methods ###



79
80
81
82
83
84
85
86
87
88
# File 'lib/phusion_passenger/message_client.rb', line 79

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

#readObject

Low level I/O methods ###



115
116
117
118
119
120
# File 'lib/phusion_passenger/message_client.rb', line 115

def read
  return @channel.read
rescue
  auto_disconnect
  raise
end

#read_scalarObject



136
137
138
139
140
141
# File 'lib/phusion_passenger/message_client.rb', line 136

def read_scalar
  return @channel.read_scalar
rescue
  auto_disconnect
  raise
end

#recv_io(klass = IO, negotiate = true) ⇒ Object



143
144
145
146
147
148
# File 'lib/phusion_passenger/message_client.rb', line 143

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

#statusObject



90
91
92
93
94
95
96
97
# File 'lib/phusion_passenger/message_client.rb', line 90

def status
  write("inspect")
  check_security_response
  return read_scalar
rescue
  auto_disconnect
  raise
end

#write(*args) ⇒ Object



122
123
124
125
126
127
# File 'lib/phusion_passenger/message_client.rb', line 122

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

#write_scalar(*args) ⇒ Object



129
130
131
132
133
134
# File 'lib/phusion_passenger/message_client.rb', line 129

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

#xmlObject



99
100
101
102
103
# File 'lib/phusion_passenger/message_client.rb', line 99

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