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.
- data/README +34 -0
- data/doc/classes/Dnsruby/Classes.html +197 -0
- data/doc/classes/Dnsruby/Classes.src/M000157.html +23 -0
- data/doc/classes/Dnsruby/Classes.src/M000158.html +19 -0
- data/doc/classes/Dnsruby/CodeMapper.html +370 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000130.html +18 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000131.html +33 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000132.html +21 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000133.html +19 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000134.html +19 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000135.html +18 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000136.html +22 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000137.html +22 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000138.html +22 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000139.html +31 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000140.html +19 -0
- data/doc/classes/Dnsruby/Config.html +410 -0
- data/doc/classes/Dnsruby/Config.src/M000098.html +18 -0
- data/doc/classes/Dnsruby/Config.src/M000099.html +19 -0
- data/doc/classes/Dnsruby/Config.src/M000100.html +19 -0
- data/doc/classes/Dnsruby/Config.src/M000101.html +21 -0
- data/doc/classes/Dnsruby/Config.src/M000102.html +21 -0
- data/doc/classes/Dnsruby/Config.src/M000103.html +38 -0
- data/doc/classes/Dnsruby/Config.src/M000104.html +26 -0
- data/doc/classes/Dnsruby/Config.src/M000105.html +22 -0
- data/doc/classes/Dnsruby/Config.src/M000106.html +23 -0
- data/doc/classes/Dnsruby/Config.src/M000107.html +22 -0
- data/doc/classes/Dnsruby/Config.src/M000108.html +18 -0
- data/doc/classes/Dnsruby/DNS/DecodeError.html +111 -0
- data/doc/classes/Dnsruby/DNS/EncodeError.html +111 -0
- data/doc/classes/Dnsruby/DNS.html +469 -0
- data/doc/classes/Dnsruby/DNS.src/M000196.html +24 -0
- data/doc/classes/Dnsruby/DNS.src/M000197.html +18 -0
- data/doc/classes/Dnsruby/DNS.src/M000198.html +18 -0
- data/doc/classes/Dnsruby/DNS.src/M000199.html +20 -0
- data/doc/classes/Dnsruby/DNS.src/M000200.html +19 -0
- data/doc/classes/Dnsruby/DNS.src/M000201.html +20 -0
- data/doc/classes/Dnsruby/DNS.src/M000202.html +18 -0
- data/doc/classes/Dnsruby/DNS.src/M000203.html +19 -0
- data/doc/classes/Dnsruby/DNS.src/M000204.html +20 -0
- data/doc/classes/Dnsruby/DNS.src/M000205.html +28 -0
- data/doc/classes/Dnsruby/DNS.src/M000206.html +19 -0
- data/doc/classes/Dnsruby/DNS.src/M000207.html +20 -0
- data/doc/classes/Dnsruby/DNS.src/M000208.html +41 -0
- data/doc/classes/Dnsruby/DNS.src/M000209.html +32 -0
- data/doc/classes/Dnsruby/DNS.src/M000210.html +50 -0
- data/doc/classes/Dnsruby/DNSSEC/Algorithms.html +154 -0
- data/doc/classes/Dnsruby/DNSSEC.html +111 -0
- data/doc/classes/Dnsruby/DecodeError.html +111 -0
- data/doc/classes/Dnsruby/EncodeError.html +111 -0
- data/doc/classes/Dnsruby/FormErr.html +113 -0
- data/doc/classes/Dnsruby/Header.html +516 -0
- data/doc/classes/Dnsruby/Header.src/M000168.html +35 -0
- data/doc/classes/Dnsruby/Header.src/M000169.html +18 -0
- data/doc/classes/Dnsruby/Header.src/M000170.html +18 -0
- data/doc/classes/Dnsruby/Header.src/M000171.html +21 -0
- data/doc/classes/Dnsruby/Header.src/M000172.html +20 -0
- data/doc/classes/Dnsruby/Header.src/M000173.html +32 -0
- data/doc/classes/Dnsruby/Header.src/M000174.html +26 -0
- data/doc/classes/Dnsruby/Header.src/M000175.html +47 -0
- data/doc/classes/Dnsruby/Header.src/M000176.html +28 -0
- data/doc/classes/Dnsruby/Header.src/M000177.html +18 -0
- data/doc/classes/Dnsruby/Header.src/M000178.html +18 -0
- data/doc/classes/Dnsruby/Header.src/M000179.html +30 -0
- data/doc/classes/Dnsruby/Hosts.html +305 -0
- data/doc/classes/Dnsruby/Hosts.src/M000141.html +20 -0
- data/doc/classes/Dnsruby/Hosts.src/M000142.html +49 -0
- data/doc/classes/Dnsruby/Hosts.src/M000143.html +19 -0
- data/doc/classes/Dnsruby/Hosts.src/M000144.html +20 -0
- data/doc/classes/Dnsruby/Hosts.src/M000145.html +21 -0
- data/doc/classes/Dnsruby/Hosts.src/M000146.html +19 -0
- data/doc/classes/Dnsruby/Hosts.src/M000147.html +20 -0
- data/doc/classes/Dnsruby/Hosts.src/M000148.html +21 -0
- data/doc/classes/Dnsruby/IPv4.html +298 -0
- data/doc/classes/Dnsruby/IPv4.src/M000149.html +32 -0
- data/doc/classes/Dnsruby/IPv4.src/M000150.html +21 -0
- data/doc/classes/Dnsruby/IPv4.src/M000151.html +18 -0
- data/doc/classes/Dnsruby/IPv4.src/M000152.html +18 -0
- data/doc/classes/Dnsruby/IPv4.src/M000153.html +19 -0
- data/doc/classes/Dnsruby/IPv4.src/M000154.html +18 -0
- data/doc/classes/Dnsruby/IPv4.src/M000155.html +18 -0
- data/doc/classes/Dnsruby/IPv4.src/M000156.html +18 -0
- data/doc/classes/Dnsruby/IPv6.html +318 -0
- data/doc/classes/Dnsruby/IPv6.src/M000180.html +60 -0
- data/doc/classes/Dnsruby/IPv6.src/M000181.html +21 -0
- data/doc/classes/Dnsruby/IPv6.src/M000182.html +22 -0
- data/doc/classes/Dnsruby/IPv6.src/M000183.html +18 -0
- data/doc/classes/Dnsruby/IPv6.src/M000184.html +21 -0
- data/doc/classes/Dnsruby/IPv6.src/M000185.html +18 -0
- data/doc/classes/Dnsruby/IPv6.src/M000186.html +18 -0
- data/doc/classes/Dnsruby/IPv6.src/M000187.html +18 -0
- data/doc/classes/Dnsruby/Message.html +689 -0
- data/doc/classes/Dnsruby/Message.src/M000076.html +34 -0
- data/doc/classes/Dnsruby/Message.src/M000077.html +26 -0
- data/doc/classes/Dnsruby/Message.src/M000078.html +22 -0
- data/doc/classes/Dnsruby/Message.src/M000079.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000080.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000081.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000082.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000083.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000084.html +21 -0
- data/doc/classes/Dnsruby/Message.src/M000085.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000086.html +18 -0
- data/doc/classes/Dnsruby/Message.src/M000087.html +54 -0
- data/doc/classes/Dnsruby/Message.src/M000088.html +42 -0
- data/doc/classes/Dnsruby/Message.src/M000089.html +45 -0
- data/doc/classes/Dnsruby/MetaTypes.html +136 -0
- data/doc/classes/Dnsruby/Modes.html +171 -0
- data/doc/classes/Dnsruby/NXDomain.html +113 -0
- data/doc/classes/Dnsruby/Name/Label.html +300 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000067.html +21 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000068.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000069.html +22 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000070.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000071.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000072.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000073.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000074.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000075.html +18 -0
- data/doc/classes/Dnsruby/Name.html +357 -0
- data/doc/classes/Dnsruby/Name.src/M000057.html +28 -0
- data/doc/classes/Dnsruby/Name.src/M000058.html +20 -0
- data/doc/classes/Dnsruby/Name.src/M000059.html +18 -0
- data/doc/classes/Dnsruby/Name.src/M000060.html +18 -0
- data/doc/classes/Dnsruby/Name.src/M000061.html +21 -0
- data/doc/classes/Dnsruby/Name.src/M000062.html +19 -0
- data/doc/classes/Dnsruby/Name.src/M000064.html +22 -0
- data/doc/classes/Dnsruby/Name.src/M000065.html +18 -0
- data/doc/classes/Dnsruby/Name.src/M000066.html +20 -0
- data/doc/classes/Dnsruby/NotImp.html +113 -0
- data/doc/classes/Dnsruby/OpCode.html +146 -0
- data/doc/classes/Dnsruby/OtherResolvError.html +113 -0
- data/doc/classes/Dnsruby/QTypes.html +146 -0
- data/doc/classes/Dnsruby/Question.html +256 -0
- data/doc/classes/Dnsruby/Question.src/M000166.html +47 -0
- data/doc/classes/Dnsruby/Question.src/M000167.html +18 -0
- data/doc/classes/Dnsruby/RCode.html +211 -0
- data/doc/classes/Dnsruby/RR/ANY.html +133 -0
- data/doc/classes/Dnsruby/RR/CERT/CertificateTypes.html +169 -0
- data/doc/classes/Dnsruby/RR/CERT.html +180 -0
- data/doc/classes/Dnsruby/RR/CNAME.html +150 -0
- data/doc/classes/Dnsruby/RR/DNAME.html +150 -0
- data/doc/classes/Dnsruby/RR/DomainName.html +175 -0
- data/doc/classes/Dnsruby/RR/DomainName.src/M000051.html +22 -0
- data/doc/classes/Dnsruby/RR/Generic.html +156 -0
- data/doc/classes/Dnsruby/RR/Generic.src/M000041.html +25 -0
- data/doc/classes/Dnsruby/RR/HINFO.html +155 -0
- data/doc/classes/Dnsruby/RR/IN/A.html +199 -0
- data/doc/classes/Dnsruby/RR/IN/A.src/M000018.html +18 -0
- data/doc/classes/Dnsruby/RR/IN/A.src/M000019.html +18 -0
- data/doc/classes/Dnsruby/RR/IN/A.src/M000020.html +18 -0
- data/doc/classes/Dnsruby/RR/IN/AAAA.html +138 -0
- data/doc/classes/Dnsruby/RR/IN/AFSDB.html +145 -0
- data/doc/classes/Dnsruby/RR/IN/PX.html +143 -0
- data/doc/classes/Dnsruby/RR/IN/SRV.html +243 -0
- data/doc/classes/Dnsruby/RR/IN/SRV.src/M000015.html +29 -0
- data/doc/classes/Dnsruby/RR/IN/SRV.src/M000016.html +26 -0
- data/doc/classes/Dnsruby/RR/IN/SRV.src/M000017.html +22 -0
- data/doc/classes/Dnsruby/RR/IN/WKS.html +166 -0
- data/doc/classes/Dnsruby/RR/IN/WKS.src/M000021.html +20 -0
- data/doc/classes/Dnsruby/RR/IN.html +155 -0
- data/doc/classes/Dnsruby/RR/ISDN.html +155 -0
- data/doc/classes/Dnsruby/RR/LOC.html +395 -0
- data/doc/classes/Dnsruby/RR/LOC.src/M000025.html +32 -0
- data/doc/classes/Dnsruby/RR/LOC.src/M000026.html +23 -0
- data/doc/classes/Dnsruby/RR/LOC.src/M000027.html +25 -0
- data/doc/classes/Dnsruby/RR/LOC.src/M000028.html +21 -0
- data/doc/classes/Dnsruby/RR/LOC.src/M000029.html +20 -0
- data/doc/classes/Dnsruby/RR/LOC.src/M000030.html +23 -0
- data/doc/classes/Dnsruby/RR/MB.html +150 -0
- data/doc/classes/Dnsruby/RR/MG.html +150 -0
- data/doc/classes/Dnsruby/RR/MINFO.html +156 -0
- data/doc/classes/Dnsruby/RR/MR.html +150 -0
- data/doc/classes/Dnsruby/RR/MX.html +155 -0
- data/doc/classes/Dnsruby/RR/NAPTR.html +190 -0
- data/doc/classes/Dnsruby/RR/NS.html +150 -0
- data/doc/classes/Dnsruby/RR/NSAP.html +293 -0
- data/doc/classes/Dnsruby/RR/NSAP.src/M000053.html +19 -0
- data/doc/classes/Dnsruby/RR/NSAP.src/M000054.html +19 -0
- data/doc/classes/Dnsruby/RR/NSAP.src/M000055.html +22 -0
- data/doc/classes/Dnsruby/RR/NSAP.src/M000056.html +31 -0
- data/doc/classes/Dnsruby/RR/PTR.html +132 -0
- data/doc/classes/Dnsruby/RR/RP.html +183 -0
- data/doc/classes/Dnsruby/RR/RP.src/M000050.html +19 -0
- data/doc/classes/Dnsruby/RR/RT.html +155 -0
- data/doc/classes/Dnsruby/RR/SOA.html +230 -0
- data/doc/classes/Dnsruby/RR/SOA.src/M000039.html +24 -0
- data/doc/classes/Dnsruby/RR/SOA.src/M000040.html +27 -0
- data/doc/classes/Dnsruby/RR/SPF.html +138 -0
- data/doc/classes/Dnsruby/RR/TKEY.html +285 -0
- data/doc/classes/Dnsruby/RR/TKEY.src/M000022.html +19 -0
- data/doc/classes/Dnsruby/RR/TKEY.src/M000023.html +29 -0
- data/doc/classes/Dnsruby/RR/TKEY.src/M000024.html +30 -0
- data/doc/classes/Dnsruby/RR/TSIG.html +416 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000042.html +22 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000043.html +71 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000044.html +34 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000045.html +37 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000046.html +31 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000047.html +34 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000048.html +22 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000049.html +29 -0
- data/doc/classes/Dnsruby/RR/TXT.html +233 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000034.html +18 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000035.html +18 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000036.html +20 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000037.html +27 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000038.html +25 -0
- data/doc/classes/Dnsruby/RR/X25.html +203 -0
- data/doc/classes/Dnsruby/RR/X25.src/M000031.html +18 -0
- data/doc/classes/Dnsruby/RR/X25.src/M000032.html +18 -0
- data/doc/classes/Dnsruby/RR/X25.src/M000033.html +22 -0
- data/doc/classes/Dnsruby/RR.html +620 -0
- data/doc/classes/Dnsruby/RR.src/M000001.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000002.html +22 -0
- data/doc/classes/Dnsruby/RR.src/M000003.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000004.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000005.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000006.html +36 -0
- data/doc/classes/Dnsruby/RR.src/M000007.html +100 -0
- data/doc/classes/Dnsruby/RR.src/M000008.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000009.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000010.html +22 -0
- data/doc/classes/Dnsruby/RR.src/M000011.html +22 -0
- data/doc/classes/Dnsruby/RR.src/M000012.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000013.html +22 -0
- data/doc/classes/Dnsruby/RR.src/M000014.html +24 -0
- data/doc/classes/Dnsruby/RRSet.html +257 -0
- data/doc/classes/Dnsruby/RRSet.src/M000159.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000160.html +44 -0
- data/doc/classes/Dnsruby/RRSet.src/M000161.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000162.html +20 -0
- data/doc/classes/Dnsruby/RRSet.src/M000163.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000164.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000165.html +18 -0
- data/doc/classes/Dnsruby/Refused.html +113 -0
- data/doc/classes/Dnsruby/Resolv.html +400 -0
- data/doc/classes/Dnsruby/Resolv.src/M000109.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000110.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000111.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000112.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000113.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000114.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000115.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000116.html +19 -0
- data/doc/classes/Dnsruby/Resolv.src/M000117.html +20 -0
- data/doc/classes/Dnsruby/Resolv.src/M000118.html +29 -0
- data/doc/classes/Dnsruby/Resolv.src/M000119.html +19 -0
- data/doc/classes/Dnsruby/Resolv.src/M000120.html +20 -0
- data/doc/classes/Dnsruby/Resolv.src/M000121.html +25 -0
- data/doc/classes/Dnsruby/ResolvError.html +111 -0
- data/doc/classes/Dnsruby/ResolvTimeout.html +111 -0
- data/doc/classes/Dnsruby/Resolver.html +807 -0
- data/doc/classes/Dnsruby/Resolver.src/M000211.html +21 -0
- data/doc/classes/Dnsruby/Resolver.src/M000212.html +37 -0
- data/doc/classes/Dnsruby/Resolver.src/M000213.html +64 -0
- data/doc/classes/Dnsruby/Resolver.src/M000214.html +23 -0
- data/doc/classes/Dnsruby/Resolver.src/M000215.html +46 -0
- data/doc/classes/Dnsruby/Resolver.src/M000216.html +21 -0
- data/doc/classes/Dnsruby/Resolver.src/M000217.html +22 -0
- data/doc/classes/Dnsruby/Resolver.src/M000218.html +18 -0
- data/doc/classes/Dnsruby/Resolver.src/M000219.html +20 -0
- data/doc/classes/Dnsruby/Resolver.src/M000220.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000221.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000222.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000223.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000224.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000225.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000226.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000227.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000228.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000229.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000230.html +19 -0
- data/doc/classes/Dnsruby/ServFail.html +113 -0
- data/doc/classes/Dnsruby/SingleResolver.html +496 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000122.html +18 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000123.html +19 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000124.html +49 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000125.html +18 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000126.html +21 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000127.html +25 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000128.html +78 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000129.html +21 -0
- data/doc/classes/Dnsruby/TheLog.html +196 -0
- data/doc/classes/Dnsruby/TheLog.src/M000188.html +20 -0
- data/doc/classes/Dnsruby/TheLog.src/M000189.html +20 -0
- data/doc/classes/Dnsruby/TheLog.src/M000190.html +20 -0
- data/doc/classes/Dnsruby/Types.html +426 -0
- data/doc/classes/Dnsruby/Update.html +368 -0
- data/doc/classes/Dnsruby/Update.src/M000191.html +32 -0
- data/doc/classes/Dnsruby/Update.src/M000192.html +37 -0
- data/doc/classes/Dnsruby/Update.src/M000193.html +32 -0
- data/doc/classes/Dnsruby/Update.src/M000194.html +41 -0
- data/doc/classes/Dnsruby/Update.src/M000195.html +34 -0
- data/doc/classes/Dnsruby/ZoneTransfer/Delta.html +183 -0
- data/doc/classes/Dnsruby/ZoneTransfer/Delta.src/M000097.html +19 -0
- data/doc/classes/Dnsruby/ZoneTransfer.html +248 -0
- data/doc/classes/Dnsruby/ZoneTransfer.src/M000095.html +22 -0
- data/doc/classes/Dnsruby/ZoneTransfer.src/M000096.html +35 -0
- data/doc/classes/Dnsruby.html +388 -0
- data/doc/created.rid +1 -0
- data/doc/files/lib/Dnsruby/Config_rb.html +101 -0
- data/doc/files/lib/Dnsruby/DNSSEC_rb.html +101 -0
- data/doc/files/lib/Dnsruby/DNS_rb.html +110 -0
- data/doc/files/lib/Dnsruby/Hosts_rb.html +108 -0
- data/doc/files/lib/Dnsruby/Resolver_rb.html +108 -0
- data/doc/files/lib/Dnsruby/SingleResolver_rb.html +108 -0
- data/doc/files/lib/Dnsruby/TheLog_rb.html +110 -0
- data/doc/files/lib/Dnsruby/code_mapper_rb.html +101 -0
- data/doc/files/lib/Dnsruby/ipv4_rb.html +101 -0
- data/doc/files/lib/Dnsruby/ipv6_rb.html +101 -0
- data/doc/files/lib/Dnsruby/message_rb.html +109 -0
- data/doc/files/lib/Dnsruby/name_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/AAAA_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/AFSDB_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/A_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/CERT_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/HINFO_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/IN_rb.html +112 -0
- data/doc/files/lib/Dnsruby/resource/ISDN_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/LOC_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/MINFO_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/MX_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/NAPTR_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/NSAP_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/OPT_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/PX_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/RP_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/RT_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/SOA_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/SPF_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/SRV_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/TKEY_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/TSIG_rb.html +110 -0
- data/doc/files/lib/Dnsruby/resource/TXT_rb.html +108 -0
- data/doc/files/lib/Dnsruby/resource/X25_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/domain_name_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/generic_rb.html +125 -0
- data/doc/files/lib/Dnsruby/resource/resource_rb.html +110 -0
- data/doc/files/lib/Dnsruby/select_thread_rb.html +111 -0
- data/doc/files/lib/Dnsruby/update_rb.html +101 -0
- data/doc/files/lib/Dnsruby/zone_transfer_rb.html +101 -0
- data/doc/files/lib/dnsruby_rb.html +118 -0
- data/doc/fr_class_index.html +102 -0
- data/doc/fr_file_index.html +68 -0
- data/doc/fr_method_index.html +256 -0
- data/doc/index.html +24 -0
- data/lib/Dnsruby/Config.rb +350 -0
- data/lib/Dnsruby/DNS.rb +253 -0
- data/lib/Dnsruby/DNSSEC.rb +29 -0
- data/lib/Dnsruby/Hosts.rb +119 -0
- data/lib/Dnsruby/Resolver.rb +618 -0
- data/lib/Dnsruby/SingleResolver.rb +312 -0
- data/lib/Dnsruby/TheLog.rb +61 -0
- data/lib/Dnsruby/code_mapper.rb +164 -0
- data/lib/Dnsruby/ipv4.rb +83 -0
- data/lib/Dnsruby/ipv6.rb +142 -0
- data/lib/Dnsruby/message.rb +819 -0
- data/lib/Dnsruby/name.rb +325 -0
- data/lib/Dnsruby/resource/A.rb +56 -0
- data/lib/Dnsruby/resource/AAAA.rb +54 -0
- data/lib/Dnsruby/resource/AFSDB.rb +68 -0
- data/lib/Dnsruby/resource/CERT.rb +89 -0
- data/lib/Dnsruby/resource/HINFO.rb +52 -0
- data/lib/Dnsruby/resource/IN.rb +69 -0
- data/lib/Dnsruby/resource/ISDN.rb +54 -0
- data/lib/Dnsruby/resource/LOC.rb +255 -0
- data/lib/Dnsruby/resource/MINFO.rb +66 -0
- data/lib/Dnsruby/resource/MX.rb +66 -0
- data/lib/Dnsruby/resource/NAPTR.rb +90 -0
- data/lib/Dnsruby/resource/NSAP.rb +172 -0
- data/lib/Dnsruby/resource/OPT.rb +153 -0
- data/lib/Dnsruby/resource/PX.rb +71 -0
- data/lib/Dnsruby/resource/RP.rb +67 -0
- data/lib/Dnsruby/resource/RT.rb +67 -0
- data/lib/Dnsruby/resource/SOA.rb +89 -0
- data/lib/Dnsruby/resource/SPF.rb +29 -0
- data/lib/Dnsruby/resource/SRV.rb +108 -0
- data/lib/Dnsruby/resource/TKEY.rb +160 -0
- data/lib/Dnsruby/resource/TSIG.rb +328 -0
- data/lib/Dnsruby/resource/TXT.rb +76 -0
- data/lib/Dnsruby/resource/X25.rb +53 -0
- data/lib/Dnsruby/resource/domain_name.rb +58 -0
- data/lib/Dnsruby/resource/generic.rb +142 -0
- data/lib/Dnsruby/resource/resource.rb +444 -0
- data/lib/Dnsruby/select_thread.rb +474 -0
- data/lib/Dnsruby/update.rb +263 -0
- data/lib/Dnsruby/zone_transfer.rb +296 -0
- data/lib/dnsruby.rb +468 -0
- data/test/custom.txt +4 -0
- data/test/resolv.conf +4 -0
- data/test/tc_axfr.rb +42 -0
- data/test/tc_dns.rb +231 -0
- data/test/tc_dnsruby.rb +42 -0
- data/test/tc_escapedchars.rb +510 -0
- data/test/tc_header.rb +104 -0
- data/test/tc_misc.rb +139 -0
- data/test/tc_name.rb +53 -0
- data/test/tc_packet.rb +158 -0
- data/test/tc_packet_unique_push.rb +102 -0
- data/test/tc_question.rb +52 -0
- data/test/tc_res_config.rb +92 -0
- data/test/tc_res_env.rb +62 -0
- data/test/tc_res_file.rb +42 -0
- data/test/tc_res_opt.rb +185 -0
- data/test/tc_resolver.rb +177 -0
- data/test/tc_rr-opt.rb +42 -0
- data/test/tc_rr-txt.rb +137 -0
- data/test/tc_rr-unknown.rb +99 -0
- data/test/tc_rr.rb +259 -0
- data/test/tc_single_resolver.rb +153 -0
- data/test/tc_soak.rb +310 -0
- data/test/tc_tcp.rb +35 -0
- data/test/tc_tkey.rb +106 -0
- data/test/tc_update.rb +215 -0
- data/test/ts_dnsruby.rb +17 -0
- data/test/ts_offline.rb +35 -0
- data/test/ts_online.rb +40 -0
- 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
|