Dnsruby 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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