class SiteInspector::Endpoint::Dns

Public Class Methods

resolver() click to toggle source
# File lib/site-inspector/checks/dns.rb, line 8
def self.resolver
  require 'dnsruby'
  @resolver ||= begin
    resolver = Dnsruby::Resolver.new
    resolver.config.nameserver = ['8.8.8.8', '8.8.4.4']
    resolver
  end
end

Public Instance Methods

cdn() click to toggle source
# File lib/site-inspector/checks/dns.rb, line 40
def cdn
  detect_by_hostname 'cdn'
end
cdn?() click to toggle source
# File lib/site-inspector/checks/dns.rb, line 44
def cdn?
  !!cdn
end
cloud?() click to toggle source
# File lib/site-inspector/checks/dns.rb, line 52
def cloud?
  !!cloud_provider
end
cloud_provider() click to toggle source
# File lib/site-inspector/checks/dns.rb, line 48
def cloud_provider
  detect_by_hostname 'cloud'
end
cnames() click to toggle source
# File lib/site-inspector/checks/dns.rb, line 79
def cnames
  @cnames ||= records.select { |record| record.type == 'CNAME' }.map do |record|
    PublicSuffix.parse(record.cname.to_s)
  end
end
dnssec?() click to toggle source
# File lib/site-inspector/checks/dns.rb, line 32
def dnssec?
  @dnssec ||= has_record? 'DNSKEY'
end
google_apps?() click to toggle source
# File lib/site-inspector/checks/dns.rb, line 56
def google_apps?
  @google_apps ||= records.any? do |record|
    record.type == 'MX' && record.exchange.to_s =~ /google(mail)?\.com\.?\z/i
  end
end
has_record?(type)
Alias for: record?
hostname() click to toggle source
# File lib/site-inspector/checks/dns.rb, line 72
def hostname
  require 'resolv'
  @hostname ||= PublicSuffix.parse(Resolv.getname(ip))
rescue Resolv::ResolvError, PublicSuffix::DomainInvalid
  nil
end
inspect() click to toggle source
# File lib/site-inspector/checks/dns.rb, line 85
def inspect
  "#<SiteInspector::Domain::Dns host=\"#{host}\">"
end
ip() click to toggle source
# File lib/site-inspector/checks/dns.rb, line 66
def ip
  @ip ||= Resolv.getaddress host
rescue Resolv::ResolvError
  nil
end
ipv6?() click to toggle source
# File lib/site-inspector/checks/dns.rb, line 36
def ipv6?
  @ipv6 ||= has_record? 'AAAA'
end
localhost?() click to toggle source
# File lib/site-inspector/checks/dns.rb, line 62
def localhost?
  ip == '127.0.0.1'
end
query(type = 'ANY') click to toggle source
# File lib/site-inspector/checks/dns.rb, line 17
def query(type = 'ANY')
  SiteInspector::Endpoint::Dns.resolver.query(host.to_s, type).answer
rescue Dnsruby::ResolvTimeout, Dnsruby::ServFail, Dnsruby::NXDomain
  []
end
record?(type) click to toggle source
# File lib/site-inspector/checks/dns.rb, line 27
def record?(type)
  records.any? { |record| record.type == type } || query(type).count != 0
end
Also aliased as: has_record?
records() click to toggle source
# File lib/site-inspector/checks/dns.rb, line 23
def records
  @records ||= query
end
to_h() click to toggle source
# File lib/site-inspector/checks/dns.rb, line 89
def to_h
  return { error: LocalhostError } if localhost?

  {
    dnssec: dnssec?,
    ipv6: ipv6?,
    cdn: cdn,
    cloud_provider: cloud_provider,
    google_apps: google_apps?,
    hostname: hostname,
    ip: ip
  }
end

Private Instance Methods

data() click to toggle source
# File lib/site-inspector/checks/dns.rb, line 105
def data
  @data ||= {}
end
data_path(name) click to toggle source
# File lib/site-inspector/checks/dns.rb, line 109
def data_path(name)
  File.expand_path "../../data/#{name}.yml", File.dirname(__FILE__)
end
detect_by_hostname(type) click to toggle source
# File lib/site-inspector/checks/dns.rb, line 119
def detect_by_hostname(type)
  haystack = load_data(type)
  needle = haystack.find do |_name, domain|
    cnames.any? do |cname|
      [cname.tld, "#{cname.sld}.#{cname.tld}"].include? domain
    end
  end

  return needle[0].to_sym if needle
  return nil unless hostname

  needle = haystack.find do |_name, domain|
    [hostname.tld, "#{hostname.sld}.#{hostname.tld}"].include? domain
  end

  needle ? needle[0].to_sym : nil
end
load_data(name) click to toggle source
# File lib/site-inspector/checks/dns.rb, line 113
def load_data(name)
  require 'yaml'
  path = data_path(name)
  data[name] ||= YAML.load_file(path)
end