module Landrush::DnsServer

Constants

IN
Name

Public Class Methods

check_a_record(host, transaction) click to toggle source
# File lib/landrush/dns_server.rb, line 65
def self.check_a_record(host, transaction)
  value = Store.hosts.get(host)
  return if value.nil?

  if begin
       IPAddr.new(value)
     rescue StandardError
       nil
     end
    name = transaction.name =~ /#{host}/ ? transaction.name : host
    transaction.respond!(value, ttl: 0, name: name)
  else
    transaction.respond!(Name.create(value), resource_class: IN::CNAME, ttl: 0)
    DnsServer.check_a_record(value, transaction)
  end
end
interfaces() click to toggle source
# File lib/landrush/dns_server.rb, line 10
def self.interfaces
  [[:udp, '0.0.0.0', Server.port], [:tcp, '0.0.0.0', Server.port]]
end
run_dns_server(options = {}, &block) click to toggle source
# File lib/landrush/dns_server.rb, line 51
def self.run_dns_server(options = {}, &block)
  server = RubyDNS::RuleBasedServer.new(options, &block)

  EventMachine.run do
    trap('INT') do
      EventMachine.stop
    end

    server.run(options)
  end

  server.fire(:stop)
end
start_dns_server(logger) click to toggle source
# File lib/landrush/dns_server.rb, line 23
def self.start_dns_server(logger)
  @logger = logger
  run_dns_server(listen: interfaces, logger: logger) do
    match(/.*/, IN::A) do |transaction|
      host = Store.hosts.find(transaction.name)
      if host
        DnsServer.check_a_record(host, transaction)
      else
        transaction.passthrough!(DnsServer.upstream)
      end
    end

    match(/.*/, IN::PTR) do |transaction|
      host = Store.hosts.find(transaction.name)
      if host
        transaction.respond!(Name.create(Store.hosts.get(host)))
      else
        transaction.passthrough!(DnsServer.upstream)
      end
    end

    # Default DNS handler
    otherwise do |transaction|
      transaction.passthrough!(DnsServer.upstream)
    end
  end
end
upstream() click to toggle source
# File lib/landrush/dns_server.rb, line 19
def self.upstream
  @upstream ||= RubyDNS::Resolver.new(upstream_servers, logger: @logger)
end
upstream_servers() click to toggle source
# File lib/landrush/dns_server.rb, line 14
def self.upstream_servers
  # Doing collect to cast protocol to symbol because JSON store doesn't know about symbols
  @upstream_servers ||= Store.config.get('upstream').collect { |i| [i[0].to_sym, i[1], i[2]] }
end