/lib/dnsruby/resolv.rb

https://github.com/alexdalitz/dnsruby · Ruby · 127 lines · 76 code · 26 blank · 25 comment · 5 complexity · 1c6b29f8a790647bbe905008f3fc2f1a MD5 · raw file

  1. # The Resolv class can be used to resolve addresses using /etc/hosts and /etc/resolv.conf,
  2. #
  3. # The DNS class may be used to perform more queries. If greater control over the sending
  4. # of packets is required, then the Resolver or SingleResolver classes may be used.
  5. module Dnsruby
  6. # NOTE! Beware, there is a Ruby library class named Resolv, and you may need to
  7. # explicitly specify Dnsruby::Resolv to use the Dnsruby Resolv class,
  8. # even if you have include'd Dnsruby.
  9. class Resolv
  10. # Address RegExp to use for matching IP addresses
  11. ADDRESS_REGEX = /(?:#{IPv4::Regex})|(?:#{IPv6::Regex})/
  12. # Some class methods require the use of an instance to compute their result.
  13. # For this purpose we create a single instance that can be reused.
  14. def self.instance
  15. @instance ||= self.new
  16. end
  17. # Class methods that delegate to instance methods:
  18. # Looks up the first IP address for +name+
  19. def self.getaddress(name)
  20. instance.getaddress(name)
  21. end
  22. # Looks up all IP addresses for +name+
  23. def self.getaddresses(name)
  24. instance.getaddresses(name)
  25. end
  26. # Iterates over all IP addresses for +name+
  27. def self.each_address(name, &block)
  28. instance.each_address(name, &block)
  29. end
  30. # Looks up the first hostname of +address+
  31. def self.getname(address)
  32. instance.getname(address)
  33. end
  34. # Looks up all hostnames of +address+
  35. def self.getnames(address)
  36. instance.getnames(address)
  37. end
  38. # Iterates over all hostnames of +address+
  39. def self.each_name(address, &proc)
  40. instance.each_name(address, &proc)
  41. end
  42. # Instance Methods:
  43. # Creates a new Resolv using +resolvers+
  44. def initialize(resolvers=[Hosts.new, DNS.new])
  45. @resolvers = resolvers
  46. end
  47. # Looks up the first IP address for +name+
  48. def getaddress(name)
  49. addresses = getaddresses(name)
  50. if addresses.empty?
  51. raise ResolvError.new("no address for #{name}")
  52. else
  53. addresses.first
  54. end
  55. end
  56. # Looks up all IP addresses for +name+
  57. def getaddresses(name)
  58. return [name] if ADDRESS_REGEX.match(name)
  59. @resolvers.each do |resolver|
  60. addresses = []
  61. resolver.each_address(name) { |address| addresses << address }
  62. return addresses unless addresses.empty?
  63. end
  64. []
  65. end
  66. # Iterates over all IP addresses for +name+
  67. def each_address(name)
  68. getaddresses(name).each { |address| yield(address)}
  69. end
  70. # Looks up the first hostname of +address+
  71. def getname(address)
  72. names = getnames(address)
  73. if names.empty?
  74. raise ResolvError.new("no name for #{address}")
  75. else
  76. names.first
  77. end
  78. end
  79. # Looks up all hostnames of +address+
  80. def getnames(address)
  81. @resolvers.each do |resolver|
  82. names = []
  83. resolver.each_name(address) { |name| names << name }
  84. return names unless names.empty?
  85. end
  86. []
  87. end
  88. # Iterates over all hostnames of +address+
  89. def each_name(address)
  90. getnames(address).each { |address| yield(address) }
  91. end
  92. require 'dnsruby/cache'
  93. require 'dnsruby/DNS'
  94. require 'dnsruby/hosts'
  95. require 'dnsruby/message/message'
  96. require 'dnsruby/update'
  97. require 'dnsruby/zone_transfer'
  98. require 'dnsruby/dnssec'
  99. require 'dnsruby/zone_reader'
  100. end
  101. end