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
@@ -176,7 +176,12 @@ module Dnsruby
176
176
  end
177
177
 
178
178
 
179
- # Asynchronously send a Message to the server. A client_queue is supplied by the client,
179
+ # Asynchronously send a Message to the server. The send can be done using just
180
+ # Dnsruby, or using EventMachine.
181
+ #
182
+ #= If the pure Ruby event loop supplied weith Dnsruby is being used, then :
183
+ #
184
+ # A client_queue is supplied by the client,
180
185
  # along with a client_query_id to identify the response. When the response is known, the tuple
181
186
  # (query_id, response_message, response_exception) is put in the queue for the client to process.
182
187
  #
@@ -187,11 +192,31 @@ module Dnsruby
187
192
  # Takes :
188
193
  #
189
194
  # * msg - the message to send
190
- # * client_query_id - an ID to identify the query to the client
191
195
  # * client_queue - a Queue to push the response to, when it arrives
196
+ # * client_query_id - an ID to identify the query to the client
192
197
  # * use_tcp - whether to use TCP (defaults to SingleResolver.use_tcp)
193
- def send_async(msg, client_query_id, client_queue, use_tcp=@use_tcp)
194
- st = SelectThread.instance
198
+ #
199
+ # If the native Dsnruby networking layer is being used, then this method returns the client_query_id
200
+ #
201
+ # id = res.send_async(msg, queue)
202
+ # NOT SUPPORTED : id = res.send_async(msg, queue, use_tcp)
203
+ # id = res.send_async(msg, queue, id)
204
+ # id = res.send_async(msg, queue, id, use_tcp)
205
+ #
206
+ #= If EventMachine is being used :
207
+ #
208
+ # If EventMachine is being used (see Dnsruby::Resolver::use_eventmachine, then this method returns
209
+ # an EM::Deferrable object. If a queue (and ID) is passed in, then the response will also be
210
+ # pushed to the Queue (as well as the deferrable completing).
211
+ #
212
+ # deferrable = res.send_async(msg)
213
+ # deferrable = res.send_async(msg, use_tcp)
214
+ # deferrable = res.send_async(msg, q, id, use_tcp)
215
+ def send_async(*args) # msg, client_queue, client_query_id, use_tcp=@use_tcp)
216
+ msg = args[0]
217
+ client_query_id = nil
218
+ client_queue = nil
219
+ use_tcp = @use_tcp
195
220
  if (msg.kind_of?String)
196
221
  msg = Message.new(msg)
197
222
  end
@@ -199,9 +224,68 @@ module Dnsruby
199
224
  if (udp_packet_size < query_packet.length)
200
225
  use_tcp = true
201
226
  end
227
+ if (args.length > 1)
228
+ if (args[1].class==Queue)
229
+ client_queue = args[1]
230
+ elsif (args.length == 2)
231
+ use_tcp = args[1]
232
+ end
233
+ if (args.length > 2)
234
+ client_query_id = args[2]
235
+ if (args.length > 3)
236
+ use_tcp = args[3]
237
+ end
238
+ end
239
+ end
240
+ #Are we using EventMachine or native Dnsruby?
241
+ if (Resolver.eventmachine?)
242
+ return send_eventmachine(query_packet, msg.header.id, client_query_id, client_queue, use_tcp)
243
+ else
244
+ if (!client_query_id)
245
+ client_query_id = msg
246
+ end
247
+ send_dnsruby(query_packet, msg.header.id, client_query_id, client_queue, use_tcp)
248
+ return client_query_id
249
+ end
250
+ end
251
+
252
+ # This method sends the packet using EventMachine
253
+ def send_eventmachine(msg, header_id, client_query_id, client_queue, use_tcp, client_deferrable=nil) #:nodoc: all
254
+ if (!client_deferrable)
255
+ client_deferrable = EventMachine::DefaultDeferrable.new
256
+ end
257
+ packet_deferrable = EventMachineInterface.send(:msg=>msg, :header_id=>header_id, :timeout=>@packet_timeout, :server=>@server, :port=>@port, :src_addr=>@src_addr, :src_port=>@src_port, :tsig_key=>@tsig_key, :ignore_truncation=>@ignore_truncation, :use_tcp=>use_tcp)
258
+ packet_deferrable.callback { |response|
259
+ TheLog.debug("EM callback #{response}")
260
+ # @TODO@ Check TSIG!
261
+ ret = true
262
+ if (response.header.tc && !use_tcp)
263
+ # Try to resend over tcp
264
+ TheLog.debug("Truncated - resending over TCP")
265
+ send_eventmachine(msg, header_id, client_query_id, client_queue, true, client_deferrable)
266
+ else
267
+ client_deferrable.set_deferred_status :succeeded, response
268
+ if (client_queue)
269
+ client_queue.push([client_query_id, response, nil])
270
+ end
271
+ end
272
+ }
273
+ packet_deferrable.errback { |response, error|
274
+ TheLog.debug("EM errback #{error}, #{response}")
275
+ client_deferrable.set_deferred_status :failed, response, error
276
+ if (client_queue)
277
+ client_queue.push([client_query_id, response, error])
278
+ end
279
+ }
280
+ return client_deferrable
281
+ end
282
+
283
+ # This method sends the packet using the built-in pure Ruby event loop, with no dependencies.
284
+ def send_dnsruby(query_packet, header_id, client_query_id, client_queue, use_tcp) #:nodoc: all
285
+ endtime = Time.now + @packet_timeout
202
286
  # First send the query (synchronously)
203
287
  # @TODO@ persisent sockets
204
- endtime = Time.now + @packet_timeout
288
+ st = SelectThread.instance
205
289
  socket = nil
206
290
  begin
207
291
  #@TODO@ Different OSes have different interpretations of "random port" here.
@@ -210,7 +294,6 @@ module Dnsruby
210
294
  #We need to determine an actual (random) number here, then ask the OS for it, and
211
295
  #continue until we get one.
212
296
  if (use_tcp)
213
- print "Setting src_port to #{@src_port}"
214
297
  socket = TCPSocket.new(@server, @port, @src_addr, @src_port)
215
298
  else
216
299
  socket = UDPSocket.new()
@@ -223,13 +306,13 @@ module Dnsruby
223
306
  end
224
307
  err=IOError.new("dnsruby can't connect to #{@server}:#{@port} from #{@src_addr}:#{@src_port}, use_tcp=#{use_tcp}, exception = #{e.class}, #{e}")
225
308
  TheLog.error("#{err}")
226
- st.push_exception_to_select(client_query_id, client_queue, err, nil)
309
+ st.push_exception_to_select(client_query_id, client_queue, err, nil) # @TODO Do we still need this? Can we not just send it from here?
227
310
  return
228
311
  end
229
312
  if (socket==nil)
230
313
  err=IOError.new("dnsruby can't connect to #{@server}:#{port} from #{@src_addr}:#{@src_port}, use_tcp=#{use_tcp}")
231
314
  TheLog.error("#{err}")
232
- st.push_exception_to_select(client_query_id, client_queue, err, nil)
315
+ st.push_exception_to_select(client_query_id, client_queue, err, nil) # @TODO Do we still need this? Can we not just send it from here?
233
316
  return
234
317
  end
235
318
  TheLog.debug("Sending packet to #{@server}:#{@port} from #{@src_addr}:#{@src_port}, use_tcp=#{use_tcp}")
@@ -248,12 +331,24 @@ module Dnsruby
248
331
  end
249
332
 
250
333
  # Then listen for the response
251
- query_settings = SelectThread::QuerySettings.new(query_packet, msg.header.id, @tsig_key, @ignore_truncation, client_queue, client_query_id, socket, @server, @port, endtime)
334
+ query_settings = SelectThread::QuerySettings.new(query_packet, header_id, @tsig_key, @ignore_truncation, client_queue, client_query_id, socket, @server, @port, endtime, self)
252
335
  # The select thread will now wait for the response and send that or a timeout
253
- # back to the client_queue
336
+ # back to the client_queue.
254
337
  st.add_to_select(query_settings)
255
338
  end
256
339
 
340
+ def check_response(response, query, client_queue, client_query_id, tcp)
341
+ # @TODO@ Check TSIG!
342
+ ret = true
343
+ if (response.header.tc && !tcp)
344
+ # Try to resend over tcp
345
+ TheLog.debug("Truncated - resending over TCP")
346
+ send_async(Message.decode(query), client_queue, client_query_id, true)
347
+ ret=false
348
+ end
349
+ return ret
350
+ end
351
+
257
352
  # Prepare the packet for sending
258
353
  def make_query_packet(packet) #:nodoc: all
259
354
  if (packet.header.opcode == OpCode.QUERY || @recurse)
@@ -0,0 +1,265 @@
1
+ require 'eventmachine'
2
+ module Dnsruby
3
+ class EventMachineInterface#:nodoc: all
4
+ @@started_em_here = false
5
+ @@running_clients=[]
6
+ @@outstanding_sends = []
7
+ @@em_thread=nil
8
+ # We want to have one EM loop running continuously in this class.
9
+ # Remember to use stop_event_loop inside of EM callback in order to stop the event machine
10
+
11
+ # Timers - can't use EM timers as they max out at 1000.
12
+ # Instead, while queries are outstanding, call next_tick to manage our own list of timers.
13
+
14
+ @@timer_procs={} # timeout=>[proc
15
+ @@timer_keys_sorted=[]
16
+ TIMER_PERIOD = 0.1
17
+
18
+ def EventMachineInterface::process_timers
19
+ # Go through list of timers
20
+ now = Time.now
21
+ @@timer_keys_sorted.each do |timeout|
22
+ if (timeout > now)
23
+ break
24
+ end
25
+ c, proc = @@timer_procs[timeout]
26
+ proc.call
27
+ @@timer_procs.delete(timeout)
28
+ @@timer_keys_sorted.delete(timeout)
29
+ end
30
+
31
+ if (!@@outstanding_sends.empty?)
32
+ EventMachine::add_timer(TIMER_PERIOD) {process_timers}
33
+ end
34
+ end
35
+
36
+ def EventMachineInterface::remove_timer(c)
37
+ # Remove from timer structures - if still there!
38
+ @@timer_procs.each do |timeout, value|
39
+ conn, proc = value
40
+ if (c==conn)
41
+ @@timer_procs.delete(timeout)
42
+ @@timer_keys_sorted.delete(timeout)
43
+ end
44
+ end
45
+ end
46
+
47
+ def EventMachineInterface::add_to_outstanding(c, timeout)
48
+ # Add to timer structures
49
+ @@timer_procs[Time.now+timeout]=[c, Proc.new {
50
+ # Cancel the send
51
+ c.closing=true
52
+ c.close_connection
53
+ c.send_timeout
54
+ }]
55
+ @@timer_keys_sorted=@@timer_procs.keys.sort
56
+ @@outstanding_sends.push(c)
57
+ # puts "#{@@outstanding_sends.length} outstanding connections"
58
+ if (@@outstanding_sends.length==1)
59
+ EventMachine::add_timer(0) {process_timers}
60
+ end
61
+ end
62
+
63
+ def EventMachineInterface::remove_from_outstanding(c)
64
+ @@outstanding_sends.delete(c)
65
+ # puts "#{@@outstanding_sends.length} outstanding connections"
66
+ remove_timer(c)
67
+ # If we explicitly started the EM loop, and there are no more outstanding sends, then stop the EM loop
68
+ stop_eventmachine
69
+ end
70
+
71
+ def EventMachineInterface::start_eventmachine
72
+ if (!eventmachine_running?)
73
+ if Resolver.start_eventmachine_loop?
74
+ TheLog.debug("Starting EventMachine")
75
+ @@started_em_here = true
76
+ @@em_thread = Thread.new {
77
+ EM.run {
78
+ EventMachine::add_periodic_timer(0.1) {EventMachineInterface::process_timers}
79
+ @@df = EventMachine::DefaultDeferrable.new
80
+ @@df.callback{
81
+ TheLog.debug("Stopping EventMachine")
82
+ EM.stop
83
+ @@em_thread=nil
84
+ }
85
+ }
86
+ }
87
+ else
88
+ TheLog.debug("Not trying to start event loop")
89
+ end
90
+ end
91
+ end
92
+
93
+ def EventMachineInterface::start_em_for_resolver(res)
94
+ @@running_clients.push(res)
95
+ start_eventmachine
96
+ end
97
+
98
+ def EventMachineInterface::stop_em_for_resolver(res)
99
+ @@running_clients.each_index do |i|
100
+ if (@@running_clients[i]==res)
101
+ @@running_clients.delete_at(i)
102
+ end
103
+ end
104
+ stop_eventmachine
105
+ end
106
+
107
+ def EventMachineInterface::eventmachine_running?
108
+ return (@@em_thread!=nil)
109
+ end
110
+
111
+ def EventMachineInterface::stop_eventmachine
112
+ if (@@started_em_here)
113
+ if (@@outstanding_sends.size==0)
114
+ if (@@running_clients.length == 0)
115
+ if (@@em_thread)
116
+ @@df.set_deferred_status :succeeded
117
+ @@started_em_here = false
118
+ # @@em_thread = nil
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
124
+
125
+ def EventMachineInterface::send(args={})#msg, timeout, server, port, src_add, src_port, tsig_key, ignore_truncation, use_tcp)
126
+ # Is the EventMachine loop running? If not, we need to start it (and mark that we started it)
127
+ begin
128
+ if (!EventMachine.reactor_running?)
129
+ start_eventmachine
130
+ end
131
+ rescue Exception
132
+ #@TODO@ EM::reactor_running? only introduced in EM v0.9.0 - if it's not there, we simply don't know what to do...
133
+ TheLog.error("EventMachine::reactor_running? not available.")
134
+ # if Resolver.start_eventmachine_loop?
135
+ # TheLog.debug("Trying to start event loop - may prove fatal...")
136
+ start_eventmachine
137
+ # else
138
+ # TheLog.debug("Not trying to start event loop.")
139
+ # end
140
+ end
141
+ df = nil
142
+ if (args[:use_tcp])
143
+ df = send_tcp(args)
144
+ else
145
+ df = send_udp(args)
146
+ end
147
+ # Need to add this send to the list of outstanding sends
148
+ add_to_outstanding(df, args[:timeout])
149
+ return df
150
+ end
151
+
152
+ def EventMachineInterface::send_tcp(args={})#msg, timeout, server, port, src_add, src_port, tsig_key, ignore_truncation, use_tcp)
153
+ connection = EventMachine::connect(args[:server], args[:port], EmTcpHandler) { |c|
154
+ #@TODO SRC_PORT FOR TCP!!!
155
+ c.timeout_time=Time.now + args[:timeout]
156
+ c.instance_eval {@args = args}
157
+ lenmsg = [args[:msg].length].pack('n')
158
+ c.send_data(lenmsg)
159
+ c.send_data args[:msg] # , args[:server], args[:port]
160
+ TheLog.debug"EventMachine : Sent TCP packet to #{args[:server]}:#{args[:port]}" + # from #{args[:src_addr]}:#{args[:src_port]}, timeout=#{args[:timeout]}"
161
+ ", timeout=#{args[:timeout]}"
162
+ }
163
+ return connection # allows clients to set callback, errback, etc., if desired
164
+ end
165
+
166
+ def EventMachineInterface::send_udp(args={})# msg, timeout, server, port, src_add, src_port, tsig_key, ignore_truncation, use_cp)
167
+ connection = EventMachine::open_datagram_socket(args[:src_addr], args[:src_port], EmUdpHandler) { |c|
168
+ c.timeout_time=Time.now + args[:timeout]
169
+ c.instance_eval {@args = args}
170
+ c.send_datagram args[:msg], args[:server], args[:port]
171
+ TheLog.debug"EventMachine : Sent datagram to #{args[:server]}:#{args[:port]} from #{args[:src_addr]}:#{args[:src_port]}, timeout=#{args[:timeout]}"
172
+ }
173
+ return connection # allows clients to set callback, errback, etc., if desired
174
+ end
175
+
176
+
177
+ class EmUdpHandler < EventMachine::Connection #:nodoc: all
178
+ include EM::Deferrable
179
+ attr_accessor :closing, :timeout_time
180
+ def post_init
181
+ @closing=false
182
+ end
183
+ def receive_data(dgm)
184
+ TheLog.debug("UDP receive_data called")
185
+ process_incoming_message(dgm)
186
+ end
187
+
188
+ def process_incoming_message(data)
189
+ TheLog.debug("Processing incoming message, #{data.length} bytes")
190
+ ans=nil
191
+ begin
192
+ ans = Message.decode(data)
193
+ rescue Exception => e
194
+ TheLog.error("Decode error! #{e.class}, #{e}\nfor msg (length=#{data.length}) : #{data}")
195
+ @closing=true
196
+ close_connection
197
+ send_to_client(nil, e)
198
+ return
199
+ end
200
+ TheLog.debug("#{ans}")
201
+ ans.answerfrom=(@args[:server])
202
+ ans.answersize=(data.length)
203
+ exception = ans.header.get_exception
204
+ @closing=true
205
+ close_connection
206
+ send_to_client(ans, exception)
207
+ end
208
+
209
+ def unbind
210
+ TheLog.debug("Unbind called")
211
+ if (!@closing)
212
+ if (@timeout_time <= Time.now + 1)
213
+ send_timeout
214
+ else
215
+ #@TODO@ RAISE OTHER NETWORK ERROR!
216
+ TheLog.debug("Sending IOError to client")
217
+ send_to_client(nil, IOError.new("Network error"))
218
+ end
219
+ end
220
+ @closing=false
221
+ # Take the last send off the list of outstanding sends
222
+ EventMachineInterface.remove_from_outstanding(self)
223
+ end
224
+ def send_timeout
225
+ TheLog.debug("Sending timeout to client")
226
+ send_to_client(nil, ResolvTimeout.new("Query timed out"))
227
+ end
228
+ def send_to_client(msg, err)
229
+ # We call set_defered_status when done
230
+ if (err != nil)
231
+ set_deferred_status :failed, msg, err
232
+ else
233
+ set_deferred_status :succeeded, msg
234
+ end
235
+ end
236
+ end
237
+
238
+
239
+ class EmTcpHandler < EmUdpHandler #:nodoc: all
240
+ def post_init
241
+ super
242
+ @data=""
243
+ @answersize = 0
244
+ end
245
+ def receive_data(data)
246
+ TheLog.debug("TCP receive_data called")
247
+ #Buffer up the incoming data until we have a complete packet
248
+ @data << data
249
+ if (@data.length >= 2)
250
+ if (@answersize == 0)
251
+ @answersize = @data[0..1].unpack('n')[0]
252
+ TheLog.debug("TCP - expecting #{@answersize} bytes")
253
+ end
254
+ if (@answersize == @data.length - 2)
255
+ TheLog.debug("TCP - got all #{@answersize} bytes ")
256
+ process_incoming_message(@data[2..@data.length])
257
+ else
258
+ TheLog.debug("TCP - got #{@data.length-2} message bytes")
259
+ end
260
+ end
261
+ end
262
+ end
263
+
264
+ end
265
+ end
@@ -520,7 +520,7 @@ module Dnsruby
520
520
  @opcode = OpCode.new(newcode)
521
521
  end
522
522
 
523
- def getException
523
+ def get_exception
524
524
  exception = nil
525
525
  if (@rcode==RCode.NXDOMAIN)
526
526
  exception = NXDomain.new
@@ -42,17 +42,7 @@ module Dnsruby
42
42
  # and socket->[client_id]
43
43
  #
44
44
  # @todo@ should we implement some of cancel function?
45
- #
46
- # @todo@ How do we ensure that sockets all get closed?
47
- #
48
- # @todo@ Should the thread be killed when no queries are active?
49
45
 
50
- # For each query to monitor, we need to know :
51
- # |a) The socket the query was sent on
52
- # |b) The query header ID
53
- # c) The query response queue
54
- # So we could have a hash which maps <socket, headerID> to <queue>
55
- # Note that multiple values of <queue> could refer to the same Queue
56
46
  def initialize
57
47
  @@mutex = Mutex.new
58
48
  @@mutex.synchronize {
@@ -76,9 +66,9 @@ module Dnsruby
76
66
 
77
67
  class QuerySettings
78
68
  attr_accessor :query, :query_header_id, :tsig, :ignore_truncation, :client_queue,
79
- :client_query_id, :socket, :dest_server, :dest_port, :endtime
69
+ :client_query_id, :socket, :dest_server, :dest_port, :endtime, :single_resolver
80
70
  # new(query, query_header_id, tsig, ignore_truncation, client_queue, client_query_id,
81
- # socket, dest_server, dest_port, endtime)
71
+ # socket, dest_server, dest_port, endtime, single_resolver)
82
72
  def initialize(*args)
83
73
  @query = args[0]
84
74
  @query_header_id = args[1]
@@ -89,7 +79,8 @@ module Dnsruby
89
79
  @socket = args[6]
90
80
  @dest_server = args[7]
91
81
  @dest_port=args[8]
92
- @endtime = args[9]
82
+ @endtime = args[9]
83
+ @single_resolver = args[10]
93
84
  end
94
85
  end
95
86
 
@@ -101,14 +92,6 @@ module Dnsruby
101
92
  @@socket_hash[query_settings.socket]=[query_settings.client_query_id] # @todo@ If we use persistent sockets then we need to update this array
102
93
  @@timeouts[query_settings.client_query_id]=query_settings.endtime
103
94
  @@sockets.push(query_settings.socket)
104
-
105
- # # Only do this if we're currently in select
106
- # if @@in_select
107
- # @@in_select=false
108
- # p "in_select now false - sending signal"
109
- # @@select_thread.raise SelectWakeup # Wake up the select thread so it listens to socket too
110
- # # # @todo@ This would probably be more elegant if we send a signal through select
111
- # end
112
95
  }
113
96
  end
114
97
 
@@ -157,21 +140,11 @@ module Dnsruby
157
140
  timeout = tick_time
158
141
  end
159
142
  begin
160
- # @@mutex.synchronize{
161
- # @@in_select=true
162
- ## p "in_select now true"
163
- # }
164
143
  ready, write, errors = IO.select(sockets, nil, nil, timeout)
165
- # @@mutex.synchronize{
166
- # @@in_select=false
167
- ## p "in_select now false"
168
- # }
169
144
  rescue SelectWakeup
170
145
  # If SelectWakeup, then just restart this loop - the select call will be made with the new data
171
- # p "signal received!"
172
146
  next
173
147
  end
174
- # @@mutex.synchronize{
175
148
  if (ready == nil)
176
149
  # proces the timeouts
177
150
  process_timeouts
@@ -197,25 +170,14 @@ module Dnsruby
197
170
  end
198
171
 
199
172
  def process_ready(ready)
200
- # while (ready.length > 0) do
201
- # @@mutex.synchronize{
202
173
  ready.each do |socket|
203
- # if (socket==@@notified)
204
- # @@notified.getc
205
- # ## @@notified.close
206
- # next
207
- # end
208
- # socket = ready.pop
209
- packet_size = 512 # @todo@ Sort out per-query packet sizes
210
- # @@mutex.synchronize{
174
+ packet_size = 512 # @TODO@ Sort out per-query packet sizes!!!
211
175
  msg = get_incoming_data(socket, packet_size)
212
176
  if (msg!=nil)
213
177
  send_response_to_client(msg, socket)
214
178
  end
215
- # }
216
179
  ready.delete(socket)
217
180
  end
218
- # }
219
181
  end
220
182
 
221
183
  def send_response_to_client(msg, socket)
@@ -233,14 +195,24 @@ module Dnsruby
233
195
  if (query_header_id == msg.header.id)
234
196
  # process the response
235
197
  client_queue = nil
198
+ res = nil
199
+ query=nil
236
200
  @@mutex.synchronize{
237
201
  client_queue = @@query_hash[id].client_queue
202
+ res = @@query_hash[id].single_resolver
203
+ query = @@query_hash[id].query
238
204
  }
239
- remove_id(id)
240
- exception = msg.header.getException
241
- TheLog.debug("Pushing response to client queue")
242
- client_queue.push([id, msg, exception])
243
- notify_queue_observers(client_queue, id)
205
+ tcp = (socket.class == TCPSocket)
206
+ # At this point, we should check if the response is OK
207
+ if (res.check_response(msg, query, client_queue, id, tcp))
208
+ remove_id(id)
209
+ exception = msg.header.get_exception
210
+ TheLog.debug("Pushing response to client queue")
211
+ client_queue.push([id, msg, exception])
212
+ notify_queue_observers(client_queue, id)
213
+ else
214
+ # Sending query again - don't return response
215
+ end
244
216
  return
245
217
  end
246
218
  end
@@ -254,16 +226,14 @@ module Dnsruby
254
226
  socket = @@query_hash[id].socket
255
227
  @@timeouts.delete(id)
256
228
  @@query_hash.delete(id)
257
- @@sockets.delete(socket) # @todo@ Not if persistent!
229
+ @@sockets.delete(socket) # @TODO@ Not if persistent!
258
230
  }
259
231
  TheLog.debug("Closing socket #{socket}")
260
- socket.close # @todo@ Not if persistent!
232
+ socket.close # @TODO@ Not if persistent!
261
233
  end
262
234
 
263
235
  def process_timeouts
264
236
  time_now = Time.now
265
- # timeouts = @@timeouts.values
266
- # timeouts.sort!
267
237
  timeouts={}
268
238
  @@mutex.synchronize {
269
239
  timeouts = @@timeouts
@@ -271,8 +241,6 @@ module Dnsruby
271
241
  timeouts.each do |client_id, timeout|
272
242
  if (timeout < time_now)
273
243
  send_exception_to_client(ResolvTimeout.new("Query timed out"), nil, client_id)
274
- # else
275
- # return # @@timeouts is sorted, so all others will be later than this one
276
244
  end
277
245
  end
278
246
  end
@@ -294,7 +262,7 @@ module Dnsruby
294
262
  # We'd like to do a socket.recvfrom, but that raises an Exception
295
263
  # on Windows for TCPSocket for Ruby 1.8.5 (and 1.8.6).
296
264
  # So, we need to do something different for TCP than UDP. *sigh*
297
- # @todo@ This workaround will only work if there is exactly one socket per query
265
+ # @TODO@ This workaround will only work if there is exactly one socket per query
298
266
  # - *not* ideal TCP use!
299
267
  @@mutex.synchronize{
300
268
  client_id = @@socket_hash[socket][0]
@@ -348,7 +316,7 @@ module Dnsruby
348
316
  end
349
317
 
350
318
  def handle_recvfrom_failure(socket)
351
- # @todo@ No way to notify the client about this error, unless there was only one connection on the socket
319
+ # @TODO@ No way to notify the client about this error, unless there was only one connection on the socket
352
320
  ids_for_socket = []
353
321
  @@mutex.synchronize{
354
322
  ids_for_socket = @@socket_hash[socket]
@@ -375,7 +343,7 @@ module Dnsruby
375
343
  query_settings = @@query_hash[id]
376
344
  if (answerip == query_settings.dest_server && answerport == query_settings.dest_port)
377
345
  # We have a match
378
- # - @todo@ as long as we're not speaking to the same server on two ports!
346
+ # - @TODO@ as long as we're not speaking to the same server on two ports!
379
347
  client_id = id
380
348
  break
381
349
  end
@@ -385,8 +353,6 @@ module Dnsruby
385
353
  end
386
354
 
387
355
  def send_exception_to_client(err, socket, client_id, msg=nil)
388
- # first ensure the error is of the right type
389
- # @TODO@ What about FORMERR, and other RCode errors?
390
356
  if ((!err.kind_of?ResolvError) && (!err.kind_of?ResolvTimeout))
391
357
  TheLog.error("INCORRECT ERROR TYPE BEING RETURNED TO CLIENT")
392
358
  raise RuntimeError.new("INCORRECT ERROR TYPE BEING RETURNED TO CLIENT")
@@ -428,7 +394,7 @@ module Dnsruby
428
394
  def add_observer(client_queue, observer)
429
395
  @@mutex.synchronize {
430
396
  @@observers[client_queue]=observer
431
- check_select_thread_synchronized # @TODO@ Is this really necessary? The client should start the thread by sending a query, really...
397
+ check_select_thread_synchronized # Is this really necessary? The client should start the thread by sending a query, really...
432
398
  if (!@@tick_observers.include?observer)
433
399
  @@tick_observers.push(observer)
434
400
  end
@@ -75,7 +75,7 @@ module Dnsruby
75
75
  # Send an initial query
76
76
  msg = Message.new(zone, @transfer_type, @klass)
77
77
  if @transfer_type == Types.IXFR
78
- rr = RR.create("#{zone} 0 IN SOA" + '. . %u 0 0 0 0' % @serial)
78
+ rr = RR.create("#{zone} 0 IN SOA" + '0 0 %u 0 0 0 0' % @serial)
79
79
  msg.add_authority(rr)
80
80
  end
81
81
  # @TODO@ TSIG?
@@ -269,6 +269,8 @@ module Dnsruby
269
269
  end
270
270
  end
271
271
 
272
+
273
+ # @TODO@ Do all this with EventMachine?
272
274
  def send_message(socket, msg) #:nodoc: all
273
275
  query_packet = msg.encode
274
276
  lenmsg = [query_packet.length].pack('n')
data/lib/dnsruby.rb CHANGED
@@ -68,6 +68,14 @@ require 'timeout'
68
68
  #
69
69
  # * NXDomain < ResolvError
70
70
  #
71
+ # * FormErr < ResolvError
72
+ #
73
+ # * ServFail < ResolvError
74
+ #
75
+ # * NotImp < ResolvError
76
+ #
77
+ # * Refused < ResolvError
78
+ #
71
79
  # * OtherResolvError < ResolvError
72
80
  #
73
81
  #