class PhusionPassenger::Utils::HostsFileParser

A /etc/hosts parser. Also supports writing groups of data to the file.

def self.flush_dns_cache!

def self.flush_dns_cache!
	if PlatformInfo.os_name == "macosx"
		system("dscacheutil -flushcache")
	end
end

def add_group_data(marker, data)

def add_group_data(marker, data)
	begin_index = find_line(0, "###### BEGIN #{marker} ######")
	end_index = find_line(begin_index + 1, "###### END #{marker} ######") if begin_index
	if begin_index && end_index
		@lines[begin_index + 1 .. end_index - 1] = data.split("\n")
	else
		@lines << "###### BEGIN #{marker} ######"
		@lines.concat(data.split("\n"))
		@lines << "###### END #{marker} ######"
	end
end

def find_line(start_index, content)

def find_line(start_index, content)
	i = start_index
	while i < @lines.size
		if @lines[i] == content
			return i
		else
			i += 1
		end
	end
	return nil
end

def host_count

def host_count
	return @host_names.size
end

def initialize(filename_or_io = "/etc/hosts")

def initialize(filename_or_io = "/etc/hosts")
	if filename_or_io.respond_to?(:readline)
		read_and_parse(filename_or_io)
	else
		File.open(filename_or_io, "rb") do |f|
			read_and_parse(f)
		end
	end
end

def ip_count

def ip_count
	return @ips.size
end

def parse_line(line)

def parse_line(line)
	return nil if line =~ /^[\s\t]*#/
	line = line.strip
	return nil if line.empty?
	ip, *host_names = line.split(/[ \t]+/)
	return [ip, host_names]
end

def read_and_parse(io)

def read_and_parse(io)
	lines = []
	ips = {}
	all_host_names = {}
	while !io.eof?
		line = io.readline
		line.sub!(/\n\Z/m, '')
		lines << line
		ip, host_names = parse_line(line)
		if ip
			ips[ip] ||= []
			ips[ip].concat(host_names)
			host_names.each do |host_name|
				all_host_names[host_name.downcase] = ip
			end
		end
	end
	@lines      = lines
	@ips        = ips
	@host_names = all_host_names
end

def resolve(host_name)

def resolve(host_name)
	if host_name.downcase == "localhost"
		return "127.0.0.1"
	else
		return @host_names[host_name.downcase]
	end
end

def resolves_to_localhost?(hostname)

def resolves_to_localhost?(hostname)
	ip = resolve(hostname)
	return ip == "127.0.0.1" || ip == "::1" || ip == "0.0.0.0"
end

def write(io)

def write(io)
	@lines.each do |line|
		io.puts(line)
	end
end