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,493 @@
|
|
|
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/select_thread'
|
|
17
|
+
module Dnsruby
|
|
18
|
+
#== Dnsruby::SingleResolver
|
|
19
|
+
#
|
|
20
|
+
# The SingleResolver class targets a single resolver, and controls the sending of a single
|
|
21
|
+
# packet with a packet timeout. It performs no retries. Only two threads are used - the client
|
|
22
|
+
# thread and a select thread (which is reused across all queries).
|
|
23
|
+
#
|
|
24
|
+
#== Methods
|
|
25
|
+
#
|
|
26
|
+
#=== Synchronous
|
|
27
|
+
#These methods raise an exception or return a response message with rcode==NOERROR
|
|
28
|
+
#
|
|
29
|
+
#* Dnsruby::SingleResolver#send_message(msg [, use_tcp]))
|
|
30
|
+
#* Dnsruby::SingleResolver#query(name [, type [, klass]])
|
|
31
|
+
#
|
|
32
|
+
#=== Asynchronous
|
|
33
|
+
#These methods use a response queue, or an EventMachine::Deferrable
|
|
34
|
+
#to return the response and the error to the client. See Dnsruby::Resolver for
|
|
35
|
+
#details of how to enable the EventMachine implementation.
|
|
36
|
+
#More information about the EventMachine implementation is available in the
|
|
37
|
+
#EVENTMACHINE file in the Dnsruby distribution
|
|
38
|
+
#
|
|
39
|
+
#* Dnsruby::SingleResolver#send_async(...)
|
|
40
|
+
#
|
|
41
|
+
class SingleResolver
|
|
42
|
+
attr_accessor :packet_timeout
|
|
43
|
+
|
|
44
|
+
# The port on the resolver to send queries to.
|
|
45
|
+
#
|
|
46
|
+
# Defaults to 53
|
|
47
|
+
attr_accessor :port
|
|
48
|
+
|
|
49
|
+
# Use TCP rather than UDP as the transport.
|
|
50
|
+
#
|
|
51
|
+
# Defaults to false
|
|
52
|
+
attr_accessor :use_tcp
|
|
53
|
+
|
|
54
|
+
# The TSIG record to sign/verify messages with
|
|
55
|
+
attr_reader :tsig
|
|
56
|
+
|
|
57
|
+
# Don't worry if the response is truncated - return it anyway.
|
|
58
|
+
#
|
|
59
|
+
# Defaults to false
|
|
60
|
+
attr_accessor :ignore_truncation
|
|
61
|
+
|
|
62
|
+
# The source address to send queries from
|
|
63
|
+
#
|
|
64
|
+
# Defaults to localhost
|
|
65
|
+
attr_accessor :src_address
|
|
66
|
+
# The source port to send queries from
|
|
67
|
+
#
|
|
68
|
+
# Defaults to 0 - random port
|
|
69
|
+
attr_accessor :src_port
|
|
70
|
+
|
|
71
|
+
# Should the TCP socket persist between queries?
|
|
72
|
+
#
|
|
73
|
+
# Defaults to false
|
|
74
|
+
attr_accessor :persistent_tcp
|
|
75
|
+
|
|
76
|
+
# Should the UDP socket persist between queries?
|
|
77
|
+
#
|
|
78
|
+
# Defaults to false
|
|
79
|
+
attr_accessor :persistent_udp
|
|
80
|
+
|
|
81
|
+
# should the Recursion Desired bit be set on queries?
|
|
82
|
+
#
|
|
83
|
+
# Defaults to true
|
|
84
|
+
attr_accessor :recurse
|
|
85
|
+
|
|
86
|
+
# The max UDP packet size
|
|
87
|
+
#
|
|
88
|
+
# Defaults to 512
|
|
89
|
+
attr_reader :udp_size
|
|
90
|
+
|
|
91
|
+
# The address of the resolver to send queries to
|
|
92
|
+
attr_reader :server
|
|
93
|
+
|
|
94
|
+
# Use DNSSEC for this SingleResolver
|
|
95
|
+
attr_reader :dnssec
|
|
96
|
+
|
|
97
|
+
#Sets the TSIG to sign outgoing messages with.
|
|
98
|
+
#Pass in either a Dnsruby::RR::TSIG, or a key_name and key (or just a key)
|
|
99
|
+
#Pass in nil to stop tsig signing.
|
|
100
|
+
#It is possible for client code to sign packets prior to sending - see
|
|
101
|
+
#Dnsruby::RR::TSIG#apply and Dnsruby::Message#sign
|
|
102
|
+
#Note that pre-signed packets will not be signed by SingleResolver.
|
|
103
|
+
#* res.tsig=(tsig_rr)
|
|
104
|
+
#* res.tsig=(key_name, key)
|
|
105
|
+
#* res.tsig=nil # Stop the resolver from signing
|
|
106
|
+
def tsig=(*args)
|
|
107
|
+
@tsig = SingleResolver.get_tsig(args)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
MIN_DNSSEC_UDP_SIZE = 1220
|
|
111
|
+
|
|
112
|
+
def dnssec=(on)
|
|
113
|
+
@dnssec=on
|
|
114
|
+
if (on)
|
|
115
|
+
# Set the UDP size (RFC 4035 section 4.1)
|
|
116
|
+
if (udp_packet_size < MIN_DNSSEC_UDP_SIZE)
|
|
117
|
+
self.udp_size = MIN_DNSSEC_UDP_SIZE
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def SingleResolver.get_tsig(args)
|
|
123
|
+
tsig = nil
|
|
124
|
+
if (args.length == 1)
|
|
125
|
+
if (args[0])
|
|
126
|
+
if (args[0].instance_of?RR::TSIG)
|
|
127
|
+
tsig = args[0]
|
|
128
|
+
elsif (args[0].instance_of?Array)
|
|
129
|
+
tsig = RR.new_from_hash({:type => Types.TSIG, :klass => Classes.ANY, :name => args[0][0], :key => args[0][1]})
|
|
130
|
+
end
|
|
131
|
+
else
|
|
132
|
+
TheLog.info("TSIG signing switched off")
|
|
133
|
+
return nil
|
|
134
|
+
end
|
|
135
|
+
elsif (args.length ==2)
|
|
136
|
+
tsig = RR.new_from_hash({:type => Types.TSIG, :klass => Classes.ANY, :name => args[0], :key => args[1]})
|
|
137
|
+
else
|
|
138
|
+
raise ArgumentError.new("Wrong number of arguments to tsig=")
|
|
139
|
+
end
|
|
140
|
+
TheLog.info("TSIG signing now using #{tsig.name}, key=#{tsig.key}")
|
|
141
|
+
return tsig
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def udp_size=(size)
|
|
145
|
+
@udp_size = size
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def server=(server)
|
|
149
|
+
TheLog.debug("SingleResolver setting server to #{server}")
|
|
150
|
+
@server=Config.resolve_server(server)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# Can take a hash with the following optional keys :
|
|
154
|
+
#
|
|
155
|
+
# * :server
|
|
156
|
+
# * :port
|
|
157
|
+
# * :use_tcp
|
|
158
|
+
# * :ignore_truncation
|
|
159
|
+
# * :src_addr
|
|
160
|
+
# * :src_port
|
|
161
|
+
# * :udp_size
|
|
162
|
+
# * :persistent_tcp
|
|
163
|
+
# * :persistent_udp
|
|
164
|
+
# * :tsig
|
|
165
|
+
# * :packet_timeout
|
|
166
|
+
# * :recurse
|
|
167
|
+
def initialize(*args)
|
|
168
|
+
arg=args[0]
|
|
169
|
+
@packet_timeout = Resolver::DefaultPacketTimeout
|
|
170
|
+
@port = Resolver::DefaultPort
|
|
171
|
+
@udp_size = Resolver::DefaultUDPSize
|
|
172
|
+
@use_tcp = false
|
|
173
|
+
@tsig = nil
|
|
174
|
+
@ignore_truncation = false
|
|
175
|
+
@src_addr = '0.0.0.0'
|
|
176
|
+
@src_port = 0
|
|
177
|
+
@recurse = true
|
|
178
|
+
@persistent_udp = false
|
|
179
|
+
@persistent_tcp = false
|
|
180
|
+
self.dnssec = true
|
|
181
|
+
|
|
182
|
+
if (arg==nil)
|
|
183
|
+
# Get default config
|
|
184
|
+
config = Config.new
|
|
185
|
+
@server = config.nameserver[0]
|
|
186
|
+
elsif (arg.kind_of?String)
|
|
187
|
+
@server=arg
|
|
188
|
+
elsif (arg.kind_of?Hash)
|
|
189
|
+
arg.keys.each do |attr|
|
|
190
|
+
begin
|
|
191
|
+
send(attr.to_s+"=", arg[attr])
|
|
192
|
+
rescue Exception
|
|
193
|
+
TheLog.error("Argument #{attr} not valid\n")
|
|
194
|
+
end
|
|
195
|
+
# end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
#Check server is IP
|
|
199
|
+
@server=Config.resolve_server(@server)
|
|
200
|
+
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
def close
|
|
204
|
+
# @TODO@ What about closing?
|
|
205
|
+
# Any queries to complete? Sockets to close?
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
# Synchronously send a query for the given name. The type will default to A,
|
|
209
|
+
# and the class to IN.
|
|
210
|
+
def query(name, type=Types.A, klass=Classes.IN)
|
|
211
|
+
msg = Message.new
|
|
212
|
+
msg.header.rd = 1
|
|
213
|
+
msg.add_question(name, type, klass)
|
|
214
|
+
return send_message(msg)
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
# Synchronously send a Message to the server. If a valid response is returned,
|
|
219
|
+
# then that is returned to the client. Otherwise a ResolvError or ResolvTimeout
|
|
220
|
+
# will be thrown.
|
|
221
|
+
#
|
|
222
|
+
# Takes the message to send, and an optional use_tcp parameter which defaults to
|
|
223
|
+
# SingleResolver.use_tcp
|
|
224
|
+
def send_message(msg, use_tcp=@use_tcp)
|
|
225
|
+
q = Queue.new
|
|
226
|
+
send_async(msg, q, Time.now + rand(1000000), use_tcp)
|
|
227
|
+
id, msg, error = q.pop
|
|
228
|
+
if (error != nil)
|
|
229
|
+
raise error
|
|
230
|
+
else
|
|
231
|
+
return msg
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
#Asynchronously send a Message to the server. The send can be done using just
|
|
237
|
+
#Dnsruby, or using EventMachine.
|
|
238
|
+
#
|
|
239
|
+
#== Dnsruby pure Ruby event loop :
|
|
240
|
+
#
|
|
241
|
+
#A client_queue is supplied by the client,
|
|
242
|
+
#along with an optional client_query_id to identify the response. The client_query_id
|
|
243
|
+
#is generated, if not supplied, and returned to the client.
|
|
244
|
+
#When the response is known, the tuple
|
|
245
|
+
#(query_id, response_message, response_exception) is put in the queue for the client to process.
|
|
246
|
+
#
|
|
247
|
+
#The query is sent synchronously in the caller's thread. The select thread is then used to
|
|
248
|
+
#listen for and process the response (up to pushing it to the client_queue). The client thread
|
|
249
|
+
#is then used to retrieve the response and deal with it.
|
|
250
|
+
#
|
|
251
|
+
#Takes :
|
|
252
|
+
#
|
|
253
|
+
#* msg - the message to send
|
|
254
|
+
#* client_queue - a Queue to push the response to, when it arrives
|
|
255
|
+
#* client_query_id - an optional ID to identify the query to the client
|
|
256
|
+
#* use_tcp - whether to use TCP (defaults to SingleResolver.use_tcp)
|
|
257
|
+
#
|
|
258
|
+
#Returns :
|
|
259
|
+
#
|
|
260
|
+
#* client_query_id - to identify the query response to the client. This ID is
|
|
261
|
+
#generated if it is not passed in by the client
|
|
262
|
+
#
|
|
263
|
+
#If the native Dsnruby networking layer is being used, then this method returns the client_query_id
|
|
264
|
+
#
|
|
265
|
+
# id = res.send_async(msg, queue)
|
|
266
|
+
# NOT SUPPORTED : id = res.send_async(msg, queue, use_tcp)
|
|
267
|
+
# id = res.send_async(msg, queue, id)
|
|
268
|
+
# id = res.send_async(msg, queue, id, use_tcp)
|
|
269
|
+
#
|
|
270
|
+
#== If EventMachine is being used :
|
|
271
|
+
#
|
|
272
|
+
#If EventMachine is being used (see Dnsruby::Resolver::use_eventmachine),then this method returns
|
|
273
|
+
#an EM::Deferrable object. If a queue (and ID) is passed in, then the response will also be
|
|
274
|
+
#pushed to the Queue (as well as the deferrable completing).
|
|
275
|
+
#
|
|
276
|
+
# deferrable = res.send_async(msg)
|
|
277
|
+
# deferrable = res.send_async(msg, use_tcp)
|
|
278
|
+
# deferrable = res.send_async(msg, q, id, use_tcp)
|
|
279
|
+
def send_async(*args) # msg, client_queue, client_query_id, use_tcp=@use_tcp)
|
|
280
|
+
# @TODO@ Need to select a good Header ID here - see forgery-resilience RFC draft for details
|
|
281
|
+
msg = args[0]
|
|
282
|
+
client_query_id = nil
|
|
283
|
+
client_queue = nil
|
|
284
|
+
use_tcp = @use_tcp
|
|
285
|
+
if (msg.kind_of?String)
|
|
286
|
+
msg = Message.new(msg)
|
|
287
|
+
end
|
|
288
|
+
query_packet = make_query_packet(msg, use_tcp)
|
|
289
|
+
if (udp_packet_size < query_packet.length)
|
|
290
|
+
TheLog.debug("Query packet length exceeds max UDP packet size - using TCP")
|
|
291
|
+
use_tcp = true
|
|
292
|
+
end
|
|
293
|
+
if (args.length > 1)
|
|
294
|
+
if (args[1].class==Queue)
|
|
295
|
+
client_queue = args[1]
|
|
296
|
+
elsif (args.length == 2)
|
|
297
|
+
use_tcp = args[1]
|
|
298
|
+
end
|
|
299
|
+
if (args.length > 2)
|
|
300
|
+
client_query_id = args[2]
|
|
301
|
+
if (args.length > 3)
|
|
302
|
+
use_tcp = args[3]
|
|
303
|
+
end
|
|
304
|
+
end
|
|
305
|
+
end
|
|
306
|
+
# Need to keep track of the request mac (if using tsig) so we can validate the response (RFC2845 4.1)
|
|
307
|
+
#Are we using EventMachine or native Dnsruby?
|
|
308
|
+
if (Resolver.eventmachine?)
|
|
309
|
+
return send_eventmachine(query_packet, msg, client_query_id, client_queue, use_tcp)
|
|
310
|
+
else
|
|
311
|
+
if (!client_query_id)
|
|
312
|
+
client_query_id = Time.now + rand(10000)
|
|
313
|
+
end
|
|
314
|
+
send_dnsruby(query_packet, msg, client_query_id, client_queue, use_tcp)
|
|
315
|
+
return client_query_id
|
|
316
|
+
end
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
# This method sends the packet using EventMachine
|
|
320
|
+
def send_eventmachine(msg_bytes, msg, client_query_id, client_queue, use_tcp, client_deferrable=nil, packet_timeout = @packet_timeout) #:nodoc: all
|
|
321
|
+
start_time = Time.now
|
|
322
|
+
if (!client_deferrable)
|
|
323
|
+
client_deferrable = EventMachine::DefaultDeferrable.new
|
|
324
|
+
end
|
|
325
|
+
packet_deferrable = EventMachineInterface.send(:msg=>msg_bytes, :timeout=>packet_timeout, :server=>@server, :port=>@port, :src_addr=>@src_addr, :src_port=>get_next_src_port, :use_tcp=>use_tcp)
|
|
326
|
+
packet_deferrable.callback { |response, response_bytes|
|
|
327
|
+
ret = true
|
|
328
|
+
if (response.header.tc && !use_tcp && !@ignore_truncation)
|
|
329
|
+
# Try to resend over tcp
|
|
330
|
+
TheLog.debug("Truncated - resending over TCP")
|
|
331
|
+
send_eventmachine(msg_bytes, msg, client_query_id, client_queue, true, client_deferrable, packet_timeout - (Time.now-start_time))
|
|
332
|
+
else
|
|
333
|
+
if (!check_tsig(msg, response, response_bytes))
|
|
334
|
+
send_eventmachine(msg_bytes, msg, client_query_id, client_queue, true, client_deferrable, packet_timeout - (Time.now-start_time))
|
|
335
|
+
return
|
|
336
|
+
end
|
|
337
|
+
client_deferrable.set_deferred_status :succeeded, response
|
|
338
|
+
if (client_queue)
|
|
339
|
+
client_queue.push([client_query_id, response, nil])
|
|
340
|
+
end
|
|
341
|
+
end
|
|
342
|
+
}
|
|
343
|
+
packet_deferrable.errback { |response, error|
|
|
344
|
+
client_deferrable.set_deferred_status :failed, response, error
|
|
345
|
+
if (client_queue)
|
|
346
|
+
client_queue.push([client_query_id, response, error])
|
|
347
|
+
end
|
|
348
|
+
}
|
|
349
|
+
return client_deferrable
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
# This method sends the packet using the built-in pure Ruby event loop, with no dependencies.
|
|
353
|
+
def send_dnsruby(query_bytes, query, client_query_id, client_queue, use_tcp) #:nodoc: all
|
|
354
|
+
endtime = Time.now + @packet_timeout
|
|
355
|
+
# First send the query (synchronously)
|
|
356
|
+
# @TODO@ persisent sockets
|
|
357
|
+
st = SelectThread.instance
|
|
358
|
+
socket = nil
|
|
359
|
+
begin
|
|
360
|
+
src_port = get_next_src_port
|
|
361
|
+
if (use_tcp)
|
|
362
|
+
socket = TCPSocket.new(@server, @port, @src_addr, src_port)
|
|
363
|
+
else
|
|
364
|
+
socket = UDPSocket.new()
|
|
365
|
+
socket.bind(@src_addr, src_port)
|
|
366
|
+
socket.connect(@server, @port)
|
|
367
|
+
end
|
|
368
|
+
rescue Exception => e
|
|
369
|
+
if (socket!=nil)
|
|
370
|
+
socket.close
|
|
371
|
+
end
|
|
372
|
+
err=IOError.new("dnsruby can't connect to #{@server}:#{@port} from #{@src_addr}:#{src_port}, use_tcp=#{use_tcp}, exception = #{e.class}, #{e}")
|
|
373
|
+
TheLog.error("#{err}")
|
|
374
|
+
st.push_exception_to_select(client_query_id, client_queue, err, nil) # @TODO Do we still need this? Can we not just send it from here?
|
|
375
|
+
return
|
|
376
|
+
end
|
|
377
|
+
if (socket==nil)
|
|
378
|
+
err=IOError.new("dnsruby can't connect to #{@server}:#{@port} from #{@src_addr}:#{src_port}, use_tcp=#{use_tcp}")
|
|
379
|
+
TheLog.error("#{err}")
|
|
380
|
+
st.push_exception_to_select(client_query_id, client_queue, err, nil) # @TODO Do we still need this? Can we not just send it from here?
|
|
381
|
+
return
|
|
382
|
+
end
|
|
383
|
+
TheLog.debug("Sending packet to #{@server}:#{@port} from #{@src_addr}:#{src_port}, use_tcp=#{use_tcp}")
|
|
384
|
+
begin
|
|
385
|
+
if (use_tcp)
|
|
386
|
+
lenmsg = [query_bytes.length].pack('n')
|
|
387
|
+
socket.send(lenmsg, 0)
|
|
388
|
+
end
|
|
389
|
+
socket.send(query_bytes, 0)
|
|
390
|
+
rescue Exception => e
|
|
391
|
+
socket.close
|
|
392
|
+
err=IOError.new("Send failed to #{@server}:#{@port} from #{@src_addr}:#{src_port}, use_tcp=#{use_tcp}, exception : #{e}")
|
|
393
|
+
TheLog.error("#{err}")
|
|
394
|
+
st.push_exception_to_select(client_query_id, client_queue, err, nil)
|
|
395
|
+
return
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
# Then listen for the response
|
|
399
|
+
query_settings = SelectThread::QuerySettings.new(query_bytes, query, @ignore_truncation, client_queue, client_query_id, socket, @server, @port, endtime, udp_packet_size, self)
|
|
400
|
+
# The select thread will now wait for the response and send that or a timeout
|
|
401
|
+
# back to the client_queue.
|
|
402
|
+
st.add_to_select(query_settings)
|
|
403
|
+
end
|
|
404
|
+
|
|
405
|
+
def get_next_src_port
|
|
406
|
+
#Different OSes have different interpretations of "random port" here.
|
|
407
|
+
#Apparently, Linux will just give you the same port as last time, unless it is still
|
|
408
|
+
#open, in which case you get n+1.
|
|
409
|
+
#We need to determine an actual (random) number here, then ask the OS for it, and
|
|
410
|
+
#continue until we get one.
|
|
411
|
+
if (@src_port > 0 && @src_port < 65535)
|
|
412
|
+
return @src_port
|
|
413
|
+
else
|
|
414
|
+
return (rand(65535-1024) + 1024)
|
|
415
|
+
end
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
def check_response(response, response_bytes, query, client_queue, client_query_id, tcp)
|
|
419
|
+
if (!check_tsig(query, response, response_bytes))
|
|
420
|
+
return false
|
|
421
|
+
end
|
|
422
|
+
if (response.header.tc && !tcp)
|
|
423
|
+
# Try to resend over tcp
|
|
424
|
+
TheLog.debug("Truncated - resending over TCP")
|
|
425
|
+
send_async(query, client_queue, client_query_id, true)
|
|
426
|
+
return false
|
|
427
|
+
end
|
|
428
|
+
return true
|
|
429
|
+
end
|
|
430
|
+
|
|
431
|
+
def check_tsig(query, response, response_bytes)
|
|
432
|
+
if (query.tsig)
|
|
433
|
+
if (response.tsig)
|
|
434
|
+
if !query.tsig.verify(query, response, response_bytes)
|
|
435
|
+
# Discard packet and wait for correctly signed response
|
|
436
|
+
TheLog.error("TSIG authentication failed!")
|
|
437
|
+
return false
|
|
438
|
+
end
|
|
439
|
+
else
|
|
440
|
+
# Treated as having format error and discarded (RFC2845, 4.6)
|
|
441
|
+
TheLog.error("Expecting TSIG signed response, but got unsigned response - discarding")
|
|
442
|
+
return false
|
|
443
|
+
end
|
|
444
|
+
elsif (response.tsig)
|
|
445
|
+
# Error - signed response to unsigned query
|
|
446
|
+
TheLog.error("Signed response to unsigned query")
|
|
447
|
+
return false
|
|
448
|
+
end
|
|
449
|
+
return true
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
# Prepare the packet for sending
|
|
453
|
+
def make_query_packet(packet, use_tcp) #:nodoc: all
|
|
454
|
+
if (packet.header.opcode == OpCode.QUERY || @recurse)
|
|
455
|
+
packet.header.rd=true
|
|
456
|
+
end
|
|
457
|
+
|
|
458
|
+
if (@dnssec)
|
|
459
|
+
# RFC 4035
|
|
460
|
+
TheLog.debug(";; Adding EDNS extention with UDP packetsize #{udp_packet_size} and DNS OK bit set\n")
|
|
461
|
+
optrr = RR::OPT.new(udp_packet_size) # Decimal UDPpayload
|
|
462
|
+
optrr.dnssec_ok=true
|
|
463
|
+
|
|
464
|
+
packet.add_additional(optrr)
|
|
465
|
+
|
|
466
|
+
packet.header.ad = false # RFC 4035 section 4.6
|
|
467
|
+
|
|
468
|
+
packet.header.cd = false # We trust the upstream resolver and the link to it
|
|
469
|
+
|
|
470
|
+
elsif ((udp_packet_size > Resolver::DefaultUDPSize) && !use_tcp)
|
|
471
|
+
# if ((udp_packet_size > Resolver::DefaultUDPSize) && !use_tcp)
|
|
472
|
+
TheLog.debug(";; Adding EDNS extention with UDP packetsize #{udp_packet_size}.\n")
|
|
473
|
+
# RFC 3225
|
|
474
|
+
optrr = RR::OPT.new(udp_packet_size)
|
|
475
|
+
|
|
476
|
+
packet.add_additional(optrr)
|
|
477
|
+
end
|
|
478
|
+
|
|
479
|
+
if (@tsig && !packet.signed?)
|
|
480
|
+
@tsig.apply(packet)
|
|
481
|
+
end
|
|
482
|
+
return packet.encode
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
# Return the packet size to use for UDP
|
|
486
|
+
def udp_packet_size
|
|
487
|
+
# if @udp_size > DefaultUDPSize then we use EDNS and
|
|
488
|
+
# @udp_size should be taken as the maximum packet_data length
|
|
489
|
+
ret = (@udp_size > Resolver::DefaultUDPSize ? @udp_size : Resolver::DefaultUDPSize)
|
|
490
|
+
return ret
|
|
491
|
+
end
|
|
492
|
+
end
|
|
493
|
+
end
|