Class: PhusionPassenger::AdminTools::ServerInstance
- Inherits:
-
Object
- Object
- PhusionPassenger::AdminTools::ServerInstance
- Defined in:
- lib/phusion_passenger/admin_tools/server_instance.rb
Defined Under Namespace
Classes: CorruptedDirectoryError, GenerationsAbsentError, Group, Process, RoleDeniedError, StaleDirectoryError, Stats, UnsupportedGenerationStructureVersionError
Constant Summary
- DIR_STRUCTURE_MAJOR_VERSION =
If you change the structure version then don't forget to change ext/common/ServerInstanceDir.h too.
1- DIR_STRUCTURE_MINOR_VERSION =
0- GENERATION_STRUCTURE_MAJOR_VERSION =
1- GENERATION_STRUCTURE_MINOR_VERSION =
0- STALE_TIME_THRESHOLD =
60
Instance Attribute Summary (collapse)
-
- (Object) generation_path
readonly
Returns the value of attribute generation_path.
-
- (Object) path
readonly
Returns the value of attribute path.
-
- (Object) pid
readonly
Returns the value of attribute pid.
Class Method Summary (collapse)
Instance Method Summary (collapse)
- - (Object) analytics_log_dir
- - (Object) backtraces
-
- (Object) connect(role_or_username, password = nil)
Raises:
-
ArgumentError: Unsupported role
-
RoleDeniedError: The user that the current process is as is not authorized to utilize the given role.
-
- - (Object) global_queue_size
- - (Object) groups
- - (Object) helper_server_pid
-
- (ServerInstance) initialize(path)
constructor
A new instance of ServerInstance.
- - (Object) processes
- - (Object) stats
- - (Object) status
- - (Object) web_server_config_files
- - (Object) web_server_description
- - (Object) xml
Constructor Details
- (ServerInstance) initialize(path)
A new instance of ServerInstance
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
# File 'lib/phusion_passenger/admin_tools/server_instance.rb', line 140 def initialize(path) raise ArgumentError, "Path may not be nil." if path.nil? @path = path if File.exist?("#{path}/control_process.pid") data = File.read("#{path}/control_process.pid").strip @pid = data.to_i else path =~ /passenger\.\d+\.\d+\.(\d+)\Z/ @pid = $1.to_i end generations = Dir["#{path}/generation-*"] if generations.empty? raise GenerationsAbsentError, "There are no generation subdirectories in this instance directory." end highest_generation_number = 0 generations.each do |generation| File.basename(generation) =~ /(\d+)/ generation_number = $1.to_i if generation_number > highest_generation_number highest_generation_number = generation_number end end @generation_path = "#{path}/generation-#{highest_generation_number}" if !File.exist?("#{@generation_path}/structure_version.txt") raise CorruptedDirectoryError, "The generation directory doesn't contain a structure version specification file." end version_data = File.read("#{@generation_path}/structure_version.txt").strip major, minor = version_data.split(".", 2) if major.nil? || minor.nil? || major !~ /\A\d+\Z/ || minor !~ /\A\d+\Z/ raise CorruptedDirectoryError, "The generation directory doesn't contain a valid structure version specification file." end major = major.to_i minor = minor.to_i if major != GENERATION_STRUCTURE_MAJOR_VERSION || minor > GENERATION_STRUCTURE_MINOR_VERSION raise UnsupportedGenerationStructureVersionError, "Unsupported generation directory structure version." end if @pid == 0 raise CorruptedDirectoryError, "Instance directory contains corrupted control_process.pid file." elsif !AdminTools.process_is_alive?(@pid) raise StaleDirectoryError, "There is no instance with PID #{@pid}." end end |
Instance Attribute Details
- (Object) generation_path (readonly)
Returns the value of attribute generation_path
106 107 108 |
# File 'lib/phusion_passenger/admin_tools/server_instance.rb', line 106 def generation_path @generation_path end |
- (Object) path (readonly)
Returns the value of attribute path
105 106 107 |
# File 'lib/phusion_passenger/admin_tools/server_instance.rb', line 105 def path @path end |
- (Object) pid (readonly)
Returns the value of attribute pid
107 108 109 |
# File 'lib/phusion_passenger/admin_tools/server_instance.rb', line 107 def pid @pid end |
Class Method Details
+ (Object) for_pid(pid, options = {})
136 137 138 |
# File 'lib/phusion_passenger/admin_tools/server_instance.rb', line 136 def self.for_pid(pid, = {}) return list().find { |c| c.pid == pid } end |
+ (Object) list(options = {})
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
# File 'lib/phusion_passenger/admin_tools/server_instance.rb', line 109 def self.list( = {}) = { :clean_stale_or_corrupted => true }.merge() instances = [] Dir["#{AdminTools.tmpdir}/passenger.*"].each do |dir| next if File.basename(dir) !~ /passenger\.#{DIR_STRUCTURE_MAJOR_VERSION}\.(\d+)\.(\d+)\Z/ minor = $1 next if minor.to_i > DIR_STRUCTURE_MINOR_VERSION begin instances << ServerInstance.new(dir) rescue StaleDirectoryError, CorruptedDirectoryError if [:clean_stale_or_corrupted] && File.stat(dir).mtime < current_time - STALE_TIME_THRESHOLD log_cleaning_action(dir) FileUtils.chmod_R(0700, dir) rescue nil FileUtils.rm_rf(dir) end rescue UnsupportedGenerationStructureVersionError, GenerationsAbsentError # Do nothing. end end return instances end |
Instance Method Details
- (Object) analytics_log_dir
239 240 241 242 243 |
# File 'lib/phusion_passenger/admin_tools/server_instance.rb', line 239 def analytics_log_dir return File.read("#{@generation_path}/analytics_log_dir.txt") rescue Errno::ENOENT return nil end |
- (Object) backtraces
249 250 251 |
# File 'lib/phusion_passenger/admin_tools/server_instance.rb', line 249 def backtraces return @client.backtraces end |
- (Object) connect(role_or_username, password = nil)
Raises:
-
ArgumentError: Unsupported role
-
RoleDeniedError: The user that the current process is as is not authorized to utilize the given role.
-
EOFError: The server unexpectedly closed the connection during authentication.
-
SecurityError: The server denied our authentication credentials.
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 |
# File 'lib/phusion_passenger/admin_tools/server_instance.rb', line 192 def connect(role_or_username, password = nil) if role_or_username.is_a?(Symbol) case role_or_username when :passenger_status username = "_passenger-status" begin filename = "#{@generation_path}/passenger-status-password.txt" password = File.open(filename, "rb") do |f| f.read end rescue Errno::EACCES raise RoleDeniedError end else raise ArgumentError, "Unsupported role #{role_or_username}" end else username = role_or_username end @client = MessageClient.new(username, password, "unix:#{@generation_path}/socket") begin yield self ensure @client.close end end |
- (Object) global_queue_size
267 268 269 |
# File 'lib/phusion_passenger/admin_tools/server_instance.rb', line 267 def global_queue_size return stats.global_queue_size end |
- (Object) groups
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 |
# File 'lib/phusion_passenger/admin_tools/server_instance.rb', line 271 def groups doc = REXML::Document.new(xml) groups = [] doc.elements.each("info/groups/group") do |group_xml| group = Group.new(group_xml.elements["app_root"].text, group_xml.elements["name"].text, group_xml.elements["environment"].text) group_xml.elements.each("processes/process") do |process_xml| process = Process.new(group) process_xml.elements.each do |element| if element.name == "server_sockets" element.elements.each("server_socket") do |server_socket| name = server_socket.elements["name"].text.to_sym address = server_socket.elements["address"].text address_type = server_socket.elements["type"].text process.server_sockets[name] = OpenStruct.new( :address => address, :address_type => address_type ) end else if process.respond_to?("#{element.name}=") if Process::INT_PROPERTIES.include?(element.name.to_sym) value = element.text.to_i elsif Process::BOOL_PROPERTIES.include?(element.name.to_sym) value = element.text == "true" else value = element.text end process.send("#{element.name}=", value) end end end group.processes << process end groups << group end return groups end |
- (Object) helper_server_pid
235 236 237 |
# File 'lib/phusion_passenger/admin_tools/server_instance.rb', line 235 def helper_server_pid return File.read("#{@generation_path}/helper_server.pid").strip.to_i end |
- (Object) processes
312 313 314 315 316 |
# File 'lib/phusion_passenger/admin_tools/server_instance.rb', line 312 def processes return groups.map do |group| group.processes end.flatten end |
- (Object) stats
257 258 259 260 261 262 263 264 265 |
# File 'lib/phusion_passenger/admin_tools/server_instance.rb', line 257 def stats doc = REXML::Document.new(xml) stats = Stats.new stats.max = doc.elements["info/max"].text.to_i stats.count = doc.elements["info/count"].text.to_i stats.active = doc.elements["info/active"].text.to_i stats.global_queue_size = doc.elements["info/global_queue_size"].text.to_i return stats end |
- (Object) status
245 246 247 |
# File 'lib/phusion_passenger/admin_tools/server_instance.rb', line 245 def status return @client.status end |
- (Object) web_server_config_files
224 225 226 227 228 229 230 231 232 233 |
# File 'lib/phusion_passenger/admin_tools/server_instance.rb', line 224 def web_server_config_files config_files = File.read("#{@generation_path}/config_files.txt").split("\n") config_files.map! do |filename| filename.strip end config_files.reject do |filename| filename.empty? end return config_files end |
- (Object) web_server_description
220 221 222 |
# File 'lib/phusion_passenger/admin_tools/server_instance.rb', line 220 def web_server_description return File.read("#{@generation_path}/web_server.txt") end |
- (Object) xml
253 254 255 |
# File 'lib/phusion_passenger/admin_tools/server_instance.rb', line 253 def xml return @client.xml end |