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,819 @@
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/name'
17
+ require 'Dnsruby/resource/resource'
18
+ module Dnsruby
19
+ #===Defines a DNS packet.
20
+ #
21
+ #RFC 1035 Section 4.1, RFC 2136 Section 2, RFC 2845
22
+ #
23
+ #===Sections
24
+ #Message objects have five sections:
25
+ #
26
+ #* The header section, a Dnsruby::Header object.
27
+ #
28
+ # msg.header=Header.new(...)
29
+ # header = msg.header
30
+ #
31
+ #* The question section, an array of Dnsruby::Question objects.
32
+ #
33
+ # msg.add_question(Question.new(domain, type, klass))
34
+ # msg.each_question do |question| .... end
35
+ #
36
+ #* The answer section, an array of Dnsruby::RR objects.
37
+ #
38
+ # msg.add_answer(RR.create({:name => "a2.example.com",
39
+ # :type => "A", :address => "10.0.0.2"}))
40
+ # msg.each_answer {|answer| ... }
41
+ #
42
+ #* The authority section, an array of Dnsruby::RR objects.
43
+ #
44
+ # msg.add_authority(rr)
45
+ # msg.each_authority {|rr| ... }
46
+ #
47
+ #* The additional section, an array of Dnsruby::RR objects.
48
+ #
49
+ # msg.add_additional(rr)
50
+ # msg.each_additional {|rr| ... }
51
+ #
52
+ #In addition, each_resource iterates the answer, additional
53
+ #and authority sections :
54
+ #
55
+ # msg.each_resource {|rr| ... }
56
+ #
57
+ #===Packet format encoding
58
+ #
59
+ # Dnsruby::Message#encode
60
+ # Dnsruby::Message::decode(data)
61
+ class Message
62
+ # Create a new Message. Takes optional name, type and class
63
+ #
64
+ # type defaults to A, and klass defaults to IN
65
+ #
66
+ # Dnsruby::Message.new("example.com") # defaults to A, IN
67
+ # Dnsruby::Message.new("example.com", 'AAAA')
68
+ # Dnsruby::Message.new("example.com", Dnsruby::Types.PTR, "HS")
69
+ #
70
+ def initialize(*args)
71
+ @header = Header.new()
72
+ @question = []
73
+ @answer = []
74
+ @authority = []
75
+ @additional = []
76
+ type = Types.A
77
+ klass = Classes.IN
78
+ if (args.length > 0)
79
+ name = args[0]
80
+ if (args.length > 1)
81
+ type = Types.new(args[1])
82
+ if (args.length > 2)
83
+ klass = Classes.new(args[2])
84
+ end
85
+ end
86
+ add_question(name, type, klass)
87
+ end
88
+ end
89
+
90
+ # The question section, an array of Dnsruby::Question objects.
91
+ attr_reader :question
92
+
93
+ # The answer section, an array of Dnsruby::RR objects.
94
+ attr_reader :answer
95
+ # The authority section, an array of Dnsruby::RR objects.
96
+ attr_reader :authority
97
+ # The additional section, an array of Dnsruby::RR objects.
98
+ attr_reader :additional
99
+ # The header section, a Dnsruby::Header object.
100
+ attr_accessor :header
101
+
102
+ # If this Message is a response from a server, then answerfrom contains the address of the server
103
+ attr_accessor :answerfrom
104
+
105
+ # If this Message is a response from a server, then answersize contains the size of the response
106
+ attr_accessor :answersize
107
+
108
+ attr_accessor :tsigkey
109
+ attr_reader :querytsig
110
+ attr_reader :tsigerror
111
+
112
+ attr_accessor :tsigstart
113
+ attr_accessor :tsigstate
114
+
115
+ def ==(other)
116
+ ret = false
117
+ if (other.kind_of?Message)
118
+ ret = @header == other.header &&
119
+ @question == other.question &&
120
+ @answer == other.answer &&
121
+ @authority == other.authority &&
122
+ @additional == other.additional
123
+ end
124
+ return ret
125
+ end
126
+
127
+ # Add a new Question to the Message. Takes either a Question,
128
+ # or a name, and an optional type and class.
129
+ #
130
+ # msg.add_question(Question.new("example.com", 'MX'))
131
+ # msg.add_question("example.com") # defaults to Types.A, Classes.IN
132
+ # msg.add_question("example.com", Types.LOC)
133
+ def add_question(question, type=Types.A, klass=Classes.IN)
134
+ if (!question.kind_of?Question)
135
+ question = Question.new(question, type, klass)
136
+ end
137
+ @question << question
138
+ @header.qdcount = @question.length
139
+ end
140
+
141
+ def each_question
142
+ @question.each {|rec|
143
+ yield rec
144
+ }
145
+ end
146
+
147
+
148
+ def add_answer(rr) #:nodoc: all
149
+ if (!@answer.include?rr)
150
+ @answer << rr
151
+ @header.ancount = @answer.length
152
+ end
153
+ end
154
+
155
+ def each_answer
156
+ @answer.each {|rec|
157
+ yield rec
158
+ }
159
+ end
160
+
161
+ def add_authority(rr) #:nodoc: all
162
+ if (!@authority.include?rr)
163
+ @authority << rr
164
+ @header.nscount = @authority.length
165
+ end
166
+ end
167
+
168
+ def each_authority
169
+ @authority.each {|rec|
170
+ yield rec
171
+ }
172
+ end
173
+
174
+ def add_additional(rr) #:nodoc: all
175
+ if (!@additional.include?rr)
176
+ @additional << rr
177
+ @header.arcount = @additional.length
178
+ end
179
+ end
180
+
181
+ def each_additional
182
+ @additional.each {|rec|
183
+ yield rec
184
+ }
185
+ end
186
+
187
+ #Calls each_answer, each_authority, each_additional
188
+ def each_resource
189
+ each_answer {|rec| yield rec}
190
+ each_authority {|rec| yield rec}
191
+ each_additional {|rec| yield rec}
192
+ end
193
+
194
+ # Returns the TSIG record from the ADDITIONAL section, if one is present.
195
+ def tsig
196
+ if (@additional.last.type == Types.TSIG)
197
+ return @additional.last
198
+ end
199
+ return nil
200
+ end
201
+
202
+ # Was this message signed by a TSIG?
203
+ def is_signed
204
+ return (tsigstate == :Signed ||
205
+ tsigstate == :Verified ||
206
+ tsigstate == :Failed)
207
+ end
208
+
209
+ # If this message was signed by a TSIG, was the TSIG verified?
210
+ def is_verified
211
+ return (tsigstate == :Verified)
212
+ end
213
+
214
+ def to_s
215
+ retval = "";
216
+
217
+ if (@answerfrom != nil && @answerfrom != "")
218
+ retval = retval + ";; Answer received from #{@answerfrom} (#{@answersize} bytes)\n;;\n";
219
+ end
220
+
221
+ retval = retval + ";; HEADER SECTION\n";
222
+ retval = retval + @header.to_s;
223
+
224
+ retval = retval + "\n";
225
+ section = (@header.opcode == OpCode.UPDATE) ? "ZONE" : "QUESTION";
226
+ retval = retval + ";; #{section} SECTION (#{@header.qdcount} record#{@header.qdcount == 1 ? '' : 's'})\n";
227
+ each_question { |qr|
228
+ retval = retval + ";; #{qr.to_s}\n";
229
+ }
230
+
231
+ retval = retval + "\n";
232
+ section = (@header.opcode == OpCode.UPDATE) ? "PREREQUISITE" : "ANSWER";
233
+ retval = retval + ";; #{section} SECTION (#{@header.ancount} record#{@header.ancount == 1 ? '' : 's'})\n";
234
+ each_answer { |rr|
235
+ retval = retval + rr.to_s + "\n";
236
+ }
237
+
238
+ retval = retval + "\n";
239
+ section = (@header.opcode == OpCode.UPDATE) ? "UPDATE" : "AUTHORITY";
240
+ retval = retval + ";; #{section} SECTION (#{@header.nscount} record#{@header.nscount == 1 ? '' : 's'})\n";
241
+ each_authority { |rr|
242
+ retval = retval + rr.to_s + "\n";
243
+ }
244
+
245
+ retval = retval + "\n";
246
+ retval = retval + ";; ADDITIONAL SECTION (#{@header.arcount} record#{@header.arcount == 1 ? '' : 's'})\n";
247
+ each_additional { |rr|
248
+ retval = retval + rr.to_s+ "\n";
249
+ }
250
+
251
+ return retval;
252
+ end
253
+
254
+ #Return the encoded form of the message
255
+ def encode
256
+ return MessageEncoder.new {|msg|
257
+ header = @header
258
+ if (@tsigkey)
259
+ header.arcount += 1
260
+ end
261
+ header.encode(msg)
262
+ @question.each {|q|
263
+ msg.put_name(q.qname)
264
+ msg.put_pack('nn', q.qtype.code, q.qclass.code)
265
+ }
266
+ [@answer, @authority, @additional].each {|rr|
267
+ rr.each {|r|
268
+ # name, ttl, data = r
269
+ name = r.name
270
+ ttl = r.ttl
271
+ msg.put_name(name)
272
+ msg.put_pack('nnN', r.type.code, r.klass.code, ttl)
273
+ msg.put_length16 {r.encode_rdata(msg)}
274
+ }
275
+ }
276
+ if (@tsigkey)
277
+ tsigrec = @tsigkey.generate(this, msg, tsigerror, querytsig)
278
+ tsigrec.encode(msg, Section.ADDITIONAL, c)
279
+ end
280
+ }.to_s
281
+ end
282
+
283
+ #Decode the encoded message
284
+ def Message.decode(m)
285
+ o = Message.new()
286
+ MessageDecoder.new(m) {|msg|
287
+ o.header = Header.new(msg)
288
+ o.header.qdcount.times {
289
+ question = msg.get_question
290
+ o.question << question
291
+ }
292
+ o.header.ancount.times {
293
+ rr = msg.get_rr
294
+ o.answer << rr
295
+ }
296
+ o.header.nscount.times {
297
+ rr = msg.get_rr
298
+ o.authority << rr
299
+ }
300
+ o.header.arcount.times { |count|
301
+ rr = msg.get_rr
302
+ if (rr.type == Types.TSIG)
303
+ if (count!=o.header.arcount-1)
304
+ TheLog.Error("Incoming message has TSIG record before last record")
305
+ end
306
+ # @TODO@ Sort TSIG stuff out!
307
+ # o.tsigstart = pos
308
+ end
309
+ o.additional << rr
310
+ }
311
+ }
312
+ return o
313
+ end
314
+
315
+ #In dynamic update packets, the question section is known as zone and
316
+ #specifies the zone to be updated.
317
+ alias :zone :question
318
+ alias :add_zone :add_question
319
+ alias :each_zone :each_question
320
+ #In dynamic update packets, the answer section is known as pre or
321
+ #prerequisite and specifies the RRs or RRsets which must or
322
+ #must not preexist.
323
+ alias :pre :answer
324
+ alias :add_pre :add_answer
325
+ alias :each_pre :each_answer
326
+ #In dynamic update packets, the answer section is known as pre or
327
+ #prerequisite and specifies the RRs or RRsets which must or
328
+ #must not preexist.
329
+ alias :prerequisite :pre
330
+ alias :add_prerequisite :add_pre
331
+ alias :each_prerequisite :each_pre
332
+ #In dynamic update packets, the authority section is known as update and
333
+ #specifies the RRs or RRsets to be added or delted.
334
+ alias :update :authority
335
+ alias :add_update :add_authority
336
+ alias :each_update :each_authority
337
+
338
+ end
339
+
340
+ #The header portion of a DNS packet
341
+ #
342
+ #RFC 1035 Section 4.1.1
343
+ class Header
344
+ @@identifier = -1
345
+ MAX_ID = 65535
346
+
347
+ # The header ID
348
+ attr_accessor :id
349
+
350
+ #The query response flag
351
+ attr_accessor :qr
352
+
353
+ #Authoritative answer flag
354
+ attr_accessor :aa
355
+
356
+ #Truncated flag
357
+ attr_accessor :tc
358
+
359
+ #Recursion Desired flag
360
+ attr_accessor :rd
361
+
362
+ #The checking disabled flag
363
+ attr_accessor :cd
364
+
365
+ #Relevant in DNSSEC context.
366
+ #
367
+ #(The AD bit is only set on answers where signatures have been
368
+ #cryptographically verified or the server is authoritative for the data
369
+ #and is allowed to set the bit by policy.)
370
+ attr_accessor :ad
371
+
372
+ #The DO (dnssec OK) flag
373
+ attr_accessor :dnssec_ok
374
+
375
+ #The query response flag
376
+ attr_accessor :qr
377
+
378
+ #Recursion available flag
379
+ attr_accessor :ra
380
+
381
+ #Query response code
382
+ attr_reader :rcode
383
+
384
+ # The header opcode
385
+ attr_reader :opcode
386
+
387
+ #The number of records in the question section of the message
388
+ attr_accessor :qdcount
389
+ #The number of records in the authoriy section of the message
390
+ attr_accessor :nscount
391
+ #The number of records in the answer section of the message
392
+ attr_accessor :ancount
393
+ #The number of records in the additional record section og the message
394
+ attr_accessor :arcount
395
+
396
+ def initialize(*args)
397
+ if (args.length == 0)
398
+ @id = rand(MAX_ID)
399
+ @qr = false
400
+ @opcode=OpCode.Query
401
+ @aa = false
402
+ @ad=false
403
+ @tc = false
404
+ @rd = false # recursion desired
405
+ @ra = false # recursion available
406
+ @cd=false
407
+ @rcode=RCode.NoError
408
+ @qdcount = 0
409
+ @nscount = 0
410
+ @ancount = 0
411
+ @arcount = 0
412
+ elsif (args.length == 1)
413
+ decode(args[0])
414
+ end
415
+ end
416
+
417
+ def opcode=(op)
418
+ @opcode = Opcode.new(op)
419
+ end
420
+
421
+ def rcode=(rcode)
422
+ @rcode = RCode.new(rcode)
423
+ end
424
+
425
+ def Header.new_from_data(data)
426
+ header = Header.new
427
+ MessageDecoder.new(data) {|msg|
428
+ header.decode(msg)}
429
+ return header
430
+ end
431
+
432
+ def data
433
+ return MessageEncoder.new {|msg|
434
+ self.encode(msg)
435
+ }.to_s
436
+ end
437
+
438
+ def encode(msg)
439
+ msg.put_pack('nnnnnn',
440
+ @id,
441
+ (@qr?1:0) << 15 |
442
+ (@opcode.code & 15) << 11 |
443
+ (@aa?1:0) << 10 |
444
+ (@tc?1:0) << 9 |
445
+ (@rd?1:0) << 8 |
446
+ (@ra?1:0) << 7 |
447
+ (@ad?1:0) << 5 |
448
+ (@cd?1:0) << 4 |
449
+ (@rcode.code & 15),
450
+ @qdcount,
451
+ @ancount,
452
+ @nscount,
453
+ @arcount)
454
+ end
455
+
456
+ def ==(other)
457
+ return @qr == other.qr &&
458
+ @opcode == other.opcode &&
459
+ @aa == other.aa &&
460
+ @tc == other.tc &&
461
+ @rd == other.rd &&
462
+ @ra == other.ra &&
463
+ @cd == other.cd &&
464
+ @ad == other.ad &&
465
+ @rcode == other.rcode
466
+ end
467
+
468
+ def to_s
469
+ retval = ";; id = #{@id}\n";
470
+
471
+ if (@opcode == OpCode::Update)
472
+ retval += ";; qr = #{@qr} " +\
473
+ "opcode = #{@opcode.string} "+\
474
+ "rcode = #{@rcode.string}\n";
475
+
476
+ retval += ";; zocount = #{@qdcount} "+\
477
+ "prcount = #{@ancount} " +\
478
+ "upcount = #{@nscount} " +\
479
+ "adcount = #{@arcount}\n";
480
+ else
481
+ retval += ";; qr = #{@qr} " +\
482
+ "opcode = #{@opcode.string} " +\
483
+ "aa = #{@aa} " +\
484
+ "tc = #{@tc} " +\
485
+ "rd = #{@rd}\n";
486
+
487
+ retval += ";; ra = #{@ra} " +\
488
+ "ad = #{@ad} " +\
489
+ "cd = #{@cd} " +\
490
+ "rcode = #{@rcode.string}\n";
491
+
492
+ retval += ";; qdcount = #{@qdcount} " +\
493
+ "ancount = #{@ancount} " +\
494
+ "nscount = #{@nscount} " +\
495
+ "arcount = #{@arcount}\n";
496
+ end
497
+
498
+ return retval;
499
+ end
500
+
501
+ def decode(msg)
502
+ @id, flag, @qdcount, @ancount, @nscount, @arcount =
503
+ msg.get_unpack('nnnnnn')
504
+ @qr = (((flag >> 15)&1)==1)?true:false
505
+ @opcode = OpCode.new((flag >> 11) & 15)
506
+ @aa = (((flag >> 10)&1)==1)?true:false
507
+ @tc = (((flag >> 9)&1)==1)?true:false
508
+ @rd = (((flag >> 8)&1)==1)?true:false
509
+ @ra = (((flag >> 7)&1)==1)?true:false
510
+ @ad = (((flag >> 5)&1)==1)?true:false
511
+ @cd = (((flag >> 4)&1)==1)?true:false
512
+ @rcode = RCode.new(flag & 15)
513
+ end
514
+
515
+ def rcode=(newcode)
516
+ @rcode = RCode.new(newcode)
517
+ end
518
+
519
+ def opcode=(newcode)
520
+ @opcode = OpCode.new(newcode)
521
+ end
522
+
523
+ def getException
524
+ exception = nil
525
+ if (@rcode==RCode.NXDOMAIN)
526
+ exception = NXDomain.new
527
+ elsif (@rcode==RCode.SERVFAIL)
528
+ exception = ServFail.new
529
+ elsif (@rcode==RCode.FORMERR)
530
+ exception = FormErr.new
531
+ elsif (@rcode==RCode.NOTIMP)
532
+ exception = NotImp.new
533
+ elsif (@rcode==RCode.REFUSED)
534
+ exception = Refused.new
535
+ end
536
+ return exception
537
+ end
538
+
539
+ alias zocount qdcount
540
+ alias zocount= qdcount=
541
+
542
+ alias prcount ancount
543
+ alias prcount= ancount=
544
+
545
+ alias upcount nscount
546
+ alias upcount= nscount=
547
+
548
+ alias adcount arcount
549
+ alias adcount= arcount=
550
+
551
+ end
552
+
553
+ class MessageDecoder #:nodoc: all
554
+ def initialize(data)
555
+ @data = data
556
+ @index = 0
557
+ @limit = data.length
558
+ yield self
559
+ end
560
+
561
+ def has_remaining
562
+ return @limit-@index > 0
563
+ end
564
+
565
+ def get_length16
566
+ len, = self.get_unpack('n')
567
+ save_limit = @limit
568
+ @limit = @index + len
569
+ d = yield(len)
570
+ if @index < @limit
571
+ raise DecodeError.new("junk exists")
572
+ elsif @limit < @index
573
+ raise DecodeError.new("limit exceeded")
574
+ end
575
+ @limit = save_limit
576
+ return d
577
+ end
578
+
579
+ def get_bytes(len = @limit - @index)
580
+ d = @data[@index, len]
581
+ @index += len
582
+ return d
583
+ end
584
+
585
+ def get_unpack(template)
586
+ len = 0
587
+ template.each_byte {|byte|
588
+ case byte
589
+ when ?c, ?C
590
+ len += 1
591
+ when ?h, ?H
592
+ len += 1
593
+ when ?n
594
+ len += 2
595
+ when ?N
596
+ len += 4
597
+ when ?*
598
+ len = @limit-@index
599
+ else
600
+ raise StandardError.new("unsupported template: '#{byte.chr}' in '#{template}'")
601
+ end
602
+ }
603
+ raise DecodeError.new("limit exceeded") if @limit < @index + len
604
+ arr = @data.unpack("@#{@index}#{template}")
605
+ @index += len
606
+ return arr
607
+ end
608
+
609
+ def get_string
610
+ len = @data[@index]
611
+ raise DecodeError.new("limit exceeded") if @limit < @index + 1 + len
612
+ d = @data[@index + 1, len]
613
+ @index += 1 + len
614
+ return d
615
+ end
616
+
617
+ def get_string_list
618
+ strings = []
619
+ while @index < @limit
620
+ strings << self.get_string
621
+ end
622
+ strings
623
+ end
624
+
625
+ def get_name
626
+ return Name.new(self.get_labels)
627
+ end
628
+
629
+ def get_labels(limit=nil)
630
+ limit = @index if !limit || @index < limit
631
+ d = []
632
+ while true
633
+ case @data[@index]
634
+ when 0
635
+ @index += 1
636
+ return d
637
+ when 192..255
638
+ idx = self.get_unpack('n')[0] & 0x3fff
639
+ if limit <= idx
640
+ raise DecodeError.new("non-backward name pointer")
641
+ end
642
+ save_index = @index
643
+ @index = idx
644
+ d += self.get_labels(limit)
645
+ @index = save_index
646
+ return d
647
+ else
648
+ d << self.get_label
649
+ end
650
+ end
651
+ return d
652
+ end
653
+
654
+ def get_label
655
+ return Name::Label.new(Name::decode(self.get_string))
656
+ end
657
+
658
+ def get_question
659
+ name = self.get_name
660
+ type, klass = self.get_unpack("nn")
661
+ q = Question.new(name, type, klass)
662
+ return q
663
+ # return name, RR.get_class(type, klass)
664
+ end
665
+
666
+ def get_rr
667
+ name = self.get_name
668
+ type, klass, ttl = self.get_unpack('nnN')
669
+ typeclass = RR.get_class(type, klass)
670
+ # @TODO@ Trap decode errors here, and somehow mark the record as bad.
671
+ # Need some way to represent raw data only
672
+ rec = self.get_length16 {typeclass.decode_rdata(self)}
673
+ rec.name=name
674
+ rec.ttl=ttl
675
+ rec.type = type
676
+ rec.klass = klass
677
+ return rec
678
+ end
679
+ end
680
+ class DecodeError < StandardError
681
+ end
682
+
683
+ class MessageEncoder #:nodoc: all
684
+ def initialize
685
+ @data = ''
686
+ @names = {}
687
+ yield self
688
+ end
689
+
690
+ def to_s
691
+ return @data
692
+ end
693
+
694
+ def put_bytes(d)
695
+ @data << d
696
+ end
697
+
698
+ def put_pack(template, *d)
699
+ @data << d.pack(template)
700
+ end
701
+
702
+ def put_length16
703
+ length_index = @data.length
704
+ @data << "\0\0"
705
+ data_start = @data.length
706
+ yield
707
+ data_end = @data.length
708
+ @data[length_index, 2] = [data_end - data_start].pack("n")
709
+ end
710
+
711
+ def put_string(d)
712
+ self.put_pack("C", d.length)
713
+ @data << d
714
+ end
715
+
716
+ def put_string_list(ds)
717
+ ds.each {|d|
718
+ self.put_string(d)
719
+ }
720
+ end
721
+
722
+ def put_name(d, canonical=false)
723
+ put_labels(d.to_a, canonical)
724
+ end
725
+
726
+ def put_name_canonical(d)
727
+ put_name(d, true)
728
+ end
729
+
730
+ def put_labels(d, do_canonical)
731
+ d.each_index {|i|
732
+ domain = d[i..-1].join(".")
733
+ if (!do_canonical && (idx = @names[domain]))
734
+ self.put_pack("n", 0xc000 | idx)
735
+ return
736
+ else
737
+ @names[domain] = @data.length
738
+ first = d[i]
739
+ self.put_label(first)
740
+ end
741
+ }
742
+ @data << "\0"
743
+ end
744
+
745
+
746
+ def put_label(d)
747
+ s, = Name.encode(d)
748
+ raise RuntimeError, "length of #{s} is #{s.string.length} (larger than 63 octets)" if s.string.length > 63 # @todo@ Error type
749
+ self.put_string(s.string)
750
+ end
751
+ end
752
+
753
+ class EncodeError < StandardError
754
+ end
755
+
756
+ #A Net::DNS::Question object represents a record in the
757
+ #question section of a DNS packet.
758
+ #
759
+ #RFC 1035 Section 4.1.2
760
+ class Question
761
+ # The Question name
762
+ attr_reader :qname
763
+ # The Question type
764
+ attr_reader :qtype
765
+ # The Question class
766
+ attr_reader :qclass
767
+
768
+ #Creates a question object from the domain, type, and class passed
769
+ #as arguments.
770
+ #
771
+ #If a String is passed in, a Name, IPv4 or IPv6 object is created.
772
+ #
773
+ #If an IPv4 or IPv6 object is used then the type is set to PTR.
774
+ def initialize(*args)
775
+ if (args.length > 0)
776
+ @qtype = Types.A
777
+ if (args.length > 1)
778
+ @qtype = Types.new(args[1])
779
+ @qclass = Classes.IN
780
+ if (args.length > 2)
781
+ @qclass = Classes.new(args[2])
782
+ end
783
+ end
784
+ else
785
+ raise ArgumentError.new("Must pass at least a name!")
786
+ end
787
+ # If the name looks like an IP address then do an appropriate
788
+ # PTR query.
789
+ @qname=args[0]
790
+ case @qname
791
+ when IPv4::Regex
792
+ @qname = IPv4.create(@qname).to_name
793
+ @qtype = Types.PTR
794
+ when IPv6::Regex
795
+ @qname = IPv6.create(@qname).to_name
796
+ @qtype = Types.PTR
797
+ when Name
798
+ when IPv6
799
+ @qtype = Types.PTR
800
+ when IPv4
801
+ @qtype = Types.PTR
802
+ else
803
+ @qname = Name.create(@qname)
804
+ end
805
+ end
806
+
807
+ #Returns a string representation of the question record.
808
+ def to_s
809
+ return "#{@qname}.\t#{@qclass.string}\t#{@qtype.string}";
810
+ end
811
+
812
+ # For Updates, the qname field is redefined to zname (RFC2136, section 2.3)
813
+ alias zname qname
814
+ # For Updates, the qtype field is redefined to ztype (RFC2136, section 2.3)
815
+ alias ztype qtype
816
+ # For Updates, the qclass field is redefined to zclass (RFC2136, section 2.3)
817
+ alias zclass qclass
818
+ end
819
+ end