class PhusionPassenger::Utils::HostsFileParser

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

Public Class Methods

flush_dns_cache!() click to toggle source
# File lib/phusion_passenger/utils/hosts_file_parser.rb, line 29
def self.flush_dns_cache!
        if RUBY_PLATFORM =~ /darwin/
                system("dscacheutil -flushcache")
        end
end
new(filename_or_io = "/etc/hosts") click to toggle source
# File lib/phusion_passenger/utils/hosts_file_parser.rb, line 35
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

Public Instance Methods

add_group_data(marker, data) click to toggle source
# File lib/phusion_passenger/utils/hosts_file_parser.rb, line 66
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
host_count() click to toggle source
# File lib/phusion_passenger/utils/hosts_file_parser.rb, line 49
def host_count
        return @host_names.size
end
ip_count() click to toggle source
# File lib/phusion_passenger/utils/hosts_file_parser.rb, line 45
def ip_count
        return @ips.size
end
resolve(host_name) click to toggle source
# File lib/phusion_passenger/utils/hosts_file_parser.rb, line 53
def resolve(host_name)
        if host_name.downcase == "localhost"
                return "127.0.0.1"
        else
                return @host_names[host_name.downcase]
        end
end
resolves_to_localhost?(hostname) click to toggle source
# File lib/phusion_passenger/utils/hosts_file_parser.rb, line 61
def resolves_to_localhost?(hostname)
        ip = resolve(hostname)
        return ip == "127.0.0.1" || ip == "::1" || ip == "0.0.0.0"
end
write(io) click to toggle source
# File lib/phusion_passenger/utils/hosts_file_parser.rb, line 78
def write(io)
        @lines.each do |line|
                io.puts(line)
        end
end

Private Instance Methods

find_line(start_index, content) click to toggle source
# File lib/phusion_passenger/utils/hosts_file_parser.rb, line 115
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
parse_line(line) click to toggle source
# File lib/phusion_passenger/utils/hosts_file_parser.rb, line 107
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
read_and_parse(io) click to toggle source
# File lib/phusion_passenger/utils/hosts_file_parser.rb, line 85
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