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