dnsruby 1.55 → 1.56.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +96 -0
  3. data/Rakefile +30 -29
  4. data/demo/axfr.rb +93 -93
  5. data/demo/check_soa.rb +99 -99
  6. data/demo/check_zone.rb +59 -59
  7. data/demo/digdlv.rb +43 -43
  8. data/demo/digroot.rb +34 -34
  9. data/demo/example_recurse.rb +14 -14
  10. data/demo/mresolv.rb +30 -30
  11. data/demo/mx.rb +31 -31
  12. data/demo/rubydig.rb +37 -37
  13. data/demo/to_resolve.txt +3088 -3088
  14. data/demo/trace_dns.rb +46 -46
  15. data/lib/dnsruby.rb +161 -526
  16. data/lib/dnsruby/DNS.rb +305 -0
  17. data/lib/{Dnsruby/Cache.rb → dnsruby/cache.rb} +152 -152
  18. data/lib/{Dnsruby → dnsruby}/code_mapper.rb +48 -52
  19. data/lib/dnsruby/code_mappers.rb +295 -0
  20. data/lib/{Dnsruby/Config.rb → dnsruby/config.rb} +454 -454
  21. data/lib/{Dnsruby → dnsruby}/dnssec.rb +91 -91
  22. data/lib/{Dnsruby/Hosts.rb → dnsruby/hosts.rb} +125 -125
  23. data/lib/{Dnsruby → dnsruby}/ipv4.rb +26 -26
  24. data/lib/{Dnsruby → dnsruby}/ipv6.rb +42 -42
  25. data/lib/{Dnsruby → dnsruby}/key_cache.rb +29 -29
  26. data/lib/dnsruby/message/decoder.rb +164 -0
  27. data/lib/dnsruby/message/encoder.rb +75 -0
  28. data/lib/dnsruby/message/header.rb +249 -0
  29. data/lib/dnsruby/message/message.rb +629 -0
  30. data/lib/dnsruby/message/question.rb +86 -0
  31. data/lib/dnsruby/message/section.rb +96 -0
  32. data/lib/{Dnsruby → dnsruby}/name.rb +141 -141
  33. data/lib/dnsruby/packet_sender.rb +661 -0
  34. data/lib/{Dnsruby/Recursor.rb → dnsruby/recursor.rb} +235 -233
  35. data/lib/dnsruby/resolv.rb +113 -0
  36. data/lib/dnsruby/resolver.rb +1192 -0
  37. data/lib/dnsruby/resource/A.rb +56 -0
  38. data/lib/dnsruby/resource/AAAA.rb +54 -0
  39. data/lib/{Dnsruby → dnsruby}/resource/AFSDB.rb +68 -68
  40. data/lib/{Dnsruby → dnsruby}/resource/CERT.rb +105 -105
  41. data/lib/{Dnsruby → dnsruby}/resource/DHCID.rb +54 -54
  42. data/lib/dnsruby/resource/DLV.rb +27 -0
  43. data/lib/{Dnsruby → dnsruby}/resource/DNSKEY.rb +372 -372
  44. data/lib/{Dnsruby → dnsruby}/resource/DS.rb +255 -255
  45. data/lib/{Dnsruby → dnsruby}/resource/HINFO.rb +71 -71
  46. data/lib/{Dnsruby → dnsruby}/resource/HIP.rb +29 -29
  47. data/lib/{Dnsruby → dnsruby}/resource/IN.rb +30 -30
  48. data/lib/{Dnsruby → dnsruby}/resource/IPSECKEY.rb +31 -31
  49. data/lib/{Dnsruby → dnsruby}/resource/ISDN.rb +62 -62
  50. data/lib/{Dnsruby → dnsruby}/resource/KX.rb +65 -65
  51. data/lib/{Dnsruby → dnsruby}/resource/LOC.rb +263 -263
  52. data/lib/{Dnsruby → dnsruby}/resource/MINFO.rb +69 -69
  53. data/lib/{Dnsruby → dnsruby}/resource/MX.rb +65 -65
  54. data/lib/{Dnsruby → dnsruby}/resource/NAPTR.rb +98 -98
  55. data/lib/{Dnsruby → dnsruby}/resource/NSAP.rb +171 -171
  56. data/lib/dnsruby/resource/NSEC.rb +275 -0
  57. data/lib/dnsruby/resource/NSEC3.rb +332 -0
  58. data/lib/dnsruby/resource/NSEC3PARAM.rb +135 -0
  59. data/lib/dnsruby/resource/OPT.rb +272 -0
  60. data/lib/{Dnsruby → dnsruby}/resource/PX.rb +70 -70
  61. data/lib/{Dnsruby → dnsruby}/resource/RP.rb +75 -75
  62. data/lib/dnsruby/resource/RR.rb +421 -0
  63. data/lib/dnsruby/resource/RRSIG.rb +275 -0
  64. data/lib/dnsruby/resource/RRSet.rb +190 -0
  65. data/lib/{Dnsruby → dnsruby}/resource/RT.rb +67 -67
  66. data/lib/{Dnsruby → dnsruby}/resource/SOA.rb +94 -94
  67. data/lib/dnsruby/resource/SPF.rb +29 -0
  68. data/lib/dnsruby/resource/SRV.rb +112 -0
  69. data/lib/{Dnsruby → dnsruby}/resource/SSHFP.rb +14 -14
  70. data/lib/dnsruby/resource/TKEY.rb +163 -0
  71. data/lib/dnsruby/resource/TSIG.rb +593 -0
  72. data/lib/{Dnsruby → dnsruby}/resource/TXT.rb +191 -191
  73. data/lib/dnsruby/resource/X25.rb +55 -0
  74. data/lib/{Dnsruby → dnsruby}/resource/domain_name.rb +25 -25
  75. data/lib/{Dnsruby → dnsruby}/resource/generic.rb +80 -80
  76. data/lib/dnsruby/resource/resource.rb +25 -0
  77. data/lib/{Dnsruby → dnsruby}/select_thread.rb +148 -148
  78. data/lib/{Dnsruby/SingleResolver.rb → dnsruby/single_resolver.rb} +60 -60
  79. data/lib/{Dnsruby → dnsruby}/single_verifier.rb +344 -344
  80. data/lib/dnsruby/the_log.rb +44 -0
  81. data/lib/dnsruby/update.rb +278 -0
  82. data/lib/dnsruby/validator_thread.rb +124 -0
  83. data/lib/dnsruby/version.rb +3 -0
  84. data/lib/{Dnsruby → dnsruby}/zone_reader.rb +93 -93
  85. data/lib/{Dnsruby → dnsruby}/zone_transfer.rb +377 -377
  86. data/test/spec_helper.rb +16 -0
  87. data/test/tc_axfr.rb +31 -34
  88. data/test/tc_cache.rb +32 -32
  89. data/test/tc_dlv.rb +28 -28
  90. data/test/tc_dns.rb +73 -76
  91. data/test/tc_dnskey.rb +31 -32
  92. data/test/tc_dnsruby.rb +50 -44
  93. data/test/tc_ds.rb +36 -36
  94. data/test/tc_escapedchars.rb +252 -255
  95. data/test/tc_hash.rb +17 -21
  96. data/test/tc_header.rb +48 -57
  97. data/test/tc_hip.rb +19 -22
  98. data/test/tc_ipseckey.rb +18 -21
  99. data/test/tc_keith.rb +300 -0
  100. data/test/tc_message.rb +87 -0
  101. data/test/tc_misc.rb +83 -87
  102. data/test/tc_name.rb +81 -84
  103. data/test/tc_naptr.rb +18 -21
  104. data/test/tc_nsec.rb +55 -55
  105. data/test/tc_nsec3.rb +23 -24
  106. data/test/tc_nsec3param.rb +20 -21
  107. data/test/tc_packet.rb +90 -93
  108. data/test/tc_packet_unique_push.rb +48 -51
  109. data/test/tc_question.rb +30 -33
  110. data/test/tc_queue.rb +16 -17
  111. data/test/tc_recur.rb +16 -17
  112. data/test/tc_res_config.rb +38 -41
  113. data/test/tc_res_env.rb +29 -32
  114. data/test/tc_res_file.rb +26 -29
  115. data/test/tc_res_opt.rb +62 -65
  116. data/test/tc_resolver.rb +287 -242
  117. data/test/tc_rr-opt.rb +70 -63
  118. data/test/tc_rr-txt.rb +68 -71
  119. data/test/tc_rr-unknown.rb +45 -48
  120. data/test/tc_rr.rb +76 -70
  121. data/test/tc_rrset.rb +21 -22
  122. data/test/tc_rrsig.rb +19 -20
  123. data/test/tc_single_resolver.rb +294 -297
  124. data/test/tc_soak.rb +199 -202
  125. data/test/tc_soak_base.rb +29 -34
  126. data/test/tc_sshfp.rb +20 -23
  127. data/test/tc_tcp.rb +32 -35
  128. data/test/tc_tkey.rb +41 -44
  129. data/test/tc_tsig.rb +81 -84
  130. data/test/tc_update.rb +108 -111
  131. data/test/tc_validator.rb +29 -29
  132. data/test/tc_verifier.rb +81 -82
  133. data/test/ts_dnsruby.rb +16 -15
  134. data/test/ts_offline.rb +62 -63
  135. data/test/ts_online.rb +115 -115
  136. metadata +155 -90
  137. data/README +0 -59
  138. data/lib/Dnsruby/DNS.rb +0 -305
  139. data/lib/Dnsruby/PacketSender.rb +0 -656
  140. data/lib/Dnsruby/Resolver.rb +0 -1189
  141. data/lib/Dnsruby/TheLog.rb +0 -44
  142. data/lib/Dnsruby/message.rb +0 -1230
  143. data/lib/Dnsruby/resource/A.rb +0 -56
  144. data/lib/Dnsruby/resource/AAAA.rb +0 -54
  145. data/lib/Dnsruby/resource/DLV.rb +0 -27
  146. data/lib/Dnsruby/resource/NSEC.rb +0 -298
  147. data/lib/Dnsruby/resource/NSEC3.rb +0 -340
  148. data/lib/Dnsruby/resource/NSEC3PARAM.rb +0 -135
  149. data/lib/Dnsruby/resource/OPT.rb +0 -213
  150. data/lib/Dnsruby/resource/RRSIG.rb +0 -275
  151. data/lib/Dnsruby/resource/SPF.rb +0 -29
  152. data/lib/Dnsruby/resource/SRV.rb +0 -112
  153. data/lib/Dnsruby/resource/TKEY.rb +0 -163
  154. data/lib/Dnsruby/resource/TSIG.rb +0 -593
  155. data/lib/Dnsruby/resource/X25.rb +0 -55
  156. data/lib/Dnsruby/resource/resource.rb +0 -678
  157. data/lib/Dnsruby/update.rb +0 -278
  158. data/lib/Dnsruby/validator_thread.rb +0 -124
@@ -0,0 +1,44 @@
1
+ # --
2
+ # Copyright 2007 Nominet UK
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ # ++
16
+ require 'logger'
17
+ require 'singleton'
18
+ require 'thread'
19
+ module Dnsruby
20
+ # This class exists for backwards compatibility.
21
+ #
22
+ # It's Logger (which defaults to STDOUT, level FATAL) can be configured, or a new Logger can be supplied.
23
+ #
24
+ # Dnsruby::TheLog.level=Logger::DEBUG
25
+ # Dnsruby::TheLog.debug("Debug message")
26
+ #
27
+ class TheLog
28
+ # Set a new Logger for use by Dnsruby
29
+ def set_logger(logger)
30
+ Dnsruby.log = logger
31
+ end
32
+ # Change the Logger level.
33
+ def level=(level)
34
+ Dnsruby.log.level = level
35
+ end
36
+ def level
37
+ return Dnsruby.log.level
38
+ end
39
+
40
+ def self.method_missing(symbol, *args) #:nodoc: all
41
+ Dnsruby.log.send(symbol, *args)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,278 @@
1
+ # --
2
+ # Copyright 2007 Nominet UK
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ # ++
16
+ module Dnsruby
17
+ # Dnsruby::Update is a subclass of Dnsruby::Packet,
18
+ # to be used for making DNS dynamic updates. Programmers
19
+ # should refer to RFC 2136 for the semantics of dynamic updates.
20
+
21
+ # The first example below shows a complete program; subsequent examples
22
+ # show only the creation of the update packet.
23
+ #
24
+ # == Add a new host
25
+ #
26
+ # require 'Dnsruby'
27
+ #
28
+ # # Create the update packet.
29
+ # update = Dnsruby::Update.new('example.com')
30
+ #
31
+ # # Prerequisite is that no A records exist for the name.
32
+ # update.absent('foo.example.com.', 'A')
33
+ #
34
+ # # Add two A records for the name.
35
+ # update.add('foo.example.com.', 'A', 86400, '192.168.1.2')
36
+ # update.add('foo.example.com.', 'A', 86400, '172.16.3.4')
37
+ #
38
+ # # Send the update to the zone's primary master.
39
+ # res = Dnsruby::Resolver.new({:nameserver => 'primary-master.example.com'})
40
+ #
41
+ # begin
42
+ # reply = res.send_message(update)
43
+ # print "Update succeeded\n"
44
+ # rescue Exception => e
45
+ # print 'Update failed: #{e}\n'
46
+ # end
47
+ #
48
+ # == Add an MX record for a name that already exists
49
+ #
50
+ # update = Dnsruby::Update.new('example.com')
51
+ # update.present('example.com')
52
+ # update.add('example.com', Dnsruby::Types.MX, 10, 'mailhost.example.com')
53
+ #
54
+ # == Add a TXT record for a name that doesn't exist
55
+ #
56
+ # update = Dnsruby::Update.new('example.com')
57
+ # update.absent('info.example.com')
58
+ # update.add('info.example.com', Types.TXT, 86400, "yabba dabba doo"')
59
+ #
60
+ # == Delete all A records for a name
61
+ #
62
+ # update = Dnsruby::Update.new('example.com')
63
+ # update.present('foo.example.com', 'A')
64
+ # update.delete('foo.example.com', 'A')
65
+ #
66
+ # == Delete all RRs for a name
67
+ #
68
+ # update = Dnsruby::Update.new('example.com')
69
+ # update.present('byebye.example.com')
70
+ # update.delete('byebye.example.com')
71
+ #
72
+ # == Perform a signed update
73
+ #
74
+ # key_name = 'tsig-key'
75
+ # key = 'awwLOtRfpGE+rRKF2+DEiw=='
76
+ #
77
+ # update = Dnsruby::Update.new('example.com')
78
+ # update.add('foo.example.com', 'A', 86400, 10.1.2.3'))
79
+ # update.add('bar.example.com', 'A', 86400, 10.4.5.6'))
80
+ # res.tsig=(key_name,key)
81
+ #
82
+ class Update < Message
83
+ # Returns a Dnsruby::Update object suitable for performing a DNS
84
+ # dynamic update. Specifically, it creates a message with the header
85
+ # opcode set to UPDATE and the zone record type to SOA (per RFC 2136,
86
+ # Section 2.3).
87
+ #
88
+ # Programs must use the push method to add RRs to the prerequisite,
89
+ # update, and additional sections before performing the update.
90
+ #
91
+ # Arguments are the zone name and the class. If the zone is omitted,
92
+ # the default domain will be taken from the resolver configuration.
93
+ # If the class is omitted, it defaults to IN.
94
+ # packet = Dnsruby::Update.new
95
+ # packet = Dnsruby::Update.new('example.com')
96
+ # packet = Dnsruby::Update.new('example.com', 'HS')
97
+ #
98
+ def initialize(zone=nil, klass=nil)
99
+
100
+ # sort out the zone section (RFC2136, section 2.3)
101
+ if (zone==nil)
102
+ config = Config.new
103
+ zone = (config.search)[0]
104
+ return unless zone
105
+ end
106
+
107
+ type = 'SOA'
108
+ klass ||= 'IN'
109
+
110
+ super(zone, type, klass) || return
111
+
112
+ @header.opcode=('UPDATE')
113
+ @header.rd=(0)
114
+ @do_validation = false
115
+ end
116
+
117
+ # Ways to create the prerequisite records (exists, notexists, inuse, etc. - RFC2136, section 2.4)
118
+ #
119
+ # (1) RRset exists (value independent). At least one RR with a
120
+ # specified NAME and TYPE (in the zone and class specified by
121
+ # the Zone Section) must exist.
122
+ #
123
+ # update.present(name, type)
124
+ #
125
+ # (2) RRset exists (value dependent). A set of RRs with a
126
+ # specified NAME and TYPE exists and has the same members
127
+ # with the same RDATAs as the RRset specified here in this
128
+ # Section.
129
+ #
130
+ # update.present(name, type, rdata)
131
+ #
132
+ # (4) Name is in use. At least one RR with a specified NAME (in
133
+ # the zone and class specified by the Zone Section) must exist.
134
+ # Note that this prerequisite is NOT satisfied by empty
135
+ # nonterminals.
136
+ #
137
+ # update.present(name)
138
+ def present(*args)
139
+ ttl = 0
140
+ rdata = ""
141
+ klass = Classes.ANY
142
+ if (args.length>=1) # domain (RFC2136, Section 2.4.4)
143
+ name = args[0]
144
+ type = Types.ANY
145
+ if (args.length>=2) # RRSET (RFC2136, Section 2.4.1)
146
+ type = args[1]
147
+ end
148
+ if (args.length > 2) # RRSET (RFC2136, Section 2.4.2)
149
+ klass = zone()[0].zclass
150
+ rdata=args[2]
151
+ end
152
+ rec = RR.create("#{name} #{ttl} #{klass} #{type} #{rdata}")
153
+ add_pre(rec)
154
+ return rec
155
+ else
156
+ raise ArgumentError.new("Wrong number of arguments (#{args.length} for 1 or 2) for Update#absent")
157
+ end
158
+ end
159
+
160
+ # Ways to create the prerequisite records (exists, notexists, inuse, etc. - RFC2136, section 2.4)
161
+ # Can be called with one arg :
162
+ #
163
+ # update.absent(name)
164
+ # (5) Name is not in use. No RR of any type is owned by a
165
+ # specified NAME. Note that this prerequisite IS satisfied by
166
+ # empty nonterminals.
167
+ #
168
+ # Or with two :
169
+ #
170
+ # update.absent(name, type)
171
+ # (3) RRset does not exist. No RRs with a specified NAME and TYPE
172
+ # (in the zone and class denoted by the Zone Section) can exist.
173
+ #
174
+ def absent(*args)
175
+ ttl = 0
176
+ rdata = ""
177
+ klass = Classes.NONE
178
+ if (args.length>=1) # domain (RFC2136, Section 2.4.5)
179
+ name = args[0]
180
+ type = Types.ANY
181
+ if (args.length==2) # RRSET (RFC2136, Section 2.4.3)
182
+ type = args[1]
183
+ end
184
+ rec = RR.create("#{name} #{ttl} #{klass} #{type} #{rdata}")
185
+ add_pre(rec)
186
+ return rec
187
+ else
188
+ raise ArgumentError.new("Wrong number of arguments (#{args.length} for 1 or 2) for Update#absent")
189
+ end
190
+ end
191
+
192
+ # Ways to create the update records (add, delete, RFC2136, section 2.5)
193
+ # " 2.5.1 - Add To An RRset
194
+ #
195
+ # RRs are added to the Update Section whose NAME, TYPE, TTL, RDLENGTH
196
+ # and RDATA are those being added, and CLASS is the same as the zone
197
+ # class. Any duplicate RRs will be silently ignored by the primary
198
+ # master."
199
+ #
200
+ # update.add(rr)
201
+ # update.add([rr1, rr2])
202
+ # update.add(name, type, ttl, rdata)
203
+ #
204
+ def add(*args)
205
+ zoneclass=zone()[0].zclass
206
+ case args[0]
207
+ when Array
208
+ args[0].each do |resource|
209
+ add(resource)
210
+ end
211
+ when RR
212
+ # Make sure that the Class is the same as the zone
213
+ resource = args[0]
214
+ if (resource.klass != zoneclass)
215
+ raise ArgumentError.new("Wrong class #{resource.klass} for update (should be #{zoneclass})!")
216
+ end
217
+ add_update(resource)
218
+ return resource
219
+ else
220
+ name=args[0]
221
+ type=args[1]
222
+ ttl=args[2]
223
+ rdata=args[3]
224
+ resource = nil
225
+ if (Types.new(type) == Types.TXT)
226
+ instring = "#{name} #{ttl} #{zoneclass} #{type} ";
227
+ if (String === rdata)
228
+ instring += " '#{rdata}'"
229
+ elsif (Array === rdata)
230
+ rdata.length.times {|rcounter|
231
+ instring += " '#{rdata[rcounter]}' "
232
+ }
233
+ else
234
+ instring += rdata
235
+ end
236
+ resource = RR.create(instring)
237
+ else
238
+ resource = RR.create("#{name} #{ttl} #{zoneclass} #{type} #{rdata}")
239
+ end
240
+ add_update(resource)
241
+ return resource
242
+ end
243
+ # @TODO@ Should be able to take RRSet!
244
+ end
245
+
246
+ # Ways to create the update records (add, delete, RFC2136, section 2.5)
247
+ #
248
+ # 2.5.2 - Delete An RRset
249
+ # update.delete(name, type)
250
+ #
251
+ #
252
+ # 2.5.3 - Delete All RRsets From A Name
253
+ # update.delete(name)
254
+ #
255
+ # 2.5.4 - Delete An RR From An RRset
256
+ # update.delete(name, type, rdata)
257
+ #
258
+ def delete(*args)
259
+ ttl = 0
260
+ klass = Classes.ANY
261
+ rdata=""
262
+ resource = nil
263
+ case args.length
264
+ when 1 # name
265
+ resource = RR.create("#{args[0]} #{ttl} #{klass} #{Types.ANY} #{rdata}")
266
+ add_update(resource)
267
+ when 2 # name, type
268
+ resource = RR.create("#{args[0]} #{ttl} #{klass} #{args[1]} #{rdata}")
269
+ add_update(resource)
270
+ when 3 # name, type, rdata
271
+ resource = RR.create("#{args[0]} #{ttl} IN #{args[1]} #{args[2]}")
272
+ resource.klass = Classes.NONE
273
+ add_update(resource)
274
+ end
275
+ return resource
276
+ end
277
+ end
278
+ end
@@ -0,0 +1,124 @@
1
+ # --
2
+ # Copyright 2007 Nominet UK
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ # ++
16
+
17
+ module Dnsruby
18
+ # Takes care of the validation for the SelectThread. If queries need to be
19
+ # made in order to validate the response, then a separate thread is fired up
20
+ # to do this.
21
+ class ValidatorThread # :nodoc: all
22
+ # include Singleton
23
+ def initialize(*args)
24
+ @client_id, @client_queue, @response, @error, @query, @st, @res = args
25
+ # Create the validation thread, and a queue to receive validation requests
26
+ # Actually, need to have a thread per validator, as they make recursive calls.
27
+ # @@mutex = Mutex.new
28
+ # @@validation_queue = Queue.new
29
+ # @@validator_thread = Thread.new{
30
+ # do_validate
31
+ # }
32
+ end
33
+ def run
34
+ # ONLY START THE NEW THREAD IF VALIDATION NEED OCCUR!!
35
+ if (should_validate)
36
+ Thread.new{
37
+ do_validate
38
+ }
39
+ else
40
+ do_validate
41
+ end
42
+ end
43
+
44
+
45
+ # def add_to_queue(item)
46
+ # print "ADding to validator queue\n"
47
+ # # @@mutex.synchronize{
48
+ # @@validation_queue.push(item)
49
+ # # }
50
+ # end
51
+ def do_validate
52
+ # while (true)
53
+ # item = nil
54
+ # print "Waiting to pop validation item\n"
55
+ # # @@mutex.synchronize{
56
+ # item = @@validation_queue.pop
57
+ # # }
58
+ # print "Popped validation request\n"
59
+ # client_id, client_queue, response, err, query, st, res = item
60
+ validated_ok = validate(@query, @response, @res)
61
+
62
+ validated_ok = false if (@error && !(NXDomain === @error))
63
+
64
+ cache_if_valid(@query, @response)
65
+
66
+ # Now send the response back to the client...
67
+ # print "#{Time.now} : Got result for #{@query.question()[0].qname}, #{@query.question()[0].qtype}\n"
68
+ if (validated_ok)
69
+ @st.push_validation_response_to_select(@client_id, @client_queue, @response, nil, @query, @res)
70
+ else
71
+ @st.push_validation_response_to_select(@client_id, @client_queue, @response,
72
+ @response.security_error, @query, @res)
73
+ end
74
+
75
+
76
+ # end
77
+ end
78
+
79
+
80
+ def should_validate
81
+ return ValidatorThread.requires_validation?(@query, @response, @error, @res)
82
+ end
83
+
84
+ def ValidatorThread.requires_validation?(query, response, error, res)
85
+ # @error will be nil for DNS RCODE errors - it will be true for TsigError. really?!
86
+ if ((!error || (error.instance_of?NXDomain)) && query.do_validation)
87
+ if (res.dnssec)
88
+ if (response.security_level != Message::SecurityLevel::SECURE)
89
+ return true
90
+ end
91
+ end
92
+ end
93
+ return false
94
+
95
+ end
96
+
97
+ def validate(query, response, res)
98
+ if (should_validate)
99
+ begin
100
+ # So, we really need to be able to take the response out of the select thread, along
101
+ # with the responsibility for sending the answer to the client.
102
+ # Should we have a validator thread? Or a thread per validation?
103
+ # Then, select thread gets response. It performs basic checks here.
104
+ # After basic checks, the select-thread punts the response (along with queues, etc.)
105
+ # to the validator thread.
106
+ # The validator validates it (or just releases it with no validation), and then
107
+ # sends the request to the client via the client queue.
108
+ Dnssec.validate_with_query(query,response)
109
+ return true
110
+ rescue VerifyError => e
111
+ response.security_error = e
112
+ # Response security_level should already be set
113
+ return false
114
+ end
115
+ end
116
+ return true
117
+ end
118
+
119
+ def cache_if_valid(query, response)
120
+ return if @error
121
+ PacketSender.cache(query, response)
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,3 @@
1
+ module Dnsruby
2
+ VERSION = '1.56.0'
3
+ end