class Prdns::PurifiedServer

Constants

LOG

Public Instance Methods

add_polluted(domain) click to toggle source
# File lib/prdns.rb, line 25
def add_polluted(domain)
  @polluted_domains[domain] = true
end
add_virgin(domain) click to toggle source
# File lib/prdns.rb, line 28
def add_virgin(domain)
  @virgin_domains[domain] = Time.now
end
polluted?(domain) click to toggle source
# File lib/prdns.rb, line 19
def polluted?(domain)
  @polluted_domains.has_key?(domain)
end
process(name, resource_class, transaction) click to toggle source
# File lib/prdns.rb, line 32
def process(name, resource_class, transaction)
  split = name.chomp('.').split('.')

  # unless split[-1] == 'local'
  #     LOG.debug 'name: %s' % name
  #     LOG.debug 'resource class: %s' % resource_class
  # end

  return transaction.passthrough!(@polluted_ns) if
      resource_class != Resolv::DNS::Resource::IN::A or split.length < 2

  top_domain = split[-2, 2].join('.').downcase
  return transaction.passthrough!(@authentic_ns) if polluted?(top_domain)
  return transaction.passthrough!(@polluted_ns) if virgin?(top_domain)

  polluted = false
  Async do
    message = @polluted_ns.query('ne-%d.%s' % [Time.now.to_i, top_domain],
                                 Resolv::DNS::Resource::IN::ANY)

    # LOG.debug message.inspect
    records = message&.answer
    if records and records.length == 1 and records.first[2].is_a?(Resolv::DNS::Resource::IN::A)
      LOG.warn 'Domain: %s is polluted, delegate to authentic server from now on!' % top_domain
      polluted = true
      add_polluted(top_domain)
    else
      add_virgin(top_domain) if records
    end
  end
  polluted ?
      transaction.passthrough!(@authentic_ns) :
      transaction.passthrough!(@polluted_ns)
end
setup(polluted: nil, authentic: nil) click to toggle source

LOG.debug!

# File lib/prdns.rb, line 12
def setup(polluted: nil, authentic: nil)
  @polluted_ns = Async::DNS::Resolver.new(polluted || [[:udp, '114.114.114.114', 53]])
  @authentic_ns = Async::DNS::Resolver.new(authentic || [[:udp, '208.67.220.220', 5353]])
  @polluted_domains = {}
  @virgin_domains = {}
end
virgin?(domain) click to toggle source
# File lib/prdns.rb, line 22
def virgin?(domain)
  @virgin_domains.has_key?(domain)
end