dnsruby 1.1

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 (520) hide show
  1. data/EVENTMACHINE +64 -0
  2. data/README +63 -0
  3. data/doc/classes/Dnsruby.html +463 -0
  4. data/doc/classes/Dnsruby/Algorithms.html +171 -0
  5. data/doc/classes/Dnsruby/Classes.html +197 -0
  6. data/doc/classes/Dnsruby/Classes.src/M000209.html +23 -0
  7. data/doc/classes/Dnsruby/Classes.src/M000210.html +19 -0
  8. data/doc/classes/Dnsruby/CodeMapper.html +375 -0
  9. data/doc/classes/Dnsruby/CodeMapper.src/M000186.html +18 -0
  10. data/doc/classes/Dnsruby/CodeMapper.src/M000187.html +33 -0
  11. data/doc/classes/Dnsruby/CodeMapper.src/M000188.html +21 -0
  12. data/doc/classes/Dnsruby/CodeMapper.src/M000189.html +19 -0
  13. data/doc/classes/Dnsruby/CodeMapper.src/M000190.html +19 -0
  14. data/doc/classes/Dnsruby/CodeMapper.src/M000191.html +18 -0
  15. data/doc/classes/Dnsruby/CodeMapper.src/M000192.html +22 -0
  16. data/doc/classes/Dnsruby/CodeMapper.src/M000193.html +22 -0
  17. data/doc/classes/Dnsruby/CodeMapper.src/M000194.html +22 -0
  18. data/doc/classes/Dnsruby/CodeMapper.src/M000195.html +31 -0
  19. data/doc/classes/Dnsruby/CodeMapper.src/M000196.html +19 -0
  20. data/doc/classes/Dnsruby/Config.html +413 -0
  21. data/doc/classes/Dnsruby/Config.src/M000148.html +18 -0
  22. data/doc/classes/Dnsruby/Config.src/M000149.html +19 -0
  23. data/doc/classes/Dnsruby/Config.src/M000150.html +19 -0
  24. data/doc/classes/Dnsruby/Config.src/M000151.html +25 -0
  25. data/doc/classes/Dnsruby/Config.src/M000152.html +21 -0
  26. data/doc/classes/Dnsruby/Config.src/M000153.html +38 -0
  27. data/doc/classes/Dnsruby/Config.src/M000154.html +26 -0
  28. data/doc/classes/Dnsruby/Config.src/M000155.html +22 -0
  29. data/doc/classes/Dnsruby/Config.src/M000156.html +27 -0
  30. data/doc/classes/Dnsruby/Config.src/M000157.html +22 -0
  31. data/doc/classes/Dnsruby/Config.src/M000158.html +21 -0
  32. data/doc/classes/Dnsruby/DNS.html +571 -0
  33. data/doc/classes/Dnsruby/DNS.src/M000258.html +24 -0
  34. data/doc/classes/Dnsruby/DNS.src/M000259.html +18 -0
  35. data/doc/classes/Dnsruby/DNS.src/M000260.html +18 -0
  36. data/doc/classes/Dnsruby/DNS.src/M000261.html +20 -0
  37. data/doc/classes/Dnsruby/DNS.src/M000262.html +19 -0
  38. data/doc/classes/Dnsruby/DNS.src/M000263.html +20 -0
  39. data/doc/classes/Dnsruby/DNS.src/M000264.html +18 -0
  40. data/doc/classes/Dnsruby/DNS.src/M000265.html +19 -0
  41. data/doc/classes/Dnsruby/DNS.src/M000266.html +20 -0
  42. data/doc/classes/Dnsruby/DNS.src/M000267.html +28 -0
  43. data/doc/classes/Dnsruby/DNS.src/M000268.html +19 -0
  44. data/doc/classes/Dnsruby/DNS.src/M000269.html +20 -0
  45. data/doc/classes/Dnsruby/DNS.src/M000270.html +31 -0
  46. data/doc/classes/Dnsruby/DecodeError.html +120 -0
  47. data/doc/classes/Dnsruby/Dnssec.html +287 -0
  48. data/doc/classes/Dnsruby/Dnssec.src/M000249.html +23 -0
  49. data/doc/classes/Dnsruby/Dnssec.src/M000250.html +19 -0
  50. data/doc/classes/Dnsruby/Dnssec.src/M000251.html +90 -0
  51. data/doc/classes/Dnsruby/Dnssec.src/M000252.html +76 -0
  52. data/doc/classes/Dnsruby/EncodeError.html +120 -0
  53. data/doc/classes/Dnsruby/FormErr.html +119 -0
  54. data/doc/classes/Dnsruby/Header.html +501 -0
  55. data/doc/classes/Dnsruby/Header.src/M000231.html +35 -0
  56. data/doc/classes/Dnsruby/Header.src/M000232.html +18 -0
  57. data/doc/classes/Dnsruby/Header.src/M000233.html +18 -0
  58. data/doc/classes/Dnsruby/Header.src/M000234.html +21 -0
  59. data/doc/classes/Dnsruby/Header.src/M000235.html +20 -0
  60. data/doc/classes/Dnsruby/Header.src/M000236.html +32 -0
  61. data/doc/classes/Dnsruby/Header.src/M000237.html +27 -0
  62. data/doc/classes/Dnsruby/Header.src/M000238.html +26 -0
  63. data/doc/classes/Dnsruby/Header.src/M000239.html +47 -0
  64. data/doc/classes/Dnsruby/Header.src/M000240.html +28 -0
  65. data/doc/classes/Dnsruby/Header.src/M000241.html +30 -0
  66. data/doc/classes/Dnsruby/Hosts.html +316 -0
  67. data/doc/classes/Dnsruby/Hosts.src/M000197.html +20 -0
  68. data/doc/classes/Dnsruby/Hosts.src/M000198.html +19 -0
  69. data/doc/classes/Dnsruby/Hosts.src/M000199.html +20 -0
  70. data/doc/classes/Dnsruby/Hosts.src/M000200.html +21 -0
  71. data/doc/classes/Dnsruby/Hosts.src/M000201.html +19 -0
  72. data/doc/classes/Dnsruby/Hosts.src/M000202.html +20 -0
  73. data/doc/classes/Dnsruby/Hosts.src/M000203.html +21 -0
  74. data/doc/classes/Dnsruby/IPv4.html +233 -0
  75. data/doc/classes/Dnsruby/IPv4.src/M000204.html +32 -0
  76. data/doc/classes/Dnsruby/IPv4.src/M000205.html +19 -0
  77. data/doc/classes/Dnsruby/IPv4.src/M000206.html +18 -0
  78. data/doc/classes/Dnsruby/IPv4.src/M000207.html +18 -0
  79. data/doc/classes/Dnsruby/IPv4.src/M000208.html +18 -0
  80. data/doc/classes/Dnsruby/IPv6.html +281 -0
  81. data/doc/classes/Dnsruby/IPv6.src/M000242.html +60 -0
  82. data/doc/classes/Dnsruby/IPv6.src/M000243.html +22 -0
  83. data/doc/classes/Dnsruby/IPv6.src/M000244.html +20 -0
  84. data/doc/classes/Dnsruby/IPv6.src/M000245.html +18 -0
  85. data/doc/classes/Dnsruby/Message.html +803 -0
  86. data/doc/classes/Dnsruby/Message.src/M000119.html +38 -0
  87. data/doc/classes/Dnsruby/Message.src/M000120.html +26 -0
  88. data/doc/classes/Dnsruby/Message.src/M000121.html +22 -0
  89. data/doc/classes/Dnsruby/Message.src/M000122.html +22 -0
  90. data/doc/classes/Dnsruby/Message.src/M000123.html +20 -0
  91. data/doc/classes/Dnsruby/Message.src/M000124.html +20 -0
  92. data/doc/classes/Dnsruby/Message.src/M000125.html +20 -0
  93. data/doc/classes/Dnsruby/Message.src/M000126.html +20 -0
  94. data/doc/classes/Dnsruby/Message.src/M000127.html +18 -0
  95. data/doc/classes/Dnsruby/Message.src/M000128.html +20 -0
  96. data/doc/classes/Dnsruby/Message.src/M000129.html +23 -0
  97. data/doc/classes/Dnsruby/Message.src/M000130.html +30 -0
  98. data/doc/classes/Dnsruby/Message.src/M000131.html +20 -0
  99. data/doc/classes/Dnsruby/Message.src/M000132.html +18 -0
  100. data/doc/classes/Dnsruby/Message.src/M000133.html +56 -0
  101. data/doc/classes/Dnsruby/Message.src/M000134.html +35 -0
  102. data/doc/classes/Dnsruby/Message.src/M000135.html +46 -0
  103. data/doc/classes/Dnsruby/Message/Section.html +160 -0
  104. data/doc/classes/Dnsruby/Message/Section.src/M000141.html +29 -0
  105. data/doc/classes/Dnsruby/Message/Section.src/M000142.html +30 -0
  106. data/doc/classes/Dnsruby/MetaTypes.html +136 -0
  107. data/doc/classes/Dnsruby/Modes.html +171 -0
  108. data/doc/classes/Dnsruby/NXDomain.html +119 -0
  109. data/doc/classes/Dnsruby/Name.html +330 -0
  110. data/doc/classes/Dnsruby/Name.src/M000104.html +28 -0
  111. data/doc/classes/Dnsruby/Name.src/M000105.html +20 -0
  112. data/doc/classes/Dnsruby/Name.src/M000106.html +18 -0
  113. data/doc/classes/Dnsruby/Name.src/M000107.html +21 -0
  114. data/doc/classes/Dnsruby/Name.src/M000108.html +22 -0
  115. data/doc/classes/Dnsruby/Name.src/M000109.html +18 -0
  116. data/doc/classes/Dnsruby/Name/Label.html +300 -0
  117. data/doc/classes/Dnsruby/Name/Label.src/M000110.html +21 -0
  118. data/doc/classes/Dnsruby/Name/Label.src/M000111.html +18 -0
  119. data/doc/classes/Dnsruby/Name/Label.src/M000112.html +22 -0
  120. data/doc/classes/Dnsruby/Name/Label.src/M000113.html +18 -0
  121. data/doc/classes/Dnsruby/Name/Label.src/M000114.html +18 -0
  122. data/doc/classes/Dnsruby/Name/Label.src/M000115.html +18 -0
  123. data/doc/classes/Dnsruby/Name/Label.src/M000116.html +18 -0
  124. data/doc/classes/Dnsruby/Name/Label.src/M000117.html +18 -0
  125. data/doc/classes/Dnsruby/Name/Label.src/M000118.html +18 -0
  126. data/doc/classes/Dnsruby/NotImp.html +119 -0
  127. data/doc/classes/Dnsruby/OpCode.html +146 -0
  128. data/doc/classes/Dnsruby/OtherResolvError.html +119 -0
  129. data/doc/classes/Dnsruby/QTypes.html +146 -0
  130. data/doc/classes/Dnsruby/Question.html +301 -0
  131. data/doc/classes/Dnsruby/Question.src/M000226.html +47 -0
  132. data/doc/classes/Dnsruby/Question.src/M000227.html +18 -0
  133. data/doc/classes/Dnsruby/Question.src/M000228.html +18 -0
  134. data/doc/classes/Dnsruby/Question.src/M000229.html +32 -0
  135. data/doc/classes/Dnsruby/Question.src/M000230.html +18 -0
  136. data/doc/classes/Dnsruby/RCode.html +211 -0
  137. data/doc/classes/Dnsruby/RR.html +648 -0
  138. data/doc/classes/Dnsruby/RR.src/M000001.html +18 -0
  139. data/doc/classes/Dnsruby/RR.src/M000002.html +22 -0
  140. data/doc/classes/Dnsruby/RR.src/M000003.html +18 -0
  141. data/doc/classes/Dnsruby/RR.src/M000004.html +18 -0
  142. data/doc/classes/Dnsruby/RR.src/M000005.html +26 -0
  143. data/doc/classes/Dnsruby/RR.src/M000006.html +18 -0
  144. data/doc/classes/Dnsruby/RR.src/M000007.html +36 -0
  145. data/doc/classes/Dnsruby/RR.src/M000008.html +100 -0
  146. data/doc/classes/Dnsruby/RR.src/M000009.html +18 -0
  147. data/doc/classes/Dnsruby/RR.src/M000010.html +18 -0
  148. data/doc/classes/Dnsruby/RR.src/M000011.html +22 -0
  149. data/doc/classes/Dnsruby/RR.src/M000012.html +29 -0
  150. data/doc/classes/Dnsruby/RR.src/M000013.html +24 -0
  151. data/doc/classes/Dnsruby/RR/ANY.html +133 -0
  152. data/doc/classes/Dnsruby/RR/CERT.html +180 -0
  153. data/doc/classes/Dnsruby/RR/CERT/CertificateTypes.html +169 -0
  154. data/doc/classes/Dnsruby/RR/CNAME.html +151 -0
  155. data/doc/classes/Dnsruby/RR/DNAME.html +150 -0
  156. data/doc/classes/Dnsruby/RR/DNSKEY.html +422 -0
  157. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000044.html +20 -0
  158. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000045.html +21 -0
  159. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000046.html +28 -0
  160. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000047.html +22 -0
  161. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000048.html +18 -0
  162. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000049.html +22 -0
  163. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000050.html +18 -0
  164. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000051.html +26 -0
  165. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000052.html +38 -0
  166. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000053.html +45 -0
  167. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000054.html +21 -0
  168. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000055.html +24 -0
  169. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000056.html +32 -0
  170. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000057.html +24 -0
  171. data/doc/classes/Dnsruby/RR/DS.html +286 -0
  172. data/doc/classes/Dnsruby/RR/DS.src/M000039.html +22 -0
  173. data/doc/classes/Dnsruby/RR/DS.src/M000040.html +28 -0
  174. data/doc/classes/Dnsruby/RR/DS.src/M000041.html +24 -0
  175. data/doc/classes/Dnsruby/RR/DS.src/M000042.html +28 -0
  176. data/doc/classes/Dnsruby/RR/DS.src/M000043.html +36 -0
  177. data/doc/classes/Dnsruby/RR/DomainName.html +175 -0
  178. data/doc/classes/Dnsruby/RR/DomainName.src/M000083.html +18 -0
  179. data/doc/classes/Dnsruby/RR/Generic.html +133 -0
  180. data/doc/classes/Dnsruby/RR/HINFO.html +155 -0
  181. data/doc/classes/Dnsruby/RR/IN.html +155 -0
  182. data/doc/classes/Dnsruby/RR/IN/A.html +200 -0
  183. data/doc/classes/Dnsruby/RR/IN/A.src/M000017.html +18 -0
  184. data/doc/classes/Dnsruby/RR/IN/A.src/M000018.html +18 -0
  185. data/doc/classes/Dnsruby/RR/IN/A.src/M000019.html +18 -0
  186. data/doc/classes/Dnsruby/RR/IN/AAAA.html +139 -0
  187. data/doc/classes/Dnsruby/RR/IN/AFSDB.html +145 -0
  188. data/doc/classes/Dnsruby/RR/IN/PX.html +143 -0
  189. data/doc/classes/Dnsruby/RR/IN/SRV.html +238 -0
  190. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000014.html +29 -0
  191. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000015.html +26 -0
  192. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000016.html +22 -0
  193. data/doc/classes/Dnsruby/RR/IN/WKS.html +166 -0
  194. data/doc/classes/Dnsruby/RR/IN/WKS.src/M000020.html +20 -0
  195. data/doc/classes/Dnsruby/RR/ISDN.html +155 -0
  196. data/doc/classes/Dnsruby/RR/LOC.html +395 -0
  197. data/doc/classes/Dnsruby/RR/LOC.src/M000025.html +32 -0
  198. data/doc/classes/Dnsruby/RR/LOC.src/M000026.html +23 -0
  199. data/doc/classes/Dnsruby/RR/LOC.src/M000027.html +25 -0
  200. data/doc/classes/Dnsruby/RR/LOC.src/M000028.html +21 -0
  201. data/doc/classes/Dnsruby/RR/LOC.src/M000029.html +20 -0
  202. data/doc/classes/Dnsruby/RR/LOC.src/M000030.html +23 -0
  203. data/doc/classes/Dnsruby/RR/MB.html +150 -0
  204. data/doc/classes/Dnsruby/RR/MG.html +150 -0
  205. data/doc/classes/Dnsruby/RR/MINFO.html +156 -0
  206. data/doc/classes/Dnsruby/RR/MR.html +150 -0
  207. data/doc/classes/Dnsruby/RR/MX.html +155 -0
  208. data/doc/classes/Dnsruby/RR/NAPTR.html +190 -0
  209. data/doc/classes/Dnsruby/RR/NS.html +151 -0
  210. data/doc/classes/Dnsruby/RR/NSAP.html +293 -0
  211. data/doc/classes/Dnsruby/RR/NSAP.src/M000093.html +19 -0
  212. data/doc/classes/Dnsruby/RR/NSAP.src/M000094.html +19 -0
  213. data/doc/classes/Dnsruby/RR/NSAP.src/M000095.html +22 -0
  214. data/doc/classes/Dnsruby/RR/NSAP.src/M000096.html +31 -0
  215. data/doc/classes/Dnsruby/RR/NSEC.html +301 -0
  216. data/doc/classes/Dnsruby/RR/NSEC.src/M000031.html +19 -0
  217. data/doc/classes/Dnsruby/RR/NSEC.src/M000032.html +18 -0
  218. data/doc/classes/Dnsruby/RR/NSEC.src/M000033.html +34 -0
  219. data/doc/classes/Dnsruby/RR/NSEC.src/M000034.html +18 -0
  220. data/doc/classes/Dnsruby/RR/NSEC.src/M000035.html +71 -0
  221. data/doc/classes/Dnsruby/RR/NSEC.src/M000036.html +18 -0
  222. data/doc/classes/Dnsruby/RR/NSEC.src/M000037.html +80 -0
  223. data/doc/classes/Dnsruby/RR/NSEC.src/M000038.html +23 -0
  224. data/doc/classes/Dnsruby/RR/NSEC3.html +366 -0
  225. data/doc/classes/Dnsruby/RR/NSEC3.src/M000085.html +28 -0
  226. data/doc/classes/Dnsruby/RR/NSEC3.src/M000086.html +18 -0
  227. data/doc/classes/Dnsruby/RR/NSEC3.src/M000087.html +18 -0
  228. data/doc/classes/Dnsruby/RR/NSEC3.src/M000088.html +22 -0
  229. data/doc/classes/Dnsruby/RR/NSEC3.src/M000089.html +18 -0
  230. data/doc/classes/Dnsruby/RR/NSEC3.src/M000090.html +21 -0
  231. data/doc/classes/Dnsruby/RR/NSEC3.src/M000091.html +21 -0
  232. data/doc/classes/Dnsruby/RR/NSEC3.src/M000092.html +29 -0
  233. data/doc/classes/Dnsruby/RR/NSEC3PARAM.html +279 -0
  234. data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000077.html +28 -0
  235. data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000078.html +18 -0
  236. data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000079.html +22 -0
  237. data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000080.html +21 -0
  238. data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000081.html +25 -0
  239. data/doc/classes/Dnsruby/RR/PTR.html +132 -0
  240. data/doc/classes/Dnsruby/RR/RP.html +183 -0
  241. data/doc/classes/Dnsruby/RR/RP.src/M000082.html +19 -0
  242. data/doc/classes/Dnsruby/RR/RRSIG.html +357 -0
  243. data/doc/classes/Dnsruby/RR/RRSIG.src/M000097.html +26 -0
  244. data/doc/classes/Dnsruby/RR/RRSIG.src/M000098.html +28 -0
  245. data/doc/classes/Dnsruby/RR/RRSIG.src/M000099.html +23 -0
  246. data/doc/classes/Dnsruby/RR/RRSIG.src/M000100.html +23 -0
  247. data/doc/classes/Dnsruby/RR/RRSIG.src/M000101.html +46 -0
  248. data/doc/classes/Dnsruby/RR/RRSIG.src/M000102.html +50 -0
  249. data/doc/classes/Dnsruby/RR/RRSIG.src/M000103.html +27 -0
  250. data/doc/classes/Dnsruby/RR/RT.html +155 -0
  251. data/doc/classes/Dnsruby/RR/SOA.html +233 -0
  252. data/doc/classes/Dnsruby/RR/SOA.src/M000066.html +24 -0
  253. data/doc/classes/Dnsruby/RR/SOA.src/M000067.html +27 -0
  254. data/doc/classes/Dnsruby/RR/SPF.html +138 -0
  255. data/doc/classes/Dnsruby/RR/TKEY.html +313 -0
  256. data/doc/classes/Dnsruby/RR/TKEY.src/M000021.html +19 -0
  257. data/doc/classes/Dnsruby/RR/TKEY.src/M000022.html +29 -0
  258. data/doc/classes/Dnsruby/RR/TKEY.src/M000023.html +21 -0
  259. data/doc/classes/Dnsruby/RR/TKEY.src/M000024.html +29 -0
  260. data/doc/classes/Dnsruby/RR/TSIG.html +524 -0
  261. data/doc/classes/Dnsruby/RR/TSIG.src/M000068.html +24 -0
  262. data/doc/classes/Dnsruby/RR/TSIG.src/M000069.html +32 -0
  263. data/doc/classes/Dnsruby/RR/TSIG.src/M000070.html +54 -0
  264. data/doc/classes/Dnsruby/RR/TSIG.src/M000071.html +121 -0
  265. data/doc/classes/Dnsruby/RR/TSIG.src/M000072.html +33 -0
  266. data/doc/classes/Dnsruby/RR/TSIG.src/M000073.html +25 -0
  267. data/doc/classes/Dnsruby/RR/TSIG.src/M000074.html +36 -0
  268. data/doc/classes/Dnsruby/RR/TSIG.src/M000075.html +22 -0
  269. data/doc/classes/Dnsruby/RR/TSIG.src/M000076.html +29 -0
  270. data/doc/classes/Dnsruby/RR/TXT.html +233 -0
  271. data/doc/classes/Dnsruby/RR/TXT.src/M000061.html +18 -0
  272. data/doc/classes/Dnsruby/RR/TXT.src/M000062.html +18 -0
  273. data/doc/classes/Dnsruby/RR/TXT.src/M000063.html +20 -0
  274. data/doc/classes/Dnsruby/RR/TXT.src/M000064.html +27 -0
  275. data/doc/classes/Dnsruby/RR/TXT.src/M000065.html +25 -0
  276. data/doc/classes/Dnsruby/RR/X25.html +203 -0
  277. data/doc/classes/Dnsruby/RR/X25.src/M000058.html +18 -0
  278. data/doc/classes/Dnsruby/RR/X25.src/M000059.html +18 -0
  279. data/doc/classes/Dnsruby/RR/X25.src/M000060.html +22 -0
  280. data/doc/classes/Dnsruby/RRSet.html +404 -0
  281. data/doc/classes/Dnsruby/RRSet.src/M000211.html +23 -0
  282. data/doc/classes/Dnsruby/RRSet.src/M000212.html +18 -0
  283. data/doc/classes/Dnsruby/RRSet.src/M000213.html +18 -0
  284. data/doc/classes/Dnsruby/RRSet.src/M000214.html +47 -0
  285. data/doc/classes/Dnsruby/RRSet.src/M000215.html +42 -0
  286. data/doc/classes/Dnsruby/RRSet.src/M000216.html +18 -0
  287. data/doc/classes/Dnsruby/RRSet.src/M000217.html +20 -0
  288. data/doc/classes/Dnsruby/RRSet.src/M000218.html +18 -0
  289. data/doc/classes/Dnsruby/RRSet.src/M000219.html +18 -0
  290. data/doc/classes/Dnsruby/RRSet.src/M000220.html +18 -0
  291. data/doc/classes/Dnsruby/RRSet.src/M000221.html +18 -0
  292. data/doc/classes/Dnsruby/RRSet.src/M000222.html +22 -0
  293. data/doc/classes/Dnsruby/RRSet.src/M000223.html +18 -0
  294. data/doc/classes/Dnsruby/RRSet.src/M000224.html +22 -0
  295. data/doc/classes/Dnsruby/RRSet.src/M000225.html +18 -0
  296. data/doc/classes/Dnsruby/Refused.html +119 -0
  297. data/doc/classes/Dnsruby/Resolv.html +401 -0
  298. data/doc/classes/Dnsruby/Resolv.src/M000159.html +18 -0
  299. data/doc/classes/Dnsruby/Resolv.src/M000160.html +18 -0
  300. data/doc/classes/Dnsruby/Resolv.src/M000161.html +18 -0
  301. data/doc/classes/Dnsruby/Resolv.src/M000162.html +18 -0
  302. data/doc/classes/Dnsruby/Resolv.src/M000163.html +18 -0
  303. data/doc/classes/Dnsruby/Resolv.src/M000164.html +18 -0
  304. data/doc/classes/Dnsruby/Resolv.src/M000165.html +18 -0
  305. data/doc/classes/Dnsruby/Resolv.src/M000166.html +19 -0
  306. data/doc/classes/Dnsruby/Resolv.src/M000167.html +20 -0
  307. data/doc/classes/Dnsruby/Resolv.src/M000168.html +29 -0
  308. data/doc/classes/Dnsruby/Resolv.src/M000169.html +19 -0
  309. data/doc/classes/Dnsruby/Resolv.src/M000170.html +20 -0
  310. data/doc/classes/Dnsruby/Resolv.src/M000171.html +25 -0
  311. data/doc/classes/Dnsruby/ResolvError.html +117 -0
  312. data/doc/classes/Dnsruby/ResolvTimeout.html +117 -0
  313. data/doc/classes/Dnsruby/Resolver.html +1055 -0
  314. data/doc/classes/Dnsruby/Resolver.src/M000271.html +21 -0
  315. data/doc/classes/Dnsruby/Resolver.src/M000272.html +27 -0
  316. data/doc/classes/Dnsruby/Resolver.src/M000273.html +28 -0
  317. data/doc/classes/Dnsruby/Resolver.src/M000274.html +18 -0
  318. data/doc/classes/Dnsruby/Resolver.src/M000275.html +51 -0
  319. data/doc/classes/Dnsruby/Resolver.src/M000276.html +21 -0
  320. data/doc/classes/Dnsruby/Resolver.src/M000277.html +22 -0
  321. data/doc/classes/Dnsruby/Resolver.src/M000278.html +18 -0
  322. data/doc/classes/Dnsruby/Resolver.src/M000279.html +20 -0
  323. data/doc/classes/Dnsruby/Resolver.src/M000280.html +19 -0
  324. data/doc/classes/Dnsruby/Resolver.src/M000281.html +19 -0
  325. data/doc/classes/Dnsruby/Resolver.src/M000282.html +19 -0
  326. data/doc/classes/Dnsruby/Resolver.src/M000283.html +19 -0
  327. data/doc/classes/Dnsruby/Resolver.src/M000284.html +19 -0
  328. data/doc/classes/Dnsruby/Resolver.src/M000285.html +19 -0
  329. data/doc/classes/Dnsruby/Resolver.src/M000286.html +19 -0
  330. data/doc/classes/Dnsruby/Resolver.src/M000287.html +19 -0
  331. data/doc/classes/Dnsruby/Resolver.src/M000288.html +19 -0
  332. data/doc/classes/Dnsruby/Resolver.src/M000289.html +19 -0
  333. data/doc/classes/Dnsruby/Resolver.src/M000290.html +19 -0
  334. data/doc/classes/Dnsruby/Resolver.src/M000291.html +19 -0
  335. data/doc/classes/Dnsruby/Resolver.src/M000292.html +26 -0
  336. data/doc/classes/Dnsruby/Resolver.src/M000293.html +18 -0
  337. data/doc/classes/Dnsruby/Resolver.src/M000294.html +23 -0
  338. data/doc/classes/Dnsruby/Resolver.src/M000295.html +18 -0
  339. data/doc/classes/Dnsruby/ServFail.html +119 -0
  340. data/doc/classes/Dnsruby/SingleResolver.html +674 -0
  341. data/doc/classes/Dnsruby/SingleResolver.src/M000172.html +18 -0
  342. data/doc/classes/Dnsruby/SingleResolver.src/M000173.html +24 -0
  343. data/doc/classes/Dnsruby/SingleResolver.src/M000174.html +36 -0
  344. data/doc/classes/Dnsruby/SingleResolver.src/M000175.html +18 -0
  345. data/doc/classes/Dnsruby/SingleResolver.src/M000176.html +19 -0
  346. data/doc/classes/Dnsruby/SingleResolver.src/M000177.html +50 -0
  347. data/doc/classes/Dnsruby/SingleResolver.src/M000178.html +19 -0
  348. data/doc/classes/Dnsruby/SingleResolver.src/M000179.html +21 -0
  349. data/doc/classes/Dnsruby/SingleResolver.src/M000180.html +25 -0
  350. data/doc/classes/Dnsruby/SingleResolver.src/M000181.html +54 -0
  351. data/doc/classes/Dnsruby/SingleResolver.src/M000182.html +27 -0
  352. data/doc/classes/Dnsruby/SingleResolver.src/M000183.html +27 -0
  353. data/doc/classes/Dnsruby/SingleResolver.src/M000184.html +35 -0
  354. data/doc/classes/Dnsruby/SingleResolver.src/M000185.html +21 -0
  355. data/doc/classes/Dnsruby/TheLog.html +196 -0
  356. data/doc/classes/Dnsruby/TheLog.src/M000246.html +20 -0
  357. data/doc/classes/Dnsruby/TheLog.src/M000247.html +20 -0
  358. data/doc/classes/Dnsruby/TheLog.src/M000248.html +20 -0
  359. data/doc/classes/Dnsruby/Types.html +436 -0
  360. data/doc/classes/Dnsruby/Update.html +368 -0
  361. data/doc/classes/Dnsruby/Update.src/M000253.html +32 -0
  362. data/doc/classes/Dnsruby/Update.src/M000254.html +36 -0
  363. data/doc/classes/Dnsruby/Update.src/M000255.html +32 -0
  364. data/doc/classes/Dnsruby/Update.src/M000256.html +41 -0
  365. data/doc/classes/Dnsruby/Update.src/M000257.html +34 -0
  366. data/doc/classes/Dnsruby/VerifyError.html +119 -0
  367. data/doc/classes/Dnsruby/ZoneTransfer.html +300 -0
  368. data/doc/classes/Dnsruby/ZoneTransfer.src/M000143.html +18 -0
  369. data/doc/classes/Dnsruby/ZoneTransfer.src/M000144.html +24 -0
  370. data/doc/classes/Dnsruby/ZoneTransfer.src/M000145.html +35 -0
  371. data/doc/classes/Dnsruby/ZoneTransfer/Delta.html +200 -0
  372. data/doc/classes/Dnsruby/ZoneTransfer/Delta.src/M000146.html +19 -0
  373. data/doc/classes/Dnsruby/ZoneTransfer/Delta.src/M000147.html +19 -0
  374. data/doc/created.rid +1 -0
  375. data/doc/files/lib/Dnsruby/Config_rb.html +101 -0
  376. data/doc/files/lib/Dnsruby/DNS_rb.html +110 -0
  377. data/doc/files/lib/Dnsruby/Hosts_rb.html +108 -0
  378. data/doc/files/lib/Dnsruby/Resolver_rb.html +109 -0
  379. data/doc/files/lib/Dnsruby/SingleResolver_rb.html +108 -0
  380. data/doc/files/lib/Dnsruby/TheLog_rb.html +110 -0
  381. data/doc/files/lib/Dnsruby/code_mapper_rb.html +101 -0
  382. data/doc/files/lib/Dnsruby/dnssec_rb.html +107 -0
  383. data/doc/files/lib/Dnsruby/event_machine_interface_rb.html +108 -0
  384. data/doc/files/lib/Dnsruby/ipv4_rb.html +101 -0
  385. data/doc/files/lib/Dnsruby/ipv6_rb.html +101 -0
  386. data/doc/files/lib/Dnsruby/message_rb.html +109 -0
  387. data/doc/files/lib/Dnsruby/name_rb.html +101 -0
  388. data/doc/files/lib/Dnsruby/resource/AAAA_rb.html +101 -0
  389. data/doc/files/lib/Dnsruby/resource/AFSDB_rb.html +101 -0
  390. data/doc/files/lib/Dnsruby/resource/A_rb.html +101 -0
  391. data/doc/files/lib/Dnsruby/resource/CERT_rb.html +101 -0
  392. data/doc/files/lib/Dnsruby/resource/DNSKEY_rb.html +101 -0
  393. data/doc/files/lib/Dnsruby/resource/DS_rb.html +101 -0
  394. data/doc/files/lib/Dnsruby/resource/HINFO_rb.html +101 -0
  395. data/doc/files/lib/Dnsruby/resource/IN_rb.html +112 -0
  396. data/doc/files/lib/Dnsruby/resource/ISDN_rb.html +101 -0
  397. data/doc/files/lib/Dnsruby/resource/LOC_rb.html +101 -0
  398. data/doc/files/lib/Dnsruby/resource/MINFO_rb.html +101 -0
  399. data/doc/files/lib/Dnsruby/resource/MX_rb.html +101 -0
  400. data/doc/files/lib/Dnsruby/resource/NAPTR_rb.html +101 -0
  401. data/doc/files/lib/Dnsruby/resource/NSAP_rb.html +101 -0
  402. data/doc/files/lib/Dnsruby/resource/NSEC3PARAM_rb.html +101 -0
  403. data/doc/files/lib/Dnsruby/resource/NSEC3_rb.html +101 -0
  404. data/doc/files/lib/Dnsruby/resource/NSEC_rb.html +101 -0
  405. data/doc/files/lib/Dnsruby/resource/OPT_rb.html +101 -0
  406. data/doc/files/lib/Dnsruby/resource/PX_rb.html +101 -0
  407. data/doc/files/lib/Dnsruby/resource/RP_rb.html +101 -0
  408. data/doc/files/lib/Dnsruby/resource/RRSIG_rb.html +101 -0
  409. data/doc/files/lib/Dnsruby/resource/RT_rb.html +101 -0
  410. data/doc/files/lib/Dnsruby/resource/SOA_rb.html +101 -0
  411. data/doc/files/lib/Dnsruby/resource/SPF_rb.html +101 -0
  412. data/doc/files/lib/Dnsruby/resource/SRV_rb.html +101 -0
  413. data/doc/files/lib/Dnsruby/resource/TKEY_rb.html +101 -0
  414. data/doc/files/lib/Dnsruby/resource/TSIG_rb.html +114 -0
  415. data/doc/files/lib/Dnsruby/resource/TXT_rb.html +108 -0
  416. data/doc/files/lib/Dnsruby/resource/X25_rb.html +101 -0
  417. data/doc/files/lib/Dnsruby/resource/domain_name_rb.html +101 -0
  418. data/doc/files/lib/Dnsruby/resource/generic_rb.html +131 -0
  419. data/doc/files/lib/Dnsruby/resource/resource_rb.html +110 -0
  420. data/doc/files/lib/Dnsruby/select_thread_rb.html +111 -0
  421. data/doc/files/lib/Dnsruby/update_rb.html +101 -0
  422. data/doc/files/lib/Dnsruby/zone_transfer_rb.html +101 -0
  423. data/doc/files/lib/dnsruby_rb.html +118 -0
  424. data/doc/fr_class_index.html +108 -0
  425. data/doc/fr_file_index.html +75 -0
  426. data/doc/fr_method_index.html +321 -0
  427. data/doc/index.html +24 -0
  428. data/lib/Dnsruby/Config.rb +363 -0
  429. data/lib/Dnsruby/DNS.rb +293 -0
  430. data/lib/Dnsruby/Hosts.rb +126 -0
  431. data/lib/Dnsruby/Resolver.rb +999 -0
  432. data/lib/Dnsruby/SingleResolver.rb +493 -0
  433. data/lib/Dnsruby/TheLog.rb +60 -0
  434. data/lib/Dnsruby/code_mapper.rb +165 -0
  435. data/lib/Dnsruby/dnssec.rb +357 -0
  436. data/lib/Dnsruby/event_machine_interface.rb +264 -0
  437. data/lib/Dnsruby/ipv4.rb +74 -0
  438. data/lib/Dnsruby/ipv6.rb +144 -0
  439. data/lib/Dnsruby/message.rb +961 -0
  440. data/lib/Dnsruby/name.rb +332 -0
  441. data/lib/Dnsruby/resource/A.rb +56 -0
  442. data/lib/Dnsruby/resource/AAAA.rb +54 -0
  443. data/lib/Dnsruby/resource/AFSDB.rb +68 -0
  444. data/lib/Dnsruby/resource/CERT.rb +89 -0
  445. data/lib/Dnsruby/resource/DNSKEY.rb +242 -0
  446. data/lib/Dnsruby/resource/DS.rb +162 -0
  447. data/lib/Dnsruby/resource/HINFO.rb +52 -0
  448. data/lib/Dnsruby/resource/IN.rb +70 -0
  449. data/lib/Dnsruby/resource/ISDN.rb +54 -0
  450. data/lib/Dnsruby/resource/LOC.rb +255 -0
  451. data/lib/Dnsruby/resource/MINFO.rb +70 -0
  452. data/lib/Dnsruby/resource/MX.rb +66 -0
  453. data/lib/Dnsruby/resource/NAPTR.rb +90 -0
  454. data/lib/Dnsruby/resource/NSAP.rb +172 -0
  455. data/lib/Dnsruby/resource/NSEC.rb +243 -0
  456. data/lib/Dnsruby/resource/NSEC3.rb +173 -0
  457. data/lib/Dnsruby/resource/NSEC3PARAM.rb +120 -0
  458. data/lib/Dnsruby/resource/OPT.rb +210 -0
  459. data/lib/Dnsruby/resource/PX.rb +71 -0
  460. data/lib/Dnsruby/resource/RP.rb +67 -0
  461. data/lib/Dnsruby/resource/RRSIG.rb +256 -0
  462. data/lib/Dnsruby/resource/RT.rb +67 -0
  463. data/lib/Dnsruby/resource/SOA.rb +95 -0
  464. data/lib/Dnsruby/resource/SPF.rb +29 -0
  465. data/lib/Dnsruby/resource/SRV.rb +112 -0
  466. data/lib/Dnsruby/resource/TKEY.rb +163 -0
  467. data/lib/Dnsruby/resource/TSIG.rb +584 -0
  468. data/lib/Dnsruby/resource/TXT.rb +76 -0
  469. data/lib/Dnsruby/resource/X25.rb +53 -0
  470. data/lib/Dnsruby/resource/domain_name.rb +54 -0
  471. data/lib/Dnsruby/resource/generic.rb +151 -0
  472. data/lib/Dnsruby/resource/resource.rb +561 -0
  473. data/lib/Dnsruby/select_thread.rb +449 -0
  474. data/lib/Dnsruby/update.rb +262 -0
  475. data/lib/Dnsruby/zone_transfer.rb +332 -0
  476. data/lib/dnsruby.rb +512 -0
  477. data/test/custom.txt +4 -0
  478. data/test/resolv.conf +4 -0
  479. data/test/tc_axfr.rb +32 -0
  480. data/test/tc_dns.rb +230 -0
  481. data/test/tc_dnskey.rb +52 -0
  482. data/test/tc_dnsruby.rb +42 -0
  483. data/test/tc_dnssec.rb +88 -0
  484. data/test/tc_ds.rb +38 -0
  485. data/test/tc_escapedchars.rb +484 -0
  486. data/test/tc_event_machine_deferrable.rb +85 -0
  487. data/test/tc_event_machine_res.rb +174 -0
  488. data/test/tc_event_machine_single_res.rb +101 -0
  489. data/test/tc_event_machine_soak.rb +98 -0
  490. data/test/tc_header.rb +104 -0
  491. data/test/tc_misc.rb +139 -0
  492. data/test/tc_name.rb +53 -0
  493. data/test/tc_nsec.rb +36 -0
  494. data/test/tc_nsec3.rb +63 -0
  495. data/test/tc_nsec3param.rb +30 -0
  496. data/test/tc_packet.rb +179 -0
  497. data/test/tc_packet_unique_push.rb +102 -0
  498. data/test/tc_question.rb +51 -0
  499. data/test/tc_res_config.rb +92 -0
  500. data/test/tc_res_env.rb +51 -0
  501. data/test/tc_res_file.rb +42 -0
  502. data/test/tc_res_opt.rb +187 -0
  503. data/test/tc_resolver.rb +184 -0
  504. data/test/tc_rr-opt.rb +82 -0
  505. data/test/tc_rr-txt.rb +137 -0
  506. data/test/tc_rr-unknown.rb +99 -0
  507. data/test/tc_rr.rb +258 -0
  508. data/test/tc_rrset.rb +58 -0
  509. data/test/tc_rrsig.rb +32 -0
  510. data/test/tc_single_resolver.rb +169 -0
  511. data/test/tc_soak.rb +200 -0
  512. data/test/tc_soak_base.rb +136 -0
  513. data/test/tc_tcp.rb +35 -0
  514. data/test/tc_tkey.rb +75 -0
  515. data/test/tc_tsig.rb +237 -0
  516. data/test/tc_update.rb +215 -0
  517. data/test/ts_dnsruby.rb +17 -0
  518. data/test/ts_offline.rb +42 -0
  519. data/test/ts_online.rb +107 -0
  520. metadata +627 -0
@@ -0,0 +1,449 @@
1
+ #--
2
+ #Copyright 2007 Nominet UK
3
+ #
4
+ #Licensed under the Apache License, Version 2.0 (the "License");
5
+ #you may not use this file except in compliance with the License.
6
+ #You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ #Unless required by applicable law or agreed to in writing, software
11
+ #distributed under the License is distributed on an "AS IS" BASIS,
12
+ #WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ #See the License for the specific language governing permissions and
14
+ #limitations under the License.
15
+ #++
16
+ require 'socket'
17
+ #require 'thread'
18
+ begin
19
+ require 'fastthread'
20
+ rescue LoadError
21
+ require 'thread'
22
+ end
23
+ require 'singleton'
24
+ module Dnsruby
25
+ Thread::abort_on_exception = true
26
+ class SelectThread #:nodoc: all
27
+ class SelectWakeup < RuntimeError; end
28
+ include Singleton
29
+ # This singleton class runs a continuous select loop which
30
+ # listens for responses on all of the in-use sockets.
31
+ # When a new query is sent, the thread is woken up, and
32
+ # the socket is added to the select loop (and the new timeout
33
+ # calculated).
34
+ # Note that a combination of the socket and the packet ID is
35
+ # sufficient to uniquely identify the query to the select thread.
36
+ # But how do we identify it to the client thread?
37
+ # Push [id, response] onto the response queue?
38
+ # Or [id, timeout]
39
+ #
40
+ # But how do we find the response queue for a particular query?
41
+ # Hash of client_id->[query, client_queue, socket]
42
+ # and socket->[client_id]
43
+ #
44
+ # @todo@ should we implement some of cancel function?
45
+
46
+ def initialize
47
+ @@mutex = Mutex.new
48
+ @@mutex.synchronize {
49
+ @@in_select=false
50
+ # @@notifier,@@notified=IO.pipe
51
+ @@sockets = [] # @@notified]
52
+ @@timeouts = Hash.new
53
+ # @@mutex.synchronize do
54
+ @@query_hash = Hash.new
55
+ @@socket_hash = Hash.new
56
+ @@observers = Hash.new
57
+ @@tick_observers = []
58
+ @@queued_exceptions=[]
59
+ # end
60
+ # Now start the select thread
61
+ @@select_thread = Thread.new {
62
+ do_select
63
+ }
64
+ }
65
+ end
66
+
67
+ class QuerySettings
68
+ attr_accessor :query_bytes, :query, :ignore_truncation, :client_queue,
69
+ :client_query_id, :socket, :dest_server, :dest_port, :endtime, :udp_packet_size,
70
+ :single_resolver
71
+ # new(query_bytes, query, ignore_truncation, client_queue, client_query_id,
72
+ # socket, dest_server, dest_port, endtime, , udp_packet_size, single_resolver)
73
+ def initialize(*args)
74
+ @query_bytes = args[0]
75
+ @query = args[1]
76
+ @ignore_truncation=args[2]
77
+ @client_queue = args[3]
78
+ @client_query_id = args[4]
79
+ @socket = args[5]
80
+ @dest_server = args[6]
81
+ @dest_port=args[7]
82
+ @endtime = args[8]
83
+ @udp_packet_size = args[9]
84
+ @single_resolver = args[10]
85
+ end
86
+ end
87
+
88
+ def add_to_select(query_settings)
89
+ # Add the query to sockets, and then wake the select thread up
90
+ @@mutex.synchronize {
91
+ check_select_thread_synchronized
92
+ # @TODO@ This assumes that all client_query_ids are unique!
93
+ # Would be a good idea at least to check this...
94
+ @@query_hash[query_settings.client_query_id]=query_settings
95
+ @@socket_hash[query_settings.socket]=[query_settings.client_query_id] # @todo@ If we use persistent sockets then we need to update this array
96
+ @@timeouts[query_settings.client_query_id]=query_settings.endtime
97
+ @@sockets.push(query_settings.socket)
98
+ }
99
+ end
100
+
101
+ def check_select_thread_synchronized
102
+ if (!@@select_thread.alive?)
103
+ TheLog.debug("Restarting select thread")
104
+ @@select_thread = Thread.new {
105
+ do_select
106
+ }
107
+ end
108
+ end
109
+
110
+ def select_thread_alive?
111
+ ret=true
112
+ @@mutex.synchronize{
113
+ ret = @@select_thread.alive?
114
+ }
115
+ return ret
116
+ end
117
+
118
+ def do_select
119
+ unused_loop_count = 0
120
+ while true do
121
+ send_tick_to_observers
122
+ send_queued_exceptions
123
+ timeout = tick_time = (Time.now+0.1) - Time.now # We provide a timer service to various Dnsruby classes
124
+ sockets=[]
125
+ timeouts=[]
126
+ has_observer = false
127
+ @@mutex.synchronize {
128
+ sockets = @@sockets
129
+ timeouts = @@timeouts.values
130
+ has_observer = !@@observers.empty?
131
+ }
132
+ if (timeouts.length > 0)
133
+ timeouts.sort!
134
+ timeout = timeouts[0] - Time.now
135
+ if (timeout <= 0)
136
+ process_timeouts
137
+ timeout = 0
138
+ next
139
+ end
140
+ end
141
+ ready=nil
142
+ if (has_observer && (timeout > tick_time))
143
+ timeout = tick_time
144
+ end
145
+ # next if (timeout < 0)
146
+ begin
147
+ ready, write, errors = IO.select(sockets, nil, nil, timeout)
148
+ rescue SelectWakeup
149
+ # If SelectWakeup, then just restart this loop - the select call will be made with the new data
150
+ next
151
+ end
152
+ if (ready == nil)
153
+ # proces the timeouts
154
+ process_timeouts
155
+ unused_loop_count+=1
156
+ else
157
+ process_ready(ready)
158
+ unused_loop_count=0
159
+ # process_error(errors)
160
+ end
161
+ @@mutex.synchronize{
162
+ if (unused_loop_count > 10 && @@query_hash.empty? && @@observers.empty?)
163
+ TheLog.debug("Stopping select loop")
164
+ return
165
+ end
166
+ }
167
+ # }
168
+ end
169
+ end
170
+
171
+ def process_error(errors)
172
+ TheLog.debug("Error! #{errors.inspect}")
173
+ # @todo@ Process errors [can we do this in single socket environment?]
174
+ end
175
+
176
+ # @@query_hash[query_settings.client_query_id]=query_settings
177
+ # @@socket_hash[query_settings.socket]=[query_settings.client_query_id] # @todo@ If we use persistent sockets then we need to update this array
178
+ def process_ready(ready)
179
+ ready.each do |socket|
180
+ query_settings = nil
181
+ @@mutex.synchronize{
182
+ # Can do this if we have a query per socket, but not otherwise...
183
+ c_q_id = @@socket_hash[socket][0] # @todo@ If we use persistent sockets then this won't work
184
+ query_settings = @@query_hash[c_q_id]
185
+ }
186
+ next if !query_settings
187
+ udp_packet_size = query_settings.udp_packet_size
188
+ msg, bytes = get_incoming_data(socket, udp_packet_size)
189
+ if (msg!=nil)
190
+ send_response_to_client(msg, bytes, socket)
191
+ end
192
+ ready.delete(socket)
193
+ end
194
+ end
195
+
196
+ def send_response_to_client(msg, bytes, socket)
197
+ # Figure out which client_ids we were expecting on this socket, then see if any header ids match up
198
+ client_ids=[]
199
+ @@mutex.synchronize{
200
+ client_ids = @@socket_hash[socket]
201
+ }
202
+ # get the queries associated with them
203
+ client_ids.each do |id|
204
+ query_header_id=nil
205
+ @@mutex.synchronize{
206
+ query_header_id = @@query_hash[id].query.header.id
207
+ }
208
+ if (query_header_id == msg.header.id)
209
+ # process the response
210
+ client_queue = nil
211
+ res = nil
212
+ query=nil
213
+ @@mutex.synchronize{
214
+ client_queue = @@query_hash[id].client_queue
215
+ res = @@query_hash[id].single_resolver
216
+ query = @@query_hash[id].query
217
+ }
218
+ tcp = (socket.class == TCPSocket)
219
+ # At this point, we should check if the response is OK
220
+ if (res.check_response(msg, bytes, query, client_queue, id, tcp))
221
+ remove_id(id)
222
+ exception = msg.header.get_exception
223
+ TheLog.debug("Pushing response to client queue")
224
+ client_queue.push([id, msg, exception])
225
+ notify_queue_observers(client_queue, id)
226
+ else
227
+ # Sending query again - don't return response
228
+ end
229
+ return
230
+ end
231
+ end
232
+ # If not, then we have an error
233
+ TheLog.error("Stray packet - " + msg.inspect + "\n from " + socket.inspect)
234
+ end
235
+
236
+ def remove_id(id)
237
+ socket=nil
238
+ @@mutex.synchronize{
239
+ socket = @@query_hash[id].socket
240
+ @@timeouts.delete(id)
241
+ @@query_hash.delete(id)
242
+ @@sockets.delete(socket) # @TODO@ Not if persistent!
243
+ }
244
+ TheLog.debug("Closing socket #{socket}")
245
+ socket.close # @TODO@ Not if persistent!
246
+ end
247
+
248
+ def process_timeouts
249
+ time_now = Time.now
250
+ timeouts={}
251
+ @@mutex.synchronize {
252
+ timeouts = @@timeouts
253
+ }
254
+ timeouts.each do |client_id, timeout|
255
+ if (timeout < time_now)
256
+ send_exception_to_client(ResolvTimeout.new("Query timed out"), nil, client_id)
257
+ end
258
+ end
259
+ end
260
+
261
+ def tcp_read(socket, len)
262
+ buf=""
263
+ while (buf.length < len) do
264
+ buf += socket.recv(len-buf.length)
265
+ end
266
+ return buf
267
+ end
268
+
269
+ def get_incoming_data(socket, packet_size)
270
+ answerfrom,answerip,answerport,answersize=nil
271
+ ans,buf = nil
272
+ begin
273
+ if (socket.class == TCPSocket)
274
+ # @todo@ Ruby Bug #9061 stops this working right
275
+ # We'd like to do a socket.recvfrom, but that raises an Exception
276
+ # on Windows for TCPSocket for Ruby 1.8.5 (and 1.8.6).
277
+ # So, we need to do something different for TCP than UDP. *sigh*
278
+ # @TODO@ This workaround will only work if there is exactly one socket per query
279
+ # - *not* ideal TCP use!
280
+ @@mutex.synchronize{
281
+ client_id = @@socket_hash[socket][0]
282
+ answerfrom = @@query_hash[client_id].dest_server
283
+ answerip = answerfrom
284
+ answerport = @@query_hash[client_id].dest_port
285
+ }
286
+ buf = tcp_read(socket, 2)
287
+ answersize = buf.unpack('n')[0]
288
+ buf = tcp_read(socket,answersize)
289
+ else
290
+ if (ret = socket.recvfrom(packet_size))
291
+ buf = ret[0]
292
+ answerport=ret[1][1]
293
+ answerfrom=ret[1][2]
294
+ answerip=ret[1][3]
295
+ answersize=(buf.length)
296
+ else
297
+ # recvfrom failed - why?
298
+ TheLog.error("Error - recvfrom failed from #{socket}")
299
+ handle_recvfrom_failure(socket)
300
+ return
301
+ end
302
+ end
303
+ rescue Exception => e
304
+ TheLog.error("Error - recvfrom failed from #{socket}, exception : #{e}")
305
+ handle_recvfrom_failure(socket)
306
+ return
307
+ end
308
+ TheLog.debug(";; answer from #{answerfrom} : #{answersize} bytes\n")
309
+
310
+ begin
311
+ ans = Message.decode(buf)
312
+ rescue Exception => e
313
+ TheLog.error("Decode error! #{e.class}, #{e}\nfor msg (length=#{buf.length}) : #{buf}")
314
+ client_id=get_client_id_from_answerfrom(socket, answerip, answerport)
315
+ if (client_id != nil)
316
+ send_exception_to_client(e, socket, client_id)
317
+ else
318
+ TheLog.error("Decode error from #{answerfrom} but can't determine packet id")
319
+ end
320
+ return
321
+ end
322
+
323
+ if (ans!= nil)
324
+ TheLog.debug("#{ans}")
325
+ ans.answerfrom=(answerfrom)
326
+ ans.answersize=(answersize)
327
+ end
328
+ return ans, buf
329
+ end
330
+
331
+ def handle_recvfrom_failure(socket)
332
+ # @TODO@ No way to notify the client about this error, unless there was only one connection on the socket
333
+ ids_for_socket = []
334
+ @@mutex.synchronize{
335
+ ids_for_socket = @@socket_hash[socket]
336
+ }
337
+ if (ids_for_socket.length == 1)
338
+ answerfrom=nil
339
+ @@mutex.synchronize{
340
+ query_settings = @@query_hash[ids_for_socket[0]]
341
+ answerfrom=query_settings.dest_server
342
+ }
343
+ send_exception_to_client(OtherResolvError.new("recvfrom failed from #{answerfrom}"), socket, ids_for_socket[0])
344
+ else
345
+ TheLog.fatal("Recvfrom failed from #{socket}, no way to tell query id")
346
+ end
347
+ end
348
+
349
+ def get_client_id_from_answerfrom(socket, answerip, answerport)
350
+ client_id=nil
351
+ # Figure out client id from answerfrom
352
+ @@mutex.synchronize{
353
+ ids = @@socket_hash[socket]
354
+ ids.each do |id|
355
+ # Does this id speak to this dest_server?
356
+ query_settings = @@query_hash[id]
357
+ if (answerip == query_settings.dest_server && answerport == query_settings.dest_port)
358
+ # We have a match
359
+ # - @TODO@ as long as we're not speaking to the same server on two ports!
360
+ client_id = id
361
+ break
362
+ end
363
+ end
364
+ }
365
+ return client_id
366
+ end
367
+
368
+ def send_exception_to_client(err, socket, client_id, msg=nil)
369
+ # find the client response queue
370
+ client_queue = nil
371
+ @@mutex.synchronize {
372
+ client_queue = @@query_hash[client_id].client_queue
373
+ }
374
+ remove_id(client_id)
375
+ push_exception_to_client(client_id, client_queue, err, msg)
376
+ end
377
+
378
+ def push_exception_to_select(client_id, client_queue, err, msg)
379
+ @@mutex.synchronize{
380
+ @@queued_exceptions.push([client_id, client_queue, err, msg])
381
+ }
382
+ end
383
+
384
+ def send_queued_exceptions
385
+ exceptions = []
386
+ @@mutex.synchronize{
387
+ exceptions = @@queued_exceptions
388
+ @@queued_exceptions = []
389
+ }
390
+
391
+ exceptions.each do |item|
392
+ client_id, client_queue, err, msg = item
393
+ push_exception_to_client(client_id, client_queue, err, msg)
394
+ end
395
+ end
396
+
397
+ def push_exception_to_client(client_id, client_queue, err, msg)
398
+ # Now push the exception on the queue
399
+ client_queue.push([client_id, msg, err])
400
+ notify_queue_observers(client_queue, client_id)
401
+ end
402
+
403
+ def add_observer(client_queue, observer)
404
+ @@mutex.synchronize {
405
+ @@observers[client_queue]=observer
406
+ check_select_thread_synchronized # Is this really necessary? The client should start the thread by sending a query, really...
407
+ if (!@@tick_observers.include?observer)
408
+ @@tick_observers.push(observer)
409
+ end
410
+ }
411
+ end
412
+
413
+ def remove_observer(client_queue, observer)
414
+ @@mutex.synchronize {
415
+ if (@@observers[client_queue]==observer)
416
+ @@observers.delete(observer)
417
+ else
418
+ TheLog.error("remove_observer called with wrong observer for queue")
419
+ raise ArgumentError.new("remove_observer called with wrong observer for queue")
420
+ end
421
+ if (!@@observers.values.include?observer)
422
+ @@tick_observers.delete(observer)
423
+ end
424
+ }
425
+ end
426
+
427
+ def notify_queue_observers(client_queue, client_query_id)
428
+ # If any observers are known for this query queue then notify them
429
+ observer=nil
430
+ @@mutex.synchronize {
431
+ observer = @@observers[client_queue]
432
+ }
433
+ if (observer)
434
+ observer.handle_queue_event(client_queue, client_query_id)
435
+ end
436
+ end
437
+
438
+ def send_tick_to_observers
439
+ # If any observers are known then send them a tick
440
+ tick_observers=nil
441
+ @@mutex.synchronize {
442
+ tick_observers = @@tick_observers
443
+ }
444
+ tick_observers.each do |observer|
445
+ observer.tick
446
+ end
447
+ end
448
+ end
449
+ end
@@ -0,0 +1,262 @@
1
+ #--
2
+ #Copyright 2007 Nominet UK
3
+ #
4
+ #Licensed under the Apache License, Version 2.0 (the "License");
5
+ #you may not use this file except in compliance with the License.
6
+ #You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ #Unless required by applicable law or agreed to in writing, software
11
+ #distributed under the License is distributed on an "AS IS" BASIS,
12
+ #WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ #See the License for the specific language governing permissions and
14
+ #limitations under the License.
15
+ #++
16
+ module Dnsruby
17
+ #Dnsruby::Update is a subclass of Dnsruby::Packet,
18
+ #to be used for making DNS dynamic updates. Programmers
19
+ #should refer to RFC 2136 for the semantics of dynamic updates.
20
+
21
+ #The first example below shows a complete program; subsequent examples
22
+ #show only the creation of the update packet.
23
+ #
24
+ #== Add a new host
25
+ #
26
+ # require 'Dnsruby'
27
+ #
28
+ # # Create the update packet.
29
+ # update = Dnsruby::Update.new('example.com')
30
+ #
31
+ # # Prerequisite is that no A records exist for the name.
32
+ # update.absent('foo.example.com.', 'A')
33
+ #
34
+ # # Add two A records for the name.
35
+ # update.add('foo.example.com.', 'A', 86400, '192.168.1.2')
36
+ # update.add('foo.example.com.', 'A', 86400, '172.16.3.4')
37
+ #
38
+ # # Send the update to the zone's primary master.
39
+ # res = Dnsruby::Resolver.new({:nameserver => 'primary-master.example.com'})
40
+ #
41
+ # begin
42
+ # reply = res.send_message(update)
43
+ # print "Update succeeded\n"
44
+ # rescue Exception => e
45
+ # print 'Update failed: #{e}\n'
46
+ # end
47
+ #
48
+ #== Add an MX record for a name that already exists
49
+ #
50
+ # update = Dnsruby::Update.new('example.com')
51
+ # update.present('example.com')
52
+ # update.add('example.com', Dnsruby::Types.MX, 10, 'mailhost.example.com')
53
+ #
54
+ #== Add a TXT record for a name that doesn't exist
55
+ #
56
+ # update = Dnsruby::Update.new('example.com')
57
+ # update.absent('info.example.com')
58
+ # update.add('info.example.com', Types.TXT, 86400, "yabba dabba doo"')
59
+ #
60
+ #== Delete all A records for a name
61
+ #
62
+ # update = Dnsruby::Update.new('example.com')
63
+ # update.present('foo.example.com', 'A')
64
+ # update.delete('foo.example.com', 'A')
65
+ #
66
+ #== Delete all RRs for a name
67
+ #
68
+ # update = Dnsruby::Update.new('example.com')
69
+ # update.present('byebye.example.com')
70
+ # update.delete('byebye.example.com')
71
+ #
72
+ #== Perform a signed update
73
+ #
74
+ # key_name = 'tsig-key'
75
+ # key = 'awwLOtRfpGE+rRKF2+DEiw=='
76
+ #
77
+ # update = Dnsruby::Update.new('example.com')
78
+ # update.add('foo.example.com', 'A', 86400, 10.1.2.3'))
79
+ # update.add('bar.example.com', 'A', 86400, 10.4.5.6'))
80
+ # res.tsig=(key_name,key)
81
+ #
82
+ class Update < Message
83
+ #Returns a Dnsruby::Update object suitable for performing a DNS
84
+ #dynamic update. Specifically, it creates a message with the header
85
+ #opcode set to UPDATE and the zone record type to SOA (per RFC 2136,
86
+ #Section 2.3).
87
+ #
88
+ #Programs must use the push method to add RRs to the prerequisite,
89
+ #update, and additional sections before performing the update.
90
+ #
91
+ #Arguments are the zone name and the class. If the zone is omitted,
92
+ #the default domain will be taken from the resolver configuration.
93
+ #If the class is omitted, it defaults to IN.
94
+ # packet = Dnsruby::Update.new
95
+ # packet = Dnsruby::Update.new('example.com')
96
+ # packet = Dnsruby::Update.new('example.com', 'HS')
97
+ #
98
+ def initialize(zone=nil, klass=nil)
99
+
100
+ # sort out the zone section (RFC2136, section 2.3)
101
+ if (zone==nil)
102
+ config = Config.new
103
+ zone = (config.search)[0]
104
+ return unless zone
105
+ end
106
+
107
+ type = 'SOA'
108
+ klass ||= 'IN'
109
+
110
+ super(zone, type, klass) || return
111
+
112
+ @header.opcode=('UPDATE')
113
+ @header.rd=(0)
114
+ end
115
+
116
+ #Ways to create the prerequisite records (exists, notexists, inuse, etc. - RFC2136, section 2.4)
117
+ #
118
+ # (1) RRset exists (value independent). At least one RR with a
119
+ # specified NAME and TYPE (in the zone and class specified by
120
+ # the Zone Section) must exist.
121
+ #
122
+ # update.present(name, type)
123
+ #
124
+ # (2) RRset exists (value dependent). A set of RRs with a
125
+ # specified NAME and TYPE exists and has the same members
126
+ # with the same RDATAs as the RRset specified here in this
127
+ # Section.
128
+ #
129
+ # update.present(name, type, rdata)
130
+ #
131
+ # (4) Name is in use. At least one RR with a specified NAME (in
132
+ # the zone and class specified by the Zone Section) must exist.
133
+ # Note that this prerequisite is NOT satisfied by empty
134
+ # nonterminals.
135
+ #
136
+ # update.present(name)
137
+ def present(*args)
138
+ ttl = 0
139
+ rdata = []
140
+ klass = Classes.ANY
141
+ if (args.length>=1) # domain (RFC2136, Section 2.4.4)
142
+ name = args[0]
143
+ type = Types.ANY
144
+ if (args.length>=2) # RRSET (RFC2136, Section 2.4.1)
145
+ type = args[1]
146
+ end
147
+ if (args.length > 2) # RRSET (RFC2136, Section 2.4.2)
148
+ klass = zone()[0].zclass
149
+ rdata=args[2]
150
+ end
151
+ rec = RR.create("#{name} #{ttl} #{klass} #{type} #{rdata}")
152
+ add_pre(rec)
153
+ return rec
154
+ else
155
+ raise ArgumentError.new("Wrong number of arguments (#{args.length} for 1 or 2) for Update#absent")
156
+ end
157
+ end
158
+
159
+ #Ways to create the prerequisite records (exists, notexists, inuse, etc. - RFC2136, section 2.4)
160
+ #Can be called with one arg :
161
+ #
162
+ # update.absent(name)
163
+ # (5) Name is not in use. No RR of any type is owned by a
164
+ # specified NAME. Note that this prerequisite IS satisfied by
165
+ # empty nonterminals.
166
+ #
167
+ #Or with two :
168
+ #
169
+ # update.absent(name, type)
170
+ # (3) RRset does not exist. No RRs with a specified NAME and TYPE
171
+ # (in the zone and class denoted by the Zone Section) can exist.
172
+ #
173
+ def absent(*args)
174
+ ttl = 0
175
+ rdata = []
176
+ klass = Classes.NONE
177
+ if (args.length>=1) # domain (RFC2136, Section 2.4.5)
178
+ name = args[0]
179
+ type = Types.ANY
180
+ if (args.length==2) # RRSET (RFC2136, Section 2.4.3)
181
+ type = args[1]
182
+ end
183
+ rec = RR.create("#{name} #{ttl} #{klass} #{type} #{rdata}")
184
+ add_pre(rec)
185
+ return rec
186
+ else
187
+ raise ArgumentError.new("Wrong number of arguments (#{args.length} for 1 or 2) for Update#absent")
188
+ end
189
+ end
190
+
191
+ #Ways to create the update records (add, delete, RFC2136, section 2.5)
192
+ # " 2.5.1 - Add To An RRset
193
+ #
194
+ # RRs are added to the Update Section whose NAME, TYPE, TTL, RDLENGTH
195
+ # and RDATA are those being added, and CLASS is the same as the zone
196
+ # class. Any duplicate RRs will be silently ignored by the primary
197
+ # master."
198
+ #
199
+ # update.add(rr)
200
+ # update.add([rr1, rr2])
201
+ # update.add(name, type, ttl, rdata)
202
+ #
203
+ def add(*args)
204
+ zoneclass=zone()[0].zclass
205
+ case args[0]
206
+ when Array
207
+ args[0].each do |resource|
208
+ add(resource)
209
+ end
210
+ when RR
211
+ # Make sure that the Class is the same as the zone
212
+ resource = args[0]
213
+ if (resource.klass != zoneclass)
214
+ raise ArgumentError.new("Wrong class #{resource.klass} for update (should be #{zoneclass})!")
215
+ end
216
+ add_update(resource)
217
+ return resource
218
+ else
219
+ name=args[0]
220
+ type=args[1]
221
+ ttl=args[2]
222
+ rdata=args[3]
223
+ resource = RR.create("#{name} #{ttl} #{zoneclass} #{type} #{rdata}")
224
+ add_update(resource)
225
+ return resource
226
+ end
227
+ # @TODO@ Should be able to take RRSet!
228
+ end
229
+
230
+ #Ways to create the update records (add, delete, RFC2136, section 2.5)
231
+ #
232
+ #2.5.2 - Delete An RRset
233
+ # update.delete(name, type)
234
+ #
235
+ #
236
+ #2.5.3 - Delete All RRsets From A Name
237
+ # update.delete(name)
238
+ #
239
+ #2.5.4 - Delete An RR From An RRset
240
+ # update.delete(name, type, rdata)
241
+ #
242
+ def delete(*args)
243
+ ttl = 0
244
+ klass = Classes.ANY
245
+ rdata=[]
246
+ resource = nil
247
+ case args.length
248
+ when 1 # name
249
+ resource = RR.create("#{args[0]} #{ttl} #{klass} #{Types.ANY} #{rdata}")
250
+ add_update(resource)
251
+ when 2 # name, type
252
+ resource = RR.create("#{args[0]} #{ttl} #{klass} #{args[1]} #{rdata}")
253
+ add_update(resource)
254
+ when 3 # name, type, rdata
255
+ klass = Classes.NONE
256
+ resource = RR.create("#{args[0]} #{ttl} #{klass} #{args[1]} #{args[2]}")
257
+ add_update(resource)
258
+ end
259
+ return resource
260
+ end
261
+ end
262
+ end