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,961 @@
|
|
|
1
|
+
#--
|
|
2
|
+
#Copyright 2007 Nominet UK
|
|
3
|
+
#
|
|
4
|
+
#Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
#you may not use this file except in compliance with the License.
|
|
6
|
+
#You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
#Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
#distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
#See the License for the specific language governing permissions and
|
|
14
|
+
#limitations under the License.
|
|
15
|
+
#++
|
|
16
|
+
require 'Dnsruby/name'
|
|
17
|
+
require 'Dnsruby/resource/resource'
|
|
18
|
+
module Dnsruby
|
|
19
|
+
#===Defines a DNS packet.
|
|
20
|
+
#
|
|
21
|
+
#RFC 1035 Section 4.1, RFC 2136 Section 2, RFC 2845
|
|
22
|
+
#
|
|
23
|
+
#===Sections
|
|
24
|
+
#Message objects have five sections:
|
|
25
|
+
#
|
|
26
|
+
#* The header section, a Dnsruby::Header object.
|
|
27
|
+
#
|
|
28
|
+
# msg.header=Header.new(...)
|
|
29
|
+
# header = msg.header
|
|
30
|
+
#
|
|
31
|
+
#* The question section, an array of Dnsruby::Question objects.
|
|
32
|
+
#
|
|
33
|
+
# msg.add_question(Question.new(domain, type, klass))
|
|
34
|
+
# msg.each_question do |question| .... end
|
|
35
|
+
#
|
|
36
|
+
#* The answer section, an array of Dnsruby::RR objects.
|
|
37
|
+
#
|
|
38
|
+
# msg.add_answer(RR.create({:name => "a2.example.com",
|
|
39
|
+
# :type => "A", :address => "10.0.0.2"}))
|
|
40
|
+
# msg.each_answer {|answer| ... }
|
|
41
|
+
#
|
|
42
|
+
#* The authority section, an array of Dnsruby::RR objects.
|
|
43
|
+
#
|
|
44
|
+
# msg.add_authority(rr)
|
|
45
|
+
# msg.each_authority {|rr| ... }
|
|
46
|
+
#
|
|
47
|
+
#* The additional section, an array of Dnsruby::RR objects.
|
|
48
|
+
#
|
|
49
|
+
# msg.add_additional(rr)
|
|
50
|
+
# msg.each_additional {|rr| ... }
|
|
51
|
+
#
|
|
52
|
+
#In addition, each_resource iterates the answer, additional
|
|
53
|
+
#and authority sections :
|
|
54
|
+
#
|
|
55
|
+
# msg.each_resource {|rr| ... }
|
|
56
|
+
#
|
|
57
|
+
#===Packet format encoding
|
|
58
|
+
#
|
|
59
|
+
# Dnsruby::Message#encode
|
|
60
|
+
# Dnsruby::Message::decode(data)
|
|
61
|
+
class Message
|
|
62
|
+
class Section < Array
|
|
63
|
+
# Return the rrset of the specified type in this section
|
|
64
|
+
def rrset(type, klass=Classes::IN)
|
|
65
|
+
rrs = select{|rr|
|
|
66
|
+
(type_ok = rr.type==type)
|
|
67
|
+
if (rr.type == Types.RRSIG)
|
|
68
|
+
type_ok = (rr.type_covered == type)
|
|
69
|
+
end
|
|
70
|
+
type_ok && rr.klass == klass
|
|
71
|
+
}
|
|
72
|
+
rrset = RRSet.new
|
|
73
|
+
rrs.each do |rr|
|
|
74
|
+
rrset.add(rr)
|
|
75
|
+
end
|
|
76
|
+
return rrset
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Return an array of all the rrsets in the section
|
|
80
|
+
def rrsets
|
|
81
|
+
ret = []
|
|
82
|
+
each do |rr|
|
|
83
|
+
next if (rr.type == Types.OPT)
|
|
84
|
+
found_rrset = false
|
|
85
|
+
ret.each do |rrset|
|
|
86
|
+
found_rrset = rrset.add(rr)
|
|
87
|
+
break if found_rrset
|
|
88
|
+
end
|
|
89
|
+
if (!found_rrset)
|
|
90
|
+
ret.push(RRSet.new(rr))
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
return ret
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
#Create a new Message. Takes optional name, type and class
|
|
97
|
+
#
|
|
98
|
+
#type defaults to A, and klass defaults to IN
|
|
99
|
+
#
|
|
100
|
+
#* Dnsruby::Message.new("example.com") # defaults to A, IN
|
|
101
|
+
#* Dnsruby::Message.new("example.com", 'AAAA')
|
|
102
|
+
#* Dnsruby::Message.new("example.com", Dnsruby::Types.PTR, "HS")
|
|
103
|
+
#
|
|
104
|
+
def initialize(*args)
|
|
105
|
+
@header = Header.new()
|
|
106
|
+
@question = Section.new
|
|
107
|
+
@answer = Section.new
|
|
108
|
+
@authority = Section.new
|
|
109
|
+
@additional = Section.new
|
|
110
|
+
@tsigstate = :Unsigned
|
|
111
|
+
@signing = false
|
|
112
|
+
@tsigkey = nil
|
|
113
|
+
@answerfrom = nil
|
|
114
|
+
type = Types.A
|
|
115
|
+
klass = Classes.IN
|
|
116
|
+
if (args.length > 0)
|
|
117
|
+
name = args[0]
|
|
118
|
+
if (args.length > 1)
|
|
119
|
+
type = Types.new(args[1])
|
|
120
|
+
if (args.length > 2)
|
|
121
|
+
klass = Classes.new(args[2])
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
add_question(name, type, klass)
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
#The question section, an array of Dnsruby::Question objects.
|
|
129
|
+
attr_reader :question
|
|
130
|
+
|
|
131
|
+
#The answer section, an array of Dnsruby::RR objects.
|
|
132
|
+
attr_reader :answer
|
|
133
|
+
#The authority section, an array of Dnsruby::RR objects.
|
|
134
|
+
attr_reader :authority
|
|
135
|
+
#The additional section, an array of Dnsruby::RR objects.
|
|
136
|
+
attr_reader :additional
|
|
137
|
+
#The header section, a Dnsruby::Header object.
|
|
138
|
+
attr_accessor :header
|
|
139
|
+
|
|
140
|
+
#If this Message is a response from a server, then answerfrom contains the address of the server
|
|
141
|
+
attr_accessor :answerfrom
|
|
142
|
+
|
|
143
|
+
#If this Message is a response from a server, then answersize contains the size of the response
|
|
144
|
+
attr_accessor :answersize
|
|
145
|
+
|
|
146
|
+
#If this message has been verified using a TSIG RR then tsigerror contains
|
|
147
|
+
#the error code returned by the TSIG verification. The error will be an RCode
|
|
148
|
+
attr_accessor :tsigerror
|
|
149
|
+
|
|
150
|
+
#Can be
|
|
151
|
+
#* :Unsigned - the default state
|
|
152
|
+
#* :Signed - the outgoing message has been signed
|
|
153
|
+
#* :Verified - the incoming message has been verified
|
|
154
|
+
#* :Intermediate - the incoming message is an intermediate envelope in a TCP session
|
|
155
|
+
#in which only every 100th envelope must be signed
|
|
156
|
+
#* :Failed - the incoming response failed verification
|
|
157
|
+
attr_accessor :tsigstate
|
|
158
|
+
|
|
159
|
+
#--
|
|
160
|
+
attr_accessor :tsigstart
|
|
161
|
+
#++
|
|
162
|
+
|
|
163
|
+
def ==(other)
|
|
164
|
+
ret = false
|
|
165
|
+
if (other.kind_of?Message)
|
|
166
|
+
ret = @header == other.header &&
|
|
167
|
+
@question == other.question &&
|
|
168
|
+
@answer == other.answer &&
|
|
169
|
+
@authority == other.authority &&
|
|
170
|
+
@additional == other.additional
|
|
171
|
+
end
|
|
172
|
+
return ret
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# # Return the rrset of the specified type in the section
|
|
176
|
+
# def rrset(type, klass=Classes::IN)
|
|
177
|
+
# [@answer, @authority, @additional].each do |section|
|
|
178
|
+
# if ((rrset = section.rrset(type, klass)).length > 0)
|
|
179
|
+
# return rrset
|
|
180
|
+
# end
|
|
181
|
+
# end
|
|
182
|
+
# return nil
|
|
183
|
+
# end
|
|
184
|
+
|
|
185
|
+
# Return a hash, with the section as key, and the RRSets in that
|
|
186
|
+
# section as the data : {section => section_rrs}
|
|
187
|
+
def section_rrsets
|
|
188
|
+
ret = {}
|
|
189
|
+
["answer", "authority", "additional"].each do |section|
|
|
190
|
+
ret[section] = self.send(section).rrsets
|
|
191
|
+
end
|
|
192
|
+
return ret
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
#Add a new Question to the Message. Takes either a Question,
|
|
196
|
+
#or a name, and an optional type and class.
|
|
197
|
+
#
|
|
198
|
+
#* msg.add_question(Question.new("example.com", 'MX'))
|
|
199
|
+
#* msg.add_question("example.com") # defaults to Types.A, Classes.IN
|
|
200
|
+
#* msg.add_question("example.com", Types.LOC)
|
|
201
|
+
def add_question(question, type=Types.A, klass=Classes.IN)
|
|
202
|
+
if (!question.kind_of?Question)
|
|
203
|
+
question = Question.new(question, type, klass)
|
|
204
|
+
end
|
|
205
|
+
@question << question
|
|
206
|
+
@header.qdcount = @question.length
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def each_question
|
|
210
|
+
@question.each {|rec|
|
|
211
|
+
yield rec
|
|
212
|
+
}
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def add_answer(rr) #:nodoc: all
|
|
217
|
+
if (!@answer.include?rr)
|
|
218
|
+
@answer << rr
|
|
219
|
+
@header.ancount = @answer.length
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def each_answer
|
|
224
|
+
@answer.each {|rec|
|
|
225
|
+
yield rec
|
|
226
|
+
}
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def add_authority(rr) #:nodoc: all
|
|
230
|
+
if (!@authority.include?rr)
|
|
231
|
+
@authority << rr
|
|
232
|
+
@header.nscount = @authority.length
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def each_authority
|
|
237
|
+
@authority.each {|rec|
|
|
238
|
+
yield rec
|
|
239
|
+
}
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
def add_additional(rr) #:nodoc: all
|
|
243
|
+
if (!@additional.include?rr)
|
|
244
|
+
@additional << rr
|
|
245
|
+
@header.arcount = @additional.length
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def each_additional
|
|
250
|
+
@additional.each {|rec|
|
|
251
|
+
yield rec
|
|
252
|
+
}
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
#Yields each section (question, answer, authority, additional)
|
|
256
|
+
def each_section
|
|
257
|
+
[@answer, @authority, @additional].each {|section| yield section}
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
#Calls each_answer, each_authority, each_additional
|
|
261
|
+
def each_resource
|
|
262
|
+
each_answer {|rec| yield rec}
|
|
263
|
+
each_authority {|rec| yield rec}
|
|
264
|
+
each_additional {|rec| yield rec}
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
# Returns the TSIG record from the ADDITIONAL section, if one is present.
|
|
268
|
+
def tsig
|
|
269
|
+
if (@additional.last)
|
|
270
|
+
if (@additional.last.rr_type == Types.TSIG)
|
|
271
|
+
return @additional.last
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
return nil
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
#Sets the TSIG to sign this message with. Can either be a Dnsruby::RR::TSIG
|
|
278
|
+
#object, or it can be a (name, key) tuple, or it can be a hash which takes
|
|
279
|
+
#Dnsruby::RR::TSIG attributes (e.g. name, key, fudge, etc.)
|
|
280
|
+
def set_tsig(*args)
|
|
281
|
+
if (args.length == 1)
|
|
282
|
+
if (args[0].instance_of?RR::TSIG)
|
|
283
|
+
@tsigkey = args[0]
|
|
284
|
+
elsif (args[0].instance_of?Hash)
|
|
285
|
+
@tsigkey = RR.create({:type=>'TSIG', :klass=>'ANY'}.merge(args[0]))
|
|
286
|
+
else
|
|
287
|
+
raise ArgumentError.new("Wrong type of argument to Dnsruby::Message#set_tsig - should be TSIG or Hash")
|
|
288
|
+
end
|
|
289
|
+
elsif (args.length == 2)
|
|
290
|
+
@tsigkey = RR.create({:type=>'TSIG', :klass=>'ANY', :name=>args[0], :key=>args[1]})
|
|
291
|
+
else
|
|
292
|
+
raise ArgumentError.new("Wrong number of arguments to Dnsruby::Message#set_tsig")
|
|
293
|
+
end
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
#Was this message signed by a TSIG?
|
|
297
|
+
def signed?
|
|
298
|
+
return (@tsigstate == :Signed ||
|
|
299
|
+
@tsigstate == :Verified ||
|
|
300
|
+
@tsigstate == :Failed)
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
#If this message was signed by a TSIG, was the TSIG verified?
|
|
304
|
+
def verified?
|
|
305
|
+
return (@tsigstate == :Verified)
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
def to_s
|
|
309
|
+
retval = "";
|
|
310
|
+
|
|
311
|
+
if (@answerfrom != nil && @answerfrom != "")
|
|
312
|
+
retval = retval + ";; Answer received from #{@answerfrom} (#{@answersize} bytes)\n;;\n";
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
retval = retval + ";; HEADER SECTION\n";
|
|
316
|
+
retval = retval + @header.to_s;
|
|
317
|
+
retval = retval + "\n";
|
|
318
|
+
|
|
319
|
+
# @TODO@ OPT pseudosection? EDNS flags, udpsize
|
|
320
|
+
|
|
321
|
+
section = (@header.opcode == OpCode.UPDATE) ? "ZONE" : "QUESTION";
|
|
322
|
+
retval = retval + ";; #{section} SECTION (#{@header.qdcount} record#{@header.qdcount == 1 ? '' : 's'})\n";
|
|
323
|
+
each_question { |qr|
|
|
324
|
+
retval = retval + ";; #{qr.to_s}\n";
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
retval = retval + "\n";
|
|
328
|
+
section = (@header.opcode == OpCode.UPDATE) ? "PREREQUISITE" : "ANSWER";
|
|
329
|
+
retval = retval + ";; #{section} SECTION (#{@header.ancount} record#{@header.ancount == 1 ? '' : 's'})\n";
|
|
330
|
+
each_answer { |rr|
|
|
331
|
+
retval = retval + rr.to_s + "\n";
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
retval = retval + "\n";
|
|
335
|
+
section = (@header.opcode == OpCode.UPDATE) ? "UPDATE" : "AUTHORITY";
|
|
336
|
+
retval = retval + ";; #{section} SECTION (#{@header.nscount} record#{@header.nscount == 1 ? '' : 's'})\n";
|
|
337
|
+
each_authority { |rr|
|
|
338
|
+
retval = retval + rr.to_s + "\n";
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
retval = retval + "\n";
|
|
342
|
+
retval = retval + ";; ADDITIONAL SECTION (#{@header.arcount} record#{@header.arcount == 1 ? '' : 's'})\n";
|
|
343
|
+
each_additional { |rr|
|
|
344
|
+
retval = retval + rr.to_s+ "\n";
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
return retval;
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
#Signs the message. If used with no arguments, then the message must have already
|
|
351
|
+
#been set (set_tsig). Otherwise, the arguments can either be a Dnsruby::RR::TSIG
|
|
352
|
+
#object, or a (name, key) tuple, or a hash which takes
|
|
353
|
+
#Dnsruby::RR::TSIG attributes (e.g. name, key, fudge, etc.)
|
|
354
|
+
#
|
|
355
|
+
#NOTE that this method should only be called by the resolver, rather than the
|
|
356
|
+
#client code. To use signing from the client, call Dnsruby::Resolver#tsig=
|
|
357
|
+
def sign!(*args) #:nodoc: all
|
|
358
|
+
if (args.length > 0)
|
|
359
|
+
set_tsig(*args)
|
|
360
|
+
sign!
|
|
361
|
+
else
|
|
362
|
+
if ((@tsigkey) && @tsigstate == :Unsigned)
|
|
363
|
+
@tsigkey.apply(self)
|
|
364
|
+
end
|
|
365
|
+
end
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
#Return the encoded form of the message
|
|
369
|
+
# If there is a TSIG record present and the record has not been signed
|
|
370
|
+
# then sign it
|
|
371
|
+
def encode
|
|
372
|
+
if ((@tsigkey) && @tsigstate == :Unsigned && !@signing)
|
|
373
|
+
@signing = true
|
|
374
|
+
sign!
|
|
375
|
+
@signing = false
|
|
376
|
+
end
|
|
377
|
+
return MessageEncoder.new {|msg|
|
|
378
|
+
header = @header
|
|
379
|
+
header.encode(msg)
|
|
380
|
+
@question.each {|q|
|
|
381
|
+
msg.put_name(q.qname)
|
|
382
|
+
msg.put_pack('nn', q.qtype.code, q.qclass.code)
|
|
383
|
+
}
|
|
384
|
+
[@answer, @authority, @additional].each {|rr|
|
|
385
|
+
rr.each { |r|
|
|
386
|
+
msg.put_rr(r)
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}.to_s
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
#Decode the encoded message
|
|
393
|
+
def Message.decode(m)
|
|
394
|
+
o = Message.new()
|
|
395
|
+
MessageDecoder.new(m) {|msg|
|
|
396
|
+
o.header = Header.new(msg)
|
|
397
|
+
o.header.qdcount.times {
|
|
398
|
+
question = msg.get_question
|
|
399
|
+
o.question << question
|
|
400
|
+
}
|
|
401
|
+
o.header.ancount.times {
|
|
402
|
+
rr = msg.get_rr
|
|
403
|
+
o.answer << rr
|
|
404
|
+
}
|
|
405
|
+
o.header.nscount.times {
|
|
406
|
+
rr = msg.get_rr
|
|
407
|
+
o.authority << rr
|
|
408
|
+
}
|
|
409
|
+
o.header.arcount.times { |count|
|
|
410
|
+
start = msg.index
|
|
411
|
+
rr = msg.get_rr
|
|
412
|
+
if (rr.type == Types.TSIG)
|
|
413
|
+
if (count!=o.header.arcount-1)
|
|
414
|
+
TheLog.Error("Incoming message has TSIG record before last record")
|
|
415
|
+
raise DecodeError.new("TSIG record present before last record")
|
|
416
|
+
end
|
|
417
|
+
o.tsigstart = start # needed for TSIG verification
|
|
418
|
+
end
|
|
419
|
+
o.additional << rr
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
return o
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
#In dynamic update packets, the question section is known as zone and
|
|
426
|
+
#specifies the zone to be updated.
|
|
427
|
+
alias :zone :question
|
|
428
|
+
alias :add_zone :add_question
|
|
429
|
+
alias :each_zone :each_question
|
|
430
|
+
#In dynamic update packets, the answer section is known as pre or
|
|
431
|
+
#prerequisite and specifies the RRs or RRsets which must or
|
|
432
|
+
#must not preexist.
|
|
433
|
+
alias :pre :answer
|
|
434
|
+
alias :add_pre :add_answer
|
|
435
|
+
alias :each_pre :each_answer
|
|
436
|
+
#In dynamic update packets, the answer section is known as pre or
|
|
437
|
+
#prerequisite and specifies the RRs or RRsets which must or
|
|
438
|
+
#must not preexist.
|
|
439
|
+
alias :prerequisite :pre
|
|
440
|
+
alias :add_prerequisite :add_pre
|
|
441
|
+
alias :each_prerequisite :each_pre
|
|
442
|
+
#In dynamic update packets, the authority section is known as update and
|
|
443
|
+
#specifies the RRs or RRsets to be added or delted.
|
|
444
|
+
alias :update :authority
|
|
445
|
+
alias :add_update :add_authority
|
|
446
|
+
alias :each_update :each_authority
|
|
447
|
+
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
#The header portion of a DNS packet
|
|
451
|
+
#
|
|
452
|
+
#RFC 1035 Section 4.1.1
|
|
453
|
+
class Header
|
|
454
|
+
MAX_ID = 65535
|
|
455
|
+
|
|
456
|
+
# The header ID
|
|
457
|
+
attr_accessor :id
|
|
458
|
+
|
|
459
|
+
#The query response flag
|
|
460
|
+
attr_accessor :qr
|
|
461
|
+
|
|
462
|
+
#Authoritative answer flag
|
|
463
|
+
attr_accessor :aa
|
|
464
|
+
|
|
465
|
+
#Truncated flag
|
|
466
|
+
attr_accessor :tc
|
|
467
|
+
|
|
468
|
+
#Recursion Desired flag
|
|
469
|
+
attr_accessor :rd
|
|
470
|
+
|
|
471
|
+
#The Checking Disabled flag
|
|
472
|
+
attr_accessor :cd
|
|
473
|
+
|
|
474
|
+
#The Authenticated Data flag
|
|
475
|
+
attr_accessor :ad
|
|
476
|
+
|
|
477
|
+
#Relevant in DNSSEC context.
|
|
478
|
+
#
|
|
479
|
+
#(The AD bit is only set on answers where signatures have been
|
|
480
|
+
#cryptographically verified or the server is authoritative for the data
|
|
481
|
+
#and is allowed to set the bit by policy.)
|
|
482
|
+
attr_accessor :ad
|
|
483
|
+
|
|
484
|
+
#The query response flag
|
|
485
|
+
attr_accessor :qr
|
|
486
|
+
|
|
487
|
+
#Recursion available flag
|
|
488
|
+
attr_accessor :ra
|
|
489
|
+
|
|
490
|
+
#Query response code
|
|
491
|
+
attr_reader :rcode
|
|
492
|
+
|
|
493
|
+
# The header opcode
|
|
494
|
+
attr_reader :opcode
|
|
495
|
+
|
|
496
|
+
#The number of records in the question section of the message
|
|
497
|
+
attr_accessor :qdcount
|
|
498
|
+
#The number of records in the authoriy section of the message
|
|
499
|
+
attr_accessor :nscount
|
|
500
|
+
#The number of records in the answer section of the message
|
|
501
|
+
attr_accessor :ancount
|
|
502
|
+
#The number of records in the additional record section og the message
|
|
503
|
+
attr_accessor :arcount
|
|
504
|
+
|
|
505
|
+
def initialize(*args)
|
|
506
|
+
if (args.length == 0)
|
|
507
|
+
@id = rand(MAX_ID)
|
|
508
|
+
@qr = false
|
|
509
|
+
@opcode=OpCode.Query
|
|
510
|
+
@aa = false
|
|
511
|
+
@ad=false
|
|
512
|
+
@tc = false
|
|
513
|
+
@rd = false # recursion desired
|
|
514
|
+
@ra = false # recursion available
|
|
515
|
+
@cd=false
|
|
516
|
+
@rcode=RCode.NoError
|
|
517
|
+
@qdcount = 0
|
|
518
|
+
@nscount = 0
|
|
519
|
+
@ancount = 0
|
|
520
|
+
@arcount = 0
|
|
521
|
+
elsif (args.length == 1)
|
|
522
|
+
decode(args[0])
|
|
523
|
+
end
|
|
524
|
+
end
|
|
525
|
+
|
|
526
|
+
def opcode=(op)
|
|
527
|
+
@opcode = OpCode.new(op)
|
|
528
|
+
end
|
|
529
|
+
|
|
530
|
+
def rcode=(rcode)
|
|
531
|
+
@rcode = RCode.new(rcode)
|
|
532
|
+
end
|
|
533
|
+
|
|
534
|
+
def Header.new_from_data(data)
|
|
535
|
+
header = Header.new
|
|
536
|
+
MessageDecoder.new(data) {|msg|
|
|
537
|
+
header.decode(msg)}
|
|
538
|
+
return header
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
def data
|
|
542
|
+
return MessageEncoder.new {|msg|
|
|
543
|
+
self.encode(msg)
|
|
544
|
+
}.to_s
|
|
545
|
+
end
|
|
546
|
+
|
|
547
|
+
def encode(msg)
|
|
548
|
+
msg.put_pack('nnnnnn',
|
|
549
|
+
@id,
|
|
550
|
+
(@qr ? 1:0) << 15 |
|
|
551
|
+
(@opcode.code & 15) << 11 |
|
|
552
|
+
(@aa ? 1:0) << 10 |
|
|
553
|
+
(@tc ? 1:0) << 9 |
|
|
554
|
+
(@rd ? 1:0) << 8 |
|
|
555
|
+
(@ra ? 1:0) << 7 |
|
|
556
|
+
(@ad ? 1:0) << 5 |
|
|
557
|
+
(@cd ? 1:0) << 4 |
|
|
558
|
+
(@rcode.code & 15),
|
|
559
|
+
@qdcount,
|
|
560
|
+
@ancount,
|
|
561
|
+
@nscount,
|
|
562
|
+
@arcount)
|
|
563
|
+
end
|
|
564
|
+
|
|
565
|
+
def Header.decrement_arcount_encoded(bytes)
|
|
566
|
+
header = Header.new
|
|
567
|
+
header_end = 0
|
|
568
|
+
MessageDecoder.new(bytes) {|msg|
|
|
569
|
+
header.decode(msg)
|
|
570
|
+
header_end = msg.index
|
|
571
|
+
}
|
|
572
|
+
header.arcount = header.arcount - 1
|
|
573
|
+
bytes[0,header_end]=MessageEncoder.new {|msg|
|
|
574
|
+
header.encode(msg)}.to_s
|
|
575
|
+
return bytes
|
|
576
|
+
end
|
|
577
|
+
|
|
578
|
+
def ==(other)
|
|
579
|
+
return @qr == other.qr &&
|
|
580
|
+
@opcode == other.opcode &&
|
|
581
|
+
@aa == other.aa &&
|
|
582
|
+
@tc == other.tc &&
|
|
583
|
+
@rd == other.rd &&
|
|
584
|
+
@ra == other.ra &&
|
|
585
|
+
@cd == other.cd &&
|
|
586
|
+
@ad == other.ad &&
|
|
587
|
+
@rcode == other.rcode
|
|
588
|
+
end
|
|
589
|
+
|
|
590
|
+
def to_s
|
|
591
|
+
retval = ";; id = #{@id}\n";
|
|
592
|
+
|
|
593
|
+
if (@opcode == OpCode::Update)
|
|
594
|
+
retval += ";; qr = #{@qr} " +\
|
|
595
|
+
"opcode = #{@opcode.string} "+\
|
|
596
|
+
"rcode = #{@rcode.string}\n";
|
|
597
|
+
|
|
598
|
+
retval += ";; zocount = #{@qdcount} "+\
|
|
599
|
+
"prcount = #{@ancount} " +\
|
|
600
|
+
"upcount = #{@nscount} " +\
|
|
601
|
+
"adcount = #{@arcount}\n";
|
|
602
|
+
else
|
|
603
|
+
retval += ";; qr = #{@qr} " +\
|
|
604
|
+
"opcode = #{@opcode.string} " +\
|
|
605
|
+
"aa = #{@aa} " +\
|
|
606
|
+
"tc = #{@tc} " +\
|
|
607
|
+
"rd = #{@rd}\n";
|
|
608
|
+
|
|
609
|
+
retval += ";; ra = #{@ra} " +\
|
|
610
|
+
"ad = #{@ad} " +\
|
|
611
|
+
"cd = #{@cd} " +\
|
|
612
|
+
"rcode = #{@rcode.string}\n";
|
|
613
|
+
|
|
614
|
+
retval += ";; qdcount = #{@qdcount} " +\
|
|
615
|
+
"ancount = #{@ancount} " +\
|
|
616
|
+
"nscount = #{@nscount} " +\
|
|
617
|
+
"arcount = #{@arcount}\n";
|
|
618
|
+
end
|
|
619
|
+
|
|
620
|
+
return retval;
|
|
621
|
+
end
|
|
622
|
+
|
|
623
|
+
def decode(msg)
|
|
624
|
+
@id, flag, @qdcount, @ancount, @nscount, @arcount =
|
|
625
|
+
msg.get_unpack('nnnnnn')
|
|
626
|
+
@qr = (((flag >> 15)&1)==1)?true:false
|
|
627
|
+
@opcode = OpCode.new((flag >> 11) & 15)
|
|
628
|
+
@aa = (((flag >> 10)&1)==1)?true:false
|
|
629
|
+
@tc = (((flag >> 9)&1)==1)?true:false
|
|
630
|
+
@rd = (((flag >> 8)&1)==1)?true:false
|
|
631
|
+
@ra = (((flag >> 7)&1)==1)?true:false
|
|
632
|
+
@ad = (((flag >> 5)&1)==1)?true:false
|
|
633
|
+
@cd = (((flag >> 4)&1)==1)?true:false
|
|
634
|
+
@rcode = RCode.new(flag & 15)
|
|
635
|
+
end
|
|
636
|
+
|
|
637
|
+
def get_exception
|
|
638
|
+
exception = nil
|
|
639
|
+
if (@rcode==RCode.NXDOMAIN)
|
|
640
|
+
exception = NXDomain.new
|
|
641
|
+
elsif (@rcode==RCode.SERVFAIL)
|
|
642
|
+
exception = ServFail.new
|
|
643
|
+
elsif (@rcode==RCode.FORMERR)
|
|
644
|
+
exception = FormErr.new
|
|
645
|
+
elsif (@rcode==RCode.NOTIMP)
|
|
646
|
+
exception = NotImp.new
|
|
647
|
+
elsif (@rcode==RCode.REFUSED)
|
|
648
|
+
exception = Refused.new
|
|
649
|
+
end
|
|
650
|
+
return exception
|
|
651
|
+
end
|
|
652
|
+
|
|
653
|
+
alias zocount qdcount
|
|
654
|
+
alias zocount= qdcount=
|
|
655
|
+
|
|
656
|
+
alias prcount ancount
|
|
657
|
+
alias prcount= ancount=
|
|
658
|
+
|
|
659
|
+
alias upcount nscount
|
|
660
|
+
alias upcount= nscount=
|
|
661
|
+
|
|
662
|
+
alias adcount arcount
|
|
663
|
+
alias adcount= arcount=
|
|
664
|
+
|
|
665
|
+
end
|
|
666
|
+
|
|
667
|
+
class MessageDecoder #:nodoc: all
|
|
668
|
+
attr_reader :index
|
|
669
|
+
def initialize(data)
|
|
670
|
+
@data = data
|
|
671
|
+
@index = 0
|
|
672
|
+
@limit = data.length
|
|
673
|
+
yield self
|
|
674
|
+
end
|
|
675
|
+
|
|
676
|
+
def has_remaining
|
|
677
|
+
return @limit-@index > 0
|
|
678
|
+
end
|
|
679
|
+
|
|
680
|
+
def get_length16
|
|
681
|
+
len, = self.get_unpack('n')
|
|
682
|
+
save_limit = @limit
|
|
683
|
+
@limit = @index + len
|
|
684
|
+
d = yield(len)
|
|
685
|
+
if @index < @limit
|
|
686
|
+
raise DecodeError.new("junk exists")
|
|
687
|
+
elsif @limit < @index
|
|
688
|
+
raise DecodeError.new("limit exceeded")
|
|
689
|
+
end
|
|
690
|
+
@limit = save_limit
|
|
691
|
+
return d
|
|
692
|
+
end
|
|
693
|
+
|
|
694
|
+
def get_bytes(len = @limit - @index)
|
|
695
|
+
d = @data[@index, len]
|
|
696
|
+
@index += len
|
|
697
|
+
return d
|
|
698
|
+
end
|
|
699
|
+
|
|
700
|
+
def get_unpack(template)
|
|
701
|
+
len = 0
|
|
702
|
+
template.each_byte {|byte|
|
|
703
|
+
case byte
|
|
704
|
+
when ?c, ?C
|
|
705
|
+
len += 1
|
|
706
|
+
when ?h, ?H
|
|
707
|
+
len += 1
|
|
708
|
+
when ?n
|
|
709
|
+
len += 2
|
|
710
|
+
when ?N
|
|
711
|
+
len += 4
|
|
712
|
+
when ?*
|
|
713
|
+
len = @limit-@index
|
|
714
|
+
else
|
|
715
|
+
raise StandardError.new("unsupported template: '#{byte.chr}' in '#{template}'")
|
|
716
|
+
end
|
|
717
|
+
}
|
|
718
|
+
raise DecodeError.new("limit exceeded") if @limit < @index + len
|
|
719
|
+
arr = @data.unpack("@#{@index}#{template}")
|
|
720
|
+
@index += len
|
|
721
|
+
return arr
|
|
722
|
+
end
|
|
723
|
+
|
|
724
|
+
def get_string
|
|
725
|
+
len = @data[@index]
|
|
726
|
+
raise DecodeError.new("limit exceeded") if @limit < @index + 1 + len
|
|
727
|
+
d = @data[@index + 1, len]
|
|
728
|
+
@index += 1 + len
|
|
729
|
+
return d
|
|
730
|
+
end
|
|
731
|
+
|
|
732
|
+
def get_string_list
|
|
733
|
+
strings = []
|
|
734
|
+
while @index < @limit
|
|
735
|
+
strings << self.get_string
|
|
736
|
+
end
|
|
737
|
+
strings
|
|
738
|
+
end
|
|
739
|
+
|
|
740
|
+
def get_name
|
|
741
|
+
return Name.new(self.get_labels)
|
|
742
|
+
end
|
|
743
|
+
|
|
744
|
+
def get_labels(limit=nil)
|
|
745
|
+
limit = @index if !limit || @index < limit
|
|
746
|
+
d = []
|
|
747
|
+
while true
|
|
748
|
+
case @data[@index]
|
|
749
|
+
when 0
|
|
750
|
+
@index += 1
|
|
751
|
+
return d
|
|
752
|
+
when 192..255
|
|
753
|
+
idx = self.get_unpack('n')[0] & 0x3fff
|
|
754
|
+
if limit <= idx
|
|
755
|
+
raise DecodeError.new("non-backward name pointer")
|
|
756
|
+
end
|
|
757
|
+
save_index = @index
|
|
758
|
+
@index = idx
|
|
759
|
+
d += self.get_labels(limit)
|
|
760
|
+
@index = save_index
|
|
761
|
+
return d
|
|
762
|
+
else
|
|
763
|
+
d << self.get_label
|
|
764
|
+
end
|
|
765
|
+
end
|
|
766
|
+
return d
|
|
767
|
+
end
|
|
768
|
+
|
|
769
|
+
def get_label
|
|
770
|
+
return Name::Label.new(Name::decode(self.get_string))
|
|
771
|
+
end
|
|
772
|
+
|
|
773
|
+
def get_question
|
|
774
|
+
name = self.get_name
|
|
775
|
+
type, klass = self.get_unpack("nn")
|
|
776
|
+
q = Question.new(name, type, klass)
|
|
777
|
+
return q
|
|
778
|
+
end
|
|
779
|
+
|
|
780
|
+
def get_rr
|
|
781
|
+
name = self.get_name
|
|
782
|
+
type, klass, ttl = self.get_unpack('nnN')
|
|
783
|
+
klass = Classes.new(klass)
|
|
784
|
+
typeclass = RR.get_class(type, klass)
|
|
785
|
+
# @TODO@ Trap decode errors here, and somehow mark the record as bad.
|
|
786
|
+
# Need some way to represent raw data only
|
|
787
|
+
rec = self.get_length16 {typeclass.decode_rdata(self)}
|
|
788
|
+
rec.name=name
|
|
789
|
+
rec.ttl=ttl
|
|
790
|
+
rec.type = type
|
|
791
|
+
rec.klass = klass
|
|
792
|
+
return rec
|
|
793
|
+
end
|
|
794
|
+
end
|
|
795
|
+
|
|
796
|
+
class MessageEncoder #:nodoc: all
|
|
797
|
+
def initialize
|
|
798
|
+
@data = ''
|
|
799
|
+
@names = {}
|
|
800
|
+
yield self
|
|
801
|
+
end
|
|
802
|
+
|
|
803
|
+
def to_s
|
|
804
|
+
return @data
|
|
805
|
+
end
|
|
806
|
+
|
|
807
|
+
def put_bytes(d)
|
|
808
|
+
@data << d
|
|
809
|
+
end
|
|
810
|
+
|
|
811
|
+
def put_pack(template, *d)
|
|
812
|
+
@data << d.pack(template)
|
|
813
|
+
end
|
|
814
|
+
|
|
815
|
+
def put_length16
|
|
816
|
+
length_index = @data.length
|
|
817
|
+
@data << "\0\0"
|
|
818
|
+
data_start = @data.length
|
|
819
|
+
yield
|
|
820
|
+
data_end = @data.length
|
|
821
|
+
@data[length_index, 2] = [data_end - data_start].pack("n")
|
|
822
|
+
end
|
|
823
|
+
|
|
824
|
+
def put_string(d)
|
|
825
|
+
self.put_pack("C", d.length)
|
|
826
|
+
@data << d
|
|
827
|
+
end
|
|
828
|
+
|
|
829
|
+
def put_string_list(ds)
|
|
830
|
+
ds.each {|d|
|
|
831
|
+
self.put_string(d)
|
|
832
|
+
}
|
|
833
|
+
end
|
|
834
|
+
|
|
835
|
+
def put_rr(rr, canonical=false)
|
|
836
|
+
# RFC4034 Section 6.2
|
|
837
|
+
put_name(rr.name, canonical)
|
|
838
|
+
put_pack("nnN", rr.type.code, rr.klass.code, rr.ttl)
|
|
839
|
+
put_length16 {rr.encode_rdata(self, canonical)}
|
|
840
|
+
end
|
|
841
|
+
|
|
842
|
+
def put_name(d, canonical=false)
|
|
843
|
+
if (canonical)
|
|
844
|
+
d = d.downcase
|
|
845
|
+
end
|
|
846
|
+
put_labels(d.to_a, canonical)
|
|
847
|
+
end
|
|
848
|
+
|
|
849
|
+
def put_labels(d, do_canonical)
|
|
850
|
+
d.each_index {|i|
|
|
851
|
+
domain = d[i..-1].join(".")
|
|
852
|
+
if (!do_canonical && (idx = @names[domain]))
|
|
853
|
+
self.put_pack("n", 0xc000 | idx)
|
|
854
|
+
return
|
|
855
|
+
else
|
|
856
|
+
@names[domain] = @data.length
|
|
857
|
+
first = d[i]
|
|
858
|
+
self.put_label(first)
|
|
859
|
+
end
|
|
860
|
+
}
|
|
861
|
+
@data << "\0"
|
|
862
|
+
end
|
|
863
|
+
|
|
864
|
+
|
|
865
|
+
def put_label(d)
|
|
866
|
+
s, = Name.encode(d)
|
|
867
|
+
raise RuntimeError, "length of #{s} is #{s.string.length} (larger than 63 octets)" if s.string.length > 63
|
|
868
|
+
self.put_string(s.string)
|
|
869
|
+
end
|
|
870
|
+
end
|
|
871
|
+
|
|
872
|
+
#A Dnsruby::Question object represents a record in the
|
|
873
|
+
#question section of a DNS packet.
|
|
874
|
+
#
|
|
875
|
+
#RFC 1035 Section 4.1.2
|
|
876
|
+
class Question
|
|
877
|
+
# The Question name
|
|
878
|
+
attr_reader :qname
|
|
879
|
+
# The Question type
|
|
880
|
+
attr_reader :qtype
|
|
881
|
+
# The Question class
|
|
882
|
+
attr_reader :qclass
|
|
883
|
+
|
|
884
|
+
#Creates a question object from the domain, type, and class passed
|
|
885
|
+
#as arguments.
|
|
886
|
+
#
|
|
887
|
+
#If a String is passed in, a Name, IPv4 or IPv6 object is created.
|
|
888
|
+
#
|
|
889
|
+
#If an IPv4 or IPv6 object is used then the type is set to PTR.
|
|
890
|
+
def initialize(*args)
|
|
891
|
+
if (args.length > 0)
|
|
892
|
+
@qtype = Types.A
|
|
893
|
+
if (args.length > 1)
|
|
894
|
+
@qtype = Types.new(args[1])
|
|
895
|
+
@qclass = Classes.IN
|
|
896
|
+
if (args.length > 2)
|
|
897
|
+
@qclass = Classes.new(args[2])
|
|
898
|
+
end
|
|
899
|
+
end
|
|
900
|
+
else
|
|
901
|
+
raise ArgumentError.new("Must pass at least a name!")
|
|
902
|
+
end
|
|
903
|
+
# If the name looks like an IP address then do an appropriate
|
|
904
|
+
# PTR query.
|
|
905
|
+
@qname=args[0]
|
|
906
|
+
case @qname
|
|
907
|
+
when IPv4::Regex
|
|
908
|
+
@qname = IPv4.create(@qname).to_name
|
|
909
|
+
@qtype = Types.PTR
|
|
910
|
+
when IPv6::Regex
|
|
911
|
+
@qname = IPv6.create(@qname).to_name
|
|
912
|
+
@qtype = Types.PTR
|
|
913
|
+
when Name
|
|
914
|
+
when IPv6
|
|
915
|
+
@qtype = Types.PTR
|
|
916
|
+
when IPv4
|
|
917
|
+
@qtype = Types.PTR
|
|
918
|
+
else
|
|
919
|
+
@qname = Name.create(@qname)
|
|
920
|
+
end
|
|
921
|
+
end
|
|
922
|
+
|
|
923
|
+
def qtype=(qtype)
|
|
924
|
+
@qtype = Types.new(qtype)
|
|
925
|
+
end
|
|
926
|
+
|
|
927
|
+
def qclass=(qclass)
|
|
928
|
+
@qclass = Classes.new(qclass)
|
|
929
|
+
end
|
|
930
|
+
|
|
931
|
+
def qname=(qname)
|
|
932
|
+
case qname
|
|
933
|
+
when IPv4::Regex
|
|
934
|
+
@qname = IPv4.create(qname).to_name
|
|
935
|
+
@qtype = Types.PTR
|
|
936
|
+
when IPv6::Regex
|
|
937
|
+
@qname = IPv6.create(qname).to_name
|
|
938
|
+
@qtype = Types.PTR
|
|
939
|
+
when Name
|
|
940
|
+
when IPv6
|
|
941
|
+
@qtype = Types.PTR
|
|
942
|
+
when IPv4
|
|
943
|
+
@qtype = Types.PTR
|
|
944
|
+
else
|
|
945
|
+
@qname = Name.create(qname)
|
|
946
|
+
end
|
|
947
|
+
end
|
|
948
|
+
|
|
949
|
+
#Returns a string representation of the question record.
|
|
950
|
+
def to_s
|
|
951
|
+
return "#{@qname}.\t#{@qclass.string}\t#{@qtype.string}";
|
|
952
|
+
end
|
|
953
|
+
|
|
954
|
+
# For Updates, the qname field is redefined to zname (RFC2136, section 2.3)
|
|
955
|
+
alias zname qname
|
|
956
|
+
# For Updates, the qtype field is redefined to ztype (RFC2136, section 2.3)
|
|
957
|
+
alias ztype qtype
|
|
958
|
+
# For Updates, the qclass field is redefined to zclass (RFC2136, section 2.3)
|
|
959
|
+
alias zclass qclass
|
|
960
|
+
end
|
|
961
|
+
end
|