Dnsruby 0.5.0

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.
Files changed (419) hide show
  1. data/README +34 -0
  2. data/doc/classes/Dnsruby/Classes.html +197 -0
  3. data/doc/classes/Dnsruby/Classes.src/M000157.html +23 -0
  4. data/doc/classes/Dnsruby/Classes.src/M000158.html +19 -0
  5. data/doc/classes/Dnsruby/CodeMapper.html +370 -0
  6. data/doc/classes/Dnsruby/CodeMapper.src/M000130.html +18 -0
  7. data/doc/classes/Dnsruby/CodeMapper.src/M000131.html +33 -0
  8. data/doc/classes/Dnsruby/CodeMapper.src/M000132.html +21 -0
  9. data/doc/classes/Dnsruby/CodeMapper.src/M000133.html +19 -0
  10. data/doc/classes/Dnsruby/CodeMapper.src/M000134.html +19 -0
  11. data/doc/classes/Dnsruby/CodeMapper.src/M000135.html +18 -0
  12. data/doc/classes/Dnsruby/CodeMapper.src/M000136.html +22 -0
  13. data/doc/classes/Dnsruby/CodeMapper.src/M000137.html +22 -0
  14. data/doc/classes/Dnsruby/CodeMapper.src/M000138.html +22 -0
  15. data/doc/classes/Dnsruby/CodeMapper.src/M000139.html +31 -0
  16. data/doc/classes/Dnsruby/CodeMapper.src/M000140.html +19 -0
  17. data/doc/classes/Dnsruby/Config.html +410 -0
  18. data/doc/classes/Dnsruby/Config.src/M000098.html +18 -0
  19. data/doc/classes/Dnsruby/Config.src/M000099.html +19 -0
  20. data/doc/classes/Dnsruby/Config.src/M000100.html +19 -0
  21. data/doc/classes/Dnsruby/Config.src/M000101.html +21 -0
  22. data/doc/classes/Dnsruby/Config.src/M000102.html +21 -0
  23. data/doc/classes/Dnsruby/Config.src/M000103.html +38 -0
  24. data/doc/classes/Dnsruby/Config.src/M000104.html +26 -0
  25. data/doc/classes/Dnsruby/Config.src/M000105.html +22 -0
  26. data/doc/classes/Dnsruby/Config.src/M000106.html +23 -0
  27. data/doc/classes/Dnsruby/Config.src/M000107.html +22 -0
  28. data/doc/classes/Dnsruby/Config.src/M000108.html +18 -0
  29. data/doc/classes/Dnsruby/DNS/DecodeError.html +111 -0
  30. data/doc/classes/Dnsruby/DNS/EncodeError.html +111 -0
  31. data/doc/classes/Dnsruby/DNS.html +469 -0
  32. data/doc/classes/Dnsruby/DNS.src/M000196.html +24 -0
  33. data/doc/classes/Dnsruby/DNS.src/M000197.html +18 -0
  34. data/doc/classes/Dnsruby/DNS.src/M000198.html +18 -0
  35. data/doc/classes/Dnsruby/DNS.src/M000199.html +20 -0
  36. data/doc/classes/Dnsruby/DNS.src/M000200.html +19 -0
  37. data/doc/classes/Dnsruby/DNS.src/M000201.html +20 -0
  38. data/doc/classes/Dnsruby/DNS.src/M000202.html +18 -0
  39. data/doc/classes/Dnsruby/DNS.src/M000203.html +19 -0
  40. data/doc/classes/Dnsruby/DNS.src/M000204.html +20 -0
  41. data/doc/classes/Dnsruby/DNS.src/M000205.html +28 -0
  42. data/doc/classes/Dnsruby/DNS.src/M000206.html +19 -0
  43. data/doc/classes/Dnsruby/DNS.src/M000207.html +20 -0
  44. data/doc/classes/Dnsruby/DNS.src/M000208.html +41 -0
  45. data/doc/classes/Dnsruby/DNS.src/M000209.html +32 -0
  46. data/doc/classes/Dnsruby/DNS.src/M000210.html +50 -0
  47. data/doc/classes/Dnsruby/DNSSEC/Algorithms.html +154 -0
  48. data/doc/classes/Dnsruby/DNSSEC.html +111 -0
  49. data/doc/classes/Dnsruby/DecodeError.html +111 -0
  50. data/doc/classes/Dnsruby/EncodeError.html +111 -0
  51. data/doc/classes/Dnsruby/FormErr.html +113 -0
  52. data/doc/classes/Dnsruby/Header.html +516 -0
  53. data/doc/classes/Dnsruby/Header.src/M000168.html +35 -0
  54. data/doc/classes/Dnsruby/Header.src/M000169.html +18 -0
  55. data/doc/classes/Dnsruby/Header.src/M000170.html +18 -0
  56. data/doc/classes/Dnsruby/Header.src/M000171.html +21 -0
  57. data/doc/classes/Dnsruby/Header.src/M000172.html +20 -0
  58. data/doc/classes/Dnsruby/Header.src/M000173.html +32 -0
  59. data/doc/classes/Dnsruby/Header.src/M000174.html +26 -0
  60. data/doc/classes/Dnsruby/Header.src/M000175.html +47 -0
  61. data/doc/classes/Dnsruby/Header.src/M000176.html +28 -0
  62. data/doc/classes/Dnsruby/Header.src/M000177.html +18 -0
  63. data/doc/classes/Dnsruby/Header.src/M000178.html +18 -0
  64. data/doc/classes/Dnsruby/Header.src/M000179.html +30 -0
  65. data/doc/classes/Dnsruby/Hosts.html +305 -0
  66. data/doc/classes/Dnsruby/Hosts.src/M000141.html +20 -0
  67. data/doc/classes/Dnsruby/Hosts.src/M000142.html +49 -0
  68. data/doc/classes/Dnsruby/Hosts.src/M000143.html +19 -0
  69. data/doc/classes/Dnsruby/Hosts.src/M000144.html +20 -0
  70. data/doc/classes/Dnsruby/Hosts.src/M000145.html +21 -0
  71. data/doc/classes/Dnsruby/Hosts.src/M000146.html +19 -0
  72. data/doc/classes/Dnsruby/Hosts.src/M000147.html +20 -0
  73. data/doc/classes/Dnsruby/Hosts.src/M000148.html +21 -0
  74. data/doc/classes/Dnsruby/IPv4.html +298 -0
  75. data/doc/classes/Dnsruby/IPv4.src/M000149.html +32 -0
  76. data/doc/classes/Dnsruby/IPv4.src/M000150.html +21 -0
  77. data/doc/classes/Dnsruby/IPv4.src/M000151.html +18 -0
  78. data/doc/classes/Dnsruby/IPv4.src/M000152.html +18 -0
  79. data/doc/classes/Dnsruby/IPv4.src/M000153.html +19 -0
  80. data/doc/classes/Dnsruby/IPv4.src/M000154.html +18 -0
  81. data/doc/classes/Dnsruby/IPv4.src/M000155.html +18 -0
  82. data/doc/classes/Dnsruby/IPv4.src/M000156.html +18 -0
  83. data/doc/classes/Dnsruby/IPv6.html +318 -0
  84. data/doc/classes/Dnsruby/IPv6.src/M000180.html +60 -0
  85. data/doc/classes/Dnsruby/IPv6.src/M000181.html +21 -0
  86. data/doc/classes/Dnsruby/IPv6.src/M000182.html +22 -0
  87. data/doc/classes/Dnsruby/IPv6.src/M000183.html +18 -0
  88. data/doc/classes/Dnsruby/IPv6.src/M000184.html +21 -0
  89. data/doc/classes/Dnsruby/IPv6.src/M000185.html +18 -0
  90. data/doc/classes/Dnsruby/IPv6.src/M000186.html +18 -0
  91. data/doc/classes/Dnsruby/IPv6.src/M000187.html +18 -0
  92. data/doc/classes/Dnsruby/Message.html +689 -0
  93. data/doc/classes/Dnsruby/Message.src/M000076.html +34 -0
  94. data/doc/classes/Dnsruby/Message.src/M000077.html +26 -0
  95. data/doc/classes/Dnsruby/Message.src/M000078.html +22 -0
  96. data/doc/classes/Dnsruby/Message.src/M000079.html +20 -0
  97. data/doc/classes/Dnsruby/Message.src/M000080.html +20 -0
  98. data/doc/classes/Dnsruby/Message.src/M000081.html +20 -0
  99. data/doc/classes/Dnsruby/Message.src/M000082.html +20 -0
  100. data/doc/classes/Dnsruby/Message.src/M000083.html +20 -0
  101. data/doc/classes/Dnsruby/Message.src/M000084.html +21 -0
  102. data/doc/classes/Dnsruby/Message.src/M000085.html +20 -0
  103. data/doc/classes/Dnsruby/Message.src/M000086.html +18 -0
  104. data/doc/classes/Dnsruby/Message.src/M000087.html +54 -0
  105. data/doc/classes/Dnsruby/Message.src/M000088.html +42 -0
  106. data/doc/classes/Dnsruby/Message.src/M000089.html +45 -0
  107. data/doc/classes/Dnsruby/MetaTypes.html +136 -0
  108. data/doc/classes/Dnsruby/Modes.html +171 -0
  109. data/doc/classes/Dnsruby/NXDomain.html +113 -0
  110. data/doc/classes/Dnsruby/Name/Label.html +300 -0
  111. data/doc/classes/Dnsruby/Name/Label.src/M000067.html +21 -0
  112. data/doc/classes/Dnsruby/Name/Label.src/M000068.html +18 -0
  113. data/doc/classes/Dnsruby/Name/Label.src/M000069.html +22 -0
  114. data/doc/classes/Dnsruby/Name/Label.src/M000070.html +18 -0
  115. data/doc/classes/Dnsruby/Name/Label.src/M000071.html +18 -0
  116. data/doc/classes/Dnsruby/Name/Label.src/M000072.html +18 -0
  117. data/doc/classes/Dnsruby/Name/Label.src/M000073.html +18 -0
  118. data/doc/classes/Dnsruby/Name/Label.src/M000074.html +18 -0
  119. data/doc/classes/Dnsruby/Name/Label.src/M000075.html +18 -0
  120. data/doc/classes/Dnsruby/Name.html +357 -0
  121. data/doc/classes/Dnsruby/Name.src/M000057.html +28 -0
  122. data/doc/classes/Dnsruby/Name.src/M000058.html +20 -0
  123. data/doc/classes/Dnsruby/Name.src/M000059.html +18 -0
  124. data/doc/classes/Dnsruby/Name.src/M000060.html +18 -0
  125. data/doc/classes/Dnsruby/Name.src/M000061.html +21 -0
  126. data/doc/classes/Dnsruby/Name.src/M000062.html +19 -0
  127. data/doc/classes/Dnsruby/Name.src/M000064.html +22 -0
  128. data/doc/classes/Dnsruby/Name.src/M000065.html +18 -0
  129. data/doc/classes/Dnsruby/Name.src/M000066.html +20 -0
  130. data/doc/classes/Dnsruby/NotImp.html +113 -0
  131. data/doc/classes/Dnsruby/OpCode.html +146 -0
  132. data/doc/classes/Dnsruby/OtherResolvError.html +113 -0
  133. data/doc/classes/Dnsruby/QTypes.html +146 -0
  134. data/doc/classes/Dnsruby/Question.html +256 -0
  135. data/doc/classes/Dnsruby/Question.src/M000166.html +47 -0
  136. data/doc/classes/Dnsruby/Question.src/M000167.html +18 -0
  137. data/doc/classes/Dnsruby/RCode.html +211 -0
  138. data/doc/classes/Dnsruby/RR/ANY.html +133 -0
  139. data/doc/classes/Dnsruby/RR/CERT/CertificateTypes.html +169 -0
  140. data/doc/classes/Dnsruby/RR/CERT.html +180 -0
  141. data/doc/classes/Dnsruby/RR/CNAME.html +150 -0
  142. data/doc/classes/Dnsruby/RR/DNAME.html +150 -0
  143. data/doc/classes/Dnsruby/RR/DomainName.html +175 -0
  144. data/doc/classes/Dnsruby/RR/DomainName.src/M000051.html +22 -0
  145. data/doc/classes/Dnsruby/RR/Generic.html +156 -0
  146. data/doc/classes/Dnsruby/RR/Generic.src/M000041.html +25 -0
  147. data/doc/classes/Dnsruby/RR/HINFO.html +155 -0
  148. data/doc/classes/Dnsruby/RR/IN/A.html +199 -0
  149. data/doc/classes/Dnsruby/RR/IN/A.src/M000018.html +18 -0
  150. data/doc/classes/Dnsruby/RR/IN/A.src/M000019.html +18 -0
  151. data/doc/classes/Dnsruby/RR/IN/A.src/M000020.html +18 -0
  152. data/doc/classes/Dnsruby/RR/IN/AAAA.html +138 -0
  153. data/doc/classes/Dnsruby/RR/IN/AFSDB.html +145 -0
  154. data/doc/classes/Dnsruby/RR/IN/PX.html +143 -0
  155. data/doc/classes/Dnsruby/RR/IN/SRV.html +243 -0
  156. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000015.html +29 -0
  157. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000016.html +26 -0
  158. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000017.html +22 -0
  159. data/doc/classes/Dnsruby/RR/IN/WKS.html +166 -0
  160. data/doc/classes/Dnsruby/RR/IN/WKS.src/M000021.html +20 -0
  161. data/doc/classes/Dnsruby/RR/IN.html +155 -0
  162. data/doc/classes/Dnsruby/RR/ISDN.html +155 -0
  163. data/doc/classes/Dnsruby/RR/LOC.html +395 -0
  164. data/doc/classes/Dnsruby/RR/LOC.src/M000025.html +32 -0
  165. data/doc/classes/Dnsruby/RR/LOC.src/M000026.html +23 -0
  166. data/doc/classes/Dnsruby/RR/LOC.src/M000027.html +25 -0
  167. data/doc/classes/Dnsruby/RR/LOC.src/M000028.html +21 -0
  168. data/doc/classes/Dnsruby/RR/LOC.src/M000029.html +20 -0
  169. data/doc/classes/Dnsruby/RR/LOC.src/M000030.html +23 -0
  170. data/doc/classes/Dnsruby/RR/MB.html +150 -0
  171. data/doc/classes/Dnsruby/RR/MG.html +150 -0
  172. data/doc/classes/Dnsruby/RR/MINFO.html +156 -0
  173. data/doc/classes/Dnsruby/RR/MR.html +150 -0
  174. data/doc/classes/Dnsruby/RR/MX.html +155 -0
  175. data/doc/classes/Dnsruby/RR/NAPTR.html +190 -0
  176. data/doc/classes/Dnsruby/RR/NS.html +150 -0
  177. data/doc/classes/Dnsruby/RR/NSAP.html +293 -0
  178. data/doc/classes/Dnsruby/RR/NSAP.src/M000053.html +19 -0
  179. data/doc/classes/Dnsruby/RR/NSAP.src/M000054.html +19 -0
  180. data/doc/classes/Dnsruby/RR/NSAP.src/M000055.html +22 -0
  181. data/doc/classes/Dnsruby/RR/NSAP.src/M000056.html +31 -0
  182. data/doc/classes/Dnsruby/RR/PTR.html +132 -0
  183. data/doc/classes/Dnsruby/RR/RP.html +183 -0
  184. data/doc/classes/Dnsruby/RR/RP.src/M000050.html +19 -0
  185. data/doc/classes/Dnsruby/RR/RT.html +155 -0
  186. data/doc/classes/Dnsruby/RR/SOA.html +230 -0
  187. data/doc/classes/Dnsruby/RR/SOA.src/M000039.html +24 -0
  188. data/doc/classes/Dnsruby/RR/SOA.src/M000040.html +27 -0
  189. data/doc/classes/Dnsruby/RR/SPF.html +138 -0
  190. data/doc/classes/Dnsruby/RR/TKEY.html +285 -0
  191. data/doc/classes/Dnsruby/RR/TKEY.src/M000022.html +19 -0
  192. data/doc/classes/Dnsruby/RR/TKEY.src/M000023.html +29 -0
  193. data/doc/classes/Dnsruby/RR/TKEY.src/M000024.html +30 -0
  194. data/doc/classes/Dnsruby/RR/TSIG.html +416 -0
  195. data/doc/classes/Dnsruby/RR/TSIG.src/M000042.html +22 -0
  196. data/doc/classes/Dnsruby/RR/TSIG.src/M000043.html +71 -0
  197. data/doc/classes/Dnsruby/RR/TSIG.src/M000044.html +34 -0
  198. data/doc/classes/Dnsruby/RR/TSIG.src/M000045.html +37 -0
  199. data/doc/classes/Dnsruby/RR/TSIG.src/M000046.html +31 -0
  200. data/doc/classes/Dnsruby/RR/TSIG.src/M000047.html +34 -0
  201. data/doc/classes/Dnsruby/RR/TSIG.src/M000048.html +22 -0
  202. data/doc/classes/Dnsruby/RR/TSIG.src/M000049.html +29 -0
  203. data/doc/classes/Dnsruby/RR/TXT.html +233 -0
  204. data/doc/classes/Dnsruby/RR/TXT.src/M000034.html +18 -0
  205. data/doc/classes/Dnsruby/RR/TXT.src/M000035.html +18 -0
  206. data/doc/classes/Dnsruby/RR/TXT.src/M000036.html +20 -0
  207. data/doc/classes/Dnsruby/RR/TXT.src/M000037.html +27 -0
  208. data/doc/classes/Dnsruby/RR/TXT.src/M000038.html +25 -0
  209. data/doc/classes/Dnsruby/RR/X25.html +203 -0
  210. data/doc/classes/Dnsruby/RR/X25.src/M000031.html +18 -0
  211. data/doc/classes/Dnsruby/RR/X25.src/M000032.html +18 -0
  212. data/doc/classes/Dnsruby/RR/X25.src/M000033.html +22 -0
  213. data/doc/classes/Dnsruby/RR.html +620 -0
  214. data/doc/classes/Dnsruby/RR.src/M000001.html +18 -0
  215. data/doc/classes/Dnsruby/RR.src/M000002.html +22 -0
  216. data/doc/classes/Dnsruby/RR.src/M000003.html +18 -0
  217. data/doc/classes/Dnsruby/RR.src/M000004.html +18 -0
  218. data/doc/classes/Dnsruby/RR.src/M000005.html +18 -0
  219. data/doc/classes/Dnsruby/RR.src/M000006.html +36 -0
  220. data/doc/classes/Dnsruby/RR.src/M000007.html +100 -0
  221. data/doc/classes/Dnsruby/RR.src/M000008.html +18 -0
  222. data/doc/classes/Dnsruby/RR.src/M000009.html +18 -0
  223. data/doc/classes/Dnsruby/RR.src/M000010.html +22 -0
  224. data/doc/classes/Dnsruby/RR.src/M000011.html +22 -0
  225. data/doc/classes/Dnsruby/RR.src/M000012.html +18 -0
  226. data/doc/classes/Dnsruby/RR.src/M000013.html +22 -0
  227. data/doc/classes/Dnsruby/RR.src/M000014.html +24 -0
  228. data/doc/classes/Dnsruby/RRSet.html +257 -0
  229. data/doc/classes/Dnsruby/RRSet.src/M000159.html +18 -0
  230. data/doc/classes/Dnsruby/RRSet.src/M000160.html +44 -0
  231. data/doc/classes/Dnsruby/RRSet.src/M000161.html +18 -0
  232. data/doc/classes/Dnsruby/RRSet.src/M000162.html +20 -0
  233. data/doc/classes/Dnsruby/RRSet.src/M000163.html +18 -0
  234. data/doc/classes/Dnsruby/RRSet.src/M000164.html +18 -0
  235. data/doc/classes/Dnsruby/RRSet.src/M000165.html +18 -0
  236. data/doc/classes/Dnsruby/Refused.html +113 -0
  237. data/doc/classes/Dnsruby/Resolv.html +400 -0
  238. data/doc/classes/Dnsruby/Resolv.src/M000109.html +18 -0
  239. data/doc/classes/Dnsruby/Resolv.src/M000110.html +18 -0
  240. data/doc/classes/Dnsruby/Resolv.src/M000111.html +18 -0
  241. data/doc/classes/Dnsruby/Resolv.src/M000112.html +18 -0
  242. data/doc/classes/Dnsruby/Resolv.src/M000113.html +18 -0
  243. data/doc/classes/Dnsruby/Resolv.src/M000114.html +18 -0
  244. data/doc/classes/Dnsruby/Resolv.src/M000115.html +18 -0
  245. data/doc/classes/Dnsruby/Resolv.src/M000116.html +19 -0
  246. data/doc/classes/Dnsruby/Resolv.src/M000117.html +20 -0
  247. data/doc/classes/Dnsruby/Resolv.src/M000118.html +29 -0
  248. data/doc/classes/Dnsruby/Resolv.src/M000119.html +19 -0
  249. data/doc/classes/Dnsruby/Resolv.src/M000120.html +20 -0
  250. data/doc/classes/Dnsruby/Resolv.src/M000121.html +25 -0
  251. data/doc/classes/Dnsruby/ResolvError.html +111 -0
  252. data/doc/classes/Dnsruby/ResolvTimeout.html +111 -0
  253. data/doc/classes/Dnsruby/Resolver.html +807 -0
  254. data/doc/classes/Dnsruby/Resolver.src/M000211.html +21 -0
  255. data/doc/classes/Dnsruby/Resolver.src/M000212.html +37 -0
  256. data/doc/classes/Dnsruby/Resolver.src/M000213.html +64 -0
  257. data/doc/classes/Dnsruby/Resolver.src/M000214.html +23 -0
  258. data/doc/classes/Dnsruby/Resolver.src/M000215.html +46 -0
  259. data/doc/classes/Dnsruby/Resolver.src/M000216.html +21 -0
  260. data/doc/classes/Dnsruby/Resolver.src/M000217.html +22 -0
  261. data/doc/classes/Dnsruby/Resolver.src/M000218.html +18 -0
  262. data/doc/classes/Dnsruby/Resolver.src/M000219.html +20 -0
  263. data/doc/classes/Dnsruby/Resolver.src/M000220.html +19 -0
  264. data/doc/classes/Dnsruby/Resolver.src/M000221.html +19 -0
  265. data/doc/classes/Dnsruby/Resolver.src/M000222.html +19 -0
  266. data/doc/classes/Dnsruby/Resolver.src/M000223.html +19 -0
  267. data/doc/classes/Dnsruby/Resolver.src/M000224.html +19 -0
  268. data/doc/classes/Dnsruby/Resolver.src/M000225.html +19 -0
  269. data/doc/classes/Dnsruby/Resolver.src/M000226.html +19 -0
  270. data/doc/classes/Dnsruby/Resolver.src/M000227.html +19 -0
  271. data/doc/classes/Dnsruby/Resolver.src/M000228.html +19 -0
  272. data/doc/classes/Dnsruby/Resolver.src/M000229.html +19 -0
  273. data/doc/classes/Dnsruby/Resolver.src/M000230.html +19 -0
  274. data/doc/classes/Dnsruby/ServFail.html +113 -0
  275. data/doc/classes/Dnsruby/SingleResolver.html +496 -0
  276. data/doc/classes/Dnsruby/SingleResolver.src/M000122.html +18 -0
  277. data/doc/classes/Dnsruby/SingleResolver.src/M000123.html +19 -0
  278. data/doc/classes/Dnsruby/SingleResolver.src/M000124.html +49 -0
  279. data/doc/classes/Dnsruby/SingleResolver.src/M000125.html +18 -0
  280. data/doc/classes/Dnsruby/SingleResolver.src/M000126.html +21 -0
  281. data/doc/classes/Dnsruby/SingleResolver.src/M000127.html +25 -0
  282. data/doc/classes/Dnsruby/SingleResolver.src/M000128.html +78 -0
  283. data/doc/classes/Dnsruby/SingleResolver.src/M000129.html +21 -0
  284. data/doc/classes/Dnsruby/TheLog.html +196 -0
  285. data/doc/classes/Dnsruby/TheLog.src/M000188.html +20 -0
  286. data/doc/classes/Dnsruby/TheLog.src/M000189.html +20 -0
  287. data/doc/classes/Dnsruby/TheLog.src/M000190.html +20 -0
  288. data/doc/classes/Dnsruby/Types.html +426 -0
  289. data/doc/classes/Dnsruby/Update.html +368 -0
  290. data/doc/classes/Dnsruby/Update.src/M000191.html +32 -0
  291. data/doc/classes/Dnsruby/Update.src/M000192.html +37 -0
  292. data/doc/classes/Dnsruby/Update.src/M000193.html +32 -0
  293. data/doc/classes/Dnsruby/Update.src/M000194.html +41 -0
  294. data/doc/classes/Dnsruby/Update.src/M000195.html +34 -0
  295. data/doc/classes/Dnsruby/ZoneTransfer/Delta.html +183 -0
  296. data/doc/classes/Dnsruby/ZoneTransfer/Delta.src/M000097.html +19 -0
  297. data/doc/classes/Dnsruby/ZoneTransfer.html +248 -0
  298. data/doc/classes/Dnsruby/ZoneTransfer.src/M000095.html +22 -0
  299. data/doc/classes/Dnsruby/ZoneTransfer.src/M000096.html +35 -0
  300. data/doc/classes/Dnsruby.html +388 -0
  301. data/doc/created.rid +1 -0
  302. data/doc/files/lib/Dnsruby/Config_rb.html +101 -0
  303. data/doc/files/lib/Dnsruby/DNSSEC_rb.html +101 -0
  304. data/doc/files/lib/Dnsruby/DNS_rb.html +110 -0
  305. data/doc/files/lib/Dnsruby/Hosts_rb.html +108 -0
  306. data/doc/files/lib/Dnsruby/Resolver_rb.html +108 -0
  307. data/doc/files/lib/Dnsruby/SingleResolver_rb.html +108 -0
  308. data/doc/files/lib/Dnsruby/TheLog_rb.html +110 -0
  309. data/doc/files/lib/Dnsruby/code_mapper_rb.html +101 -0
  310. data/doc/files/lib/Dnsruby/ipv4_rb.html +101 -0
  311. data/doc/files/lib/Dnsruby/ipv6_rb.html +101 -0
  312. data/doc/files/lib/Dnsruby/message_rb.html +109 -0
  313. data/doc/files/lib/Dnsruby/name_rb.html +101 -0
  314. data/doc/files/lib/Dnsruby/resource/AAAA_rb.html +101 -0
  315. data/doc/files/lib/Dnsruby/resource/AFSDB_rb.html +101 -0
  316. data/doc/files/lib/Dnsruby/resource/A_rb.html +101 -0
  317. data/doc/files/lib/Dnsruby/resource/CERT_rb.html +101 -0
  318. data/doc/files/lib/Dnsruby/resource/HINFO_rb.html +101 -0
  319. data/doc/files/lib/Dnsruby/resource/IN_rb.html +112 -0
  320. data/doc/files/lib/Dnsruby/resource/ISDN_rb.html +101 -0
  321. data/doc/files/lib/Dnsruby/resource/LOC_rb.html +101 -0
  322. data/doc/files/lib/Dnsruby/resource/MINFO_rb.html +101 -0
  323. data/doc/files/lib/Dnsruby/resource/MX_rb.html +101 -0
  324. data/doc/files/lib/Dnsruby/resource/NAPTR_rb.html +101 -0
  325. data/doc/files/lib/Dnsruby/resource/NSAP_rb.html +101 -0
  326. data/doc/files/lib/Dnsruby/resource/OPT_rb.html +101 -0
  327. data/doc/files/lib/Dnsruby/resource/PX_rb.html +101 -0
  328. data/doc/files/lib/Dnsruby/resource/RP_rb.html +101 -0
  329. data/doc/files/lib/Dnsruby/resource/RT_rb.html +101 -0
  330. data/doc/files/lib/Dnsruby/resource/SOA_rb.html +101 -0
  331. data/doc/files/lib/Dnsruby/resource/SPF_rb.html +101 -0
  332. data/doc/files/lib/Dnsruby/resource/SRV_rb.html +101 -0
  333. data/doc/files/lib/Dnsruby/resource/TKEY_rb.html +101 -0
  334. data/doc/files/lib/Dnsruby/resource/TSIG_rb.html +110 -0
  335. data/doc/files/lib/Dnsruby/resource/TXT_rb.html +108 -0
  336. data/doc/files/lib/Dnsruby/resource/X25_rb.html +101 -0
  337. data/doc/files/lib/Dnsruby/resource/domain_name_rb.html +101 -0
  338. data/doc/files/lib/Dnsruby/resource/generic_rb.html +125 -0
  339. data/doc/files/lib/Dnsruby/resource/resource_rb.html +110 -0
  340. data/doc/files/lib/Dnsruby/select_thread_rb.html +111 -0
  341. data/doc/files/lib/Dnsruby/update_rb.html +101 -0
  342. data/doc/files/lib/Dnsruby/zone_transfer_rb.html +101 -0
  343. data/doc/files/lib/dnsruby_rb.html +118 -0
  344. data/doc/fr_class_index.html +102 -0
  345. data/doc/fr_file_index.html +68 -0
  346. data/doc/fr_method_index.html +256 -0
  347. data/doc/index.html +24 -0
  348. data/lib/Dnsruby/Config.rb +350 -0
  349. data/lib/Dnsruby/DNS.rb +253 -0
  350. data/lib/Dnsruby/DNSSEC.rb +29 -0
  351. data/lib/Dnsruby/Hosts.rb +119 -0
  352. data/lib/Dnsruby/Resolver.rb +618 -0
  353. data/lib/Dnsruby/SingleResolver.rb +312 -0
  354. data/lib/Dnsruby/TheLog.rb +61 -0
  355. data/lib/Dnsruby/code_mapper.rb +164 -0
  356. data/lib/Dnsruby/ipv4.rb +83 -0
  357. data/lib/Dnsruby/ipv6.rb +142 -0
  358. data/lib/Dnsruby/message.rb +819 -0
  359. data/lib/Dnsruby/name.rb +325 -0
  360. data/lib/Dnsruby/resource/A.rb +56 -0
  361. data/lib/Dnsruby/resource/AAAA.rb +54 -0
  362. data/lib/Dnsruby/resource/AFSDB.rb +68 -0
  363. data/lib/Dnsruby/resource/CERT.rb +89 -0
  364. data/lib/Dnsruby/resource/HINFO.rb +52 -0
  365. data/lib/Dnsruby/resource/IN.rb +69 -0
  366. data/lib/Dnsruby/resource/ISDN.rb +54 -0
  367. data/lib/Dnsruby/resource/LOC.rb +255 -0
  368. data/lib/Dnsruby/resource/MINFO.rb +66 -0
  369. data/lib/Dnsruby/resource/MX.rb +66 -0
  370. data/lib/Dnsruby/resource/NAPTR.rb +90 -0
  371. data/lib/Dnsruby/resource/NSAP.rb +172 -0
  372. data/lib/Dnsruby/resource/OPT.rb +153 -0
  373. data/lib/Dnsruby/resource/PX.rb +71 -0
  374. data/lib/Dnsruby/resource/RP.rb +67 -0
  375. data/lib/Dnsruby/resource/RT.rb +67 -0
  376. data/lib/Dnsruby/resource/SOA.rb +89 -0
  377. data/lib/Dnsruby/resource/SPF.rb +29 -0
  378. data/lib/Dnsruby/resource/SRV.rb +108 -0
  379. data/lib/Dnsruby/resource/TKEY.rb +160 -0
  380. data/lib/Dnsruby/resource/TSIG.rb +328 -0
  381. data/lib/Dnsruby/resource/TXT.rb +76 -0
  382. data/lib/Dnsruby/resource/X25.rb +53 -0
  383. data/lib/Dnsruby/resource/domain_name.rb +58 -0
  384. data/lib/Dnsruby/resource/generic.rb +142 -0
  385. data/lib/Dnsruby/resource/resource.rb +444 -0
  386. data/lib/Dnsruby/select_thread.rb +474 -0
  387. data/lib/Dnsruby/update.rb +263 -0
  388. data/lib/Dnsruby/zone_transfer.rb +296 -0
  389. data/lib/dnsruby.rb +468 -0
  390. data/test/custom.txt +4 -0
  391. data/test/resolv.conf +4 -0
  392. data/test/tc_axfr.rb +42 -0
  393. data/test/tc_dns.rb +231 -0
  394. data/test/tc_dnsruby.rb +42 -0
  395. data/test/tc_escapedchars.rb +510 -0
  396. data/test/tc_header.rb +104 -0
  397. data/test/tc_misc.rb +139 -0
  398. data/test/tc_name.rb +53 -0
  399. data/test/tc_packet.rb +158 -0
  400. data/test/tc_packet_unique_push.rb +102 -0
  401. data/test/tc_question.rb +52 -0
  402. data/test/tc_res_config.rb +92 -0
  403. data/test/tc_res_env.rb +62 -0
  404. data/test/tc_res_file.rb +42 -0
  405. data/test/tc_res_opt.rb +185 -0
  406. data/test/tc_resolver.rb +177 -0
  407. data/test/tc_rr-opt.rb +42 -0
  408. data/test/tc_rr-txt.rb +137 -0
  409. data/test/tc_rr-unknown.rb +99 -0
  410. data/test/tc_rr.rb +259 -0
  411. data/test/tc_single_resolver.rb +153 -0
  412. data/test/tc_soak.rb +310 -0
  413. data/test/tc_tcp.rb +35 -0
  414. data/test/tc_tkey.rb +106 -0
  415. data/test/tc_update.rb +215 -0
  416. data/test/ts_dnsruby.rb +17 -0
  417. data/test/ts_offline.rb +35 -0
  418. data/test/ts_online.rb +40 -0
  419. metadata +512 -0
@@ -0,0 +1,618 @@
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 "Dnsruby/SingleResolver"
17
+ module Dnsruby
18
+ #== Description
19
+ # This class uses a set of SingleResolvers to perform queries with retries across multiple nameservers.
20
+ #
21
+ # The retry policy is a combination of the Net::DNS and dnsjava approach, and has the option of :
22
+ #* A total timeout for the query (defaults to 0, meaning "no total timeout")
23
+ #* A retransmission system that targets the namervers concurrently once the first query round is
24
+ # complete, but in which the total time per query round is split between the number of nameservers
25
+ # targetted for the first round. and total time for query round is doubled for each query round
26
+ #
27
+ # Note that, if a total timeout is specified, then that will apply regardless of the retry policy
28
+ # (i.e. it may cut retries short).
29
+ #
30
+ # Note also that these timeouts are distinct from the SingleResolver's packet_timeout
31
+ #
32
+ #== Methods
33
+ #
34
+ #=== Synchronous
35
+ #These methods raise an exception or return a response message with rcode==NOERROR
36
+ #
37
+ #* Dnsruby::Resolver#send_message(msg)
38
+ #* Dnsruby::Resolver#query(name [, type [, klass]])
39
+ #
40
+ #=== Asynchronous
41
+ #These methods use a response queue to return the response and the error
42
+ #
43
+ #* Dnsruby::Resolver#send_async(msg, query_id, response_queue)
44
+ #
45
+
46
+ class Resolver
47
+ DefaultQueryTimeout = 0
48
+ DefaultPacketTimeout = 10
49
+ DefaultRetryTimes = 4
50
+ DefaultRetryDelay = 5
51
+ DefaultPort = 53
52
+ DefaultUDPSize = 512
53
+ # The port to send queries to on the resolver
54
+ attr_reader :port
55
+
56
+ # Should TCP be used as a transport rather than UDP?
57
+ attr_reader :use_tcp
58
+
59
+
60
+ attr_reader :tsig_key
61
+
62
+ # Should truncation be ignored?
63
+ # i.e. the TC bit is ignored and thus the resolver will not requery over TCP if TC is set
64
+ attr_reader :ignore_truncation
65
+
66
+ # The source address to send queries from
67
+ attr_reader :src_address
68
+ # The source port to send queries from
69
+ attr_reader :src_port
70
+
71
+ # Should TCP queries be sent on a persistent socket?
72
+ attr_reader :persistent_tcp
73
+ # Should UDP queries be sent on a persistent socket?
74
+ attr_reader :persistent_udp
75
+
76
+ # Should the Recursion Desired bit be set?
77
+ attr_reader :recurse
78
+
79
+ # The maximum UDP size to be used
80
+ attr_reader :udp_size
81
+
82
+ # The current Config
83
+ attr_reader :config
84
+
85
+ # The array of SingleResolvers used for sending query messages
86
+ attr_reader :single_resolvers
87
+
88
+ #The timeout for any individual packet. This is the timeout used by SingleResolver
89
+ attr_reader :packet_timeout
90
+
91
+ # Note that this timeout represents the total time a query may run for - multiple packets
92
+ # can be sent to multiple nameservers in this time.
93
+ # This is distinct from the SingleResolver per-packet timeout
94
+ # The query_timeout is not required - it will default to 0, which means "do not use query_timeout".
95
+ # If this is the case then the timeout will be dictated by the retry_times and retry_delay attributes
96
+ attr_accessor :query_timeout
97
+
98
+ # The query will be tried across nameservers retry_times times, with a delay of retry_delay seconds
99
+ # between each retry. The first time round, retry_delay will be divided by the number of nameservers
100
+ # being targetted, and a new nameserver will be queried with the resultant delay.
101
+ attr_accessor :retry_times, :retry_delay
102
+
103
+ #--
104
+ #@TODO@ add load_balance? i.e. Target nameservers in a random, rather than pre-determined, order?
105
+ #++
106
+
107
+ # Query for a n. If a valid Message is received, then it is returned
108
+ # to the caller. Otherwise an exception (a Dnsruby::ResolvError or Dnsruby::ResolvTimeout) is raised.
109
+ #
110
+ # require 'Dnsruby'
111
+ # res = Dnsruby::Resolver.new
112
+ # response = res.query("example.com") # defaults to Types.A, Classes.IN
113
+ # response = res.query("example.com", Types.MX)
114
+ # response = res.query("208.77.188.166") # IPv4 address so PTR query will be made
115
+ # response = res.query("208.77.188.166", Types.PTR)
116
+ def query(name, type=Types.A, klass=Classes.IN)
117
+ msg = Message.new
118
+ msg.header.rd = 1
119
+ msg.add_question(name, type, klass)
120
+ return send_message(msg)
121
+ end
122
+
123
+ # Send a message, and wait for the response. If a valid Message is received, then it is returned
124
+ # to the caller. Otherwise an exception (a Dnsruby::ResolvError or Dnsruby::ResolvTimeout) is raised.
125
+ #
126
+ # send_async is called internally.
127
+ #
128
+ # example :
129
+ #
130
+ # require 'Dnsruby'
131
+ # res = Dnsruby::Resolver.new
132
+ # begin
133
+ # response = res.send_message(Message.new("example.com", Types.MX))
134
+ # rescue ResolvError
135
+ # # ...
136
+ # rescue ResolvTimeout
137
+ # # ...
138
+ # end
139
+ def send_message(message)
140
+ TheLog.debug("Resolver : sending message")
141
+ q = Queue.new
142
+ send_async(message, q, q)
143
+ id, result, error = q.pop
144
+ TheLog.debug("Resolver : result received")
145
+ if (error != nil)
146
+ raise error
147
+ else
148
+ return result
149
+ end
150
+ # case result
151
+ # when Exception
152
+ # # Pass them on
153
+ # raise result
154
+ # when Message
155
+ # return result
156
+ # else
157
+ # TheLog.error("Unknown result returned : #{result}")
158
+ # raise ResolvError.new("Unknown error, return : #{result}")
159
+ # end
160
+ end
161
+
162
+
163
+ # Asynchronously sends a DNS packet (Dnsruby::Message). The client must pass in the
164
+ # Message to be sent, a client_query_id to identify the message and a client_queue (of
165
+ # class Queue) to pass the response back in.
166
+ #
167
+ # A tuple of (query_id, response_message, exception) will be added to the client_queue.
168
+ #
169
+ #
170
+ # example :
171
+ #
172
+ # require 'Dnsruby'
173
+ # res = Dnsruby::Resolver.new
174
+ # query_id = 10 # can be any object you like
175
+ # query_queue = Queue.new
176
+ # res.send_async(Message.new("example.com", Types.MX), query_id, query_queue)
177
+ # query_id += 1
178
+ # res.send_async(Message.new("example.com", Types.A), query_id, query_queue)
179
+ # # ...do a load of other stuff here...
180
+ # 2.times do
181
+ # response_id, response, exception = query_queue.pop
182
+ # # You can check the ID to see which query has been answered
183
+ # if (exception == nil)
184
+ # # deal with good response
185
+ # else
186
+ # # deal with problem
187
+ # end
188
+ # end
189
+ def send_async(msg, client_query_id, client_queue)
190
+ # This is the whole point of the Resolver class.
191
+ # We want to use multiple SingleResolvers to run a query.
192
+ # So we kick off a system with select_thread where we send
193
+ # a query with a queue, but log ourselves as observers for that
194
+ # queue. When a new response is pushed on to the queue, then the
195
+ # select thread will call this class' handler method IN THAT THREAD.
196
+ # When the final response is known, this class then sticks it in
197
+ # to the client queue.
198
+
199
+ q = Queue.new
200
+
201
+ if (!client_queue.kind_of?Queue)
202
+ TheLog.error("Wrong type for client_queue in Resolver#send_async")
203
+ client_queue.push([client_query_id, ArgumentError.new("Wrong type of client_queue passed to Dnsruby::Resolver#send_async - should have been Queue, was #{client_queue.class}")])
204
+ return
205
+ end
206
+
207
+ if (!msg.kind_of?Message)
208
+ TheLog.error("Wrong type for msg in Resolver#send_async")
209
+ client_queue.push([client_query_id, ArgumentError.new("Wrong type of msg passed to Dnsruby::Resolver#send_async - should have been Message, was #{msg.class}")])
210
+ return
211
+ end
212
+
213
+ tick_needed=false
214
+ # add to our data structures
215
+ @mutex.synchronize{
216
+ tick_needed = true if @query_list.empty?
217
+ if (@query_list.has_key?client_query_id)
218
+ TheLog.error("Duplicate query id requested (#{client_query_id}")
219
+ client_queue.push([client_query_id, ArgumentError.new("Client query ID already in use")])
220
+ return
221
+ end
222
+ outstanding = []
223
+ @query_list[client_query_id]=[msg, client_queue, q, outstanding]
224
+
225
+ query_timeout = Time.now+@query_timeout
226
+ if (@query_timeout == 0)
227
+ query_timeout = Time.now+31536000 # a year from now
228
+ end
229
+ @timeouts[client_query_id]=[query_timeout, generate_timeouts()]
230
+ }
231
+
232
+ # Now do querying stuff using SingleResolver
233
+ # All this will be handled by the tick method (if we have 0 as the first timeout)
234
+ st = SelectThread.instance
235
+ st.add_observer(q, self)
236
+ tick if tick_needed
237
+ end
238
+
239
+ def generate_timeouts() #:nodoc: all
240
+ # Create the timeouts for the query from the retry_times and retry_delay attributes.
241
+ # These are created at the same time in case the parameters change during the life of the query.
242
+ #
243
+ # These should be absolute, rather than relative
244
+ # The first value should be Time.now
245
+ time_now = Time.now
246
+ timeouts={}
247
+ #These should be be pegged to the single_resolver they are targetting :
248
+ # e.g. timeouts[timeout1]=nameserver
249
+ retry_delay = @retry_delay
250
+ @retry_times.times do |retry_count|
251
+ if (retry_count>0)
252
+ retry_delay *= 2
253
+ end
254
+ servers=[]
255
+ @single_resolvers.each do |r| servers.push(r.server) end
256
+ @single_resolvers.each_index do |i|
257
+ res= @single_resolvers[i]
258
+ offset = (i*@retry_delay.to_f/@single_resolvers.length)
259
+ if (retry_count==0)
260
+ timeouts[time_now+offset]=[res, retry_count]
261
+ else
262
+ if (timeouts.has_key?(time_now+retry_delay+offset))
263
+ TheLog.error("Duplicate timeout key!")
264
+ raise RuntimeError.new("Duplicate timeout key!")
265
+ end
266
+ timeouts[time_now+retry_delay+offset]=[res, retry_count]
267
+ end
268
+ end
269
+ end
270
+ return timeouts
271
+ end
272
+
273
+ # Close the Resolver. Unfinished queries are terminated with OtherResolError.
274
+ def close
275
+ @mutex.synchronize {
276
+ @query_list.each do |client_query_id, values|
277
+ msg, client_queue, q, outstanding = values
278
+ send_result_and_close(client_queue, client_query_id, q, nil, OtherResolvError.new("Resolver closing!"))
279
+ end
280
+ }
281
+ end
282
+
283
+ # MUST BE CALLED IN A SYNCHRONIZED BLOCK!
284
+ #
285
+ # Send the result back to the client, and close the socket for that query by removing
286
+ # the query from the select thread.
287
+ def send_result_and_close(client_queue, client_query_id, select_queue, msg, error) #:nodoc: all
288
+ TheLog.debug("Sending result #{error} to client")
289
+ # We might still get some callbacks, which we should ignore
290
+ st = SelectThread.instance
291
+ st.remove_observer(select_queue, self)
292
+ # @mutex.synchronize{
293
+ # Remove the query from all of the data structures
294
+ @timeouts.delete(client_query_id)
295
+ @query_list.delete(client_query_id)
296
+ # }
297
+ # Return the response to the client
298
+ client_queue.push([client_query_id, msg, error])
299
+ end
300
+
301
+ # This method is called ten times a second from the select loop, in the select thread.
302
+ # It should arguably be called from another worker thread...
303
+ # Each tick, we check if any timeouts have occurred. If so, we take the appropriate action :
304
+ # Return a timeout to the client, or send a new query
305
+ def tick #:nodoc: all
306
+ # Handle the tick
307
+ # Do we have any retries due to be sent yet?
308
+ @mutex.synchronize{
309
+ time_now = Time.now
310
+ @timeouts.keys.each do |client_query_id|
311
+ msg, client_queue, select_queue, outstanding = @query_list[client_query_id]
312
+ query_timeout, timeouts = @timeouts[client_query_id]
313
+ if (query_timeout < Time.now)
314
+ #Time the query out
315
+ send_result_and_close(client_queue, client_query_id, select_queue, nil, ResolvTimeout.new("Query timed out"))
316
+ next
317
+ end
318
+ timeouts_done = []
319
+ timeouts.keys.sort.each do |timeout|
320
+ if (timeout < time_now)
321
+ # Send the next query
322
+ res, retry_count = timeouts[timeout]
323
+ id = [res, msg, client_query_id, retry_count]
324
+ TheLog.debug("Sending msg to #{res.server}")
325
+ # We should keep a list of the queries which are outstanding
326
+ outstanding.push(id)
327
+ timeouts_done.push(timeout)
328
+ timeouts.delete(timeout)
329
+ res.send_async(msg, id, select_queue)
330
+ else
331
+ break
332
+ end
333
+ end
334
+ timeouts_done.each do |t|
335
+ timeouts.delete(t)
336
+ end
337
+ end
338
+ }
339
+ end
340
+
341
+ # This method is called by the SelectThread (in the select thread) when the queue has a new item on it.
342
+ # The queue interface is used to separate producer/consumer threads, but we're using it here in one thread.
343
+ # It's probably a good idea to create a new "worker thread" to take items from the select thread queue and
344
+ # call this method in the worker thread.
345
+ #
346
+ # Time to process a new queue event.
347
+ def handle_queue_event(queue, id) #:nodoc: all
348
+ # If we get a callback for an ID we don't know about, don't worry -
349
+ # just ignore it. It may be for a query we've already completed.
350
+ #
351
+ # So, get the next response from the queue (presuming there is one!)
352
+ if (queue.empty?)
353
+ TheLog.fatal("Queue empty in handle_queue_event!")
354
+ raise RuntimeError.new("Severe internal error - Queue empty in handle_queue_event")
355
+ end
356
+ event_id, response, error = queue.pop
357
+ # We should remove this packet from the list of outstanding packets for this query
358
+ resolver, msg, client_query_id, retry_count = id
359
+ if (id != event_id)
360
+ TheLog.error("Serious internal error!! #{id} expected, #{event_id} received")
361
+ raise RuntimeError.new("Serious internal error!! #{id} expected, #{event_id} received")
362
+ end
363
+ @mutex.synchronize{
364
+ if (@query_list[client_query_id]==nil)
365
+ TheLog.debug("Ignoring response for dead query")
366
+ return
367
+ end
368
+ msg, client_queue, select_queue, outstanding = @query_list[client_query_id]
369
+ if (!outstanding.include?id)
370
+ TheLog.error("Query id not on outstanding list! #{outstanding.length} items. #{id} not on #{outstanding}")
371
+ raise RuntimeError.new("Query id not on outstanding!")
372
+ end
373
+ outstanding.delete(id)
374
+ }
375
+ # if (event.kind_of?(Exception))
376
+ if (error != nil)
377
+ handle_error_response(queue, event_id, error, response)
378
+ else # if (event.kind_of?(Message))
379
+ handle_response(queue, event_id, response)
380
+ # else
381
+ # TheLog.error("Random object #{event.class} returned through queue to Resolver")
382
+ end
383
+ end
384
+
385
+ def handle_error_response(select_queue, query_id, error, response) #:nodoc: all
386
+ #Handle an error
387
+ @mutex.synchronize{
388
+ TheLog.debug("handling error #{error.class}, #{error}")
389
+ # Check what sort of error it was :
390
+ resolver, msg, client_query_id, retry_count = query_id
391
+ msg, client_queue, select_queue, outstanding = @query_list[client_query_id]
392
+ if (error.kind_of?(ResolvTimeout))
393
+ # - if it was a timeout, then check which number it was, and how many retries are expected on that server
394
+ # - if it was the last retry, on the last server, then return a timeout to the client (and clean up)
395
+ # - otherwise, continue
396
+ # Do we have any more packets to send to this resolver?
397
+ timeouts = @timeouts[client_query_id]
398
+ if (outstanding.empty? && timeouts[1].values.empty?)
399
+ TheLog.debug("Sending timeout to client")
400
+ send_result_and_close(client_queue, client_query_id, select_queue, response, error)
401
+ end
402
+ elsif (error.kind_of?NXDomain)
403
+ # - if it was an NXDomain, then return that to the client, and stop all new queries (and clean up)
404
+ send_result_and_close(client_queue, client_query_id, select_queue, response, error)
405
+ else
406
+ # - if it was any other error, then remove that server from the list for that query
407
+ # If a Too Many Open Files error, then don't remove, but let retry work.
408
+ timeouts = @timeouts[client_query_id]
409
+ if (!(error.to_s=~/Errno::EMFILE/))
410
+ TheLog.debug("Removing #{resolver.server} from resolver list for this query")
411
+ timeouts[1].each do |key, value|
412
+ res = value[0]
413
+ if (res == resolver)
414
+ timeouts[1].delete(key)
415
+ end
416
+ end
417
+ else
418
+ TheLog.debug("NOT Removing #{resolver.server} due to Errno::EMFILE")
419
+ end
420
+ # - if it was the last server, then return an error to the client (and clean up)
421
+ if (outstanding.empty? && timeouts[1].values.empty?)
422
+ # if (outstanding.empty?)
423
+ TheLog.debug("Sending error to client")
424
+ send_result_and_close(client_queue, client_query_id, select_queue, response, error)
425
+ end
426
+ end
427
+ #@TODO@ If we're still sending packets for this query, but none are outstanding, then
428
+ #jumpstart the next query?
429
+ }
430
+ end
431
+
432
+ def handle_response(select_queue, query_id, response) #:nodoc: all
433
+ # Handle a good response
434
+ TheLog.debug("Handling good response")
435
+ resolver, msg, client_query_id, retry_count = query_id
436
+ @mutex.synchronize{
437
+ query, client_queue, s_queue, outstanding = @query_list[client_query_id]
438
+ if (s_queue != select_queue)
439
+ TheLog.error("Serious internal error : expected select queue #{s_queue}, got #{select_queue}")
440
+ raise RuntimeError.new("Serious internal error : expected select queue #{s_queue}, got #{select_queue}")
441
+ end
442
+ send_result_and_close(client_queue, client_query_id, select_queue, response, nil)
443
+ }
444
+ end
445
+
446
+ # Create a new Resolver object. If no parameters are passed in, then the default
447
+ # system configuration will be used. Otherwise, a Hash may be passed in with the
448
+ # following optional elements :
449
+ #
450
+ #
451
+ # * :port
452
+ # * :use_tcp
453
+ # * :tsig_key
454
+ # * :ignore_truncation
455
+ # * :src_address
456
+ # * :src_port
457
+ # * :persistent_tcp
458
+ # * :persistent_udp
459
+ # * :recurse
460
+ # * :udp_size
461
+ # * :config_info - see Config
462
+ # * :nameserver - can be either a String or an array of Strings
463
+ # * :packet_timeout
464
+ # * :query_timeout
465
+ # * :retry_times
466
+ # * :retry_delay
467
+ def initialize(*args)
468
+ reset_attributes
469
+
470
+ # Process args
471
+ if (args.length==1)
472
+ if (args[0].class == Hash)
473
+ args[0].keys.each do |key|
474
+ begin
475
+ if (key == :config_info)
476
+ @config.set_config_info(args[0][:config_info])
477
+ elsif (key==:nameserver)
478
+ set_config_nameserver(args[0][:nameserver])
479
+ else
480
+ send(key.to_s+"=", args[0][key])
481
+ end
482
+ rescue Exception
483
+ TheLog.error("Argument #{key} not valid\n")
484
+ end
485
+ end
486
+ elsif (args[0].class == Config)
487
+ # also accepts a Config object from Dnsruby::Resolv
488
+ @config = args[0]
489
+ end
490
+ else
491
+ #@TODO@ ?
492
+ end
493
+ if (@single_resolvers==[])
494
+ add_config_nameservers
495
+ end
496
+ update
497
+ end
498
+
499
+ def add_config_nameservers
500
+ # Add the Config nameservers
501
+ @config.nameserver.each do |ns|
502
+ @single_resolvers.push(SingleResolver.new({:server=>ns}))
503
+ end
504
+ end
505
+
506
+ def set_config_nameserver(n)
507
+ if (n).kind_of?String
508
+ @config.nameserver=[n]
509
+ else
510
+ @config.nameserver=n
511
+ end
512
+ end
513
+
514
+ def reset_attributes #:nodoc: all
515
+ # data structures
516
+ @mutex=Mutex.new
517
+ @query_list = {}
518
+
519
+ # Attributes
520
+ @timeouts = {}
521
+ @query_timeout = DefaultQueryTimeout
522
+ @retry_delay = DefaultRetryDelay
523
+ @retry_times = DefaultRetryTimes
524
+ @packet_timeout = DefaultPacketTimeout
525
+ @port = DefaultPort
526
+ @udp_size = DefaultUDPSize
527
+ @use_tcp = false
528
+ @tsig_key = nil
529
+ @ignore_truncation = false
530
+ @config = Config.new()
531
+ @src_addr = '0.0.0.0'
532
+ @src_port = 0
533
+ @recurse = true
534
+ @persistent_udp = false
535
+ @persistent_tcp = false
536
+ @single_resolvers=[]
537
+ end
538
+
539
+ def update #:nodoc: all
540
+ #Update any resolvers we have with the latest config
541
+ @single_resolvers.each do |res|
542
+ [:port, :use_tcp, :tsig_key, :ignore_truncation, :packet_timeout,
543
+ :src_address, :src_port, :persistent_tcp, :persistent_udp, :recurse,
544
+ :udp_size].each do |param|
545
+
546
+ res.send(param.to_s+"=", instance_variable_get("@"+param.to_s))
547
+ end
548
+ end
549
+ end
550
+
551
+ # Add a new SingleResolver to the list of resolvers this Resolver object will
552
+ # query.
553
+ def add_resolver(single)
554
+ @single_resolvers.push(single)
555
+ end
556
+
557
+ def nameserver=(n)
558
+ @single_resolvers=[]
559
+ set_config_nameserver(n)
560
+ add_config_nameservers
561
+ end
562
+
563
+ def packet_timeout=(t)
564
+ @packet_timeout = t
565
+ update
566
+ end
567
+
568
+ def port=(p)
569
+ @port = p
570
+ update
571
+ end
572
+
573
+ def use_tcp=(on)
574
+ @use_tcp = on
575
+ update
576
+ end
577
+
578
+ def tsig_key=(t)
579
+ @tsig_key = t
580
+ update
581
+ end
582
+
583
+ def ignore_truncation=(on)
584
+ @ignore_truncation = on
585
+ update
586
+ end
587
+
588
+ def src_address=(a)
589
+ @src_address = a
590
+ update
591
+ end
592
+
593
+ def src_port=(a)
594
+ @src_port = a
595
+ update
596
+ end
597
+
598
+ def persistent_tcp=(on)
599
+ @persistent_tcp = on
600
+ update
601
+ end
602
+
603
+ def persistent_udp=(on)
604
+ @persistent_udp = on
605
+ update
606
+ end
607
+
608
+ def recurse=(a)
609
+ @recurse = a
610
+ update
611
+ end
612
+
613
+ def udp_size=(s)
614
+ @udp_size = s
615
+ update
616
+ end
617
+ end
618
+ end