Dnsruby 0.5.0

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