utils/tester.rb in devdnsd-2.4.0 vs utils/tester.rb in devdnsd-3.0.0
- old
+ new
@@ -1,109 +1,27 @@
#!/usr/bin/env ruby
# encoding: utf-8
#
-# This file is part of the devdnsd gem. Copyright (C) 2013 and above Shogun <shogun_panda@me.com>.
+# This file is part of the devdnsd gem. Copyright (C) 2013 and above Shogun <shogun_panda@cowtech.it>.
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
#
-require "rubygems"
require "bovem"
-require "net/dns"
+require "rubydns"
+require File.dirname(__FILE__) + "/../spec/resolver_helper"
-# Patch to avoid resolving of hostname containing numbers.
-class Net::DNS::Resolver
- def is_ip_address?(addr)
- ipv6_norm = [/\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*\Z/, /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*)?\Z/, /\A::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*)?\Z/]
- ipv6_compat = [/\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:/, /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:)?/, /\A::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:)?/]
+Bovem::Application.create(name: "DevDNSd resolver") do
+ option("address", ["a", "address"], {type: String, help: "The address to resolve.", meta: "ADDRESS", default: "match.dev"})
+ option("type", ["t", "type"], {type: String, help: "The query to run.", meta: "TYPE", default: "ANY"})
+ option("nameserver", ["n", "nameserver"], {type: String, help: "The nameserver to use.", meta: "NAMESERVER", default: "127.0.0.1"})
+ option("port", ["p", "port"], {type: Fixnum, help: "The port of the nameserver.", meta: "PORT", default: 7771})
- catch(:valid_ip) do
- if /\A(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\Z/ =~ addr
- throw(:valid_ip, true) if $~.captures.all? {|i| i.to_i < 256}
- else
- # IPv6 (normal)
- throw(:valid_ip, true) if ipv6_norm.any? {|r| r =~ addr } || (ipv6_compat.any? {|r| r =~ addr } && valid_v4?($'))
- end
-
- false
- end
+ action do |command|
+ opts = command.get_options
+ EM.run {
+ Fiber.new {
+ devdnsd_resolv(opts["address"], opts["type"], opts["nameserver"], opts["port"], Bovem::Logger.create($stdout, Logger::DEBUG))
+ EM.stop
+ }.resume
+ }
end
-
- def make_query_packet(string, type, cls)
- if string.is_a?(IPAddr) then
- name = string.reverse
- type = Net::DNS::PTR
- @logger.warn("PTR query required for address #{string}, changing type to PTR")
- elsif is_ip_address?(string) # See if it's an IP or IPv6 address
- begin
- name = IPAddr.new(string.chomp(".")).reverse
- type = Net::DNS::PTR
- rescue ArgumentError
- name = string if valid?(string)
- end
- else
- name = string if valid?(string)
- end
-
- # Create the packet
- packet = Net::DNS::Packet.new(name, type, cls)
-
- if packet.query?
- packet.header.recursive = @config[:recursive] ? 1 : 0
- end
-
- packet
- end
-end
-
-# Resolvs an hostname to a nameserver.
-#
-# @param [String] The hostname to resolv.
-# @param [String] The type of query to issue.
-# @param [String] The nameserver to connect to.
-# @param [Fixnum] The port to connect to.
-# @param [Logger] A logger for the resolver.
-# @return [Array|NilClass] Return an array of pair of addresses and types. `nil` is returned if nothing is found.
-def devdnsd_resolv(address = "match.dev", type = "ANY", nameserver = "127.0.0.1", port = 7771, logger = nil)
- rv = []
-
- logger = Bovem::Logger.new("/dev/null", Bovem::Logger::DEBUG) if !logger
- logger.info(::Bovem::Console.replace_markers("Resolving address {mark=bright}#{address}{/mark} with type {mark=bright}#{type}{/mark} at nameserver {mark=bright}#{nameserver}{/mark}:{mark=bright}#{port.to_s}{/mark} ..."))
- tmpfile = "/tmp/devdnsd-test-tester-#{Time.now.strftime("%Y%m%d-%H:%M:%S")}"
-
- begin
- Net::DNS::Resolver.new(nameservers: nameserver, port: port.to_i, recursive: false, udp_timeout: 1, log_file: tmpfile).search(address, type).answer.each do |answer|
- type = answer.type.upcase.to_sym
-
- result = case type
- when :MX then answer.exchange.gsub(/\.$/, "")
- when :CNAME then answer.cname.gsub(/\.$/, "")
- when :NS then answer.nsdname.gsub(/\.$/, "")
- when :PTR then answer.ptrdname.gsub(/\.$/, "")
- else answer.address.to_s
- end
-
- rv << [result, type]
- end
-
- rv = case rv.length
- when 0 then nil
- when 1 then rv[0]
- else rv
- end
- rescue => e
- logger.error("[#{e.class}] #{e.to_s}")
- end
-
- File.unlink(tmpfile) if File.exists?(tmpfile)
- logger.info("Resolving ended with result: #{rv.inspect}")
- rv
-end
-
-if __FILE__ == $0 then
- address = ARGV[0] || "match.dev"
- type = (ARGV[1] || "ANY").upcase
- nameserver = ARGV[2] || "127.0.0.1"
- port = ARGV[3] || 7771
- logger = Bovem::Logger.create($stdout, Logger::DEBUG)
-
- devdnsd_resolv(address, type, nameserver, port, logger)
end
\ No newline at end of file