Dnsruby 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. data/README +34 -0
  2. data/doc/classes/Dnsruby/Classes.html +197 -0
  3. data/doc/classes/Dnsruby/Classes.src/M000157.html +23 -0
  4. data/doc/classes/Dnsruby/Classes.src/M000158.html +19 -0
  5. data/doc/classes/Dnsruby/CodeMapper.html +370 -0
  6. data/doc/classes/Dnsruby/CodeMapper.src/M000130.html +18 -0
  7. data/doc/classes/Dnsruby/CodeMapper.src/M000131.html +33 -0
  8. data/doc/classes/Dnsruby/CodeMapper.src/M000132.html +21 -0
  9. data/doc/classes/Dnsruby/CodeMapper.src/M000133.html +19 -0
  10. data/doc/classes/Dnsruby/CodeMapper.src/M000134.html +19 -0
  11. data/doc/classes/Dnsruby/CodeMapper.src/M000135.html +18 -0
  12. data/doc/classes/Dnsruby/CodeMapper.src/M000136.html +22 -0
  13. data/doc/classes/Dnsruby/CodeMapper.src/M000137.html +22 -0
  14. data/doc/classes/Dnsruby/CodeMapper.src/M000138.html +22 -0
  15. data/doc/classes/Dnsruby/CodeMapper.src/M000139.html +31 -0
  16. data/doc/classes/Dnsruby/CodeMapper.src/M000140.html +19 -0
  17. data/doc/classes/Dnsruby/Config.html +410 -0
  18. data/doc/classes/Dnsruby/Config.src/M000098.html +18 -0
  19. data/doc/classes/Dnsruby/Config.src/M000099.html +19 -0
  20. data/doc/classes/Dnsruby/Config.src/M000100.html +19 -0
  21. data/doc/classes/Dnsruby/Config.src/M000101.html +21 -0
  22. data/doc/classes/Dnsruby/Config.src/M000102.html +21 -0
  23. data/doc/classes/Dnsruby/Config.src/M000103.html +38 -0
  24. data/doc/classes/Dnsruby/Config.src/M000104.html +26 -0
  25. data/doc/classes/Dnsruby/Config.src/M000105.html +22 -0
  26. data/doc/classes/Dnsruby/Config.src/M000106.html +23 -0
  27. data/doc/classes/Dnsruby/Config.src/M000107.html +22 -0
  28. data/doc/classes/Dnsruby/Config.src/M000108.html +18 -0
  29. data/doc/classes/Dnsruby/DNS/DecodeError.html +111 -0
  30. data/doc/classes/Dnsruby/DNS/EncodeError.html +111 -0
  31. data/doc/classes/Dnsruby/DNS.html +469 -0
  32. data/doc/classes/Dnsruby/DNS.src/M000196.html +24 -0
  33. data/doc/classes/Dnsruby/DNS.src/M000197.html +18 -0
  34. data/doc/classes/Dnsruby/DNS.src/M000198.html +18 -0
  35. data/doc/classes/Dnsruby/DNS.src/M000199.html +20 -0
  36. data/doc/classes/Dnsruby/DNS.src/M000200.html +19 -0
  37. data/doc/classes/Dnsruby/DNS.src/M000201.html +20 -0
  38. data/doc/classes/Dnsruby/DNS.src/M000202.html +18 -0
  39. data/doc/classes/Dnsruby/DNS.src/M000203.html +19 -0
  40. data/doc/classes/Dnsruby/DNS.src/M000204.html +20 -0
  41. data/doc/classes/Dnsruby/DNS.src/M000205.html +28 -0
  42. data/doc/classes/Dnsruby/DNS.src/M000206.html +19 -0
  43. data/doc/classes/Dnsruby/DNS.src/M000207.html +20 -0
  44. data/doc/classes/Dnsruby/DNS.src/M000208.html +41 -0
  45. data/doc/classes/Dnsruby/DNS.src/M000209.html +32 -0
  46. data/doc/classes/Dnsruby/DNS.src/M000210.html +50 -0
  47. data/doc/classes/Dnsruby/DNSSEC/Algorithms.html +154 -0
  48. data/doc/classes/Dnsruby/DNSSEC.html +111 -0
  49. data/doc/classes/Dnsruby/DecodeError.html +111 -0
  50. data/doc/classes/Dnsruby/EncodeError.html +111 -0
  51. data/doc/classes/Dnsruby/FormErr.html +113 -0
  52. data/doc/classes/Dnsruby/Header.html +516 -0
  53. data/doc/classes/Dnsruby/Header.src/M000168.html +35 -0
  54. data/doc/classes/Dnsruby/Header.src/M000169.html +18 -0
  55. data/doc/classes/Dnsruby/Header.src/M000170.html +18 -0
  56. data/doc/classes/Dnsruby/Header.src/M000171.html +21 -0
  57. data/doc/classes/Dnsruby/Header.src/M000172.html +20 -0
  58. data/doc/classes/Dnsruby/Header.src/M000173.html +32 -0
  59. data/doc/classes/Dnsruby/Header.src/M000174.html +26 -0
  60. data/doc/classes/Dnsruby/Header.src/M000175.html +47 -0
  61. data/doc/classes/Dnsruby/Header.src/M000176.html +28 -0
  62. data/doc/classes/Dnsruby/Header.src/M000177.html +18 -0
  63. data/doc/classes/Dnsruby/Header.src/M000178.html +18 -0
  64. data/doc/classes/Dnsruby/Header.src/M000179.html +30 -0
  65. data/doc/classes/Dnsruby/Hosts.html +305 -0
  66. data/doc/classes/Dnsruby/Hosts.src/M000141.html +20 -0
  67. data/doc/classes/Dnsruby/Hosts.src/M000142.html +49 -0
  68. data/doc/classes/Dnsruby/Hosts.src/M000143.html +19 -0
  69. data/doc/classes/Dnsruby/Hosts.src/M000144.html +20 -0
  70. data/doc/classes/Dnsruby/Hosts.src/M000145.html +21 -0
  71. data/doc/classes/Dnsruby/Hosts.src/M000146.html +19 -0
  72. data/doc/classes/Dnsruby/Hosts.src/M000147.html +20 -0
  73. data/doc/classes/Dnsruby/Hosts.src/M000148.html +21 -0
  74. data/doc/classes/Dnsruby/IPv4.html +298 -0
  75. data/doc/classes/Dnsruby/IPv4.src/M000149.html +32 -0
  76. data/doc/classes/Dnsruby/IPv4.src/M000150.html +21 -0
  77. data/doc/classes/Dnsruby/IPv4.src/M000151.html +18 -0
  78. data/doc/classes/Dnsruby/IPv4.src/M000152.html +18 -0
  79. data/doc/classes/Dnsruby/IPv4.src/M000153.html +19 -0
  80. data/doc/classes/Dnsruby/IPv4.src/M000154.html +18 -0
  81. data/doc/classes/Dnsruby/IPv4.src/M000155.html +18 -0
  82. data/doc/classes/Dnsruby/IPv4.src/M000156.html +18 -0
  83. data/doc/classes/Dnsruby/IPv6.html +318 -0
  84. data/doc/classes/Dnsruby/IPv6.src/M000180.html +60 -0
  85. data/doc/classes/Dnsruby/IPv6.src/M000181.html +21 -0
  86. data/doc/classes/Dnsruby/IPv6.src/M000182.html +22 -0
  87. data/doc/classes/Dnsruby/IPv6.src/M000183.html +18 -0
  88. data/doc/classes/Dnsruby/IPv6.src/M000184.html +21 -0
  89. data/doc/classes/Dnsruby/IPv6.src/M000185.html +18 -0
  90. data/doc/classes/Dnsruby/IPv6.src/M000186.html +18 -0
  91. data/doc/classes/Dnsruby/IPv6.src/M000187.html +18 -0
  92. data/doc/classes/Dnsruby/Message.html +689 -0
  93. data/doc/classes/Dnsruby/Message.src/M000076.html +34 -0
  94. data/doc/classes/Dnsruby/Message.src/M000077.html +26 -0
  95. data/doc/classes/Dnsruby/Message.src/M000078.html +22 -0
  96. data/doc/classes/Dnsruby/Message.src/M000079.html +20 -0
  97. data/doc/classes/Dnsruby/Message.src/M000080.html +20 -0
  98. data/doc/classes/Dnsruby/Message.src/M000081.html +20 -0
  99. data/doc/classes/Dnsruby/Message.src/M000082.html +20 -0
  100. data/doc/classes/Dnsruby/Message.src/M000083.html +20 -0
  101. data/doc/classes/Dnsruby/Message.src/M000084.html +21 -0
  102. data/doc/classes/Dnsruby/Message.src/M000085.html +20 -0
  103. data/doc/classes/Dnsruby/Message.src/M000086.html +18 -0
  104. data/doc/classes/Dnsruby/Message.src/M000087.html +54 -0
  105. data/doc/classes/Dnsruby/Message.src/M000088.html +42 -0
  106. data/doc/classes/Dnsruby/Message.src/M000089.html +45 -0
  107. data/doc/classes/Dnsruby/MetaTypes.html +136 -0
  108. data/doc/classes/Dnsruby/Modes.html +171 -0
  109. data/doc/classes/Dnsruby/NXDomain.html +113 -0
  110. data/doc/classes/Dnsruby/Name/Label.html +300 -0
  111. data/doc/classes/Dnsruby/Name/Label.src/M000067.html +21 -0
  112. data/doc/classes/Dnsruby/Name/Label.src/M000068.html +18 -0
  113. data/doc/classes/Dnsruby/Name/Label.src/M000069.html +22 -0
  114. data/doc/classes/Dnsruby/Name/Label.src/M000070.html +18 -0
  115. data/doc/classes/Dnsruby/Name/Label.src/M000071.html +18 -0
  116. data/doc/classes/Dnsruby/Name/Label.src/M000072.html +18 -0
  117. data/doc/classes/Dnsruby/Name/Label.src/M000073.html +18 -0
  118. data/doc/classes/Dnsruby/Name/Label.src/M000074.html +18 -0
  119. data/doc/classes/Dnsruby/Name/Label.src/M000075.html +18 -0
  120. data/doc/classes/Dnsruby/Name.html +357 -0
  121. data/doc/classes/Dnsruby/Name.src/M000057.html +28 -0
  122. data/doc/classes/Dnsruby/Name.src/M000058.html +20 -0
  123. data/doc/classes/Dnsruby/Name.src/M000059.html +18 -0
  124. data/doc/classes/Dnsruby/Name.src/M000060.html +18 -0
  125. data/doc/classes/Dnsruby/Name.src/M000061.html +21 -0
  126. data/doc/classes/Dnsruby/Name.src/M000062.html +19 -0
  127. data/doc/classes/Dnsruby/Name.src/M000064.html +22 -0
  128. data/doc/classes/Dnsruby/Name.src/M000065.html +18 -0
  129. data/doc/classes/Dnsruby/Name.src/M000066.html +20 -0
  130. data/doc/classes/Dnsruby/NotImp.html +113 -0
  131. data/doc/classes/Dnsruby/OpCode.html +146 -0
  132. data/doc/classes/Dnsruby/OtherResolvError.html +113 -0
  133. data/doc/classes/Dnsruby/QTypes.html +146 -0
  134. data/doc/classes/Dnsruby/Question.html +256 -0
  135. data/doc/classes/Dnsruby/Question.src/M000166.html +47 -0
  136. data/doc/classes/Dnsruby/Question.src/M000167.html +18 -0
  137. data/doc/classes/Dnsruby/RCode.html +211 -0
  138. data/doc/classes/Dnsruby/RR/ANY.html +133 -0
  139. data/doc/classes/Dnsruby/RR/CERT/CertificateTypes.html +169 -0
  140. data/doc/classes/Dnsruby/RR/CERT.html +180 -0
  141. data/doc/classes/Dnsruby/RR/CNAME.html +150 -0
  142. data/doc/classes/Dnsruby/RR/DNAME.html +150 -0
  143. data/doc/classes/Dnsruby/RR/DomainName.html +175 -0
  144. data/doc/classes/Dnsruby/RR/DomainName.src/M000051.html +22 -0
  145. data/doc/classes/Dnsruby/RR/Generic.html +156 -0
  146. data/doc/classes/Dnsruby/RR/Generic.src/M000041.html +25 -0
  147. data/doc/classes/Dnsruby/RR/HINFO.html +155 -0
  148. data/doc/classes/Dnsruby/RR/IN/A.html +199 -0
  149. data/doc/classes/Dnsruby/RR/IN/A.src/M000018.html +18 -0
  150. data/doc/classes/Dnsruby/RR/IN/A.src/M000019.html +18 -0
  151. data/doc/classes/Dnsruby/RR/IN/A.src/M000020.html +18 -0
  152. data/doc/classes/Dnsruby/RR/IN/AAAA.html +138 -0
  153. data/doc/classes/Dnsruby/RR/IN/AFSDB.html +145 -0
  154. data/doc/classes/Dnsruby/RR/IN/PX.html +143 -0
  155. data/doc/classes/Dnsruby/RR/IN/SRV.html +243 -0
  156. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000015.html +29 -0
  157. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000016.html +26 -0
  158. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000017.html +22 -0
  159. data/doc/classes/Dnsruby/RR/IN/WKS.html +166 -0
  160. data/doc/classes/Dnsruby/RR/IN/WKS.src/M000021.html +20 -0
  161. data/doc/classes/Dnsruby/RR/IN.html +155 -0
  162. data/doc/classes/Dnsruby/RR/ISDN.html +155 -0
  163. data/doc/classes/Dnsruby/RR/LOC.html +395 -0
  164. data/doc/classes/Dnsruby/RR/LOC.src/M000025.html +32 -0
  165. data/doc/classes/Dnsruby/RR/LOC.src/M000026.html +23 -0
  166. data/doc/classes/Dnsruby/RR/LOC.src/M000027.html +25 -0
  167. data/doc/classes/Dnsruby/RR/LOC.src/M000028.html +21 -0
  168. data/doc/classes/Dnsruby/RR/LOC.src/M000029.html +20 -0
  169. data/doc/classes/Dnsruby/RR/LOC.src/M000030.html +23 -0
  170. data/doc/classes/Dnsruby/RR/MB.html +150 -0
  171. data/doc/classes/Dnsruby/RR/MG.html +150 -0
  172. data/doc/classes/Dnsruby/RR/MINFO.html +156 -0
  173. data/doc/classes/Dnsruby/RR/MR.html +150 -0
  174. data/doc/classes/Dnsruby/RR/MX.html +155 -0
  175. data/doc/classes/Dnsruby/RR/NAPTR.html +190 -0
  176. data/doc/classes/Dnsruby/RR/NS.html +150 -0
  177. data/doc/classes/Dnsruby/RR/NSAP.html +293 -0
  178. data/doc/classes/Dnsruby/RR/NSAP.src/M000053.html +19 -0
  179. data/doc/classes/Dnsruby/RR/NSAP.src/M000054.html +19 -0
  180. data/doc/classes/Dnsruby/RR/NSAP.src/M000055.html +22 -0
  181. data/doc/classes/Dnsruby/RR/NSAP.src/M000056.html +31 -0
  182. data/doc/classes/Dnsruby/RR/PTR.html +132 -0
  183. data/doc/classes/Dnsruby/RR/RP.html +183 -0
  184. data/doc/classes/Dnsruby/RR/RP.src/M000050.html +19 -0
  185. data/doc/classes/Dnsruby/RR/RT.html +155 -0
  186. data/doc/classes/Dnsruby/RR/SOA.html +230 -0
  187. data/doc/classes/Dnsruby/RR/SOA.src/M000039.html +24 -0
  188. data/doc/classes/Dnsruby/RR/SOA.src/M000040.html +27 -0
  189. data/doc/classes/Dnsruby/RR/SPF.html +138 -0
  190. data/doc/classes/Dnsruby/RR/TKEY.html +285 -0
  191. data/doc/classes/Dnsruby/RR/TKEY.src/M000022.html +19 -0
  192. data/doc/classes/Dnsruby/RR/TKEY.src/M000023.html +29 -0
  193. data/doc/classes/Dnsruby/RR/TKEY.src/M000024.html +30 -0
  194. data/doc/classes/Dnsruby/RR/TSIG.html +416 -0
  195. data/doc/classes/Dnsruby/RR/TSIG.src/M000042.html +22 -0
  196. data/doc/classes/Dnsruby/RR/TSIG.src/M000043.html +71 -0
  197. data/doc/classes/Dnsruby/RR/TSIG.src/M000044.html +34 -0
  198. data/doc/classes/Dnsruby/RR/TSIG.src/M000045.html +37 -0
  199. data/doc/classes/Dnsruby/RR/TSIG.src/M000046.html +31 -0
  200. data/doc/classes/Dnsruby/RR/TSIG.src/M000047.html +34 -0
  201. data/doc/classes/Dnsruby/RR/TSIG.src/M000048.html +22 -0
  202. data/doc/classes/Dnsruby/RR/TSIG.src/M000049.html +29 -0
  203. data/doc/classes/Dnsruby/RR/TXT.html +233 -0
  204. data/doc/classes/Dnsruby/RR/TXT.src/M000034.html +18 -0
  205. data/doc/classes/Dnsruby/RR/TXT.src/M000035.html +18 -0
  206. data/doc/classes/Dnsruby/RR/TXT.src/M000036.html +20 -0
  207. data/doc/classes/Dnsruby/RR/TXT.src/M000037.html +27 -0
  208. data/doc/classes/Dnsruby/RR/TXT.src/M000038.html +25 -0
  209. data/doc/classes/Dnsruby/RR/X25.html +203 -0
  210. data/doc/classes/Dnsruby/RR/X25.src/M000031.html +18 -0
  211. data/doc/classes/Dnsruby/RR/X25.src/M000032.html +18 -0
  212. data/doc/classes/Dnsruby/RR/X25.src/M000033.html +22 -0
  213. data/doc/classes/Dnsruby/RR.html +620 -0
  214. data/doc/classes/Dnsruby/RR.src/M000001.html +18 -0
  215. data/doc/classes/Dnsruby/RR.src/M000002.html +22 -0
  216. data/doc/classes/Dnsruby/RR.src/M000003.html +18 -0
  217. data/doc/classes/Dnsruby/RR.src/M000004.html +18 -0
  218. data/doc/classes/Dnsruby/RR.src/M000005.html +18 -0
  219. data/doc/classes/Dnsruby/RR.src/M000006.html +36 -0
  220. data/doc/classes/Dnsruby/RR.src/M000007.html +100 -0
  221. data/doc/classes/Dnsruby/RR.src/M000008.html +18 -0
  222. data/doc/classes/Dnsruby/RR.src/M000009.html +18 -0
  223. data/doc/classes/Dnsruby/RR.src/M000010.html +22 -0
  224. data/doc/classes/Dnsruby/RR.src/M000011.html +22 -0
  225. data/doc/classes/Dnsruby/RR.src/M000012.html +18 -0
  226. data/doc/classes/Dnsruby/RR.src/M000013.html +22 -0
  227. data/doc/classes/Dnsruby/RR.src/M000014.html +24 -0
  228. data/doc/classes/Dnsruby/RRSet.html +257 -0
  229. data/doc/classes/Dnsruby/RRSet.src/M000159.html +18 -0
  230. data/doc/classes/Dnsruby/RRSet.src/M000160.html +44 -0
  231. data/doc/classes/Dnsruby/RRSet.src/M000161.html +18 -0
  232. data/doc/classes/Dnsruby/RRSet.src/M000162.html +20 -0
  233. data/doc/classes/Dnsruby/RRSet.src/M000163.html +18 -0
  234. data/doc/classes/Dnsruby/RRSet.src/M000164.html +18 -0
  235. data/doc/classes/Dnsruby/RRSet.src/M000165.html +18 -0
  236. data/doc/classes/Dnsruby/Refused.html +113 -0
  237. data/doc/classes/Dnsruby/Resolv.html +400 -0
  238. data/doc/classes/Dnsruby/Resolv.src/M000109.html +18 -0
  239. data/doc/classes/Dnsruby/Resolv.src/M000110.html +18 -0
  240. data/doc/classes/Dnsruby/Resolv.src/M000111.html +18 -0
  241. data/doc/classes/Dnsruby/Resolv.src/M000112.html +18 -0
  242. data/doc/classes/Dnsruby/Resolv.src/M000113.html +18 -0
  243. data/doc/classes/Dnsruby/Resolv.src/M000114.html +18 -0
  244. data/doc/classes/Dnsruby/Resolv.src/M000115.html +18 -0
  245. data/doc/classes/Dnsruby/Resolv.src/M000116.html +19 -0
  246. data/doc/classes/Dnsruby/Resolv.src/M000117.html +20 -0
  247. data/doc/classes/Dnsruby/Resolv.src/M000118.html +29 -0
  248. data/doc/classes/Dnsruby/Resolv.src/M000119.html +19 -0
  249. data/doc/classes/Dnsruby/Resolv.src/M000120.html +20 -0
  250. data/doc/classes/Dnsruby/Resolv.src/M000121.html +25 -0
  251. data/doc/classes/Dnsruby/ResolvError.html +111 -0
  252. data/doc/classes/Dnsruby/ResolvTimeout.html +111 -0
  253. data/doc/classes/Dnsruby/Resolver.html +807 -0
  254. data/doc/classes/Dnsruby/Resolver.src/M000211.html +21 -0
  255. data/doc/classes/Dnsruby/Resolver.src/M000212.html +37 -0
  256. data/doc/classes/Dnsruby/Resolver.src/M000213.html +64 -0
  257. data/doc/classes/Dnsruby/Resolver.src/M000214.html +23 -0
  258. data/doc/classes/Dnsruby/Resolver.src/M000215.html +46 -0
  259. data/doc/classes/Dnsruby/Resolver.src/M000216.html +21 -0
  260. data/doc/classes/Dnsruby/Resolver.src/M000217.html +22 -0
  261. data/doc/classes/Dnsruby/Resolver.src/M000218.html +18 -0
  262. data/doc/classes/Dnsruby/Resolver.src/M000219.html +20 -0
  263. data/doc/classes/Dnsruby/Resolver.src/M000220.html +19 -0
  264. data/doc/classes/Dnsruby/Resolver.src/M000221.html +19 -0
  265. data/doc/classes/Dnsruby/Resolver.src/M000222.html +19 -0
  266. data/doc/classes/Dnsruby/Resolver.src/M000223.html +19 -0
  267. data/doc/classes/Dnsruby/Resolver.src/M000224.html +19 -0
  268. data/doc/classes/Dnsruby/Resolver.src/M000225.html +19 -0
  269. data/doc/classes/Dnsruby/Resolver.src/M000226.html +19 -0
  270. data/doc/classes/Dnsruby/Resolver.src/M000227.html +19 -0
  271. data/doc/classes/Dnsruby/Resolver.src/M000228.html +19 -0
  272. data/doc/classes/Dnsruby/Resolver.src/M000229.html +19 -0
  273. data/doc/classes/Dnsruby/Resolver.src/M000230.html +19 -0
  274. data/doc/classes/Dnsruby/ServFail.html +113 -0
  275. data/doc/classes/Dnsruby/SingleResolver.html +496 -0
  276. data/doc/classes/Dnsruby/SingleResolver.src/M000122.html +18 -0
  277. data/doc/classes/Dnsruby/SingleResolver.src/M000123.html +19 -0
  278. data/doc/classes/Dnsruby/SingleResolver.src/M000124.html +49 -0
  279. data/doc/classes/Dnsruby/SingleResolver.src/M000125.html +18 -0
  280. data/doc/classes/Dnsruby/SingleResolver.src/M000126.html +21 -0
  281. data/doc/classes/Dnsruby/SingleResolver.src/M000127.html +25 -0
  282. data/doc/classes/Dnsruby/SingleResolver.src/M000128.html +78 -0
  283. data/doc/classes/Dnsruby/SingleResolver.src/M000129.html +21 -0
  284. data/doc/classes/Dnsruby/TheLog.html +196 -0
  285. data/doc/classes/Dnsruby/TheLog.src/M000188.html +20 -0
  286. data/doc/classes/Dnsruby/TheLog.src/M000189.html +20 -0
  287. data/doc/classes/Dnsruby/TheLog.src/M000190.html +20 -0
  288. data/doc/classes/Dnsruby/Types.html +426 -0
  289. data/doc/classes/Dnsruby/Update.html +368 -0
  290. data/doc/classes/Dnsruby/Update.src/M000191.html +32 -0
  291. data/doc/classes/Dnsruby/Update.src/M000192.html +37 -0
  292. data/doc/classes/Dnsruby/Update.src/M000193.html +32 -0
  293. data/doc/classes/Dnsruby/Update.src/M000194.html +41 -0
  294. data/doc/classes/Dnsruby/Update.src/M000195.html +34 -0
  295. data/doc/classes/Dnsruby/ZoneTransfer/Delta.html +183 -0
  296. data/doc/classes/Dnsruby/ZoneTransfer/Delta.src/M000097.html +19 -0
  297. data/doc/classes/Dnsruby/ZoneTransfer.html +248 -0
  298. data/doc/classes/Dnsruby/ZoneTransfer.src/M000095.html +22 -0
  299. data/doc/classes/Dnsruby/ZoneTransfer.src/M000096.html +35 -0
  300. data/doc/classes/Dnsruby.html +388 -0
  301. data/doc/created.rid +1 -0
  302. data/doc/files/lib/Dnsruby/Config_rb.html +101 -0
  303. data/doc/files/lib/Dnsruby/DNSSEC_rb.html +101 -0
  304. data/doc/files/lib/Dnsruby/DNS_rb.html +110 -0
  305. data/doc/files/lib/Dnsruby/Hosts_rb.html +108 -0
  306. data/doc/files/lib/Dnsruby/Resolver_rb.html +108 -0
  307. data/doc/files/lib/Dnsruby/SingleResolver_rb.html +108 -0
  308. data/doc/files/lib/Dnsruby/TheLog_rb.html +110 -0
  309. data/doc/files/lib/Dnsruby/code_mapper_rb.html +101 -0
  310. data/doc/files/lib/Dnsruby/ipv4_rb.html +101 -0
  311. data/doc/files/lib/Dnsruby/ipv6_rb.html +101 -0
  312. data/doc/files/lib/Dnsruby/message_rb.html +109 -0
  313. data/doc/files/lib/Dnsruby/name_rb.html +101 -0
  314. data/doc/files/lib/Dnsruby/resource/AAAA_rb.html +101 -0
  315. data/doc/files/lib/Dnsruby/resource/AFSDB_rb.html +101 -0
  316. data/doc/files/lib/Dnsruby/resource/A_rb.html +101 -0
  317. data/doc/files/lib/Dnsruby/resource/CERT_rb.html +101 -0
  318. data/doc/files/lib/Dnsruby/resource/HINFO_rb.html +101 -0
  319. data/doc/files/lib/Dnsruby/resource/IN_rb.html +112 -0
  320. data/doc/files/lib/Dnsruby/resource/ISDN_rb.html +101 -0
  321. data/doc/files/lib/Dnsruby/resource/LOC_rb.html +101 -0
  322. data/doc/files/lib/Dnsruby/resource/MINFO_rb.html +101 -0
  323. data/doc/files/lib/Dnsruby/resource/MX_rb.html +101 -0
  324. data/doc/files/lib/Dnsruby/resource/NAPTR_rb.html +101 -0
  325. data/doc/files/lib/Dnsruby/resource/NSAP_rb.html +101 -0
  326. data/doc/files/lib/Dnsruby/resource/OPT_rb.html +101 -0
  327. data/doc/files/lib/Dnsruby/resource/PX_rb.html +101 -0
  328. data/doc/files/lib/Dnsruby/resource/RP_rb.html +101 -0
  329. data/doc/files/lib/Dnsruby/resource/RT_rb.html +101 -0
  330. data/doc/files/lib/Dnsruby/resource/SOA_rb.html +101 -0
  331. data/doc/files/lib/Dnsruby/resource/SPF_rb.html +101 -0
  332. data/doc/files/lib/Dnsruby/resource/SRV_rb.html +101 -0
  333. data/doc/files/lib/Dnsruby/resource/TKEY_rb.html +101 -0
  334. data/doc/files/lib/Dnsruby/resource/TSIG_rb.html +110 -0
  335. data/doc/files/lib/Dnsruby/resource/TXT_rb.html +108 -0
  336. data/doc/files/lib/Dnsruby/resource/X25_rb.html +101 -0
  337. data/doc/files/lib/Dnsruby/resource/domain_name_rb.html +101 -0
  338. data/doc/files/lib/Dnsruby/resource/generic_rb.html +125 -0
  339. data/doc/files/lib/Dnsruby/resource/resource_rb.html +110 -0
  340. data/doc/files/lib/Dnsruby/select_thread_rb.html +111 -0
  341. data/doc/files/lib/Dnsruby/update_rb.html +101 -0
  342. data/doc/files/lib/Dnsruby/zone_transfer_rb.html +101 -0
  343. data/doc/files/lib/dnsruby_rb.html +118 -0
  344. data/doc/fr_class_index.html +102 -0
  345. data/doc/fr_file_index.html +68 -0
  346. data/doc/fr_method_index.html +256 -0
  347. data/doc/index.html +24 -0
  348. data/lib/Dnsruby/Config.rb +350 -0
  349. data/lib/Dnsruby/DNS.rb +253 -0
  350. data/lib/Dnsruby/DNSSEC.rb +29 -0
  351. data/lib/Dnsruby/Hosts.rb +119 -0
  352. data/lib/Dnsruby/Resolver.rb +618 -0
  353. data/lib/Dnsruby/SingleResolver.rb +312 -0
  354. data/lib/Dnsruby/TheLog.rb +61 -0
  355. data/lib/Dnsruby/code_mapper.rb +164 -0
  356. data/lib/Dnsruby/ipv4.rb +83 -0
  357. data/lib/Dnsruby/ipv6.rb +142 -0
  358. data/lib/Dnsruby/message.rb +819 -0
  359. data/lib/Dnsruby/name.rb +325 -0
  360. data/lib/Dnsruby/resource/A.rb +56 -0
  361. data/lib/Dnsruby/resource/AAAA.rb +54 -0
  362. data/lib/Dnsruby/resource/AFSDB.rb +68 -0
  363. data/lib/Dnsruby/resource/CERT.rb +89 -0
  364. data/lib/Dnsruby/resource/HINFO.rb +52 -0
  365. data/lib/Dnsruby/resource/IN.rb +69 -0
  366. data/lib/Dnsruby/resource/ISDN.rb +54 -0
  367. data/lib/Dnsruby/resource/LOC.rb +255 -0
  368. data/lib/Dnsruby/resource/MINFO.rb +66 -0
  369. data/lib/Dnsruby/resource/MX.rb +66 -0
  370. data/lib/Dnsruby/resource/NAPTR.rb +90 -0
  371. data/lib/Dnsruby/resource/NSAP.rb +172 -0
  372. data/lib/Dnsruby/resource/OPT.rb +153 -0
  373. data/lib/Dnsruby/resource/PX.rb +71 -0
  374. data/lib/Dnsruby/resource/RP.rb +67 -0
  375. data/lib/Dnsruby/resource/RT.rb +67 -0
  376. data/lib/Dnsruby/resource/SOA.rb +89 -0
  377. data/lib/Dnsruby/resource/SPF.rb +29 -0
  378. data/lib/Dnsruby/resource/SRV.rb +108 -0
  379. data/lib/Dnsruby/resource/TKEY.rb +160 -0
  380. data/lib/Dnsruby/resource/TSIG.rb +328 -0
  381. data/lib/Dnsruby/resource/TXT.rb +76 -0
  382. data/lib/Dnsruby/resource/X25.rb +53 -0
  383. data/lib/Dnsruby/resource/domain_name.rb +58 -0
  384. data/lib/Dnsruby/resource/generic.rb +142 -0
  385. data/lib/Dnsruby/resource/resource.rb +444 -0
  386. data/lib/Dnsruby/select_thread.rb +474 -0
  387. data/lib/Dnsruby/update.rb +263 -0
  388. data/lib/Dnsruby/zone_transfer.rb +296 -0
  389. data/lib/dnsruby.rb +468 -0
  390. data/test/custom.txt +4 -0
  391. data/test/resolv.conf +4 -0
  392. data/test/tc_axfr.rb +42 -0
  393. data/test/tc_dns.rb +231 -0
  394. data/test/tc_dnsruby.rb +42 -0
  395. data/test/tc_escapedchars.rb +510 -0
  396. data/test/tc_header.rb +104 -0
  397. data/test/tc_misc.rb +139 -0
  398. data/test/tc_name.rb +53 -0
  399. data/test/tc_packet.rb +158 -0
  400. data/test/tc_packet_unique_push.rb +102 -0
  401. data/test/tc_question.rb +52 -0
  402. data/test/tc_res_config.rb +92 -0
  403. data/test/tc_res_env.rb +62 -0
  404. data/test/tc_res_file.rb +42 -0
  405. data/test/tc_res_opt.rb +185 -0
  406. data/test/tc_resolver.rb +177 -0
  407. data/test/tc_rr-opt.rb +42 -0
  408. data/test/tc_rr-txt.rb +137 -0
  409. data/test/tc_rr-unknown.rb +99 -0
  410. data/test/tc_rr.rb +259 -0
  411. data/test/tc_single_resolver.rb +153 -0
  412. data/test/tc_soak.rb +310 -0
  413. data/test/tc_tcp.rb +35 -0
  414. data/test/tc_tkey.rb +106 -0
  415. data/test/tc_update.rb +215 -0
  416. data/test/ts_dnsruby.rb +17 -0
  417. data/test/ts_offline.rb +35 -0
  418. data/test/ts_online.rb +40 -0
  419. metadata +512 -0
@@ -0,0 +1,263 @@
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=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
+ # @TODO@ Could also be an actual RR object?
143
+ name = args[0]
144
+ type = Types.ANY
145
+ if (args.length>=2) # RRSET (RFC2136, Section 2.4.1)
146
+ type = args[1]
147
+ end
148
+ if (args.length > 2) # RRSET (RFC2136, Section 2.4.2)
149
+ klass = zone()[0].zclass
150
+ rdata=args[2]
151
+ end
152
+ rec = RR.create("#{name} #{ttl} #{klass} #{type} #{rdata}")
153
+ add_pre(rec)
154
+ return rec
155
+ else
156
+ raise ArgumentError.new("Wrong number of arguments (#{args.length} for 1 or 2) for Update#absent")
157
+ end
158
+ end
159
+
160
+ #Ways to create the prerequisite records (exists, notexists, inuse, etc. - RFC2136, section 2.4)
161
+ #Can be called with one arg :
162
+ #
163
+ # update.absent(name)
164
+ # (5) Name is not in use. No RR of any type is owned by a
165
+ # specified NAME. Note that this prerequisite IS satisfied by
166
+ # empty nonterminals.
167
+ #
168
+ #Or with two :
169
+ #
170
+ # update.absent(name, type)
171
+ # (3) RRset does not exist. No RRs with a specified NAME and TYPE
172
+ # (in the zone and class denoted by the Zone Section) can exist.
173
+ #
174
+ def absent(*args)
175
+ ttl = 0
176
+ rdata = []
177
+ klass = Classes.NONE
178
+ if (args.length>=1) # domain (RFC2136, Section 2.4.5)
179
+ name = args[0]
180
+ type = Types.ANY
181
+ if (args.length==2) # RRSET (RFC2136, Section 2.4.3)
182
+ type = args[1]
183
+ end
184
+ rec = RR.create("#{name} #{ttl} #{klass} #{type} #{rdata}")
185
+ add_pre(rec)
186
+ return rec
187
+ else
188
+ raise ArgumentError.new("Wrong number of arguments (#{args.length} for 1 or 2) for Update#absent")
189
+ end
190
+ end
191
+
192
+ #Ways to create the update records (add, delete, RFC2136, section 2.5)
193
+ # " 2.5.1 - Add To An RRset
194
+ #
195
+ # RRs are added to the Update Section whose NAME, TYPE, TTL, RDLENGTH
196
+ # and RDATA are those being added, and CLASS is the same as the zone
197
+ # class. Any duplicate RRs will be silently ignored by the primary
198
+ # master."
199
+ #
200
+ # update.add(rr)
201
+ # update.add([rr1, rr2])
202
+ # update.add(name, type, ttl, rdata)
203
+ #
204
+ def add(*args)
205
+ zoneclass=zone()[0].zclass
206
+ case args[0]
207
+ when Array
208
+ args[0].each do |resource|
209
+ add(resource)
210
+ end
211
+ when RR
212
+ # Make sure that the Class is the same as the zone
213
+ resource = args[0]
214
+ if (resource.klass != zoneclass)
215
+ raise ArgumentError.new("Wrong class #{resource.klass} for update (should be #{zoneclass})!")
216
+ end
217
+ add_update(resource)
218
+ return resource
219
+ else
220
+ name=args[0]
221
+ type=args[1]
222
+ ttl=args[2]
223
+ rdata=args[3]
224
+ resource = RR.create("#{name} #{ttl} #{zoneclass} #{type} #{rdata}")
225
+ add_update(resource)
226
+ return resource
227
+ end
228
+ # @TODO@ Should be able to take RRSet!
229
+ end
230
+
231
+ #Ways to create the update records (add, delete, RFC2136, section 2.5)
232
+ #
233
+ #2.5.2 - Delete An RRset
234
+ # update.delete(name, type)
235
+ #
236
+ #
237
+ #2.5.3 - Delete All RRsets From A Name
238
+ # update.delete(name)
239
+ #
240
+ #2.5.4 - Delete An RR From An RRset
241
+ # update.delete(name, type, rdata)
242
+ #
243
+ def delete(*args)
244
+ ttl = 0
245
+ klass = Classes.ANY
246
+ rdata=[]
247
+ resource = nil
248
+ case args.length
249
+ when 1 # name
250
+ resource = RR.create("#{args[0]} #{ttl} #{klass} #{Types.ANY} #{rdata}")
251
+ add_update(resource)
252
+ when 2 # name, type
253
+ resource = RR.create("#{args[0]} #{ttl} #{klass} #{args[1]} #{rdata}")
254
+ add_update(resource)
255
+ when 3 # name, type, rdata
256
+ klass = Classes.NONE
257
+ resource = RR.create("#{args[0]} #{ttl} #{klass} #{args[1]} #{args[2]}")
258
+ add_update(resource)
259
+ end
260
+ return resource
261
+ end
262
+ end
263
+ end
@@ -0,0 +1,296 @@
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
+
15
+ def initialize
16
+ @server=Config.new.nameserver[0]
17
+ @transfer_type = Types.AXFR
18
+ @klass=Classes.IN
19
+ @port=53
20
+ @serial=0
21
+ end
22
+
23
+ # Perform a zone transfer (RFC1995)
24
+ # If an IXFR query is unsuccessful, then AXFR is tried (and @transfer_type is set
25
+ # to AXFR)
26
+ # TCP is used as the only transport
27
+ #
28
+ # If AXFR is performed, then the zone will be returned as a set of records :
29
+ #
30
+ # zt = Dnsruby::ZoneTransfer.new
31
+ # zt.transfer_type = Dnsruby::Types.AXFR
32
+ # zt.server = "ns0.validation-test-servers.nominet.org.uk"
33
+ # zone = zt.transfer("validation-test-servers.nominet.org.uk")
34
+ # soa = zone[0]
35
+ # rec1 = zone[1]
36
+ # print zone.to_s
37
+ #
38
+ #
39
+ # If IXFR is performed, then the incrementals will be returned as a set of Deltas.
40
+ # Each Delta contains the start and end SOA serial number, as well as an array of
41
+ # adds and deletes that occurred between the start and end.
42
+ #
43
+ # zt = Dnsruby::ZoneTransfer.new
44
+ # zt.transfer_type = Dnsruby::Types.IXFR
45
+ # zt.server = "ns0.validation-test-servers.nominet.org.uk"
46
+ # zt.serial = 2007090401
47
+ # deltas = zt.transfer("validation-test-servers.nominet.org.uk")
48
+ # assert_equal("Should show up in transfer", deltas[0].adds[1].data)
49
+ def transfer(zone)
50
+ servers = @server
51
+ if (servers.class == String)
52
+ servers=[servers]
53
+ end
54
+ xfr = nil
55
+ exception = nil
56
+ servers.each do |server|
57
+ begin
58
+ server=Config.resolve_server(server)
59
+ xfr = do_transfer(zone, server)
60
+ break
61
+ rescue Exception => exception
62
+ end
63
+ end
64
+ if (xfr == nil && exception != nil)
65
+ raise exception
66
+ end
67
+ return xfr
68
+ end
69
+
70
+ def do_transfer(zone, server) #:nodoc: all
71
+ @transfer_type = Types.new(@transfer_type)
72
+ @state = :InitialSoa
73
+ socket = TCPSocket.new(server, @port)
74
+ begin
75
+ # Send an initial query
76
+ msg = Message.new(zone, @transfer_type, @klass)
77
+ if @transfer_type == Types.IXFR
78
+ rr = RR.create("#{zone} 0 IN SOA" + '. . %u 0 0 0 0' % @serial)
79
+ msg.add_authority(rr)
80
+ end
81
+ # @TODO@ TSIG?
82
+ send_message(socket, msg)
83
+
84
+ while (@state != :End)
85
+ response = receive_message(socket)
86
+
87
+ if (@state == :InitialSoa)
88
+ rcode = response.header.rcode
89
+ if (rcode != RCode.NOERROR)
90
+ if (@transfer_type == Types.IXFR &&
91
+ rcode == RCode.NOTIMP)
92
+ # IXFR didn't work - let's try AXFR
93
+ TheLog.debug("IXFR DID NOT WORK (rcode = NOTIMP) - TRYING AXFR!!")
94
+ @state = :InitialSoa
95
+ @transfer_type=Types.AXFR
96
+ # Send an initial AXFR query
97
+ msg = Message.new(zone, @transfer_type, @klass)
98
+ # @TODO@ TSIG?
99
+ send_message(socket, msg)
100
+ next
101
+ end
102
+ raise ResolvError.new(rcode.string);
103
+ end
104
+
105
+ if (response.question[0].qtype != @transfer_type)
106
+ raise ResolvError.new("invalid question section")
107
+ end
108
+
109
+ if (response.header.ancount == 0 && @transfer_type == Types.IXFR)
110
+ TheLog.debug("IXFR DID NOT WORK (ancount = 0) - TRYING AXFR!!")
111
+ # IXFR didn't work - let's try AXFR
112
+ @transfer_type=Types.AXFR
113
+ # Send an initial AXFR query
114
+ @state = :InitialSoa
115
+ msg = Message.new(zone, @transfer_type, @klass)
116
+ # @TODO@ TSIG?
117
+ send_message(socket, msg)
118
+ next
119
+ end
120
+ end
121
+
122
+ response.each_answer { |rr|
123
+ parseRR(rr)
124
+ }
125
+ # if (state == END &&
126
+ # response.tsigState == Message.TSIG_INTERMEDIATE)
127
+ # raise ResolvError.new("last message must be signed")
128
+ # end
129
+ end
130
+ # This could return with an IXFR response, or an AXFR response.
131
+ # If it fails completely, then try to send an AXFR query.
132
+ # Once the query has been sent, then enter the main response loop.
133
+ # Unless we know we're definitely AXFR, we should be prepared for either IXFR or AXFR
134
+ # AXFR response : The first and the last RR of the response is the SOA record of the zone.
135
+ # The whole zone is returned inbetween.
136
+ # IXFR response : one or more difference sequences is returned. The list of difference
137
+ # sequences is preceded and followed by a copy of the server's current
138
+ # version of the SOA.
139
+ # Each difference sequence represents one update to the zone (one SOA
140
+ # serial change) consisting of deleted RRs and added RRs. The first RR
141
+ # of the deleted RRs is the older SOA RR and the first RR of the added
142
+ # RRs is the newer SOA RR.
143
+ socket.close
144
+ if (@axfr!=nil)
145
+ return @axfr
146
+ end
147
+ return @ixfr
148
+ rescue Exception => e
149
+ socket.close
150
+ raise e
151
+ end
152
+ end
153
+
154
+ # All changes between two versions of a zone in an IXFR response.
155
+ class Delta
156
+
157
+ # The starting serial number of this delta.
158
+ attr_accessor :start
159
+
160
+ # The ending serial number of this delta.
161
+ attr_accessor :end
162
+
163
+ # A list of records added between the start and end versions
164
+ attr_accessor :adds
165
+
166
+ # A list of records deleted between the start and end versions
167
+ attr_accessor :deletes
168
+
169
+ def initialize()
170
+ @adds = []
171
+ @deletes = []
172
+ end
173
+ end
174
+
175
+ def parseRR(rec) #:nodoc: all
176
+ name = rec.name
177
+ type = rec.type
178
+ delta = Delta.new
179
+
180
+ case @state
181
+ when :InitialSoa
182
+ if (type != Types.SOA)
183
+ raise ResolvError.new("missing initial SOA")
184
+ end
185
+ @initialsoa = rec
186
+ # Remember the serial number in the initial SOA; we need it
187
+ # to recognize the end of an IXFR.
188
+ @end_serial = rec.serial
189
+ if (@transfer_type == Types.IXFR && @end_serial <= @serial)
190
+ TheLog.debug("zone up to date")
191
+ @state = :End
192
+ else
193
+ @state = :FirstData
194
+ end
195
+ when :FirstData
196
+ # If the transfer begins with 1 SOA, it's an AXFR.
197
+ # If it begins with 2 SOAs, it's an IXFR.
198
+ if (@transfer_type == Types.IXFR && type == Types.SOA &&
199
+ rec.serial == @serial)
200
+ TheLog.debug("IXFR response - using IXFR")
201
+ @rtype = Types.IXFR
202
+ @ixfr = []
203
+ @state = :Ixfr_DelSoa
204
+ else
205
+ TheLog.debug("AXFR response - using AXFR")
206
+ @rtype = Types.AXFR
207
+ @axfr = []
208
+ @axfr << @initialsoa
209
+ @state = :Axfr
210
+ end
211
+ parseRR(rec) # Restart...
212
+ return
213
+
214
+ when :Ixfr_DelSoa
215
+ delta = Delta.new
216
+ @ixfr.push(delta);
217
+ delta.start = rec.serial
218
+ delta.deletes << rec
219
+ @state = :Ixfr_Del
220
+
221
+ when :Ixfr_Del
222
+ if (type == Types.SOA)
223
+ @current_serial = rec.serial
224
+ @state = :Ixfr_AddSoa;
225
+ parseRR(rec); # Restart...
226
+ return;
227
+ end
228
+ delta = @ixfr.get(@ixfr.length - 1);
229
+ delta.deletes << rec
230
+
231
+ when :Ixfr_AddSoa
232
+ delta = @ixfr[@ixfr.length - 1]
233
+ delta.end = rec.serial
234
+ delta.adds << rec
235
+ @state = :Ixfr_Add
236
+
237
+ when :Ixfr_Add
238
+ if (type == Types.SOA)
239
+ soa_serial = rec.serial
240
+ if (soa_serial == @end_serial)
241
+ @state = :End
242
+ return
243
+ elsif (soa_serial != @current_serial)
244
+ raise ResolvError.new("IXFR out of sync: expected serial " +
245
+ @current_serial + " , got " + soa_serial);
246
+ else
247
+ @state = :Ixfr_DelSoa
248
+ parseRR(rec); # Restart...
249
+ return;
250
+ end
251
+ end
252
+ delta = @ixfr[@ixfr.length - 1]
253
+ delta.adds << rec
254
+
255
+ when :Axfr
256
+ # Old BINDs sent cross class A records for non IN classes.
257
+ if (type == Types.A && rec.klass() != @klass)
258
+ else
259
+ @axfr << rec
260
+ if (type == Types.SOA)
261
+ @state = :End
262
+ end
263
+ end
264
+ when :End
265
+ raise ResolvError.new("extra data in zone transfer")
266
+
267
+ else
268
+ raise ResolvError.new("invalid state for zone transfer")
269
+ end
270
+ end
271
+
272
+ def send_message(socket, msg) #:nodoc: all
273
+ query_packet = msg.encode
274
+ lenmsg = [query_packet.length].pack('n')
275
+ socket.send(lenmsg, 0)
276
+ socket.send(query_packet, 0)
277
+ end
278
+
279
+ def tcp_read(socket, len) #:nodoc: all
280
+ buf=""
281
+ while (buf.length < len) do
282
+ buf += socket.recv(len-buf.length)
283
+ end
284
+ return buf
285
+ end
286
+
287
+ def receive_message(socket) #:nodoc: all
288
+ buf = tcp_read(socket, 2)
289
+ answersize = buf.unpack('n')[0]
290
+ buf = tcp_read(socket, answersize)
291
+ msg = Message.decode(buf)
292
+
293
+ return msg
294
+ end
295
+ end
296
+ end