devdnsd 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.DS_Store +0 -0
- data/.gitignore +21 -0
- data/.yardopts +1 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +93 -0
- data/README.md +79 -0
- data/Rakefile +18 -0
- data/bin/devdnsd +77 -0
- data/config/devdnsd_config.sample +24 -0
- data/devdnsd.gemspec +40 -0
- data/lib/devdnsd.rb +23 -0
- data/lib/devdnsd/application.rb +366 -0
- data/lib/devdnsd/configuration.rb +94 -0
- data/lib/devdnsd/errors.rb +18 -0
- data/lib/devdnsd/logger.rb +84 -0
- data/lib/devdnsd/rule.rb +130 -0
- data/lib/devdnsd/version.rb +23 -0
- data/spec/coverage_helper.rb +19 -0
- data/spec/devdnsd/application_spec.rb +436 -0
- data/spec/devdnsd/configuration_spec.rb +77 -0
- data/spec/devdnsd/logger_spec.rb +86 -0
- data/spec/devdnsd/rule_spec.rb +111 -0
- data/spec/spec_helper.rb +13 -0
- data/utils/tester.rb +127 -0
- metadata +269 -0
@@ -0,0 +1,77 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# This file is part of the devdns gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
|
4
|
+
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
|
+
#
|
6
|
+
|
7
|
+
require "spec_helper"
|
8
|
+
require "tempfile"
|
9
|
+
|
10
|
+
describe DevDNSd::Configuration do
|
11
|
+
class DevDNSd::Application
|
12
|
+
def logger
|
13
|
+
DevDNSd::Logger.new("/dev/null")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
let(:new_application) {
|
18
|
+
app = DevDNSd::Application.new
|
19
|
+
app.logger = DevDNSd::Logger.create("/dev/null", DevDNSd::Logger::DEBUG)
|
20
|
+
app
|
21
|
+
}
|
22
|
+
describe "#initialize" do
|
23
|
+
it "sets default arguments and rules" do
|
24
|
+
config = DevDNSd::Configuration.new
|
25
|
+
config.address.should == "0.0.0.0"
|
26
|
+
config.port.should == 7771
|
27
|
+
config.tld.should == "dev"
|
28
|
+
config.log_file.should == "/var/log/devdnsd.log"
|
29
|
+
config.log_level.should == Logger::INFO
|
30
|
+
config.rules.count.should == 1
|
31
|
+
config.foreground.should == false
|
32
|
+
end
|
33
|
+
|
34
|
+
it "reads a valid configuration file" do
|
35
|
+
file = Tempfile.new('devdnsd-test')
|
36
|
+
file.write("config.port = 7772")
|
37
|
+
file.close
|
38
|
+
|
39
|
+
config = DevDNSd::Configuration.new(file.path, new_application)
|
40
|
+
config.port.should == 7772
|
41
|
+
file.unlink
|
42
|
+
end
|
43
|
+
|
44
|
+
it "reject an invalid configuration" do
|
45
|
+
file = Tempfile.new('devdnsd-test')
|
46
|
+
file.write("config.port = ")
|
47
|
+
file.close
|
48
|
+
|
49
|
+
expect { config = DevDNSd::Configuration.new(file.path, new_application)}.to raise_error(DevDNSd::Errors::InvalidConfiguration)
|
50
|
+
file.unlink
|
51
|
+
end
|
52
|
+
|
53
|
+
it "allows overrides" do
|
54
|
+
file = Tempfile.new('devdnsd-test')
|
55
|
+
file.write("config.port = 7772")
|
56
|
+
file.close
|
57
|
+
|
58
|
+
config = DevDNSd::Configuration.new(file.path, new_application, {:foreground => true, :port => 7773})
|
59
|
+
config.port.should == 7773
|
60
|
+
config.foreground = true
|
61
|
+
file.unlink
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "#add_rule" do
|
66
|
+
it "should add a good rule" do
|
67
|
+
config = DevDNSd::Configuration.new
|
68
|
+
config.add_rule("RULE", "127.0.0.1")
|
69
|
+
config.rules.count.should == 2
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should reject a bad rule" do
|
73
|
+
config = DevDNSd::Configuration.new
|
74
|
+
expect { config.add_rule("RULE") }.to raise_error(DevDNSd::Errors::InvalidRule)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# This file is part of the devdns gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
|
4
|
+
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
|
+
#
|
6
|
+
|
7
|
+
require "spec_helper"
|
8
|
+
|
9
|
+
describe DevDNSd::Logger do
|
10
|
+
before(:each) do
|
11
|
+
Sickill::Rainbow.enabled = false
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#create" do
|
15
|
+
it("should create a new default logger") do
|
16
|
+
logger = DevDNSd::Logger.create
|
17
|
+
logger.device.should == DevDNSd::Logger.default_file
|
18
|
+
logger.level.should == Logger::INFO
|
19
|
+
logger.formatter.should == DevDNSd::Logger.default_formatter
|
20
|
+
end
|
21
|
+
|
22
|
+
it("should create a logger with a custom file and level") do
|
23
|
+
logger = DevDNSd::Logger.create("/dev/null", Logger::WARN)
|
24
|
+
logger.device.should == "/dev/null"
|
25
|
+
logger.level.should == Logger::WARN
|
26
|
+
logger.formatter.should == DevDNSd::Logger.default_formatter
|
27
|
+
end
|
28
|
+
|
29
|
+
it("should create a logger with a custom formatter") do
|
30
|
+
formatter = Proc.new {|severity, datetime, progname, msg| msg }
|
31
|
+
logger = DevDNSd::Logger.create("/dev/null", Logger::WARN, formatter)
|
32
|
+
logger.device.should == "/dev/null"
|
33
|
+
logger.level.should == Logger::WARN
|
34
|
+
logger.formatter.should == formatter
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "#default_formatter" do
|
39
|
+
let(:output) { StringIO.new }
|
40
|
+
let(:logger) { DevDNSd::Logger.create(output, Logger::DEBUG) }
|
41
|
+
|
42
|
+
def get_last_line(buffer)
|
43
|
+
buffer.string.split("\n").last.strip.gsub(/ T\+\d+\.\d+/, "")
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should correctly format a DEBUG message" do
|
47
|
+
logger.debug("Message.")
|
48
|
+
get_last_line(output).should == "[#{Time.now.strftime("%Y/%b/%d %H:%M:%S")}] DEBUG: Message."
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should correctly format a INFO message" do
|
52
|
+
logger.info("Message.")
|
53
|
+
get_last_line(output).should == "[#{Time.now.strftime("%Y/%b/%d %H:%M:%S")}] INFO: Message."
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should correctly format a WARN message" do
|
57
|
+
logger.warn("Message.")
|
58
|
+
get_last_line(output).should == "[#{Time.now.strftime("%Y/%b/%d %H:%M:%S")}] WARN: Message."
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should correctly format a ERROR message" do
|
62
|
+
logger.error("Message.")
|
63
|
+
get_last_line(output).should == "[#{Time.now.strftime("%Y/%b/%d %H:%M:%S")}] ERROR: Message."
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should correctly format a FATAL message" do
|
67
|
+
logger.fatal("Message.")
|
68
|
+
get_last_line(output).should == "[#{Time.now.strftime("%Y/%b/%d %H:%M:%S")}] FATAL: Message."
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should correctly format a INVALID message" do
|
72
|
+
logger.log(Logger::UNKNOWN, "Message.")
|
73
|
+
get_last_line(output).should == "[#{Time.now.strftime("%Y/%b/%d %H:%M:%S")}] ANY: Message."
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe "#get_real_file" do
|
78
|
+
it("should return the standard ouput") do DevDNSd::Logger.get_real_file("STDOUT").should == $stdout end
|
79
|
+
it("should return the standard error") do DevDNSd::Logger.get_real_file("STDERR").should == $stderr end
|
80
|
+
it("should return the file") do DevDNSd::Logger.get_real_file("/dev/null").should == "/dev/null" end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "#default_file" do
|
84
|
+
it("should return the standard output") do DevDNSd::Logger.default_file.should == $stdout end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# This file is part of the devdns gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
|
4
|
+
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
|
+
#
|
6
|
+
|
7
|
+
require "spec_helper"
|
8
|
+
|
9
|
+
describe DevDNSd::Rule do
|
10
|
+
describe "#new" do
|
11
|
+
it("should create a default rule") do
|
12
|
+
rule = DevDNSd::Rule.new
|
13
|
+
rule.match.should == /.+/
|
14
|
+
rule.reply.should == "127.0.0.1"
|
15
|
+
rule.type.should == :A
|
16
|
+
rule.options.should == {}
|
17
|
+
rule.block.should be_nil
|
18
|
+
end
|
19
|
+
|
20
|
+
it("should create a rule with arguments and no block") do
|
21
|
+
rule = DevDNSd::Rule.new("MATCH", "REPLY", "TYPE", {:a => :b})
|
22
|
+
rule.match.should == "MATCH"
|
23
|
+
rule.reply.should == "REPLY"
|
24
|
+
rule.type.should == "TYPE"
|
25
|
+
rule.options.should == {:a => :b}
|
26
|
+
rule.block.should be_nil
|
27
|
+
end
|
28
|
+
|
29
|
+
it("should create a rule with arguments and a block") do
|
30
|
+
rule = DevDNSd::Rule.new("MATCH", "REPLY", "TYPE") do end
|
31
|
+
rule.match.should == "MATCH"
|
32
|
+
rule.reply.should be_nil
|
33
|
+
rule.type.should == "TYPE"
|
34
|
+
rule.options.should == {}
|
35
|
+
rule.block.should_not be_nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#is_regexp?" do
|
40
|
+
it("should return true for a regexp pattern") do DevDNSd::Rule.create(/.+/, "127.0.0.1").is_regexp?.should be_true end
|
41
|
+
it("should return false otherwise") do DevDNSd::Rule.create("RULE", "127.0.0.1").is_regexp?.should be_false end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#has_block?" do
|
45
|
+
it("should return true when a block is present") do DevDNSd::Rule.create("RULE"){}.has_block?.should be_true end
|
46
|
+
it("should return false otherwise") do DevDNSd::Rule.create("RULE", "127.0.0.1").has_block?.should be_false end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "#match_host" do
|
50
|
+
describe "with a string pattern" do
|
51
|
+
it("should return true when hostname matches") do DevDNSd::Rule.create("match.dev", "127.0.0.1").match_host("match.dev").should be_true end
|
52
|
+
it("should return false when hostname doesn't match") do DevDNSd::Rule.create("match.dev", "127.0.0.1").match_host("unmatch.dev").should be_false end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "with a regexp pattern" do
|
56
|
+
it("should return a MatchData when hostname matches") do DevDNSd::Rule.create(/^match/, "127.0.0.1").match_host("match.dev").should be_a(MatchData) end
|
57
|
+
it("should return nil when hostname doesn't match") do DevDNSd::Rule.create(/^match/, "127.0.0.1").match_host("unmatch.dev").should be_nil end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "#create" do
|
62
|
+
it("should not allow rules without sufficient arguments") do
|
63
|
+
expect{ DevDNSd::Rule.create("RULE") }.to raise_error(DevDNSd::Errors::InvalidRule)
|
64
|
+
expect{ DevDNSd::Rule.create("RULE", "REPLY", "TYPE", "ARG") }.to raise_error(DevDNSd::Errors::InvalidRule)
|
65
|
+
end
|
66
|
+
|
67
|
+
it("should create a rule with host and reply") do
|
68
|
+
rule = DevDNSd::Rule.create("MATCH", "REPLY")
|
69
|
+
rule.match.should == "MATCH"
|
70
|
+
rule.reply.should == "REPLY"
|
71
|
+
rule.type.should == :A
|
72
|
+
rule.block.should be_nil
|
73
|
+
end
|
74
|
+
|
75
|
+
it("should create a rule with host, reply and type") do
|
76
|
+
rule = DevDNSd::Rule.create("MATCH", "REPLY", "TYPE", {:a => :b})
|
77
|
+
rule.match.should == "MATCH"
|
78
|
+
rule.reply.should == "REPLY"
|
79
|
+
rule.type.should == "TYPE"
|
80
|
+
rule.options.should == {:a => :b}
|
81
|
+
rule.block.should be_nil
|
82
|
+
end
|
83
|
+
|
84
|
+
it("should create a rule with host, type and a reply block") do
|
85
|
+
rule = DevDNSd::Rule.create("MATCH", "TYPE", "UNUSED") do end
|
86
|
+
rule.match.should == "MATCH"
|
87
|
+
rule.reply.should be_nil
|
88
|
+
rule.type.should == "TYPE"
|
89
|
+
rule.options.should == {}
|
90
|
+
rule.block.should_not be_nil
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "#resource_class" do
|
95
|
+
it("should return a single class") do DevDNSd::Rule.create("MATCH", "REPLY", :A).resource_class.should == Resolv::DNS::Resource::IN::A end
|
96
|
+
it("should return an array of classes") do DevDNSd::Rule.create("MATCH", "REPLY", [:A, :MX]).resource_class.should == [Resolv::DNS::Resource::IN::A, Resolv::DNS::Resource::IN::MX] end
|
97
|
+
it("should fail for a invalid class") do expect { DevDNSd::Rule.create("MATCH", "REPLY", :INVALID).resource_class }.to raise_error(DevDNSd::Errors::InvalidRule) end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe "#resource_class_to_symbol" do
|
101
|
+
it("should convert a class a symbol") do
|
102
|
+
DevDNSd::Rule.resource_class_to_symbol(Resolv::DNS::Resource::IN::A).should == :A
|
103
|
+
DevDNSd::Rule.resource_class_to_symbol(Resolv).should == :Resolv
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe "#symbol_to_resource_class" do
|
108
|
+
it("should convert a symbol to a resource class") do DevDNSd::Rule.symbol_to_resource_class(:A).should == Resolv::DNS::Resource::IN::A end
|
109
|
+
it("should fail for a invalid class") do expect { DevDNSd::Rule.symbol_to_resource_class(:Invalid) }.to raise_error(DevDNSd::Errors::InvalidRule) end
|
110
|
+
end
|
111
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# This file is part of the devdns gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
|
4
|
+
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
|
+
#
|
6
|
+
|
7
|
+
require "rubygems"
|
8
|
+
require "bundler/setup"
|
9
|
+
require "coverage_helper"
|
10
|
+
require "devdnsd"
|
11
|
+
require "net/dns"
|
12
|
+
|
13
|
+
require File.expand_path(File.dirname(__FILE__)) + "/../utils/tester"
|
data/utils/tester.rb
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
#
|
4
|
+
# This file is part of the devdnsd gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
|
5
|
+
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
6
|
+
#
|
7
|
+
|
8
|
+
basedir = File.expand_path(File.dirname(__FILE__))
|
9
|
+
require "rubygems"
|
10
|
+
require "logger"
|
11
|
+
require "rainbow"
|
12
|
+
require "active_support/all"
|
13
|
+
require "net/dns"
|
14
|
+
require basedir + "/../lib/devdnsd/logger"
|
15
|
+
|
16
|
+
# Patch to avoid resolving of hostname containing numbers.
|
17
|
+
class Net::DNS::Resolver
|
18
|
+
def is_ip_address?(addr)
|
19
|
+
catch(:valid_ip) do
|
20
|
+
if /\A(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\Z/ =~ addr
|
21
|
+
throw(:valid_ip, true) if $~.captures.all? {|i| i.to_i < 256}
|
22
|
+
else
|
23
|
+
# IPv6 (normal)
|
24
|
+
throw(:valid_ip, true) if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*\Z/ =~ addr
|
25
|
+
throw(:valid_ip, true) if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*)?\Z/ =~ addr
|
26
|
+
throw(:valid_ip, true) if /\A::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*)?\Z/ =~ addr
|
27
|
+
# IPv6 (IPv4 compat)
|
28
|
+
throw(:valid_ip, true) if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:/ =~ addr && valid_v4?($')
|
29
|
+
throw(:valid_ip, true) if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:)?/ =~ addr && valid_v4?($')
|
30
|
+
throw(:valid_ip, true) if /\A::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:)?/ =~ addr && valid_v4?($')
|
31
|
+
end
|
32
|
+
|
33
|
+
false
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def make_query_packet(string, type, cls)
|
38
|
+
if string.is_a?(IPAddr) then
|
39
|
+
name = string.reverse
|
40
|
+
type = Net::DNS::PTR
|
41
|
+
@logger.warn "PTR query required for address #{string}, changing type to PTR"
|
42
|
+
elsif is_ip_address?(string) # See if it's an IP or IPv6 address
|
43
|
+
begin
|
44
|
+
name = IPAddr.new(string.chomp(".")).reverse
|
45
|
+
type = Net::DNS::PTR
|
46
|
+
rescue ArgumentError
|
47
|
+
name = string if valid? string
|
48
|
+
end
|
49
|
+
else
|
50
|
+
name = string if valid? string
|
51
|
+
end
|
52
|
+
|
53
|
+
# Create the packet
|
54
|
+
packet = Net::DNS::Packet.new(name, type, cls)
|
55
|
+
|
56
|
+
if packet.query?
|
57
|
+
packet.header.recursive = @config[:recursive] ? 1 : 0
|
58
|
+
end
|
59
|
+
|
60
|
+
# DNSSEC and TSIG stuff to be inserted here
|
61
|
+
|
62
|
+
packet
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Resolvs an hostname to a nameserver.
|
67
|
+
#
|
68
|
+
# @param [String] The hostname to resolv.
|
69
|
+
# @param [String] The type of query to issue.
|
70
|
+
# @param [String] The nameserver to connect to.
|
71
|
+
# @param [Fixnum] The port to connect to.
|
72
|
+
# @param [Logger] A logger for the resolver.
|
73
|
+
# @return [Array|NilClass] Return an array of pair of addresses and types. `nil` is returned if nothing is found.
|
74
|
+
def devdnsd_resolv(address = "match.dev", type = "ANY", nameserver = "127.0.0.1", port = 7771, logger = nil)
|
75
|
+
rv = []
|
76
|
+
|
77
|
+
logger = DevDNSd::Logger.new("/dev/null", DevDNSd::Logger::DEBUG) if !logger
|
78
|
+
logger.info("Resolving address #{address.bright} with type #{type.to_s.bright} at nameserver #{nameserver.bright}:#{port.to_s.bright} ...")
|
79
|
+
tmpfile = "/tmp/devdnsd-test-tester-#{Time.now.strftime("%Y%m%d-%H:%M:%S")}"
|
80
|
+
|
81
|
+
begin
|
82
|
+
resolver = Net::DNS::Resolver.new(:nameservers => nameserver, :port => port.to_i, :recursive => false, :udp_timeout => 1, :log_file => tmpfile)
|
83
|
+
response = resolver.search(address, type)
|
84
|
+
|
85
|
+
response.answer.each do |answer|
|
86
|
+
type = answer.type.upcase.to_sym
|
87
|
+
result = ""
|
88
|
+
|
89
|
+
case type
|
90
|
+
when :MX
|
91
|
+
result = answer.exchange.gsub(/\.$/, "")
|
92
|
+
when :CNAME
|
93
|
+
result = answer.cname.gsub(/\.$/, "")
|
94
|
+
when :NS
|
95
|
+
result = answer.nsdname.gsub(/\.$/, "")
|
96
|
+
when :PTR
|
97
|
+
result = answer.ptrdname.gsub(/\.$/, "")
|
98
|
+
else
|
99
|
+
result = answer.address.to_s
|
100
|
+
end
|
101
|
+
|
102
|
+
rv << [result, type]
|
103
|
+
end
|
104
|
+
|
105
|
+
rv = case rv.length
|
106
|
+
when 0 then nil
|
107
|
+
when 1 then rv[0]
|
108
|
+
else rv
|
109
|
+
end
|
110
|
+
rescue Exception => e
|
111
|
+
logger.error("[#{e.class}] #{e.to_s}")
|
112
|
+
end
|
113
|
+
|
114
|
+
File.unlink(tmpfile) if File.exists?(tmpfile)
|
115
|
+
logger.info("Resolving ended with result: #{rv.inspect}")
|
116
|
+
rv
|
117
|
+
end
|
118
|
+
|
119
|
+
if __FILE__ == $0 then
|
120
|
+
address = ARGV[0] || "match.dev"
|
121
|
+
type = (ARGV[1] || "ANY").upcase
|
122
|
+
nameserver = ARGV[2] || "127.0.0.1"
|
123
|
+
port = ARGV[3] || 7771
|
124
|
+
logger = DevDNSd::Logger.create($stdout, Logger::DEBUG)
|
125
|
+
|
126
|
+
devdnsd_resolv(address, type, nameserver, port, logger)
|
127
|
+
end
|
metadata
ADDED
@@ -0,0 +1,269 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: devdnsd
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Shogun
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-07-16 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rubydns
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.4.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.4.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: cowtech-extensions
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 2.1.0
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 2.1.0
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: gli
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 1.6.0
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.6.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rexec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 1.4.1
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 1.4.1
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: rainbow
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 1.1.0
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 1.1.0
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: rspec
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 2.11.0
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 2.11.0
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: simplecov
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.6.0
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 0.6.0
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: pry
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ~>
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: 0.9.9
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ~>
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 0.9.9
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: net-dns
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ~>
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: 0.7.0
|
150
|
+
type: :development
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ~>
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: 0.7.0
|
158
|
+
- !ruby/object:Gem::Dependency
|
159
|
+
name: yard
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ~>
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: 0.8.0
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ~>
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 0.8.0
|
174
|
+
- !ruby/object:Gem::Dependency
|
175
|
+
name: redcarpet
|
176
|
+
requirement: !ruby/object:Gem::Requirement
|
177
|
+
none: false
|
178
|
+
requirements:
|
179
|
+
- - ~>
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: 2.1.0
|
182
|
+
type: :development
|
183
|
+
prerelease: false
|
184
|
+
version_requirements: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
186
|
+
requirements:
|
187
|
+
- - ~>
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: 2.1.0
|
190
|
+
- !ruby/object:Gem::Dependency
|
191
|
+
name: github-markup
|
192
|
+
requirement: !ruby/object:Gem::Requirement
|
193
|
+
none: false
|
194
|
+
requirements:
|
195
|
+
- - ~>
|
196
|
+
- !ruby/object:Gem::Version
|
197
|
+
version: 0.7.0
|
198
|
+
type: :development
|
199
|
+
prerelease: false
|
200
|
+
version_requirements: !ruby/object:Gem::Requirement
|
201
|
+
none: false
|
202
|
+
requirements:
|
203
|
+
- - ~>
|
204
|
+
- !ruby/object:Gem::Version
|
205
|
+
version: 0.7.0
|
206
|
+
description: A small DNS server to enable local domain resolution.
|
207
|
+
email:
|
208
|
+
- shogun_panda@me.com
|
209
|
+
executables:
|
210
|
+
- devdnsd
|
211
|
+
extensions: []
|
212
|
+
extra_rdoc_files: []
|
213
|
+
files:
|
214
|
+
- .DS_Store
|
215
|
+
- .gitignore
|
216
|
+
- .yardopts
|
217
|
+
- Gemfile
|
218
|
+
- Gemfile.lock
|
219
|
+
- README.md
|
220
|
+
- Rakefile
|
221
|
+
- bin/devdnsd
|
222
|
+
- config/devdnsd_config.sample
|
223
|
+
- devdnsd.gemspec
|
224
|
+
- lib/devdnsd.rb
|
225
|
+
- lib/devdnsd/application.rb
|
226
|
+
- lib/devdnsd/configuration.rb
|
227
|
+
- lib/devdnsd/errors.rb
|
228
|
+
- lib/devdnsd/logger.rb
|
229
|
+
- lib/devdnsd/rule.rb
|
230
|
+
- lib/devdnsd/version.rb
|
231
|
+
- spec/coverage_helper.rb
|
232
|
+
- spec/devdnsd/application_spec.rb
|
233
|
+
- spec/devdnsd/configuration_spec.rb
|
234
|
+
- spec/devdnsd/logger_spec.rb
|
235
|
+
- spec/devdnsd/rule_spec.rb
|
236
|
+
- spec/spec_helper.rb
|
237
|
+
- utils/tester.rb
|
238
|
+
homepage: http://github.com/ShogunPanda/devdnsd
|
239
|
+
licenses: []
|
240
|
+
post_install_message:
|
241
|
+
rdoc_options: []
|
242
|
+
require_paths:
|
243
|
+
- lib
|
244
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
245
|
+
none: false
|
246
|
+
requirements:
|
247
|
+
- - ! '>='
|
248
|
+
- !ruby/object:Gem::Version
|
249
|
+
version: '0'
|
250
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
251
|
+
none: false
|
252
|
+
requirements:
|
253
|
+
- - ! '>='
|
254
|
+
- !ruby/object:Gem::Version
|
255
|
+
version: '0'
|
256
|
+
requirements: []
|
257
|
+
rubyforge_project: devdnsd
|
258
|
+
rubygems_version: 1.8.24
|
259
|
+
signing_key:
|
260
|
+
specification_version: 3
|
261
|
+
summary: A small DNS server to enable local domain resolution.
|
262
|
+
test_files:
|
263
|
+
- spec/coverage_helper.rb
|
264
|
+
- spec/devdnsd/application_spec.rb
|
265
|
+
- spec/devdnsd/configuration_spec.rb
|
266
|
+
- spec/devdnsd/logger_spec.rb
|
267
|
+
- spec/devdnsd/rule_spec.rb
|
268
|
+
- spec/spec_helper.rb
|
269
|
+
has_rdoc:
|