Class: MailResolver::Resolver

Inherits:
Object
  • Object
show all
Defined in:
lib/mailresolver/resolver.rb

Overview

DNS for mail. Built on dnsruby rather than Resolv, which collapses SERVFAIL/REFUSED into NXDOMAIN.

Direct Known Subclasses

Testing::LocalNameserver::LocalResolver

Constant Summary collapse

TIMEOUTS =

One attempt per element; intervals double after the first, and the sum is the hard deadline. Default: attempts at 0s, 5s, and 10s, over at 11s.

[ 5, 3, 3 ].freeze

Instance Method Summary collapse

Constructor Details

#initialize(timeouts: TIMEOUTS) ⇒ Resolver

Returns a new instance of Resolver.



21
22
23
24
# File 'lib/mailresolver/resolver.rb', line 21

def initialize(timeouts: TIMEOUTS)
  @timeouts = timeouts
  @lock = Mutex.new
end

Instance Method Details

#a(name) ⇒ Object



31
32
33
# File 'lib/mailresolver/resolver.rb', line 31

def a(name)
  records("A", name).map { |record| record.address.to_s }
end

#aaaa(name) ⇒ Object

Dnsruby prints IPv6 in capitals; RFC 5952 §4.3 asks for lower case.



36
37
38
# File 'lib/mailresolver/resolver.rb', line 36

def aaaa(name)
  records("AAAA", name).map { |record| record.address.to_s.downcase }
end

#addresses(name) ⇒ Object

A missing family contributes nothing; NXDOMAIN or nameserver failure still raises.



41
42
43
# File 'lib/mailresolver/resolver.rb', line 41

def addresses(name)
  %w[ A AAAA ].flat_map { |type| family(type, name) }
end

#cname(name) ⇒ Object



56
57
58
# File 'lib/mailresolver/resolver.rb', line 56

def cname(name)
  records("CNAME", name).map { |record| record.domainname.to_s }
end

#mx(name) ⇒ Object

Equal preferences tie-break on the exchange name so callers always see the same order.



46
47
48
49
# File 'lib/mailresolver/resolver.rb', line 46

def mx(name)
  records("MX", name).sort_by { |record| [ record.preference, record.exchange.to_s ] }
    .map { |record| record.exchange.to_s }
end

#ptr(address) ⇒ Object

Dnsruby puts the question name in name and the host in domainname.



52
53
54
# File 'lib/mailresolver/resolver.rb', line 52

def ptr(address)
  records("PTR", IPAddr.new(address.to_s).reverse).map { |record| record.domainname.to_s }
end

#txt(name) ⇒ Object

TXT character-strings are joined into one value (RFC 7208 §3.3).



27
28
29
# File 'lib/mailresolver/resolver.rb', line 27

def txt(name)
  records("TXT", name).map { |record| record.strings.join }
end