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,449 @@
|
|
|
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 'socket'
|
|
17
|
+
#require 'thread'
|
|
18
|
+
begin
|
|
19
|
+
require 'fastthread'
|
|
20
|
+
rescue LoadError
|
|
21
|
+
require 'thread'
|
|
22
|
+
end
|
|
23
|
+
require 'singleton'
|
|
24
|
+
module Dnsruby
|
|
25
|
+
Thread::abort_on_exception = true
|
|
26
|
+
class SelectThread #:nodoc: all
|
|
27
|
+
class SelectWakeup < RuntimeError; end
|
|
28
|
+
include Singleton
|
|
29
|
+
# This singleton class runs a continuous select loop which
|
|
30
|
+
# listens for responses on all of the in-use sockets.
|
|
31
|
+
# When a new query is sent, the thread is woken up, and
|
|
32
|
+
# the socket is added to the select loop (and the new timeout
|
|
33
|
+
# calculated).
|
|
34
|
+
# Note that a combination of the socket and the packet ID is
|
|
35
|
+
# sufficient to uniquely identify the query to the select thread.
|
|
36
|
+
# But how do we identify it to the client thread?
|
|
37
|
+
# Push [id, response] onto the response queue?
|
|
38
|
+
# Or [id, timeout]
|
|
39
|
+
#
|
|
40
|
+
# But how do we find the response queue for a particular query?
|
|
41
|
+
# Hash of client_id->[query, client_queue, socket]
|
|
42
|
+
# and socket->[client_id]
|
|
43
|
+
#
|
|
44
|
+
# @todo@ should we implement some of cancel function?
|
|
45
|
+
|
|
46
|
+
def initialize
|
|
47
|
+
@@mutex = Mutex.new
|
|
48
|
+
@@mutex.synchronize {
|
|
49
|
+
@@in_select=false
|
|
50
|
+
# @@notifier,@@notified=IO.pipe
|
|
51
|
+
@@sockets = [] # @@notified]
|
|
52
|
+
@@timeouts = Hash.new
|
|
53
|
+
# @@mutex.synchronize do
|
|
54
|
+
@@query_hash = Hash.new
|
|
55
|
+
@@socket_hash = Hash.new
|
|
56
|
+
@@observers = Hash.new
|
|
57
|
+
@@tick_observers = []
|
|
58
|
+
@@queued_exceptions=[]
|
|
59
|
+
# end
|
|
60
|
+
# Now start the select thread
|
|
61
|
+
@@select_thread = Thread.new {
|
|
62
|
+
do_select
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
class QuerySettings
|
|
68
|
+
attr_accessor :query_bytes, :query, :ignore_truncation, :client_queue,
|
|
69
|
+
:client_query_id, :socket, :dest_server, :dest_port, :endtime, :udp_packet_size,
|
|
70
|
+
:single_resolver
|
|
71
|
+
# new(query_bytes, query, ignore_truncation, client_queue, client_query_id,
|
|
72
|
+
# socket, dest_server, dest_port, endtime, , udp_packet_size, single_resolver)
|
|
73
|
+
def initialize(*args)
|
|
74
|
+
@query_bytes = args[0]
|
|
75
|
+
@query = args[1]
|
|
76
|
+
@ignore_truncation=args[2]
|
|
77
|
+
@client_queue = args[3]
|
|
78
|
+
@client_query_id = args[4]
|
|
79
|
+
@socket = args[5]
|
|
80
|
+
@dest_server = args[6]
|
|
81
|
+
@dest_port=args[7]
|
|
82
|
+
@endtime = args[8]
|
|
83
|
+
@udp_packet_size = args[9]
|
|
84
|
+
@single_resolver = args[10]
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def add_to_select(query_settings)
|
|
89
|
+
# Add the query to sockets, and then wake the select thread up
|
|
90
|
+
@@mutex.synchronize {
|
|
91
|
+
check_select_thread_synchronized
|
|
92
|
+
# @TODO@ This assumes that all client_query_ids are unique!
|
|
93
|
+
# Would be a good idea at least to check this...
|
|
94
|
+
@@query_hash[query_settings.client_query_id]=query_settings
|
|
95
|
+
@@socket_hash[query_settings.socket]=[query_settings.client_query_id] # @todo@ If we use persistent sockets then we need to update this array
|
|
96
|
+
@@timeouts[query_settings.client_query_id]=query_settings.endtime
|
|
97
|
+
@@sockets.push(query_settings.socket)
|
|
98
|
+
}
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def check_select_thread_synchronized
|
|
102
|
+
if (!@@select_thread.alive?)
|
|
103
|
+
TheLog.debug("Restarting select thread")
|
|
104
|
+
@@select_thread = Thread.new {
|
|
105
|
+
do_select
|
|
106
|
+
}
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def select_thread_alive?
|
|
111
|
+
ret=true
|
|
112
|
+
@@mutex.synchronize{
|
|
113
|
+
ret = @@select_thread.alive?
|
|
114
|
+
}
|
|
115
|
+
return ret
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def do_select
|
|
119
|
+
unused_loop_count = 0
|
|
120
|
+
while true do
|
|
121
|
+
send_tick_to_observers
|
|
122
|
+
send_queued_exceptions
|
|
123
|
+
timeout = tick_time = (Time.now+0.1) - Time.now # We provide a timer service to various Dnsruby classes
|
|
124
|
+
sockets=[]
|
|
125
|
+
timeouts=[]
|
|
126
|
+
has_observer = false
|
|
127
|
+
@@mutex.synchronize {
|
|
128
|
+
sockets = @@sockets
|
|
129
|
+
timeouts = @@timeouts.values
|
|
130
|
+
has_observer = !@@observers.empty?
|
|
131
|
+
}
|
|
132
|
+
if (timeouts.length > 0)
|
|
133
|
+
timeouts.sort!
|
|
134
|
+
timeout = timeouts[0] - Time.now
|
|
135
|
+
if (timeout <= 0)
|
|
136
|
+
process_timeouts
|
|
137
|
+
timeout = 0
|
|
138
|
+
next
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
ready=nil
|
|
142
|
+
if (has_observer && (timeout > tick_time))
|
|
143
|
+
timeout = tick_time
|
|
144
|
+
end
|
|
145
|
+
# next if (timeout < 0)
|
|
146
|
+
begin
|
|
147
|
+
ready, write, errors = IO.select(sockets, nil, nil, timeout)
|
|
148
|
+
rescue SelectWakeup
|
|
149
|
+
# If SelectWakeup, then just restart this loop - the select call will be made with the new data
|
|
150
|
+
next
|
|
151
|
+
end
|
|
152
|
+
if (ready == nil)
|
|
153
|
+
# proces the timeouts
|
|
154
|
+
process_timeouts
|
|
155
|
+
unused_loop_count+=1
|
|
156
|
+
else
|
|
157
|
+
process_ready(ready)
|
|
158
|
+
unused_loop_count=0
|
|
159
|
+
# process_error(errors)
|
|
160
|
+
end
|
|
161
|
+
@@mutex.synchronize{
|
|
162
|
+
if (unused_loop_count > 10 && @@query_hash.empty? && @@observers.empty?)
|
|
163
|
+
TheLog.debug("Stopping select loop")
|
|
164
|
+
return
|
|
165
|
+
end
|
|
166
|
+
}
|
|
167
|
+
# }
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def process_error(errors)
|
|
172
|
+
TheLog.debug("Error! #{errors.inspect}")
|
|
173
|
+
# @todo@ Process errors [can we do this in single socket environment?]
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
# @@query_hash[query_settings.client_query_id]=query_settings
|
|
177
|
+
# @@socket_hash[query_settings.socket]=[query_settings.client_query_id] # @todo@ If we use persistent sockets then we need to update this array
|
|
178
|
+
def process_ready(ready)
|
|
179
|
+
ready.each do |socket|
|
|
180
|
+
query_settings = nil
|
|
181
|
+
@@mutex.synchronize{
|
|
182
|
+
# Can do this if we have a query per socket, but not otherwise...
|
|
183
|
+
c_q_id = @@socket_hash[socket][0] # @todo@ If we use persistent sockets then this won't work
|
|
184
|
+
query_settings = @@query_hash[c_q_id]
|
|
185
|
+
}
|
|
186
|
+
next if !query_settings
|
|
187
|
+
udp_packet_size = query_settings.udp_packet_size
|
|
188
|
+
msg, bytes = get_incoming_data(socket, udp_packet_size)
|
|
189
|
+
if (msg!=nil)
|
|
190
|
+
send_response_to_client(msg, bytes, socket)
|
|
191
|
+
end
|
|
192
|
+
ready.delete(socket)
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def send_response_to_client(msg, bytes, socket)
|
|
197
|
+
# Figure out which client_ids we were expecting on this socket, then see if any header ids match up
|
|
198
|
+
client_ids=[]
|
|
199
|
+
@@mutex.synchronize{
|
|
200
|
+
client_ids = @@socket_hash[socket]
|
|
201
|
+
}
|
|
202
|
+
# get the queries associated with them
|
|
203
|
+
client_ids.each do |id|
|
|
204
|
+
query_header_id=nil
|
|
205
|
+
@@mutex.synchronize{
|
|
206
|
+
query_header_id = @@query_hash[id].query.header.id
|
|
207
|
+
}
|
|
208
|
+
if (query_header_id == msg.header.id)
|
|
209
|
+
# process the response
|
|
210
|
+
client_queue = nil
|
|
211
|
+
res = nil
|
|
212
|
+
query=nil
|
|
213
|
+
@@mutex.synchronize{
|
|
214
|
+
client_queue = @@query_hash[id].client_queue
|
|
215
|
+
res = @@query_hash[id].single_resolver
|
|
216
|
+
query = @@query_hash[id].query
|
|
217
|
+
}
|
|
218
|
+
tcp = (socket.class == TCPSocket)
|
|
219
|
+
# At this point, we should check if the response is OK
|
|
220
|
+
if (res.check_response(msg, bytes, query, client_queue, id, tcp))
|
|
221
|
+
remove_id(id)
|
|
222
|
+
exception = msg.header.get_exception
|
|
223
|
+
TheLog.debug("Pushing response to client queue")
|
|
224
|
+
client_queue.push([id, msg, exception])
|
|
225
|
+
notify_queue_observers(client_queue, id)
|
|
226
|
+
else
|
|
227
|
+
# Sending query again - don't return response
|
|
228
|
+
end
|
|
229
|
+
return
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
# If not, then we have an error
|
|
233
|
+
TheLog.error("Stray packet - " + msg.inspect + "\n from " + socket.inspect)
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def remove_id(id)
|
|
237
|
+
socket=nil
|
|
238
|
+
@@mutex.synchronize{
|
|
239
|
+
socket = @@query_hash[id].socket
|
|
240
|
+
@@timeouts.delete(id)
|
|
241
|
+
@@query_hash.delete(id)
|
|
242
|
+
@@sockets.delete(socket) # @TODO@ Not if persistent!
|
|
243
|
+
}
|
|
244
|
+
TheLog.debug("Closing socket #{socket}")
|
|
245
|
+
socket.close # @TODO@ Not if persistent!
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def process_timeouts
|
|
249
|
+
time_now = Time.now
|
|
250
|
+
timeouts={}
|
|
251
|
+
@@mutex.synchronize {
|
|
252
|
+
timeouts = @@timeouts
|
|
253
|
+
}
|
|
254
|
+
timeouts.each do |client_id, timeout|
|
|
255
|
+
if (timeout < time_now)
|
|
256
|
+
send_exception_to_client(ResolvTimeout.new("Query timed out"), nil, client_id)
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
def tcp_read(socket, len)
|
|
262
|
+
buf=""
|
|
263
|
+
while (buf.length < len) do
|
|
264
|
+
buf += socket.recv(len-buf.length)
|
|
265
|
+
end
|
|
266
|
+
return buf
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
def get_incoming_data(socket, packet_size)
|
|
270
|
+
answerfrom,answerip,answerport,answersize=nil
|
|
271
|
+
ans,buf = nil
|
|
272
|
+
begin
|
|
273
|
+
if (socket.class == TCPSocket)
|
|
274
|
+
# @todo@ Ruby Bug #9061 stops this working right
|
|
275
|
+
# We'd like to do a socket.recvfrom, but that raises an Exception
|
|
276
|
+
# on Windows for TCPSocket for Ruby 1.8.5 (and 1.8.6).
|
|
277
|
+
# So, we need to do something different for TCP than UDP. *sigh*
|
|
278
|
+
# @TODO@ This workaround will only work if there is exactly one socket per query
|
|
279
|
+
# - *not* ideal TCP use!
|
|
280
|
+
@@mutex.synchronize{
|
|
281
|
+
client_id = @@socket_hash[socket][0]
|
|
282
|
+
answerfrom = @@query_hash[client_id].dest_server
|
|
283
|
+
answerip = answerfrom
|
|
284
|
+
answerport = @@query_hash[client_id].dest_port
|
|
285
|
+
}
|
|
286
|
+
buf = tcp_read(socket, 2)
|
|
287
|
+
answersize = buf.unpack('n')[0]
|
|
288
|
+
buf = tcp_read(socket,answersize)
|
|
289
|
+
else
|
|
290
|
+
if (ret = socket.recvfrom(packet_size))
|
|
291
|
+
buf = ret[0]
|
|
292
|
+
answerport=ret[1][1]
|
|
293
|
+
answerfrom=ret[1][2]
|
|
294
|
+
answerip=ret[1][3]
|
|
295
|
+
answersize=(buf.length)
|
|
296
|
+
else
|
|
297
|
+
# recvfrom failed - why?
|
|
298
|
+
TheLog.error("Error - recvfrom failed from #{socket}")
|
|
299
|
+
handle_recvfrom_failure(socket)
|
|
300
|
+
return
|
|
301
|
+
end
|
|
302
|
+
end
|
|
303
|
+
rescue Exception => e
|
|
304
|
+
TheLog.error("Error - recvfrom failed from #{socket}, exception : #{e}")
|
|
305
|
+
handle_recvfrom_failure(socket)
|
|
306
|
+
return
|
|
307
|
+
end
|
|
308
|
+
TheLog.debug(";; answer from #{answerfrom} : #{answersize} bytes\n")
|
|
309
|
+
|
|
310
|
+
begin
|
|
311
|
+
ans = Message.decode(buf)
|
|
312
|
+
rescue Exception => e
|
|
313
|
+
TheLog.error("Decode error! #{e.class}, #{e}\nfor msg (length=#{buf.length}) : #{buf}")
|
|
314
|
+
client_id=get_client_id_from_answerfrom(socket, answerip, answerport)
|
|
315
|
+
if (client_id != nil)
|
|
316
|
+
send_exception_to_client(e, socket, client_id)
|
|
317
|
+
else
|
|
318
|
+
TheLog.error("Decode error from #{answerfrom} but can't determine packet id")
|
|
319
|
+
end
|
|
320
|
+
return
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
if (ans!= nil)
|
|
324
|
+
TheLog.debug("#{ans}")
|
|
325
|
+
ans.answerfrom=(answerfrom)
|
|
326
|
+
ans.answersize=(answersize)
|
|
327
|
+
end
|
|
328
|
+
return ans, buf
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
def handle_recvfrom_failure(socket)
|
|
332
|
+
# @TODO@ No way to notify the client about this error, unless there was only one connection on the socket
|
|
333
|
+
ids_for_socket = []
|
|
334
|
+
@@mutex.synchronize{
|
|
335
|
+
ids_for_socket = @@socket_hash[socket]
|
|
336
|
+
}
|
|
337
|
+
if (ids_for_socket.length == 1)
|
|
338
|
+
answerfrom=nil
|
|
339
|
+
@@mutex.synchronize{
|
|
340
|
+
query_settings = @@query_hash[ids_for_socket[0]]
|
|
341
|
+
answerfrom=query_settings.dest_server
|
|
342
|
+
}
|
|
343
|
+
send_exception_to_client(OtherResolvError.new("recvfrom failed from #{answerfrom}"), socket, ids_for_socket[0])
|
|
344
|
+
else
|
|
345
|
+
TheLog.fatal("Recvfrom failed from #{socket}, no way to tell query id")
|
|
346
|
+
end
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
def get_client_id_from_answerfrom(socket, answerip, answerport)
|
|
350
|
+
client_id=nil
|
|
351
|
+
# Figure out client id from answerfrom
|
|
352
|
+
@@mutex.synchronize{
|
|
353
|
+
ids = @@socket_hash[socket]
|
|
354
|
+
ids.each do |id|
|
|
355
|
+
# Does this id speak to this dest_server?
|
|
356
|
+
query_settings = @@query_hash[id]
|
|
357
|
+
if (answerip == query_settings.dest_server && answerport == query_settings.dest_port)
|
|
358
|
+
# We have a match
|
|
359
|
+
# - @TODO@ as long as we're not speaking to the same server on two ports!
|
|
360
|
+
client_id = id
|
|
361
|
+
break
|
|
362
|
+
end
|
|
363
|
+
end
|
|
364
|
+
}
|
|
365
|
+
return client_id
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
def send_exception_to_client(err, socket, client_id, msg=nil)
|
|
369
|
+
# find the client response queue
|
|
370
|
+
client_queue = nil
|
|
371
|
+
@@mutex.synchronize {
|
|
372
|
+
client_queue = @@query_hash[client_id].client_queue
|
|
373
|
+
}
|
|
374
|
+
remove_id(client_id)
|
|
375
|
+
push_exception_to_client(client_id, client_queue, err, msg)
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
def push_exception_to_select(client_id, client_queue, err, msg)
|
|
379
|
+
@@mutex.synchronize{
|
|
380
|
+
@@queued_exceptions.push([client_id, client_queue, err, msg])
|
|
381
|
+
}
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
def send_queued_exceptions
|
|
385
|
+
exceptions = []
|
|
386
|
+
@@mutex.synchronize{
|
|
387
|
+
exceptions = @@queued_exceptions
|
|
388
|
+
@@queued_exceptions = []
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
exceptions.each do |item|
|
|
392
|
+
client_id, client_queue, err, msg = item
|
|
393
|
+
push_exception_to_client(client_id, client_queue, err, msg)
|
|
394
|
+
end
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
def push_exception_to_client(client_id, client_queue, err, msg)
|
|
398
|
+
# Now push the exception on the queue
|
|
399
|
+
client_queue.push([client_id, msg, err])
|
|
400
|
+
notify_queue_observers(client_queue, client_id)
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
def add_observer(client_queue, observer)
|
|
404
|
+
@@mutex.synchronize {
|
|
405
|
+
@@observers[client_queue]=observer
|
|
406
|
+
check_select_thread_synchronized # Is this really necessary? The client should start the thread by sending a query, really...
|
|
407
|
+
if (!@@tick_observers.include?observer)
|
|
408
|
+
@@tick_observers.push(observer)
|
|
409
|
+
end
|
|
410
|
+
}
|
|
411
|
+
end
|
|
412
|
+
|
|
413
|
+
def remove_observer(client_queue, observer)
|
|
414
|
+
@@mutex.synchronize {
|
|
415
|
+
if (@@observers[client_queue]==observer)
|
|
416
|
+
@@observers.delete(observer)
|
|
417
|
+
else
|
|
418
|
+
TheLog.error("remove_observer called with wrong observer for queue")
|
|
419
|
+
raise ArgumentError.new("remove_observer called with wrong observer for queue")
|
|
420
|
+
end
|
|
421
|
+
if (!@@observers.values.include?observer)
|
|
422
|
+
@@tick_observers.delete(observer)
|
|
423
|
+
end
|
|
424
|
+
}
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
def notify_queue_observers(client_queue, client_query_id)
|
|
428
|
+
# If any observers are known for this query queue then notify them
|
|
429
|
+
observer=nil
|
|
430
|
+
@@mutex.synchronize {
|
|
431
|
+
observer = @@observers[client_queue]
|
|
432
|
+
}
|
|
433
|
+
if (observer)
|
|
434
|
+
observer.handle_queue_event(client_queue, client_query_id)
|
|
435
|
+
end
|
|
436
|
+
end
|
|
437
|
+
|
|
438
|
+
def send_tick_to_observers
|
|
439
|
+
# If any observers are known then send them a tick
|
|
440
|
+
tick_observers=nil
|
|
441
|
+
@@mutex.synchronize {
|
|
442
|
+
tick_observers = @@tick_observers
|
|
443
|
+
}
|
|
444
|
+
tick_observers.each do |observer|
|
|
445
|
+
observer.tick
|
|
446
|
+
end
|
|
447
|
+
end
|
|
448
|
+
end
|
|
449
|
+
end
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
#--
|
|
2
|
+
#Copyright 2007 Nominet UK
|
|
3
|
+
#
|
|
4
|
+
#Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
#you may not use this file except in compliance with the License.
|
|
6
|
+
#You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
#Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
#distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
#See the License for the specific language governing permissions and
|
|
14
|
+
#limitations under the License.
|
|
15
|
+
#++
|
|
16
|
+
module Dnsruby
|
|
17
|
+
#Dnsruby::Update is a subclass of Dnsruby::Packet,
|
|
18
|
+
#to be used for making DNS dynamic updates. Programmers
|
|
19
|
+
#should refer to RFC 2136 for the semantics of dynamic updates.
|
|
20
|
+
|
|
21
|
+
#The first example below shows a complete program; subsequent examples
|
|
22
|
+
#show only the creation of the update packet.
|
|
23
|
+
#
|
|
24
|
+
#== Add a new host
|
|
25
|
+
#
|
|
26
|
+
# require 'Dnsruby'
|
|
27
|
+
#
|
|
28
|
+
# # Create the update packet.
|
|
29
|
+
# update = Dnsruby::Update.new('example.com')
|
|
30
|
+
#
|
|
31
|
+
# # Prerequisite is that no A records exist for the name.
|
|
32
|
+
# update.absent('foo.example.com.', 'A')
|
|
33
|
+
#
|
|
34
|
+
# # Add two A records for the name.
|
|
35
|
+
# update.add('foo.example.com.', 'A', 86400, '192.168.1.2')
|
|
36
|
+
# update.add('foo.example.com.', 'A', 86400, '172.16.3.4')
|
|
37
|
+
#
|
|
38
|
+
# # Send the update to the zone's primary master.
|
|
39
|
+
# res = Dnsruby::Resolver.new({:nameserver => 'primary-master.example.com'})
|
|
40
|
+
#
|
|
41
|
+
# begin
|
|
42
|
+
# reply = res.send_message(update)
|
|
43
|
+
# print "Update succeeded\n"
|
|
44
|
+
# rescue Exception => e
|
|
45
|
+
# print 'Update failed: #{e}\n'
|
|
46
|
+
# end
|
|
47
|
+
#
|
|
48
|
+
#== Add an MX record for a name that already exists
|
|
49
|
+
#
|
|
50
|
+
# update = Dnsruby::Update.new('example.com')
|
|
51
|
+
# update.present('example.com')
|
|
52
|
+
# update.add('example.com', Dnsruby::Types.MX, 10, 'mailhost.example.com')
|
|
53
|
+
#
|
|
54
|
+
#== Add a TXT record for a name that doesn't exist
|
|
55
|
+
#
|
|
56
|
+
# update = Dnsruby::Update.new('example.com')
|
|
57
|
+
# update.absent('info.example.com')
|
|
58
|
+
# update.add('info.example.com', Types.TXT, 86400, "yabba dabba doo"')
|
|
59
|
+
#
|
|
60
|
+
#== Delete all A records for a name
|
|
61
|
+
#
|
|
62
|
+
# update = Dnsruby::Update.new('example.com')
|
|
63
|
+
# update.present('foo.example.com', 'A')
|
|
64
|
+
# update.delete('foo.example.com', 'A')
|
|
65
|
+
#
|
|
66
|
+
#== Delete all RRs for a name
|
|
67
|
+
#
|
|
68
|
+
# update = Dnsruby::Update.new('example.com')
|
|
69
|
+
# update.present('byebye.example.com')
|
|
70
|
+
# update.delete('byebye.example.com')
|
|
71
|
+
#
|
|
72
|
+
#== Perform a signed update
|
|
73
|
+
#
|
|
74
|
+
# key_name = 'tsig-key'
|
|
75
|
+
# key = 'awwLOtRfpGE+rRKF2+DEiw=='
|
|
76
|
+
#
|
|
77
|
+
# update = Dnsruby::Update.new('example.com')
|
|
78
|
+
# update.add('foo.example.com', 'A', 86400, 10.1.2.3'))
|
|
79
|
+
# update.add('bar.example.com', 'A', 86400, 10.4.5.6'))
|
|
80
|
+
# res.tsig=(key_name,key)
|
|
81
|
+
#
|
|
82
|
+
class Update < Message
|
|
83
|
+
#Returns a Dnsruby::Update object suitable for performing a DNS
|
|
84
|
+
#dynamic update. Specifically, it creates a message with the header
|
|
85
|
+
#opcode set to UPDATE and the zone record type to SOA (per RFC 2136,
|
|
86
|
+
#Section 2.3).
|
|
87
|
+
#
|
|
88
|
+
#Programs must use the push method to add RRs to the prerequisite,
|
|
89
|
+
#update, and additional sections before performing the update.
|
|
90
|
+
#
|
|
91
|
+
#Arguments are the zone name and the class. If the zone is omitted,
|
|
92
|
+
#the default domain will be taken from the resolver configuration.
|
|
93
|
+
#If the class is omitted, it defaults to IN.
|
|
94
|
+
# packet = Dnsruby::Update.new
|
|
95
|
+
# packet = Dnsruby::Update.new('example.com')
|
|
96
|
+
# packet = Dnsruby::Update.new('example.com', 'HS')
|
|
97
|
+
#
|
|
98
|
+
def initialize(zone=nil, klass=nil)
|
|
99
|
+
|
|
100
|
+
# sort out the zone section (RFC2136, section 2.3)
|
|
101
|
+
if (zone==nil)
|
|
102
|
+
config = Config.new
|
|
103
|
+
zone = (config.search)[0]
|
|
104
|
+
return unless zone
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
type = 'SOA'
|
|
108
|
+
klass ||= 'IN'
|
|
109
|
+
|
|
110
|
+
super(zone, type, klass) || return
|
|
111
|
+
|
|
112
|
+
@header.opcode=('UPDATE')
|
|
113
|
+
@header.rd=(0)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
#Ways to create the prerequisite records (exists, notexists, inuse, etc. - RFC2136, section 2.4)
|
|
117
|
+
#
|
|
118
|
+
# (1) RRset exists (value independent). At least one RR with a
|
|
119
|
+
# specified NAME and TYPE (in the zone and class specified by
|
|
120
|
+
# the Zone Section) must exist.
|
|
121
|
+
#
|
|
122
|
+
# update.present(name, type)
|
|
123
|
+
#
|
|
124
|
+
# (2) RRset exists (value dependent). A set of RRs with a
|
|
125
|
+
# specified NAME and TYPE exists and has the same members
|
|
126
|
+
# with the same RDATAs as the RRset specified here in this
|
|
127
|
+
# Section.
|
|
128
|
+
#
|
|
129
|
+
# update.present(name, type, rdata)
|
|
130
|
+
#
|
|
131
|
+
# (4) Name is in use. At least one RR with a specified NAME (in
|
|
132
|
+
# the zone and class specified by the Zone Section) must exist.
|
|
133
|
+
# Note that this prerequisite is NOT satisfied by empty
|
|
134
|
+
# nonterminals.
|
|
135
|
+
#
|
|
136
|
+
# update.present(name)
|
|
137
|
+
def present(*args)
|
|
138
|
+
ttl = 0
|
|
139
|
+
rdata = []
|
|
140
|
+
klass = Classes.ANY
|
|
141
|
+
if (args.length>=1) # domain (RFC2136, Section 2.4.4)
|
|
142
|
+
name = args[0]
|
|
143
|
+
type = Types.ANY
|
|
144
|
+
if (args.length>=2) # RRSET (RFC2136, Section 2.4.1)
|
|
145
|
+
type = args[1]
|
|
146
|
+
end
|
|
147
|
+
if (args.length > 2) # RRSET (RFC2136, Section 2.4.2)
|
|
148
|
+
klass = zone()[0].zclass
|
|
149
|
+
rdata=args[2]
|
|
150
|
+
end
|
|
151
|
+
rec = RR.create("#{name} #{ttl} #{klass} #{type} #{rdata}")
|
|
152
|
+
add_pre(rec)
|
|
153
|
+
return rec
|
|
154
|
+
else
|
|
155
|
+
raise ArgumentError.new("Wrong number of arguments (#{args.length} for 1 or 2) for Update#absent")
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
#Ways to create the prerequisite records (exists, notexists, inuse, etc. - RFC2136, section 2.4)
|
|
160
|
+
#Can be called with one arg :
|
|
161
|
+
#
|
|
162
|
+
# update.absent(name)
|
|
163
|
+
# (5) Name is not in use. No RR of any type is owned by a
|
|
164
|
+
# specified NAME. Note that this prerequisite IS satisfied by
|
|
165
|
+
# empty nonterminals.
|
|
166
|
+
#
|
|
167
|
+
#Or with two :
|
|
168
|
+
#
|
|
169
|
+
# update.absent(name, type)
|
|
170
|
+
# (3) RRset does not exist. No RRs with a specified NAME and TYPE
|
|
171
|
+
# (in the zone and class denoted by the Zone Section) can exist.
|
|
172
|
+
#
|
|
173
|
+
def absent(*args)
|
|
174
|
+
ttl = 0
|
|
175
|
+
rdata = []
|
|
176
|
+
klass = Classes.NONE
|
|
177
|
+
if (args.length>=1) # domain (RFC2136, Section 2.4.5)
|
|
178
|
+
name = args[0]
|
|
179
|
+
type = Types.ANY
|
|
180
|
+
if (args.length==2) # RRSET (RFC2136, Section 2.4.3)
|
|
181
|
+
type = args[1]
|
|
182
|
+
end
|
|
183
|
+
rec = RR.create("#{name} #{ttl} #{klass} #{type} #{rdata}")
|
|
184
|
+
add_pre(rec)
|
|
185
|
+
return rec
|
|
186
|
+
else
|
|
187
|
+
raise ArgumentError.new("Wrong number of arguments (#{args.length} for 1 or 2) for Update#absent")
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
#Ways to create the update records (add, delete, RFC2136, section 2.5)
|
|
192
|
+
# " 2.5.1 - Add To An RRset
|
|
193
|
+
#
|
|
194
|
+
# RRs are added to the Update Section whose NAME, TYPE, TTL, RDLENGTH
|
|
195
|
+
# and RDATA are those being added, and CLASS is the same as the zone
|
|
196
|
+
# class. Any duplicate RRs will be silently ignored by the primary
|
|
197
|
+
# master."
|
|
198
|
+
#
|
|
199
|
+
# update.add(rr)
|
|
200
|
+
# update.add([rr1, rr2])
|
|
201
|
+
# update.add(name, type, ttl, rdata)
|
|
202
|
+
#
|
|
203
|
+
def add(*args)
|
|
204
|
+
zoneclass=zone()[0].zclass
|
|
205
|
+
case args[0]
|
|
206
|
+
when Array
|
|
207
|
+
args[0].each do |resource|
|
|
208
|
+
add(resource)
|
|
209
|
+
end
|
|
210
|
+
when RR
|
|
211
|
+
# Make sure that the Class is the same as the zone
|
|
212
|
+
resource = args[0]
|
|
213
|
+
if (resource.klass != zoneclass)
|
|
214
|
+
raise ArgumentError.new("Wrong class #{resource.klass} for update (should be #{zoneclass})!")
|
|
215
|
+
end
|
|
216
|
+
add_update(resource)
|
|
217
|
+
return resource
|
|
218
|
+
else
|
|
219
|
+
name=args[0]
|
|
220
|
+
type=args[1]
|
|
221
|
+
ttl=args[2]
|
|
222
|
+
rdata=args[3]
|
|
223
|
+
resource = RR.create("#{name} #{ttl} #{zoneclass} #{type} #{rdata}")
|
|
224
|
+
add_update(resource)
|
|
225
|
+
return resource
|
|
226
|
+
end
|
|
227
|
+
# @TODO@ Should be able to take RRSet!
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
#Ways to create the update records (add, delete, RFC2136, section 2.5)
|
|
231
|
+
#
|
|
232
|
+
#2.5.2 - Delete An RRset
|
|
233
|
+
# update.delete(name, type)
|
|
234
|
+
#
|
|
235
|
+
#
|
|
236
|
+
#2.5.3 - Delete All RRsets From A Name
|
|
237
|
+
# update.delete(name)
|
|
238
|
+
#
|
|
239
|
+
#2.5.4 - Delete An RR From An RRset
|
|
240
|
+
# update.delete(name, type, rdata)
|
|
241
|
+
#
|
|
242
|
+
def delete(*args)
|
|
243
|
+
ttl = 0
|
|
244
|
+
klass = Classes.ANY
|
|
245
|
+
rdata=[]
|
|
246
|
+
resource = nil
|
|
247
|
+
case args.length
|
|
248
|
+
when 1 # name
|
|
249
|
+
resource = RR.create("#{args[0]} #{ttl} #{klass} #{Types.ANY} #{rdata}")
|
|
250
|
+
add_update(resource)
|
|
251
|
+
when 2 # name, type
|
|
252
|
+
resource = RR.create("#{args[0]} #{ttl} #{klass} #{args[1]} #{rdata}")
|
|
253
|
+
add_update(resource)
|
|
254
|
+
when 3 # name, type, rdata
|
|
255
|
+
klass = Classes.NONE
|
|
256
|
+
resource = RR.create("#{args[0]} #{ttl} #{klass} #{args[1]} #{args[2]}")
|
|
257
|
+
add_update(resource)
|
|
258
|
+
end
|
|
259
|
+
return resource
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
end
|