Dnsruby 0.5.0 → 0.6.0

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