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