Dnsruby 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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