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