ruby-djbdns 0.0.1 → 0.0.2
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/COPYING +1 -1
- data/VERSION +1 -1
- data/lib/djb.rb +1 -1
- data/lib/djb/tinydns.rb +18 -7
- data/sample/axfr.rb +1 -1
- data/sample/resolver.rb +27 -26
- data/test/axfr.rb +1 -1
- data/test/resolver.rb +71 -60
- data/test/runner.rb +3 -3
- metadata +13 -11
data/COPYING
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/lib/djb.rb
CHANGED
data/lib/djb/tinydns.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
# $
|
1
|
+
# $Hg: tinydns.rb,v d39b62a20f42 2008/02/22 21:24:37 boumenot $
|
2
2
|
require 'djb'
|
3
|
+
require 'ipaddr'
|
3
4
|
|
4
5
|
module DJB
|
5
6
|
|
@@ -42,6 +43,7 @@ module DJB
|
|
42
43
|
def add(entry)
|
43
44
|
@lines << entry.to_s
|
44
45
|
end
|
46
|
+
alias :<< :add
|
45
47
|
|
46
48
|
def add_reverse(args)
|
47
49
|
fqdn = args['ip'].split('.').reverse[1..3].join(".")
|
@@ -56,7 +58,7 @@ module DJB
|
|
56
58
|
return @lines.join("\n")
|
57
59
|
end
|
58
60
|
|
59
|
-
def
|
61
|
+
def to_file
|
60
62
|
File.write(fn(), self.to_s)
|
61
63
|
end
|
62
64
|
end
|
@@ -74,6 +76,7 @@ module DJB
|
|
74
76
|
def add(res)
|
75
77
|
@resources << res.to_s + ":#{@name}"
|
76
78
|
end
|
79
|
+
alias :<< :add
|
77
80
|
|
78
81
|
def to_s
|
79
82
|
return @resources.join("\n")
|
@@ -94,8 +97,8 @@ module DJB
|
|
94
97
|
@fqdn = args['fqdn']
|
95
98
|
end
|
96
99
|
|
97
|
-
def encode
|
98
|
-
|
100
|
+
def encode
|
101
|
+
data.gsub(/[^0-9a-zA-Z]/) { |m| sprintf("\\%.3o", m[0]) }
|
99
102
|
end
|
100
103
|
|
101
104
|
def to_s
|
@@ -130,7 +133,7 @@ module DJB
|
|
130
133
|
|
131
134
|
@fields << @fqdn
|
132
135
|
@fields << (args.has_key?('TypeValue') ? args['TypeValue'] : self.class::TypeValue)
|
133
|
-
@fields << encode
|
136
|
+
@fields << encode
|
134
137
|
@fields << @ttl
|
135
138
|
@fields << @timestamp
|
136
139
|
end
|
@@ -300,7 +303,7 @@ module DJB
|
|
300
303
|
@data = @args['data']
|
301
304
|
|
302
305
|
@fields << @fqdn
|
303
|
-
@fields << encode
|
306
|
+
@fields << encode
|
304
307
|
@fields << @ttl
|
305
308
|
@fields << @timestamp
|
306
309
|
end
|
@@ -320,6 +323,14 @@ module DJB
|
|
320
323
|
|
321
324
|
class AAAA < Generic
|
322
325
|
TypeValue = 28
|
326
|
+
|
327
|
+
def encode
|
328
|
+
ipv6 = IPAddr.new(@data)
|
329
|
+
a = ipv6.to_string.gsub(':', '').scan(/../).inject([]) do |acc,x|
|
330
|
+
acc << sprintf('\\%.3o', x.to_i(16))
|
331
|
+
end
|
332
|
+
return a.join('')
|
333
|
+
end
|
323
334
|
end
|
324
335
|
|
325
336
|
class LOC < Generic
|
@@ -388,7 +399,7 @@ module DJB
|
|
388
399
|
return s
|
389
400
|
end
|
390
401
|
|
391
|
-
def
|
402
|
+
def to_file
|
392
403
|
File.write(fn(), to_s())
|
393
404
|
end
|
394
405
|
end
|
data/sample/axfr.rb
CHANGED
data/sample/resolver.rb
CHANGED
@@ -1,40 +1,41 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'djb/tinydns'
|
4
|
+
include DJB::TinyDNS
|
4
5
|
|
5
|
-
tinydns =
|
6
|
+
tinydns = Resolver.new('/etc/tinydns', '/usr/local/bin/svc')
|
6
7
|
|
7
|
-
tinydns
|
8
|
-
tinydns
|
8
|
+
tinydns << NS::DelegateFrom.new({'fqdn' => 'example.net', 'ip' => '172.16.1.1'})
|
9
|
+
tinydns << NS::DelegateFrom.new({'fqdn' => '1.16.172.in-addr.arpa', 'ip' => '172.16.1.1'})
|
9
10
|
# -or-
|
10
|
-
# tinydns
|
11
|
-
|
12
|
-
tinydns
|
13
|
-
tinydns
|
14
|
-
tinydns
|
15
|
-
tinydns
|
16
|
-
tinydns
|
17
|
-
tinydns
|
18
|
-
tinydns
|
19
|
-
tinydns
|
20
|
-
tinydns
|
21
|
-
tinydns
|
22
|
-
|
23
|
-
intranet =
|
24
|
-
intranet
|
25
|
-
intranet
|
26
|
-
tinydns
|
27
|
-
|
28
|
-
vpn =
|
29
|
-
vpn
|
30
|
-
vpn
|
31
|
-
tinydns
|
11
|
+
# tinydns << _reverse({'ip' => '172.16.1.1'})
|
12
|
+
|
13
|
+
tinydns << Host.new( {'fqdn' => 'ace.example.net', 'ip' => '172.16.1.1'})
|
14
|
+
tinydns << Host.new( {'fqdn' => 'gary.example.net', 'ip' => '172.16.1.2'})
|
15
|
+
tinydns << A.new( {'fqdn' => 'www.example.net', 'ip' => '172.16.1.1'})
|
16
|
+
tinydns << A.new( {'fqdn' => 'ftp.example.net', 'ip' => '172.16.1.1'})
|
17
|
+
tinydns << A.new( {'fqdn' => 'ssh.example.net', 'ip' => '172.16.1.1'})
|
18
|
+
tinydns << A.new( {'fqdn' => 'tftp.example.net', 'ip' => '172.16.1.2'})
|
19
|
+
tinydns << CNAME.new({'fqdn' => 'gary.example.net', 'alias' => 'rsh.example.net'})
|
20
|
+
tinydns << CNAME.new({'fqdn' => 'gary.example.net', 'alias' => 'telnet.example.net'})
|
21
|
+
tinydns << CNAME.new({'fqdn' => 'gary.example.net', 'alias' => 'ntp.example.net'})
|
22
|
+
tinydns << MX.new( {'fqdn' => 'example.net', 'host' => 'gary.example.net', 'distance' => 10})
|
23
|
+
|
24
|
+
intranet = Location.new('intranet', '10.0.0')
|
25
|
+
intranet << Host.new({'fqdn' => 'ace.example.net', 'ip' => '10.0.0.1'})
|
26
|
+
intranet << Host.new({'fqdn' => 'gary.example.net', 'ip' => '10.0.0.2'})
|
27
|
+
tinydns << intranet
|
28
|
+
|
29
|
+
vpn = Location.new('vpn', '192.168')
|
30
|
+
vpn << Host.new({'fqdn' => 'ace.example.net', 'ip' => '192.168.1.1'})
|
31
|
+
vpn << Host.new({'fqdn' => 'gary.example.net', 'ip' => '192.168.1.2'})
|
32
|
+
tinydns << vpn
|
32
33
|
|
33
34
|
# print the tinydns file to the screen
|
34
35
|
puts tinydns
|
35
36
|
|
36
37
|
# print the tinydns files to the _data_ file
|
37
|
-
# tinydns.
|
38
|
+
# tinydns.to_file
|
38
39
|
|
39
40
|
|
40
41
|
# Local Variables:
|
data/test/axfr.rb
CHANGED
data/test/resolver.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
# $
|
2
|
+
# $Hg: resolver.rb,v d39b62a20f42 2008/02/22 21:24:37 boumenot $
|
3
3
|
|
4
4
|
require 'test/unit'
|
5
5
|
require 'djb/tinydns'
|
6
6
|
|
7
7
|
EVERYTHING = {
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
8
|
+
'fqdn' => 'ace.example.net',
|
9
|
+
'ip' => '172.16.1.100',
|
10
|
+
'host' => 'gary.example.net',
|
11
|
+
'alias' => 'agd.example.net',
|
12
|
+
'mname' => 'dns.example.net',
|
13
|
+
'rname' => 'admin.example.net',
|
14
|
+
'distance' => 10,
|
15
|
+
'data' => '1234::4321',
|
16
|
+
'TypeValue' => 1001,
|
17
17
|
}
|
18
18
|
|
19
19
|
def module_walk(clss)
|
@@ -25,70 +25,81 @@ def module_walk(clss)
|
|
25
25
|
end
|
26
26
|
|
27
27
|
class TC_Prefix < Test::Unit::TestCase
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
28
|
+
def test_prefix
|
29
|
+
e = {
|
30
|
+
'Host' => '=',
|
31
|
+
'Generic' => ':',
|
32
|
+
'A' => '+',
|
33
|
+
'NS::DelegateTo' => '&',
|
34
|
+
'NS::DelegateFrom' => '.',
|
35
|
+
'CNAME' => 'C',
|
36
|
+
'SOA' => 'Z',
|
37
|
+
'PTR' => '^',
|
38
|
+
'MX' => '@',
|
39
|
+
'TXT' => '\'',
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
41
|
+
'AAAA' => ':',
|
42
|
+
'WKS' => ':',
|
43
|
+
'SRV' => ':',
|
44
|
+
'NULL' => ':',
|
45
|
+
'HINFO' => ':',
|
46
|
+
'MINFO' => ':',
|
47
|
+
}
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
49
|
+
e.each do |k,expected|
|
50
|
+
mod = module_walk("DJB::TinyDNS::#{k}")
|
51
|
+
actual = mod.new(EVERYTHING).to_s[0].chr
|
52
|
+
assert(actual == expected, "prefix: expected=#{expected}, actual=#{actual}")
|
53
|
+
end
|
53
54
|
end
|
54
|
-
end
|
55
55
|
end
|
56
56
|
|
57
57
|
class TC_Accessor < Test::Unit::TestCase
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
58
|
+
def test_accessor
|
59
|
+
e = {
|
60
|
+
:ttl => %w{Host Generic A NS::DelegateTo NS::DelegateFrom CNAME SOA PTR MX TXT},
|
61
|
+
:timestamp => %w{Host Generic A NS::DelegateTo NS::DelegateFrom CNAME SOA PTR MX TXT},
|
62
|
+
:alias => %w{CNAME},
|
63
|
+
:mname => %w{SOA},
|
64
|
+
:rname => %w{SOA},
|
65
|
+
:host => %w{NS::DelegateTo NS::DelegateFrom PTR MX},
|
66
|
+
:distance => %w{MX},
|
67
|
+
:data => %w{Generic TXT},
|
68
|
+
:ip => %w{A NS::DelegateTo NS::DelegateFrom},
|
69
|
+
}
|
70
70
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
71
|
+
e.each do |k,v|
|
72
|
+
v.each do |c|
|
73
|
+
mod = module_walk("DJB::TinyDNS::#{c}")
|
74
|
+
assert(mod.new(EVERYTHING).respond_to?(k), "DJB::TinyDNS::#{c} does not respond to #{k}")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
78
79
|
|
79
|
-
|
80
|
+
class TC_Location < Test::Unit::TestCase
|
80
81
|
def test_location
|
81
|
-
|
82
|
-
|
82
|
+
loc = DJB::TinyDNS::Location.new('intranet', '192.168')
|
83
|
+
loc.add(DJB::TinyDNS::Host.new(EVERYTHING))
|
83
84
|
|
84
|
-
|
85
|
+
first, second = loc.to_s.split("\n")
|
85
86
|
|
86
|
-
|
87
|
-
|
87
|
+
assert(/^%intranet/.match(first), "location: expected /^%intranet/, actual=#{first}")
|
88
|
+
assert(/^\=/.match(second), "location: expected /^=.*/, actual #{second}")
|
88
89
|
end
|
89
|
-
|
90
|
+
end
|
90
91
|
|
92
|
+
class TC_ExpectedResult < Test::Unit::TestCase
|
93
|
+
def test_aaaa
|
94
|
+
exp = '\\022\\064\\126\\170\\232\\274\\015\\357\\000\\000\\000\\000\\000\\000\\376\\334'
|
95
|
+
quad = DJB::TinyDNS::AAAA.new({'fqdn' => 'www.example.net', 'data' => '1234:5678:9abc:def::fedc'})
|
91
96
|
|
97
|
+
a = quad.to_s.split(':')
|
98
|
+
|
99
|
+
assert_equal(a[1], 'www.example.net')
|
100
|
+
assert_equal(a[2], DJB::TinyDNS::AAAA::TypeValue.to_s)
|
101
|
+
assert_equal(a[3], exp)
|
102
|
+
end
|
92
103
|
end
|
93
104
|
|
94
105
|
# Local Variables:
|
data/test/runner.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
# $
|
2
|
+
# $Hg: runner.rb,v d39b62a20f42 2008/02/22 21:24:37 boumenot $
|
3
3
|
|
4
4
|
$: << File.dirname(__FILE__) + '/../lib'
|
5
5
|
require 'test/unit'
|
@@ -8,10 +8,10 @@ if not (File.exists?('resolver.rb'))
|
|
8
8
|
raise 'The test suite should only be run from the test directory.'
|
9
9
|
end
|
10
10
|
|
11
|
-
Dir.glob("#{File.dirname(__FILE__)}/*.rb").each()
|
11
|
+
Dir.glob("#{File.dirname(__FILE__)}/*.rb").each() do |filename|
|
12
12
|
next if filename == 'runner.rb'
|
13
13
|
require(filename)
|
14
|
-
|
14
|
+
end
|
15
15
|
|
16
16
|
# Local Variables:
|
17
17
|
# mode: ruby
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.
|
2
|
+
rubygems_version: 0.9.4
|
3
3
|
specification_version: 1
|
4
4
|
name: ruby-djbdns
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date:
|
6
|
+
version: 0.0.2
|
7
|
+
date: 2008-02-22 00:00:00 -05:00
|
8
8
|
summary: Ruby module to manage TinyDNS
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -25,27 +25,29 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
25
25
|
platform: ruby
|
26
26
|
signing_key:
|
27
27
|
cert_chain:
|
28
|
+
post_install_message:
|
28
29
|
authors:
|
29
30
|
- Christopher Boumenot
|
30
31
|
files:
|
31
|
-
- sample
|
32
32
|
- lib
|
33
|
-
- VERSION
|
34
|
-
- README
|
35
|
-
- test
|
36
33
|
- FILES
|
34
|
+
- pkg
|
37
35
|
- COPYING
|
38
|
-
-
|
39
|
-
- sample
|
36
|
+
- README
|
37
|
+
- sample
|
38
|
+
- test
|
39
|
+
- VERSION
|
40
40
|
- lib/djb.rb
|
41
41
|
- lib/djb/tinydns.rb
|
42
|
+
- sample/resolver.rb
|
43
|
+
- sample/axfr.rb
|
42
44
|
- test/resolver.rb
|
43
|
-
- test/axfr.rb
|
44
45
|
- test/runner.rb
|
46
|
+
- test/axfr.rb
|
45
47
|
test_files:
|
46
48
|
- test/resolver.rb
|
47
|
-
- test/axfr.rb
|
48
49
|
- test/runner.rb
|
50
|
+
- test/axfr.rb
|
49
51
|
rdoc_options: []
|
50
52
|
|
51
53
|
extra_rdoc_files: []
|