Dnsruby 0.5.0 → 0.6.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/EVENTMACHINE +64 -0
- data/README +2 -2
- data/doc/classes/Dnsruby/Classes.html +10 -10
- data/doc/classes/Dnsruby/Classes.src/M000158.html +9 -5
- data/doc/classes/Dnsruby/Classes.src/M000159.html +19 -0
- data/doc/classes/Dnsruby/Classes.src/M000185.html +23 -0
- data/doc/classes/Dnsruby/Classes.src/M000186.html +19 -0
- data/doc/classes/Dnsruby/CodeMapper.html +55 -55
- data/doc/classes/Dnsruby/CodeMapper.src/M000131.html +4 -19
- data/doc/classes/Dnsruby/CodeMapper.src/M000132.html +19 -7
- data/doc/classes/Dnsruby/CodeMapper.src/M000133.html +7 -5
- data/doc/classes/Dnsruby/CodeMapper.src/M000134.html +5 -5
- data/doc/classes/Dnsruby/CodeMapper.src/M000135.html +5 -4
- data/doc/classes/Dnsruby/CodeMapper.src/M000136.html +4 -8
- data/doc/classes/Dnsruby/CodeMapper.src/M000137.html +5 -5
- data/doc/classes/Dnsruby/CodeMapper.src/M000138.html +6 -6
- data/doc/classes/Dnsruby/CodeMapper.src/M000139.html +7 -16
- data/doc/classes/Dnsruby/CodeMapper.src/M000140.html +17 -5
- data/doc/classes/Dnsruby/CodeMapper.src/M000141.html +19 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000158.html +18 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000159.html +33 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000160.html +21 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000161.html +19 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000162.html +19 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000163.html +18 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000164.html +22 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000165.html +22 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000166.html +22 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000167.html +31 -0
- data/doc/classes/Dnsruby/CodeMapper.src/M000168.html +19 -0
- data/doc/classes/Dnsruby/Config.src/M000106.html +5 -1
- data/doc/classes/Dnsruby/Config.src/M000107.html +1 -1
- data/doc/classes/Dnsruby/Config.src/M000108.html +4 -1
- data/doc/classes/Dnsruby/Config.src/M000125.html +18 -0
- data/doc/classes/Dnsruby/Config.src/M000126.html +19 -0
- data/doc/classes/Dnsruby/Config.src/M000127.html +19 -0
- data/doc/classes/Dnsruby/Config.src/M000128.html +21 -0
- data/doc/classes/Dnsruby/Config.src/M000129.html +21 -0
- data/doc/classes/Dnsruby/Config.src/M000130.html +38 -0
- data/doc/classes/Dnsruby/Config.src/M000131.html +26 -0
- data/doc/classes/Dnsruby/Config.src/M000132.html +22 -0
- data/doc/classes/Dnsruby/Config.src/M000133.html +27 -0
- data/doc/classes/Dnsruby/Config.src/M000134.html +22 -0
- data/doc/classes/Dnsruby/Config.src/M000135.html +21 -0
- data/doc/classes/Dnsruby/DNS.html +85 -85
- data/doc/classes/Dnsruby/DNS.src/M000197.html +10 -4
- data/doc/classes/Dnsruby/DNS.src/M000198.html +4 -4
- data/doc/classes/Dnsruby/DNS.src/M000199.html +4 -6
- data/doc/classes/Dnsruby/DNS.src/M000200.html +6 -5
- data/doc/classes/Dnsruby/DNS.src/M000201.html +5 -6
- data/doc/classes/Dnsruby/DNS.src/M000202.html +6 -4
- data/doc/classes/Dnsruby/DNS.src/M000203.html +4 -5
- data/doc/classes/Dnsruby/DNS.src/M000204.html +5 -6
- data/doc/classes/Dnsruby/DNS.src/M000205.html +6 -14
- data/doc/classes/Dnsruby/DNS.src/M000206.html +14 -5
- data/doc/classes/Dnsruby/DNS.src/M000207.html +5 -6
- data/doc/classes/Dnsruby/DNS.src/M000208.html +6 -27
- data/doc/classes/Dnsruby/DNS.src/M000209.html +26 -17
- data/doc/classes/Dnsruby/DNS.src/M000210.html +17 -35
- data/doc/classes/Dnsruby/DNS.src/M000211.html +50 -0
- data/doc/classes/Dnsruby/DNS.src/M000224.html +24 -0
- data/doc/classes/Dnsruby/DNS.src/M000225.html +18 -0
- data/doc/classes/Dnsruby/DNS.src/M000226.html +18 -0
- data/doc/classes/Dnsruby/DNS.src/M000227.html +20 -0
- data/doc/classes/Dnsruby/DNS.src/M000228.html +19 -0
- data/doc/classes/Dnsruby/DNS.src/M000229.html +20 -0
- data/doc/classes/Dnsruby/DNS.src/M000230.html +18 -0
- data/doc/classes/Dnsruby/DNS.src/M000231.html +19 -0
- data/doc/classes/Dnsruby/DNS.src/M000232.html +20 -0
- data/doc/classes/Dnsruby/DNS.src/M000233.html +28 -0
- data/doc/classes/Dnsruby/DNS.src/M000234.html +19 -0
- data/doc/classes/Dnsruby/DNS.src/M000235.html +20 -0
- data/doc/classes/Dnsruby/DNS.src/M000236.html +41 -0
- data/doc/classes/Dnsruby/DNS.src/M000237.html +32 -0
- data/doc/classes/Dnsruby/DNS.src/M000238.html +50 -0
- data/doc/classes/Dnsruby/EventMachineInterface/EmTcpHandler.html +154 -0
- data/doc/classes/Dnsruby/EventMachineInterface/EmTcpHandler.src/M000123.html +20 -0
- data/doc/classes/Dnsruby/EventMachineInterface/EmTcpHandler.src/M000124.html +32 -0
- data/doc/classes/Dnsruby/EventMachineInterface/EmUdpHandler.html +237 -0
- data/doc/classes/Dnsruby/EventMachineInterface/EmUdpHandler.src/M000117.html +18 -0
- data/doc/classes/Dnsruby/EventMachineInterface/EmUdpHandler.src/M000118.html +19 -0
- data/doc/classes/Dnsruby/EventMachineInterface/EmUdpHandler.src/M000119.html +35 -0
- data/doc/classes/Dnsruby/EventMachineInterface/EmUdpHandler.src/M000120.html +30 -0
- data/doc/classes/Dnsruby/EventMachineInterface/EmUdpHandler.src/M000121.html +19 -0
- data/doc/classes/Dnsruby/EventMachineInterface/EmUdpHandler.src/M000122.html +23 -0
- data/doc/classes/Dnsruby/EventMachineInterface.html +327 -0
- data/doc/classes/Dnsruby/EventMachineInterface.src/M000105.html +32 -0
- data/doc/classes/Dnsruby/EventMachineInterface.src/M000106.html +25 -0
- data/doc/classes/Dnsruby/EventMachineInterface.src/M000107.html +29 -0
- data/doc/classes/Dnsruby/EventMachineInterface.src/M000108.html +21 -0
- data/doc/classes/Dnsruby/EventMachineInterface.src/M000109.html +35 -0
- data/doc/classes/Dnsruby/EventMachineInterface.src/M000110.html +19 -0
- data/doc/classes/Dnsruby/EventMachineInterface.src/M000111.html +23 -0
- data/doc/classes/Dnsruby/EventMachineInterface.src/M000112.html +18 -0
- data/doc/classes/Dnsruby/EventMachineInterface.src/M000113.html +28 -0
- data/doc/classes/Dnsruby/EventMachineInterface.src/M000114.html +41 -0
- data/doc/classes/Dnsruby/EventMachineInterface.src/M000115.html +28 -0
- data/doc/classes/Dnsruby/EventMachineInterface.src/M000116.html +24 -0
- data/doc/classes/Dnsruby/Header.html +62 -62
- data/doc/classes/Dnsruby/Header.src/M000169.html +21 -4
- data/doc/classes/Dnsruby/Header.src/M000170.html +4 -4
- data/doc/classes/Dnsruby/Header.src/M000171.html +4 -7
- data/doc/classes/Dnsruby/Header.src/M000172.html +7 -6
- data/doc/classes/Dnsruby/Header.src/M000173.html +6 -18
- data/doc/classes/Dnsruby/Header.src/M000174.html +18 -12
- data/doc/classes/Dnsruby/Header.src/M000175.html +12 -33
- data/doc/classes/Dnsruby/Header.src/M000176.html +33 -14
- data/doc/classes/Dnsruby/Header.src/M000177.html +14 -4
- data/doc/classes/Dnsruby/Header.src/M000178.html +4 -4
- data/doc/classes/Dnsruby/Header.src/M000179.html +4 -16
- data/doc/classes/Dnsruby/Header.src/M000180.html +30 -0
- data/doc/classes/Dnsruby/Header.src/M000196.html +35 -0
- data/doc/classes/Dnsruby/Header.src/M000197.html +18 -0
- data/doc/classes/Dnsruby/Header.src/M000198.html +18 -0
- data/doc/classes/Dnsruby/Header.src/M000199.html +21 -0
- data/doc/classes/Dnsruby/Header.src/M000200.html +20 -0
- data/doc/classes/Dnsruby/Header.src/M000201.html +32 -0
- data/doc/classes/Dnsruby/Header.src/M000202.html +26 -0
- data/doc/classes/Dnsruby/Header.src/M000203.html +47 -0
- data/doc/classes/Dnsruby/Header.src/M000204.html +28 -0
- data/doc/classes/Dnsruby/Header.src/M000205.html +18 -0
- data/doc/classes/Dnsruby/Header.src/M000206.html +18 -0
- data/doc/classes/Dnsruby/Header.src/M000207.html +30 -0
- data/doc/classes/Dnsruby/Hosts.html +47 -47
- data/doc/classes/Dnsruby/Hosts.src/M000142.html +6 -35
- data/doc/classes/Dnsruby/Hosts.src/M000143.html +35 -5
- data/doc/classes/Dnsruby/Hosts.src/M000144.html +5 -6
- data/doc/classes/Dnsruby/Hosts.src/M000145.html +6 -7
- data/doc/classes/Dnsruby/Hosts.src/M000146.html +7 -5
- data/doc/classes/Dnsruby/Hosts.src/M000147.html +5 -6
- data/doc/classes/Dnsruby/Hosts.src/M000148.html +6 -7
- data/doc/classes/Dnsruby/Hosts.src/M000149.html +21 -0
- data/doc/classes/Dnsruby/Hosts.src/M000169.html +20 -0
- data/doc/classes/Dnsruby/Hosts.src/M000170.html +49 -0
- data/doc/classes/Dnsruby/Hosts.src/M000171.html +19 -0
- data/doc/classes/Dnsruby/Hosts.src/M000172.html +20 -0
- data/doc/classes/Dnsruby/Hosts.src/M000173.html +21 -0
- data/doc/classes/Dnsruby/Hosts.src/M000174.html +19 -0
- data/doc/classes/Dnsruby/Hosts.src/M000175.html +20 -0
- data/doc/classes/Dnsruby/Hosts.src/M000176.html +21 -0
- data/doc/classes/Dnsruby/IPv4.html +43 -43
- data/doc/classes/Dnsruby/IPv4.src/M000150.html +17 -6
- data/doc/classes/Dnsruby/IPv4.src/M000151.html +7 -4
- data/doc/classes/Dnsruby/IPv4.src/M000152.html +4 -4
- data/doc/classes/Dnsruby/IPv4.src/M000153.html +4 -5
- data/doc/classes/Dnsruby/IPv4.src/M000154.html +5 -4
- data/doc/classes/Dnsruby/IPv4.src/M000155.html +4 -4
- data/doc/classes/Dnsruby/IPv4.src/M000156.html +4 -4
- data/doc/classes/Dnsruby/IPv4.src/M000157.html +18 -0
- data/doc/classes/Dnsruby/IPv4.src/M000177.html +32 -0
- data/doc/classes/Dnsruby/IPv4.src/M000178.html +21 -0
- data/doc/classes/Dnsruby/IPv4.src/M000179.html +18 -0
- data/doc/classes/Dnsruby/IPv4.src/M000180.html +18 -0
- data/doc/classes/Dnsruby/IPv4.src/M000181.html +19 -0
- data/doc/classes/Dnsruby/IPv4.src/M000182.html +18 -0
- data/doc/classes/Dnsruby/IPv4.src/M000183.html +18 -0
- data/doc/classes/Dnsruby/IPv4.src/M000184.html +18 -0
- data/doc/classes/Dnsruby/IPv6.html +43 -43
- data/doc/classes/Dnsruby/IPv6.src/M000181.html +45 -6
- data/doc/classes/Dnsruby/IPv6.src/M000182.html +6 -7
- data/doc/classes/Dnsruby/IPv6.src/M000183.html +8 -4
- data/doc/classes/Dnsruby/IPv6.src/M000184.html +4 -7
- data/doc/classes/Dnsruby/IPv6.src/M000185.html +7 -4
- data/doc/classes/Dnsruby/IPv6.src/M000186.html +4 -4
- data/doc/classes/Dnsruby/IPv6.src/M000187.html +4 -4
- data/doc/classes/Dnsruby/IPv6.src/M000188.html +18 -0
- data/doc/classes/Dnsruby/IPv6.src/M000208.html +60 -0
- data/doc/classes/Dnsruby/IPv6.src/M000209.html +21 -0
- data/doc/classes/Dnsruby/IPv6.src/M000210.html +22 -0
- data/doc/classes/Dnsruby/IPv6.src/M000211.html +18 -0
- data/doc/classes/Dnsruby/IPv6.src/M000212.html +21 -0
- data/doc/classes/Dnsruby/IPv6.src/M000213.html +18 -0
- data/doc/classes/Dnsruby/IPv6.src/M000214.html +18 -0
- data/doc/classes/Dnsruby/IPv6.src/M000215.html +18 -0
- data/doc/classes/Dnsruby/Message.html +1 -1
- data/doc/classes/Dnsruby/Message.src/M000090.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000091.html +21 -0
- data/doc/classes/Dnsruby/Message.src/M000092.html +20 -0
- data/doc/classes/Dnsruby/Message.src/M000093.html +18 -0
- data/doc/classes/Dnsruby/Message.src/M000094.html +54 -0
- data/doc/classes/Dnsruby/Message.src/M000095.html +42 -0
- data/doc/classes/Dnsruby/Message.src/M000096.html +45 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000076.html +22 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000077.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000078.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000079.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000080.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000081.html +18 -0
- data/doc/classes/Dnsruby/Name/Label.src/M000082.html +18 -0
- data/doc/classes/Dnsruby/Name.src/M000067.html +18 -0
- data/doc/classes/Dnsruby/Name.src/M000068.html +21 -0
- data/doc/classes/Dnsruby/Name.src/M000069.html +19 -0
- data/doc/classes/Dnsruby/Name.src/M000071.html +22 -0
- data/doc/classes/Dnsruby/Name.src/M000072.html +18 -0
- data/doc/classes/Dnsruby/Name.src/M000073.html +20 -0
- data/doc/classes/Dnsruby/Question.html +10 -10
- data/doc/classes/Dnsruby/Question.src/M000167.html +33 -4
- data/doc/classes/Dnsruby/Question.src/M000168.html +18 -0
- data/doc/classes/Dnsruby/Question.src/M000194.html +47 -0
- data/doc/classes/Dnsruby/Question.src/M000195.html +18 -0
- data/doc/classes/Dnsruby/RR/DomainName.src/M000058.html +22 -0
- data/doc/classes/Dnsruby/RR/Generic.src/M000048.html +25 -0
- data/doc/classes/Dnsruby/RR/IN/A.src/M000025.html +18 -0
- data/doc/classes/Dnsruby/RR/IN/A.src/M000026.html +18 -0
- data/doc/classes/Dnsruby/RR/IN/A.src/M000027.html +18 -0
- data/doc/classes/Dnsruby/RR/IN/SRV.src/M000022.html +29 -0
- data/doc/classes/Dnsruby/RR/IN/SRV.src/M000023.html +26 -0
- data/doc/classes/Dnsruby/RR/IN/SRV.src/M000024.html +22 -0
- data/doc/classes/Dnsruby/RR/IN/WKS.src/M000028.html +20 -0
- data/doc/classes/Dnsruby/RR/LOC.src/M000032.html +32 -0
- data/doc/classes/Dnsruby/RR/LOC.src/M000033.html +23 -0
- data/doc/classes/Dnsruby/RR/LOC.src/M000034.html +25 -0
- data/doc/classes/Dnsruby/RR/LOC.src/M000035.html +21 -0
- data/doc/classes/Dnsruby/RR/LOC.src/M000036.html +20 -0
- data/doc/classes/Dnsruby/RR/LOC.src/M000037.html +23 -0
- data/doc/classes/Dnsruby/RR/NSAP.src/M000060.html +19 -0
- data/doc/classes/Dnsruby/RR/NSAP.src/M000061.html +19 -0
- data/doc/classes/Dnsruby/RR/NSAP.src/M000062.html +22 -0
- data/doc/classes/Dnsruby/RR/NSAP.src/M000063.html +31 -0
- data/doc/classes/Dnsruby/RR/RP.src/M000057.html +19 -0
- data/doc/classes/Dnsruby/RR/SOA.src/M000046.html +24 -0
- data/doc/classes/Dnsruby/RR/SOA.src/M000047.html +27 -0
- data/doc/classes/Dnsruby/RR/TKEY.src/M000029.html +19 -0
- data/doc/classes/Dnsruby/RR/TKEY.src/M000030.html +29 -0
- data/doc/classes/Dnsruby/RR/TKEY.src/M000031.html +30 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000050.html +71 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000051.html +34 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000052.html +37 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000053.html +31 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000054.html +34 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000055.html +22 -0
- data/doc/classes/Dnsruby/RR/TSIG.src/M000056.html +29 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000041.html +18 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000042.html +18 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000043.html +20 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000044.html +27 -0
- data/doc/classes/Dnsruby/RR/TXT.src/M000045.html +25 -0
- data/doc/classes/Dnsruby/RR/X25.src/M000038.html +18 -0
- data/doc/classes/Dnsruby/RR/X25.src/M000039.html +18 -0
- data/doc/classes/Dnsruby/RR/X25.src/M000040.html +22 -0
- data/doc/classes/Dnsruby/RR.src/M000015.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000016.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000017.html +22 -0
- data/doc/classes/Dnsruby/RR.src/M000018.html +22 -0
- data/doc/classes/Dnsruby/RR.src/M000019.html +18 -0
- data/doc/classes/Dnsruby/RR.src/M000020.html +22 -0
- data/doc/classes/Dnsruby/RR.src/M000021.html +24 -0
- data/doc/classes/Dnsruby/RRSet.html +39 -39
- data/doc/classes/Dnsruby/RRSet.src/M000160.html +4 -30
- data/doc/classes/Dnsruby/RRSet.src/M000161.html +30 -4
- data/doc/classes/Dnsruby/RRSet.src/M000162.html +4 -6
- data/doc/classes/Dnsruby/RRSet.src/M000163.html +6 -4
- data/doc/classes/Dnsruby/RRSet.src/M000164.html +4 -4
- data/doc/classes/Dnsruby/RRSet.src/M000165.html +4 -4
- data/doc/classes/Dnsruby/RRSet.src/M000166.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000187.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000188.html +44 -0
- data/doc/classes/Dnsruby/RRSet.src/M000189.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000190.html +20 -0
- data/doc/classes/Dnsruby/RRSet.src/M000191.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000192.html +18 -0
- data/doc/classes/Dnsruby/RRSet.src/M000193.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000109.html +1 -1
- data/doc/classes/Dnsruby/Resolv.src/M000110.html +1 -1
- data/doc/classes/Dnsruby/Resolv.src/M000111.html +1 -1
- data/doc/classes/Dnsruby/Resolv.src/M000112.html +1 -1
- data/doc/classes/Dnsruby/Resolv.src/M000113.html +1 -1
- data/doc/classes/Dnsruby/Resolv.src/M000114.html +1 -1
- data/doc/classes/Dnsruby/Resolv.src/M000115.html +1 -1
- data/doc/classes/Dnsruby/Resolv.src/M000116.html +1 -1
- data/doc/classes/Dnsruby/Resolv.src/M000117.html +1 -1
- data/doc/classes/Dnsruby/Resolv.src/M000118.html +1 -1
- data/doc/classes/Dnsruby/Resolv.src/M000119.html +1 -1
- data/doc/classes/Dnsruby/Resolv.src/M000120.html +1 -1
- data/doc/classes/Dnsruby/Resolv.src/M000121.html +1 -1
- data/doc/classes/Dnsruby/Resolv.src/M000136.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000137.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000138.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000139.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000140.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000141.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000142.html +18 -0
- data/doc/classes/Dnsruby/Resolv.src/M000143.html +19 -0
- data/doc/classes/Dnsruby/Resolv.src/M000144.html +20 -0
- data/doc/classes/Dnsruby/Resolv.src/M000145.html +29 -0
- data/doc/classes/Dnsruby/Resolv.src/M000146.html +19 -0
- data/doc/classes/Dnsruby/Resolv.src/M000147.html +20 -0
- data/doc/classes/Dnsruby/Resolv.src/M000148.html +25 -0
- data/doc/classes/Dnsruby/Resolver.html +238 -123
- data/doc/classes/Dnsruby/Resolver.src/M000212.html +7 -23
- data/doc/classes/Dnsruby/Resolver.src/M000213.html +11 -48
- data/doc/classes/Dnsruby/Resolver.src/M000214.html +13 -8
- data/doc/classes/Dnsruby/Resolver.src/M000215.html +4 -32
- data/doc/classes/Dnsruby/Resolver.src/M000216.html +33 -6
- data/doc/classes/Dnsruby/Resolver.src/M000217.html +6 -7
- data/doc/classes/Dnsruby/Resolver.src/M000218.html +8 -4
- data/doc/classes/Dnsruby/Resolver.src/M000219.html +4 -6
- data/doc/classes/Dnsruby/Resolver.src/M000220.html +6 -5
- data/doc/classes/Dnsruby/Resolver.src/M000221.html +4 -4
- data/doc/classes/Dnsruby/Resolver.src/M000222.html +4 -4
- data/doc/classes/Dnsruby/Resolver.src/M000223.html +4 -4
- data/doc/classes/Dnsruby/Resolver.src/M000224.html +4 -4
- data/doc/classes/Dnsruby/Resolver.src/M000225.html +4 -4
- data/doc/classes/Dnsruby/Resolver.src/M000226.html +4 -4
- data/doc/classes/Dnsruby/Resolver.src/M000227.html +4 -4
- data/doc/classes/Dnsruby/Resolver.src/M000228.html +4 -4
- data/doc/classes/Dnsruby/Resolver.src/M000229.html +4 -4
- data/doc/classes/Dnsruby/Resolver.src/M000230.html +4 -4
- data/doc/classes/Dnsruby/Resolver.src/M000231.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000232.html +26 -0
- data/doc/classes/Dnsruby/Resolver.src/M000233.html +18 -0
- data/doc/classes/Dnsruby/Resolver.src/M000234.html +23 -0
- data/doc/classes/Dnsruby/Resolver.src/M000235.html +18 -0
- data/doc/classes/Dnsruby/Resolver.src/M000236.html +42 -0
- data/doc/classes/Dnsruby/Resolver.src/M000239.html +21 -0
- data/doc/classes/Dnsruby/Resolver.src/M000240.html +27 -0
- data/doc/classes/Dnsruby/Resolver.src/M000241.html +28 -0
- data/doc/classes/Dnsruby/Resolver.src/M000242.html +18 -0
- data/doc/classes/Dnsruby/Resolver.src/M000243.html +48 -0
- data/doc/classes/Dnsruby/Resolver.src/M000244.html +21 -0
- data/doc/classes/Dnsruby/Resolver.src/M000245.html +22 -0
- data/doc/classes/Dnsruby/Resolver.src/M000246.html +18 -0
- data/doc/classes/Dnsruby/Resolver.src/M000247.html +20 -0
- data/doc/classes/Dnsruby/Resolver.src/M000248.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000249.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000250.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000251.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000252.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000253.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000254.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000255.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000256.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000257.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000258.html +19 -0
- data/doc/classes/Dnsruby/Resolver.src/M000259.html +26 -0
- data/doc/classes/Dnsruby/Resolver.src/M000260.html +18 -0
- data/doc/classes/Dnsruby/Resolver.src/M000261.html +23 -0
- data/doc/classes/Dnsruby/Resolver.src/M000262.html +18 -0
- data/doc/classes/Dnsruby/Resolver.src/M000263.html +42 -0
- data/doc/classes/Dnsruby/SelectInterface.html +236 -0
- data/doc/classes/Dnsruby/SelectInterface.src/M000001.html +19 -0
- data/doc/classes/Dnsruby/SelectInterface.src/M000002.html +18 -0
- data/doc/classes/Dnsruby/SelectInterface.src/M000003.html +18 -0
- data/doc/classes/Dnsruby/SelectInterface.src/M000004.html +18 -0
- data/doc/classes/Dnsruby/SelectInterface.src/M000005.html +21 -0
- data/doc/classes/Dnsruby/SelectInterface.src/M000006.html +19 -0
- data/doc/classes/Dnsruby/SelectInterface.src/M000007.html +18 -0
- data/doc/classes/Dnsruby/SingleResolver.html +55 -33
- data/doc/classes/Dnsruby/SingleResolver.src/M000128.html +24 -51
- data/doc/classes/Dnsruby/SingleResolver.src/M000129.html +11 -6
- data/doc/classes/Dnsruby/SingleResolver.src/M000130.html +21 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000149.html +18 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000150.html +19 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000151.html +49 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000152.html +18 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000153.html +21 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000154.html +25 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000155.html +51 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000156.html +26 -0
- data/doc/classes/Dnsruby/SingleResolver.src/M000157.html +21 -0
- data/doc/classes/Dnsruby/TheLog.html +17 -17
- data/doc/classes/Dnsruby/TheLog.src/M000189.html +4 -4
- data/doc/classes/Dnsruby/TheLog.src/M000190.html +4 -4
- data/doc/classes/Dnsruby/TheLog.src/M000191.html +20 -0
- data/doc/classes/Dnsruby/TheLog.src/M000216.html +20 -0
- data/doc/classes/Dnsruby/TheLog.src/M000217.html +20 -0
- data/doc/classes/Dnsruby/TheLog.src/M000218.html +20 -0
- data/doc/classes/Dnsruby/Update.html +31 -31
- data/doc/classes/Dnsruby/Update.src/M000192.html +17 -22
- data/doc/classes/Dnsruby/Update.src/M000193.html +11 -6
- data/doc/classes/Dnsruby/Update.src/M000194.html +15 -24
- data/doc/classes/Dnsruby/Update.src/M000195.html +26 -19
- data/doc/classes/Dnsruby/Update.src/M000196.html +34 -0
- data/doc/classes/Dnsruby/Update.src/M000219.html +32 -0
- data/doc/classes/Dnsruby/Update.src/M000220.html +37 -0
- data/doc/classes/Dnsruby/Update.src/M000221.html +32 -0
- data/doc/classes/Dnsruby/Update.src/M000222.html +41 -0
- data/doc/classes/Dnsruby/Update.src/M000223.html +34 -0
- data/doc/classes/Dnsruby/ZoneTransfer/Delta.src/M000104.html +19 -0
- data/doc/classes/Dnsruby/ZoneTransfer.src/M000102.html +22 -0
- data/doc/classes/Dnsruby/ZoneTransfer.src/M000103.html +35 -0
- data/doc/classes/Dnsruby.html +12 -0
- data/doc/created.rid +1 -1
- data/doc/files/lib/Dnsruby/Config_rb.html +1 -1
- data/doc/files/lib/Dnsruby/Resolver_rb.html +2 -1
- data/doc/files/lib/Dnsruby/SelectInterface_rb.html +108 -0
- data/doc/files/lib/Dnsruby/SingleResolver_rb.html +1 -1
- data/doc/files/lib/Dnsruby/event_machine_interface_rb.html +108 -0
- data/doc/files/lib/Dnsruby/message_rb.html +1 -1
- data/doc/files/lib/Dnsruby/select_thread_rb.html +1 -1
- data/doc/files/lib/Dnsruby/zone_transfer_rb.html +1 -1
- data/doc/files/lib/dnsruby_rb.html +1 -1
- data/doc/fr_file_index.html +1 -0
- data/doc/fr_method_index.html +130 -125
- data/lib/Dnsruby/Config.rb +8 -1
- data/lib/Dnsruby/Resolver.rb +496 -217
- data/lib/Dnsruby/SingleResolver.rb +105 -10
- data/lib/Dnsruby/event_machine_interface.rb +265 -0
- data/lib/Dnsruby/message.rb +1 -1
- data/lib/Dnsruby/select_thread.rb +26 -60
- data/lib/Dnsruby/zone_transfer.rb +3 -1
- data/lib/dnsruby.rb +8 -0
- data/test/tc_em_deferrable.rb +47 -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_inet6.rb +170 -0
- data/test/tc_resolver.rb +71 -63
- data/test/tc_single_resolver.rb +71 -53
- data/test/tc_soak.rb +12 -113
- data/test/tc_soak_base.rb +136 -0
- data/test/ts_online.rb +14 -6
- metadata +277 -2
|
@@ -176,7 +176,12 @@ module Dnsruby
|
|
|
176
176
|
end
|
|
177
177
|
|
|
178
178
|
|
|
179
|
-
# Asynchronously send a Message to the server.
|
|
179
|
+
# Asynchronously send a Message to the server. The send can be done using just
|
|
180
|
+
# Dnsruby, or using EventMachine.
|
|
181
|
+
#
|
|
182
|
+
#= If the pure Ruby event loop supplied weith Dnsruby is being used, then :
|
|
183
|
+
#
|
|
184
|
+
# A client_queue is supplied by the client,
|
|
180
185
|
# along with a client_query_id to identify the response. When the response is known, the tuple
|
|
181
186
|
# (query_id, response_message, response_exception) is put in the queue for the client to process.
|
|
182
187
|
#
|
|
@@ -187,11 +192,31 @@ module Dnsruby
|
|
|
187
192
|
# Takes :
|
|
188
193
|
#
|
|
189
194
|
# * msg - the message to send
|
|
190
|
-
# * client_query_id - an ID to identify the query to the client
|
|
191
195
|
# * client_queue - a Queue to push the response to, when it arrives
|
|
196
|
+
# * client_query_id - an ID to identify the query to the client
|
|
192
197
|
# * use_tcp - whether to use TCP (defaults to SingleResolver.use_tcp)
|
|
193
|
-
|
|
194
|
-
|
|
198
|
+
#
|
|
199
|
+
# If the native Dsnruby networking layer is being used, then this method returns the client_query_id
|
|
200
|
+
#
|
|
201
|
+
# id = res.send_async(msg, queue)
|
|
202
|
+
# NOT SUPPORTED : id = res.send_async(msg, queue, use_tcp)
|
|
203
|
+
# id = res.send_async(msg, queue, id)
|
|
204
|
+
# id = res.send_async(msg, queue, id, use_tcp)
|
|
205
|
+
#
|
|
206
|
+
#= If EventMachine is being used :
|
|
207
|
+
#
|
|
208
|
+
# If EventMachine is being used (see Dnsruby::Resolver::use_eventmachine, then this method returns
|
|
209
|
+
# an EM::Deferrable object. If a queue (and ID) is passed in, then the response will also be
|
|
210
|
+
# pushed to the Queue (as well as the deferrable completing).
|
|
211
|
+
#
|
|
212
|
+
# deferrable = res.send_async(msg)
|
|
213
|
+
# deferrable = res.send_async(msg, use_tcp)
|
|
214
|
+
# deferrable = res.send_async(msg, q, id, use_tcp)
|
|
215
|
+
def send_async(*args) # msg, client_queue, client_query_id, use_tcp=@use_tcp)
|
|
216
|
+
msg = args[0]
|
|
217
|
+
client_query_id = nil
|
|
218
|
+
client_queue = nil
|
|
219
|
+
use_tcp = @use_tcp
|
|
195
220
|
if (msg.kind_of?String)
|
|
196
221
|
msg = Message.new(msg)
|
|
197
222
|
end
|
|
@@ -199,9 +224,68 @@ module Dnsruby
|
|
|
199
224
|
if (udp_packet_size < query_packet.length)
|
|
200
225
|
use_tcp = true
|
|
201
226
|
end
|
|
227
|
+
if (args.length > 1)
|
|
228
|
+
if (args[1].class==Queue)
|
|
229
|
+
client_queue = args[1]
|
|
230
|
+
elsif (args.length == 2)
|
|
231
|
+
use_tcp = args[1]
|
|
232
|
+
end
|
|
233
|
+
if (args.length > 2)
|
|
234
|
+
client_query_id = args[2]
|
|
235
|
+
if (args.length > 3)
|
|
236
|
+
use_tcp = args[3]
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
#Are we using EventMachine or native Dnsruby?
|
|
241
|
+
if (Resolver.eventmachine?)
|
|
242
|
+
return send_eventmachine(query_packet, msg.header.id, client_query_id, client_queue, use_tcp)
|
|
243
|
+
else
|
|
244
|
+
if (!client_query_id)
|
|
245
|
+
client_query_id = msg
|
|
246
|
+
end
|
|
247
|
+
send_dnsruby(query_packet, msg.header.id, client_query_id, client_queue, use_tcp)
|
|
248
|
+
return client_query_id
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
# This method sends the packet using EventMachine
|
|
253
|
+
def send_eventmachine(msg, header_id, client_query_id, client_queue, use_tcp, client_deferrable=nil) #:nodoc: all
|
|
254
|
+
if (!client_deferrable)
|
|
255
|
+
client_deferrable = EventMachine::DefaultDeferrable.new
|
|
256
|
+
end
|
|
257
|
+
packet_deferrable = EventMachineInterface.send(:msg=>msg, :header_id=>header_id, :timeout=>@packet_timeout, :server=>@server, :port=>@port, :src_addr=>@src_addr, :src_port=>@src_port, :tsig_key=>@tsig_key, :ignore_truncation=>@ignore_truncation, :use_tcp=>use_tcp)
|
|
258
|
+
packet_deferrable.callback { |response|
|
|
259
|
+
TheLog.debug("EM callback #{response}")
|
|
260
|
+
# @TODO@ Check TSIG!
|
|
261
|
+
ret = true
|
|
262
|
+
if (response.header.tc && !use_tcp)
|
|
263
|
+
# Try to resend over tcp
|
|
264
|
+
TheLog.debug("Truncated - resending over TCP")
|
|
265
|
+
send_eventmachine(msg, header_id, client_query_id, client_queue, true, client_deferrable)
|
|
266
|
+
else
|
|
267
|
+
client_deferrable.set_deferred_status :succeeded, response
|
|
268
|
+
if (client_queue)
|
|
269
|
+
client_queue.push([client_query_id, response, nil])
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
}
|
|
273
|
+
packet_deferrable.errback { |response, error|
|
|
274
|
+
TheLog.debug("EM errback #{error}, #{response}")
|
|
275
|
+
client_deferrable.set_deferred_status :failed, response, error
|
|
276
|
+
if (client_queue)
|
|
277
|
+
client_queue.push([client_query_id, response, error])
|
|
278
|
+
end
|
|
279
|
+
}
|
|
280
|
+
return client_deferrable
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
# This method sends the packet using the built-in pure Ruby event loop, with no dependencies.
|
|
284
|
+
def send_dnsruby(query_packet, header_id, client_query_id, client_queue, use_tcp) #:nodoc: all
|
|
285
|
+
endtime = Time.now + @packet_timeout
|
|
202
286
|
# First send the query (synchronously)
|
|
203
287
|
# @TODO@ persisent sockets
|
|
204
|
-
|
|
288
|
+
st = SelectThread.instance
|
|
205
289
|
socket = nil
|
|
206
290
|
begin
|
|
207
291
|
#@TODO@ Different OSes have different interpretations of "random port" here.
|
|
@@ -210,7 +294,6 @@ module Dnsruby
|
|
|
210
294
|
#We need to determine an actual (random) number here, then ask the OS for it, and
|
|
211
295
|
#continue until we get one.
|
|
212
296
|
if (use_tcp)
|
|
213
|
-
print "Setting src_port to #{@src_port}"
|
|
214
297
|
socket = TCPSocket.new(@server, @port, @src_addr, @src_port)
|
|
215
298
|
else
|
|
216
299
|
socket = UDPSocket.new()
|
|
@@ -223,13 +306,13 @@ module Dnsruby
|
|
|
223
306
|
end
|
|
224
307
|
err=IOError.new("dnsruby can't connect to #{@server}:#{@port} from #{@src_addr}:#{@src_port}, use_tcp=#{use_tcp}, exception = #{e.class}, #{e}")
|
|
225
308
|
TheLog.error("#{err}")
|
|
226
|
-
st.push_exception_to_select(client_query_id, client_queue, err, nil)
|
|
309
|
+
st.push_exception_to_select(client_query_id, client_queue, err, nil) # @TODO Do we still need this? Can we not just send it from here?
|
|
227
310
|
return
|
|
228
311
|
end
|
|
229
312
|
if (socket==nil)
|
|
230
313
|
err=IOError.new("dnsruby can't connect to #{@server}:#{port} from #{@src_addr}:#{@src_port}, use_tcp=#{use_tcp}")
|
|
231
314
|
TheLog.error("#{err}")
|
|
232
|
-
st.push_exception_to_select(client_query_id, client_queue, err, nil)
|
|
315
|
+
st.push_exception_to_select(client_query_id, client_queue, err, nil) # @TODO Do we still need this? Can we not just send it from here?
|
|
233
316
|
return
|
|
234
317
|
end
|
|
235
318
|
TheLog.debug("Sending packet to #{@server}:#{@port} from #{@src_addr}:#{@src_port}, use_tcp=#{use_tcp}")
|
|
@@ -248,12 +331,24 @@ module Dnsruby
|
|
|
248
331
|
end
|
|
249
332
|
|
|
250
333
|
# Then listen for the response
|
|
251
|
-
query_settings = SelectThread::QuerySettings.new(query_packet,
|
|
334
|
+
query_settings = SelectThread::QuerySettings.new(query_packet, header_id, @tsig_key, @ignore_truncation, client_queue, client_query_id, socket, @server, @port, endtime, self)
|
|
252
335
|
# The select thread will now wait for the response and send that or a timeout
|
|
253
|
-
# back to the client_queue
|
|
336
|
+
# back to the client_queue.
|
|
254
337
|
st.add_to_select(query_settings)
|
|
255
338
|
end
|
|
256
339
|
|
|
340
|
+
def check_response(response, query, client_queue, client_query_id, tcp)
|
|
341
|
+
# @TODO@ Check TSIG!
|
|
342
|
+
ret = true
|
|
343
|
+
if (response.header.tc && !tcp)
|
|
344
|
+
# Try to resend over tcp
|
|
345
|
+
TheLog.debug("Truncated - resending over TCP")
|
|
346
|
+
send_async(Message.decode(query), client_queue, client_query_id, true)
|
|
347
|
+
ret=false
|
|
348
|
+
end
|
|
349
|
+
return ret
|
|
350
|
+
end
|
|
351
|
+
|
|
257
352
|
# Prepare the packet for sending
|
|
258
353
|
def make_query_packet(packet) #:nodoc: all
|
|
259
354
|
if (packet.header.opcode == OpCode.QUERY || @recurse)
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
require 'eventmachine'
|
|
2
|
+
module Dnsruby
|
|
3
|
+
class EventMachineInterface#:nodoc: all
|
|
4
|
+
@@started_em_here = false
|
|
5
|
+
@@running_clients=[]
|
|
6
|
+
@@outstanding_sends = []
|
|
7
|
+
@@em_thread=nil
|
|
8
|
+
# We want to have one EM loop running continuously in this class.
|
|
9
|
+
# Remember to use stop_event_loop inside of EM callback in order to stop the event machine
|
|
10
|
+
|
|
11
|
+
# Timers - can't use EM timers as they max out at 1000.
|
|
12
|
+
# Instead, while queries are outstanding, call next_tick to manage our own list of timers.
|
|
13
|
+
|
|
14
|
+
@@timer_procs={} # timeout=>[proc
|
|
15
|
+
@@timer_keys_sorted=[]
|
|
16
|
+
TIMER_PERIOD = 0.1
|
|
17
|
+
|
|
18
|
+
def EventMachineInterface::process_timers
|
|
19
|
+
# Go through list of timers
|
|
20
|
+
now = Time.now
|
|
21
|
+
@@timer_keys_sorted.each do |timeout|
|
|
22
|
+
if (timeout > now)
|
|
23
|
+
break
|
|
24
|
+
end
|
|
25
|
+
c, proc = @@timer_procs[timeout]
|
|
26
|
+
proc.call
|
|
27
|
+
@@timer_procs.delete(timeout)
|
|
28
|
+
@@timer_keys_sorted.delete(timeout)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
if (!@@outstanding_sends.empty?)
|
|
32
|
+
EventMachine::add_timer(TIMER_PERIOD) {process_timers}
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def EventMachineInterface::remove_timer(c)
|
|
37
|
+
# Remove from timer structures - if still there!
|
|
38
|
+
@@timer_procs.each do |timeout, value|
|
|
39
|
+
conn, proc = value
|
|
40
|
+
if (c==conn)
|
|
41
|
+
@@timer_procs.delete(timeout)
|
|
42
|
+
@@timer_keys_sorted.delete(timeout)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def EventMachineInterface::add_to_outstanding(c, timeout)
|
|
48
|
+
# Add to timer structures
|
|
49
|
+
@@timer_procs[Time.now+timeout]=[c, Proc.new {
|
|
50
|
+
# Cancel the send
|
|
51
|
+
c.closing=true
|
|
52
|
+
c.close_connection
|
|
53
|
+
c.send_timeout
|
|
54
|
+
}]
|
|
55
|
+
@@timer_keys_sorted=@@timer_procs.keys.sort
|
|
56
|
+
@@outstanding_sends.push(c)
|
|
57
|
+
# puts "#{@@outstanding_sends.length} outstanding connections"
|
|
58
|
+
if (@@outstanding_sends.length==1)
|
|
59
|
+
EventMachine::add_timer(0) {process_timers}
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def EventMachineInterface::remove_from_outstanding(c)
|
|
64
|
+
@@outstanding_sends.delete(c)
|
|
65
|
+
# puts "#{@@outstanding_sends.length} outstanding connections"
|
|
66
|
+
remove_timer(c)
|
|
67
|
+
# If we explicitly started the EM loop, and there are no more outstanding sends, then stop the EM loop
|
|
68
|
+
stop_eventmachine
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def EventMachineInterface::start_eventmachine
|
|
72
|
+
if (!eventmachine_running?)
|
|
73
|
+
if Resolver.start_eventmachine_loop?
|
|
74
|
+
TheLog.debug("Starting EventMachine")
|
|
75
|
+
@@started_em_here = true
|
|
76
|
+
@@em_thread = Thread.new {
|
|
77
|
+
EM.run {
|
|
78
|
+
EventMachine::add_periodic_timer(0.1) {EventMachineInterface::process_timers}
|
|
79
|
+
@@df = EventMachine::DefaultDeferrable.new
|
|
80
|
+
@@df.callback{
|
|
81
|
+
TheLog.debug("Stopping EventMachine")
|
|
82
|
+
EM.stop
|
|
83
|
+
@@em_thread=nil
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else
|
|
88
|
+
TheLog.debug("Not trying to start event loop")
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def EventMachineInterface::start_em_for_resolver(res)
|
|
94
|
+
@@running_clients.push(res)
|
|
95
|
+
start_eventmachine
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def EventMachineInterface::stop_em_for_resolver(res)
|
|
99
|
+
@@running_clients.each_index do |i|
|
|
100
|
+
if (@@running_clients[i]==res)
|
|
101
|
+
@@running_clients.delete_at(i)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
stop_eventmachine
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def EventMachineInterface::eventmachine_running?
|
|
108
|
+
return (@@em_thread!=nil)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def EventMachineInterface::stop_eventmachine
|
|
112
|
+
if (@@started_em_here)
|
|
113
|
+
if (@@outstanding_sends.size==0)
|
|
114
|
+
if (@@running_clients.length == 0)
|
|
115
|
+
if (@@em_thread)
|
|
116
|
+
@@df.set_deferred_status :succeeded
|
|
117
|
+
@@started_em_here = false
|
|
118
|
+
# @@em_thread = nil
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def EventMachineInterface::send(args={})#msg, timeout, server, port, src_add, src_port, tsig_key, ignore_truncation, use_tcp)
|
|
126
|
+
# Is the EventMachine loop running? If not, we need to start it (and mark that we started it)
|
|
127
|
+
begin
|
|
128
|
+
if (!EventMachine.reactor_running?)
|
|
129
|
+
start_eventmachine
|
|
130
|
+
end
|
|
131
|
+
rescue Exception
|
|
132
|
+
#@TODO@ EM::reactor_running? only introduced in EM v0.9.0 - if it's not there, we simply don't know what to do...
|
|
133
|
+
TheLog.error("EventMachine::reactor_running? not available.")
|
|
134
|
+
# if Resolver.start_eventmachine_loop?
|
|
135
|
+
# TheLog.debug("Trying to start event loop - may prove fatal...")
|
|
136
|
+
start_eventmachine
|
|
137
|
+
# else
|
|
138
|
+
# TheLog.debug("Not trying to start event loop.")
|
|
139
|
+
# end
|
|
140
|
+
end
|
|
141
|
+
df = nil
|
|
142
|
+
if (args[:use_tcp])
|
|
143
|
+
df = send_tcp(args)
|
|
144
|
+
else
|
|
145
|
+
df = send_udp(args)
|
|
146
|
+
end
|
|
147
|
+
# Need to add this send to the list of outstanding sends
|
|
148
|
+
add_to_outstanding(df, args[:timeout])
|
|
149
|
+
return df
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def EventMachineInterface::send_tcp(args={})#msg, timeout, server, port, src_add, src_port, tsig_key, ignore_truncation, use_tcp)
|
|
153
|
+
connection = EventMachine::connect(args[:server], args[:port], EmTcpHandler) { |c|
|
|
154
|
+
#@TODO SRC_PORT FOR TCP!!!
|
|
155
|
+
c.timeout_time=Time.now + args[:timeout]
|
|
156
|
+
c.instance_eval {@args = args}
|
|
157
|
+
lenmsg = [args[:msg].length].pack('n')
|
|
158
|
+
c.send_data(lenmsg)
|
|
159
|
+
c.send_data args[:msg] # , args[:server], args[:port]
|
|
160
|
+
TheLog.debug"EventMachine : Sent TCP packet to #{args[:server]}:#{args[:port]}" + # from #{args[:src_addr]}:#{args[:src_port]}, timeout=#{args[:timeout]}"
|
|
161
|
+
", timeout=#{args[:timeout]}"
|
|
162
|
+
}
|
|
163
|
+
return connection # allows clients to set callback, errback, etc., if desired
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def EventMachineInterface::send_udp(args={})# msg, timeout, server, port, src_add, src_port, tsig_key, ignore_truncation, use_cp)
|
|
167
|
+
connection = EventMachine::open_datagram_socket(args[:src_addr], args[:src_port], EmUdpHandler) { |c|
|
|
168
|
+
c.timeout_time=Time.now + args[:timeout]
|
|
169
|
+
c.instance_eval {@args = args}
|
|
170
|
+
c.send_datagram args[:msg], args[:server], args[:port]
|
|
171
|
+
TheLog.debug"EventMachine : Sent datagram to #{args[:server]}:#{args[:port]} from #{args[:src_addr]}:#{args[:src_port]}, timeout=#{args[:timeout]}"
|
|
172
|
+
}
|
|
173
|
+
return connection # allows clients to set callback, errback, etc., if desired
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
class EmUdpHandler < EventMachine::Connection #:nodoc: all
|
|
178
|
+
include EM::Deferrable
|
|
179
|
+
attr_accessor :closing, :timeout_time
|
|
180
|
+
def post_init
|
|
181
|
+
@closing=false
|
|
182
|
+
end
|
|
183
|
+
def receive_data(dgm)
|
|
184
|
+
TheLog.debug("UDP receive_data called")
|
|
185
|
+
process_incoming_message(dgm)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def process_incoming_message(data)
|
|
189
|
+
TheLog.debug("Processing incoming message, #{data.length} bytes")
|
|
190
|
+
ans=nil
|
|
191
|
+
begin
|
|
192
|
+
ans = Message.decode(data)
|
|
193
|
+
rescue Exception => e
|
|
194
|
+
TheLog.error("Decode error! #{e.class}, #{e}\nfor msg (length=#{data.length}) : #{data}")
|
|
195
|
+
@closing=true
|
|
196
|
+
close_connection
|
|
197
|
+
send_to_client(nil, e)
|
|
198
|
+
return
|
|
199
|
+
end
|
|
200
|
+
TheLog.debug("#{ans}")
|
|
201
|
+
ans.answerfrom=(@args[:server])
|
|
202
|
+
ans.answersize=(data.length)
|
|
203
|
+
exception = ans.header.get_exception
|
|
204
|
+
@closing=true
|
|
205
|
+
close_connection
|
|
206
|
+
send_to_client(ans, exception)
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def unbind
|
|
210
|
+
TheLog.debug("Unbind called")
|
|
211
|
+
if (!@closing)
|
|
212
|
+
if (@timeout_time <= Time.now + 1)
|
|
213
|
+
send_timeout
|
|
214
|
+
else
|
|
215
|
+
#@TODO@ RAISE OTHER NETWORK ERROR!
|
|
216
|
+
TheLog.debug("Sending IOError to client")
|
|
217
|
+
send_to_client(nil, IOError.new("Network error"))
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
@closing=false
|
|
221
|
+
# Take the last send off the list of outstanding sends
|
|
222
|
+
EventMachineInterface.remove_from_outstanding(self)
|
|
223
|
+
end
|
|
224
|
+
def send_timeout
|
|
225
|
+
TheLog.debug("Sending timeout to client")
|
|
226
|
+
send_to_client(nil, ResolvTimeout.new("Query timed out"))
|
|
227
|
+
end
|
|
228
|
+
def send_to_client(msg, err)
|
|
229
|
+
# We call set_defered_status when done
|
|
230
|
+
if (err != nil)
|
|
231
|
+
set_deferred_status :failed, msg, err
|
|
232
|
+
else
|
|
233
|
+
set_deferred_status :succeeded, msg
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
class EmTcpHandler < EmUdpHandler #:nodoc: all
|
|
240
|
+
def post_init
|
|
241
|
+
super
|
|
242
|
+
@data=""
|
|
243
|
+
@answersize = 0
|
|
244
|
+
end
|
|
245
|
+
def receive_data(data)
|
|
246
|
+
TheLog.debug("TCP receive_data called")
|
|
247
|
+
#Buffer up the incoming data until we have a complete packet
|
|
248
|
+
@data << data
|
|
249
|
+
if (@data.length >= 2)
|
|
250
|
+
if (@answersize == 0)
|
|
251
|
+
@answersize = @data[0..1].unpack('n')[0]
|
|
252
|
+
TheLog.debug("TCP - expecting #{@answersize} bytes")
|
|
253
|
+
end
|
|
254
|
+
if (@answersize == @data.length - 2)
|
|
255
|
+
TheLog.debug("TCP - got all #{@answersize} bytes ")
|
|
256
|
+
process_incoming_message(@data[2..@data.length])
|
|
257
|
+
else
|
|
258
|
+
TheLog.debug("TCP - got #{@data.length-2} message bytes")
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
end
|
|
265
|
+
end
|
data/lib/Dnsruby/message.rb
CHANGED
|
@@ -42,17 +42,7 @@ module Dnsruby
|
|
|
42
42
|
# and socket->[client_id]
|
|
43
43
|
#
|
|
44
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
45
|
|
|
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
46
|
def initialize
|
|
57
47
|
@@mutex = Mutex.new
|
|
58
48
|
@@mutex.synchronize {
|
|
@@ -76,9 +66,9 @@ module Dnsruby
|
|
|
76
66
|
|
|
77
67
|
class QuerySettings
|
|
78
68
|
attr_accessor :query, :query_header_id, :tsig, :ignore_truncation, :client_queue,
|
|
79
|
-
|
|
69
|
+
:client_query_id, :socket, :dest_server, :dest_port, :endtime, :single_resolver
|
|
80
70
|
# new(query, query_header_id, tsig, ignore_truncation, client_queue, client_query_id,
|
|
81
|
-
# socket, dest_server, dest_port, endtime)
|
|
71
|
+
# socket, dest_server, dest_port, endtime, single_resolver)
|
|
82
72
|
def initialize(*args)
|
|
83
73
|
@query = args[0]
|
|
84
74
|
@query_header_id = args[1]
|
|
@@ -89,7 +79,8 @@ module Dnsruby
|
|
|
89
79
|
@socket = args[6]
|
|
90
80
|
@dest_server = args[7]
|
|
91
81
|
@dest_port=args[8]
|
|
92
|
-
@endtime = args[9]
|
|
82
|
+
@endtime = args[9]
|
|
83
|
+
@single_resolver = args[10]
|
|
93
84
|
end
|
|
94
85
|
end
|
|
95
86
|
|
|
@@ -101,14 +92,6 @@ module Dnsruby
|
|
|
101
92
|
@@socket_hash[query_settings.socket]=[query_settings.client_query_id] # @todo@ If we use persistent sockets then we need to update this array
|
|
102
93
|
@@timeouts[query_settings.client_query_id]=query_settings.endtime
|
|
103
94
|
@@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
95
|
}
|
|
113
96
|
end
|
|
114
97
|
|
|
@@ -157,21 +140,11 @@ module Dnsruby
|
|
|
157
140
|
timeout = tick_time
|
|
158
141
|
end
|
|
159
142
|
begin
|
|
160
|
-
# @@mutex.synchronize{
|
|
161
|
-
# @@in_select=true
|
|
162
|
-
## p "in_select now true"
|
|
163
|
-
# }
|
|
164
143
|
ready, write, errors = IO.select(sockets, nil, nil, timeout)
|
|
165
|
-
# @@mutex.synchronize{
|
|
166
|
-
# @@in_select=false
|
|
167
|
-
## p "in_select now false"
|
|
168
|
-
# }
|
|
169
144
|
rescue SelectWakeup
|
|
170
145
|
# If SelectWakeup, then just restart this loop - the select call will be made with the new data
|
|
171
|
-
# p "signal received!"
|
|
172
146
|
next
|
|
173
147
|
end
|
|
174
|
-
# @@mutex.synchronize{
|
|
175
148
|
if (ready == nil)
|
|
176
149
|
# proces the timeouts
|
|
177
150
|
process_timeouts
|
|
@@ -197,25 +170,14 @@ module Dnsruby
|
|
|
197
170
|
end
|
|
198
171
|
|
|
199
172
|
def process_ready(ready)
|
|
200
|
-
# while (ready.length > 0) do
|
|
201
|
-
# @@mutex.synchronize{
|
|
202
173
|
ready.each do |socket|
|
|
203
|
-
#
|
|
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{
|
|
174
|
+
packet_size = 512 # @TODO@ Sort out per-query packet sizes!!!
|
|
211
175
|
msg = get_incoming_data(socket, packet_size)
|
|
212
176
|
if (msg!=nil)
|
|
213
177
|
send_response_to_client(msg, socket)
|
|
214
178
|
end
|
|
215
|
-
# }
|
|
216
179
|
ready.delete(socket)
|
|
217
180
|
end
|
|
218
|
-
# }
|
|
219
181
|
end
|
|
220
182
|
|
|
221
183
|
def send_response_to_client(msg, socket)
|
|
@@ -233,14 +195,24 @@ module Dnsruby
|
|
|
233
195
|
if (query_header_id == msg.header.id)
|
|
234
196
|
# process the response
|
|
235
197
|
client_queue = nil
|
|
198
|
+
res = nil
|
|
199
|
+
query=nil
|
|
236
200
|
@@mutex.synchronize{
|
|
237
201
|
client_queue = @@query_hash[id].client_queue
|
|
202
|
+
res = @@query_hash[id].single_resolver
|
|
203
|
+
query = @@query_hash[id].query
|
|
238
204
|
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
205
|
+
tcp = (socket.class == TCPSocket)
|
|
206
|
+
# At this point, we should check if the response is OK
|
|
207
|
+
if (res.check_response(msg, query, client_queue, id, tcp))
|
|
208
|
+
remove_id(id)
|
|
209
|
+
exception = msg.header.get_exception
|
|
210
|
+
TheLog.debug("Pushing response to client queue")
|
|
211
|
+
client_queue.push([id, msg, exception])
|
|
212
|
+
notify_queue_observers(client_queue, id)
|
|
213
|
+
else
|
|
214
|
+
# Sending query again - don't return response
|
|
215
|
+
end
|
|
244
216
|
return
|
|
245
217
|
end
|
|
246
218
|
end
|
|
@@ -254,16 +226,14 @@ module Dnsruby
|
|
|
254
226
|
socket = @@query_hash[id].socket
|
|
255
227
|
@@timeouts.delete(id)
|
|
256
228
|
@@query_hash.delete(id)
|
|
257
|
-
@@sockets.delete(socket) # @
|
|
229
|
+
@@sockets.delete(socket) # @TODO@ Not if persistent!
|
|
258
230
|
}
|
|
259
231
|
TheLog.debug("Closing socket #{socket}")
|
|
260
|
-
socket.close # @
|
|
232
|
+
socket.close # @TODO@ Not if persistent!
|
|
261
233
|
end
|
|
262
234
|
|
|
263
235
|
def process_timeouts
|
|
264
236
|
time_now = Time.now
|
|
265
|
-
# timeouts = @@timeouts.values
|
|
266
|
-
# timeouts.sort!
|
|
267
237
|
timeouts={}
|
|
268
238
|
@@mutex.synchronize {
|
|
269
239
|
timeouts = @@timeouts
|
|
@@ -271,8 +241,6 @@ module Dnsruby
|
|
|
271
241
|
timeouts.each do |client_id, timeout|
|
|
272
242
|
if (timeout < time_now)
|
|
273
243
|
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
244
|
end
|
|
277
245
|
end
|
|
278
246
|
end
|
|
@@ -294,7 +262,7 @@ module Dnsruby
|
|
|
294
262
|
# We'd like to do a socket.recvfrom, but that raises an Exception
|
|
295
263
|
# on Windows for TCPSocket for Ruby 1.8.5 (and 1.8.6).
|
|
296
264
|
# So, we need to do something different for TCP than UDP. *sigh*
|
|
297
|
-
# @
|
|
265
|
+
# @TODO@ This workaround will only work if there is exactly one socket per query
|
|
298
266
|
# - *not* ideal TCP use!
|
|
299
267
|
@@mutex.synchronize{
|
|
300
268
|
client_id = @@socket_hash[socket][0]
|
|
@@ -348,7 +316,7 @@ module Dnsruby
|
|
|
348
316
|
end
|
|
349
317
|
|
|
350
318
|
def handle_recvfrom_failure(socket)
|
|
351
|
-
#
|
|
319
|
+
# @TODO@ No way to notify the client about this error, unless there was only one connection on the socket
|
|
352
320
|
ids_for_socket = []
|
|
353
321
|
@@mutex.synchronize{
|
|
354
322
|
ids_for_socket = @@socket_hash[socket]
|
|
@@ -375,7 +343,7 @@ module Dnsruby
|
|
|
375
343
|
query_settings = @@query_hash[id]
|
|
376
344
|
if (answerip == query_settings.dest_server && answerport == query_settings.dest_port)
|
|
377
345
|
# We have a match
|
|
378
|
-
# - @
|
|
346
|
+
# - @TODO@ as long as we're not speaking to the same server on two ports!
|
|
379
347
|
client_id = id
|
|
380
348
|
break
|
|
381
349
|
end
|
|
@@ -385,8 +353,6 @@ module Dnsruby
|
|
|
385
353
|
end
|
|
386
354
|
|
|
387
355
|
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
356
|
if ((!err.kind_of?ResolvError) && (!err.kind_of?ResolvTimeout))
|
|
391
357
|
TheLog.error("INCORRECT ERROR TYPE BEING RETURNED TO CLIENT")
|
|
392
358
|
raise RuntimeError.new("INCORRECT ERROR TYPE BEING RETURNED TO CLIENT")
|
|
@@ -428,7 +394,7 @@ module Dnsruby
|
|
|
428
394
|
def add_observer(client_queue, observer)
|
|
429
395
|
@@mutex.synchronize {
|
|
430
396
|
@@observers[client_queue]=observer
|
|
431
|
-
check_select_thread_synchronized #
|
|
397
|
+
check_select_thread_synchronized # Is this really necessary? The client should start the thread by sending a query, really...
|
|
432
398
|
if (!@@tick_observers.include?observer)
|
|
433
399
|
@@tick_observers.push(observer)
|
|
434
400
|
end
|
|
@@ -75,7 +75,7 @@ module Dnsruby
|
|
|
75
75
|
# Send an initial query
|
|
76
76
|
msg = Message.new(zone, @transfer_type, @klass)
|
|
77
77
|
if @transfer_type == Types.IXFR
|
|
78
|
-
rr = RR.create("#{zone} 0 IN SOA" + '
|
|
78
|
+
rr = RR.create("#{zone} 0 IN SOA" + '0 0 %u 0 0 0 0' % @serial)
|
|
79
79
|
msg.add_authority(rr)
|
|
80
80
|
end
|
|
81
81
|
# @TODO@ TSIG?
|
|
@@ -269,6 +269,8 @@ module Dnsruby
|
|
|
269
269
|
end
|
|
270
270
|
end
|
|
271
271
|
|
|
272
|
+
|
|
273
|
+
# @TODO@ Do all this with EventMachine?
|
|
272
274
|
def send_message(socket, msg) #:nodoc: all
|
|
273
275
|
query_packet = msg.encode
|
|
274
276
|
lenmsg = [query_packet.length].pack('n')
|
data/lib/dnsruby.rb
CHANGED