ruby-djbdns 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|