Dnsruby 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +34 -0
- data/doc/classes/Dnsruby/Classes.html +197 -0
- data/doc/classes/Dnsruby/Classes.src/M000157.html +23 -0
- data/doc/classes/Dnsruby/Classes.src/M000158.html +19 -0
- data/doc/classes/Dnsruby/CodeMapper.html +370 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000130.html +18 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000131.html +33 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000132.html +21 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000133.html +19 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000134.html +19 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000135.html +18 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000136.html +22 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000137.html +22 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000138.html +22 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000139.html +31 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000140.html +19 -0
- data/doc/classes/Dnsruby/Config.html +410 -0
- data/doc/classes/Dnsruby/Config.src/M000098.html +18 -0
- data/doc/classes/Dnsruby/Config.src/M000099.html +19 -0
- data/doc/classes/Dnsruby/Config.src/M000100.html +19 -0
- data/doc/classes/Dnsruby/Config.src/M000101.html +21 -0
- data/doc/classes/Dnsruby/Config.src/M000102.html +21 -0
- data/doc/classes/Dnsruby/Config.src/M000103.html +38 -0
- data/doc/classes/Dnsruby/Config.src/M000104.html +26 -0
- data/doc/classes/Dnsruby/Config.src/M000105.html +22 -0
- data/doc/classes/Dnsruby/Config.src/M000106.html +23 -0
- data/doc/classes/Dnsruby/Config.src/M000107.html +22 -0
- data/doc/classes/Dnsruby/Config.src/M000108.html +18 -0
- data/doc/classes/Dnsruby/DNS/DecodeError.html +111 -0
- data/doc/classes/Dnsruby/DNS/EncodeError.html +111 -0
- data/doc/classes/Dnsruby/DNS.html +469 -0
- data/doc/classes/Dnsruby/DNS.src/M000196.html +24 -0
- data/doc/classes/Dnsruby/DNS.src/M000197.html +18 -0
- data/doc/classes/Dnsruby/DNS.src/M000198.html +18 -0
- data/doc/classes/Dnsruby/DNS.src/M000199.html +20 -0
- data/doc/classes/Dnsruby/DNS.src/M000200.html +19 -0
- data/doc/classes/Dnsruby/DNS.src/M000201.html +20 -0
- data/doc/classes/Dnsruby/DNS.src/M000202.html +18 -0
- data/doc/classes/Dnsruby/DNS.src/M000203.html +19 -0
- data/doc/classes/Dnsruby/DNS.src/M000204.html +20 -0
- data/doc/classes/Dnsruby/DNS.src/M000205.html +28 -0
- data/doc/classes/Dnsruby/DNS.src/M000206.html +19 -0
- data/doc/classes/Dnsruby/DNS.src/M000207.html +20 -0
- data/doc/classes/Dnsruby/DNS.src/M000208.html +41 -0
- data/doc/classes/Dnsruby/DNS.src/M000209.html +32 -0
- data/doc/classes/Dnsruby/DNS.src/M000210.html +50 -0
- data/doc/classes/Dnsruby/DNSSEC/Algorithms.html +154 -0
- data/doc/classes/Dnsruby/DNSSEC.html +111 -0
- data/doc/classes/Dnsruby/DecodeError.html +111 -0
- data/doc/classes/Dnsruby/EncodeError.html +111 -0
- data/doc/classes/Dnsruby/FormErr.html +113 -0
- data/doc/classes/Dnsruby/Header.html +516 -0
- data/doc/classes/Dnsruby/Header.src/M000168.html +35 -0
- data/doc/classes/Dnsruby/Header.src/M000169.html +18 -0
- data/doc/classes/Dnsruby/Header.src/M000170.html +18 -0
- data/doc/classes/Dnsruby/Header.src/M000171.html +21 -0
- data/doc/classes/Dnsruby/Header.src/M000172.html +20 -0
- data/doc/classes/Dnsruby/Header.src/M000173.html +32 -0
- data/doc/classes/Dnsruby/Header.src/M000174.html +26 -0
- data/doc/classes/Dnsruby/Header.src/M000175.html +47 -0
- data/doc/classes/Dnsruby/Header.src/M000176.html +28 -0
- data/doc/classes/Dnsruby/Header.src/M000177.html +18 -0
- data/doc/classes/Dnsruby/Header.src/M000178.html +18 -0
- data/doc/classes/Dnsruby/Header.src/M000179.html +30 -0
- data/doc/classes/Dnsruby/Hosts.html +305 -0
- data/doc/classes/Dnsruby/Hosts.src/M000141.html +20 -0
- data/doc/classes/Dnsruby/Hosts.src/M000142.html +49 -0
- data/doc/classes/Dnsruby/Hosts.src/M000143.html +19 -0
- data/doc/classes/Dnsruby/Hosts.src/M000144.html +20 -0
- data/doc/classes/Dnsruby/Hosts.src/M000145.html +21 -0
- data/doc/classes/Dnsruby/Hosts.src/M000146.html +19 -0
- data/doc/classes/Dnsruby/Hosts.src/M000147.html +20 -0
- data/doc/classes/Dnsruby/Hosts.src/M000148.html +21 -0
- data/doc/classes/Dnsruby/IPv4.html +298 -0
- data/doc/classes/Dnsruby/IPv4.src/M000149.html +32 -0
- data/doc/classes/Dnsruby/IPv4.src/M000150.html +21 -0
- data/doc/classes/Dnsruby/IPv4.src/M000151.html +18 -0
- data/doc/classes/Dnsruby/IPv4.src/M000152.html +18 -0
- data/doc/classes/Dnsruby/IPv4.src/M000153.html +19 -0
- data/doc/classes/Dnsruby/IPv4.src/M000154.html +18 -0
- data/doc/classes/Dnsruby/IPv4.src/M000155.html +18 -0
- data/doc/classes/Dnsruby/IPv4.src/M000156.html +18 -0
- data/doc/classes/Dnsruby/IPv6.html +318 -0
- data/doc/classes/Dnsruby/IPv6.src/M000180.html +60 -0
- data/doc/classes/Dnsruby/IPv6.src/M000181.html +21 -0
- data/doc/classes/Dnsruby/IPv6.src/M000182.html +22 -0
- data/doc/classes/Dnsruby/IPv6.src/M000183.html +18 -0
- data/doc/classes/Dnsruby/IPv6.src/M000184.html +21 -0
- data/doc/classes/Dnsruby/IPv6.src/M000185.html +18 -0
- data/doc/classes/Dnsruby/IPv6.src/M000186.html +18 -0
- data/doc/classes/Dnsruby/IPv6.src/M000187.html +18 -0
- data/doc/classes/Dnsruby/Message.html +689 -0
- data/doc/classes/Dnsruby/Message.src/M000076.html +34 -0
- data/doc/classes/Dnsruby/Message.src/M000077.html +26 -0
- data/doc/classes/Dnsruby/Message.src/M000078.html +22 -0
- data/doc/classes/Dnsruby/Message.src/M000079.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000080.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000081.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000082.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000083.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000084.html +21 -0
- data/doc/classes/Dnsruby/Message.src/M000085.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000086.html +18 -0
- data/doc/classes/Dnsruby/Message.src/M000087.html +54 -0
- data/doc/classes/Dnsruby/Message.src/M000088.html +42 -0
- data/doc/classes/Dnsruby/Message.src/M000089.html +45 -0
- data/doc/classes/Dnsruby/MetaTypes.html +136 -0
- data/doc/classes/Dnsruby/Modes.html +171 -0
- data/doc/classes/Dnsruby/NXDomain.html +113 -0
- data/doc/classes/Dnsruby/Name/Label.html +300 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000067.html +21 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000068.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000069.html +22 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000070.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000071.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000072.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000073.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000074.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000075.html +18 -0
- data/doc/classes/Dnsruby/Name.html +357 -0
- data/doc/classes/Dnsruby/Name.src/M000057.html +28 -0
- data/doc/classes/Dnsruby/Name.src/M000058.html +20 -0
- data/doc/classes/Dnsruby/Name.src/M000059.html +18 -0
- data/doc/classes/Dnsruby/Name.src/M000060.html +18 -0
- data/doc/classes/Dnsruby/Name.src/M000061.html +21 -0
- data/doc/classes/Dnsruby/Name.src/M000062.html +19 -0
- data/doc/classes/Dnsruby/Name.src/M000064.html +22 -0
- data/doc/classes/Dnsruby/Name.src/M000065.html +18 -0
- data/doc/classes/Dnsruby/Name.src/M000066.html +20 -0
- data/doc/classes/Dnsruby/NotImp.html +113 -0
- data/doc/classes/Dnsruby/OpCode.html +146 -0
- data/doc/classes/Dnsruby/OtherResolvError.html +113 -0
- data/doc/classes/Dnsruby/QTypes.html +146 -0
- data/doc/classes/Dnsruby/Question.html +256 -0
- data/doc/classes/Dnsruby/Question.src/M000166.html +47 -0
- data/doc/classes/Dnsruby/Question.src/M000167.html +18 -0
- data/doc/classes/Dnsruby/RCode.html +211 -0
- data/doc/classes/Dnsruby/RR/ANY.html +133 -0
- data/doc/classes/Dnsruby/RR/CERT/CertificateTypes.html +169 -0
- data/doc/classes/Dnsruby/RR/CERT.html +180 -0
- data/doc/classes/Dnsruby/RR/CNAME.html +150 -0
- data/doc/classes/Dnsruby/RR/DNAME.html +150 -0
- data/doc/classes/Dnsruby/RR/DomainName.html +175 -0
- data/doc/classes/Dnsruby/RR/DomainName.src/M000051.html +22 -0
- data/doc/classes/Dnsruby/RR/Generic.html +156 -0
- data/doc/classes/Dnsruby/RR/Generic.src/M000041.html +25 -0
- data/doc/classes/Dnsruby/RR/HINFO.html +155 -0
- data/doc/classes/Dnsruby/RR/IN/A.html +199 -0
- data/doc/classes/Dnsruby/RR/IN/A.src/M000018.html +18 -0
- data/doc/classes/Dnsruby/RR/IN/A.src/M000019.html +18 -0
- data/doc/classes/Dnsruby/RR/IN/A.src/M000020.html +18 -0
- data/doc/classes/Dnsruby/RR/IN/AAAA.html +138 -0
- data/doc/classes/Dnsruby/RR/IN/AFSDB.html +145 -0
- data/doc/classes/Dnsruby/RR/IN/PX.html +143 -0
- data/doc/classes/Dnsruby/RR/IN/SRV.html +243 -0
- data/doc/classes/Dnsruby/RR/IN/SRV.src/M000015.html +29 -0
- data/doc/classes/Dnsruby/RR/IN/SRV.src/M000016.html +26 -0
- data/doc/classes/Dnsruby/RR/IN/SRV.src/M000017.html +22 -0
- data/doc/classes/Dnsruby/RR/IN/WKS.html +166 -0
- data/doc/classes/Dnsruby/RR/IN/WKS.src/M000021.html +20 -0
- data/doc/classes/Dnsruby/RR/IN.html +155 -0
- data/doc/classes/Dnsruby/RR/ISDN.html +155 -0
- data/doc/classes/Dnsruby/RR/LOC.html +395 -0
- data/doc/classes/Dnsruby/RR/LOC.src/M000025.html +32 -0
- data/doc/classes/Dnsruby/RR/LOC.src/M000026.html +23 -0
- data/doc/classes/Dnsruby/RR/LOC.src/M000027.html +25 -0
- data/doc/classes/Dnsruby/RR/LOC.src/M000028.html +21 -0
- data/doc/classes/Dnsruby/RR/LOC.src/M000029.html +20 -0
- data/doc/classes/Dnsruby/RR/LOC.src/M000030.html +23 -0
- data/doc/classes/Dnsruby/RR/MB.html +150 -0
- data/doc/classes/Dnsruby/RR/MG.html +150 -0
- data/doc/classes/Dnsruby/RR/MINFO.html +156 -0
- data/doc/classes/Dnsruby/RR/MR.html +150 -0
- data/doc/classes/Dnsruby/RR/MX.html +155 -0
- data/doc/classes/Dnsruby/RR/NAPTR.html +190 -0
- data/doc/classes/Dnsruby/RR/NS.html +150 -0
- data/doc/classes/Dnsruby/RR/NSAP.html +293 -0
- data/doc/classes/Dnsruby/RR/NSAP.src/M000053.html +19 -0
- data/doc/classes/Dnsruby/RR/NSAP.src/M000054.html +19 -0
- data/doc/classes/Dnsruby/RR/NSAP.src/M000055.html +22 -0
- data/doc/classes/Dnsruby/RR/NSAP.src/M000056.html +31 -0
- data/doc/classes/Dnsruby/RR/PTR.html +132 -0
- data/doc/classes/Dnsruby/RR/RP.html +183 -0
- data/doc/classes/Dnsruby/RR/RP.src/M000050.html +19 -0
- data/doc/classes/Dnsruby/RR/RT.html +155 -0
- data/doc/classes/Dnsruby/RR/SOA.html +230 -0
- data/doc/classes/Dnsruby/RR/SOA.src/M000039.html +24 -0
- data/doc/classes/Dnsruby/RR/SOA.src/M000040.html +27 -0
- data/doc/classes/Dnsruby/RR/SPF.html +138 -0
- data/doc/classes/Dnsruby/RR/TKEY.html +285 -0
- data/doc/classes/Dnsruby/RR/TKEY.src/M000022.html +19 -0
- data/doc/classes/Dnsruby/RR/TKEY.src/M000023.html +29 -0
- data/doc/classes/Dnsruby/RR/TKEY.src/M000024.html +30 -0
- data/doc/classes/Dnsruby/RR/TSIG.html +416 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000042.html +22 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000043.html +71 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000044.html +34 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000045.html +37 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000046.html +31 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000047.html +34 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000048.html +22 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000049.html +29 -0
- data/doc/classes/Dnsruby/RR/TXT.html +233 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000034.html +18 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000035.html +18 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000036.html +20 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000037.html +27 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000038.html +25 -0
- data/doc/classes/Dnsruby/RR/X25.html +203 -0
- data/doc/classes/Dnsruby/RR/X25.src/M000031.html +18 -0
- data/doc/classes/Dnsruby/RR/X25.src/M000032.html +18 -0
- data/doc/classes/Dnsruby/RR/X25.src/M000033.html +22 -0
- data/doc/classes/Dnsruby/RR.html +620 -0
- data/doc/classes/Dnsruby/RR.src/M000001.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000002.html +22 -0
- data/doc/classes/Dnsruby/RR.src/M000003.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000004.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000005.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000006.html +36 -0
- data/doc/classes/Dnsruby/RR.src/M000007.html +100 -0
- data/doc/classes/Dnsruby/RR.src/M000008.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000009.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000010.html +22 -0
- data/doc/classes/Dnsruby/RR.src/M000011.html +22 -0
- data/doc/classes/Dnsruby/RR.src/M000012.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000013.html +22 -0
- data/doc/classes/Dnsruby/RR.src/M000014.html +24 -0
- data/doc/classes/Dnsruby/RRSet.html +257 -0
- data/doc/classes/Dnsruby/RRSet.src/M000159.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000160.html +44 -0
- data/doc/classes/Dnsruby/RRSet.src/M000161.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000162.html +20 -0
- data/doc/classes/Dnsruby/RRSet.src/M000163.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000164.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000165.html +18 -0
- data/doc/classes/Dnsruby/Refused.html +113 -0
- data/doc/classes/Dnsruby/Resolv.html +400 -0
- data/doc/classes/Dnsruby/Resolv.src/M000109.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000110.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000111.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000112.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000113.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000114.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000115.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000116.html +19 -0
- data/doc/classes/Dnsruby/Resolv.src/M000117.html +20 -0
- data/doc/classes/Dnsruby/Resolv.src/M000118.html +29 -0
- data/doc/classes/Dnsruby/Resolv.src/M000119.html +19 -0
- data/doc/classes/Dnsruby/Resolv.src/M000120.html +20 -0
- data/doc/classes/Dnsruby/Resolv.src/M000121.html +25 -0
- data/doc/classes/Dnsruby/ResolvError.html +111 -0
- data/doc/classes/Dnsruby/ResolvTimeout.html +111 -0
- data/doc/classes/Dnsruby/Resolver.html +807 -0
- data/doc/classes/Dnsruby/Resolver.src/M000211.html +21 -0
- data/doc/classes/Dnsruby/Resolver.src/M000212.html +37 -0
- data/doc/classes/Dnsruby/Resolver.src/M000213.html +64 -0
- data/doc/classes/Dnsruby/Resolver.src/M000214.html +23 -0
- data/doc/classes/Dnsruby/Resolver.src/M000215.html +46 -0
- data/doc/classes/Dnsruby/Resolver.src/M000216.html +21 -0
- data/doc/classes/Dnsruby/Resolver.src/M000217.html +22 -0
- data/doc/classes/Dnsruby/Resolver.src/M000218.html +18 -0
- data/doc/classes/Dnsruby/Resolver.src/M000219.html +20 -0
- data/doc/classes/Dnsruby/Resolver.src/M000220.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000221.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000222.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000223.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000224.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000225.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000226.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000227.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000228.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000229.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000230.html +19 -0
- data/doc/classes/Dnsruby/ServFail.html +113 -0
- data/doc/classes/Dnsruby/SingleResolver.html +496 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000122.html +18 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000123.html +19 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000124.html +49 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000125.html +18 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000126.html +21 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000127.html +25 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000128.html +78 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000129.html +21 -0
- data/doc/classes/Dnsruby/TheLog.html +196 -0
- data/doc/classes/Dnsruby/TheLog.src/M000188.html +20 -0
- data/doc/classes/Dnsruby/TheLog.src/M000189.html +20 -0
- data/doc/classes/Dnsruby/TheLog.src/M000190.html +20 -0
- data/doc/classes/Dnsruby/Types.html +426 -0
- data/doc/classes/Dnsruby/Update.html +368 -0
- data/doc/classes/Dnsruby/Update.src/M000191.html +32 -0
- data/doc/classes/Dnsruby/Update.src/M000192.html +37 -0
- data/doc/classes/Dnsruby/Update.src/M000193.html +32 -0
- data/doc/classes/Dnsruby/Update.src/M000194.html +41 -0
- data/doc/classes/Dnsruby/Update.src/M000195.html +34 -0
- data/doc/classes/Dnsruby/ZoneTransfer/Delta.html +183 -0
- data/doc/classes/Dnsruby/ZoneTransfer/Delta.src/M000097.html +19 -0
- data/doc/classes/Dnsruby/ZoneTransfer.html +248 -0
- data/doc/classes/Dnsruby/ZoneTransfer.src/M000095.html +22 -0
- data/doc/classes/Dnsruby/ZoneTransfer.src/M000096.html +35 -0
- data/doc/classes/Dnsruby.html +388 -0
- data/doc/created.rid +1 -0
- data/doc/files/lib/Dnsruby/Config_rb.html +101 -0
- data/doc/files/lib/Dnsruby/DNSSEC_rb.html +101 -0
- data/doc/files/lib/Dnsruby/DNS_rb.html +110 -0
- data/doc/files/lib/Dnsruby/Hosts_rb.html +108 -0
- data/doc/files/lib/Dnsruby/Resolver_rb.html +108 -0
- data/doc/files/lib/Dnsruby/SingleResolver_rb.html +108 -0
- data/doc/files/lib/Dnsruby/TheLog_rb.html +110 -0
- data/doc/files/lib/Dnsruby/code_mapper_rb.html +101 -0
- data/doc/files/lib/Dnsruby/ipv4_rb.html +101 -0
- data/doc/files/lib/Dnsruby/ipv6_rb.html +101 -0
- data/doc/files/lib/Dnsruby/message_rb.html +109 -0
- data/doc/files/lib/Dnsruby/name_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/AAAA_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/AFSDB_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/A_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/CERT_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/HINFO_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/IN_rb.html +112 -0
- data/doc/files/lib/Dnsruby/resource/ISDN_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/LOC_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/MINFO_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/MX_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/NAPTR_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/NSAP_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/OPT_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/PX_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/RP_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/RT_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/SOA_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/SPF_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/SRV_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/TKEY_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/TSIG_rb.html +110 -0
- data/doc/files/lib/Dnsruby/resource/TXT_rb.html +108 -0
- data/doc/files/lib/Dnsruby/resource/X25_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/domain_name_rb.html +101 -0
- data/doc/files/lib/Dnsruby/resource/generic_rb.html +125 -0
- data/doc/files/lib/Dnsruby/resource/resource_rb.html +110 -0
- data/doc/files/lib/Dnsruby/select_thread_rb.html +111 -0
- data/doc/files/lib/Dnsruby/update_rb.html +101 -0
- data/doc/files/lib/Dnsruby/zone_transfer_rb.html +101 -0
- data/doc/files/lib/dnsruby_rb.html +118 -0
- data/doc/fr_class_index.html +102 -0
- data/doc/fr_file_index.html +68 -0
- data/doc/fr_method_index.html +256 -0
- data/doc/index.html +24 -0
- data/lib/Dnsruby/Config.rb +350 -0
- data/lib/Dnsruby/DNS.rb +253 -0
- data/lib/Dnsruby/DNSSEC.rb +29 -0
- data/lib/Dnsruby/Hosts.rb +119 -0
- data/lib/Dnsruby/Resolver.rb +618 -0
- data/lib/Dnsruby/SingleResolver.rb +312 -0
- data/lib/Dnsruby/TheLog.rb +61 -0
- data/lib/Dnsruby/code_mapper.rb +164 -0
- data/lib/Dnsruby/ipv4.rb +83 -0
- data/lib/Dnsruby/ipv6.rb +142 -0
- data/lib/Dnsruby/message.rb +819 -0
- data/lib/Dnsruby/name.rb +325 -0
- data/lib/Dnsruby/resource/A.rb +56 -0
- data/lib/Dnsruby/resource/AAAA.rb +54 -0
- data/lib/Dnsruby/resource/AFSDB.rb +68 -0
- data/lib/Dnsruby/resource/CERT.rb +89 -0
- data/lib/Dnsruby/resource/HINFO.rb +52 -0
- data/lib/Dnsruby/resource/IN.rb +69 -0
- data/lib/Dnsruby/resource/ISDN.rb +54 -0
- data/lib/Dnsruby/resource/LOC.rb +255 -0
- data/lib/Dnsruby/resource/MINFO.rb +66 -0
- data/lib/Dnsruby/resource/MX.rb +66 -0
- data/lib/Dnsruby/resource/NAPTR.rb +90 -0
- data/lib/Dnsruby/resource/NSAP.rb +172 -0
- data/lib/Dnsruby/resource/OPT.rb +153 -0
- data/lib/Dnsruby/resource/PX.rb +71 -0
- data/lib/Dnsruby/resource/RP.rb +67 -0
- data/lib/Dnsruby/resource/RT.rb +67 -0
- data/lib/Dnsruby/resource/SOA.rb +89 -0
- data/lib/Dnsruby/resource/SPF.rb +29 -0
- data/lib/Dnsruby/resource/SRV.rb +108 -0
- data/lib/Dnsruby/resource/TKEY.rb +160 -0
- data/lib/Dnsruby/resource/TSIG.rb +328 -0
- data/lib/Dnsruby/resource/TXT.rb +76 -0
- data/lib/Dnsruby/resource/X25.rb +53 -0
- data/lib/Dnsruby/resource/domain_name.rb +58 -0
- data/lib/Dnsruby/resource/generic.rb +142 -0
- data/lib/Dnsruby/resource/resource.rb +444 -0
- data/lib/Dnsruby/select_thread.rb +474 -0
- data/lib/Dnsruby/update.rb +263 -0
- data/lib/Dnsruby/zone_transfer.rb +296 -0
- data/lib/dnsruby.rb +468 -0
- data/test/custom.txt +4 -0
- data/test/resolv.conf +4 -0
- data/test/tc_axfr.rb +42 -0
- data/test/tc_dns.rb +231 -0
- data/test/tc_dnsruby.rb +42 -0
- data/test/tc_escapedchars.rb +510 -0
- data/test/tc_header.rb +104 -0
- data/test/tc_misc.rb +139 -0
- data/test/tc_name.rb +53 -0
- data/test/tc_packet.rb +158 -0
- data/test/tc_packet_unique_push.rb +102 -0
- data/test/tc_question.rb +52 -0
- data/test/tc_res_config.rb +92 -0
- data/test/tc_res_env.rb +62 -0
- data/test/tc_res_file.rb +42 -0
- data/test/tc_res_opt.rb +185 -0
- data/test/tc_resolver.rb +177 -0
- data/test/tc_rr-opt.rb +42 -0
- data/test/tc_rr-txt.rb +137 -0
- data/test/tc_rr-unknown.rb +99 -0
- data/test/tc_rr.rb +259 -0
- data/test/tc_single_resolver.rb +153 -0
- data/test/tc_soak.rb +310 -0
- data/test/tc_tcp.rb +35 -0
- data/test/tc_tkey.rb +106 -0
- data/test/tc_update.rb +215 -0
- data/test/ts_dnsruby.rb +17 -0
- data/test/ts_offline.rb +35 -0
- data/test/ts_online.rb +40 -0
- metadata +512 -0
|
@@ -0,0 +1,474 @@
|
|
|
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
|
+
# @todo@ How do we ensure that sockets all get closed?
|
|
47
|
+
#
|
|
48
|
+
# @todo@ Should the thread be killed when no queries are active?
|
|
49
|
+
|
|
50
|
+
# For each query to monitor, we need to know :
|
|
51
|
+
# |a) The socket the query was sent on
|
|
52
|
+
# |b) The query header ID
|
|
53
|
+
# c) The query response queue
|
|
54
|
+
# So we could have a hash which maps <socket, headerID> to <queue>
|
|
55
|
+
# Note that multiple values of <queue> could refer to the same Queue
|
|
56
|
+
def initialize
|
|
57
|
+
@@mutex = Mutex.new
|
|
58
|
+
@@mutex.synchronize {
|
|
59
|
+
@@in_select=false
|
|
60
|
+
# @@notifier,@@notified=IO.pipe
|
|
61
|
+
@@sockets = [] # @@notified]
|
|
62
|
+
@@timeouts = Hash.new
|
|
63
|
+
# @@mutex.synchronize do
|
|
64
|
+
@@query_hash = Hash.new
|
|
65
|
+
@@socket_hash = Hash.new
|
|
66
|
+
@@observers = Hash.new
|
|
67
|
+
@@tick_observers = []
|
|
68
|
+
@@queued_exceptions=[]
|
|
69
|
+
# end
|
|
70
|
+
# Now start the select thread
|
|
71
|
+
@@select_thread = Thread.new {
|
|
72
|
+
do_select
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
class QuerySettings
|
|
78
|
+
attr_accessor :query, :query_header_id, :tsig, :ignore_truncation, :client_queue,
|
|
79
|
+
:client_query_id, :socket, :dest_server, :dest_port, :endtime
|
|
80
|
+
# new(query, query_header_id, tsig, ignore_truncation, client_queue, client_query_id,
|
|
81
|
+
# socket, dest_server, dest_port, endtime)
|
|
82
|
+
def initialize(*args)
|
|
83
|
+
@query = args[0]
|
|
84
|
+
@query_header_id = args[1]
|
|
85
|
+
@tsig=args[2]
|
|
86
|
+
@ignore_truncation=args[3]
|
|
87
|
+
@client_queue = args[4]
|
|
88
|
+
@client_query_id = args[5]
|
|
89
|
+
@socket = args[6]
|
|
90
|
+
@dest_server = args[7]
|
|
91
|
+
@dest_port=args[8]
|
|
92
|
+
@endtime = args[9]
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def add_to_select(query_settings)
|
|
97
|
+
# Add the query to sockets, and then wake the select thread up
|
|
98
|
+
@@mutex.synchronize {
|
|
99
|
+
check_select_thread_synchronized
|
|
100
|
+
@@query_hash[query_settings.client_query_id]=query_settings
|
|
101
|
+
@@socket_hash[query_settings.socket]=[query_settings.client_query_id] # @todo@ If we use persistent sockets then we need to update this array
|
|
102
|
+
@@timeouts[query_settings.client_query_id]=query_settings.endtime
|
|
103
|
+
@@sockets.push(query_settings.socket)
|
|
104
|
+
|
|
105
|
+
# # Only do this if we're currently in select
|
|
106
|
+
# if @@in_select
|
|
107
|
+
# @@in_select=false
|
|
108
|
+
# p "in_select now false - sending signal"
|
|
109
|
+
# @@select_thread.raise SelectWakeup # Wake up the select thread so it listens to socket too
|
|
110
|
+
# # # @todo@ This would probably be more elegant if we send a signal through select
|
|
111
|
+
# end
|
|
112
|
+
}
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def check_select_thread_synchronized
|
|
116
|
+
if (!@@select_thread.alive?)
|
|
117
|
+
TheLog.debug("Restarting select thread")
|
|
118
|
+
@@select_thread = Thread.new {
|
|
119
|
+
do_select
|
|
120
|
+
}
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def select_thread_alive?
|
|
125
|
+
ret=true
|
|
126
|
+
@@mutex.synchronize{
|
|
127
|
+
ret = @@select_thread.alive?
|
|
128
|
+
}
|
|
129
|
+
return ret
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def do_select
|
|
133
|
+
unused_loop_count = 0
|
|
134
|
+
while true do
|
|
135
|
+
send_tick_to_observers
|
|
136
|
+
send_queued_exceptions
|
|
137
|
+
timeout = tick_time = (Time.now+0.1) - Time.now # We provide a timer service to various Dnsruby classes
|
|
138
|
+
sockets=[]
|
|
139
|
+
timeouts=[]
|
|
140
|
+
has_observer = false
|
|
141
|
+
@@mutex.synchronize {
|
|
142
|
+
sockets = @@sockets
|
|
143
|
+
timeouts = @@timeouts.values
|
|
144
|
+
has_observer = !@@observers.empty?
|
|
145
|
+
}
|
|
146
|
+
if (timeouts.length > 0)
|
|
147
|
+
timeouts.sort!
|
|
148
|
+
timeout = timeouts[0] - Time.now
|
|
149
|
+
if (timeout <= 0)
|
|
150
|
+
process_timeouts
|
|
151
|
+
timeout = 0
|
|
152
|
+
next
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
ready=nil
|
|
156
|
+
if (has_observer && (timeout > tick_time))
|
|
157
|
+
timeout = tick_time
|
|
158
|
+
end
|
|
159
|
+
begin
|
|
160
|
+
# @@mutex.synchronize{
|
|
161
|
+
# @@in_select=true
|
|
162
|
+
## p "in_select now true"
|
|
163
|
+
# }
|
|
164
|
+
ready, write, errors = IO.select(sockets, nil, nil, timeout)
|
|
165
|
+
# @@mutex.synchronize{
|
|
166
|
+
# @@in_select=false
|
|
167
|
+
## p "in_select now false"
|
|
168
|
+
# }
|
|
169
|
+
rescue SelectWakeup
|
|
170
|
+
# If SelectWakeup, then just restart this loop - the select call will be made with the new data
|
|
171
|
+
# p "signal received!"
|
|
172
|
+
next
|
|
173
|
+
end
|
|
174
|
+
# @@mutex.synchronize{
|
|
175
|
+
if (ready == nil)
|
|
176
|
+
# proces the timeouts
|
|
177
|
+
process_timeouts
|
|
178
|
+
unused_loop_count+=1
|
|
179
|
+
else
|
|
180
|
+
process_ready(ready)
|
|
181
|
+
unused_loop_count=0
|
|
182
|
+
# process_error(errors)
|
|
183
|
+
end
|
|
184
|
+
@@mutex.synchronize{
|
|
185
|
+
if (unused_loop_count > 10 && @@query_hash.empty? && @@observers.empty?)
|
|
186
|
+
TheLog.debug("Stopping select loop")
|
|
187
|
+
return
|
|
188
|
+
end
|
|
189
|
+
}
|
|
190
|
+
# }
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def process_error(errors)
|
|
195
|
+
TheLog.debug("Error! #{errors.inspect}")
|
|
196
|
+
# @todo@ Process errors [can we do this in single socket environment?]
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def process_ready(ready)
|
|
200
|
+
# while (ready.length > 0) do
|
|
201
|
+
# @@mutex.synchronize{
|
|
202
|
+
ready.each do |socket|
|
|
203
|
+
# if (socket==@@notified)
|
|
204
|
+
# @@notified.getc
|
|
205
|
+
# ## @@notified.close
|
|
206
|
+
# next
|
|
207
|
+
# end
|
|
208
|
+
# socket = ready.pop
|
|
209
|
+
packet_size = 512 # @todo@ Sort out per-query packet sizes
|
|
210
|
+
# @@mutex.synchronize{
|
|
211
|
+
msg = get_incoming_data(socket, packet_size)
|
|
212
|
+
if (msg!=nil)
|
|
213
|
+
send_response_to_client(msg, socket)
|
|
214
|
+
end
|
|
215
|
+
# }
|
|
216
|
+
ready.delete(socket)
|
|
217
|
+
end
|
|
218
|
+
# }
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def send_response_to_client(msg, socket)
|
|
222
|
+
# Figure out which client_ids we were expecting on this socket, then see if any header ids match up
|
|
223
|
+
client_ids=[]
|
|
224
|
+
@@mutex.synchronize{
|
|
225
|
+
client_ids = @@socket_hash[socket]
|
|
226
|
+
}
|
|
227
|
+
# get the queries associated with them
|
|
228
|
+
client_ids.each do |id|
|
|
229
|
+
query_header_id=nil
|
|
230
|
+
@@mutex.synchronize{
|
|
231
|
+
query_header_id = @@query_hash[id].query_header_id
|
|
232
|
+
}
|
|
233
|
+
if (query_header_id == msg.header.id)
|
|
234
|
+
# process the response
|
|
235
|
+
client_queue = nil
|
|
236
|
+
@@mutex.synchronize{
|
|
237
|
+
client_queue = @@query_hash[id].client_queue
|
|
238
|
+
}
|
|
239
|
+
remove_id(id)
|
|
240
|
+
exception = msg.header.getException
|
|
241
|
+
TheLog.debug("Pushing response to client queue")
|
|
242
|
+
client_queue.push([id, msg, exception])
|
|
243
|
+
notify_queue_observers(client_queue, id)
|
|
244
|
+
return
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
# If not, then we have an error
|
|
248
|
+
TheLog.error("Stray packet - " + msg.inspect + "\n from " + socket.inspect)
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
def remove_id(id)
|
|
252
|
+
socket=nil
|
|
253
|
+
@@mutex.synchronize{
|
|
254
|
+
socket = @@query_hash[id].socket
|
|
255
|
+
@@timeouts.delete(id)
|
|
256
|
+
@@query_hash.delete(id)
|
|
257
|
+
@@sockets.delete(socket) # @todo@ Not if persistent!
|
|
258
|
+
}
|
|
259
|
+
TheLog.debug("Closing socket #{socket}")
|
|
260
|
+
socket.close # @todo@ Not if persistent!
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def process_timeouts
|
|
264
|
+
time_now = Time.now
|
|
265
|
+
# timeouts = @@timeouts.values
|
|
266
|
+
# timeouts.sort!
|
|
267
|
+
timeouts={}
|
|
268
|
+
@@mutex.synchronize {
|
|
269
|
+
timeouts = @@timeouts
|
|
270
|
+
}
|
|
271
|
+
timeouts.each do |client_id, timeout|
|
|
272
|
+
if (timeout < time_now)
|
|
273
|
+
send_exception_to_client(ResolvTimeout.new("Query timed out"), nil, client_id)
|
|
274
|
+
# else
|
|
275
|
+
# return # @@timeouts is sorted, so all others will be later than this one
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
def tcp_read(socket, len)
|
|
281
|
+
buf=""
|
|
282
|
+
while (buf.length < len) do
|
|
283
|
+
buf += socket.recv(len-buf.length)
|
|
284
|
+
end
|
|
285
|
+
return buf
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
def get_incoming_data(socket, packet_size)
|
|
289
|
+
answerfrom,answerip,answerport,answersize=nil
|
|
290
|
+
ans,buf = nil
|
|
291
|
+
begin
|
|
292
|
+
if (socket.class == TCPSocket)
|
|
293
|
+
# @todo@ Ruby Bug #9061 stops this working right
|
|
294
|
+
# We'd like to do a socket.recvfrom, but that raises an Exception
|
|
295
|
+
# on Windows for TCPSocket for Ruby 1.8.5 (and 1.8.6).
|
|
296
|
+
# So, we need to do something different for TCP than UDP. *sigh*
|
|
297
|
+
# @todo@ This workaround will only work if there is exactly one socket per query
|
|
298
|
+
# - *not* ideal TCP use!
|
|
299
|
+
@@mutex.synchronize{
|
|
300
|
+
client_id = @@socket_hash[socket][0]
|
|
301
|
+
answerfrom = @@query_hash[client_id].dest_server
|
|
302
|
+
answerip = answerfrom
|
|
303
|
+
answerport = @@query_hash[client_id].dest_port
|
|
304
|
+
}
|
|
305
|
+
buf = tcp_read(socket, 2)
|
|
306
|
+
answersize = buf.unpack('n')[0]
|
|
307
|
+
buf = tcp_read(socket,answersize)
|
|
308
|
+
else
|
|
309
|
+
if (ret = socket.recvfrom(packet_size))
|
|
310
|
+
buf = ret[0]
|
|
311
|
+
answerport=ret[1][1]
|
|
312
|
+
answerfrom=ret[1][2]
|
|
313
|
+
answerip=ret[1][3]
|
|
314
|
+
answersize=(buf.length)
|
|
315
|
+
else
|
|
316
|
+
# recvfrom failed - why?
|
|
317
|
+
TheLog.error("Error - recvfrom failed from #{socket}")
|
|
318
|
+
handle_recvfrom_failure(socket)
|
|
319
|
+
return
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
rescue Exception => e
|
|
323
|
+
TheLog.error("Error - recvfrom failed from #{socket}, exception : #{e}")
|
|
324
|
+
handle_recvfrom_failure(socket)
|
|
325
|
+
return
|
|
326
|
+
end
|
|
327
|
+
TheLog.debug(";; answer from #{answerfrom} : #{answersize} bytes\n")
|
|
328
|
+
|
|
329
|
+
begin
|
|
330
|
+
ans = Message.decode(buf)
|
|
331
|
+
rescue Exception => e
|
|
332
|
+
TheLog.error("Decode error! #{e.class}, #{e}\nfor msg (length=#{buf.length}) : #{buf}")
|
|
333
|
+
client_id=get_client_id_from_answerfrom(socket, answerip, answerport)
|
|
334
|
+
if (client_id != nil)
|
|
335
|
+
send_exception_to_client(e, socket, client_id)
|
|
336
|
+
else
|
|
337
|
+
TheLog.error("Decode error from #{answerfrom} but can't determine packet id")
|
|
338
|
+
end
|
|
339
|
+
return
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
if (ans!= nil)
|
|
343
|
+
TheLog.debug("#{ans}")
|
|
344
|
+
ans.answerfrom=(answerfrom)
|
|
345
|
+
ans.answersize=(answersize)
|
|
346
|
+
end
|
|
347
|
+
return ans
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
def handle_recvfrom_failure(socket)
|
|
351
|
+
# @todo@ No way to notify the client about this error, unless there was only one connection on the socket
|
|
352
|
+
ids_for_socket = []
|
|
353
|
+
@@mutex.synchronize{
|
|
354
|
+
ids_for_socket = @@socket_hash[socket]
|
|
355
|
+
}
|
|
356
|
+
if (ids_for_socket.length == 1)
|
|
357
|
+
answerfrom=nil
|
|
358
|
+
@@mutex.synchronize{
|
|
359
|
+
query_settings = @@query_hash[ids_for_socket[0]]
|
|
360
|
+
answerfrom=query_settings.dest_server
|
|
361
|
+
}
|
|
362
|
+
send_exception_to_client(OtherResolvError.new("recvfrom failed from #{answerfrom}"), socket, ids_for_socket[0])
|
|
363
|
+
else
|
|
364
|
+
TheLog.fatal("Recvfrom failed from #{socket}, no way to tell query id")
|
|
365
|
+
end
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
def get_client_id_from_answerfrom(socket, answerip, answerport)
|
|
369
|
+
client_id=nil
|
|
370
|
+
# Figure out client id from answerfrom
|
|
371
|
+
@@mutex.synchronize{
|
|
372
|
+
ids = @@socket_hash[socket]
|
|
373
|
+
ids.each do |id|
|
|
374
|
+
# Does this id speak to this dest_server?
|
|
375
|
+
query_settings = @@query_hash[id]
|
|
376
|
+
if (answerip == query_settings.dest_server && answerport == query_settings.dest_port)
|
|
377
|
+
# We have a match
|
|
378
|
+
# - @todo@ as long as we're not speaking to the same server on two ports!
|
|
379
|
+
client_id = id
|
|
380
|
+
break
|
|
381
|
+
end
|
|
382
|
+
end
|
|
383
|
+
}
|
|
384
|
+
return client_id
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
def send_exception_to_client(err, socket, client_id, msg=nil)
|
|
388
|
+
# first ensure the error is of the right type
|
|
389
|
+
# @TODO@ What about FORMERR, and other RCode errors?
|
|
390
|
+
if ((!err.kind_of?ResolvError) && (!err.kind_of?ResolvTimeout))
|
|
391
|
+
TheLog.error("INCORRECT ERROR TYPE BEING RETURNED TO CLIENT")
|
|
392
|
+
raise RuntimeError.new("INCORRECT ERROR TYPE BEING RETURNED TO CLIENT")
|
|
393
|
+
end
|
|
394
|
+
# find the client response queue
|
|
395
|
+
client_queue = nil
|
|
396
|
+
@@mutex.synchronize {
|
|
397
|
+
client_queue = @@query_hash[client_id].client_queue
|
|
398
|
+
}
|
|
399
|
+
remove_id(client_id)
|
|
400
|
+
push_exception_to_client(client_id, client_queue, err, msg)
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
def push_exception_to_select(client_id, client_queue, err, msg)
|
|
404
|
+
@@mutex.synchronize{
|
|
405
|
+
@@queued_exceptions.push([client_id, client_queue, err, msg])
|
|
406
|
+
}
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
def send_queued_exceptions
|
|
410
|
+
exceptions = []
|
|
411
|
+
@@mutex.synchronize{
|
|
412
|
+
exceptions = @@queued_exceptions
|
|
413
|
+
@@queued_exceptions = []
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
exceptions.each do |item|
|
|
417
|
+
client_id, client_queue, err, msg = item
|
|
418
|
+
push_exception_to_client(client_id, client_queue, err, msg)
|
|
419
|
+
end
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
def push_exception_to_client(client_id, client_queue, err, msg)
|
|
423
|
+
# Now push the exception on the queue
|
|
424
|
+
client_queue.push([client_id, msg, err])
|
|
425
|
+
notify_queue_observers(client_queue, client_id)
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
def add_observer(client_queue, observer)
|
|
429
|
+
@@mutex.synchronize {
|
|
430
|
+
@@observers[client_queue]=observer
|
|
431
|
+
check_select_thread_synchronized # @TODO@ Is this really necessary? The client should start the thread by sending a query, really...
|
|
432
|
+
if (!@@tick_observers.include?observer)
|
|
433
|
+
@@tick_observers.push(observer)
|
|
434
|
+
end
|
|
435
|
+
}
|
|
436
|
+
end
|
|
437
|
+
|
|
438
|
+
def remove_observer(client_queue, observer)
|
|
439
|
+
@@mutex.synchronize {
|
|
440
|
+
if (@@observers[client_queue]==observer)
|
|
441
|
+
@@observers.delete(observer)
|
|
442
|
+
else
|
|
443
|
+
TheLog.error("remove_observer called with wrong observer for queue")
|
|
444
|
+
raise ArgumentError.new("remove_observer called with wrong observer for queue")
|
|
445
|
+
end
|
|
446
|
+
if (!@@observers.values.include?observer)
|
|
447
|
+
@@tick_observers.delete(observer)
|
|
448
|
+
end
|
|
449
|
+
}
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
def notify_queue_observers(client_queue, client_query_id)
|
|
453
|
+
# If any observers are known for this query queue then notify them
|
|
454
|
+
observer=nil
|
|
455
|
+
@@mutex.synchronize {
|
|
456
|
+
observer = @@observers[client_queue]
|
|
457
|
+
}
|
|
458
|
+
if (observer)
|
|
459
|
+
observer.handle_queue_event(client_queue, client_query_id)
|
|
460
|
+
end
|
|
461
|
+
end
|
|
462
|
+
|
|
463
|
+
def send_tick_to_observers
|
|
464
|
+
# If any observers are known then send them a tick
|
|
465
|
+
tick_observers=nil
|
|
466
|
+
@@mutex.synchronize {
|
|
467
|
+
tick_observers = @@tick_observers
|
|
468
|
+
}
|
|
469
|
+
tick_observers.each do |observer|
|
|
470
|
+
observer.tick
|
|
471
|
+
end
|
|
472
|
+
end
|
|
473
|
+
end
|
|
474
|
+
end
|