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,263 @@
|
|
|
1
|
+
#--
|
|
2
|
+
#Copyright 2007 Nominet UK
|
|
3
|
+
#
|
|
4
|
+
#Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
#you may not use this file except in compliance with the License.
|
|
6
|
+
#You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
#Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
#distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
#See the License for the specific language governing permissions and
|
|
14
|
+
#limitations under the License.
|
|
15
|
+
#++
|
|
16
|
+
module Dnsruby
|
|
17
|
+
#Dnsruby::Update is a subclass of Dnsruby::Packet,
|
|
18
|
+
#to be used for making DNS dynamic updates. Programmers
|
|
19
|
+
#should refer to RFC 2136 for the semantics of dynamic updates.
|
|
20
|
+
|
|
21
|
+
#The first example below shows a complete program; subsequent examples
|
|
22
|
+
#show only the creation of the update packet.
|
|
23
|
+
#
|
|
24
|
+
#== Add a new host
|
|
25
|
+
#
|
|
26
|
+
# require 'Dnsruby'
|
|
27
|
+
#
|
|
28
|
+
# # Create the update packet.
|
|
29
|
+
# update = Dnsruby::Update.new('example.com')
|
|
30
|
+
#
|
|
31
|
+
# # Prerequisite is that no A records exist for the name.
|
|
32
|
+
# update.absent('foo.example.com. A')
|
|
33
|
+
#
|
|
34
|
+
# # Add two A records for the name.
|
|
35
|
+
# update.add('foo.example.com.', 'A', 86400, '192.168.1.2')
|
|
36
|
+
# update.add('foo.example.com.', 'A', 86400, '172.16.3.4')
|
|
37
|
+
#
|
|
38
|
+
# # Send the update to the zone's primary master.
|
|
39
|
+
# res = Dnsruby::Resolver.new({:nameserver => 'primary-master.example.com'})
|
|
40
|
+
#
|
|
41
|
+
# begin
|
|
42
|
+
# reply = res.send_message(update)
|
|
43
|
+
# print "Update succeeded\n"
|
|
44
|
+
# rescue Exception => e
|
|
45
|
+
# print 'Update failed: #{e}\n'
|
|
46
|
+
# end
|
|
47
|
+
#
|
|
48
|
+
#== Add an MX record for a name that already exists
|
|
49
|
+
#
|
|
50
|
+
# update = Dnsruby::Update.new('example.com')
|
|
51
|
+
# update.present('example.com')
|
|
52
|
+
# update.add('example.com', Dnsruby::Types.MX, 10, 'mailhost.example.com')
|
|
53
|
+
#
|
|
54
|
+
#== Add a TXT record for a name that doesn't exist
|
|
55
|
+
#
|
|
56
|
+
# update = Dnsruby::Update.new('example.com')
|
|
57
|
+
# update.absent('info.example.com')
|
|
58
|
+
# update.add('info.example.com', Types.TXT, 86400, "yabba dabba doo"')
|
|
59
|
+
#
|
|
60
|
+
#== Delete all A records for a name
|
|
61
|
+
#
|
|
62
|
+
# update = Dnsruby::Update.new('example.com')
|
|
63
|
+
# update.present('foo.example.com A')
|
|
64
|
+
# update.delete('foo.example.com', 'A')
|
|
65
|
+
#
|
|
66
|
+
#== Delete all RRs for a name
|
|
67
|
+
#
|
|
68
|
+
# update = Dnsruby::Update.new('example.com')
|
|
69
|
+
# update.present('byebye.example.com')
|
|
70
|
+
# update.delete('byebye.example.com')
|
|
71
|
+
#
|
|
72
|
+
#== Perform a signed update
|
|
73
|
+
#
|
|
74
|
+
# key_name = 'tsig-key'
|
|
75
|
+
# key = 'awwLOtRfpGE+rRKF2+DEiw=='
|
|
76
|
+
#
|
|
77
|
+
# update = Dnsruby::Update.new('example.com')
|
|
78
|
+
# update.add('foo.example.com', 'A', 86400, 10.1.2.3'))
|
|
79
|
+
# update.add('bar.example.com', 'A', 86400, 10.4.5.6'))
|
|
80
|
+
# res.tsig_key=key
|
|
81
|
+
#
|
|
82
|
+
class Update < Message
|
|
83
|
+
#Returns a Dnsruby::Update object suitable for performing a DNS
|
|
84
|
+
#dynamic update. Specifically, it creates a message with the header
|
|
85
|
+
#opcode set to UPDATE and the zone record type to SOA (per RFC 2136,
|
|
86
|
+
#Section 2.3).
|
|
87
|
+
#
|
|
88
|
+
#Programs must use the push method to add RRs to the prerequisite,
|
|
89
|
+
#update, and additional sections before performing the update.
|
|
90
|
+
#
|
|
91
|
+
#Arguments are the zone name and the class. If the zone is omitted,
|
|
92
|
+
#the default domain will be taken from the resolver configuration.
|
|
93
|
+
#If the class is omitted, it defaults to IN.
|
|
94
|
+
# packet = Dnsruby::Update.new
|
|
95
|
+
# packet = Dnsruby::Update.new('example.com')
|
|
96
|
+
# packet = Dnsruby::Update.new('example.com', 'HS')
|
|
97
|
+
#
|
|
98
|
+
def initialize(zone=nil, klass=nil)
|
|
99
|
+
|
|
100
|
+
# sort out the zone section (RFC2136, section 2.3)
|
|
101
|
+
if (zone==nil)
|
|
102
|
+
config = Config.new
|
|
103
|
+
zone = (config.search)[0]
|
|
104
|
+
return unless zone
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
type = 'SOA'
|
|
108
|
+
klass ||= 'IN'
|
|
109
|
+
|
|
110
|
+
super(zone, type, klass) || return
|
|
111
|
+
|
|
112
|
+
@header.opcode=('UPDATE')
|
|
113
|
+
@header.rd=(0)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
#Ways to create the prerequisite records (exists, notexists, inuse, etc. - RFC2136, section 2.4)
|
|
117
|
+
#
|
|
118
|
+
# (1) RRset exists (value independent). At least one RR with a
|
|
119
|
+
# specified NAME and TYPE (in the zone and class specified by
|
|
120
|
+
# the Zone Section) must exist.
|
|
121
|
+
#
|
|
122
|
+
# update.present(name, type)
|
|
123
|
+
#
|
|
124
|
+
# (2) RRset exists (value dependent). A set of RRs with a
|
|
125
|
+
# specified NAME and TYPE exists and has the same members
|
|
126
|
+
# with the same RDATAs as the RRset specified here in this
|
|
127
|
+
# Section.
|
|
128
|
+
#
|
|
129
|
+
# update.present(name, type, rdata)
|
|
130
|
+
#
|
|
131
|
+
# (4) Name is in use. At least one RR with a specified NAME (in
|
|
132
|
+
# the zone and class specified by the Zone Section) must exist.
|
|
133
|
+
# Note that this prerequisite is NOT satisfied by empty
|
|
134
|
+
# nonterminals.
|
|
135
|
+
#
|
|
136
|
+
# update.present(name)
|
|
137
|
+
def present(*args)
|
|
138
|
+
ttl = 0
|
|
139
|
+
rdata = []
|
|
140
|
+
klass = Classes.ANY
|
|
141
|
+
if (args.length>=1) # domain (RFC2136, Section 2.4.4)
|
|
142
|
+
# @TODO@ Could also be an actual RR object?
|
|
143
|
+
name = args[0]
|
|
144
|
+
type = Types.ANY
|
|
145
|
+
if (args.length>=2) # RRSET (RFC2136, Section 2.4.1)
|
|
146
|
+
type = args[1]
|
|
147
|
+
end
|
|
148
|
+
if (args.length > 2) # RRSET (RFC2136, Section 2.4.2)
|
|
149
|
+
klass = zone()[0].zclass
|
|
150
|
+
rdata=args[2]
|
|
151
|
+
end
|
|
152
|
+
rec = RR.create("#{name} #{ttl} #{klass} #{type} #{rdata}")
|
|
153
|
+
add_pre(rec)
|
|
154
|
+
return rec
|
|
155
|
+
else
|
|
156
|
+
raise ArgumentError.new("Wrong number of arguments (#{args.length} for 1 or 2) for Update#absent")
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
#Ways to create the prerequisite records (exists, notexists, inuse, etc. - RFC2136, section 2.4)
|
|
161
|
+
#Can be called with one arg :
|
|
162
|
+
#
|
|
163
|
+
# update.absent(name)
|
|
164
|
+
# (5) Name is not in use. No RR of any type is owned by a
|
|
165
|
+
# specified NAME. Note that this prerequisite IS satisfied by
|
|
166
|
+
# empty nonterminals.
|
|
167
|
+
#
|
|
168
|
+
#Or with two :
|
|
169
|
+
#
|
|
170
|
+
# update.absent(name, type)
|
|
171
|
+
# (3) RRset does not exist. No RRs with a specified NAME and TYPE
|
|
172
|
+
# (in the zone and class denoted by the Zone Section) can exist.
|
|
173
|
+
#
|
|
174
|
+
def absent(*args)
|
|
175
|
+
ttl = 0
|
|
176
|
+
rdata = []
|
|
177
|
+
klass = Classes.NONE
|
|
178
|
+
if (args.length>=1) # domain (RFC2136, Section 2.4.5)
|
|
179
|
+
name = args[0]
|
|
180
|
+
type = Types.ANY
|
|
181
|
+
if (args.length==2) # RRSET (RFC2136, Section 2.4.3)
|
|
182
|
+
type = args[1]
|
|
183
|
+
end
|
|
184
|
+
rec = RR.create("#{name} #{ttl} #{klass} #{type} #{rdata}")
|
|
185
|
+
add_pre(rec)
|
|
186
|
+
return rec
|
|
187
|
+
else
|
|
188
|
+
raise ArgumentError.new("Wrong number of arguments (#{args.length} for 1 or 2) for Update#absent")
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
#Ways to create the update records (add, delete, RFC2136, section 2.5)
|
|
193
|
+
# " 2.5.1 - Add To An RRset
|
|
194
|
+
#
|
|
195
|
+
# RRs are added to the Update Section whose NAME, TYPE, TTL, RDLENGTH
|
|
196
|
+
# and RDATA are those being added, and CLASS is the same as the zone
|
|
197
|
+
# class. Any duplicate RRs will be silently ignored by the primary
|
|
198
|
+
# master."
|
|
199
|
+
#
|
|
200
|
+
# update.add(rr)
|
|
201
|
+
# update.add([rr1, rr2])
|
|
202
|
+
# update.add(name, type, ttl, rdata)
|
|
203
|
+
#
|
|
204
|
+
def add(*args)
|
|
205
|
+
zoneclass=zone()[0].zclass
|
|
206
|
+
case args[0]
|
|
207
|
+
when Array
|
|
208
|
+
args[0].each do |resource|
|
|
209
|
+
add(resource)
|
|
210
|
+
end
|
|
211
|
+
when RR
|
|
212
|
+
# Make sure that the Class is the same as the zone
|
|
213
|
+
resource = args[0]
|
|
214
|
+
if (resource.klass != zoneclass)
|
|
215
|
+
raise ArgumentError.new("Wrong class #{resource.klass} for update (should be #{zoneclass})!")
|
|
216
|
+
end
|
|
217
|
+
add_update(resource)
|
|
218
|
+
return resource
|
|
219
|
+
else
|
|
220
|
+
name=args[0]
|
|
221
|
+
type=args[1]
|
|
222
|
+
ttl=args[2]
|
|
223
|
+
rdata=args[3]
|
|
224
|
+
resource = RR.create("#{name} #{ttl} #{zoneclass} #{type} #{rdata}")
|
|
225
|
+
add_update(resource)
|
|
226
|
+
return resource
|
|
227
|
+
end
|
|
228
|
+
# @TODO@ Should be able to take RRSet!
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
#Ways to create the update records (add, delete, RFC2136, section 2.5)
|
|
232
|
+
#
|
|
233
|
+
#2.5.2 - Delete An RRset
|
|
234
|
+
# update.delete(name, type)
|
|
235
|
+
#
|
|
236
|
+
#
|
|
237
|
+
#2.5.3 - Delete All RRsets From A Name
|
|
238
|
+
# update.delete(name)
|
|
239
|
+
#
|
|
240
|
+
#2.5.4 - Delete An RR From An RRset
|
|
241
|
+
# update.delete(name, type, rdata)
|
|
242
|
+
#
|
|
243
|
+
def delete(*args)
|
|
244
|
+
ttl = 0
|
|
245
|
+
klass = Classes.ANY
|
|
246
|
+
rdata=[]
|
|
247
|
+
resource = nil
|
|
248
|
+
case args.length
|
|
249
|
+
when 1 # name
|
|
250
|
+
resource = RR.create("#{args[0]} #{ttl} #{klass} #{Types.ANY} #{rdata}")
|
|
251
|
+
add_update(resource)
|
|
252
|
+
when 2 # name, type
|
|
253
|
+
resource = RR.create("#{args[0]} #{ttl} #{klass} #{args[1]} #{rdata}")
|
|
254
|
+
add_update(resource)
|
|
255
|
+
when 3 # name, type, rdata
|
|
256
|
+
klass = Classes.NONE
|
|
257
|
+
resource = RR.create("#{args[0]} #{ttl} #{klass} #{args[1]} #{args[2]}")
|
|
258
|
+
add_update(resource)
|
|
259
|
+
end
|
|
260
|
+
return resource
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
end
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
module Dnsruby
|
|
2
|
+
# This class performs zone transfers as per RFC1034 (AXFR) and RFC1995 (IXFR).
|
|
3
|
+
class ZoneTransfer
|
|
4
|
+
# The nameserver to use for the zone transfer - defaults to system config
|
|
5
|
+
attr_accessor :server
|
|
6
|
+
# What type of transfer to do (IXFR or AXFR) - defaults to AXFR
|
|
7
|
+
attr_accessor :transfer_type
|
|
8
|
+
# The class - defaults to IN
|
|
9
|
+
attr_accessor :klass
|
|
10
|
+
# The port to connect to - defaults to 53
|
|
11
|
+
attr_accessor :port
|
|
12
|
+
# If using IXFR, this is the SOA serial number to start the incrementals from
|
|
13
|
+
attr_accessor :serial
|
|
14
|
+
|
|
15
|
+
def initialize
|
|
16
|
+
@server=Config.new.nameserver[0]
|
|
17
|
+
@transfer_type = Types.AXFR
|
|
18
|
+
@klass=Classes.IN
|
|
19
|
+
@port=53
|
|
20
|
+
@serial=0
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Perform a zone transfer (RFC1995)
|
|
24
|
+
# If an IXFR query is unsuccessful, then AXFR is tried (and @transfer_type is set
|
|
25
|
+
# to AXFR)
|
|
26
|
+
# TCP is used as the only transport
|
|
27
|
+
#
|
|
28
|
+
# If AXFR is performed, then the zone will be returned as a set of records :
|
|
29
|
+
#
|
|
30
|
+
# zt = Dnsruby::ZoneTransfer.new
|
|
31
|
+
# zt.transfer_type = Dnsruby::Types.AXFR
|
|
32
|
+
# zt.server = "ns0.validation-test-servers.nominet.org.uk"
|
|
33
|
+
# zone = zt.transfer("validation-test-servers.nominet.org.uk")
|
|
34
|
+
# soa = zone[0]
|
|
35
|
+
# rec1 = zone[1]
|
|
36
|
+
# print zone.to_s
|
|
37
|
+
#
|
|
38
|
+
#
|
|
39
|
+
# If IXFR is performed, then the incrementals will be returned as a set of Deltas.
|
|
40
|
+
# Each Delta contains the start and end SOA serial number, as well as an array of
|
|
41
|
+
# adds and deletes that occurred between the start and end.
|
|
42
|
+
#
|
|
43
|
+
# zt = Dnsruby::ZoneTransfer.new
|
|
44
|
+
# zt.transfer_type = Dnsruby::Types.IXFR
|
|
45
|
+
# zt.server = "ns0.validation-test-servers.nominet.org.uk"
|
|
46
|
+
# zt.serial = 2007090401
|
|
47
|
+
# deltas = zt.transfer("validation-test-servers.nominet.org.uk")
|
|
48
|
+
# assert_equal("Should show up in transfer", deltas[0].adds[1].data)
|
|
49
|
+
def transfer(zone)
|
|
50
|
+
servers = @server
|
|
51
|
+
if (servers.class == String)
|
|
52
|
+
servers=[servers]
|
|
53
|
+
end
|
|
54
|
+
xfr = nil
|
|
55
|
+
exception = nil
|
|
56
|
+
servers.each do |server|
|
|
57
|
+
begin
|
|
58
|
+
server=Config.resolve_server(server)
|
|
59
|
+
xfr = do_transfer(zone, server)
|
|
60
|
+
break
|
|
61
|
+
rescue Exception => exception
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
if (xfr == nil && exception != nil)
|
|
65
|
+
raise exception
|
|
66
|
+
end
|
|
67
|
+
return xfr
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def do_transfer(zone, server) #:nodoc: all
|
|
71
|
+
@transfer_type = Types.new(@transfer_type)
|
|
72
|
+
@state = :InitialSoa
|
|
73
|
+
socket = TCPSocket.new(server, @port)
|
|
74
|
+
begin
|
|
75
|
+
# Send an initial query
|
|
76
|
+
msg = Message.new(zone, @transfer_type, @klass)
|
|
77
|
+
if @transfer_type == Types.IXFR
|
|
78
|
+
rr = RR.create("#{zone} 0 IN SOA" + '. . %u 0 0 0 0' % @serial)
|
|
79
|
+
msg.add_authority(rr)
|
|
80
|
+
end
|
|
81
|
+
# @TODO@ TSIG?
|
|
82
|
+
send_message(socket, msg)
|
|
83
|
+
|
|
84
|
+
while (@state != :End)
|
|
85
|
+
response = receive_message(socket)
|
|
86
|
+
|
|
87
|
+
if (@state == :InitialSoa)
|
|
88
|
+
rcode = response.header.rcode
|
|
89
|
+
if (rcode != RCode.NOERROR)
|
|
90
|
+
if (@transfer_type == Types.IXFR &&
|
|
91
|
+
rcode == RCode.NOTIMP)
|
|
92
|
+
# IXFR didn't work - let's try AXFR
|
|
93
|
+
TheLog.debug("IXFR DID NOT WORK (rcode = NOTIMP) - TRYING AXFR!!")
|
|
94
|
+
@state = :InitialSoa
|
|
95
|
+
@transfer_type=Types.AXFR
|
|
96
|
+
# Send an initial AXFR query
|
|
97
|
+
msg = Message.new(zone, @transfer_type, @klass)
|
|
98
|
+
# @TODO@ TSIG?
|
|
99
|
+
send_message(socket, msg)
|
|
100
|
+
next
|
|
101
|
+
end
|
|
102
|
+
raise ResolvError.new(rcode.string);
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
if (response.question[0].qtype != @transfer_type)
|
|
106
|
+
raise ResolvError.new("invalid question section")
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
if (response.header.ancount == 0 && @transfer_type == Types.IXFR)
|
|
110
|
+
TheLog.debug("IXFR DID NOT WORK (ancount = 0) - TRYING AXFR!!")
|
|
111
|
+
# IXFR didn't work - let's try AXFR
|
|
112
|
+
@transfer_type=Types.AXFR
|
|
113
|
+
# Send an initial AXFR query
|
|
114
|
+
@state = :InitialSoa
|
|
115
|
+
msg = Message.new(zone, @transfer_type, @klass)
|
|
116
|
+
# @TODO@ TSIG?
|
|
117
|
+
send_message(socket, msg)
|
|
118
|
+
next
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
response.each_answer { |rr|
|
|
123
|
+
parseRR(rr)
|
|
124
|
+
}
|
|
125
|
+
# if (state == END &&
|
|
126
|
+
# response.tsigState == Message.TSIG_INTERMEDIATE)
|
|
127
|
+
# raise ResolvError.new("last message must be signed")
|
|
128
|
+
# end
|
|
129
|
+
end
|
|
130
|
+
# This could return with an IXFR response, or an AXFR response.
|
|
131
|
+
# If it fails completely, then try to send an AXFR query.
|
|
132
|
+
# Once the query has been sent, then enter the main response loop.
|
|
133
|
+
# Unless we know we're definitely AXFR, we should be prepared for either IXFR or AXFR
|
|
134
|
+
# AXFR response : The first and the last RR of the response is the SOA record of the zone.
|
|
135
|
+
# The whole zone is returned inbetween.
|
|
136
|
+
# IXFR response : one or more difference sequences is returned. The list of difference
|
|
137
|
+
# sequences is preceded and followed by a copy of the server's current
|
|
138
|
+
# version of the SOA.
|
|
139
|
+
# Each difference sequence represents one update to the zone (one SOA
|
|
140
|
+
# serial change) consisting of deleted RRs and added RRs. The first RR
|
|
141
|
+
# of the deleted RRs is the older SOA RR and the first RR of the added
|
|
142
|
+
# RRs is the newer SOA RR.
|
|
143
|
+
socket.close
|
|
144
|
+
if (@axfr!=nil)
|
|
145
|
+
return @axfr
|
|
146
|
+
end
|
|
147
|
+
return @ixfr
|
|
148
|
+
rescue Exception => e
|
|
149
|
+
socket.close
|
|
150
|
+
raise e
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# All changes between two versions of a zone in an IXFR response.
|
|
155
|
+
class Delta
|
|
156
|
+
|
|
157
|
+
# The starting serial number of this delta.
|
|
158
|
+
attr_accessor :start
|
|
159
|
+
|
|
160
|
+
# The ending serial number of this delta.
|
|
161
|
+
attr_accessor :end
|
|
162
|
+
|
|
163
|
+
# A list of records added between the start and end versions
|
|
164
|
+
attr_accessor :adds
|
|
165
|
+
|
|
166
|
+
# A list of records deleted between the start and end versions
|
|
167
|
+
attr_accessor :deletes
|
|
168
|
+
|
|
169
|
+
def initialize()
|
|
170
|
+
@adds = []
|
|
171
|
+
@deletes = []
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def parseRR(rec) #:nodoc: all
|
|
176
|
+
name = rec.name
|
|
177
|
+
type = rec.type
|
|
178
|
+
delta = Delta.new
|
|
179
|
+
|
|
180
|
+
case @state
|
|
181
|
+
when :InitialSoa
|
|
182
|
+
if (type != Types.SOA)
|
|
183
|
+
raise ResolvError.new("missing initial SOA")
|
|
184
|
+
end
|
|
185
|
+
@initialsoa = rec
|
|
186
|
+
# Remember the serial number in the initial SOA; we need it
|
|
187
|
+
# to recognize the end of an IXFR.
|
|
188
|
+
@end_serial = rec.serial
|
|
189
|
+
if (@transfer_type == Types.IXFR && @end_serial <= @serial)
|
|
190
|
+
TheLog.debug("zone up to date")
|
|
191
|
+
@state = :End
|
|
192
|
+
else
|
|
193
|
+
@state = :FirstData
|
|
194
|
+
end
|
|
195
|
+
when :FirstData
|
|
196
|
+
# If the transfer begins with 1 SOA, it's an AXFR.
|
|
197
|
+
# If it begins with 2 SOAs, it's an IXFR.
|
|
198
|
+
if (@transfer_type == Types.IXFR && type == Types.SOA &&
|
|
199
|
+
rec.serial == @serial)
|
|
200
|
+
TheLog.debug("IXFR response - using IXFR")
|
|
201
|
+
@rtype = Types.IXFR
|
|
202
|
+
@ixfr = []
|
|
203
|
+
@state = :Ixfr_DelSoa
|
|
204
|
+
else
|
|
205
|
+
TheLog.debug("AXFR response - using AXFR")
|
|
206
|
+
@rtype = Types.AXFR
|
|
207
|
+
@axfr = []
|
|
208
|
+
@axfr << @initialsoa
|
|
209
|
+
@state = :Axfr
|
|
210
|
+
end
|
|
211
|
+
parseRR(rec) # Restart...
|
|
212
|
+
return
|
|
213
|
+
|
|
214
|
+
when :Ixfr_DelSoa
|
|
215
|
+
delta = Delta.new
|
|
216
|
+
@ixfr.push(delta);
|
|
217
|
+
delta.start = rec.serial
|
|
218
|
+
delta.deletes << rec
|
|
219
|
+
@state = :Ixfr_Del
|
|
220
|
+
|
|
221
|
+
when :Ixfr_Del
|
|
222
|
+
if (type == Types.SOA)
|
|
223
|
+
@current_serial = rec.serial
|
|
224
|
+
@state = :Ixfr_AddSoa;
|
|
225
|
+
parseRR(rec); # Restart...
|
|
226
|
+
return;
|
|
227
|
+
end
|
|
228
|
+
delta = @ixfr.get(@ixfr.length - 1);
|
|
229
|
+
delta.deletes << rec
|
|
230
|
+
|
|
231
|
+
when :Ixfr_AddSoa
|
|
232
|
+
delta = @ixfr[@ixfr.length - 1]
|
|
233
|
+
delta.end = rec.serial
|
|
234
|
+
delta.adds << rec
|
|
235
|
+
@state = :Ixfr_Add
|
|
236
|
+
|
|
237
|
+
when :Ixfr_Add
|
|
238
|
+
if (type == Types.SOA)
|
|
239
|
+
soa_serial = rec.serial
|
|
240
|
+
if (soa_serial == @end_serial)
|
|
241
|
+
@state = :End
|
|
242
|
+
return
|
|
243
|
+
elsif (soa_serial != @current_serial)
|
|
244
|
+
raise ResolvError.new("IXFR out of sync: expected serial " +
|
|
245
|
+
@current_serial + " , got " + soa_serial);
|
|
246
|
+
else
|
|
247
|
+
@state = :Ixfr_DelSoa
|
|
248
|
+
parseRR(rec); # Restart...
|
|
249
|
+
return;
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
delta = @ixfr[@ixfr.length - 1]
|
|
253
|
+
delta.adds << rec
|
|
254
|
+
|
|
255
|
+
when :Axfr
|
|
256
|
+
# Old BINDs sent cross class A records for non IN classes.
|
|
257
|
+
if (type == Types.A && rec.klass() != @klass)
|
|
258
|
+
else
|
|
259
|
+
@axfr << rec
|
|
260
|
+
if (type == Types.SOA)
|
|
261
|
+
@state = :End
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
when :End
|
|
265
|
+
raise ResolvError.new("extra data in zone transfer")
|
|
266
|
+
|
|
267
|
+
else
|
|
268
|
+
raise ResolvError.new("invalid state for zone transfer")
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
def send_message(socket, msg) #:nodoc: all
|
|
273
|
+
query_packet = msg.encode
|
|
274
|
+
lenmsg = [query_packet.length].pack('n')
|
|
275
|
+
socket.send(lenmsg, 0)
|
|
276
|
+
socket.send(query_packet, 0)
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def tcp_read(socket, len) #:nodoc: all
|
|
280
|
+
buf=""
|
|
281
|
+
while (buf.length < len) do
|
|
282
|
+
buf += socket.recv(len-buf.length)
|
|
283
|
+
end
|
|
284
|
+
return buf
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
def receive_message(socket) #:nodoc: all
|
|
288
|
+
buf = tcp_read(socket, 2)
|
|
289
|
+
answersize = buf.unpack('n')[0]
|
|
290
|
+
buf = tcp_read(socket, answersize)
|
|
291
|
+
msg = Message.decode(buf)
|
|
292
|
+
|
|
293
|
+
return msg
|
|
294
|
+
end
|
|
295
|
+
end
|
|
296
|
+
end
|