Dnsruby 0.5.0 → 0.6.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 (414) hide show
  1. data/EVENTMACHINE +64 -0
  2. data/README +2 -2
  3. data/doc/classes/Dnsruby/Classes.html +10 -10
  4. data/doc/classes/Dnsruby/Classes.src/M000158.html +9 -5
  5. data/doc/classes/Dnsruby/Classes.src/M000159.html +19 -0
  6. data/doc/classes/Dnsruby/Classes.src/M000185.html +23 -0
  7. data/doc/classes/Dnsruby/Classes.src/M000186.html +19 -0
  8. data/doc/classes/Dnsruby/CodeMapper.html +55 -55
  9. data/doc/classes/Dnsruby/CodeMapper.src/M000131.html +4 -19
  10. data/doc/classes/Dnsruby/CodeMapper.src/M000132.html +19 -7
  11. data/doc/classes/Dnsruby/CodeMapper.src/M000133.html +7 -5
  12. data/doc/classes/Dnsruby/CodeMapper.src/M000134.html +5 -5
  13. data/doc/classes/Dnsruby/CodeMapper.src/M000135.html +5 -4
  14. data/doc/classes/Dnsruby/CodeMapper.src/M000136.html +4 -8
  15. data/doc/classes/Dnsruby/CodeMapper.src/M000137.html +5 -5
  16. data/doc/classes/Dnsruby/CodeMapper.src/M000138.html +6 -6
  17. data/doc/classes/Dnsruby/CodeMapper.src/M000139.html +7 -16
  18. data/doc/classes/Dnsruby/CodeMapper.src/M000140.html +17 -5
  19. data/doc/classes/Dnsruby/CodeMapper.src/M000141.html +19 -0
  20. data/doc/classes/Dnsruby/CodeMapper.src/M000158.html +18 -0
  21. data/doc/classes/Dnsruby/CodeMapper.src/M000159.html +33 -0
  22. data/doc/classes/Dnsruby/CodeMapper.src/M000160.html +21 -0
  23. data/doc/classes/Dnsruby/CodeMapper.src/M000161.html +19 -0
  24. data/doc/classes/Dnsruby/CodeMapper.src/M000162.html +19 -0
  25. data/doc/classes/Dnsruby/CodeMapper.src/M000163.html +18 -0
  26. data/doc/classes/Dnsruby/CodeMapper.src/M000164.html +22 -0
  27. data/doc/classes/Dnsruby/CodeMapper.src/M000165.html +22 -0
  28. data/doc/classes/Dnsruby/CodeMapper.src/M000166.html +22 -0
  29. data/doc/classes/Dnsruby/CodeMapper.src/M000167.html +31 -0
  30. data/doc/classes/Dnsruby/CodeMapper.src/M000168.html +19 -0
  31. data/doc/classes/Dnsruby/Config.src/M000106.html +5 -1
  32. data/doc/classes/Dnsruby/Config.src/M000107.html +1 -1
  33. data/doc/classes/Dnsruby/Config.src/M000108.html +4 -1
  34. data/doc/classes/Dnsruby/Config.src/M000125.html +18 -0
  35. data/doc/classes/Dnsruby/Config.src/M000126.html +19 -0
  36. data/doc/classes/Dnsruby/Config.src/M000127.html +19 -0
  37. data/doc/classes/Dnsruby/Config.src/M000128.html +21 -0
  38. data/doc/classes/Dnsruby/Config.src/M000129.html +21 -0
  39. data/doc/classes/Dnsruby/Config.src/M000130.html +38 -0
  40. data/doc/classes/Dnsruby/Config.src/M000131.html +26 -0
  41. data/doc/classes/Dnsruby/Config.src/M000132.html +22 -0
  42. data/doc/classes/Dnsruby/Config.src/M000133.html +27 -0
  43. data/doc/classes/Dnsruby/Config.src/M000134.html +22 -0
  44. data/doc/classes/Dnsruby/Config.src/M000135.html +21 -0
  45. data/doc/classes/Dnsruby/DNS.html +85 -85
  46. data/doc/classes/Dnsruby/DNS.src/M000197.html +10 -4
  47. data/doc/classes/Dnsruby/DNS.src/M000198.html +4 -4
  48. data/doc/classes/Dnsruby/DNS.src/M000199.html +4 -6
  49. data/doc/classes/Dnsruby/DNS.src/M000200.html +6 -5
  50. data/doc/classes/Dnsruby/DNS.src/M000201.html +5 -6
  51. data/doc/classes/Dnsruby/DNS.src/M000202.html +6 -4
  52. data/doc/classes/Dnsruby/DNS.src/M000203.html +4 -5
  53. data/doc/classes/Dnsruby/DNS.src/M000204.html +5 -6
  54. data/doc/classes/Dnsruby/DNS.src/M000205.html +6 -14
  55. data/doc/classes/Dnsruby/DNS.src/M000206.html +14 -5
  56. data/doc/classes/Dnsruby/DNS.src/M000207.html +5 -6
  57. data/doc/classes/Dnsruby/DNS.src/M000208.html +6 -27
  58. data/doc/classes/Dnsruby/DNS.src/M000209.html +26 -17
  59. data/doc/classes/Dnsruby/DNS.src/M000210.html +17 -35
  60. data/doc/classes/Dnsruby/DNS.src/M000211.html +50 -0
  61. data/doc/classes/Dnsruby/DNS.src/M000224.html +24 -0
  62. data/doc/classes/Dnsruby/DNS.src/M000225.html +18 -0
  63. data/doc/classes/Dnsruby/DNS.src/M000226.html +18 -0
  64. data/doc/classes/Dnsruby/DNS.src/M000227.html +20 -0
  65. data/doc/classes/Dnsruby/DNS.src/M000228.html +19 -0
  66. data/doc/classes/Dnsruby/DNS.src/M000229.html +20 -0
  67. data/doc/classes/Dnsruby/DNS.src/M000230.html +18 -0
  68. data/doc/classes/Dnsruby/DNS.src/M000231.html +19 -0
  69. data/doc/classes/Dnsruby/DNS.src/M000232.html +20 -0
  70. data/doc/classes/Dnsruby/DNS.src/M000233.html +28 -0
  71. data/doc/classes/Dnsruby/DNS.src/M000234.html +19 -0
  72. data/doc/classes/Dnsruby/DNS.src/M000235.html +20 -0
  73. data/doc/classes/Dnsruby/DNS.src/M000236.html +41 -0
  74. data/doc/classes/Dnsruby/DNS.src/M000237.html +32 -0
  75. data/doc/classes/Dnsruby/DNS.src/M000238.html +50 -0
  76. data/doc/classes/Dnsruby/EventMachineInterface/EmTcpHandler.html +154 -0
  77. data/doc/classes/Dnsruby/EventMachineInterface/EmTcpHandler.src/M000123.html +20 -0
  78. data/doc/classes/Dnsruby/EventMachineInterface/EmTcpHandler.src/M000124.html +32 -0
  79. data/doc/classes/Dnsruby/EventMachineInterface/EmUdpHandler.html +237 -0
  80. data/doc/classes/Dnsruby/EventMachineInterface/EmUdpHandler.src/M000117.html +18 -0
  81. data/doc/classes/Dnsruby/EventMachineInterface/EmUdpHandler.src/M000118.html +19 -0
  82. data/doc/classes/Dnsruby/EventMachineInterface/EmUdpHandler.src/M000119.html +35 -0
  83. data/doc/classes/Dnsruby/EventMachineInterface/EmUdpHandler.src/M000120.html +30 -0
  84. data/doc/classes/Dnsruby/EventMachineInterface/EmUdpHandler.src/M000121.html +19 -0
  85. data/doc/classes/Dnsruby/EventMachineInterface/EmUdpHandler.src/M000122.html +23 -0
  86. data/doc/classes/Dnsruby/EventMachineInterface.html +327 -0
  87. data/doc/classes/Dnsruby/EventMachineInterface.src/M000105.html +32 -0
  88. data/doc/classes/Dnsruby/EventMachineInterface.src/M000106.html +25 -0
  89. data/doc/classes/Dnsruby/EventMachineInterface.src/M000107.html +29 -0
  90. data/doc/classes/Dnsruby/EventMachineInterface.src/M000108.html +21 -0
  91. data/doc/classes/Dnsruby/EventMachineInterface.src/M000109.html +35 -0
  92. data/doc/classes/Dnsruby/EventMachineInterface.src/M000110.html +19 -0
  93. data/doc/classes/Dnsruby/EventMachineInterface.src/M000111.html +23 -0
  94. data/doc/classes/Dnsruby/EventMachineInterface.src/M000112.html +18 -0
  95. data/doc/classes/Dnsruby/EventMachineInterface.src/M000113.html +28 -0
  96. data/doc/classes/Dnsruby/EventMachineInterface.src/M000114.html +41 -0
  97. data/doc/classes/Dnsruby/EventMachineInterface.src/M000115.html +28 -0
  98. data/doc/classes/Dnsruby/EventMachineInterface.src/M000116.html +24 -0
  99. data/doc/classes/Dnsruby/Header.html +62 -62
  100. data/doc/classes/Dnsruby/Header.src/M000169.html +21 -4
  101. data/doc/classes/Dnsruby/Header.src/M000170.html +4 -4
  102. data/doc/classes/Dnsruby/Header.src/M000171.html +4 -7
  103. data/doc/classes/Dnsruby/Header.src/M000172.html +7 -6
  104. data/doc/classes/Dnsruby/Header.src/M000173.html +6 -18
  105. data/doc/classes/Dnsruby/Header.src/M000174.html +18 -12
  106. data/doc/classes/Dnsruby/Header.src/M000175.html +12 -33
  107. data/doc/classes/Dnsruby/Header.src/M000176.html +33 -14
  108. data/doc/classes/Dnsruby/Header.src/M000177.html +14 -4
  109. data/doc/classes/Dnsruby/Header.src/M000178.html +4 -4
  110. data/doc/classes/Dnsruby/Header.src/M000179.html +4 -16
  111. data/doc/classes/Dnsruby/Header.src/M000180.html +30 -0
  112. data/doc/classes/Dnsruby/Header.src/M000196.html +35 -0
  113. data/doc/classes/Dnsruby/Header.src/M000197.html +18 -0
  114. data/doc/classes/Dnsruby/Header.src/M000198.html +18 -0
  115. data/doc/classes/Dnsruby/Header.src/M000199.html +21 -0
  116. data/doc/classes/Dnsruby/Header.src/M000200.html +20 -0
  117. data/doc/classes/Dnsruby/Header.src/M000201.html +32 -0
  118. data/doc/classes/Dnsruby/Header.src/M000202.html +26 -0
  119. data/doc/classes/Dnsruby/Header.src/M000203.html +47 -0
  120. data/doc/classes/Dnsruby/Header.src/M000204.html +28 -0
  121. data/doc/classes/Dnsruby/Header.src/M000205.html +18 -0
  122. data/doc/classes/Dnsruby/Header.src/M000206.html +18 -0
  123. data/doc/classes/Dnsruby/Header.src/M000207.html +30 -0
  124. data/doc/classes/Dnsruby/Hosts.html +47 -47
  125. data/doc/classes/Dnsruby/Hosts.src/M000142.html +6 -35
  126. data/doc/classes/Dnsruby/Hosts.src/M000143.html +35 -5
  127. data/doc/classes/Dnsruby/Hosts.src/M000144.html +5 -6
  128. data/doc/classes/Dnsruby/Hosts.src/M000145.html +6 -7
  129. data/doc/classes/Dnsruby/Hosts.src/M000146.html +7 -5
  130. data/doc/classes/Dnsruby/Hosts.src/M000147.html +5 -6
  131. data/doc/classes/Dnsruby/Hosts.src/M000148.html +6 -7
  132. data/doc/classes/Dnsruby/Hosts.src/M000149.html +21 -0
  133. data/doc/classes/Dnsruby/Hosts.src/M000169.html +20 -0
  134. data/doc/classes/Dnsruby/Hosts.src/M000170.html +49 -0
  135. data/doc/classes/Dnsruby/Hosts.src/M000171.html +19 -0
  136. data/doc/classes/Dnsruby/Hosts.src/M000172.html +20 -0
  137. data/doc/classes/Dnsruby/Hosts.src/M000173.html +21 -0
  138. data/doc/classes/Dnsruby/Hosts.src/M000174.html +19 -0
  139. data/doc/classes/Dnsruby/Hosts.src/M000175.html +20 -0
  140. data/doc/classes/Dnsruby/Hosts.src/M000176.html +21 -0
  141. data/doc/classes/Dnsruby/IPv4.html +43 -43
  142. data/doc/classes/Dnsruby/IPv4.src/M000150.html +17 -6
  143. data/doc/classes/Dnsruby/IPv4.src/M000151.html +7 -4
  144. data/doc/classes/Dnsruby/IPv4.src/M000152.html +4 -4
  145. data/doc/classes/Dnsruby/IPv4.src/M000153.html +4 -5
  146. data/doc/classes/Dnsruby/IPv4.src/M000154.html +5 -4
  147. data/doc/classes/Dnsruby/IPv4.src/M000155.html +4 -4
  148. data/doc/classes/Dnsruby/IPv4.src/M000156.html +4 -4
  149. data/doc/classes/Dnsruby/IPv4.src/M000157.html +18 -0
  150. data/doc/classes/Dnsruby/IPv4.src/M000177.html +32 -0
  151. data/doc/classes/Dnsruby/IPv4.src/M000178.html +21 -0
  152. data/doc/classes/Dnsruby/IPv4.src/M000179.html +18 -0
  153. data/doc/classes/Dnsruby/IPv4.src/M000180.html +18 -0
  154. data/doc/classes/Dnsruby/IPv4.src/M000181.html +19 -0
  155. data/doc/classes/Dnsruby/IPv4.src/M000182.html +18 -0
  156. data/doc/classes/Dnsruby/IPv4.src/M000183.html +18 -0
  157. data/doc/classes/Dnsruby/IPv4.src/M000184.html +18 -0
  158. data/doc/classes/Dnsruby/IPv6.html +43 -43
  159. data/doc/classes/Dnsruby/IPv6.src/M000181.html +45 -6
  160. data/doc/classes/Dnsruby/IPv6.src/M000182.html +6 -7
  161. data/doc/classes/Dnsruby/IPv6.src/M000183.html +8 -4
  162. data/doc/classes/Dnsruby/IPv6.src/M000184.html +4 -7
  163. data/doc/classes/Dnsruby/IPv6.src/M000185.html +7 -4
  164. data/doc/classes/Dnsruby/IPv6.src/M000186.html +4 -4
  165. data/doc/classes/Dnsruby/IPv6.src/M000187.html +4 -4
  166. data/doc/classes/Dnsruby/IPv6.src/M000188.html +18 -0
  167. data/doc/classes/Dnsruby/IPv6.src/M000208.html +60 -0
  168. data/doc/classes/Dnsruby/IPv6.src/M000209.html +21 -0
  169. data/doc/classes/Dnsruby/IPv6.src/M000210.html +22 -0
  170. data/doc/classes/Dnsruby/IPv6.src/M000211.html +18 -0
  171. data/doc/classes/Dnsruby/IPv6.src/M000212.html +21 -0
  172. data/doc/classes/Dnsruby/IPv6.src/M000213.html +18 -0
  173. data/doc/classes/Dnsruby/IPv6.src/M000214.html +18 -0
  174. data/doc/classes/Dnsruby/IPv6.src/M000215.html +18 -0
  175. data/doc/classes/Dnsruby/Message.html +1 -1
  176. data/doc/classes/Dnsruby/Message.src/M000090.html +20 -0
  177. data/doc/classes/Dnsruby/Message.src/M000091.html +21 -0
  178. data/doc/classes/Dnsruby/Message.src/M000092.html +20 -0
  179. data/doc/classes/Dnsruby/Message.src/M000093.html +18 -0
  180. data/doc/classes/Dnsruby/Message.src/M000094.html +54 -0
  181. data/doc/classes/Dnsruby/Message.src/M000095.html +42 -0
  182. data/doc/classes/Dnsruby/Message.src/M000096.html +45 -0
  183. data/doc/classes/Dnsruby/Name/Label.src/M000076.html +22 -0
  184. data/doc/classes/Dnsruby/Name/Label.src/M000077.html +18 -0
  185. data/doc/classes/Dnsruby/Name/Label.src/M000078.html +18 -0
  186. data/doc/classes/Dnsruby/Name/Label.src/M000079.html +18 -0
  187. data/doc/classes/Dnsruby/Name/Label.src/M000080.html +18 -0
  188. data/doc/classes/Dnsruby/Name/Label.src/M000081.html +18 -0
  189. data/doc/classes/Dnsruby/Name/Label.src/M000082.html +18 -0
  190. data/doc/classes/Dnsruby/Name.src/M000067.html +18 -0
  191. data/doc/classes/Dnsruby/Name.src/M000068.html +21 -0
  192. data/doc/classes/Dnsruby/Name.src/M000069.html +19 -0
  193. data/doc/classes/Dnsruby/Name.src/M000071.html +22 -0
  194. data/doc/classes/Dnsruby/Name.src/M000072.html +18 -0
  195. data/doc/classes/Dnsruby/Name.src/M000073.html +20 -0
  196. data/doc/classes/Dnsruby/Question.html +10 -10
  197. data/doc/classes/Dnsruby/Question.src/M000167.html +33 -4
  198. data/doc/classes/Dnsruby/Question.src/M000168.html +18 -0
  199. data/doc/classes/Dnsruby/Question.src/M000194.html +47 -0
  200. data/doc/classes/Dnsruby/Question.src/M000195.html +18 -0
  201. data/doc/classes/Dnsruby/RR/DomainName.src/M000058.html +22 -0
  202. data/doc/classes/Dnsruby/RR/Generic.src/M000048.html +25 -0
  203. data/doc/classes/Dnsruby/RR/IN/A.src/M000025.html +18 -0
  204. data/doc/classes/Dnsruby/RR/IN/A.src/M000026.html +18 -0
  205. data/doc/classes/Dnsruby/RR/IN/A.src/M000027.html +18 -0
  206. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000022.html +29 -0
  207. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000023.html +26 -0
  208. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000024.html +22 -0
  209. data/doc/classes/Dnsruby/RR/IN/WKS.src/M000028.html +20 -0
  210. data/doc/classes/Dnsruby/RR/LOC.src/M000032.html +32 -0
  211. data/doc/classes/Dnsruby/RR/LOC.src/M000033.html +23 -0
  212. data/doc/classes/Dnsruby/RR/LOC.src/M000034.html +25 -0
  213. data/doc/classes/Dnsruby/RR/LOC.src/M000035.html +21 -0
  214. data/doc/classes/Dnsruby/RR/LOC.src/M000036.html +20 -0
  215. data/doc/classes/Dnsruby/RR/LOC.src/M000037.html +23 -0
  216. data/doc/classes/Dnsruby/RR/NSAP.src/M000060.html +19 -0
  217. data/doc/classes/Dnsruby/RR/NSAP.src/M000061.html +19 -0
  218. data/doc/classes/Dnsruby/RR/NSAP.src/M000062.html +22 -0
  219. data/doc/classes/Dnsruby/RR/NSAP.src/M000063.html +31 -0
  220. data/doc/classes/Dnsruby/RR/RP.src/M000057.html +19 -0
  221. data/doc/classes/Dnsruby/RR/SOA.src/M000046.html +24 -0
  222. data/doc/classes/Dnsruby/RR/SOA.src/M000047.html +27 -0
  223. data/doc/classes/Dnsruby/RR/TKEY.src/M000029.html +19 -0
  224. data/doc/classes/Dnsruby/RR/TKEY.src/M000030.html +29 -0
  225. data/doc/classes/Dnsruby/RR/TKEY.src/M000031.html +30 -0
  226. data/doc/classes/Dnsruby/RR/TSIG.src/M000050.html +71 -0
  227. data/doc/classes/Dnsruby/RR/TSIG.src/M000051.html +34 -0
  228. data/doc/classes/Dnsruby/RR/TSIG.src/M000052.html +37 -0
  229. data/doc/classes/Dnsruby/RR/TSIG.src/M000053.html +31 -0
  230. data/doc/classes/Dnsruby/RR/TSIG.src/M000054.html +34 -0
  231. data/doc/classes/Dnsruby/RR/TSIG.src/M000055.html +22 -0
  232. data/doc/classes/Dnsruby/RR/TSIG.src/M000056.html +29 -0
  233. data/doc/classes/Dnsruby/RR/TXT.src/M000041.html +18 -0
  234. data/doc/classes/Dnsruby/RR/TXT.src/M000042.html +18 -0
  235. data/doc/classes/Dnsruby/RR/TXT.src/M000043.html +20 -0
  236. data/doc/classes/Dnsruby/RR/TXT.src/M000044.html +27 -0
  237. data/doc/classes/Dnsruby/RR/TXT.src/M000045.html +25 -0
  238. data/doc/classes/Dnsruby/RR/X25.src/M000038.html +18 -0
  239. data/doc/classes/Dnsruby/RR/X25.src/M000039.html +18 -0
  240. data/doc/classes/Dnsruby/RR/X25.src/M000040.html +22 -0
  241. data/doc/classes/Dnsruby/RR.src/M000015.html +18 -0
  242. data/doc/classes/Dnsruby/RR.src/M000016.html +18 -0
  243. data/doc/classes/Dnsruby/RR.src/M000017.html +22 -0
  244. data/doc/classes/Dnsruby/RR.src/M000018.html +22 -0
  245. data/doc/classes/Dnsruby/RR.src/M000019.html +18 -0
  246. data/doc/classes/Dnsruby/RR.src/M000020.html +22 -0
  247. data/doc/classes/Dnsruby/RR.src/M000021.html +24 -0
  248. data/doc/classes/Dnsruby/RRSet.html +39 -39
  249. data/doc/classes/Dnsruby/RRSet.src/M000160.html +4 -30
  250. data/doc/classes/Dnsruby/RRSet.src/M000161.html +30 -4
  251. data/doc/classes/Dnsruby/RRSet.src/M000162.html +4 -6
  252. data/doc/classes/Dnsruby/RRSet.src/M000163.html +6 -4
  253. data/doc/classes/Dnsruby/RRSet.src/M000164.html +4 -4
  254. data/doc/classes/Dnsruby/RRSet.src/M000165.html +4 -4
  255. data/doc/classes/Dnsruby/RRSet.src/M000166.html +18 -0
  256. data/doc/classes/Dnsruby/RRSet.src/M000187.html +18 -0
  257. data/doc/classes/Dnsruby/RRSet.src/M000188.html +44 -0
  258. data/doc/classes/Dnsruby/RRSet.src/M000189.html +18 -0
  259. data/doc/classes/Dnsruby/RRSet.src/M000190.html +20 -0
  260. data/doc/classes/Dnsruby/RRSet.src/M000191.html +18 -0
  261. data/doc/classes/Dnsruby/RRSet.src/M000192.html +18 -0
  262. data/doc/classes/Dnsruby/RRSet.src/M000193.html +18 -0
  263. data/doc/classes/Dnsruby/Resolv.src/M000109.html +1 -1
  264. data/doc/classes/Dnsruby/Resolv.src/M000110.html +1 -1
  265. data/doc/classes/Dnsruby/Resolv.src/M000111.html +1 -1
  266. data/doc/classes/Dnsruby/Resolv.src/M000112.html +1 -1
  267. data/doc/classes/Dnsruby/Resolv.src/M000113.html +1 -1
  268. data/doc/classes/Dnsruby/Resolv.src/M000114.html +1 -1
  269. data/doc/classes/Dnsruby/Resolv.src/M000115.html +1 -1
  270. data/doc/classes/Dnsruby/Resolv.src/M000116.html +1 -1
  271. data/doc/classes/Dnsruby/Resolv.src/M000117.html +1 -1
  272. data/doc/classes/Dnsruby/Resolv.src/M000118.html +1 -1
  273. data/doc/classes/Dnsruby/Resolv.src/M000119.html +1 -1
  274. data/doc/classes/Dnsruby/Resolv.src/M000120.html +1 -1
  275. data/doc/classes/Dnsruby/Resolv.src/M000121.html +1 -1
  276. data/doc/classes/Dnsruby/Resolv.src/M000136.html +18 -0
  277. data/doc/classes/Dnsruby/Resolv.src/M000137.html +18 -0
  278. data/doc/classes/Dnsruby/Resolv.src/M000138.html +18 -0
  279. data/doc/classes/Dnsruby/Resolv.src/M000139.html +18 -0
  280. data/doc/classes/Dnsruby/Resolv.src/M000140.html +18 -0
  281. data/doc/classes/Dnsruby/Resolv.src/M000141.html +18 -0
  282. data/doc/classes/Dnsruby/Resolv.src/M000142.html +18 -0
  283. data/doc/classes/Dnsruby/Resolv.src/M000143.html +19 -0
  284. data/doc/classes/Dnsruby/Resolv.src/M000144.html +20 -0
  285. data/doc/classes/Dnsruby/Resolv.src/M000145.html +29 -0
  286. data/doc/classes/Dnsruby/Resolv.src/M000146.html +19 -0
  287. data/doc/classes/Dnsruby/Resolv.src/M000147.html +20 -0
  288. data/doc/classes/Dnsruby/Resolv.src/M000148.html +25 -0
  289. data/doc/classes/Dnsruby/Resolver.html +238 -123
  290. data/doc/classes/Dnsruby/Resolver.src/M000212.html +7 -23
  291. data/doc/classes/Dnsruby/Resolver.src/M000213.html +11 -48
  292. data/doc/classes/Dnsruby/Resolver.src/M000214.html +13 -8
  293. data/doc/classes/Dnsruby/Resolver.src/M000215.html +4 -32
  294. data/doc/classes/Dnsruby/Resolver.src/M000216.html +33 -6
  295. data/doc/classes/Dnsruby/Resolver.src/M000217.html +6 -7
  296. data/doc/classes/Dnsruby/Resolver.src/M000218.html +8 -4
  297. data/doc/classes/Dnsruby/Resolver.src/M000219.html +4 -6
  298. data/doc/classes/Dnsruby/Resolver.src/M000220.html +6 -5
  299. data/doc/classes/Dnsruby/Resolver.src/M000221.html +4 -4
  300. data/doc/classes/Dnsruby/Resolver.src/M000222.html +4 -4
  301. data/doc/classes/Dnsruby/Resolver.src/M000223.html +4 -4
  302. data/doc/classes/Dnsruby/Resolver.src/M000224.html +4 -4
  303. data/doc/classes/Dnsruby/Resolver.src/M000225.html +4 -4
  304. data/doc/classes/Dnsruby/Resolver.src/M000226.html +4 -4
  305. data/doc/classes/Dnsruby/Resolver.src/M000227.html +4 -4
  306. data/doc/classes/Dnsruby/Resolver.src/M000228.html +4 -4
  307. data/doc/classes/Dnsruby/Resolver.src/M000229.html +4 -4
  308. data/doc/classes/Dnsruby/Resolver.src/M000230.html +4 -4
  309. data/doc/classes/Dnsruby/Resolver.src/M000231.html +19 -0
  310. data/doc/classes/Dnsruby/Resolver.src/M000232.html +26 -0
  311. data/doc/classes/Dnsruby/Resolver.src/M000233.html +18 -0
  312. data/doc/classes/Dnsruby/Resolver.src/M000234.html +23 -0
  313. data/doc/classes/Dnsruby/Resolver.src/M000235.html +18 -0
  314. data/doc/classes/Dnsruby/Resolver.src/M000236.html +42 -0
  315. data/doc/classes/Dnsruby/Resolver.src/M000239.html +21 -0
  316. data/doc/classes/Dnsruby/Resolver.src/M000240.html +27 -0
  317. data/doc/classes/Dnsruby/Resolver.src/M000241.html +28 -0
  318. data/doc/classes/Dnsruby/Resolver.src/M000242.html +18 -0
  319. data/doc/classes/Dnsruby/Resolver.src/M000243.html +48 -0
  320. data/doc/classes/Dnsruby/Resolver.src/M000244.html +21 -0
  321. data/doc/classes/Dnsruby/Resolver.src/M000245.html +22 -0
  322. data/doc/classes/Dnsruby/Resolver.src/M000246.html +18 -0
  323. data/doc/classes/Dnsruby/Resolver.src/M000247.html +20 -0
  324. data/doc/classes/Dnsruby/Resolver.src/M000248.html +19 -0
  325. data/doc/classes/Dnsruby/Resolver.src/M000249.html +19 -0
  326. data/doc/classes/Dnsruby/Resolver.src/M000250.html +19 -0
  327. data/doc/classes/Dnsruby/Resolver.src/M000251.html +19 -0
  328. data/doc/classes/Dnsruby/Resolver.src/M000252.html +19 -0
  329. data/doc/classes/Dnsruby/Resolver.src/M000253.html +19 -0
  330. data/doc/classes/Dnsruby/Resolver.src/M000254.html +19 -0
  331. data/doc/classes/Dnsruby/Resolver.src/M000255.html +19 -0
  332. data/doc/classes/Dnsruby/Resolver.src/M000256.html +19 -0
  333. data/doc/classes/Dnsruby/Resolver.src/M000257.html +19 -0
  334. data/doc/classes/Dnsruby/Resolver.src/M000258.html +19 -0
  335. data/doc/classes/Dnsruby/Resolver.src/M000259.html +26 -0
  336. data/doc/classes/Dnsruby/Resolver.src/M000260.html +18 -0
  337. data/doc/classes/Dnsruby/Resolver.src/M000261.html +23 -0
  338. data/doc/classes/Dnsruby/Resolver.src/M000262.html +18 -0
  339. data/doc/classes/Dnsruby/Resolver.src/M000263.html +42 -0
  340. data/doc/classes/Dnsruby/SelectInterface.html +236 -0
  341. data/doc/classes/Dnsruby/SelectInterface.src/M000001.html +19 -0
  342. data/doc/classes/Dnsruby/SelectInterface.src/M000002.html +18 -0
  343. data/doc/classes/Dnsruby/SelectInterface.src/M000003.html +18 -0
  344. data/doc/classes/Dnsruby/SelectInterface.src/M000004.html +18 -0
  345. data/doc/classes/Dnsruby/SelectInterface.src/M000005.html +21 -0
  346. data/doc/classes/Dnsruby/SelectInterface.src/M000006.html +19 -0
  347. data/doc/classes/Dnsruby/SelectInterface.src/M000007.html +18 -0
  348. data/doc/classes/Dnsruby/SingleResolver.html +55 -33
  349. data/doc/classes/Dnsruby/SingleResolver.src/M000128.html +24 -51
  350. data/doc/classes/Dnsruby/SingleResolver.src/M000129.html +11 -6
  351. data/doc/classes/Dnsruby/SingleResolver.src/M000130.html +21 -0
  352. data/doc/classes/Dnsruby/SingleResolver.src/M000149.html +18 -0
  353. data/doc/classes/Dnsruby/SingleResolver.src/M000150.html +19 -0
  354. data/doc/classes/Dnsruby/SingleResolver.src/M000151.html +49 -0
  355. data/doc/classes/Dnsruby/SingleResolver.src/M000152.html +18 -0
  356. data/doc/classes/Dnsruby/SingleResolver.src/M000153.html +21 -0
  357. data/doc/classes/Dnsruby/SingleResolver.src/M000154.html +25 -0
  358. data/doc/classes/Dnsruby/SingleResolver.src/M000155.html +51 -0
  359. data/doc/classes/Dnsruby/SingleResolver.src/M000156.html +26 -0
  360. data/doc/classes/Dnsruby/SingleResolver.src/M000157.html +21 -0
  361. data/doc/classes/Dnsruby/TheLog.html +17 -17
  362. data/doc/classes/Dnsruby/TheLog.src/M000189.html +4 -4
  363. data/doc/classes/Dnsruby/TheLog.src/M000190.html +4 -4
  364. data/doc/classes/Dnsruby/TheLog.src/M000191.html +20 -0
  365. data/doc/classes/Dnsruby/TheLog.src/M000216.html +20 -0
  366. data/doc/classes/Dnsruby/TheLog.src/M000217.html +20 -0
  367. data/doc/classes/Dnsruby/TheLog.src/M000218.html +20 -0
  368. data/doc/classes/Dnsruby/Update.html +31 -31
  369. data/doc/classes/Dnsruby/Update.src/M000192.html +17 -22
  370. data/doc/classes/Dnsruby/Update.src/M000193.html +11 -6
  371. data/doc/classes/Dnsruby/Update.src/M000194.html +15 -24
  372. data/doc/classes/Dnsruby/Update.src/M000195.html +26 -19
  373. data/doc/classes/Dnsruby/Update.src/M000196.html +34 -0
  374. data/doc/classes/Dnsruby/Update.src/M000219.html +32 -0
  375. data/doc/classes/Dnsruby/Update.src/M000220.html +37 -0
  376. data/doc/classes/Dnsruby/Update.src/M000221.html +32 -0
  377. data/doc/classes/Dnsruby/Update.src/M000222.html +41 -0
  378. data/doc/classes/Dnsruby/Update.src/M000223.html +34 -0
  379. data/doc/classes/Dnsruby/ZoneTransfer/Delta.src/M000104.html +19 -0
  380. data/doc/classes/Dnsruby/ZoneTransfer.src/M000102.html +22 -0
  381. data/doc/classes/Dnsruby/ZoneTransfer.src/M000103.html +35 -0
  382. data/doc/classes/Dnsruby.html +12 -0
  383. data/doc/created.rid +1 -1
  384. data/doc/files/lib/Dnsruby/Config_rb.html +1 -1
  385. data/doc/files/lib/Dnsruby/Resolver_rb.html +2 -1
  386. data/doc/files/lib/Dnsruby/SelectInterface_rb.html +108 -0
  387. data/doc/files/lib/Dnsruby/SingleResolver_rb.html +1 -1
  388. data/doc/files/lib/Dnsruby/event_machine_interface_rb.html +108 -0
  389. data/doc/files/lib/Dnsruby/message_rb.html +1 -1
  390. data/doc/files/lib/Dnsruby/select_thread_rb.html +1 -1
  391. data/doc/files/lib/Dnsruby/zone_transfer_rb.html +1 -1
  392. data/doc/files/lib/dnsruby_rb.html +1 -1
  393. data/doc/fr_file_index.html +1 -0
  394. data/doc/fr_method_index.html +130 -125
  395. data/lib/Dnsruby/Config.rb +8 -1
  396. data/lib/Dnsruby/Resolver.rb +496 -217
  397. data/lib/Dnsruby/SingleResolver.rb +105 -10
  398. data/lib/Dnsruby/event_machine_interface.rb +265 -0
  399. data/lib/Dnsruby/message.rb +1 -1
  400. data/lib/Dnsruby/select_thread.rb +26 -60
  401. data/lib/Dnsruby/zone_transfer.rb +3 -1
  402. data/lib/dnsruby.rb +8 -0
  403. data/test/tc_em_deferrable.rb +47 -0
  404. data/test/tc_event_machine_deferrable.rb +85 -0
  405. data/test/tc_event_machine_res.rb +174 -0
  406. data/test/tc_event_machine_single_res.rb +101 -0
  407. data/test/tc_event_machine_soak.rb +98 -0
  408. data/test/tc_inet6.rb +170 -0
  409. data/test/tc_resolver.rb +71 -63
  410. data/test/tc_single_resolver.rb +71 -53
  411. data/test/tc_soak.rb +12 -113
  412. data/test/tc_soak_base.rb +136 -0
  413. data/test/ts_online.rb +14 -6
  414. metadata +277 -2
@@ -40,10 +40,27 @@ module Dnsruby
40
40
  #=== Asynchronous
41
41
  #These methods use a response queue to return the response and the error
42
42
  #
43
- #* Dnsruby::Resolver#send_async(msg, query_id, response_queue)
43
+ #* Dnsruby::Resolver#send_async(msg, response_queue, query_id)
44
44
  #
45
-
45
+ #== Event Loop
46
+ #Dnsruby runs a pure Ruby event loop to handle I/O in a single thread.
47
+ #It is also possible to configure Dnsruby to use EventMachine instead.
48
+ #See the Dnsruby::Resolver::use_eventmachine method for details.
49
+ #
50
+ #Note that, if using Dnsruby from an EventMachine loop, you will need to tell
51
+ #Dnsruby not to start the event loop itself :
52
+ #
53
+ # Dnsruby::Resolver::use_eventmachine(true)
54
+ # Dnsruby::Resolver::start_eventmachine_loop(false)
46
55
  class Resolver
56
+ @@event_machine_available=false
57
+ begin
58
+ require 'Dnsruby/event_machine_interface'
59
+ @@event_machine_available=true
60
+ TheLog.debug("EventMachine loaded")
61
+ rescue LoadError
62
+ TheLog.error("EventMachine not found")
63
+ end
47
64
  DefaultQueryTimeout = 0
48
65
  DefaultPacketTimeout = 10
49
66
  DefaultRetryTimes = 4
@@ -100,6 +117,9 @@ module Dnsruby
100
117
  # being targetted, and a new nameserver will be queried with the resultant delay.
101
118
  attr_accessor :retry_times, :retry_delay
102
119
 
120
+ @@use_eventmachine=false
121
+ @@start_eventmachine_loop=true
122
+
103
123
  #--
104
124
  #@TODO@ add load_balance? i.e. Target nameservers in a random, rather than pre-determined, order?
105
125
  #++
@@ -147,16 +167,6 @@ module Dnsruby
147
167
  else
148
168
  return result
149
169
  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
170
  end
161
171
 
162
172
 
@@ -173,9 +183,9 @@ module Dnsruby
173
183
  # res = Dnsruby::Resolver.new
174
184
  # query_id = 10 # can be any object you like
175
185
  # query_queue = Queue.new
176
- # res.send_async(Message.new("example.com", Types.MX), query_id, query_queue)
186
+ # res.send_async(Message.new("example.com", Types.MX), query_queue, query_id)
177
187
  # query_id += 1
178
- # res.send_async(Message.new("example.com", Types.A), query_id, query_queue)
188
+ # res.send_async(Message.new("example.com", Types.A), query_queue, query_id)
179
189
  # # ...do a load of other stuff here...
180
190
  # 2.times do
181
191
  # response_id, response, exception = query_queue.pop
@@ -186,7 +196,463 @@ module Dnsruby
186
196
  # # deal with problem
187
197
  # end
188
198
  # end
189
- def send_async(msg, client_query_id, client_queue)
199
+ # @TODO@ Sort out RDoc arguments to send_async!
200
+ def send_async(*args) # msg, client_queue, client_query_id)
201
+ if (Resolver.eventmachine?)
202
+ if (!@resolver_em)
203
+ @resolver_em = ResolverEM.new(self)
204
+ end
205
+ return @resolver_em.send_async(*args)
206
+ else
207
+ if (!@resolver_ruby) # @TODO@ Synchronize this?
208
+ @resolver_ruby = ResolverRuby.new(self)
209
+ end
210
+ return @resolver_ruby.send_async(*args)
211
+ end
212
+ end
213
+
214
+ # Close the Resolver. Unfinished queries are terminated with OtherResolvError.
215
+ def close
216
+ [@resolver_em, @resolver_ruby].each do |r| r.close if r end
217
+ end
218
+
219
+ # Create a new Resolver object. If no parameters are passed in, then the default
220
+ # system configuration will be used. Otherwise, a Hash may be passed in with the
221
+ # following optional elements :
222
+ #
223
+ #
224
+ # * :port
225
+ # * :use_tcp
226
+ # * :tsig_key
227
+ # * :ignore_truncation
228
+ # * :src_address
229
+ # * :src_port
230
+ # * :persistent_tcp
231
+ # * :persistent_udp
232
+ # * :recurse
233
+ # * :udp_size
234
+ # * :config_info - see Config
235
+ # * :nameserver - can be either a String or an array of Strings
236
+ # * :packet_timeout
237
+ # * :query_timeout
238
+ # * :retry_times
239
+ # * :retry_delay
240
+ def initialize(*args)
241
+ reset_attributes
242
+
243
+ # Process args
244
+ if (args.length==1)
245
+ if (args[0].class == Hash)
246
+ args[0].keys.each do |key|
247
+ begin
248
+ if (key == :config_info)
249
+ @config.set_config_info(args[0][:config_info])
250
+ elsif (key==:nameserver)
251
+ set_config_nameserver(args[0][:nameserver])
252
+ else
253
+ send(key.to_s+"=", args[0][key])
254
+ end
255
+ rescue Exception
256
+ TheLog.error("Argument #{key} not valid\n")
257
+ end
258
+ end
259
+ elsif (args[0].class == String)
260
+ set_config_nameserver(args[0])
261
+ elsif (args[0].class == Config)
262
+ # also accepts a Config object from Dnsruby::Resolv
263
+ @config = args[0]
264
+ end
265
+ else
266
+ #@TODO@ ?
267
+ end
268
+ if (@single_resolvers==[])
269
+ add_config_nameservers
270
+ end
271
+ update
272
+ end
273
+
274
+ def add_config_nameservers
275
+ # Add the Config nameservers
276
+ @config.nameserver.each do |ns|
277
+ @single_resolvers.push(SingleResolver.new({:server=>ns}))
278
+ end
279
+ end
280
+
281
+ def set_config_nameserver(n)
282
+ if (n).kind_of?String
283
+ @config.nameserver=[n]
284
+ else
285
+ @config.nameserver=n
286
+ end
287
+ end
288
+
289
+ def reset_attributes #:nodoc: all
290
+ if (@resolver_em)
291
+ @resolver_em.reset_attributes
292
+ end
293
+ if (@resolver_ruby)
294
+ @resolver_ruby.reset_attributes
295
+ end
296
+
297
+ # Attributes
298
+ @query_timeout = DefaultQueryTimeout
299
+ @retry_delay = DefaultRetryDelay
300
+ @retry_times = DefaultRetryTimes
301
+ @packet_timeout = DefaultPacketTimeout
302
+ @port = DefaultPort
303
+ @udp_size = DefaultUDPSize
304
+ @use_tcp = false
305
+ @tsig_key = nil
306
+ @ignore_truncation = false
307
+ @config = Config.new()
308
+ @src_addr = '0.0.0.0'
309
+ @src_port = 0
310
+ @recurse = true
311
+ @persistent_udp = false
312
+ @persistent_tcp = false
313
+ @single_resolvers=[]
314
+ end
315
+
316
+ def update #:nodoc: all
317
+ #Update any resolvers we have with the latest config
318
+ @single_resolvers.each do |res|
319
+ [:port, :use_tcp, :tsig_key, :ignore_truncation, :packet_timeout,
320
+ :src_address, :src_port, :persistent_tcp, :persistent_udp, :recurse,
321
+ :udp_size].each do |param|
322
+
323
+ res.send(param.to_s+"=", instance_variable_get("@"+param.to_s))
324
+ end
325
+ end
326
+ end
327
+
328
+ # Add a new SingleResolver to the list of resolvers this Resolver object will
329
+ # query.
330
+ def add_resolver(single)
331
+ @single_resolvers.push(single)
332
+ end
333
+
334
+ def nameserver=(n)
335
+ @single_resolvers=[]
336
+ set_config_nameserver(n)
337
+ add_config_nameservers
338
+ end
339
+
340
+ def packet_timeout=(t)
341
+ @packet_timeout = t
342
+ update
343
+ end
344
+
345
+ def port=(p)
346
+ @port = p
347
+ update
348
+ end
349
+
350
+ def use_tcp=(on)
351
+ @use_tcp = on
352
+ update
353
+ end
354
+
355
+ def tsig_key=(t)
356
+ @tsig_key = t
357
+ update
358
+ end
359
+
360
+ def ignore_truncation=(on)
361
+ @ignore_truncation = on
362
+ update
363
+ end
364
+
365
+ def src_address=(a)
366
+ @src_address = a
367
+ update
368
+ end
369
+
370
+ def src_port=(a)
371
+ @src_port = a
372
+ update
373
+ end
374
+
375
+ def persistent_tcp=(on)
376
+ @persistent_tcp = on
377
+ update
378
+ end
379
+
380
+ def persistent_udp=(on)
381
+ @persistent_udp = on
382
+ update
383
+ end
384
+
385
+ def recurse=(a)
386
+ @recurse = a
387
+ update
388
+ end
389
+
390
+ def udp_size=(s)
391
+ @udp_size = s
392
+ update
393
+ end
394
+ #Tell Dnsruby to use EventMachine for I/O.
395
+ #
396
+ #If EventMachine is not used, then the pure Ruby event loop in Dnsruby will
397
+ #be used instead.
398
+ #
399
+ #If EventMachine is not available on the platform, then a RuntimeError will be raised.
400
+ #
401
+ #Takes a bool to say whether or not to use EventMachine.
402
+ def Resolver.use_eventmachine(on=true)
403
+ if (!@@event_machine_available)
404
+ raise RuntimeError.new("EventMachine is not available in this environment!")
405
+ end
406
+ @@use_eventmachine = on
407
+ if (on)
408
+ TheLog.info("EventMachine will be used for IO")
409
+ else
410
+ TheLog.info("EventMachine will not be used for IO")
411
+ end
412
+ end
413
+ #Check whether EventMachine will be used by Dnsruby
414
+ def Resolver.eventmachine?
415
+ return @@use_eventmachine
416
+ end
417
+ #If EventMachine is being used, then this method tells Dnsruby whether or not
418
+ #to start the EventMachine loop. If you want to use Dnsruby client code as
419
+ #is, but using EventMachine for I/O, then Dnsruby must start the EventMachine
420
+ #loop for you. This is the default behaviour.
421
+ #If you want to use EventMachine-style code, where everything is wrapped
422
+ #up in an EventMachine::run{} call, then this method should be called with
423
+ #false as the parameter.
424
+ #
425
+ #Takes a bool argument to say whether or not to start the event loop when required.
426
+ def Resolver.start_eventmachine_loop(on=true)
427
+ @@start_eventmachine_loop=on
428
+ if (on)
429
+ TheLog.info("EventMachine loop will be started by Dnsruby")
430
+ else
431
+ TheLog.info("EventMachine loop will not be started by Dnsruby")
432
+ end
433
+ end
434
+ #Checks whether Dnsruby will start the EventMachine loop when required.
435
+ def Resolver.start_eventmachine_loop?
436
+ return @@start_eventmachine_loop
437
+ end
438
+ def generate_timeouts(base=0) #:nodoc: all
439
+ #These should be be pegged to the single_resolver they are targetting :
440
+ # e.g. timeouts[timeout1]=nameserver
441
+ timeouts = {}
442
+ retry_delay = @retry_delay
443
+ @retry_times.times do |retry_count|
444
+ if (retry_count>0)
445
+ retry_delay *= 2
446
+ end
447
+ servers=[]
448
+ @single_resolvers.each do |r| servers.push(r.server) end
449
+ @single_resolvers.each_index do |i|
450
+ res= @single_resolvers[i]
451
+ offset = (i*@retry_delay.to_f/@single_resolvers.length)
452
+ if (retry_count==0)
453
+ timeouts[base+offset]=[res, retry_count]
454
+ else
455
+ if (timeouts.has_key?(base+retry_delay+offset))
456
+ TheLog.error("Duplicate timeout key!")
457
+ raise RuntimeError.new("Duplicate timeout key!")
458
+ end
459
+ timeouts[base+retry_delay+offset]=[res, retry_count]
460
+ end
461
+ end
462
+ end
463
+ return timeouts
464
+ end
465
+ end
466
+
467
+ # This class implements the I/O using EventMachine.
468
+ # NOTE - EM does not work properly on Windows with version 0.8.1 - do not use!
469
+ class ResolverEM #:nodoc: all
470
+ TIMER_PERIOD = 0.1
471
+ def initialize(parent)
472
+ @parent=parent
473
+ end
474
+ def reset_attributes #:nodoc: all
475
+ end
476
+ class PersistentData
477
+ attr_accessor :outstanding, :deferrable, :to_send, :timeouts, :timer_procs, :timer_keys_sorted, :finish
478
+ end
479
+ def send_async(*args) #msg, client_queue=nil, client_query_id=nil)
480
+ msg=args[0]
481
+ client_queue=nil
482
+ client_query_id=nil
483
+ if (args.length>1)
484
+ client_queue=args[1]
485
+ if (args.length > 2)
486
+ client_query_id = args[2]
487
+ end
488
+ end
489
+ # We want to send the query to the first resolver.
490
+ # We then want to set up all the timers for all of the events which might happen
491
+ # (first round timers, retry timers, etc.)
492
+ # The callbacks for these should be able to cancel any of the rest (including any for broken resolvers)
493
+ # We can then forget about the query, as all the callbacks will be lodged with EventMachine.
494
+
495
+ EventMachineInterface::start_em_for_resolver(self)
496
+ persistent_data = PersistentData.new
497
+ persistent_data.deferrable = EM::DefaultDeferrable.new
498
+ persistent_data.outstanding = []
499
+ persistent_data.to_send = 0
500
+ persistent_data.timeouts=@parent.generate_timeouts(Time.now)
501
+ persistent_data.timer_procs = {}
502
+ persistent_data.finish = false
503
+ persistent_data.timeouts.keys.sort.each do |timeout|
504
+ value = persistent_data.timeouts[timeout]
505
+ # timeout = timeout.round
506
+ single_resolver, retry_count = value
507
+ persistent_data.to_send+=1
508
+ df = nil
509
+ if (timeout == 0)
510
+ # Send immediately
511
+ TheLog.debug("Sending first EM query")
512
+ df = send_new_em_query(single_resolver, msg, client_queue, client_query_id, persistent_data)
513
+ persistent_data.outstanding.push(df)
514
+ else
515
+ # Send later
516
+ persistent_data.timer_procs[timeout]=Proc.new{
517
+ TheLog.debug("Sending #{timeout} delayed EM query")
518
+ df = send_new_em_query(single_resolver, msg, client_queue, client_query_id, persistent_data)
519
+ persistent_data.outstanding.push(df)
520
+ }
521
+ end
522
+ end
523
+ query_timeout = @parent.query_timeout
524
+ if (query_timeout > 0)
525
+ persistent_data.timer_procs[Time.now+query_timeout]=Proc.new{
526
+ cancel_queries(persistent_data)
527
+ return_to_client(persistent_data.deferrable, client_queue, client_query_id, nil, ResolvTimeout.new("Query timed out after query_timeout=#{query_timeout.round} seconds"))
528
+ }
529
+ end
530
+ persistent_data.timer_keys_sorted = persistent_data.timer_procs.keys.sort
531
+ EventMachine::add_timer(0) {process_eventmachine_timers(persistent_data)}
532
+ return persistent_data.deferrable
533
+ end
534
+
535
+ def process_eventmachine_timers(persistent_data)
536
+ if (persistent_data.finish)
537
+ return
538
+ end
539
+ now = Time.now
540
+ persistent_data.timer_keys_sorted.each do |timeout|
541
+ if (timeout > now)
542
+ break
543
+ end
544
+ persistent_data.timer_procs[timeout].call
545
+ persistent_data.timer_procs.delete(timeout)
546
+ persistent_data.timer_keys_sorted.delete(timeout)
547
+ end
548
+ EventMachine::add_timer(TIMER_PERIOD) {process_eventmachine_timers(persistent_data)}
549
+ end
550
+
551
+ def send_new_em_query(single_resolver, msg, client_queue, client_query_id, persistent_data)
552
+ df = single_resolver.send_async(msg) # client_queue, client_query_id)
553
+ persistent_data.to_send-=1
554
+ df.callback { |answer|
555
+ TheLog.debug("Response returned, answer=#{answer}")
556
+ persistent_data.outstanding.delete(df)
557
+ cancel_queries(persistent_data)
558
+ return_to_client(persistent_data.deferrable, client_queue, client_query_id, answer, nil)
559
+ }
560
+ df.errback { |response, error|
561
+ TheLog.debug("Error #{error} returned, response=#{response}")
562
+ persistent_data.outstanding.delete(df)
563
+ if (response!="cancelling")
564
+
565
+ if (error.kind_of?(ResolvTimeout))
566
+ # - if it was a timeout, then check which number it was, and how many retries are expected on that server
567
+ # - if it was the last retry, on the last server, then return a timeout to the client (and clean up)
568
+ # - otherwise, continue
569
+ # Do we have any more packets to send to this resolver?
570
+ if (persistent_data.outstanding.empty? && persistent_data.to_send==0)
571
+ TheLog.debug("Sending timeout to client")
572
+ return_to_client(persistent_data.deferrable, client_queue, client_query_id, response, error)
573
+ end
574
+ elsif (error.kind_of?NXDomain)
575
+ # - if it was an NXDomain, then return that to the client, and stop all new queries (and clean up)
576
+ TheLog.debug("NXDomain - returning to client")
577
+ cancel_queries(persistent_data)
578
+ return_to_client(persistent_data.deferrable, client_queue, client_query_id, response, error)
579
+ else
580
+ # - if it was any other error, then remove that server from the list for that query
581
+ # If a Too Many Open Files error, then don't remove, but let retry work.
582
+ if (!(error.to_s=~/Errno::EMFILE/))
583
+ remove_server(single_resolver, persistent_data)
584
+ TheLog.debug("Removing #{single_resolver.server} from resolver list for this query")
585
+ else
586
+ TheLog.debug("NOT Removing #{single_resolver.server} due to Errno::EMFILE")
587
+ end
588
+ # - if it was the last server, then return an error to the client (and clean up)
589
+ if (persistent_data.outstanding.empty? && persistent_data.to_send==0)
590
+ # if (outstanding.empty?)
591
+ TheLog.debug("Sending error to client")
592
+ return_to_client(persistent_data.deferrable, client_queue, client_query_id, response, error)
593
+ end
594
+ end
595
+ end
596
+ }
597
+ return df
598
+ end
599
+
600
+ def remove_server(server, persistent_data)
601
+ # Go through persistent_data.timeouts and check all the values for that resolver
602
+ persistent_data.timeouts.each do |key, value|
603
+ if (value[0] == server)
604
+ # Remove the server from the list
605
+ persistent_data.timer_procs.delete(key)
606
+ persistent_data.timer_keys_sorted.delete(key)
607
+ end
608
+ end
609
+ end
610
+
611
+ def cancel_queries(persistent_data)
612
+ TheLog.debug("Cancelling EM queries")
613
+ persistent_data.outstanding.each do |df|
614
+ df.set_deferred_status :failed, "cancelling", "cancelling"
615
+ end
616
+ # Cancel the next tick
617
+ persistent_data.finish = true
618
+ end
619
+
620
+ def return_to_client(deferrable, client_queue, client_query_id, answer, error)
621
+ TheLog.debug("Returning answer=#{answer}, error=#{error} to client")
622
+ if (client_queue)
623
+ client_queue.push([client_query_id, answer, error])
624
+ end
625
+ # We call set_defered_status when done
626
+ if (error != nil)
627
+ deferrable.set_deferred_status :failed, answer, error
628
+ else
629
+ deferrable.set_deferred_status :succeeded, answer
630
+ end
631
+ EventMachineInterface::stop_em_for_resolver(self)
632
+ end
633
+ end
634
+
635
+ # This class implements the I/O using pure Ruby, with no dependencies.
636
+ class ResolverRuby #:nodoc: all
637
+ def initialize(parent)
638
+ reset_attributes
639
+ @parent=parent
640
+ end
641
+ def reset_attributes #:nodoc: all
642
+ # data structures
643
+ @mutex=Mutex.new
644
+ @query_list = {}
645
+ @timeouts = {}
646
+ end
647
+ def send_async(*args) # msg, client_queue, client_query_id=nil)
648
+ msg=args[0]
649
+ client_queue=nil
650
+ client_query_id=nil
651
+ client_queue=args[1]
652
+ if (args.length > 2)
653
+ client_query_id = args[2]
654
+ end
655
+
190
656
  # This is the whole point of the Resolver class.
191
657
  # We want to use multiple SingleResolvers to run a query.
192
658
  # So we kick off a system with select_thread where we send
@@ -197,6 +663,9 @@ module Dnsruby
197
663
  # to the client queue.
198
664
 
199
665
  q = Queue.new
666
+ if (client_query_id==nil)
667
+ client_query_id = msg
668
+ end
200
669
 
201
670
  if (!client_queue.kind_of?Queue)
202
671
  TheLog.error("Wrong type for client_queue in Resolver#send_async")
@@ -222,8 +691,8 @@ module Dnsruby
222
691
  outstanding = []
223
692
  @query_list[client_query_id]=[msg, client_queue, q, outstanding]
224
693
 
225
- query_timeout = Time.now+@query_timeout
226
- if (@query_timeout == 0)
694
+ query_timeout = Time.now+@parent.query_timeout
695
+ if (@parent.query_timeout == 0)
227
696
  query_timeout = Time.now+31536000 # a year from now
228
697
  end
229
698
  @timeouts[client_query_id]=[query_timeout, generate_timeouts()]
@@ -234,6 +703,7 @@ module Dnsruby
234
703
  st = SelectThread.instance
235
704
  st.add_observer(q, self)
236
705
  tick if tick_needed
706
+ return client_query_id
237
707
  end
238
708
 
239
709
  def generate_timeouts() #:nodoc: all
@@ -243,34 +713,11 @@ module Dnsruby
243
713
  # These should be absolute, rather than relative
244
714
  # The first value should be Time.now
245
715
  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
716
+ timeouts=@parent.generate_timeouts(time_now)
717
+ return timeouts
271
718
  end
272
719
 
273
- # Close the Resolver. Unfinished queries are terminated with OtherResolError.
720
+ # Close the Resolver. Unfinished queries are terminated with OtherResolvError.
274
721
  def close
275
722
  @mutex.synchronize {
276
723
  @query_list.each do |client_query_id, values|
@@ -326,7 +773,7 @@ module Dnsruby
326
773
  outstanding.push(id)
327
774
  timeouts_done.push(timeout)
328
775
  timeouts.delete(timeout)
329
- res.send_async(msg, id, select_queue)
776
+ res.send_async(msg, select_queue, id)
330
777
  else
331
778
  break
332
779
  end
@@ -349,6 +796,10 @@ module Dnsruby
349
796
  # just ignore it. It may be for a query we've already completed.
350
797
  #
351
798
  # So, get the next response from the queue (presuming there is one!)
799
+ #
800
+ # @TODO@ Tick could poll the queue and then call this method if needed - no need for observer interface.
801
+ # @TODO@ Currently, tick and handle_queue_event called from select_thread - could have thread chuck events in to tick_queue. But then, clients would have to call in on other thread!
802
+ #
352
803
  if (queue.empty?)
353
804
  TheLog.fatal("Queue empty in handle_queue_event!")
354
805
  raise RuntimeError.new("Severe internal error - Queue empty in handle_queue_event")
@@ -442,177 +893,5 @@ module Dnsruby
442
893
  send_result_and_close(client_queue, client_query_id, select_queue, response, nil)
443
894
  }
444
895
  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
896
+ end
618
897
  end