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
data/lib/Dnsruby/Resolver.rb
CHANGED
|
@@ -40,10 +40,27 @@ module Dnsruby
|
|
|
40
40
|
#=== Asynchronous
|
|
41
41
|
#These methods use a response queue to return the response and the error
|
|
42
42
|
#
|
|
43
|
-
#* Dnsruby::Resolver#send_async(msg,
|
|
43
|
+
#* Dnsruby::Resolver#send_async(msg, response_queue, query_id)
|
|
44
44
|
#
|
|
45
|
-
|
|
45
|
+
#== Event Loop
|
|
46
|
+
#Dnsruby runs a pure Ruby event loop to handle I/O in a single thread.
|
|
47
|
+
#It is also possible to configure Dnsruby to use EventMachine instead.
|
|
48
|
+
#See the Dnsruby::Resolver::use_eventmachine method for details.
|
|
49
|
+
#
|
|
50
|
+
#Note that, if using Dnsruby from an EventMachine loop, you will need to tell
|
|
51
|
+
#Dnsruby not to start the event loop itself :
|
|
52
|
+
#
|
|
53
|
+
# Dnsruby::Resolver::use_eventmachine(true)
|
|
54
|
+
# Dnsruby::Resolver::start_eventmachine_loop(false)
|
|
46
55
|
class Resolver
|
|
56
|
+
@@event_machine_available=false
|
|
57
|
+
begin
|
|
58
|
+
require 'Dnsruby/event_machine_interface'
|
|
59
|
+
@@event_machine_available=true
|
|
60
|
+
TheLog.debug("EventMachine loaded")
|
|
61
|
+
rescue LoadError
|
|
62
|
+
TheLog.error("EventMachine not found")
|
|
63
|
+
end
|
|
47
64
|
DefaultQueryTimeout = 0
|
|
48
65
|
DefaultPacketTimeout = 10
|
|
49
66
|
DefaultRetryTimes = 4
|
|
@@ -100,6 +117,9 @@ module Dnsruby
|
|
|
100
117
|
# being targetted, and a new nameserver will be queried with the resultant delay.
|
|
101
118
|
attr_accessor :retry_times, :retry_delay
|
|
102
119
|
|
|
120
|
+
@@use_eventmachine=false
|
|
121
|
+
@@start_eventmachine_loop=true
|
|
122
|
+
|
|
103
123
|
#--
|
|
104
124
|
#@TODO@ add load_balance? i.e. Target nameservers in a random, rather than pre-determined, order?
|
|
105
125
|
#++
|
|
@@ -147,16 +167,6 @@ module Dnsruby
|
|
|
147
167
|
else
|
|
148
168
|
return result
|
|
149
169
|
end
|
|
150
|
-
# case result
|
|
151
|
-
# when Exception
|
|
152
|
-
# # Pass them on
|
|
153
|
-
# raise result
|
|
154
|
-
# when Message
|
|
155
|
-
# return result
|
|
156
|
-
# else
|
|
157
|
-
# TheLog.error("Unknown result returned : #{result}")
|
|
158
|
-
# raise ResolvError.new("Unknown error, return : #{result}")
|
|
159
|
-
# end
|
|
160
170
|
end
|
|
161
171
|
|
|
162
172
|
|
|
@@ -173,9 +183,9 @@ module Dnsruby
|
|
|
173
183
|
# res = Dnsruby::Resolver.new
|
|
174
184
|
# query_id = 10 # can be any object you like
|
|
175
185
|
# query_queue = Queue.new
|
|
176
|
-
# res.send_async(Message.new("example.com", Types.MX), query_id
|
|
186
|
+
# res.send_async(Message.new("example.com", Types.MX), query_queue, query_id)
|
|
177
187
|
# query_id += 1
|
|
178
|
-
# res.send_async(Message.new("example.com", Types.A), query_id
|
|
188
|
+
# res.send_async(Message.new("example.com", Types.A), query_queue, query_id)
|
|
179
189
|
# # ...do a load of other stuff here...
|
|
180
190
|
# 2.times do
|
|
181
191
|
# response_id, response, exception = query_queue.pop
|
|
@@ -186,7 +196,463 @@ module Dnsruby
|
|
|
186
196
|
# # deal with problem
|
|
187
197
|
# end
|
|
188
198
|
# end
|
|
189
|
-
|
|
199
|
+
# @TODO@ Sort out RDoc arguments to send_async!
|
|
200
|
+
def send_async(*args) # msg, client_queue, client_query_id)
|
|
201
|
+
if (Resolver.eventmachine?)
|
|
202
|
+
if (!@resolver_em)
|
|
203
|
+
@resolver_em = ResolverEM.new(self)
|
|
204
|
+
end
|
|
205
|
+
return @resolver_em.send_async(*args)
|
|
206
|
+
else
|
|
207
|
+
if (!@resolver_ruby) # @TODO@ Synchronize this?
|
|
208
|
+
@resolver_ruby = ResolverRuby.new(self)
|
|
209
|
+
end
|
|
210
|
+
return @resolver_ruby.send_async(*args)
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
# Close the Resolver. Unfinished queries are terminated with OtherResolvError.
|
|
215
|
+
def close
|
|
216
|
+
[@resolver_em, @resolver_ruby].each do |r| r.close if r end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
# Create a new Resolver object. If no parameters are passed in, then the default
|
|
220
|
+
# system configuration will be used. Otherwise, a Hash may be passed in with the
|
|
221
|
+
# following optional elements :
|
|
222
|
+
#
|
|
223
|
+
#
|
|
224
|
+
# * :port
|
|
225
|
+
# * :use_tcp
|
|
226
|
+
# * :tsig_key
|
|
227
|
+
# * :ignore_truncation
|
|
228
|
+
# * :src_address
|
|
229
|
+
# * :src_port
|
|
230
|
+
# * :persistent_tcp
|
|
231
|
+
# * :persistent_udp
|
|
232
|
+
# * :recurse
|
|
233
|
+
# * :udp_size
|
|
234
|
+
# * :config_info - see Config
|
|
235
|
+
# * :nameserver - can be either a String or an array of Strings
|
|
236
|
+
# * :packet_timeout
|
|
237
|
+
# * :query_timeout
|
|
238
|
+
# * :retry_times
|
|
239
|
+
# * :retry_delay
|
|
240
|
+
def initialize(*args)
|
|
241
|
+
reset_attributes
|
|
242
|
+
|
|
243
|
+
# Process args
|
|
244
|
+
if (args.length==1)
|
|
245
|
+
if (args[0].class == Hash)
|
|
246
|
+
args[0].keys.each do |key|
|
|
247
|
+
begin
|
|
248
|
+
if (key == :config_info)
|
|
249
|
+
@config.set_config_info(args[0][:config_info])
|
|
250
|
+
elsif (key==:nameserver)
|
|
251
|
+
set_config_nameserver(args[0][:nameserver])
|
|
252
|
+
else
|
|
253
|
+
send(key.to_s+"=", args[0][key])
|
|
254
|
+
end
|
|
255
|
+
rescue Exception
|
|
256
|
+
TheLog.error("Argument #{key} not valid\n")
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
elsif (args[0].class == String)
|
|
260
|
+
set_config_nameserver(args[0])
|
|
261
|
+
elsif (args[0].class == Config)
|
|
262
|
+
# also accepts a Config object from Dnsruby::Resolv
|
|
263
|
+
@config = args[0]
|
|
264
|
+
end
|
|
265
|
+
else
|
|
266
|
+
#@TODO@ ?
|
|
267
|
+
end
|
|
268
|
+
if (@single_resolvers==[])
|
|
269
|
+
add_config_nameservers
|
|
270
|
+
end
|
|
271
|
+
update
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
def add_config_nameservers
|
|
275
|
+
# Add the Config nameservers
|
|
276
|
+
@config.nameserver.each do |ns|
|
|
277
|
+
@single_resolvers.push(SingleResolver.new({:server=>ns}))
|
|
278
|
+
end
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
def set_config_nameserver(n)
|
|
282
|
+
if (n).kind_of?String
|
|
283
|
+
@config.nameserver=[n]
|
|
284
|
+
else
|
|
285
|
+
@config.nameserver=n
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
def reset_attributes #:nodoc: all
|
|
290
|
+
if (@resolver_em)
|
|
291
|
+
@resolver_em.reset_attributes
|
|
292
|
+
end
|
|
293
|
+
if (@resolver_ruby)
|
|
294
|
+
@resolver_ruby.reset_attributes
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
# Attributes
|
|
298
|
+
@query_timeout = DefaultQueryTimeout
|
|
299
|
+
@retry_delay = DefaultRetryDelay
|
|
300
|
+
@retry_times = DefaultRetryTimes
|
|
301
|
+
@packet_timeout = DefaultPacketTimeout
|
|
302
|
+
@port = DefaultPort
|
|
303
|
+
@udp_size = DefaultUDPSize
|
|
304
|
+
@use_tcp = false
|
|
305
|
+
@tsig_key = nil
|
|
306
|
+
@ignore_truncation = false
|
|
307
|
+
@config = Config.new()
|
|
308
|
+
@src_addr = '0.0.0.0'
|
|
309
|
+
@src_port = 0
|
|
310
|
+
@recurse = true
|
|
311
|
+
@persistent_udp = false
|
|
312
|
+
@persistent_tcp = false
|
|
313
|
+
@single_resolvers=[]
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
def update #:nodoc: all
|
|
317
|
+
#Update any resolvers we have with the latest config
|
|
318
|
+
@single_resolvers.each do |res|
|
|
319
|
+
[:port, :use_tcp, :tsig_key, :ignore_truncation, :packet_timeout,
|
|
320
|
+
:src_address, :src_port, :persistent_tcp, :persistent_udp, :recurse,
|
|
321
|
+
:udp_size].each do |param|
|
|
322
|
+
|
|
323
|
+
res.send(param.to_s+"=", instance_variable_get("@"+param.to_s))
|
|
324
|
+
end
|
|
325
|
+
end
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
# Add a new SingleResolver to the list of resolvers this Resolver object will
|
|
329
|
+
# query.
|
|
330
|
+
def add_resolver(single)
|
|
331
|
+
@single_resolvers.push(single)
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
def nameserver=(n)
|
|
335
|
+
@single_resolvers=[]
|
|
336
|
+
set_config_nameserver(n)
|
|
337
|
+
add_config_nameservers
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
def packet_timeout=(t)
|
|
341
|
+
@packet_timeout = t
|
|
342
|
+
update
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
def port=(p)
|
|
346
|
+
@port = p
|
|
347
|
+
update
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
def use_tcp=(on)
|
|
351
|
+
@use_tcp = on
|
|
352
|
+
update
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
def tsig_key=(t)
|
|
356
|
+
@tsig_key = t
|
|
357
|
+
update
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
def ignore_truncation=(on)
|
|
361
|
+
@ignore_truncation = on
|
|
362
|
+
update
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
def src_address=(a)
|
|
366
|
+
@src_address = a
|
|
367
|
+
update
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
def src_port=(a)
|
|
371
|
+
@src_port = a
|
|
372
|
+
update
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
def persistent_tcp=(on)
|
|
376
|
+
@persistent_tcp = on
|
|
377
|
+
update
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
def persistent_udp=(on)
|
|
381
|
+
@persistent_udp = on
|
|
382
|
+
update
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
def recurse=(a)
|
|
386
|
+
@recurse = a
|
|
387
|
+
update
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
def udp_size=(s)
|
|
391
|
+
@udp_size = s
|
|
392
|
+
update
|
|
393
|
+
end
|
|
394
|
+
#Tell Dnsruby to use EventMachine for I/O.
|
|
395
|
+
#
|
|
396
|
+
#If EventMachine is not used, then the pure Ruby event loop in Dnsruby will
|
|
397
|
+
#be used instead.
|
|
398
|
+
#
|
|
399
|
+
#If EventMachine is not available on the platform, then a RuntimeError will be raised.
|
|
400
|
+
#
|
|
401
|
+
#Takes a bool to say whether or not to use EventMachine.
|
|
402
|
+
def Resolver.use_eventmachine(on=true)
|
|
403
|
+
if (!@@event_machine_available)
|
|
404
|
+
raise RuntimeError.new("EventMachine is not available in this environment!")
|
|
405
|
+
end
|
|
406
|
+
@@use_eventmachine = on
|
|
407
|
+
if (on)
|
|
408
|
+
TheLog.info("EventMachine will be used for IO")
|
|
409
|
+
else
|
|
410
|
+
TheLog.info("EventMachine will not be used for IO")
|
|
411
|
+
end
|
|
412
|
+
end
|
|
413
|
+
#Check whether EventMachine will be used by Dnsruby
|
|
414
|
+
def Resolver.eventmachine?
|
|
415
|
+
return @@use_eventmachine
|
|
416
|
+
end
|
|
417
|
+
#If EventMachine is being used, then this method tells Dnsruby whether or not
|
|
418
|
+
#to start the EventMachine loop. If you want to use Dnsruby client code as
|
|
419
|
+
#is, but using EventMachine for I/O, then Dnsruby must start the EventMachine
|
|
420
|
+
#loop for you. This is the default behaviour.
|
|
421
|
+
#If you want to use EventMachine-style code, where everything is wrapped
|
|
422
|
+
#up in an EventMachine::run{} call, then this method should be called with
|
|
423
|
+
#false as the parameter.
|
|
424
|
+
#
|
|
425
|
+
#Takes a bool argument to say whether or not to start the event loop when required.
|
|
426
|
+
def Resolver.start_eventmachine_loop(on=true)
|
|
427
|
+
@@start_eventmachine_loop=on
|
|
428
|
+
if (on)
|
|
429
|
+
TheLog.info("EventMachine loop will be started by Dnsruby")
|
|
430
|
+
else
|
|
431
|
+
TheLog.info("EventMachine loop will not be started by Dnsruby")
|
|
432
|
+
end
|
|
433
|
+
end
|
|
434
|
+
#Checks whether Dnsruby will start the EventMachine loop when required.
|
|
435
|
+
def Resolver.start_eventmachine_loop?
|
|
436
|
+
return @@start_eventmachine_loop
|
|
437
|
+
end
|
|
438
|
+
def generate_timeouts(base=0) #:nodoc: all
|
|
439
|
+
#These should be be pegged to the single_resolver they are targetting :
|
|
440
|
+
# e.g. timeouts[timeout1]=nameserver
|
|
441
|
+
timeouts = {}
|
|
442
|
+
retry_delay = @retry_delay
|
|
443
|
+
@retry_times.times do |retry_count|
|
|
444
|
+
if (retry_count>0)
|
|
445
|
+
retry_delay *= 2
|
|
446
|
+
end
|
|
447
|
+
servers=[]
|
|
448
|
+
@single_resolvers.each do |r| servers.push(r.server) end
|
|
449
|
+
@single_resolvers.each_index do |i|
|
|
450
|
+
res= @single_resolvers[i]
|
|
451
|
+
offset = (i*@retry_delay.to_f/@single_resolvers.length)
|
|
452
|
+
if (retry_count==0)
|
|
453
|
+
timeouts[base+offset]=[res, retry_count]
|
|
454
|
+
else
|
|
455
|
+
if (timeouts.has_key?(base+retry_delay+offset))
|
|
456
|
+
TheLog.error("Duplicate timeout key!")
|
|
457
|
+
raise RuntimeError.new("Duplicate timeout key!")
|
|
458
|
+
end
|
|
459
|
+
timeouts[base+retry_delay+offset]=[res, retry_count]
|
|
460
|
+
end
|
|
461
|
+
end
|
|
462
|
+
end
|
|
463
|
+
return timeouts
|
|
464
|
+
end
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
# This class implements the I/O using EventMachine.
|
|
468
|
+
# NOTE - EM does not work properly on Windows with version 0.8.1 - do not use!
|
|
469
|
+
class ResolverEM #:nodoc: all
|
|
470
|
+
TIMER_PERIOD = 0.1
|
|
471
|
+
def initialize(parent)
|
|
472
|
+
@parent=parent
|
|
473
|
+
end
|
|
474
|
+
def reset_attributes #:nodoc: all
|
|
475
|
+
end
|
|
476
|
+
class PersistentData
|
|
477
|
+
attr_accessor :outstanding, :deferrable, :to_send, :timeouts, :timer_procs, :timer_keys_sorted, :finish
|
|
478
|
+
end
|
|
479
|
+
def send_async(*args) #msg, client_queue=nil, client_query_id=nil)
|
|
480
|
+
msg=args[0]
|
|
481
|
+
client_queue=nil
|
|
482
|
+
client_query_id=nil
|
|
483
|
+
if (args.length>1)
|
|
484
|
+
client_queue=args[1]
|
|
485
|
+
if (args.length > 2)
|
|
486
|
+
client_query_id = args[2]
|
|
487
|
+
end
|
|
488
|
+
end
|
|
489
|
+
# We want to send the query to the first resolver.
|
|
490
|
+
# We then want to set up all the timers for all of the events which might happen
|
|
491
|
+
# (first round timers, retry timers, etc.)
|
|
492
|
+
# The callbacks for these should be able to cancel any of the rest (including any for broken resolvers)
|
|
493
|
+
# We can then forget about the query, as all the callbacks will be lodged with EventMachine.
|
|
494
|
+
|
|
495
|
+
EventMachineInterface::start_em_for_resolver(self)
|
|
496
|
+
persistent_data = PersistentData.new
|
|
497
|
+
persistent_data.deferrable = EM::DefaultDeferrable.new
|
|
498
|
+
persistent_data.outstanding = []
|
|
499
|
+
persistent_data.to_send = 0
|
|
500
|
+
persistent_data.timeouts=@parent.generate_timeouts(Time.now)
|
|
501
|
+
persistent_data.timer_procs = {}
|
|
502
|
+
persistent_data.finish = false
|
|
503
|
+
persistent_data.timeouts.keys.sort.each do |timeout|
|
|
504
|
+
value = persistent_data.timeouts[timeout]
|
|
505
|
+
# timeout = timeout.round
|
|
506
|
+
single_resolver, retry_count = value
|
|
507
|
+
persistent_data.to_send+=1
|
|
508
|
+
df = nil
|
|
509
|
+
if (timeout == 0)
|
|
510
|
+
# Send immediately
|
|
511
|
+
TheLog.debug("Sending first EM query")
|
|
512
|
+
df = send_new_em_query(single_resolver, msg, client_queue, client_query_id, persistent_data)
|
|
513
|
+
persistent_data.outstanding.push(df)
|
|
514
|
+
else
|
|
515
|
+
# Send later
|
|
516
|
+
persistent_data.timer_procs[timeout]=Proc.new{
|
|
517
|
+
TheLog.debug("Sending #{timeout} delayed EM query")
|
|
518
|
+
df = send_new_em_query(single_resolver, msg, client_queue, client_query_id, persistent_data)
|
|
519
|
+
persistent_data.outstanding.push(df)
|
|
520
|
+
}
|
|
521
|
+
end
|
|
522
|
+
end
|
|
523
|
+
query_timeout = @parent.query_timeout
|
|
524
|
+
if (query_timeout > 0)
|
|
525
|
+
persistent_data.timer_procs[Time.now+query_timeout]=Proc.new{
|
|
526
|
+
cancel_queries(persistent_data)
|
|
527
|
+
return_to_client(persistent_data.deferrable, client_queue, client_query_id, nil, ResolvTimeout.new("Query timed out after query_timeout=#{query_timeout.round} seconds"))
|
|
528
|
+
}
|
|
529
|
+
end
|
|
530
|
+
persistent_data.timer_keys_sorted = persistent_data.timer_procs.keys.sort
|
|
531
|
+
EventMachine::add_timer(0) {process_eventmachine_timers(persistent_data)}
|
|
532
|
+
return persistent_data.deferrable
|
|
533
|
+
end
|
|
534
|
+
|
|
535
|
+
def process_eventmachine_timers(persistent_data)
|
|
536
|
+
if (persistent_data.finish)
|
|
537
|
+
return
|
|
538
|
+
end
|
|
539
|
+
now = Time.now
|
|
540
|
+
persistent_data.timer_keys_sorted.each do |timeout|
|
|
541
|
+
if (timeout > now)
|
|
542
|
+
break
|
|
543
|
+
end
|
|
544
|
+
persistent_data.timer_procs[timeout].call
|
|
545
|
+
persistent_data.timer_procs.delete(timeout)
|
|
546
|
+
persistent_data.timer_keys_sorted.delete(timeout)
|
|
547
|
+
end
|
|
548
|
+
EventMachine::add_timer(TIMER_PERIOD) {process_eventmachine_timers(persistent_data)}
|
|
549
|
+
end
|
|
550
|
+
|
|
551
|
+
def send_new_em_query(single_resolver, msg, client_queue, client_query_id, persistent_data)
|
|
552
|
+
df = single_resolver.send_async(msg) # client_queue, client_query_id)
|
|
553
|
+
persistent_data.to_send-=1
|
|
554
|
+
df.callback { |answer|
|
|
555
|
+
TheLog.debug("Response returned, answer=#{answer}")
|
|
556
|
+
persistent_data.outstanding.delete(df)
|
|
557
|
+
cancel_queries(persistent_data)
|
|
558
|
+
return_to_client(persistent_data.deferrable, client_queue, client_query_id, answer, nil)
|
|
559
|
+
}
|
|
560
|
+
df.errback { |response, error|
|
|
561
|
+
TheLog.debug("Error #{error} returned, response=#{response}")
|
|
562
|
+
persistent_data.outstanding.delete(df)
|
|
563
|
+
if (response!="cancelling")
|
|
564
|
+
|
|
565
|
+
if (error.kind_of?(ResolvTimeout))
|
|
566
|
+
# - if it was a timeout, then check which number it was, and how many retries are expected on that server
|
|
567
|
+
# - if it was the last retry, on the last server, then return a timeout to the client (and clean up)
|
|
568
|
+
# - otherwise, continue
|
|
569
|
+
# Do we have any more packets to send to this resolver?
|
|
570
|
+
if (persistent_data.outstanding.empty? && persistent_data.to_send==0)
|
|
571
|
+
TheLog.debug("Sending timeout to client")
|
|
572
|
+
return_to_client(persistent_data.deferrable, client_queue, client_query_id, response, error)
|
|
573
|
+
end
|
|
574
|
+
elsif (error.kind_of?NXDomain)
|
|
575
|
+
# - if it was an NXDomain, then return that to the client, and stop all new queries (and clean up)
|
|
576
|
+
TheLog.debug("NXDomain - returning to client")
|
|
577
|
+
cancel_queries(persistent_data)
|
|
578
|
+
return_to_client(persistent_data.deferrable, client_queue, client_query_id, response, error)
|
|
579
|
+
else
|
|
580
|
+
# - if it was any other error, then remove that server from the list for that query
|
|
581
|
+
# If a Too Many Open Files error, then don't remove, but let retry work.
|
|
582
|
+
if (!(error.to_s=~/Errno::EMFILE/))
|
|
583
|
+
remove_server(single_resolver, persistent_data)
|
|
584
|
+
TheLog.debug("Removing #{single_resolver.server} from resolver list for this query")
|
|
585
|
+
else
|
|
586
|
+
TheLog.debug("NOT Removing #{single_resolver.server} due to Errno::EMFILE")
|
|
587
|
+
end
|
|
588
|
+
# - if it was the last server, then return an error to the client (and clean up)
|
|
589
|
+
if (persistent_data.outstanding.empty? && persistent_data.to_send==0)
|
|
590
|
+
# if (outstanding.empty?)
|
|
591
|
+
TheLog.debug("Sending error to client")
|
|
592
|
+
return_to_client(persistent_data.deferrable, client_queue, client_query_id, response, error)
|
|
593
|
+
end
|
|
594
|
+
end
|
|
595
|
+
end
|
|
596
|
+
}
|
|
597
|
+
return df
|
|
598
|
+
end
|
|
599
|
+
|
|
600
|
+
def remove_server(server, persistent_data)
|
|
601
|
+
# Go through persistent_data.timeouts and check all the values for that resolver
|
|
602
|
+
persistent_data.timeouts.each do |key, value|
|
|
603
|
+
if (value[0] == server)
|
|
604
|
+
# Remove the server from the list
|
|
605
|
+
persistent_data.timer_procs.delete(key)
|
|
606
|
+
persistent_data.timer_keys_sorted.delete(key)
|
|
607
|
+
end
|
|
608
|
+
end
|
|
609
|
+
end
|
|
610
|
+
|
|
611
|
+
def cancel_queries(persistent_data)
|
|
612
|
+
TheLog.debug("Cancelling EM queries")
|
|
613
|
+
persistent_data.outstanding.each do |df|
|
|
614
|
+
df.set_deferred_status :failed, "cancelling", "cancelling"
|
|
615
|
+
end
|
|
616
|
+
# Cancel the next tick
|
|
617
|
+
persistent_data.finish = true
|
|
618
|
+
end
|
|
619
|
+
|
|
620
|
+
def return_to_client(deferrable, client_queue, client_query_id, answer, error)
|
|
621
|
+
TheLog.debug("Returning answer=#{answer}, error=#{error} to client")
|
|
622
|
+
if (client_queue)
|
|
623
|
+
client_queue.push([client_query_id, answer, error])
|
|
624
|
+
end
|
|
625
|
+
# We call set_defered_status when done
|
|
626
|
+
if (error != nil)
|
|
627
|
+
deferrable.set_deferred_status :failed, answer, error
|
|
628
|
+
else
|
|
629
|
+
deferrable.set_deferred_status :succeeded, answer
|
|
630
|
+
end
|
|
631
|
+
EventMachineInterface::stop_em_for_resolver(self)
|
|
632
|
+
end
|
|
633
|
+
end
|
|
634
|
+
|
|
635
|
+
# This class implements the I/O using pure Ruby, with no dependencies.
|
|
636
|
+
class ResolverRuby #:nodoc: all
|
|
637
|
+
def initialize(parent)
|
|
638
|
+
reset_attributes
|
|
639
|
+
@parent=parent
|
|
640
|
+
end
|
|
641
|
+
def reset_attributes #:nodoc: all
|
|
642
|
+
# data structures
|
|
643
|
+
@mutex=Mutex.new
|
|
644
|
+
@query_list = {}
|
|
645
|
+
@timeouts = {}
|
|
646
|
+
end
|
|
647
|
+
def send_async(*args) # msg, client_queue, client_query_id=nil)
|
|
648
|
+
msg=args[0]
|
|
649
|
+
client_queue=nil
|
|
650
|
+
client_query_id=nil
|
|
651
|
+
client_queue=args[1]
|
|
652
|
+
if (args.length > 2)
|
|
653
|
+
client_query_id = args[2]
|
|
654
|
+
end
|
|
655
|
+
|
|
190
656
|
# This is the whole point of the Resolver class.
|
|
191
657
|
# We want to use multiple SingleResolvers to run a query.
|
|
192
658
|
# So we kick off a system with select_thread where we send
|
|
@@ -197,6 +663,9 @@ module Dnsruby
|
|
|
197
663
|
# to the client queue.
|
|
198
664
|
|
|
199
665
|
q = Queue.new
|
|
666
|
+
if (client_query_id==nil)
|
|
667
|
+
client_query_id = msg
|
|
668
|
+
end
|
|
200
669
|
|
|
201
670
|
if (!client_queue.kind_of?Queue)
|
|
202
671
|
TheLog.error("Wrong type for client_queue in Resolver#send_async")
|
|
@@ -222,8 +691,8 @@ module Dnsruby
|
|
|
222
691
|
outstanding = []
|
|
223
692
|
@query_list[client_query_id]=[msg, client_queue, q, outstanding]
|
|
224
693
|
|
|
225
|
-
query_timeout = Time.now+@query_timeout
|
|
226
|
-
if (@query_timeout == 0)
|
|
694
|
+
query_timeout = Time.now+@parent.query_timeout
|
|
695
|
+
if (@parent.query_timeout == 0)
|
|
227
696
|
query_timeout = Time.now+31536000 # a year from now
|
|
228
697
|
end
|
|
229
698
|
@timeouts[client_query_id]=[query_timeout, generate_timeouts()]
|
|
@@ -234,6 +703,7 @@ module Dnsruby
|
|
|
234
703
|
st = SelectThread.instance
|
|
235
704
|
st.add_observer(q, self)
|
|
236
705
|
tick if tick_needed
|
|
706
|
+
return client_query_id
|
|
237
707
|
end
|
|
238
708
|
|
|
239
709
|
def generate_timeouts() #:nodoc: all
|
|
@@ -243,34 +713,11 @@ module Dnsruby
|
|
|
243
713
|
# These should be absolute, rather than relative
|
|
244
714
|
# The first value should be Time.now
|
|
245
715
|
time_now = Time.now
|
|
246
|
-
timeouts
|
|
247
|
-
|
|
248
|
-
# e.g. timeouts[timeout1]=nameserver
|
|
249
|
-
retry_delay = @retry_delay
|
|
250
|
-
@retry_times.times do |retry_count|
|
|
251
|
-
if (retry_count>0)
|
|
252
|
-
retry_delay *= 2
|
|
253
|
-
end
|
|
254
|
-
servers=[]
|
|
255
|
-
@single_resolvers.each do |r| servers.push(r.server) end
|
|
256
|
-
@single_resolvers.each_index do |i|
|
|
257
|
-
res= @single_resolvers[i]
|
|
258
|
-
offset = (i*@retry_delay.to_f/@single_resolvers.length)
|
|
259
|
-
if (retry_count==0)
|
|
260
|
-
timeouts[time_now+offset]=[res, retry_count]
|
|
261
|
-
else
|
|
262
|
-
if (timeouts.has_key?(time_now+retry_delay+offset))
|
|
263
|
-
TheLog.error("Duplicate timeout key!")
|
|
264
|
-
raise RuntimeError.new("Duplicate timeout key!")
|
|
265
|
-
end
|
|
266
|
-
timeouts[time_now+retry_delay+offset]=[res, retry_count]
|
|
267
|
-
end
|
|
268
|
-
end
|
|
269
|
-
end
|
|
270
|
-
return timeouts
|
|
716
|
+
timeouts=@parent.generate_timeouts(time_now)
|
|
717
|
+
return timeouts
|
|
271
718
|
end
|
|
272
719
|
|
|
273
|
-
# Close the Resolver. Unfinished queries are terminated with
|
|
720
|
+
# Close the Resolver. Unfinished queries are terminated with OtherResolvError.
|
|
274
721
|
def close
|
|
275
722
|
@mutex.synchronize {
|
|
276
723
|
@query_list.each do |client_query_id, values|
|
|
@@ -326,7 +773,7 @@ module Dnsruby
|
|
|
326
773
|
outstanding.push(id)
|
|
327
774
|
timeouts_done.push(timeout)
|
|
328
775
|
timeouts.delete(timeout)
|
|
329
|
-
res.send_async(msg,
|
|
776
|
+
res.send_async(msg, select_queue, id)
|
|
330
777
|
else
|
|
331
778
|
break
|
|
332
779
|
end
|
|
@@ -349,6 +796,10 @@ module Dnsruby
|
|
|
349
796
|
# just ignore it. It may be for a query we've already completed.
|
|
350
797
|
#
|
|
351
798
|
# So, get the next response from the queue (presuming there is one!)
|
|
799
|
+
#
|
|
800
|
+
# @TODO@ Tick could poll the queue and then call this method if needed - no need for observer interface.
|
|
801
|
+
# @TODO@ Currently, tick and handle_queue_event called from select_thread - could have thread chuck events in to tick_queue. But then, clients would have to call in on other thread!
|
|
802
|
+
#
|
|
352
803
|
if (queue.empty?)
|
|
353
804
|
TheLog.fatal("Queue empty in handle_queue_event!")
|
|
354
805
|
raise RuntimeError.new("Severe internal error - Queue empty in handle_queue_event")
|
|
@@ -442,177 +893,5 @@ module Dnsruby
|
|
|
442
893
|
send_result_and_close(client_queue, client_query_id, select_queue, response, nil)
|
|
443
894
|
}
|
|
444
895
|
end
|
|
445
|
-
|
|
446
|
-
# Create a new Resolver object. If no parameters are passed in, then the default
|
|
447
|
-
# system configuration will be used. Otherwise, a Hash may be passed in with the
|
|
448
|
-
# following optional elements :
|
|
449
|
-
#
|
|
450
|
-
#
|
|
451
|
-
# * :port
|
|
452
|
-
# * :use_tcp
|
|
453
|
-
# * :tsig_key
|
|
454
|
-
# * :ignore_truncation
|
|
455
|
-
# * :src_address
|
|
456
|
-
# * :src_port
|
|
457
|
-
# * :persistent_tcp
|
|
458
|
-
# * :persistent_udp
|
|
459
|
-
# * :recurse
|
|
460
|
-
# * :udp_size
|
|
461
|
-
# * :config_info - see Config
|
|
462
|
-
# * :nameserver - can be either a String or an array of Strings
|
|
463
|
-
# * :packet_timeout
|
|
464
|
-
# * :query_timeout
|
|
465
|
-
# * :retry_times
|
|
466
|
-
# * :retry_delay
|
|
467
|
-
def initialize(*args)
|
|
468
|
-
reset_attributes
|
|
469
|
-
|
|
470
|
-
# Process args
|
|
471
|
-
if (args.length==1)
|
|
472
|
-
if (args[0].class == Hash)
|
|
473
|
-
args[0].keys.each do |key|
|
|
474
|
-
begin
|
|
475
|
-
if (key == :config_info)
|
|
476
|
-
@config.set_config_info(args[0][:config_info])
|
|
477
|
-
elsif (key==:nameserver)
|
|
478
|
-
set_config_nameserver(args[0][:nameserver])
|
|
479
|
-
else
|
|
480
|
-
send(key.to_s+"=", args[0][key])
|
|
481
|
-
end
|
|
482
|
-
rescue Exception
|
|
483
|
-
TheLog.error("Argument #{key} not valid\n")
|
|
484
|
-
end
|
|
485
|
-
end
|
|
486
|
-
elsif (args[0].class == Config)
|
|
487
|
-
# also accepts a Config object from Dnsruby::Resolv
|
|
488
|
-
@config = args[0]
|
|
489
|
-
end
|
|
490
|
-
else
|
|
491
|
-
#@TODO@ ?
|
|
492
|
-
end
|
|
493
|
-
if (@single_resolvers==[])
|
|
494
|
-
add_config_nameservers
|
|
495
|
-
end
|
|
496
|
-
update
|
|
497
|
-
end
|
|
498
|
-
|
|
499
|
-
def add_config_nameservers
|
|
500
|
-
# Add the Config nameservers
|
|
501
|
-
@config.nameserver.each do |ns|
|
|
502
|
-
@single_resolvers.push(SingleResolver.new({:server=>ns}))
|
|
503
|
-
end
|
|
504
|
-
end
|
|
505
|
-
|
|
506
|
-
def set_config_nameserver(n)
|
|
507
|
-
if (n).kind_of?String
|
|
508
|
-
@config.nameserver=[n]
|
|
509
|
-
else
|
|
510
|
-
@config.nameserver=n
|
|
511
|
-
end
|
|
512
|
-
end
|
|
513
|
-
|
|
514
|
-
def reset_attributes #:nodoc: all
|
|
515
|
-
# data structures
|
|
516
|
-
@mutex=Mutex.new
|
|
517
|
-
@query_list = {}
|
|
518
|
-
|
|
519
|
-
# Attributes
|
|
520
|
-
@timeouts = {}
|
|
521
|
-
@query_timeout = DefaultQueryTimeout
|
|
522
|
-
@retry_delay = DefaultRetryDelay
|
|
523
|
-
@retry_times = DefaultRetryTimes
|
|
524
|
-
@packet_timeout = DefaultPacketTimeout
|
|
525
|
-
@port = DefaultPort
|
|
526
|
-
@udp_size = DefaultUDPSize
|
|
527
|
-
@use_tcp = false
|
|
528
|
-
@tsig_key = nil
|
|
529
|
-
@ignore_truncation = false
|
|
530
|
-
@config = Config.new()
|
|
531
|
-
@src_addr = '0.0.0.0'
|
|
532
|
-
@src_port = 0
|
|
533
|
-
@recurse = true
|
|
534
|
-
@persistent_udp = false
|
|
535
|
-
@persistent_tcp = false
|
|
536
|
-
@single_resolvers=[]
|
|
537
|
-
end
|
|
538
|
-
|
|
539
|
-
def update #:nodoc: all
|
|
540
|
-
#Update any resolvers we have with the latest config
|
|
541
|
-
@single_resolvers.each do |res|
|
|
542
|
-
[:port, :use_tcp, :tsig_key, :ignore_truncation, :packet_timeout,
|
|
543
|
-
:src_address, :src_port, :persistent_tcp, :persistent_udp, :recurse,
|
|
544
|
-
:udp_size].each do |param|
|
|
545
|
-
|
|
546
|
-
res.send(param.to_s+"=", instance_variable_get("@"+param.to_s))
|
|
547
|
-
end
|
|
548
|
-
end
|
|
549
|
-
end
|
|
550
|
-
|
|
551
|
-
# Add a new SingleResolver to the list of resolvers this Resolver object will
|
|
552
|
-
# query.
|
|
553
|
-
def add_resolver(single)
|
|
554
|
-
@single_resolvers.push(single)
|
|
555
|
-
end
|
|
556
|
-
|
|
557
|
-
def nameserver=(n)
|
|
558
|
-
@single_resolvers=[]
|
|
559
|
-
set_config_nameserver(n)
|
|
560
|
-
add_config_nameservers
|
|
561
|
-
end
|
|
562
|
-
|
|
563
|
-
def packet_timeout=(t)
|
|
564
|
-
@packet_timeout = t
|
|
565
|
-
update
|
|
566
|
-
end
|
|
567
|
-
|
|
568
|
-
def port=(p)
|
|
569
|
-
@port = p
|
|
570
|
-
update
|
|
571
|
-
end
|
|
572
|
-
|
|
573
|
-
def use_tcp=(on)
|
|
574
|
-
@use_tcp = on
|
|
575
|
-
update
|
|
576
|
-
end
|
|
577
|
-
|
|
578
|
-
def tsig_key=(t)
|
|
579
|
-
@tsig_key = t
|
|
580
|
-
update
|
|
581
|
-
end
|
|
582
|
-
|
|
583
|
-
def ignore_truncation=(on)
|
|
584
|
-
@ignore_truncation = on
|
|
585
|
-
update
|
|
586
|
-
end
|
|
587
|
-
|
|
588
|
-
def src_address=(a)
|
|
589
|
-
@src_address = a
|
|
590
|
-
update
|
|
591
|
-
end
|
|
592
|
-
|
|
593
|
-
def src_port=(a)
|
|
594
|
-
@src_port = a
|
|
595
|
-
update
|
|
596
|
-
end
|
|
597
|
-
|
|
598
|
-
def persistent_tcp=(on)
|
|
599
|
-
@persistent_tcp = on
|
|
600
|
-
update
|
|
601
|
-
end
|
|
602
|
-
|
|
603
|
-
def persistent_udp=(on)
|
|
604
|
-
@persistent_udp = on
|
|
605
|
-
update
|
|
606
|
-
end
|
|
607
|
-
|
|
608
|
-
def recurse=(a)
|
|
609
|
-
@recurse = a
|
|
610
|
-
update
|
|
611
|
-
end
|
|
612
|
-
|
|
613
|
-
def udp_size=(s)
|
|
614
|
-
@udp_size = s
|
|
615
|
-
update
|
|
616
|
-
end
|
|
617
|
-
end
|
|
896
|
+
end
|
|
618
897
|
end
|