net-dns 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. data/.gitignore +8 -6
  2. data/.travis.yml +14 -0
  3. data/CHANGELOG.md +79 -0
  4. data/Gemfile +4 -0
  5. data/Rakefile +56 -66
  6. data/demo/check_soa.rb +1 -1
  7. data/demo/threads.rb +1 -1
  8. data/lib/net/dns.rb +24 -22
  9. data/lib/net/dns/header.rb +77 -103
  10. data/lib/net/dns/{names/names.rb → names.rb} +19 -20
  11. data/lib/net/dns/packet.rb +231 -256
  12. data/lib/net/dns/question.rb +11 -40
  13. data/lib/net/dns/resolver.rb +248 -250
  14. data/lib/net/dns/resolver/socks.rb +6 -6
  15. data/lib/net/dns/resolver/timeouts.rb +1 -1
  16. data/lib/net/dns/rr.rb +112 -117
  17. data/lib/net/dns/rr/a.rb +98 -89
  18. data/lib/net/dns/rr/aaaa.rb +84 -68
  19. data/lib/net/dns/rr/classes.rb +91 -106
  20. data/lib/net/dns/rr/cname.rb +64 -45
  21. data/lib/net/dns/rr/hinfo.rb +90 -50
  22. data/lib/net/dns/rr/mr.rb +61 -44
  23. data/lib/net/dns/rr/mx.rb +73 -48
  24. data/lib/net/dns/rr/ns.rb +60 -46
  25. data/lib/net/dns/rr/null.rb +11 -12
  26. data/lib/net/dns/rr/ptr.rb +47 -34
  27. data/lib/net/dns/rr/soa.rb +5 -6
  28. data/lib/net/dns/rr/srv.rb +1 -4
  29. data/lib/net/dns/rr/txt.rb +14 -14
  30. data/lib/net/dns/rr/types.rb +13 -13
  31. data/lib/net/dns/version.rb +8 -14
  32. data/net-dns.gemspec +35 -0
  33. data/setup.rb +3 -2
  34. data/test/header_test.rb +18 -18
  35. data/test/names_test.rb +21 -0
  36. data/test/packet_test.rb +38 -31
  37. data/test/question_test.rb +23 -24
  38. data/test/resolver/timeouts_test.rb +13 -13
  39. data/test/resolver_test.rb +28 -20
  40. data/test/rr/a_test.rb +70 -23
  41. data/test/rr/aaaa_test.rb +109 -0
  42. data/test/rr/classes_test.rb +61 -49
  43. data/test/rr/cname_test.rb +97 -0
  44. data/test/rr/hinfo_test.rb +117 -0
  45. data/test/rr/mr_test.rb +105 -0
  46. data/test/rr/mx_test.rb +112 -0
  47. data/test/rr/ns_test.rb +34 -12
  48. data/test/rr/types_test.rb +4 -4
  49. data/test/rr_test.rb +1 -1
  50. metadata +77 -52
  51. data/AUTHORS.rdoc +0 -7
  52. data/CHANGELOG.rdoc +0 -46
  53. data/VERSION.yml +0 -5
@@ -1,68 +1,108 @@
1
- module Net
1
+ module Net # :nodoc:
2
2
  module DNS
3
3
  class RR
4
-
5
- #------------------------------------------------------------
6
- # RR type HINFO
7
- #------------------------------------------------------------
4
+
5
+ #
6
+ # = System Information Record (HINFO)
7
+ #
8
+ # Class for DNS HINFO resource records.
9
+ #
10
+ # Allows definition of the Hardware type and Operating System (OS) in use at a host.
11
+ # For security reasons these records are rarely used on public servers.
12
+ # If a space exists in the field it must be enclosed in quotes.
13
+ # Single space between CPU and OS parameters.
14
+ #
8
15
  class HINFO < RR
9
- attr_reader :cpu, :os
10
16
 
11
- private
12
-
13
- def check_hinfo(str)
14
- if str.strip =~ /^["'](.*?)["']\s+["'](.*?)["']$/
15
- return $1,$2
16
- else
17
- raise ArgumentError, "HINFO section not valid: #{str.inspect}"
18
- end
19
- end
20
-
21
- def build_pack
22
- @hinfo_pack = [@cpu.size].pack("C") + @cpu
23
- @hinfo_pack += [@os.size].pack("C") + @os
24
- @rdlength = @hinfo_pack.size
17
+ # Gets the CPU value.
18
+ #
19
+ # Returns a String.
20
+ def cpu
21
+ @cpu
25
22
  end
26
23
 
27
- def get_data
28
- @hinfo_pack
24
+ # Gets the OS value.
25
+ #
26
+ # Returns a String.
27
+ def os
28
+ @os
29
29
  end
30
30
 
31
- def get_inspect
32
- "#@cpu #@os"
31
+ # Gets the standardized value for this record,
32
+ # represented by the value of <tt>cpu</tt> and <tt>os</tt>.
33
+ #
34
+ # Returns a String.
35
+ def value
36
+ %Q{"#{cpu}" "#{os}"}
33
37
  end
34
38
 
35
- def subclass_new_from_hash(args)
36
- if args.has_key? :cpu and args.has_key? :os
37
- @cpu = args[:cpu]
38
- @os = args[:os]
39
- else
40
- raise ArgumentError, ":cpu and :os fields are mandatory but missing"
41
- end
42
- end
43
39
 
44
- def subclass_new_from_string(str)
45
- @cpu,@os = check_hinfo(str)
40
+ # Gets a list of all the attributes for this record.
41
+ #
42
+ # Returns an Array of values.
43
+ def to_a
44
+ [nil, nil, cls.to_s, type.to_s, value]
46
45
  end
47
46
 
48
- def subclass_new_from_binary(data,offset)
49
- len = data.unpack("@#{offset} C")[0]
50
- @cpu = data[offset+1..offset+1+len]
51
- offset += len+1
52
- len = @data.unpack("@#{offset} C")[0]
53
- @os = data[offset+1..offset+1+len]
54
- return offset += len+1
55
- end
56
-
47
+
57
48
  private
58
-
49
+
50
+ def subclass_new_from_hash(options)
51
+ if options.has_key?(:cpu) && options.has_key?(:os)
52
+ @cpu = options[:cpu]
53
+ @os = options[:os]
54
+ else
55
+ raise ArgumentError, ":cpu and :os fields are mandatory"
56
+ end
57
+ end
58
+
59
+ def subclass_new_from_string(str)
60
+ @cpu, @os = check_hinfo(str)
61
+ end
62
+
63
+ def subclass_new_from_binary(data, offset)
64
+ len = data.unpack("@#{offset} C").first
65
+ offset += 1
66
+ @cpu = data[offset..(offset + len)]
67
+ offset += len
68
+
69
+ len = data.unpack("@#{offset} C").first
70
+ offset += 1
71
+ @os = data[offset..(offset + len)]
72
+ offset += len
73
+ end
74
+
75
+
59
76
  def set_type
60
77
  @type = Net::DNS::RR::Types.new("HINFO")
61
78
  end
62
-
63
- end # class HINFO
64
-
65
- end # class RR
66
- end # module DNS
67
- end # module Net
68
79
 
80
+ def get_inspect
81
+ value
82
+ end
83
+
84
+
85
+ def check_hinfo(input)
86
+ if input.to_s.strip =~ /^(?:["']?(.*?)["']?)\s+(?:["']?(.*?)["']?)$/
87
+ [$1, $2]
88
+ else
89
+ raise ArgumentError, "Invalid HINFO Section `#{input}'"
90
+ end
91
+ end
92
+
93
+ def build_pack
94
+ @hinfo_pack = ""
95
+ @hinfo_pack += [cpu.size].pack("C") + cpu
96
+ @hinfo_pack += [os.size ].pack("C") + os
97
+ @rdlength = @hinfo_pack.size
98
+ end
99
+
100
+ def get_data
101
+ @hinfo_pack
102
+ end
103
+
104
+ end
105
+
106
+ end
107
+ end
108
+ end
@@ -1,62 +1,79 @@
1
- module Net
1
+ module Net # :nodoc:
2
2
  module DNS
3
3
 
4
4
  class RR
5
-
6
- #------------------------------------------------------------
7
- # RR type MR
8
- #------------------------------------------------------------
5
+
6
+ #
7
+ # = Mail Rename Record (MR)
8
+ #
9
+ # Class for DNS MR resource records.
10
+ #
9
11
  class MR < RR
10
- attr_reader :newname
11
12
 
12
- private
13
-
14
- def check_name(name)
15
- unless name =~ /(\w\.?)+\s*$/
16
- raise ArgumentError, "Name not valid: #{name.inspect}"
17
- end
18
- name
13
+ # Gets the newname value.
14
+ #
15
+ # Returns a String.
16
+ def newname
17
+ @newname
19
18
  end
20
19
 
21
- def build_pack
22
- @newname_pack = pack_name(@newname)
23
- @rdlength = @newname_pack.size
20
+ # Gets the standardized value for this record,
21
+ # represented by the value of <tt>newname</tt>.
22
+ #
23
+ # Returns a String.
24
+ def value
25
+ newname.to_s
24
26
  end
25
27
 
26
- def get_data
27
- @newname_pack
28
- end
29
28
 
30
- def get_inspect
31
- "#@newname"
32
- end
33
-
34
- def subclass_new_from_hash(args)
35
- if args.has_key? :newname
36
- @newname = check_name args[:newname]
37
- else
38
- raise ArgumentError, ":newname field is mandatory but missing"
29
+ private
30
+
31
+ def subclass_new_from_hash(options)
32
+ if options.has_key?(:newname)
33
+ @newname = check_name(options[:newname])
34
+ else
35
+ raise ArgumentError, ":newname field is mandatory"
36
+ end
37
+ end
38
+
39
+ def subclass_new_from_string(str)
40
+ @newname = check_name(str)
41
+ end
42
+
43
+ def subclass_new_from_binary(data, offset)
44
+ @newname = dn_expand(data,offset)
45
+ offset
39
46
  end
40
- end
41
47
 
42
- def subclass_new_from_string(str)
43
- @newname = check_name(str)
44
- end
45
48
 
46
- def subclass_new_from_array(data,offset)
47
- @newname = dn_expand(data,offset)
48
- return offset
49
- end
50
-
51
- private
52
-
53
49
  def set_type
54
50
  @type = Net::DNS::RR::Types.new("MR")
55
51
  end
56
-
57
- end # class MR
58
52
 
59
- end # class RR
60
- end # module DNS
61
- end # module Net
53
+ def get_inspect
54
+ value
55
+ end
56
+
57
+
58
+ def check_name(input)
59
+ name = input.to_s
60
+ unless name =~ /(\w\.?)+\s*$/
61
+ raise ArgumentError, "Invalid Domain Name `#{name}'"
62
+ end
63
+ name
64
+ end
65
+
66
+ def build_pack
67
+ @newname_pack = pack_name(@newname)
68
+ @rdlength = @newname_pack.size
69
+ end
70
+
71
+ def get_data
72
+ @newname_pack
73
+ end
74
+
75
+ end
62
76
 
77
+ end
78
+ end
79
+ end
@@ -1,67 +1,92 @@
1
- module Net
1
+ module Net # :nodoc:
2
2
  module DNS
3
3
  class RR
4
-
5
- #------------------------------------------------------------
6
- # RR type MX
7
- #------------------------------------------------------------
4
+
5
+ #
6
+ # = Mail Exchange Record (MX)
7
+ #
8
+ # Class for DNS MX resource records.
9
+ #
10
+ # A MX record specifies the name and relative preference of mail servers
11
+ # (mail exchangers in the DNS jargon) for the zone.
12
+ # The MX RR is used by SMTP (Mail) Agents to route mail for the domain.
13
+ #
8
14
  class MX < RR
9
- attr_reader :preference, :exchange
10
15
 
11
- private
12
-
13
- def check_mx(str)
14
- if str.strip =~ /^(\d+)\s+(\S+)$/
15
- return $1.to_i,$2
16
- else
17
- raise ArgumentError, "MX section not valid"
18
- end
19
- end
20
-
21
- def build_pack
22
- @mx_pack = [@preference].pack("n") + pack_name(@exchange)
23
- @rdlength = @mx_pack.size
16
+ # Gets the preference value.
17
+ #
18
+ # Returns an Integer.
19
+ def preference
20
+ @preference
24
21
  end
25
22
 
26
- def get_data
27
- @mx_pack
23
+ # Gets the exchange value.
24
+ #
25
+ # Returns a String.
26
+ def exchange
27
+ @exchange
28
28
  end
29
29
 
30
- def get_inspect
31
- "#@preference #@exchange"
30
+ # Gets the standardized value for this record,
31
+ # represented by the value of <tt>preference</tt> and <tt>exchange</tt>.
32
+ #
33
+ # Returns a String.
34
+ def value
35
+ "#{preference} #{exchange}"
32
36
  end
33
37
 
34
- def subclass_new_from_hash(args)
35
- if args.has_key? :preference and args.has_key? :exchange
36
- @preference = args[:preference].to_i
37
- @exchange = args[:exchange]
38
- else
39
- raise ArgumentError, ":preference and :exchange fields are mandatory but missing"
38
+
39
+ private
40
+
41
+ def subclass_new_from_hash(options)
42
+ if options.has_key?(:preference) && options.has_key?(:exchange)
43
+ @preference = options[:preference].to_i
44
+ @exchange = options[:exchange]
45
+ else
46
+ raise ArgumentError, ":preference and :exchange fields are mandatory"
47
+ end
48
+ end
49
+
50
+ def subclass_new_from_string(str)
51
+ @preference, @exchange = check_mx(str)
52
+ end
53
+
54
+ def subclass_new_from_binary(data, offset)
55
+ @preference = data.unpack("@#{offset} n")[0]
56
+ offset += 2
57
+ @exchange, offset = dn_expand(data, offset)
58
+ offset
40
59
  end
41
- end
42
60
 
43
- def subclass_new_from_string(str)
44
- @preference,@exchange = check_mx(str)
45
- end
46
61
 
47
- def subclass_new_from_binary(data,offset)
48
- @preference = data.unpack("@#{offset} n")[0]
49
- offset += 2
50
- @exchange,offset = dn_expand(data,offset)
51
- return offset
52
- end
53
-
54
- private
55
-
56
62
  def set_type
57
63
  @type = Net::DNS::RR::Types.new("MX")
58
64
  end
59
-
60
- end # class MX
61
-
62
- end # class RR
63
- end # module DNS
64
- end # module Net
65
65
 
66
+ def get_inspect
67
+ value
68
+ end
69
+
70
+
71
+ def check_mx(input)
72
+ str = input.to_s
73
+ unless str.strip =~ /^(\d+)\s+(\S+)$/
74
+ raise ArgumentError, "Invalid MX section `#{str}'"
75
+ end
76
+ [$1.to_i, $2]
77
+ end
78
+
79
+ def build_pack
80
+ @mx_pack = [@preference].pack("n") + pack_name(@exchange)
81
+ @rdlength = @mx_pack.size
82
+ end
83
+
84
+ def get_data
85
+ @mx_pack
86
+ end
66
87
 
88
+ end
67
89
 
90
+ end
91
+ end
92
+ end
@@ -1,64 +1,78 @@
1
- module Net
1
+ module Net # :nodoc:
2
2
  module DNS
3
-
4
3
  class RR
5
-
6
- #------------------------------------------------------------
7
- # RR type NS
8
- #------------------------------------------------------------
4
+
5
+ #
6
+ # = Name Server Record (NS)
7
+ #
8
+ # Class for DNS NS resource records.
9
+ #
9
10
  class NS < RR
10
- attr_reader :nsdname
11
11
 
12
- private
13
-
14
- def check_name(name)
15
- unless name =~ /(\w\.?)+\s*$/ and name =~ /[a-zA-Z]/
16
- raise ArgumentError, "NS Domain Name not valid: #{name}"
17
- end
18
- name
12
+ # Gets the name server value.
13
+ #
14
+ # Returns a String.
15
+ def nsdname
16
+ @nsdname
19
17
  end
20
18
 
21
- def build_pack
22
- @nsdname_pack = pack_name(@nsdname)
23
- @rdlength = @nsdname_pack.size
19
+ # Gets the standardized value for this record,
20
+ # represented by the value of <tt>nsdname</tt>.
21
+ #
22
+ # Returns a String.
23
+ def value
24
+ nsdname.to_s
24
25
  end
25
26
 
26
- def get_data
27
- @nsdname_pack
28
- end
29
27
 
30
- def get_inspect
31
- "#@nsdname"
32
- end
33
-
34
- def subclass_new_from_hash(args)
35
- if args.has_key? :nsdname
36
- @nsdname = check_name args[:nsdname]
37
- else
38
- raise ArgumentError, ":nsdname field is mandatory but missing"
28
+ private
29
+
30
+ def subclass_new_from_hash(options)
31
+ if options.has_key?(:nsdname)
32
+ @nsdname = check_name(options[:nsdname])
33
+ else
34
+ raise ArgumentError, ":nsdname field is mandatory"
35
+ end
36
+ end
37
+
38
+ def subclass_new_from_string(str)
39
+ @nsdname = check_name(str)
40
+ end
41
+
42
+ def subclass_new_from_binary(data, offset)
43
+ @nsdname, offset = dn_expand(data, offset)
44
+ offset
39
45
  end
40
- end
41
46
 
42
- def subclass_new_from_string(str)
43
- @nsdname = check_name(str)
44
- end
45
47
 
46
- def subclass_new_from_binary(data,offset)
47
- @nsdname,offset = dn_expand(data,offset)
48
- return offset
49
- end
50
-
51
- private
52
-
53
48
  def set_type
54
49
  @type = Net::DNS::RR::Types.new("NS")
55
50
  end
56
-
57
- end # class NS
58
-
59
- end # class RR
60
- end # module DNS
61
- end # module Net
62
51
 
52
+ def get_inspect
53
+ value
54
+ end
55
+
56
+
57
+ def check_name(input)
58
+ name = input.to_s
59
+ unless name =~ /(\w\.?)+\s*$/ and name =~ /[a-zA-Z]/
60
+ raise ArgumentError, "Invalid Name Server `#{name}'"
61
+ end
62
+ name
63
+ end
64
+
65
+ def build_pack
66
+ @nsdname_pack = pack_name(@nsdname)
67
+ @rdlength = @nsdname_pack.size
68
+ end
69
+
70
+ def get_data
71
+ @nsdname_pack
72
+ end
63
73
 
74
+ end
64
75
 
76
+ end
77
+ end
78
+ end