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.
@@ -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
@@ -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: