bluemonk-net-dns 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,61 @@
1
+ ##
2
+ #
3
+ # Net::DNS::RR::NULL
4
+ #
5
+ # $Id: NULL.rb,v 1.5 2006/07/28 07:33:36 bluemonk Exp $
6
+ #
7
+ ##
8
+
9
+
10
+ module Net
11
+ module DNS
12
+ class RR
13
+
14
+ #------------------------------------------------------------
15
+ # RR type NULL
16
+ #------------------------------------------------------------
17
+ class NULL < RR
18
+ attr_reader :null
19
+
20
+ private
21
+
22
+ def build_pack
23
+ @null_pack = @null
24
+ @rdlength = @null_pack.size
25
+ end
26
+
27
+ def set_type
28
+ @type = Net::DNS::RR::RRTypes.new("NULL")
29
+ end
30
+
31
+ def get_data
32
+ @null_pack
33
+ end
34
+
35
+ def get_inspect
36
+ "#@null"
37
+ end
38
+
39
+ def subclass_new_from_hash(args)
40
+ if args.has_key? :null
41
+ @null = args[:null]
42
+ else
43
+ raise RRArgumentError, ":null field is mandatory but missing"
44
+ end
45
+ end
46
+
47
+ def subclass_new_from_string(str)
48
+ @null = str.strip
49
+ end
50
+
51
+ def subclass_new_from_binary(data,offset)
52
+ @null = data[offset..offset+@rdlength]
53
+ return offset + @rdlength
54
+ end
55
+
56
+ end # class NULL
57
+
58
+ end # class RR
59
+ end # module DNS
60
+ end # module Net
61
+
@@ -0,0 +1,71 @@
1
+ ##
2
+ #
3
+ # Net::DNS::RR::PTR
4
+ #
5
+ # $Id: PTR.rb,v 1.5 2006/07/28 07:33:36 bluemonk Exp $
6
+ #
7
+ ##
8
+
9
+ module Net
10
+ module DNS
11
+ class RR
12
+
13
+ #------------------------------------------------------------
14
+ # RR type PTR
15
+ #------------------------------------------------------------
16
+ class PTR < RR
17
+
18
+ # Getter for PTR resource
19
+ def ptr
20
+ @ptrdname.to_s
21
+ end
22
+ alias_method :ptrdname, :ptr
23
+
24
+ private
25
+
26
+ def check_ptr(str)
27
+ IPAddr.new str
28
+ rescue
29
+ raise RRArgumentError, "PTR section not valid"
30
+ end
31
+
32
+ def build_pack
33
+ @ptrdname_pack = pack_name(@ptrdname)
34
+ @rdlength = @ptrdname_pack.size
35
+ end
36
+
37
+ def set_type
38
+ @type = Net::DNS::RR::Types.new("PTR")
39
+ end
40
+
41
+ def get_data
42
+ @ptrdname_pack
43
+ end
44
+
45
+ def get_inspect
46
+ "#@ptrdname"
47
+ end
48
+
49
+ def subclass_new_from_hash(args)
50
+ if args.has_key? :ptrdname or args.has_key? :ptr
51
+ @ptrdname = args[0][:ptrdname]
52
+ else
53
+ raise RRArgumentError, ":ptrdname or :ptr field is mandatory but missing"
54
+ end
55
+ end
56
+
57
+ def subclass_new_from_string(str)
58
+ @ptrdname = check_ptr(str)
59
+ end
60
+
61
+ def subclass_new_from_binary(data,offset)
62
+ @ptrdname,offset = dn_expand(data,offset)
63
+ return offset
64
+ end
65
+
66
+ end # class PTR
67
+
68
+ end # class RR
69
+ end # module DNS
70
+ end # module Net
71
+
@@ -0,0 +1,85 @@
1
+ ##
2
+ #
3
+ # Net::DNS::RR::SOA
4
+ #
5
+ # $Id: SOA.rb,v 1.4 2006/07/28 07:33:36 bluemonk Exp $
6
+ #
7
+ ##
8
+
9
+ module Net
10
+ module DNS
11
+ class RR
12
+
13
+ #------------------------------------------------------------
14
+ # RR type SOA
15
+ #------------------------------------------------------------
16
+ class SOA < RR
17
+ attr_reader :mname, :rname, :serial, :refresh, :retry, :expire, :minimum
18
+
19
+ private
20
+
21
+ def build_pack
22
+ @soa_pack = pack_name(@mname)
23
+ @soa_pack += pack_name(@rname)
24
+ @soa_pack += [@serial,@refresh,@retry,@expire,@minimum].pack("N5")
25
+ end
26
+
27
+ def set_type
28
+ @type = Net::DNS::RR::Types.new("SOA")
29
+ end
30
+
31
+ def get_data
32
+ @soa_pack
33
+ end
34
+
35
+ def get_inspect
36
+ "#@mname #@rname #@serial #@refresh #@retry #@expire #@minimum"
37
+ end
38
+
39
+ def subclass_new_from_hash(args)
40
+ if args.has_key? :rdata
41
+ subclass_new_from_string(args[:rdata])
42
+ else
43
+ [:mname,:rname,:serial,:refresh,:retry,:expire,:minimum].each do |key|
44
+ raise RRArgumentError, "Missing field :#{key}" unless args.has_key? key
45
+ end
46
+ @mname = args[:mname] if valid? args[:mname]
47
+ @rname = args[:rname] if valid? args[:rname]
48
+ @serial = args[:serial] if number? args[:serial]
49
+ @refresh = args[:refresh] if number? args[:refresh]
50
+ @retry = args[:retry] if number? args[:retry]
51
+ @expire = args[:expire] if number? args[:expire]
52
+ @minimum = args[:minimum] if number? args[:minimum]
53
+ end
54
+ end
55
+
56
+ def number?(num)
57
+ if num.kind_of? Integer and num > 0
58
+ true
59
+ else
60
+ raise RRArgumentError, "Wrong format field: #{num} not a number or less than zero"
61
+ end
62
+ end
63
+
64
+ def subclass_new_from_string(str)
65
+ mname,rname,serial,refresh,ret,expire,minimum = str.strip.split(" ")
66
+ @mname = mname if valid? mname
67
+ @rname = rname if valid? rname
68
+ @serial,@refresh,@retry,@expire,@minimum = [serial,refresh,ret,expire,minimum].collect do |i|
69
+ i.to_i if valid? i.to_i
70
+ end
71
+ end
72
+
73
+ def subclass_new_from_binary(data,offset)
74
+ @mname,offset = dn_expand(data,offset)
75
+ @rname,offset = dn_expand(data,offset)
76
+ @serial,@refresh,@retry,@expire,@minimum = data.unpack("@#{offset} N5")
77
+ return offset + 5*Net::DNS::INT32SZ
78
+ end
79
+
80
+ end # class SOA
81
+
82
+ end # class RR
83
+ end # module DNS
84
+ end # module Net
85
+
@@ -0,0 +1,57 @@
1
+ ##
2
+ #
3
+ # Net::DNS::RR::SRV
4
+ #
5
+ # $Id$
6
+ #
7
+ ##
8
+
9
+
10
+ module Net
11
+ module DNS
12
+ class RR
13
+
14
+ #------------------------------------------------------------
15
+ # RR type SRV
16
+ #------------------------------------------------------------
17
+ class SRV < RR
18
+
19
+ attr_reader :priority, :weight, :port, :host
20
+
21
+ private
22
+
23
+ def build_pack
24
+ str = ""
25
+ end
26
+
27
+ def set_type
28
+ @type = Net::DNS::RR::Types.new("SRV")
29
+ end
30
+
31
+ def subclass_new_from_binary(data,offset)
32
+ off_end = offset + @rdlength
33
+ @priority, @weight, @port = data.unpack("@#{offset} n n n")
34
+ offset+=6
35
+
36
+ @host=[]
37
+ while offset < off_end
38
+ len = data.unpack("@#{offset} C")[0]
39
+ offset += 1
40
+ str = data[offset..offset+len-1]
41
+ offset += len
42
+ @host << str
43
+ end
44
+ @host=@host.join(".")
45
+ offset
46
+ end
47
+
48
+
49
+ end # class SRV
50
+ end # class RR
51
+
52
+
53
+ end # module DNS
54
+ end # module Net
55
+
56
+
57
+
@@ -0,0 +1,72 @@
1
+ ##
2
+ #
3
+ # Net::DNS::RR::TXT
4
+ #
5
+ # $Id: TXT.rb,v 1.4 2006/07/28 07:33:36 bluemonk Exp $
6
+ #
7
+ ##
8
+
9
+
10
+ module Net
11
+ module DNS
12
+ class RR
13
+
14
+ #------------------------------------------------------------
15
+ # RR type TXT
16
+ #------------------------------------------------------------
17
+ class TXT < RR
18
+ attr_reader :txt
19
+
20
+ private
21
+
22
+ def build_pack
23
+ str = ""
24
+ @txt.split(" ").each do |txt|
25
+ str += [txt.length,txt].pack("C a*")
26
+ end
27
+ @txt_pack = str
28
+ @rdlength = @txt_pack.size
29
+ end
30
+
31
+ def set_type
32
+ @type = Net::DNS::RR::Types.new("TXT")
33
+ end
34
+
35
+ def get_data
36
+ @txt_pack
37
+ end
38
+
39
+ def subclass_new_from_hash(args)
40
+ if args.has_key? :txt
41
+ @txt = args[:txt].strip
42
+ else
43
+ raise RRArgumentError, ":txt field is mandatory but missing"
44
+ end
45
+ end
46
+
47
+ def subclass_new_from_string(str)
48
+ @txt = str.strip
49
+ end
50
+
51
+ def subclass_new_from_binary(data,offset)
52
+ off_end = offset + @rdlength
53
+ @txt = ""
54
+ while offset < off_end
55
+ len = data.unpack("@#{offset} C")[0]
56
+ offset += 1
57
+ str = data[offset..offset+len-1]
58
+ offset += len
59
+ @txt << str << " "
60
+ end
61
+ return offset
62
+ end
63
+
64
+ end # class TXT
65
+
66
+ end # class RR
67
+ end # module DNS
68
+ end # module Net
69
+
70
+
71
+
72
+
@@ -0,0 +1,200 @@
1
+ module Net # :nodoc:
2
+ module DNS
3
+
4
+ class RR
5
+
6
+ #
7
+ # This is an auxiliary class to hadle RR type field in a DNS packet.
8
+ #
9
+ class Types
10
+
11
+ # :nodoc:
12
+ Types = { # :nodoc:
13
+ 'SIGZERO' => 0, # RFC2931 consider this a pseudo type
14
+ 'A' => 1, # RFC 1035, Section 3.4.1
15
+ 'NS' => 2, # RFC 1035, Section 3.3.11
16
+ 'MD' => 3, # RFC 1035, Section 3.3.4 (obsolete)
17
+ 'MF' => 4, # RFC 1035, Section 3.3.5 (obsolete)
18
+ 'CNAME' => 5, # RFC 1035, Section 3.3.1
19
+ 'SOA' => 6, # RFC 1035, Section 3.3.13
20
+ 'MB' => 7, # RFC 1035, Section 3.3.3
21
+ 'MG' => 8, # RFC 1035, Section 3.3.6
22
+ 'MR' => 9, # RFC 1035, Section 3.3.8
23
+ 'NULL' => 10, # RFC 1035, Section 3.3.10
24
+ 'WKS' => 11, # RFC 1035, Section 3.4.2 (deprecated)
25
+ 'PTR' => 12, # RFC 1035, Section 3.3.12
26
+ 'HINFO' => 13, # RFC 1035, Section 3.3.2
27
+ 'MINFO' => 14, # RFC 1035, Section 3.3.7
28
+ 'MX' => 15, # RFC 1035, Section 3.3.9
29
+ 'TXT' => 16, # RFC 1035, Section 3.3.14
30
+ 'RP' => 17, # RFC 1183, Section 2.2
31
+ 'AFSDB' => 18, # RFC 1183, Section 1
32
+ 'X25' => 19, # RFC 1183, Section 3.1
33
+ 'ISDN' => 20, # RFC 1183, Section 3.2
34
+ 'RT' => 21, # RFC 1183, Section 3.3
35
+ 'NSAP' => 22, # RFC 1706, Section 5
36
+ 'NSAP_PTR' => 23, # RFC 1348 (obsolete)
37
+ # The following 2 RRs are impemented in Net::DNS::SEC, TODO
38
+ 'SIG' => 24, # RFC 2535, Section 4.1
39
+ 'KEY' => 25, # RFC 2535, Section 3.1
40
+ 'PX' => 26, # RFC 2163,
41
+ 'GPOS' => 27, # RFC 1712 (obsolete)
42
+ 'AAAA' => 28, # RFC 1886, Section 2.1
43
+ 'LOC' => 29, # RFC 1876
44
+ # The following RR is impemented in Net::DNS::SEC, TODO
45
+ 'NXT' => 30, # RFC 2535, Section 5.2
46
+ 'EID' => 31, # draft-ietf-nimrod-dns-xx.txt
47
+ 'NIMLOC' => 32, # draft-ietf-nimrod-dns-xx.txt
48
+ 'SRV' => 33, # RFC 2052
49
+ 'ATMA' => 34, # ???
50
+ 'NAPTR' => 35, # RFC 2168
51
+ 'KX' => 36, # RFC 2230
52
+ 'CERT' => 37, # RFC 2538
53
+ 'DNAME' => 39, # RFC 2672
54
+ 'OPT' => 41, # RFC 2671
55
+ # The following 4 RRs are impemented in Net::DNS::SEC TODO
56
+ 'DS' => 43, # draft-ietf-dnsext-delegation-signer
57
+ 'SSHFP' => 44, # draft-ietf-secsh-dns (No RFC # yet at time of coding)
58
+ 'RRSIG' => 46, # draft-ietf-dnsext-dnssec-2535typecode-change
59
+ 'NSEC' => 47, # draft-ietf-dnsext-dnssec-2535typecode-change
60
+ 'DNSKEY' => 48, # draft-ietf-dnsext-dnssec-2535typecode-change
61
+ 'UINFO' => 100, # non-standard
62
+ 'UID' => 101, # non-standard
63
+ 'GID' => 102, # non-standard
64
+ 'UNSPEC' => 103, # non-standard
65
+ 'TKEY' => 249, # RFC 2930
66
+ 'TSIG' => 250, # RFC 2931
67
+ 'IXFR' => 251, # RFC 1995
68
+ 'AXFR' => 252, # RFC 1035
69
+ 'MAILB' => 253, # RFC 1035 (MB, MG, MR)
70
+ 'MAILA' => 254, # RFC 1035 (obsolete - see MX)
71
+ 'ANY' => 255, # RFC 1035
72
+ }
73
+
74
+ # The default value when type is nil in Resource Records
75
+ @@default = Types["A"]
76
+
77
+ # Be able to control the default type to assign when
78
+ # type is +nil+. Default to +A+
79
+ def self.default=(str)
80
+ if Types.has_key? str
81
+ @@default = Types[str]
82
+ else
83
+ raise TypeArgumentError, "Unknown type #{str}"
84
+ end
85
+ end
86
+
87
+ # Checks whether +type+ is a valid RR type.
88
+ def self.valid?(type)
89
+ case type
90
+ when String
91
+ return Types.has_key?(type)
92
+ when Fixnum
93
+ return Types.invert.has_key?(type)
94
+ else
95
+ raise TypeArgumentError, "Wrong type class: #{type.class}"
96
+ end
97
+ end
98
+
99
+ # Returns the type in string format, as "A" or "NS",
100
+ # given the numeric value
101
+ def self.to_str(type)
102
+ case type
103
+ when Fixnum
104
+ if Types.invert.has_key? type
105
+ return Types.invert[type]
106
+ else
107
+ raise TypeArgumentError, "Unknown type number #{type}"
108
+ end
109
+ else
110
+ raise TypeArgumentError, "Wrong type class: #{type.class}"
111
+ end
112
+ end
113
+
114
+ # Gives in output the keys from the +Types+ hash
115
+ # in a format suited for regexps
116
+ def self.regexp
117
+ Types.keys.join("|")
118
+ end
119
+
120
+ # Creates a new object representing an RR type. Performs some
121
+ # checks on the argument validity too. Il +type+ is +nil+, the
122
+ # default value is +ANY+ or the one set with Types.default=
123
+ def initialize(type)
124
+ case type
125
+ when String
126
+ # type in the form "A" or "NS"
127
+ new_from_string(type.upcase)
128
+ when Fixnum
129
+ # type in numeric form
130
+ new_from_num(type)
131
+ when nil
132
+ # default type, control with Types.default=
133
+ @str = Types.invert[@@default]
134
+ @num = @@default
135
+ else
136
+ raise TypeArgumentError, "Wrong type class: #{type.class}"
137
+ end
138
+ end
139
+
140
+ # Returns the type in number format
141
+ # (default for normal use)
142
+ def inspect
143
+ @num
144
+ end
145
+
146
+ # Returns the type in string format,
147
+ # i.d. "A" or "NS" or such a string.
148
+ def to_s
149
+ @str
150
+ end
151
+
152
+ # Returns the type in numeric format,
153
+ # usable by the pack methods for data transfers
154
+ def to_i
155
+ @num.to_i
156
+ end
157
+
158
+ # Should be used only for testing purpouses
159
+ def to_str
160
+ @num.to_s
161
+ end
162
+
163
+ private
164
+
165
+ # Constructor for string data type,
166
+ # *PRIVATE* method
167
+ def new_from_string(type)
168
+ case type
169
+ when /^TYPE\\d+/
170
+ # TODO!!!
171
+ else
172
+ # String with name of type
173
+ if Types.has_key? type
174
+ @str = type
175
+ @num = Types[type]
176
+ else
177
+ raise TypeArgumentError, "Unknown type #{type}"
178
+ end
179
+ end
180
+ end
181
+
182
+ # Contructor for numeric data type
183
+ # *PRIVATE* method
184
+ def new_from_num(type)
185
+ if Types.invert.has_key? type
186
+ @num = type
187
+ @str = Types.invert[type]
188
+ else
189
+ raise TypeArgumentError, "Unkown type number #{type}"
190
+ end
191
+ end
192
+
193
+ end # class Types
194
+
195
+ end # class RR
196
+ end # module DNS
197
+ end # module Net
198
+
199
+ class TypeArgumentError < ArgumentError # :nodoc:
200
+ end