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,332 @@
1
+ module Dnsruby
2
+ # This class performs zone transfers as per RFC1034 (AXFR) and RFC1995 (IXFR).
3
+ class ZoneTransfer
4
+ # The nameserver to use for the zone transfer - defaults to system config
5
+ attr_accessor :server
6
+ # What type of transfer to do (IXFR or AXFR) - defaults to AXFR
7
+ attr_accessor :transfer_type
8
+ # The class - defaults to IN
9
+ attr_accessor :klass
10
+ # The port to connect to - defaults to 53
11
+ attr_accessor :port
12
+ # If using IXFR, this is the SOA serial number to start the incrementals from
13
+ attr_accessor :serial
14
+ # The TSIG record used to sign the transfer
15
+ attr_reader :tsig
16
+ # Returns the tsigstate of the last transfer (nil if no TSIG signed transfer has occurred)
17
+ attr_reader :last_tsigstate
18
+
19
+ #Sets the TSIG to sign the zone transfer with.
20
+ #Pass in either a Dnsruby::RR::TSIG, or a key_name and key (or just a key)
21
+ #Pass in nil to stop tsig signing.
22
+ #* res.tsig=(tsig_rr)
23
+ #* res.tsig=(key_name, key)
24
+ #* res.tsig=nil # Don't sign the transfer
25
+ def tsig=(*args)
26
+ @tsig = SingleResolver.get_tsig(args)
27
+ end
28
+
29
+
30
+ def initialize
31
+ @server=Config.new.nameserver[0]
32
+ @transfer_type = Types.AXFR
33
+ @klass=Classes.IN
34
+ @port=53
35
+ @serial=0
36
+ @tsig = nil
37
+ @axfr = nil
38
+ end
39
+
40
+ # Perform a zone transfer (RFC1995)
41
+ # If an IXFR query is unsuccessful, then AXFR is tried (and @transfer_type is set
42
+ # to AXFR)
43
+ # TCP is used as the only transport
44
+ #
45
+ # If AXFR is performed, then the zone will be returned as a set of records :
46
+ #
47
+ # zt = Dnsruby::ZoneTransfer.new
48
+ # zt.transfer_type = Dnsruby::Types.AXFR
49
+ # zt.server = "ns0.validation-test-servers.nominet.org.uk"
50
+ # zone = zt.transfer("validation-test-servers.nominet.org.uk")
51
+ # soa = zone[0]
52
+ # rec1 = zone[1]
53
+ # print zone.to_s
54
+ #
55
+ #
56
+ # If IXFR is performed, then the incrementals will be returned as a set of Deltas.
57
+ # Each Delta contains the start and end SOA serial number, as well as an array of
58
+ # adds and deletes that occurred between the start and end.
59
+ #
60
+ # zt = Dnsruby::ZoneTransfer.new
61
+ # zt.transfer_type = Dnsruby::Types.IXFR
62
+ # zt.server = "ns0.validation-test-servers.nominet.org.uk"
63
+ # zt.serial = 2007090401
64
+ # deltas = zt.transfer("validation-test-servers.nominet.org.uk")
65
+ # assert_equal("Should show up in transfer", deltas[0].adds[1].data)
66
+ def transfer(zone)
67
+ servers = @server
68
+ if (servers.class == String)
69
+ servers=[servers]
70
+ end
71
+ xfr = nil
72
+ exception = nil
73
+ servers.each do |server|
74
+ begin
75
+ server=Config.resolve_server(server)
76
+ xfr = do_transfer(zone, server)
77
+ break
78
+ rescue Exception => exception
79
+ end
80
+ end
81
+ if (xfr == nil && exception != nil)
82
+ raise exception
83
+ end
84
+ return xfr
85
+ end
86
+
87
+ def do_transfer(zone, server) #:nodoc: all
88
+ @transfer_type = Types.new(@transfer_type)
89
+ @state = :InitialSoa
90
+ socket = TCPSocket.new(server, @port)
91
+ begin
92
+ # Send an initial query
93
+ msg = Message.new(zone, @transfer_type, @klass)
94
+ if @transfer_type == Types.IXFR
95
+ rr = RR.create("#{zone} 0 IN SOA" + '0 0 %u 0 0 0 0' % @serial)
96
+ msg.add_authority(rr)
97
+ end
98
+ send_message(socket, msg)
99
+
100
+ while (@state != :End)
101
+ response = receive_message(socket)
102
+
103
+ if (@state == :InitialSoa)
104
+ rcode = response.header.rcode
105
+ if (rcode != RCode.NOERROR)
106
+ if (@transfer_type == Types.IXFR &&
107
+ rcode == RCode.NOTIMP)
108
+ # IXFR didn't work - let's try AXFR
109
+ TheLog.debug("IXFR DID NOT WORK (rcode = NOTIMP) - TRYING AXFR!!")
110
+ @state = :InitialSoa
111
+ @transfer_type=Types.AXFR
112
+ # Send an initial AXFR query
113
+ msg = Message.new(zone, @transfer_type, @klass)
114
+ send_message(socket, msg)
115
+ next
116
+ end
117
+ raise ResolvError.new(rcode.string);
118
+ end
119
+
120
+ if (response.question[0].qtype != @transfer_type)
121
+ raise ResolvError.new("invalid question section")
122
+ end
123
+
124
+ if (response.header.ancount == 0 && @transfer_type == Types.IXFR)
125
+ TheLog.debug("IXFR DID NOT WORK (ancount = 0) - TRYING AXFR!!")
126
+ # IXFR didn't work - let's try AXFR
127
+ @transfer_type=Types.AXFR
128
+ # Send an initial AXFR query
129
+ @state = :InitialSoa
130
+ msg = Message.new(zone, @transfer_type, @klass)
131
+ send_message(socket, msg)
132
+ next
133
+ end
134
+ end
135
+
136
+ response.each_answer { |rr|
137
+ parseRR(rr)
138
+ }
139
+ if (@state == :End &&
140
+ response.tsigstate == :Intermediate)
141
+ raise ResolvError.new("last message must be signed")
142
+ end
143
+ if (@state == :End && @tsig)
144
+ if (response.tsigstate != :Verified)
145
+ @last_tsigstate = :Failed
146
+ raise ResolvError.new("Zone transfer not correctly signed")
147
+ end
148
+ @last_tsigstate = :Verified
149
+ end
150
+ end
151
+ # This could return with an IXFR response, or an AXFR response.
152
+ # If it fails completely, then try to send an AXFR query.
153
+ # Once the query has been sent, then enter the main response loop.
154
+ # Unless we know we're definitely AXFR, we should be prepared for either IXFR or AXFR
155
+ # AXFR response : The first and the last RR of the response is the SOA record of the zone.
156
+ # The whole zone is returned inbetween.
157
+ # IXFR response : one or more difference sequences is returned. The list of difference
158
+ # sequences is preceded and followed by a copy of the server's current
159
+ # version of the SOA.
160
+ # Each difference sequence represents one update to the zone (one SOA
161
+ # serial change) consisting of deleted RRs and added RRs. The first RR
162
+ # of the deleted RRs is the older SOA RR and the first RR of the added
163
+ # RRs is the newer SOA RR.
164
+ socket.close
165
+ if (@axfr!=nil)
166
+ return @axfr
167
+ end
168
+ return @ixfr
169
+ rescue Exception => e
170
+ socket.close
171
+ raise e
172
+ end
173
+ end
174
+
175
+ # All changes between two versions of a zone in an IXFR response.
176
+ class Delta
177
+
178
+ # The starting serial number of this delta.
179
+ attr_accessor :start
180
+
181
+ # The ending serial number of this delta.
182
+ attr_accessor :end
183
+
184
+ # A list of records added between the start and end versions
185
+ attr_accessor :adds
186
+
187
+ # A list of records deleted between the start and end versions
188
+ attr_accessor :deletes
189
+
190
+ def initialize()
191
+ @adds = []
192
+ @deletes = []
193
+ end
194
+
195
+ def to_s
196
+ ret = "Adds : " + @adds.join(",")
197
+ ret +=", Deletes : " + @deletes.join(",")
198
+ end
199
+ end
200
+
201
+ def parseRR(rec) #:nodoc: all
202
+ name = rec.name
203
+ type = rec.type
204
+ delta = Delta.new
205
+
206
+ case @state
207
+ when :InitialSoa
208
+ if (type != Types.SOA)
209
+ raise ResolvError.new("missing initial SOA")
210
+ end
211
+ @initialsoa = rec
212
+ # Remember the serial number in the initial SOA; we need it
213
+ # to recognize the end of an IXFR.
214
+ @end_serial = rec.serial
215
+ if (@transfer_type == Types.IXFR && @end_serial <= @serial)
216
+ TheLog.debug("zone up to date")
217
+ @state = :End
218
+ else
219
+ @state = :FirstData
220
+ end
221
+ when :FirstData
222
+ # If the transfer begins with 1 SOA, it's an AXFR.
223
+ # If it begins with 2 SOAs, it's an IXFR.
224
+ if (@transfer_type == Types.IXFR && type == Types.SOA &&
225
+ rec.serial == @serial)
226
+ TheLog.debug("IXFR response - using IXFR")
227
+ @rtype = Types.IXFR
228
+ @ixfr = []
229
+ @state = :Ixfr_DelSoa
230
+ else
231
+ TheLog.debug("AXFR response - using AXFR")
232
+ @rtype = Types.AXFR
233
+ @axfr = []
234
+ @axfr << @initialsoa
235
+ @state = :Axfr
236
+ end
237
+ parseRR(rec) # Restart...
238
+ return
239
+
240
+ when :Ixfr_DelSoa
241
+ delta = Delta.new
242
+ @ixfr.push(delta)
243
+ delta.start = rec.serial
244
+ delta.deletes << rec
245
+ @state = :Ixfr_Del
246
+
247
+ when :Ixfr_Del
248
+ if (type == Types.SOA)
249
+ @current_serial = rec.serial
250
+ @state = :Ixfr_AddSoa
251
+ parseRR(rec); # Restart...
252
+ return;
253
+ end
254
+ delta = @ixfr[@ixfr.length - 1]
255
+ delta.deletes << rec
256
+
257
+ when :Ixfr_AddSoa
258
+ delta = @ixfr[@ixfr.length - 1]
259
+ delta.end = rec.serial
260
+ delta.adds << rec
261
+ @state = :Ixfr_Add
262
+
263
+ when :Ixfr_Add
264
+ if (type == Types.SOA)
265
+ soa_serial = rec.serial
266
+ if (soa_serial == @end_serial)
267
+ @state = :End
268
+ return
269
+ elsif (soa_serial != @current_serial)
270
+ raise ResolvError.new("IXFR out of sync: expected serial " +
271
+ @current_serial + " , got " + soa_serial);
272
+ else
273
+ @state = :Ixfr_DelSoa
274
+ parseRR(rec); # Restart...
275
+ return;
276
+ end
277
+ end
278
+ delta = @ixfr[@ixfr.length - 1]
279
+ delta.adds << rec
280
+
281
+ when :Axfr
282
+ # Old BINDs sent cross class A records for non IN classes.
283
+ if (type == Types.A && rec.klass() != @klass)
284
+ else
285
+ @axfr << rec
286
+ if (type == Types.SOA)
287
+ @state = :End
288
+ end
289
+ end
290
+ when :End
291
+ raise ResolvError.new("extra data in zone transfer")
292
+
293
+ else
294
+ raise ResolvError.new("invalid state for zone transfer")
295
+ end
296
+ end
297
+
298
+
299
+ def send_message(socket, msg) #:nodoc: all
300
+ if (@tsig)
301
+ @tsig.apply(msg)
302
+ @tsig = msg.tsig
303
+ end
304
+ query_packet = msg.encode
305
+ lenmsg = [query_packet.length].pack('n')
306
+ socket.send(lenmsg, 0)
307
+ socket.send(query_packet, 0)
308
+ end
309
+
310
+ def tcp_read(socket, len) #:nodoc: all
311
+ buf=""
312
+ while (buf.length < len) do
313
+ buf += socket.recv(len-buf.length)
314
+ end
315
+ return buf
316
+ end
317
+
318
+ def receive_message(socket) #:nodoc: all
319
+ buf = tcp_read(socket, 2)
320
+ answersize = buf.unpack('n')[0]
321
+ buf = tcp_read(socket, answersize)
322
+ msg = Message.decode(buf)
323
+ if (@tsig)
324
+ if !@tsig.verify_envelope(msg, buf)
325
+ TheLog.error("Bad signature on zone transfer - closing connection")
326
+ raise ResolvError.new("Bad signature on zone transfer")
327
+ end
328
+ end
329
+ return msg
330
+ end
331
+ end
332
+ end
@@ -0,0 +1,512 @@
1
+ #--
2
+ #Copyright 2007 Nominet UK
3
+ #
4
+ #Licensed under the Apache License, Version 2.0 (the "License");
5
+ #you may not use this file except in compliance with the License.
6
+ #You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ #Unless required by applicable law or agreed to in writing, software
11
+ #distributed under the License is distributed on an "AS IS" BASIS,
12
+ #WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ #See the License for the specific language governing permissions and
14
+ #limitations under the License.
15
+ #++
16
+ require 'Dnsruby/TheLog'
17
+ require 'Dnsruby/code_mapper'
18
+ require 'Dnsruby/ipv4'
19
+ require 'Dnsruby/ipv6'
20
+ require 'timeout'
21
+ #= Dnsruby library
22
+ #Dnsruby is a thread-aware DNS stub resolver library written in Ruby.
23
+ #
24
+ #It is based on resolv.rb, the standard Ruby DNS implementation,
25
+ #but gives a complete DNS implementation, including DNSSEC.
26
+ #
27
+ #The Resolv class can be used to resolve addresses using /etc/hosts and /etc/resolv.conf,
28
+ #or the DNS class can be used to make DNS queries. These interfaces will attempt to apply
29
+ #the default domain and searchlist when resolving names.
30
+ #
31
+ #The Resolver and SingleResolver interfaces allow finer control of individual messages.
32
+ #The Resolver class sends queries to multiple resolvers using various retry mechanisms.
33
+ #The SingleResolver class is used by Resolver to send individual Messages to individual
34
+ #resolvers.
35
+ #
36
+ #Resolver queries return Dnsruby::Message objects. Message objects have five
37
+ #sections:
38
+ #
39
+ #* The header section, a Dnsruby::Header object.
40
+ #
41
+ #* The question section, a list of Dnsruby::Question objects.
42
+ #
43
+ #* The answer section, a list of Dnsruby::Resource objects.
44
+ #
45
+ #* The authority section, a list of Dnsruby::Resource objects.
46
+ #
47
+ #* The additional section, a list of Dnsruby::Resource objects.
48
+ #
49
+ #
50
+ #== example
51
+ # p Dnsruby::Resolv.getaddress("www.ruby-lang.org")
52
+ # p Dnsruby::Resolv.getname("210.251.121.214")
53
+ #
54
+ # Dnsruby::DNS.open {|dns|
55
+ # p dns.getresources("www.ruby-lang.org", Dnsruby::Types.A).collect {|r| r.address}
56
+ # p dns.getresources("ruby-lang.org", 'MX').collect {|r| [r.exchange.to_s, r.preference]}
57
+ # }
58
+ #
59
+ #== exceptions
60
+ #
61
+ #* ResolvError < StandardError
62
+ #
63
+ #* ResolvTimeout < TimeoutError
64
+ #
65
+ #* NXDomain < ResolvError
66
+ #
67
+ #* FormErr < ResolvError
68
+ #
69
+ #* ServFail < ResolvError
70
+ #
71
+ #* NotImp < ResolvError
72
+ #
73
+ #* Refused < ResolvError
74
+ #
75
+ #* OtherResolvError < ResolvError
76
+ #
77
+ #== I/O
78
+ #Dnsruby implements a pure Ruby event loop to perform I/O.
79
+ #Dnsruby can also use EventMachine to perform I/O, if it is available on the
80
+ #platform - but it must be enabled through the Dnsruby::Resolver class
81
+ #
82
+ #== DNSSEC
83
+ #Dnsruby supports DNSSEC and NSEC3.
84
+ #DNSSEC support is on by default, but applications which wish to verify
85
+ #responses locally will need to make explicit verification calls.
86
+ #See Dnsruby::Dnssec for more details.
87
+ #
88
+ #== Bugs
89
+ #* NIS is not supported.
90
+ #* /etc/nsswitch.conf is not supported.
91
+ #* IPv6 is not supported.
92
+ module Dnsruby
93
+ class OpCode < CodeMapper
94
+ Query = 0 # RFC 1035
95
+ IQuery = 1 # RFC 1035
96
+ Status = 2 # RFC 1035
97
+ Notify = 4 # RFC 1996
98
+ Update = 5 # RFC 2136
99
+
100
+ update()
101
+ end
102
+
103
+ class RCode < CodeMapper
104
+ NOERROR = 0 # RFC 1035
105
+ FORMERR = 1 # RFC 1035
106
+ SERVFAIL = 2 # RFC 1035
107
+ NXDOMAIN = 3 # RFC 1035
108
+ NOTIMP = 4 # RFC 1035
109
+ REFUSED = 5 # RFC 1035
110
+ YXDOMAIN = 6 # RFC 2136
111
+ YXRRSET = 7 # RFC 2136
112
+ NXRRSET = 8 # RFC 2136
113
+ NOTAUTH = 9 # RFC 2136
114
+ NOTZONE = 10 # RFC 2136
115
+
116
+ BADVERS = 16
117
+ BADSIG = 16
118
+ BADKEY = 17
119
+ BADTIME = 18
120
+ BADMODE = 19
121
+ BADNAME = 20
122
+ BADALG = 21
123
+
124
+ update()
125
+ end
126
+
127
+ class Classes < CodeMapper
128
+ IN = 1 # RFC 1035
129
+ CH = 3 # RFC 1035
130
+ # CHAOS = 3 # RFC 1035
131
+ HS = 4 # RFC 1035
132
+ # HESIOD = 4 # RFC 1035
133
+ NONE = 254 # RFC 2136
134
+ ANY = 255 # RFC 1035
135
+ update()
136
+
137
+ def unknown_string(arg)
138
+ if (arg=~/^CLASS/i)
139
+ Classes.add_pair(arg, arg.gsub('CLASS', '').to_i)
140
+ set_string(arg)
141
+ else
142
+ raise ArgumentError.new("String #{arg} not a member of #{self.class}")
143
+ end
144
+ end
145
+
146
+ def unknown_code(arg)
147
+ Classes.add_pair('CLASS' + arg.to_s, arg)
148
+ set_code(arg)
149
+ end
150
+
151
+ # classesbyval and classesbyname functions are wrappers around the
152
+ # similarly named hashes. They are used for 'unknown' DNS RR classess
153
+ # (RFC3597)
154
+ # See typesbyval and typesbyname, these beasts have the same functionality
155
+ def Classes.classesbyname(name) #:nodoc: all
156
+ name.upcase!;
157
+ if to_code(name)
158
+ return to_code(name)
159
+ end
160
+
161
+ if ((name =~/^\s*CLASS(\d+)\s*$/o) == nil)
162
+ raise ArgumentError, "classesbyval() argument is not CLASS### (#{name})"
163
+ end
164
+
165
+ val = $1.to_i
166
+ if val > 0xffff
167
+ raise ArgumentError, 'classesbyval() argument larger than ' + 0xffff
168
+ end
169
+
170
+ return val;
171
+ end
172
+
173
+
174
+
175
+ def Classes.classesbyval(val) #:nodoc: all
176
+ if (val.class == String)
177
+ if ((val =~ /^\s*0*([0-9]+)\s*$/) == nil)
178
+ raise ArgumentError, "classesbybal() argument is not numeric (#{val})" # unless val.gsub!("^\s*0*([0-9]+)\s*$", "$1")
179
+ # val =~ s/^\s*0*([0-9]+)\s*$/$1/o;#
180
+ end
181
+ val = $1.to_i
182
+ end
183
+
184
+ return to_string(val) if to_string(val)
185
+
186
+ raise ArgumentError, 'classesbyval() argument larger than ' + 0xffff if val > 0xffff;
187
+
188
+ return "CLASS#{val}";
189
+ end
190
+ end
191
+
192
+ # The RR types explicitly supported by Dnsruby.
193
+ #
194
+ # New RR types should be added to this set
195
+ class Types < CodeMapper
196
+ SIGZERO = 0 # RFC2931 consider this a pseudo type
197
+ A = 1 # RFC 1035, Section 3.4.1
198
+ NS = 2 # RFC 1035, Section 3.3.11
199
+ MD = 3 # RFC 1035, Section 3.3.4 (obsolete)
200
+ MF = 4 # RFC 1035, Section 3.3.5 (obsolete)
201
+ CNAME = 5 # RFC 1035, Section 3.3.1
202
+ SOA = 6 # RFC 1035, Section 3.3.13
203
+ MB = 7 # RFC 1035, Section 3.3.3
204
+ MG = 8 # RFC 1035, Section 3.3.6
205
+ MR = 9 # RFC 1035, Section 3.3.8
206
+ NULL = 10 # RFC 1035, Section 3.3.10
207
+ WKS = 11 # RFC 1035, Section 3.4.2 (deprecated)
208
+ PTR = 12 # RFC 1035, Section 3.3.12
209
+ HINFO = 13 # RFC 1035, Section 3.3.2
210
+ MINFO = 14 # RFC 1035, Section 3.3.7
211
+ MX = 15 # RFC 1035, Section 3.3.9
212
+ TXT = 16 # RFC 1035, Section 3.3.14
213
+ RP = 17 # RFC 1183, Section 2.2
214
+ AFSDB = 18 # RFC 1183, Section 1
215
+ X25 = 19 # RFC 1183, Section 3.1
216
+ ISDN = 20 # RFC 1183, Section 3.2
217
+ RT = 21 # RFC 1183, Section 3.3
218
+ NSAP = 22 # RFC 1706, Section 5
219
+ NSAP_PTR = 23 # RFC 1348 (obsolete)
220
+ SIG = 24 # RFC 2535, Section 4.1
221
+ KEY = 25 # RFC 2535, Section 3.1
222
+ PX = 26 # RFC 2163,
223
+ GPOS = 27 # RFC 1712 (obsolete)
224
+ AAAA = 28 # RFC 1886, Section 2.1
225
+ LOC = 29 # RFC 1876
226
+ NXT = 30 # RFC 2535, Section 5.2 obsoleted by RFC3755
227
+ EID = 31 # draft-ietf-nimrod-dns-xx.txt
228
+ NIMLOC = 32 # draft-ietf-nimrod-dns-xx.txt
229
+ SRV = 33 # RFC 2052
230
+ ATMA = 34 # ???
231
+ NAPTR = 35 # RFC 2168
232
+ KX = 36 # RFC 2230
233
+ CERT = 37 # RFC 2538
234
+ DNAME = 39 # RFC 2672
235
+ OPT = 41 # RFC 2671
236
+ DS = 43 # RFC 4034
237
+ SSHFP = 44 # RFC 4255
238
+ IPSECKEY = 45 # RFC 4025
239
+ RRSIG = 46 # RFC 4034
240
+ NSEC = 47 # RFC 4034
241
+ DNSKEY = 48 # RFC 4034
242
+ DHCID = 49 # RFC 4701
243
+ NSEC3 = 50 # RFC still pending at time of writing
244
+ NSEC3PARAM= 51 # RFC still pending at time of writing
245
+ SPF = 99 # RFC 4408
246
+ UINFO = 100 # non-standard
247
+ UID = 101 # non-standard
248
+ GID = 102 # non-standard
249
+ UNSPEC = 103 # non-standard
250
+ TKEY = 249 # RFC 2930
251
+ TSIG = 250 # RFC 2931
252
+ IXFR = 251 # RFC 1995
253
+ AXFR = 252 # RFC 1035
254
+ MAILB = 253 # RFC 1035 (MB, MG, MR)
255
+ MAILA = 254 # RFC 1035 (obsolete - see MX)
256
+ ANY = 255 # RFC 1035
257
+ update()
258
+
259
+ def unknown_string(arg) #:nodoc: all
260
+ if (arg=~/^TYPE/i)
261
+ Types.add_pair(arg, arg.gsub('TYPE', '').to_i)
262
+ set_string(arg)
263
+ else
264
+ raise ArgumentError.new("String #{arg} not a member of #{self.class}")
265
+ end
266
+ end
267
+
268
+ def unknown_code(arg) #:nodoc: all
269
+ Types.add_pair('TYPE' + arg.to_s, arg)
270
+ set_code(arg)
271
+ end
272
+
273
+ #--
274
+ # typesbyval and typesbyname functions are wrappers around the similarly named
275
+ # hashes. They are used for 'unknown' DNS RR types (RFC3597)
276
+ # typesbyname returns they TYPEcode as a function of the TYPE
277
+ # mnemonic. If the TYPE mapping is not specified the generic mnemonic
278
+ # TYPE### is returned.
279
+ def Types.typesbyname(name) #:nodoc: all
280
+ name.upcase!
281
+
282
+ if to_code(name)
283
+ return to_code(name)
284
+ end
285
+
286
+
287
+ if ((name =~/^\s*TYPE(\d+)\s*$/o)==nil)
288
+ raise ArgumentError, "Net::DNS::typesbyname() argument (#{name}) is not TYPE###"
289
+ end
290
+
291
+ val = $1.to_i
292
+ if val > 0xffff
293
+ raise ArgumentError, 'Net::DNS::typesbyname() argument larger than ' + 0xffff
294
+ end
295
+
296
+ return val;
297
+ end
298
+
299
+
300
+ # typesbyval returns they TYPE mnemonic as a function of the TYPE
301
+ # code. If the TYPE mapping is not specified the generic mnemonic
302
+ # TYPE### is returned.
303
+ def Types.typesbyval(val) #:nodoc: all
304
+ if (!defined?val)
305
+ raise ArgumentError, "Net::DNS::typesbyval() argument is not defined"
306
+ end
307
+
308
+ if val.class == String
309
+ # if val.gsub!("^\s*0*(\d+)\s*$", "$1")
310
+ if ((val =~ /^\s*0*(\d+)\s*$", "$1/o) == nil)
311
+ raise ArgumentError, "Net::DNS::typesbyval() argument (#{val}) is not numeric"
312
+ # val =~s/^\s*0*(\d+)\s*$/$1/o;
313
+ end
314
+
315
+ val = $1.to_i
316
+ end
317
+
318
+
319
+ if to_string(val)
320
+ return to_string(val)
321
+ end
322
+
323
+ raise ArgumentError, 'Net::DNS::typesbyval() argument larger than ' + 0xffff if
324
+ val > 0xffff;
325
+
326
+ return "TYPE#{val}";
327
+ end
328
+ end
329
+
330
+ class QTypes < CodeMapper
331
+ IXFR = 251 # incremental transfer [RFC1995]
332
+ AXFR = 252 # transfer of an entire zone [RFC1035]
333
+ MAILB = 253 # mailbox-related RRs (MB, MG or MR) [RFC1035]
334
+ MAILA = 254 # mail agent RRs (Obsolete - see MX) [RFC1035]
335
+ ANY = 255 # all records [RFC1035]
336
+ update()
337
+ end
338
+
339
+ class MetaTypes < CodeMapper
340
+ TKEY = 249 # Transaction Key [RFC2930]
341
+ TSIG = 250 # Transaction Signature [RFC2845]
342
+ OPT = 41 # RFC 2671
343
+ end
344
+
345
+ class Algorithms < CodeMapper
346
+ RSAMD5 = 1
347
+ DH = 2
348
+ DSA = 3
349
+ ECC = 4
350
+ RSASHA1 = 5
351
+ DSANSEC3SHA1 = 131
352
+ RSASHA1NSEC3SHA1 = 133
353
+ INDIRECT = 252
354
+ PRIVATEDNS = 253
355
+ PRIVATEOID = 254
356
+ update()
357
+ end
358
+
359
+ #An error raised while querying for a resource
360
+ class ResolvError < StandardError
361
+ end
362
+
363
+ #A timeout error raised while querying for a resource
364
+ class ResolvTimeout < TimeoutError
365
+ end
366
+
367
+ #The requested domain does not exist
368
+ class NXDomain < ResolvError
369
+ end
370
+
371
+ #A format error in a received DNS message
372
+ class FormErr < ResolvError
373
+ end
374
+
375
+ #Indicates a failure in the remote resolver
376
+ class ServFail < ResolvError
377
+ end
378
+
379
+ #The requested operation is not implemented in the remote resolver
380
+ class NotImp < ResolvError
381
+ end
382
+
383
+ #The requested operation was refused by the remote resolver
384
+ class Refused < ResolvError
385
+ end
386
+
387
+ #Another kind of resolver error has occurred
388
+ class OtherResolvError < ResolvError
389
+ end
390
+
391
+ #Indicates an error in decoding an incoming DNS message
392
+ class DecodeError < ResolvError
393
+ end
394
+
395
+ #Indicates an error encoding a DNS message for transmission
396
+ class EncodeError < ResolvError
397
+ end
398
+
399
+ #Indicates an error verifying
400
+ class VerifyError < ResolvError
401
+ end
402
+
403
+ #The Resolv class can be used to resolve addresses using /etc/hosts and /etc/resolv.conf,
404
+ #
405
+ #The DNS class may be used to perform more queries. If greater control over the sending
406
+ #of packets is required, then the Resolver or SingleResolver classes may be used.
407
+ class Resolv
408
+
409
+ #Looks up the first IP address for +name+
410
+ def self.getaddress(name)
411
+ DefaultResolver.getaddress(name)
412
+ end
413
+
414
+ #Looks up all IP addresses for +name+
415
+ def self.getaddresses(name)
416
+ DefaultResolver.getaddresses(name)
417
+ end
418
+
419
+ #Iterates over all IP addresses for +name+
420
+ def self.each_address(name, &block)
421
+ DefaultResolver.each_address(name, &block)
422
+ end
423
+
424
+ #Looks up the first hostname of +address+
425
+ def self.getname(address)
426
+ DefaultResolver.getname(address)
427
+ end
428
+
429
+ #Looks up all hostnames of +address+
430
+ def self.getnames(address)
431
+ DefaultResolver.getnames(address)
432
+ end
433
+
434
+ #Iterates over all hostnames of +address+
435
+ def self.each_name(address, &proc)
436
+ DefaultResolver.each_name(address, &proc)
437
+ end
438
+
439
+ #Creates a new Resolv using +resolvers+
440
+ def initialize(resolvers=[Hosts.new, DNS.new])
441
+ @resolvers = resolvers
442
+ end
443
+
444
+ #Looks up the first IP address for +name+
445
+ def getaddress(name)
446
+ each_address(name) {|address| return address}
447
+ raise ResolvError.new("no address for #{name}")
448
+ end
449
+
450
+ #Looks up all IP addresses for +name+
451
+ def getaddresses(name)
452
+ ret = []
453
+ each_address(name) {|address| ret << address}
454
+ return ret
455
+ end
456
+
457
+ #Iterates over all IP addresses for +name+
458
+ def each_address(name)
459
+ if AddressRegex =~ name
460
+ yield name
461
+ return
462
+ end
463
+ yielded = false
464
+ @resolvers.each {|r|
465
+ r.each_address(name) {|address|
466
+ yield address.to_s
467
+ yielded = true
468
+ }
469
+ return if yielded
470
+ }
471
+ end
472
+
473
+ #Looks up the first hostname of +address+
474
+ def getname(address)
475
+ each_name(address) {|name| return name}
476
+ raise ResolvError.new("no name for #{address}")
477
+ end
478
+
479
+ #Looks up all hostnames of +address+
480
+ def getnames(address)
481
+ ret = []
482
+ each_name(address) {|name| ret << name}
483
+ return ret
484
+ end
485
+
486
+ #Iterates over all hostnames of +address+
487
+ def each_name(address)
488
+ yielded = false
489
+ @resolvers.each {|r|
490
+ r.each_name(address) {|name|
491
+ yield name.to_s
492
+ yielded = true
493
+ }
494
+ return if yielded
495
+ }
496
+ end
497
+
498
+
499
+ require 'Dnsruby/DNS'
500
+ require 'Dnsruby/Hosts'
501
+ require 'Dnsruby/message'
502
+ require 'Dnsruby/update'
503
+ require 'Dnsruby/zone_transfer'
504
+ require 'Dnsruby/dnssec'
505
+
506
+ #Default Resolver to use for Dnsruby class methods
507
+ DefaultResolver = self.new
508
+
509
+ #Address RegExp to use for matching IP addresses
510
+ AddressRegex = /(?:#{IPv4::Regex})|(?:#{IPv6::Regex})/
511
+ end
512
+ end