Module: Landrush::DnsServer

Included in:
Server
Defined in:
lib/landrush/dns_server.rb

Constant Summary collapse

Name =
Resolv::DNS::Name
IN =
Resolv::DNS::Resource::IN

Class Method Summary collapse

Class Method Details

.check_a_record(host, transaction) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# 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

.interfacesObject



10
11
12
# 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) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
# 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) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 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

.upstreamObject



19
20
21
# File 'lib/landrush/dns_server.rb', line 19

def self.upstream
  @upstream ||= RubyDNS::Resolver.new(upstream_servers, logger: @logger)
end

.upstream_serversObject



14
15
16
17
# 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