dnsruby 1.1
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/EVENTMACHINE +64 -0
- data/README +63 -0
- data/doc/classes/Dnsruby.html +463 -0
- data/doc/classes/Dnsruby/Algorithms.html +171 -0
- data/doc/classes/Dnsruby/Classes.html +197 -0
- data/doc/classes/Dnsruby/Classes.src/M000209.html +23 -0
- data/doc/classes/Dnsruby/Classes.src/M000210.html +19 -0
- data/doc/classes/Dnsruby/CodeMapper.html +375 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000186.html +18 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000187.html +33 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000188.html +21 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000189.html +19 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000190.html +19 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000191.html +18 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000192.html +22 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000193.html +22 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000194.html +22 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000195.html +31 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000196.html +19 -0
- data/doc/classes/Dnsruby/Config.html +413 -0
- data/doc/classes/Dnsruby/Config.src/M000148.html +18 -0
- data/doc/classes/Dnsruby/Config.src/M000149.html +19 -0
- data/doc/classes/Dnsruby/Config.src/M000150.html +19 -0
- data/doc/classes/Dnsruby/Config.src/M000151.html +25 -0
- data/doc/classes/Dnsruby/Config.src/M000152.html +21 -0
- data/doc/classes/Dnsruby/Config.src/M000153.html +38 -0
- data/doc/classes/Dnsruby/Config.src/M000154.html +26 -0
- data/doc/classes/Dnsruby/Config.src/M000155.html +22 -0
- data/doc/classes/Dnsruby/Config.src/M000156.html +27 -0
- data/doc/classes/Dnsruby/Config.src/M000157.html +22 -0
- data/doc/classes/Dnsruby/Config.src/M000158.html +21 -0
- data/doc/classes/Dnsruby/DNS.html +571 -0
- data/doc/classes/Dnsruby/DNS.src/M000258.html +24 -0
- data/doc/classes/Dnsruby/DNS.src/M000259.html +18 -0
- data/doc/classes/Dnsruby/DNS.src/M000260.html +18 -0
- data/doc/classes/Dnsruby/DNS.src/M000261.html +20 -0
- data/doc/classes/Dnsruby/DNS.src/M000262.html +19 -0
- data/doc/classes/Dnsruby/DNS.src/M000263.html +20 -0
- data/doc/classes/Dnsruby/DNS.src/M000264.html +18 -0
- data/doc/classes/Dnsruby/DNS.src/M000265.html +19 -0
- data/doc/classes/Dnsruby/DNS.src/M000266.html +20 -0
- data/doc/classes/Dnsruby/DNS.src/M000267.html +28 -0
- data/doc/classes/Dnsruby/DNS.src/M000268.html +19 -0
- data/doc/classes/Dnsruby/DNS.src/M000269.html +20 -0
- data/doc/classes/Dnsruby/DNS.src/M000270.html +31 -0
- data/doc/classes/Dnsruby/DecodeError.html +120 -0
- data/doc/classes/Dnsruby/Dnssec.html +287 -0
- data/doc/classes/Dnsruby/Dnssec.src/M000249.html +23 -0
- data/doc/classes/Dnsruby/Dnssec.src/M000250.html +19 -0
- data/doc/classes/Dnsruby/Dnssec.src/M000251.html +90 -0
- data/doc/classes/Dnsruby/Dnssec.src/M000252.html +76 -0
- data/doc/classes/Dnsruby/EncodeError.html +120 -0
- data/doc/classes/Dnsruby/FormErr.html +119 -0
- data/doc/classes/Dnsruby/Header.html +501 -0
- data/doc/classes/Dnsruby/Header.src/M000231.html +35 -0
- data/doc/classes/Dnsruby/Header.src/M000232.html +18 -0
- data/doc/classes/Dnsruby/Header.src/M000233.html +18 -0
- data/doc/classes/Dnsruby/Header.src/M000234.html +21 -0
- data/doc/classes/Dnsruby/Header.src/M000235.html +20 -0
- data/doc/classes/Dnsruby/Header.src/M000236.html +32 -0
- data/doc/classes/Dnsruby/Header.src/M000237.html +27 -0
- data/doc/classes/Dnsruby/Header.src/M000238.html +26 -0
- data/doc/classes/Dnsruby/Header.src/M000239.html +47 -0
- data/doc/classes/Dnsruby/Header.src/M000240.html +28 -0
- data/doc/classes/Dnsruby/Header.src/M000241.html +30 -0
- data/doc/classes/Dnsruby/Hosts.html +316 -0
- data/doc/classes/Dnsruby/Hosts.src/M000197.html +20 -0
- data/doc/classes/Dnsruby/Hosts.src/M000198.html +19 -0
- data/doc/classes/Dnsruby/Hosts.src/M000199.html +20 -0
- data/doc/classes/Dnsruby/Hosts.src/M000200.html +21 -0
- data/doc/classes/Dnsruby/Hosts.src/M000201.html +19 -0
- data/doc/classes/Dnsruby/Hosts.src/M000202.html +20 -0
- data/doc/classes/Dnsruby/Hosts.src/M000203.html +21 -0
- data/doc/classes/Dnsruby/IPv4.html +233 -0
- data/doc/classes/Dnsruby/IPv4.src/M000204.html +32 -0
- data/doc/classes/Dnsruby/IPv4.src/M000205.html +19 -0
- data/doc/classes/Dnsruby/IPv4.src/M000206.html +18 -0
- data/doc/classes/Dnsruby/IPv4.src/M000207.html +18 -0
- data/doc/classes/Dnsruby/IPv4.src/M000208.html +18 -0
- data/doc/classes/Dnsruby/IPv6.html +281 -0
- data/doc/classes/Dnsruby/IPv6.src/M000242.html +60 -0
- data/doc/classes/Dnsruby/IPv6.src/M000243.html +22 -0
- data/doc/classes/Dnsruby/IPv6.src/M000244.html +20 -0
- data/doc/classes/Dnsruby/IPv6.src/M000245.html +18 -0
- data/doc/classes/Dnsruby/Message.html +803 -0
- data/doc/classes/Dnsruby/Message.src/M000119.html +38 -0
- data/doc/classes/Dnsruby/Message.src/M000120.html +26 -0
- data/doc/classes/Dnsruby/Message.src/M000121.html +22 -0
- data/doc/classes/Dnsruby/Message.src/M000122.html +22 -0
- data/doc/classes/Dnsruby/Message.src/M000123.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000124.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000125.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000126.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000127.html +18 -0
- data/doc/classes/Dnsruby/Message.src/M000128.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000129.html +23 -0
- data/doc/classes/Dnsruby/Message.src/M000130.html +30 -0
- data/doc/classes/Dnsruby/Message.src/M000131.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000132.html +18 -0
- data/doc/classes/Dnsruby/Message.src/M000133.html +56 -0
- data/doc/classes/Dnsruby/Message.src/M000134.html +35 -0
- data/doc/classes/Dnsruby/Message.src/M000135.html +46 -0
- data/doc/classes/Dnsruby/Message/Section.html +160 -0
- data/doc/classes/Dnsruby/Message/Section.src/M000141.html +29 -0
- data/doc/classes/Dnsruby/Message/Section.src/M000142.html +30 -0
- data/doc/classes/Dnsruby/MetaTypes.html +136 -0
- data/doc/classes/Dnsruby/Modes.html +171 -0
- data/doc/classes/Dnsruby/NXDomain.html +119 -0
- data/doc/classes/Dnsruby/Name.html +330 -0
- data/doc/classes/Dnsruby/Name.src/M000104.html +28 -0
- data/doc/classes/Dnsruby/Name.src/M000105.html +20 -0
- data/doc/classes/Dnsruby/Name.src/M000106.html +18 -0
- data/doc/classes/Dnsruby/Name.src/M000107.html +21 -0
- data/doc/classes/Dnsruby/Name.src/M000108.html +22 -0
- data/doc/classes/Dnsruby/Name.src/M000109.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.html +300 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000110.html +21 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000111.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000112.html +22 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000113.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000114.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000115.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000116.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000117.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000118.html +18 -0
- data/doc/classes/Dnsruby/NotImp.html +119 -0
- data/doc/classes/Dnsruby/OpCode.html +146 -0
- data/doc/classes/Dnsruby/OtherResolvError.html +119 -0
- data/doc/classes/Dnsruby/QTypes.html +146 -0
- data/doc/classes/Dnsruby/Question.html +301 -0
- data/doc/classes/Dnsruby/Question.src/M000226.html +47 -0
- data/doc/classes/Dnsruby/Question.src/M000227.html +18 -0
- data/doc/classes/Dnsruby/Question.src/M000228.html +18 -0
- data/doc/classes/Dnsruby/Question.src/M000229.html +32 -0
- data/doc/classes/Dnsruby/Question.src/M000230.html +18 -0
- data/doc/classes/Dnsruby/RCode.html +211 -0
- data/doc/classes/Dnsruby/RR.html +648 -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 +26 -0
- data/doc/classes/Dnsruby/RR.src/M000006.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000007.html +36 -0
- data/doc/classes/Dnsruby/RR.src/M000008.html +100 -0
- data/doc/classes/Dnsruby/RR.src/M000009.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000010.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000011.html +22 -0
- data/doc/classes/Dnsruby/RR.src/M000012.html +29 -0
- data/doc/classes/Dnsruby/RR.src/M000013.html +24 -0
- data/doc/classes/Dnsruby/RR/ANY.html +133 -0
- data/doc/classes/Dnsruby/RR/CERT.html +180 -0
- data/doc/classes/Dnsruby/RR/CERT/CertificateTypes.html +169 -0
- data/doc/classes/Dnsruby/RR/CNAME.html +151 -0
- data/doc/classes/Dnsruby/RR/DNAME.html +150 -0
- data/doc/classes/Dnsruby/RR/DNSKEY.html +422 -0
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000044.html +20 -0
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000045.html +21 -0
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000046.html +28 -0
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000047.html +22 -0
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000048.html +18 -0
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000049.html +22 -0
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000050.html +18 -0
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000051.html +26 -0
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000052.html +38 -0
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000053.html +45 -0
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000054.html +21 -0
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000055.html +24 -0
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000056.html +32 -0
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000057.html +24 -0
- data/doc/classes/Dnsruby/RR/DS.html +286 -0
- data/doc/classes/Dnsruby/RR/DS.src/M000039.html +22 -0
- data/doc/classes/Dnsruby/RR/DS.src/M000040.html +28 -0
- data/doc/classes/Dnsruby/RR/DS.src/M000041.html +24 -0
- data/doc/classes/Dnsruby/RR/DS.src/M000042.html +28 -0
- data/doc/classes/Dnsruby/RR/DS.src/M000043.html +36 -0
- data/doc/classes/Dnsruby/RR/DomainName.html +175 -0
- data/doc/classes/Dnsruby/RR/DomainName.src/M000083.html +18 -0
- data/doc/classes/Dnsruby/RR/Generic.html +133 -0
- data/doc/classes/Dnsruby/RR/HINFO.html +155 -0
- data/doc/classes/Dnsruby/RR/IN.html +155 -0
- data/doc/classes/Dnsruby/RR/IN/A.html +200 -0
- data/doc/classes/Dnsruby/RR/IN/A.src/M000017.html +18 -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/AAAA.html +139 -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 +238 -0
- data/doc/classes/Dnsruby/RR/IN/SRV.src/M000014.html +29 -0
- data/doc/classes/Dnsruby/RR/IN/SRV.src/M000015.html +26 -0
- data/doc/classes/Dnsruby/RR/IN/SRV.src/M000016.html +22 -0
- data/doc/classes/Dnsruby/RR/IN/WKS.html +166 -0
- data/doc/classes/Dnsruby/RR/IN/WKS.src/M000020.html +20 -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 +151 -0
- data/doc/classes/Dnsruby/RR/NSAP.html +293 -0
- data/doc/classes/Dnsruby/RR/NSAP.src/M000093.html +19 -0
- data/doc/classes/Dnsruby/RR/NSAP.src/M000094.html +19 -0
- data/doc/classes/Dnsruby/RR/NSAP.src/M000095.html +22 -0
- data/doc/classes/Dnsruby/RR/NSAP.src/M000096.html +31 -0
- data/doc/classes/Dnsruby/RR/NSEC.html +301 -0
- data/doc/classes/Dnsruby/RR/NSEC.src/M000031.html +19 -0
- data/doc/classes/Dnsruby/RR/NSEC.src/M000032.html +18 -0
- data/doc/classes/Dnsruby/RR/NSEC.src/M000033.html +34 -0
- data/doc/classes/Dnsruby/RR/NSEC.src/M000034.html +18 -0
- data/doc/classes/Dnsruby/RR/NSEC.src/M000035.html +71 -0
- data/doc/classes/Dnsruby/RR/NSEC.src/M000036.html +18 -0
- data/doc/classes/Dnsruby/RR/NSEC.src/M000037.html +80 -0
- data/doc/classes/Dnsruby/RR/NSEC.src/M000038.html +23 -0
- data/doc/classes/Dnsruby/RR/NSEC3.html +366 -0
- data/doc/classes/Dnsruby/RR/NSEC3.src/M000085.html +28 -0
- data/doc/classes/Dnsruby/RR/NSEC3.src/M000086.html +18 -0
- data/doc/classes/Dnsruby/RR/NSEC3.src/M000087.html +18 -0
- data/doc/classes/Dnsruby/RR/NSEC3.src/M000088.html +22 -0
- data/doc/classes/Dnsruby/RR/NSEC3.src/M000089.html +18 -0
- data/doc/classes/Dnsruby/RR/NSEC3.src/M000090.html +21 -0
- data/doc/classes/Dnsruby/RR/NSEC3.src/M000091.html +21 -0
- data/doc/classes/Dnsruby/RR/NSEC3.src/M000092.html +29 -0
- data/doc/classes/Dnsruby/RR/NSEC3PARAM.html +279 -0
- data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000077.html +28 -0
- data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000078.html +18 -0
- data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000079.html +22 -0
- data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000080.html +21 -0
- data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000081.html +25 -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/M000082.html +19 -0
- data/doc/classes/Dnsruby/RR/RRSIG.html +357 -0
- data/doc/classes/Dnsruby/RR/RRSIG.src/M000097.html +26 -0
- data/doc/classes/Dnsruby/RR/RRSIG.src/M000098.html +28 -0
- data/doc/classes/Dnsruby/RR/RRSIG.src/M000099.html +23 -0
- data/doc/classes/Dnsruby/RR/RRSIG.src/M000100.html +23 -0
- data/doc/classes/Dnsruby/RR/RRSIG.src/M000101.html +46 -0
- data/doc/classes/Dnsruby/RR/RRSIG.src/M000102.html +50 -0
- data/doc/classes/Dnsruby/RR/RRSIG.src/M000103.html +27 -0
- data/doc/classes/Dnsruby/RR/RT.html +155 -0
- data/doc/classes/Dnsruby/RR/SOA.html +233 -0
- data/doc/classes/Dnsruby/RR/SOA.src/M000066.html +24 -0
- data/doc/classes/Dnsruby/RR/SOA.src/M000067.html +27 -0
- data/doc/classes/Dnsruby/RR/SPF.html +138 -0
- data/doc/classes/Dnsruby/RR/TKEY.html +313 -0
- data/doc/classes/Dnsruby/RR/TKEY.src/M000021.html +19 -0
- data/doc/classes/Dnsruby/RR/TKEY.src/M000022.html +29 -0
- data/doc/classes/Dnsruby/RR/TKEY.src/M000023.html +21 -0
- data/doc/classes/Dnsruby/RR/TKEY.src/M000024.html +29 -0
- data/doc/classes/Dnsruby/RR/TSIG.html +524 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000068.html +24 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000069.html +32 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000070.html +54 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000071.html +121 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000072.html +33 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000073.html +25 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000074.html +36 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000075.html +22 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000076.html +29 -0
- data/doc/classes/Dnsruby/RR/TXT.html +233 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000061.html +18 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000062.html +18 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000063.html +20 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000064.html +27 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000065.html +25 -0
- data/doc/classes/Dnsruby/RR/X25.html +203 -0
- data/doc/classes/Dnsruby/RR/X25.src/M000058.html +18 -0
- data/doc/classes/Dnsruby/RR/X25.src/M000059.html +18 -0
- data/doc/classes/Dnsruby/RR/X25.src/M000060.html +22 -0
- data/doc/classes/Dnsruby/RRSet.html +404 -0
- data/doc/classes/Dnsruby/RRSet.src/M000211.html +23 -0
- data/doc/classes/Dnsruby/RRSet.src/M000212.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000213.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000214.html +47 -0
- data/doc/classes/Dnsruby/RRSet.src/M000215.html +42 -0
- data/doc/classes/Dnsruby/RRSet.src/M000216.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000217.html +20 -0
- data/doc/classes/Dnsruby/RRSet.src/M000218.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000219.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000220.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000221.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000222.html +22 -0
- data/doc/classes/Dnsruby/RRSet.src/M000223.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000224.html +22 -0
- data/doc/classes/Dnsruby/RRSet.src/M000225.html +18 -0
- data/doc/classes/Dnsruby/Refused.html +119 -0
- data/doc/classes/Dnsruby/Resolv.html +401 -0
- data/doc/classes/Dnsruby/Resolv.src/M000159.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000160.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000161.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000162.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000163.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000164.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000165.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000166.html +19 -0
- data/doc/classes/Dnsruby/Resolv.src/M000167.html +20 -0
- data/doc/classes/Dnsruby/Resolv.src/M000168.html +29 -0
- data/doc/classes/Dnsruby/Resolv.src/M000169.html +19 -0
- data/doc/classes/Dnsruby/Resolv.src/M000170.html +20 -0
- data/doc/classes/Dnsruby/Resolv.src/M000171.html +25 -0
- data/doc/classes/Dnsruby/ResolvError.html +117 -0
- data/doc/classes/Dnsruby/ResolvTimeout.html +117 -0
- data/doc/classes/Dnsruby/Resolver.html +1055 -0
- data/doc/classes/Dnsruby/Resolver.src/M000271.html +21 -0
- data/doc/classes/Dnsruby/Resolver.src/M000272.html +27 -0
- data/doc/classes/Dnsruby/Resolver.src/M000273.html +28 -0
- data/doc/classes/Dnsruby/Resolver.src/M000274.html +18 -0
- data/doc/classes/Dnsruby/Resolver.src/M000275.html +51 -0
- data/doc/classes/Dnsruby/Resolver.src/M000276.html +21 -0
- data/doc/classes/Dnsruby/Resolver.src/M000277.html +22 -0
- data/doc/classes/Dnsruby/Resolver.src/M000278.html +18 -0
- data/doc/classes/Dnsruby/Resolver.src/M000279.html +20 -0
- data/doc/classes/Dnsruby/Resolver.src/M000280.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000281.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000282.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000283.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000284.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000285.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000286.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000287.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000288.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000289.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000290.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000291.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000292.html +26 -0
- data/doc/classes/Dnsruby/Resolver.src/M000293.html +18 -0
- data/doc/classes/Dnsruby/Resolver.src/M000294.html +23 -0
- data/doc/classes/Dnsruby/Resolver.src/M000295.html +18 -0
- data/doc/classes/Dnsruby/ServFail.html +119 -0
- data/doc/classes/Dnsruby/SingleResolver.html +674 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000172.html +18 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000173.html +24 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000174.html +36 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000175.html +18 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000176.html +19 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000177.html +50 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000178.html +19 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000179.html +21 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000180.html +25 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000181.html +54 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000182.html +27 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000183.html +27 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000184.html +35 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000185.html +21 -0
- data/doc/classes/Dnsruby/TheLog.html +196 -0
- data/doc/classes/Dnsruby/TheLog.src/M000246.html +20 -0
- data/doc/classes/Dnsruby/TheLog.src/M000247.html +20 -0
- data/doc/classes/Dnsruby/TheLog.src/M000248.html +20 -0
- data/doc/classes/Dnsruby/Types.html +436 -0
- data/doc/classes/Dnsruby/Update.html +368 -0
- data/doc/classes/Dnsruby/Update.src/M000253.html +32 -0
- data/doc/classes/Dnsruby/Update.src/M000254.html +36 -0
- data/doc/classes/Dnsruby/Update.src/M000255.html +32 -0
- data/doc/classes/Dnsruby/Update.src/M000256.html +41 -0
- data/doc/classes/Dnsruby/Update.src/M000257.html +34 -0
- data/doc/classes/Dnsruby/VerifyError.html +119 -0
- data/doc/classes/Dnsruby/ZoneTransfer.html +300 -0
- data/doc/classes/Dnsruby/ZoneTransfer.src/M000143.html +18 -0
- data/doc/classes/Dnsruby/ZoneTransfer.src/M000144.html +24 -0
- data/doc/classes/Dnsruby/ZoneTransfer.src/M000145.html +35 -0
- data/doc/classes/Dnsruby/ZoneTransfer/Delta.html +200 -0
- data/doc/classes/Dnsruby/ZoneTransfer/Delta.src/M000146.html +19 -0
- data/doc/classes/Dnsruby/ZoneTransfer/Delta.src/M000147.html +19 -0
- data/doc/created.rid +1 -0
- data/doc/files/lib/Dnsruby/Config_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 +109 -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/dnssec_rb.html +107 -0
- data/doc/files/lib/Dnsruby/event_machine_interface_rb.html +108 -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/DNSKEY_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/DS_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/NSEC3PARAM_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/NSEC3_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/NSEC_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/RRSIG_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 +114 -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 +131 -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 +108 -0
- data/doc/fr_file_index.html +75 -0
- data/doc/fr_method_index.html +321 -0
- data/doc/index.html +24 -0
- data/lib/Dnsruby/Config.rb +363 -0
- data/lib/Dnsruby/DNS.rb +293 -0
- data/lib/Dnsruby/Hosts.rb +126 -0
- data/lib/Dnsruby/Resolver.rb +999 -0
- data/lib/Dnsruby/SingleResolver.rb +493 -0
- data/lib/Dnsruby/TheLog.rb +60 -0
- data/lib/Dnsruby/code_mapper.rb +165 -0
- data/lib/Dnsruby/dnssec.rb +357 -0
- data/lib/Dnsruby/event_machine_interface.rb +264 -0
- data/lib/Dnsruby/ipv4.rb +74 -0
- data/lib/Dnsruby/ipv6.rb +144 -0
- data/lib/Dnsruby/message.rb +961 -0
- data/lib/Dnsruby/name.rb +332 -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/DNSKEY.rb +242 -0
- data/lib/Dnsruby/resource/DS.rb +162 -0
- data/lib/Dnsruby/resource/HINFO.rb +52 -0
- data/lib/Dnsruby/resource/IN.rb +70 -0
- data/lib/Dnsruby/resource/ISDN.rb +54 -0
- data/lib/Dnsruby/resource/LOC.rb +255 -0
- data/lib/Dnsruby/resource/MINFO.rb +70 -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/NSEC.rb +243 -0
- data/lib/Dnsruby/resource/NSEC3.rb +173 -0
- data/lib/Dnsruby/resource/NSEC3PARAM.rb +120 -0
- data/lib/Dnsruby/resource/OPT.rb +210 -0
- data/lib/Dnsruby/resource/PX.rb +71 -0
- data/lib/Dnsruby/resource/RP.rb +67 -0
- data/lib/Dnsruby/resource/RRSIG.rb +256 -0
- data/lib/Dnsruby/resource/RT.rb +67 -0
- data/lib/Dnsruby/resource/SOA.rb +95 -0
- data/lib/Dnsruby/resource/SPF.rb +29 -0
- data/lib/Dnsruby/resource/SRV.rb +112 -0
- data/lib/Dnsruby/resource/TKEY.rb +163 -0
- data/lib/Dnsruby/resource/TSIG.rb +584 -0
- data/lib/Dnsruby/resource/TXT.rb +76 -0
- data/lib/Dnsruby/resource/X25.rb +53 -0
- data/lib/Dnsruby/resource/domain_name.rb +54 -0
- data/lib/Dnsruby/resource/generic.rb +151 -0
- data/lib/Dnsruby/resource/resource.rb +561 -0
- data/lib/Dnsruby/select_thread.rb +449 -0
- data/lib/Dnsruby/update.rb +262 -0
- data/lib/Dnsruby/zone_transfer.rb +332 -0
- data/lib/dnsruby.rb +512 -0
- data/test/custom.txt +4 -0
- data/test/resolv.conf +4 -0
- data/test/tc_axfr.rb +32 -0
- data/test/tc_dns.rb +230 -0
- data/test/tc_dnskey.rb +52 -0
- data/test/tc_dnsruby.rb +42 -0
- data/test/tc_dnssec.rb +88 -0
- data/test/tc_ds.rb +38 -0
- data/test/tc_escapedchars.rb +484 -0
- data/test/tc_event_machine_deferrable.rb +85 -0
- data/test/tc_event_machine_res.rb +174 -0
- data/test/tc_event_machine_single_res.rb +101 -0
- data/test/tc_event_machine_soak.rb +98 -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_nsec.rb +36 -0
- data/test/tc_nsec3.rb +63 -0
- data/test/tc_nsec3param.rb +30 -0
- data/test/tc_packet.rb +179 -0
- data/test/tc_packet_unique_push.rb +102 -0
- data/test/tc_question.rb +51 -0
- data/test/tc_res_config.rb +92 -0
- data/test/tc_res_env.rb +51 -0
- data/test/tc_res_file.rb +42 -0
- data/test/tc_res_opt.rb +187 -0
- data/test/tc_resolver.rb +184 -0
- data/test/tc_rr-opt.rb +82 -0
- data/test/tc_rr-txt.rb +137 -0
- data/test/tc_rr-unknown.rb +99 -0
- data/test/tc_rr.rb +258 -0
- data/test/tc_rrset.rb +58 -0
- data/test/tc_rrsig.rb +32 -0
- data/test/tc_single_resolver.rb +169 -0
- data/test/tc_soak.rb +200 -0
- data/test/tc_soak_base.rb +136 -0
- data/test/tc_tcp.rb +35 -0
- data/test/tc_tkey.rb +75 -0
- data/test/tc_tsig.rb +237 -0
- data/test/tc_update.rb +215 -0
- data/test/ts_dnsruby.rb +17 -0
- data/test/ts_offline.rb +42 -0
- data/test/ts_online.rb +107 -0
- metadata +627 -0
|
@@ -0,0 +1,332 @@
|
|
|
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
|
+
# The TSIG record used to sign the transfer
|
|
15
|
+
attr_reader :tsig
|
|
16
|
+
# Returns the tsigstate of the last transfer (nil if no TSIG signed transfer has occurred)
|
|
17
|
+
attr_reader :last_tsigstate
|
|
18
|
+
|
|
19
|
+
#Sets the TSIG to sign the zone transfer with.
|
|
20
|
+
#Pass in either a Dnsruby::RR::TSIG, or a key_name and key (or just a key)
|
|
21
|
+
#Pass in nil to stop tsig signing.
|
|
22
|
+
#* res.tsig=(tsig_rr)
|
|
23
|
+
#* res.tsig=(key_name, key)
|
|
24
|
+
#* res.tsig=nil # Don't sign the transfer
|
|
25
|
+
def tsig=(*args)
|
|
26
|
+
@tsig = SingleResolver.get_tsig(args)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def initialize
|
|
31
|
+
@server=Config.new.nameserver[0]
|
|
32
|
+
@transfer_type = Types.AXFR
|
|
33
|
+
@klass=Classes.IN
|
|
34
|
+
@port=53
|
|
35
|
+
@serial=0
|
|
36
|
+
@tsig = nil
|
|
37
|
+
@axfr = nil
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Perform a zone transfer (RFC1995)
|
|
41
|
+
# If an IXFR query is unsuccessful, then AXFR is tried (and @transfer_type is set
|
|
42
|
+
# to AXFR)
|
|
43
|
+
# TCP is used as the only transport
|
|
44
|
+
#
|
|
45
|
+
# If AXFR is performed, then the zone will be returned as a set of records :
|
|
46
|
+
#
|
|
47
|
+
# zt = Dnsruby::ZoneTransfer.new
|
|
48
|
+
# zt.transfer_type = Dnsruby::Types.AXFR
|
|
49
|
+
# zt.server = "ns0.validation-test-servers.nominet.org.uk"
|
|
50
|
+
# zone = zt.transfer("validation-test-servers.nominet.org.uk")
|
|
51
|
+
# soa = zone[0]
|
|
52
|
+
# rec1 = zone[1]
|
|
53
|
+
# print zone.to_s
|
|
54
|
+
#
|
|
55
|
+
#
|
|
56
|
+
# If IXFR is performed, then the incrementals will be returned as a set of Deltas.
|
|
57
|
+
# Each Delta contains the start and end SOA serial number, as well as an array of
|
|
58
|
+
# adds and deletes that occurred between the start and end.
|
|
59
|
+
#
|
|
60
|
+
# zt = Dnsruby::ZoneTransfer.new
|
|
61
|
+
# zt.transfer_type = Dnsruby::Types.IXFR
|
|
62
|
+
# zt.server = "ns0.validation-test-servers.nominet.org.uk"
|
|
63
|
+
# zt.serial = 2007090401
|
|
64
|
+
# deltas = zt.transfer("validation-test-servers.nominet.org.uk")
|
|
65
|
+
# assert_equal("Should show up in transfer", deltas[0].adds[1].data)
|
|
66
|
+
def transfer(zone)
|
|
67
|
+
servers = @server
|
|
68
|
+
if (servers.class == String)
|
|
69
|
+
servers=[servers]
|
|
70
|
+
end
|
|
71
|
+
xfr = nil
|
|
72
|
+
exception = nil
|
|
73
|
+
servers.each do |server|
|
|
74
|
+
begin
|
|
75
|
+
server=Config.resolve_server(server)
|
|
76
|
+
xfr = do_transfer(zone, server)
|
|
77
|
+
break
|
|
78
|
+
rescue Exception => exception
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
if (xfr == nil && exception != nil)
|
|
82
|
+
raise exception
|
|
83
|
+
end
|
|
84
|
+
return xfr
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def do_transfer(zone, server) #:nodoc: all
|
|
88
|
+
@transfer_type = Types.new(@transfer_type)
|
|
89
|
+
@state = :InitialSoa
|
|
90
|
+
socket = TCPSocket.new(server, @port)
|
|
91
|
+
begin
|
|
92
|
+
# Send an initial query
|
|
93
|
+
msg = Message.new(zone, @transfer_type, @klass)
|
|
94
|
+
if @transfer_type == Types.IXFR
|
|
95
|
+
rr = RR.create("#{zone} 0 IN SOA" + '0 0 %u 0 0 0 0' % @serial)
|
|
96
|
+
msg.add_authority(rr)
|
|
97
|
+
end
|
|
98
|
+
send_message(socket, msg)
|
|
99
|
+
|
|
100
|
+
while (@state != :End)
|
|
101
|
+
response = receive_message(socket)
|
|
102
|
+
|
|
103
|
+
if (@state == :InitialSoa)
|
|
104
|
+
rcode = response.header.rcode
|
|
105
|
+
if (rcode != RCode.NOERROR)
|
|
106
|
+
if (@transfer_type == Types.IXFR &&
|
|
107
|
+
rcode == RCode.NOTIMP)
|
|
108
|
+
# IXFR didn't work - let's try AXFR
|
|
109
|
+
TheLog.debug("IXFR DID NOT WORK (rcode = NOTIMP) - TRYING AXFR!!")
|
|
110
|
+
@state = :InitialSoa
|
|
111
|
+
@transfer_type=Types.AXFR
|
|
112
|
+
# Send an initial AXFR query
|
|
113
|
+
msg = Message.new(zone, @transfer_type, @klass)
|
|
114
|
+
send_message(socket, msg)
|
|
115
|
+
next
|
|
116
|
+
end
|
|
117
|
+
raise ResolvError.new(rcode.string);
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
if (response.question[0].qtype != @transfer_type)
|
|
121
|
+
raise ResolvError.new("invalid question section")
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
if (response.header.ancount == 0 && @transfer_type == Types.IXFR)
|
|
125
|
+
TheLog.debug("IXFR DID NOT WORK (ancount = 0) - TRYING AXFR!!")
|
|
126
|
+
# IXFR didn't work - let's try AXFR
|
|
127
|
+
@transfer_type=Types.AXFR
|
|
128
|
+
# Send an initial AXFR query
|
|
129
|
+
@state = :InitialSoa
|
|
130
|
+
msg = Message.new(zone, @transfer_type, @klass)
|
|
131
|
+
send_message(socket, msg)
|
|
132
|
+
next
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
response.each_answer { |rr|
|
|
137
|
+
parseRR(rr)
|
|
138
|
+
}
|
|
139
|
+
if (@state == :End &&
|
|
140
|
+
response.tsigstate == :Intermediate)
|
|
141
|
+
raise ResolvError.new("last message must be signed")
|
|
142
|
+
end
|
|
143
|
+
if (@state == :End && @tsig)
|
|
144
|
+
if (response.tsigstate != :Verified)
|
|
145
|
+
@last_tsigstate = :Failed
|
|
146
|
+
raise ResolvError.new("Zone transfer not correctly signed")
|
|
147
|
+
end
|
|
148
|
+
@last_tsigstate = :Verified
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
# This could return with an IXFR response, or an AXFR response.
|
|
152
|
+
# If it fails completely, then try to send an AXFR query.
|
|
153
|
+
# Once the query has been sent, then enter the main response loop.
|
|
154
|
+
# Unless we know we're definitely AXFR, we should be prepared for either IXFR or AXFR
|
|
155
|
+
# AXFR response : The first and the last RR of the response is the SOA record of the zone.
|
|
156
|
+
# The whole zone is returned inbetween.
|
|
157
|
+
# IXFR response : one or more difference sequences is returned. The list of difference
|
|
158
|
+
# sequences is preceded and followed by a copy of the server's current
|
|
159
|
+
# version of the SOA.
|
|
160
|
+
# Each difference sequence represents one update to the zone (one SOA
|
|
161
|
+
# serial change) consisting of deleted RRs and added RRs. The first RR
|
|
162
|
+
# of the deleted RRs is the older SOA RR and the first RR of the added
|
|
163
|
+
# RRs is the newer SOA RR.
|
|
164
|
+
socket.close
|
|
165
|
+
if (@axfr!=nil)
|
|
166
|
+
return @axfr
|
|
167
|
+
end
|
|
168
|
+
return @ixfr
|
|
169
|
+
rescue Exception => e
|
|
170
|
+
socket.close
|
|
171
|
+
raise e
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# All changes between two versions of a zone in an IXFR response.
|
|
176
|
+
class Delta
|
|
177
|
+
|
|
178
|
+
# The starting serial number of this delta.
|
|
179
|
+
attr_accessor :start
|
|
180
|
+
|
|
181
|
+
# The ending serial number of this delta.
|
|
182
|
+
attr_accessor :end
|
|
183
|
+
|
|
184
|
+
# A list of records added between the start and end versions
|
|
185
|
+
attr_accessor :adds
|
|
186
|
+
|
|
187
|
+
# A list of records deleted between the start and end versions
|
|
188
|
+
attr_accessor :deletes
|
|
189
|
+
|
|
190
|
+
def initialize()
|
|
191
|
+
@adds = []
|
|
192
|
+
@deletes = []
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def to_s
|
|
196
|
+
ret = "Adds : " + @adds.join(",")
|
|
197
|
+
ret +=", Deletes : " + @deletes.join(",")
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
def parseRR(rec) #:nodoc: all
|
|
202
|
+
name = rec.name
|
|
203
|
+
type = rec.type
|
|
204
|
+
delta = Delta.new
|
|
205
|
+
|
|
206
|
+
case @state
|
|
207
|
+
when :InitialSoa
|
|
208
|
+
if (type != Types.SOA)
|
|
209
|
+
raise ResolvError.new("missing initial SOA")
|
|
210
|
+
end
|
|
211
|
+
@initialsoa = rec
|
|
212
|
+
# Remember the serial number in the initial SOA; we need it
|
|
213
|
+
# to recognize the end of an IXFR.
|
|
214
|
+
@end_serial = rec.serial
|
|
215
|
+
if (@transfer_type == Types.IXFR && @end_serial <= @serial)
|
|
216
|
+
TheLog.debug("zone up to date")
|
|
217
|
+
@state = :End
|
|
218
|
+
else
|
|
219
|
+
@state = :FirstData
|
|
220
|
+
end
|
|
221
|
+
when :FirstData
|
|
222
|
+
# If the transfer begins with 1 SOA, it's an AXFR.
|
|
223
|
+
# If it begins with 2 SOAs, it's an IXFR.
|
|
224
|
+
if (@transfer_type == Types.IXFR && type == Types.SOA &&
|
|
225
|
+
rec.serial == @serial)
|
|
226
|
+
TheLog.debug("IXFR response - using IXFR")
|
|
227
|
+
@rtype = Types.IXFR
|
|
228
|
+
@ixfr = []
|
|
229
|
+
@state = :Ixfr_DelSoa
|
|
230
|
+
else
|
|
231
|
+
TheLog.debug("AXFR response - using AXFR")
|
|
232
|
+
@rtype = Types.AXFR
|
|
233
|
+
@axfr = []
|
|
234
|
+
@axfr << @initialsoa
|
|
235
|
+
@state = :Axfr
|
|
236
|
+
end
|
|
237
|
+
parseRR(rec) # Restart...
|
|
238
|
+
return
|
|
239
|
+
|
|
240
|
+
when :Ixfr_DelSoa
|
|
241
|
+
delta = Delta.new
|
|
242
|
+
@ixfr.push(delta)
|
|
243
|
+
delta.start = rec.serial
|
|
244
|
+
delta.deletes << rec
|
|
245
|
+
@state = :Ixfr_Del
|
|
246
|
+
|
|
247
|
+
when :Ixfr_Del
|
|
248
|
+
if (type == Types.SOA)
|
|
249
|
+
@current_serial = rec.serial
|
|
250
|
+
@state = :Ixfr_AddSoa
|
|
251
|
+
parseRR(rec); # Restart...
|
|
252
|
+
return;
|
|
253
|
+
end
|
|
254
|
+
delta = @ixfr[@ixfr.length - 1]
|
|
255
|
+
delta.deletes << rec
|
|
256
|
+
|
|
257
|
+
when :Ixfr_AddSoa
|
|
258
|
+
delta = @ixfr[@ixfr.length - 1]
|
|
259
|
+
delta.end = rec.serial
|
|
260
|
+
delta.adds << rec
|
|
261
|
+
@state = :Ixfr_Add
|
|
262
|
+
|
|
263
|
+
when :Ixfr_Add
|
|
264
|
+
if (type == Types.SOA)
|
|
265
|
+
soa_serial = rec.serial
|
|
266
|
+
if (soa_serial == @end_serial)
|
|
267
|
+
@state = :End
|
|
268
|
+
return
|
|
269
|
+
elsif (soa_serial != @current_serial)
|
|
270
|
+
raise ResolvError.new("IXFR out of sync: expected serial " +
|
|
271
|
+
@current_serial + " , got " + soa_serial);
|
|
272
|
+
else
|
|
273
|
+
@state = :Ixfr_DelSoa
|
|
274
|
+
parseRR(rec); # Restart...
|
|
275
|
+
return;
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
delta = @ixfr[@ixfr.length - 1]
|
|
279
|
+
delta.adds << rec
|
|
280
|
+
|
|
281
|
+
when :Axfr
|
|
282
|
+
# Old BINDs sent cross class A records for non IN classes.
|
|
283
|
+
if (type == Types.A && rec.klass() != @klass)
|
|
284
|
+
else
|
|
285
|
+
@axfr << rec
|
|
286
|
+
if (type == Types.SOA)
|
|
287
|
+
@state = :End
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
when :End
|
|
291
|
+
raise ResolvError.new("extra data in zone transfer")
|
|
292
|
+
|
|
293
|
+
else
|
|
294
|
+
raise ResolvError.new("invalid state for zone transfer")
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
def send_message(socket, msg) #:nodoc: all
|
|
300
|
+
if (@tsig)
|
|
301
|
+
@tsig.apply(msg)
|
|
302
|
+
@tsig = msg.tsig
|
|
303
|
+
end
|
|
304
|
+
query_packet = msg.encode
|
|
305
|
+
lenmsg = [query_packet.length].pack('n')
|
|
306
|
+
socket.send(lenmsg, 0)
|
|
307
|
+
socket.send(query_packet, 0)
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
def tcp_read(socket, len) #:nodoc: all
|
|
311
|
+
buf=""
|
|
312
|
+
while (buf.length < len) do
|
|
313
|
+
buf += socket.recv(len-buf.length)
|
|
314
|
+
end
|
|
315
|
+
return buf
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
def receive_message(socket) #:nodoc: all
|
|
319
|
+
buf = tcp_read(socket, 2)
|
|
320
|
+
answersize = buf.unpack('n')[0]
|
|
321
|
+
buf = tcp_read(socket, answersize)
|
|
322
|
+
msg = Message.decode(buf)
|
|
323
|
+
if (@tsig)
|
|
324
|
+
if !@tsig.verify_envelope(msg, buf)
|
|
325
|
+
TheLog.error("Bad signature on zone transfer - closing connection")
|
|
326
|
+
raise ResolvError.new("Bad signature on zone transfer")
|
|
327
|
+
end
|
|
328
|
+
end
|
|
329
|
+
return msg
|
|
330
|
+
end
|
|
331
|
+
end
|
|
332
|
+
end
|
data/lib/dnsruby.rb
ADDED
|
@@ -0,0 +1,512 @@
|
|
|
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/TheLog'
|
|
17
|
+
require 'Dnsruby/code_mapper'
|
|
18
|
+
require 'Dnsruby/ipv4'
|
|
19
|
+
require 'Dnsruby/ipv6'
|
|
20
|
+
require 'timeout'
|
|
21
|
+
#= Dnsruby library
|
|
22
|
+
#Dnsruby is a thread-aware DNS stub resolver library written in Ruby.
|
|
23
|
+
#
|
|
24
|
+
#It is based on resolv.rb, the standard Ruby DNS implementation,
|
|
25
|
+
#but gives a complete DNS implementation, including DNSSEC.
|
|
26
|
+
#
|
|
27
|
+
#The Resolv class can be used to resolve addresses using /etc/hosts and /etc/resolv.conf,
|
|
28
|
+
#or the DNS class can be used to make DNS queries. These interfaces will attempt to apply
|
|
29
|
+
#the default domain and searchlist when resolving names.
|
|
30
|
+
#
|
|
31
|
+
#The Resolver and SingleResolver interfaces allow finer control of individual messages.
|
|
32
|
+
#The Resolver class sends queries to multiple resolvers using various retry mechanisms.
|
|
33
|
+
#The SingleResolver class is used by Resolver to send individual Messages to individual
|
|
34
|
+
#resolvers.
|
|
35
|
+
#
|
|
36
|
+
#Resolver queries return Dnsruby::Message objects. Message objects have five
|
|
37
|
+
#sections:
|
|
38
|
+
#
|
|
39
|
+
#* The header section, a Dnsruby::Header object.
|
|
40
|
+
#
|
|
41
|
+
#* The question section, a list of Dnsruby::Question objects.
|
|
42
|
+
#
|
|
43
|
+
#* The answer section, a list of Dnsruby::Resource objects.
|
|
44
|
+
#
|
|
45
|
+
#* The authority section, a list of Dnsruby::Resource objects.
|
|
46
|
+
#
|
|
47
|
+
#* The additional section, a list of Dnsruby::Resource objects.
|
|
48
|
+
#
|
|
49
|
+
#
|
|
50
|
+
#== example
|
|
51
|
+
# p Dnsruby::Resolv.getaddress("www.ruby-lang.org")
|
|
52
|
+
# p Dnsruby::Resolv.getname("210.251.121.214")
|
|
53
|
+
#
|
|
54
|
+
# Dnsruby::DNS.open {|dns|
|
|
55
|
+
# p dns.getresources("www.ruby-lang.org", Dnsruby::Types.A).collect {|r| r.address}
|
|
56
|
+
# p dns.getresources("ruby-lang.org", 'MX').collect {|r| [r.exchange.to_s, r.preference]}
|
|
57
|
+
# }
|
|
58
|
+
#
|
|
59
|
+
#== exceptions
|
|
60
|
+
#
|
|
61
|
+
#* ResolvError < StandardError
|
|
62
|
+
#
|
|
63
|
+
#* ResolvTimeout < TimeoutError
|
|
64
|
+
#
|
|
65
|
+
#* NXDomain < ResolvError
|
|
66
|
+
#
|
|
67
|
+
#* FormErr < ResolvError
|
|
68
|
+
#
|
|
69
|
+
#* ServFail < ResolvError
|
|
70
|
+
#
|
|
71
|
+
#* NotImp < ResolvError
|
|
72
|
+
#
|
|
73
|
+
#* Refused < ResolvError
|
|
74
|
+
#
|
|
75
|
+
#* OtherResolvError < ResolvError
|
|
76
|
+
#
|
|
77
|
+
#== I/O
|
|
78
|
+
#Dnsruby implements a pure Ruby event loop to perform I/O.
|
|
79
|
+
#Dnsruby can also use EventMachine to perform I/O, if it is available on the
|
|
80
|
+
#platform - but it must be enabled through the Dnsruby::Resolver class
|
|
81
|
+
#
|
|
82
|
+
#== DNSSEC
|
|
83
|
+
#Dnsruby supports DNSSEC and NSEC3.
|
|
84
|
+
#DNSSEC support is on by default, but applications which wish to verify
|
|
85
|
+
#responses locally will need to make explicit verification calls.
|
|
86
|
+
#See Dnsruby::Dnssec for more details.
|
|
87
|
+
#
|
|
88
|
+
#== Bugs
|
|
89
|
+
#* NIS is not supported.
|
|
90
|
+
#* /etc/nsswitch.conf is not supported.
|
|
91
|
+
#* IPv6 is not supported.
|
|
92
|
+
module Dnsruby
|
|
93
|
+
class OpCode < CodeMapper
|
|
94
|
+
Query = 0 # RFC 1035
|
|
95
|
+
IQuery = 1 # RFC 1035
|
|
96
|
+
Status = 2 # RFC 1035
|
|
97
|
+
Notify = 4 # RFC 1996
|
|
98
|
+
Update = 5 # RFC 2136
|
|
99
|
+
|
|
100
|
+
update()
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
class RCode < CodeMapper
|
|
104
|
+
NOERROR = 0 # RFC 1035
|
|
105
|
+
FORMERR = 1 # RFC 1035
|
|
106
|
+
SERVFAIL = 2 # RFC 1035
|
|
107
|
+
NXDOMAIN = 3 # RFC 1035
|
|
108
|
+
NOTIMP = 4 # RFC 1035
|
|
109
|
+
REFUSED = 5 # RFC 1035
|
|
110
|
+
YXDOMAIN = 6 # RFC 2136
|
|
111
|
+
YXRRSET = 7 # RFC 2136
|
|
112
|
+
NXRRSET = 8 # RFC 2136
|
|
113
|
+
NOTAUTH = 9 # RFC 2136
|
|
114
|
+
NOTZONE = 10 # RFC 2136
|
|
115
|
+
|
|
116
|
+
BADVERS = 16
|
|
117
|
+
BADSIG = 16
|
|
118
|
+
BADKEY = 17
|
|
119
|
+
BADTIME = 18
|
|
120
|
+
BADMODE = 19
|
|
121
|
+
BADNAME = 20
|
|
122
|
+
BADALG = 21
|
|
123
|
+
|
|
124
|
+
update()
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
class Classes < CodeMapper
|
|
128
|
+
IN = 1 # RFC 1035
|
|
129
|
+
CH = 3 # RFC 1035
|
|
130
|
+
# CHAOS = 3 # RFC 1035
|
|
131
|
+
HS = 4 # RFC 1035
|
|
132
|
+
# HESIOD = 4 # RFC 1035
|
|
133
|
+
NONE = 254 # RFC 2136
|
|
134
|
+
ANY = 255 # RFC 1035
|
|
135
|
+
update()
|
|
136
|
+
|
|
137
|
+
def unknown_string(arg)
|
|
138
|
+
if (arg=~/^CLASS/i)
|
|
139
|
+
Classes.add_pair(arg, arg.gsub('CLASS', '').to_i)
|
|
140
|
+
set_string(arg)
|
|
141
|
+
else
|
|
142
|
+
raise ArgumentError.new("String #{arg} not a member of #{self.class}")
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def unknown_code(arg)
|
|
147
|
+
Classes.add_pair('CLASS' + arg.to_s, arg)
|
|
148
|
+
set_code(arg)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# classesbyval and classesbyname functions are wrappers around the
|
|
152
|
+
# similarly named hashes. They are used for 'unknown' DNS RR classess
|
|
153
|
+
# (RFC3597)
|
|
154
|
+
# See typesbyval and typesbyname, these beasts have the same functionality
|
|
155
|
+
def Classes.classesbyname(name) #:nodoc: all
|
|
156
|
+
name.upcase!;
|
|
157
|
+
if to_code(name)
|
|
158
|
+
return to_code(name)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
if ((name =~/^\s*CLASS(\d+)\s*$/o) == nil)
|
|
162
|
+
raise ArgumentError, "classesbyval() argument is not CLASS### (#{name})"
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
val = $1.to_i
|
|
166
|
+
if val > 0xffff
|
|
167
|
+
raise ArgumentError, 'classesbyval() argument larger than ' + 0xffff
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
return val;
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def Classes.classesbyval(val) #:nodoc: all
|
|
176
|
+
if (val.class == String)
|
|
177
|
+
if ((val =~ /^\s*0*([0-9]+)\s*$/) == nil)
|
|
178
|
+
raise ArgumentError, "classesbybal() argument is not numeric (#{val})" # unless val.gsub!("^\s*0*([0-9]+)\s*$", "$1")
|
|
179
|
+
# val =~ s/^\s*0*([0-9]+)\s*$/$1/o;#
|
|
180
|
+
end
|
|
181
|
+
val = $1.to_i
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
return to_string(val) if to_string(val)
|
|
185
|
+
|
|
186
|
+
raise ArgumentError, 'classesbyval() argument larger than ' + 0xffff if val > 0xffff;
|
|
187
|
+
|
|
188
|
+
return "CLASS#{val}";
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
# The RR types explicitly supported by Dnsruby.
|
|
193
|
+
#
|
|
194
|
+
# New RR types should be added to this set
|
|
195
|
+
class Types < CodeMapper
|
|
196
|
+
SIGZERO = 0 # RFC2931 consider this a pseudo type
|
|
197
|
+
A = 1 # RFC 1035, Section 3.4.1
|
|
198
|
+
NS = 2 # RFC 1035, Section 3.3.11
|
|
199
|
+
MD = 3 # RFC 1035, Section 3.3.4 (obsolete)
|
|
200
|
+
MF = 4 # RFC 1035, Section 3.3.5 (obsolete)
|
|
201
|
+
CNAME = 5 # RFC 1035, Section 3.3.1
|
|
202
|
+
SOA = 6 # RFC 1035, Section 3.3.13
|
|
203
|
+
MB = 7 # RFC 1035, Section 3.3.3
|
|
204
|
+
MG = 8 # RFC 1035, Section 3.3.6
|
|
205
|
+
MR = 9 # RFC 1035, Section 3.3.8
|
|
206
|
+
NULL = 10 # RFC 1035, Section 3.3.10
|
|
207
|
+
WKS = 11 # RFC 1035, Section 3.4.2 (deprecated)
|
|
208
|
+
PTR = 12 # RFC 1035, Section 3.3.12
|
|
209
|
+
HINFO = 13 # RFC 1035, Section 3.3.2
|
|
210
|
+
MINFO = 14 # RFC 1035, Section 3.3.7
|
|
211
|
+
MX = 15 # RFC 1035, Section 3.3.9
|
|
212
|
+
TXT = 16 # RFC 1035, Section 3.3.14
|
|
213
|
+
RP = 17 # RFC 1183, Section 2.2
|
|
214
|
+
AFSDB = 18 # RFC 1183, Section 1
|
|
215
|
+
X25 = 19 # RFC 1183, Section 3.1
|
|
216
|
+
ISDN = 20 # RFC 1183, Section 3.2
|
|
217
|
+
RT = 21 # RFC 1183, Section 3.3
|
|
218
|
+
NSAP = 22 # RFC 1706, Section 5
|
|
219
|
+
NSAP_PTR = 23 # RFC 1348 (obsolete)
|
|
220
|
+
SIG = 24 # RFC 2535, Section 4.1
|
|
221
|
+
KEY = 25 # RFC 2535, Section 3.1
|
|
222
|
+
PX = 26 # RFC 2163,
|
|
223
|
+
GPOS = 27 # RFC 1712 (obsolete)
|
|
224
|
+
AAAA = 28 # RFC 1886, Section 2.1
|
|
225
|
+
LOC = 29 # RFC 1876
|
|
226
|
+
NXT = 30 # RFC 2535, Section 5.2 obsoleted by RFC3755
|
|
227
|
+
EID = 31 # draft-ietf-nimrod-dns-xx.txt
|
|
228
|
+
NIMLOC = 32 # draft-ietf-nimrod-dns-xx.txt
|
|
229
|
+
SRV = 33 # RFC 2052
|
|
230
|
+
ATMA = 34 # ???
|
|
231
|
+
NAPTR = 35 # RFC 2168
|
|
232
|
+
KX = 36 # RFC 2230
|
|
233
|
+
CERT = 37 # RFC 2538
|
|
234
|
+
DNAME = 39 # RFC 2672
|
|
235
|
+
OPT = 41 # RFC 2671
|
|
236
|
+
DS = 43 # RFC 4034
|
|
237
|
+
SSHFP = 44 # RFC 4255
|
|
238
|
+
IPSECKEY = 45 # RFC 4025
|
|
239
|
+
RRSIG = 46 # RFC 4034
|
|
240
|
+
NSEC = 47 # RFC 4034
|
|
241
|
+
DNSKEY = 48 # RFC 4034
|
|
242
|
+
DHCID = 49 # RFC 4701
|
|
243
|
+
NSEC3 = 50 # RFC still pending at time of writing
|
|
244
|
+
NSEC3PARAM= 51 # RFC still pending at time of writing
|
|
245
|
+
SPF = 99 # RFC 4408
|
|
246
|
+
UINFO = 100 # non-standard
|
|
247
|
+
UID = 101 # non-standard
|
|
248
|
+
GID = 102 # non-standard
|
|
249
|
+
UNSPEC = 103 # non-standard
|
|
250
|
+
TKEY = 249 # RFC 2930
|
|
251
|
+
TSIG = 250 # RFC 2931
|
|
252
|
+
IXFR = 251 # RFC 1995
|
|
253
|
+
AXFR = 252 # RFC 1035
|
|
254
|
+
MAILB = 253 # RFC 1035 (MB, MG, MR)
|
|
255
|
+
MAILA = 254 # RFC 1035 (obsolete - see MX)
|
|
256
|
+
ANY = 255 # RFC 1035
|
|
257
|
+
update()
|
|
258
|
+
|
|
259
|
+
def unknown_string(arg) #:nodoc: all
|
|
260
|
+
if (arg=~/^TYPE/i)
|
|
261
|
+
Types.add_pair(arg, arg.gsub('TYPE', '').to_i)
|
|
262
|
+
set_string(arg)
|
|
263
|
+
else
|
|
264
|
+
raise ArgumentError.new("String #{arg} not a member of #{self.class}")
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
def unknown_code(arg) #:nodoc: all
|
|
269
|
+
Types.add_pair('TYPE' + arg.to_s, arg)
|
|
270
|
+
set_code(arg)
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
#--
|
|
274
|
+
# typesbyval and typesbyname functions are wrappers around the similarly named
|
|
275
|
+
# hashes. They are used for 'unknown' DNS RR types (RFC3597)
|
|
276
|
+
# typesbyname returns they TYPEcode as a function of the TYPE
|
|
277
|
+
# mnemonic. If the TYPE mapping is not specified the generic mnemonic
|
|
278
|
+
# TYPE### is returned.
|
|
279
|
+
def Types.typesbyname(name) #:nodoc: all
|
|
280
|
+
name.upcase!
|
|
281
|
+
|
|
282
|
+
if to_code(name)
|
|
283
|
+
return to_code(name)
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
if ((name =~/^\s*TYPE(\d+)\s*$/o)==nil)
|
|
288
|
+
raise ArgumentError, "Net::DNS::typesbyname() argument (#{name}) is not TYPE###"
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
val = $1.to_i
|
|
292
|
+
if val > 0xffff
|
|
293
|
+
raise ArgumentError, 'Net::DNS::typesbyname() argument larger than ' + 0xffff
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
return val;
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
# typesbyval returns they TYPE mnemonic as a function of the TYPE
|
|
301
|
+
# code. If the TYPE mapping is not specified the generic mnemonic
|
|
302
|
+
# TYPE### is returned.
|
|
303
|
+
def Types.typesbyval(val) #:nodoc: all
|
|
304
|
+
if (!defined?val)
|
|
305
|
+
raise ArgumentError, "Net::DNS::typesbyval() argument is not defined"
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
if val.class == String
|
|
309
|
+
# if val.gsub!("^\s*0*(\d+)\s*$", "$1")
|
|
310
|
+
if ((val =~ /^\s*0*(\d+)\s*$", "$1/o) == nil)
|
|
311
|
+
raise ArgumentError, "Net::DNS::typesbyval() argument (#{val}) is not numeric"
|
|
312
|
+
# val =~s/^\s*0*(\d+)\s*$/$1/o;
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
val = $1.to_i
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
if to_string(val)
|
|
320
|
+
return to_string(val)
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
raise ArgumentError, 'Net::DNS::typesbyval() argument larger than ' + 0xffff if
|
|
324
|
+
val > 0xffff;
|
|
325
|
+
|
|
326
|
+
return "TYPE#{val}";
|
|
327
|
+
end
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
class QTypes < CodeMapper
|
|
331
|
+
IXFR = 251 # incremental transfer [RFC1995]
|
|
332
|
+
AXFR = 252 # transfer of an entire zone [RFC1035]
|
|
333
|
+
MAILB = 253 # mailbox-related RRs (MB, MG or MR) [RFC1035]
|
|
334
|
+
MAILA = 254 # mail agent RRs (Obsolete - see MX) [RFC1035]
|
|
335
|
+
ANY = 255 # all records [RFC1035]
|
|
336
|
+
update()
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
class MetaTypes < CodeMapper
|
|
340
|
+
TKEY = 249 # Transaction Key [RFC2930]
|
|
341
|
+
TSIG = 250 # Transaction Signature [RFC2845]
|
|
342
|
+
OPT = 41 # RFC 2671
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
class Algorithms < CodeMapper
|
|
346
|
+
RSAMD5 = 1
|
|
347
|
+
DH = 2
|
|
348
|
+
DSA = 3
|
|
349
|
+
ECC = 4
|
|
350
|
+
RSASHA1 = 5
|
|
351
|
+
DSANSEC3SHA1 = 131
|
|
352
|
+
RSASHA1NSEC3SHA1 = 133
|
|
353
|
+
INDIRECT = 252
|
|
354
|
+
PRIVATEDNS = 253
|
|
355
|
+
PRIVATEOID = 254
|
|
356
|
+
update()
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
#An error raised while querying for a resource
|
|
360
|
+
class ResolvError < StandardError
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
#A timeout error raised while querying for a resource
|
|
364
|
+
class ResolvTimeout < TimeoutError
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
#The requested domain does not exist
|
|
368
|
+
class NXDomain < ResolvError
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
#A format error in a received DNS message
|
|
372
|
+
class FormErr < ResolvError
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
#Indicates a failure in the remote resolver
|
|
376
|
+
class ServFail < ResolvError
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
#The requested operation is not implemented in the remote resolver
|
|
380
|
+
class NotImp < ResolvError
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
#The requested operation was refused by the remote resolver
|
|
384
|
+
class Refused < ResolvError
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
#Another kind of resolver error has occurred
|
|
388
|
+
class OtherResolvError < ResolvError
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
#Indicates an error in decoding an incoming DNS message
|
|
392
|
+
class DecodeError < ResolvError
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
#Indicates an error encoding a DNS message for transmission
|
|
396
|
+
class EncodeError < ResolvError
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
#Indicates an error verifying
|
|
400
|
+
class VerifyError < ResolvError
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
#The Resolv class can be used to resolve addresses using /etc/hosts and /etc/resolv.conf,
|
|
404
|
+
#
|
|
405
|
+
#The DNS class may be used to perform more queries. If greater control over the sending
|
|
406
|
+
#of packets is required, then the Resolver or SingleResolver classes may be used.
|
|
407
|
+
class Resolv
|
|
408
|
+
|
|
409
|
+
#Looks up the first IP address for +name+
|
|
410
|
+
def self.getaddress(name)
|
|
411
|
+
DefaultResolver.getaddress(name)
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
#Looks up all IP addresses for +name+
|
|
415
|
+
def self.getaddresses(name)
|
|
416
|
+
DefaultResolver.getaddresses(name)
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
#Iterates over all IP addresses for +name+
|
|
420
|
+
def self.each_address(name, &block)
|
|
421
|
+
DefaultResolver.each_address(name, &block)
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
#Looks up the first hostname of +address+
|
|
425
|
+
def self.getname(address)
|
|
426
|
+
DefaultResolver.getname(address)
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
#Looks up all hostnames of +address+
|
|
430
|
+
def self.getnames(address)
|
|
431
|
+
DefaultResolver.getnames(address)
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
#Iterates over all hostnames of +address+
|
|
435
|
+
def self.each_name(address, &proc)
|
|
436
|
+
DefaultResolver.each_name(address, &proc)
|
|
437
|
+
end
|
|
438
|
+
|
|
439
|
+
#Creates a new Resolv using +resolvers+
|
|
440
|
+
def initialize(resolvers=[Hosts.new, DNS.new])
|
|
441
|
+
@resolvers = resolvers
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
#Looks up the first IP address for +name+
|
|
445
|
+
def getaddress(name)
|
|
446
|
+
each_address(name) {|address| return address}
|
|
447
|
+
raise ResolvError.new("no address for #{name}")
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
#Looks up all IP addresses for +name+
|
|
451
|
+
def getaddresses(name)
|
|
452
|
+
ret = []
|
|
453
|
+
each_address(name) {|address| ret << address}
|
|
454
|
+
return ret
|
|
455
|
+
end
|
|
456
|
+
|
|
457
|
+
#Iterates over all IP addresses for +name+
|
|
458
|
+
def each_address(name)
|
|
459
|
+
if AddressRegex =~ name
|
|
460
|
+
yield name
|
|
461
|
+
return
|
|
462
|
+
end
|
|
463
|
+
yielded = false
|
|
464
|
+
@resolvers.each {|r|
|
|
465
|
+
r.each_address(name) {|address|
|
|
466
|
+
yield address.to_s
|
|
467
|
+
yielded = true
|
|
468
|
+
}
|
|
469
|
+
return if yielded
|
|
470
|
+
}
|
|
471
|
+
end
|
|
472
|
+
|
|
473
|
+
#Looks up the first hostname of +address+
|
|
474
|
+
def getname(address)
|
|
475
|
+
each_name(address) {|name| return name}
|
|
476
|
+
raise ResolvError.new("no name for #{address}")
|
|
477
|
+
end
|
|
478
|
+
|
|
479
|
+
#Looks up all hostnames of +address+
|
|
480
|
+
def getnames(address)
|
|
481
|
+
ret = []
|
|
482
|
+
each_name(address) {|name| ret << name}
|
|
483
|
+
return ret
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
#Iterates over all hostnames of +address+
|
|
487
|
+
def each_name(address)
|
|
488
|
+
yielded = false
|
|
489
|
+
@resolvers.each {|r|
|
|
490
|
+
r.each_name(address) {|name|
|
|
491
|
+
yield name.to_s
|
|
492
|
+
yielded = true
|
|
493
|
+
}
|
|
494
|
+
return if yielded
|
|
495
|
+
}
|
|
496
|
+
end
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
require 'Dnsruby/DNS'
|
|
500
|
+
require 'Dnsruby/Hosts'
|
|
501
|
+
require 'Dnsruby/message'
|
|
502
|
+
require 'Dnsruby/update'
|
|
503
|
+
require 'Dnsruby/zone_transfer'
|
|
504
|
+
require 'Dnsruby/dnssec'
|
|
505
|
+
|
|
506
|
+
#Default Resolver to use for Dnsruby class methods
|
|
507
|
+
DefaultResolver = self.new
|
|
508
|
+
|
|
509
|
+
#Address RegExp to use for matching IP addresses
|
|
510
|
+
AddressRegex = /(?:#{IPv4::Regex})|(?:#{IPv6::Regex})/
|
|
511
|
+
end
|
|
512
|
+
end
|