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.

Constant Summary

Constants included from Utils

Utils::NULL

Instance Method Summary collapse

Methods included from Utils

#connect_to_server, #generate_random_id, #get_socket_address_type, #global_backtrace_report, included, #install_options_as_ivars, #local_socket_address?, mktmpdir, #print_exception, #process_is_alive?, #require_option, #split_by_null_into_hash

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

#check_security_responseObject



175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/phusion_passenger/message_client.rb', line 175

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

#helper_agent_backtracesObject

HelperAgent BacktracesServer methods ###



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

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

#helper_agent_requestsObject



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

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

#logging_agent_statusObject

LoggingAgent AdminServer methods ###



132
133
134
135
136
# File 'lib/phusion_passenger/message_client.rb', line 132

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

#pool_detach_process(pid) ⇒ Object

HelperAgent methods ###



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

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

#pool_detach_process_by_key(detach_key) ⇒ Object



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

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

#pool_status(options = {}) ⇒ Object



101
102
103
104
105
106
107
108
# File 'lib/phusion_passenger/message_client.rb', line 101

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

#pool_xmlObject



110
111
112
113
114
# File 'lib/phusion_passenger/message_client.rb', line 110

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

#readObject

Low level I/O methods ###



140
141
142
143
144
145
# File 'lib/phusion_passenger/message_client.rb', line 140

def read
	return @channel.read
rescue
	auto_disconnect
	raise
end

#read_scalarObject



161
162
163
164
165
166
# File 'lib/phusion_passenger/message_client.rb', line 161

def read_scalar
	return @channel.read_scalar
rescue
	auto_disconnect
	raise
end

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



168
169
170
171
172
173
# File 'lib/phusion_passenger/message_client.rb', line 168

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

#write(*args) ⇒ Object



147
148
149
150
151
152
# File 'lib/phusion_passenger/message_client.rb', line 147

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

#write_scalar(*args) ⇒ Object



154
155
156
157
158
159
# File 'lib/phusion_passenger/message_client.rb', line 154

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