dnsruby 1.26 → 1.30
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/DNSSEC +19 -0
- data/EVENTMACHINE +1 -64
- data/EXAMPLES +124 -0
- data/README +2 -6
- data/demo/axfr.rb +2 -2
- data/demo/check_soa.rb +1 -1
- data/demo/check_zone.rb +2 -2
- data/demo/digdlv.rb +65 -0
- data/demo/digitar.rb +62 -0
- data/demo/mresolv.rb +1 -1
- data/demo/mx.rb +1 -1
- data/demo/rubydig.rb +8 -1
- data/demo/trace_dns.rb +28 -14
- data/html/created.rid +1 -0
- data/{doc → html}/fr_class_index.html +118 -172
- data/{doc → html}/fr_file_index.html +81 -130
- data/html/fr_method_index.html +371 -0
- data/{doc → html}/index.html +23 -23
- data/lib/Dnsruby/Cache.rb +129 -22
- data/lib/Dnsruby/Config.rb +72 -11
- data/lib/Dnsruby/DNS.rb +3 -0
- data/lib/Dnsruby/PacketSender.rb +565 -0
- data/lib/Dnsruby/Recursor.rb +337 -156
- data/lib/Dnsruby/Resolver.rb +508 -447
- data/lib/Dnsruby/SingleResolver.rb +151 -629
- data/lib/Dnsruby/code_mapper.rb +4 -2
- data/lib/Dnsruby/dnssec.rb +212 -518
- data/lib/Dnsruby/event_machine_interface.rb +266 -265
- data/lib/Dnsruby/iana_ports.rb +5206 -5196
- data/lib/Dnsruby/key_cache.rb +85 -0
- data/lib/Dnsruby/message.rb +207 -72
- data/lib/Dnsruby/name.rb +42 -4
- data/lib/Dnsruby/resource/CERT.rb +1 -1
- data/lib/Dnsruby/resource/DNSKEY.rb +66 -25
- data/lib/Dnsruby/resource/DS.rb +7 -2
- data/lib/Dnsruby/resource/NAPTR.rb +2 -2
- data/lib/Dnsruby/resource/NSEC.rb +31 -2
- data/lib/Dnsruby/resource/NSEC3.rb +86 -8
- data/lib/Dnsruby/resource/OPT.rb +9 -6
- data/lib/Dnsruby/resource/PX.rb +1 -1
- data/lib/Dnsruby/resource/RT.rb +1 -1
- data/lib/Dnsruby/resource/SRV.rb +3 -3
- data/lib/Dnsruby/resource/resource.rb +30 -36
- data/lib/Dnsruby/select_thread.rb +160 -23
- data/lib/Dnsruby/single_verifier.rb +1289 -0
- data/lib/Dnsruby/validator_thread.rb +108 -0
- data/lib/Dnsruby/zone_transfer.rb +5 -2
- data/lib/dnsruby.rb +33 -18
- data/test/tc_cache.rb +88 -0
- data/test/tc_dlv.rb +55 -0
- data/test/tc_dns.rb +3 -1
- data/test/tc_dnskey.rb +21 -5
- data/test/tc_ds.rb +1 -7
- data/test/tc_itar.rb +76 -0
- data/test/tc_name.rb +21 -0
- data/test/tc_nsec.rb +169 -0
- data/test/tc_nsec3.rb +18 -1
- data/test/tc_packet.rb +97 -6
- data/test/tc_queue.rb +7 -5
- data/test/tc_recur.rb +6 -1
- data/test/tc_res_config.rb +1 -3
- data/test/tc_res_opt.rb +1 -5
- data/test/tc_resolver.rb +27 -8
- data/test/tc_rr-opt.rb +1 -0
- data/test/tc_rr.rb +6 -0
- data/test/tc_rrset.rb +60 -0
- data/test/tc_single_resolver.rb +55 -2
- data/test/tc_tsig.rb +29 -13
- data/test/tc_update.rb +6 -0
- data/test/tc_validator.rb +56 -0
- data/test/{tc_dnssec.rb → tc_verifier.rb} +106 -92
- data/test/ts_online.rb +19 -16
- metadata +27 -1053
- data/doc/classes/Cache.html +0 -179
- data/doc/classes/Cache.src/M000212.html +0 -19
- data/doc/classes/Cache.src/M000213.html +0 -18
- data/doc/classes/Cache.src/M000214.html +0 -23
- data/doc/classes/ConfigTable.html +0 -500
- data/doc/classes/ConfigTable.src/M000019.html +0 -25
- data/doc/classes/ConfigTable.src/M000020.html +0 -18
- data/doc/classes/ConfigTable.src/M000021.html +0 -18
- data/doc/classes/ConfigTable.src/M000022.html +0 -18
- data/doc/classes/ConfigTable.src/M000023.html +0 -18
- data/doc/classes/ConfigTable.src/M000024.html +0 -18
- data/doc/classes/ConfigTable.src/M000025.html +0 -18
- data/doc/classes/ConfigTable.src/M000026.html +0 -18
- data/doc/classes/ConfigTable.src/M000027.html +0 -18
- data/doc/classes/ConfigTable.src/M000028.html +0 -19
- data/doc/classes/ConfigTable.src/M000029.html +0 -21
- data/doc/classes/ConfigTable.src/M000030.html +0 -20
- data/doc/classes/ConfigTable.src/M000031.html +0 -18
- data/doc/classes/ConfigTable.src/M000032.html +0 -25
- data/doc/classes/ConfigTable.src/M000033.html +0 -23
- data/doc/classes/ConfigTable.src/M000034.html +0 -20
- data/doc/classes/ConfigTable.src/M000035.html +0 -20
- data/doc/classes/ConfigTable.src/M000036.html +0 -23
- data/doc/classes/ConfigTable.src/M000037.html +0 -19
- data/doc/classes/ConfigTable.src/M000038.html +0 -18
- data/doc/classes/ConfigTable.src/M000039.html +0 -18
- data/doc/classes/ConfigTable/BoolItem.html +0 -154
- data/doc/classes/ConfigTable/BoolItem.src/M000040.html +0 -18
- data/doc/classes/ConfigTable/BoolItem.src/M000041.html +0 -18
- data/doc/classes/ConfigTable/ExecItem.html +0 -201
- data/doc/classes/ConfigTable/ExecItem.src/M000059.html +0 -20
- data/doc/classes/ConfigTable/ExecItem.src/M000060.html +0 -18
- data/doc/classes/ConfigTable/ExecItem.src/M000061.html +0 -18
- data/doc/classes/ConfigTable/ExecItem.src/M000062.html +0 -18
- data/doc/classes/ConfigTable/ExecItem.src/M000063.html +0 -22
- data/doc/classes/ConfigTable/Item.html +0 -250
- data/doc/classes/ConfigTable/Item.src/M000066.html +0 -22
- data/doc/classes/ConfigTable/Item.src/M000067.html +0 -18
- data/doc/classes/ConfigTable/Item.src/M000068.html +0 -18
- data/doc/classes/ConfigTable/Item.src/M000069.html +0 -18
- data/doc/classes/ConfigTable/Item.src/M000070.html +0 -18
- data/doc/classes/ConfigTable/Item.src/M000071.html +0 -18
- data/doc/classes/ConfigTable/MetaConfigEnvironment.html +0 -325
- data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000046.html +0 -19
- data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000047.html +0 -18
- data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000048.html +0 -18
- data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000049.html +0 -18
- data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000050.html +0 -18
- data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000051.html +0 -18
- data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000052.html +0 -18
- data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000053.html +0 -18
- data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000054.html +0 -18
- data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000055.html +0 -18
- data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000056.html +0 -18
- data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000057.html +0 -19
- data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000058.html +0 -19
- data/doc/classes/ConfigTable/PackageSelectionItem.html +0 -169
- data/doc/classes/ConfigTable/PackageSelectionItem.src/M000044.html +0 -19
- data/doc/classes/ConfigTable/PackageSelectionItem.src/M000045.html +0 -18
- data/doc/classes/ConfigTable/PathItem.html +0 -139
- data/doc/classes/ConfigTable/PathItem.src/M000043.html +0 -18
- data/doc/classes/ConfigTable/ProgramItem.html +0 -139
- data/doc/classes/ConfigTable/ProgramItem.src/M000042.html +0 -18
- data/doc/classes/ConfigTable/SelectItem.html +0 -156
- data/doc/classes/ConfigTable/SelectItem.src/M000064.html +0 -19
- data/doc/classes/ConfigTable/SelectItem.src/M000065.html +0 -18
- data/doc/classes/DnskeyTest.html +0 -180
- data/doc/classes/DnskeyTest.src/M000016.html +0 -26
- data/doc/classes/DnskeyTest.src/M000017.html +0 -24
- data/doc/classes/DnskeyTest.src/M000018.html +0 -33
- data/doc/classes/Dnsruby.html +0 -504
- data/doc/classes/Dnsruby.src/M000351.html +0 -18
- data/doc/classes/Dnsruby/Algorithms.html +0 -173
- data/doc/classes/Dnsruby/Classes.html +0 -197
- data/doc/classes/Dnsruby/Classes.src/M000573.html +0 -23
- data/doc/classes/Dnsruby/Classes.src/M000574.html +0 -19
- data/doc/classes/Dnsruby/CodeMapper.html +0 -375
- data/doc/classes/Dnsruby/CodeMapper.src/M000550.html +0 -18
- data/doc/classes/Dnsruby/CodeMapper.src/M000551.html +0 -33
- data/doc/classes/Dnsruby/CodeMapper.src/M000552.html +0 -21
- data/doc/classes/Dnsruby/CodeMapper.src/M000553.html +0 -19
- data/doc/classes/Dnsruby/CodeMapper.src/M000554.html +0 -19
- data/doc/classes/Dnsruby/CodeMapper.src/M000555.html +0 -18
- data/doc/classes/Dnsruby/CodeMapper.src/M000556.html +0 -22
- data/doc/classes/Dnsruby/CodeMapper.src/M000557.html +0 -22
- data/doc/classes/Dnsruby/CodeMapper.src/M000558.html +0 -22
- data/doc/classes/Dnsruby/CodeMapper.src/M000559.html +0 -31
- data/doc/classes/Dnsruby/CodeMapper.src/M000560.html +0 -19
- data/doc/classes/Dnsruby/Config.html +0 -413
- data/doc/classes/Dnsruby/Config.src/M000505.html +0 -18
- data/doc/classes/Dnsruby/Config.src/M000506.html +0 -19
- data/doc/classes/Dnsruby/Config.src/M000507.html +0 -19
- data/doc/classes/Dnsruby/Config.src/M000508.html +0 -25
- data/doc/classes/Dnsruby/Config.src/M000509.html +0 -21
- data/doc/classes/Dnsruby/Config.src/M000510.html +0 -38
- data/doc/classes/Dnsruby/Config.src/M000511.html +0 -26
- data/doc/classes/Dnsruby/Config.src/M000512.html +0 -22
- data/doc/classes/Dnsruby/Config.src/M000513.html +0 -27
- data/doc/classes/Dnsruby/Config.src/M000514.html +0 -22
- data/doc/classes/Dnsruby/Config.src/M000515.html +0 -21
- data/doc/classes/Dnsruby/DNS.html +0 -571
- data/doc/classes/Dnsruby/DNS.src/M000645.html +0 -24
- data/doc/classes/Dnsruby/DNS.src/M000646.html +0 -18
- data/doc/classes/Dnsruby/DNS.src/M000647.html +0 -18
- data/doc/classes/Dnsruby/DNS.src/M000648.html +0 -20
- data/doc/classes/Dnsruby/DNS.src/M000649.html +0 -19
- data/doc/classes/Dnsruby/DNS.src/M000650.html +0 -20
- data/doc/classes/Dnsruby/DNS.src/M000651.html +0 -18
- data/doc/classes/Dnsruby/DNS.src/M000652.html +0 -19
- data/doc/classes/Dnsruby/DNS.src/M000653.html +0 -20
- data/doc/classes/Dnsruby/DNS.src/M000654.html +0 -30
- data/doc/classes/Dnsruby/DNS.src/M000655.html +0 -19
- data/doc/classes/Dnsruby/DNS.src/M000656.html +0 -20
- data/doc/classes/Dnsruby/DNS.src/M000657.html +0 -31
- data/doc/classes/Dnsruby/DecodeError.html +0 -120
- data/doc/classes/Dnsruby/Dnssec.html +0 -536
- data/doc/classes/Dnsruby/Dnssec.src/M000615.html +0 -21
- data/doc/classes/Dnsruby/Dnssec.src/M000616.html +0 -18
- data/doc/classes/Dnsruby/Dnssec.src/M000617.html +0 -18
- data/doc/classes/Dnsruby/Dnssec.src/M000618.html +0 -19
- data/doc/classes/Dnsruby/Dnssec.src/M000619.html +0 -18
- data/doc/classes/Dnsruby/Dnssec.src/M000620.html +0 -18
- data/doc/classes/Dnsruby/Dnssec.src/M000621.html +0 -18
- data/doc/classes/Dnsruby/Dnssec.src/M000622.html +0 -18
- data/doc/classes/Dnsruby/Dnssec.src/M000623.html +0 -19
- data/doc/classes/Dnsruby/Dnssec.src/M000624.html +0 -18
- data/doc/classes/Dnsruby/Dnssec.src/M000625.html +0 -20
- data/doc/classes/Dnsruby/Dnssec.src/M000626.html +0 -46
- data/doc/classes/Dnsruby/Dnssec.src/M000627.html +0 -23
- data/doc/classes/Dnsruby/Dnssec.src/M000628.html +0 -22
- data/doc/classes/Dnsruby/Dnssec.src/M000629.html +0 -19
- data/doc/classes/Dnsruby/Dnssec.src/M000630.html +0 -116
- data/doc/classes/Dnsruby/Dnssec.src/M000631.html +0 -33
- data/doc/classes/Dnsruby/Dnssec.src/M000632.html +0 -28
- data/doc/classes/Dnsruby/Dnssec.src/M000633.html +0 -92
- data/doc/classes/Dnsruby/Dnssec/ValidationPolicy.html +0 -167
- data/doc/classes/Dnsruby/EncodeError.html +0 -120
- data/doc/classes/Dnsruby/FormErr.html +0 -119
- data/doc/classes/Dnsruby/Header.html +0 -531
- data/doc/classes/Dnsruby/Header.src/M000595.html +0 -18
- data/doc/classes/Dnsruby/Header.src/M000596.html +0 -35
- data/doc/classes/Dnsruby/Header.src/M000597.html +0 -18
- data/doc/classes/Dnsruby/Header.src/M000598.html +0 -18
- data/doc/classes/Dnsruby/Header.src/M000599.html +0 -21
- data/doc/classes/Dnsruby/Header.src/M000600.html +0 -20
- data/doc/classes/Dnsruby/Header.src/M000601.html +0 -32
- data/doc/classes/Dnsruby/Header.src/M000602.html +0 -27
- data/doc/classes/Dnsruby/Header.src/M000603.html +0 -26
- data/doc/classes/Dnsruby/Header.src/M000604.html +0 -18
- data/doc/classes/Dnsruby/Header.src/M000605.html +0 -47
- data/doc/classes/Dnsruby/Header.src/M000606.html +0 -28
- data/doc/classes/Dnsruby/Header.src/M000607.html +0 -30
- data/doc/classes/Dnsruby/Hosts.html +0 -316
- data/doc/classes/Dnsruby/Hosts.src/M000561.html +0 -20
- data/doc/classes/Dnsruby/Hosts.src/M000562.html +0 -19
- data/doc/classes/Dnsruby/Hosts.src/M000563.html +0 -20
- data/doc/classes/Dnsruby/Hosts.src/M000564.html +0 -21
- data/doc/classes/Dnsruby/Hosts.src/M000565.html +0 -19
- data/doc/classes/Dnsruby/Hosts.src/M000566.html +0 -20
- data/doc/classes/Dnsruby/Hosts.src/M000567.html +0 -21
- data/doc/classes/Dnsruby/IPv4.html +0 -233
- data/doc/classes/Dnsruby/IPv4.src/M000568.html +0 -32
- data/doc/classes/Dnsruby/IPv4.src/M000569.html +0 -19
- data/doc/classes/Dnsruby/IPv4.src/M000570.html +0 -18
- data/doc/classes/Dnsruby/IPv4.src/M000571.html +0 -18
- data/doc/classes/Dnsruby/IPv4.src/M000572.html +0 -18
- data/doc/classes/Dnsruby/IPv6.html +0 -281
- data/doc/classes/Dnsruby/IPv6.src/M000608.html +0 -60
- data/doc/classes/Dnsruby/IPv6.src/M000609.html +0 -22
- data/doc/classes/Dnsruby/IPv6.src/M000610.html +0 -20
- data/doc/classes/Dnsruby/IPv6.src/M000611.html +0 -18
- data/doc/classes/Dnsruby/Message.html +0 -861
- data/doc/classes/Dnsruby/Message.src/M000473.html +0 -39
- data/doc/classes/Dnsruby/Message.src/M000474.html +0 -26
- data/doc/classes/Dnsruby/Message.src/M000475.html +0 -23
- data/doc/classes/Dnsruby/Message.src/M000476.html +0 -22
- data/doc/classes/Dnsruby/Message.src/M000477.html +0 -22
- data/doc/classes/Dnsruby/Message.src/M000478.html +0 -20
- data/doc/classes/Dnsruby/Message.src/M000479.html +0 -20
- data/doc/classes/Dnsruby/Message.src/M000480.html +0 -20
- data/doc/classes/Dnsruby/Message.src/M000481.html +0 -20
- data/doc/classes/Dnsruby/Message.src/M000482.html +0 -18
- data/doc/classes/Dnsruby/Message.src/M000483.html +0 -20
- data/doc/classes/Dnsruby/Message.src/M000484.html +0 -23
- data/doc/classes/Dnsruby/Message.src/M000485.html +0 -30
- data/doc/classes/Dnsruby/Message.src/M000486.html +0 -20
- data/doc/classes/Dnsruby/Message.src/M000487.html +0 -18
- data/doc/classes/Dnsruby/Message.src/M000488.html +0 -23
- data/doc/classes/Dnsruby/Message.src/M000489.html +0 -24
- data/doc/classes/Dnsruby/Message.src/M000490.html +0 -73
- data/doc/classes/Dnsruby/Message.src/M000491.html +0 -35
- data/doc/classes/Dnsruby/Message.src/M000492.html +0 -46
- data/doc/classes/Dnsruby/Message/Section.html +0 -160
- data/doc/classes/Dnsruby/Message/Section.src/M000498.html +0 -29
- data/doc/classes/Dnsruby/Message/Section.src/M000499.html +0 -30
- data/doc/classes/Dnsruby/MetaTypes.html +0 -136
- data/doc/classes/Dnsruby/Modes.html +0 -171
- data/doc/classes/Dnsruby/NXDomain.html +0 -119
- data/doc/classes/Dnsruby/Name.html +0 -330
- data/doc/classes/Dnsruby/Name.src/M000458.html +0 -35
- data/doc/classes/Dnsruby/Name.src/M000459.html +0 -20
- data/doc/classes/Dnsruby/Name.src/M000460.html +0 -18
- data/doc/classes/Dnsruby/Name.src/M000461.html +0 -21
- data/doc/classes/Dnsruby/Name.src/M000462.html +0 -22
- data/doc/classes/Dnsruby/Name.src/M000463.html +0 -18
- data/doc/classes/Dnsruby/Name/Label.html +0 -300
- data/doc/classes/Dnsruby/Name/Label.src/M000464.html +0 -21
- data/doc/classes/Dnsruby/Name/Label.src/M000465.html +0 -18
- data/doc/classes/Dnsruby/Name/Label.src/M000466.html +0 -22
- data/doc/classes/Dnsruby/Name/Label.src/M000467.html +0 -18
- data/doc/classes/Dnsruby/Name/Label.src/M000468.html +0 -18
- data/doc/classes/Dnsruby/Name/Label.src/M000469.html +0 -18
- data/doc/classes/Dnsruby/Name/Label.src/M000470.html +0 -18
- data/doc/classes/Dnsruby/Name/Label.src/M000471.html +0 -18
- data/doc/classes/Dnsruby/Name/Label.src/M000472.html +0 -18
- data/doc/classes/Dnsruby/NotImp.html +0 -119
- data/doc/classes/Dnsruby/OpCode.html +0 -146
- data/doc/classes/Dnsruby/OtherResolvError.html +0 -119
- data/doc/classes/Dnsruby/QTypes.html +0 -146
- data/doc/classes/Dnsruby/Question.html +0 -306
- data/doc/classes/Dnsruby/Question.src/M000590.html +0 -47
- data/doc/classes/Dnsruby/Question.src/M000591.html +0 -18
- data/doc/classes/Dnsruby/Question.src/M000592.html +0 -18
- data/doc/classes/Dnsruby/Question.src/M000593.html +0 -32
- data/doc/classes/Dnsruby/Question.src/M000594.html +0 -18
- data/doc/classes/Dnsruby/RCode.html +0 -211
- data/doc/classes/Dnsruby/RR.html +0 -653
- data/doc/classes/Dnsruby/RR.src/M000352.html +0 -18
- data/doc/classes/Dnsruby/RR.src/M000353.html +0 -22
- data/doc/classes/Dnsruby/RR.src/M000354.html +0 -18
- data/doc/classes/Dnsruby/RR.src/M000355.html +0 -26
- data/doc/classes/Dnsruby/RR.src/M000356.html +0 -26
- data/doc/classes/Dnsruby/RR.src/M000357.html +0 -18
- data/doc/classes/Dnsruby/RR.src/M000358.html +0 -36
- data/doc/classes/Dnsruby/RR.src/M000359.html +0 -100
- data/doc/classes/Dnsruby/RR.src/M000360.html +0 -18
- data/doc/classes/Dnsruby/RR.src/M000361.html +0 -18
- data/doc/classes/Dnsruby/RR.src/M000362.html +0 -22
- data/doc/classes/Dnsruby/RR.src/M000363.html +0 -33
- data/doc/classes/Dnsruby/RR.src/M000364.html +0 -24
- data/doc/classes/Dnsruby/RR/ANY.html +0 -133
- data/doc/classes/Dnsruby/RR/CERT.html +0 -180
- data/doc/classes/Dnsruby/RR/CERT/CertificateTypes.html +0 -169
- data/doc/classes/Dnsruby/RR/CNAME.html +0 -151
- data/doc/classes/Dnsruby/RR/DLV.html +0 -134
- data/doc/classes/Dnsruby/RR/DNAME.html +0 -150
- data/doc/classes/Dnsruby/RR/DNSKEY.html +0 -422
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000397.html +0 -20
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000398.html +0 -21
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000399.html +0 -28
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000400.html +0 -22
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000401.html +0 -18
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000402.html +0 -22
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000403.html +0 -18
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000404.html +0 -26
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000405.html +0 -38
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000406.html +0 -58
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000407.html +0 -21
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000408.html +0 -24
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000409.html +0 -39
- data/doc/classes/Dnsruby/RR/DNSKEY.src/M000410.html +0 -24
- data/doc/classes/Dnsruby/RR/DS.html +0 -329
- data/doc/classes/Dnsruby/RR/DS.src/M000390.html +0 -19
- data/doc/classes/Dnsruby/RR/DS.src/M000391.html +0 -28
- data/doc/classes/Dnsruby/RR/DS.src/M000392.html +0 -28
- data/doc/classes/Dnsruby/RR/DS.src/M000393.html +0 -38
- data/doc/classes/Dnsruby/RR/DS.src/M000394.html +0 -29
- data/doc/classes/Dnsruby/RR/DS.src/M000395.html +0 -53
- data/doc/classes/Dnsruby/RR/DS.src/M000396.html +0 -40
- data/doc/classes/Dnsruby/RR/DS/DigestTypes.html +0 -111
- data/doc/classes/Dnsruby/RR/DomainName.html +0 -175
- data/doc/classes/Dnsruby/RR/DomainName.src/M000436.html +0 -18
- data/doc/classes/Dnsruby/RR/Generic.html +0 -133
- data/doc/classes/Dnsruby/RR/HINFO.html +0 -155
- data/doc/classes/Dnsruby/RR/IN.html +0 -155
- data/doc/classes/Dnsruby/RR/IN/A.html +0 -200
- data/doc/classes/Dnsruby/RR/IN/A.src/M000368.html +0 -18
- data/doc/classes/Dnsruby/RR/IN/A.src/M000369.html +0 -18
- data/doc/classes/Dnsruby/RR/IN/A.src/M000370.html +0 -18
- data/doc/classes/Dnsruby/RR/IN/AAAA.html +0 -139
- data/doc/classes/Dnsruby/RR/IN/AFSDB.html +0 -145
- data/doc/classes/Dnsruby/RR/IN/PX.html +0 -143
- data/doc/classes/Dnsruby/RR/IN/SRV.html +0 -238
- data/doc/classes/Dnsruby/RR/IN/SRV.src/M000365.html +0 -29
- data/doc/classes/Dnsruby/RR/IN/SRV.src/M000366.html +0 -26
- data/doc/classes/Dnsruby/RR/IN/SRV.src/M000367.html +0 -22
- data/doc/classes/Dnsruby/RR/IN/WKS.html +0 -166
- data/doc/classes/Dnsruby/RR/IN/WKS.src/M000371.html +0 -20
- data/doc/classes/Dnsruby/RR/ISDN.html +0 -155
- data/doc/classes/Dnsruby/RR/LOC.html +0 -395
- data/doc/classes/Dnsruby/RR/LOC.src/M000376.html +0 -32
- data/doc/classes/Dnsruby/RR/LOC.src/M000377.html +0 -23
- data/doc/classes/Dnsruby/RR/LOC.src/M000378.html +0 -25
- data/doc/classes/Dnsruby/RR/LOC.src/M000379.html +0 -21
- data/doc/classes/Dnsruby/RR/LOC.src/M000380.html +0 -20
- data/doc/classes/Dnsruby/RR/LOC.src/M000381.html +0 -23
- data/doc/classes/Dnsruby/RR/MB.html +0 -150
- data/doc/classes/Dnsruby/RR/MG.html +0 -150
- data/doc/classes/Dnsruby/RR/MINFO.html +0 -156
- data/doc/classes/Dnsruby/RR/MR.html +0 -150
- data/doc/classes/Dnsruby/RR/MX.html +0 -155
- data/doc/classes/Dnsruby/RR/NAPTR.html +0 -190
- data/doc/classes/Dnsruby/RR/NS.html +0 -151
- data/doc/classes/Dnsruby/RR/NSAP.html +0 -293
- data/doc/classes/Dnsruby/RR/NSAP.src/M000446.html +0 -19
- data/doc/classes/Dnsruby/RR/NSAP.src/M000447.html +0 -19
- data/doc/classes/Dnsruby/RR/NSAP.src/M000448.html +0 -22
- data/doc/classes/Dnsruby/RR/NSAP.src/M000449.html +0 -31
- data/doc/classes/Dnsruby/RR/NSEC.html +0 -301
- data/doc/classes/Dnsruby/RR/NSEC.src/M000382.html +0 -19
- data/doc/classes/Dnsruby/RR/NSEC.src/M000383.html +0 -18
- data/doc/classes/Dnsruby/RR/NSEC.src/M000384.html +0 -34
- data/doc/classes/Dnsruby/RR/NSEC.src/M000385.html +0 -18
- data/doc/classes/Dnsruby/RR/NSEC.src/M000386.html +0 -75
- data/doc/classes/Dnsruby/RR/NSEC.src/M000387.html +0 -18
- data/doc/classes/Dnsruby/RR/NSEC.src/M000388.html +0 -92
- data/doc/classes/Dnsruby/RR/NSEC.src/M000389.html +0 -23
- data/doc/classes/Dnsruby/RR/NSEC3.html +0 -366
- data/doc/classes/Dnsruby/RR/NSEC3.src/M000438.html +0 -28
- data/doc/classes/Dnsruby/RR/NSEC3.src/M000439.html +0 -18
- data/doc/classes/Dnsruby/RR/NSEC3.src/M000440.html +0 -18
- data/doc/classes/Dnsruby/RR/NSEC3.src/M000441.html +0 -22
- data/doc/classes/Dnsruby/RR/NSEC3.src/M000442.html +0 -18
- data/doc/classes/Dnsruby/RR/NSEC3.src/M000443.html +0 -21
- data/doc/classes/Dnsruby/RR/NSEC3.src/M000444.html +0 -21
- data/doc/classes/Dnsruby/RR/NSEC3.src/M000445.html +0 -29
- data/doc/classes/Dnsruby/RR/NSEC3PARAM.html +0 -279
- data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000430.html +0 -28
- data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000431.html +0 -18
- data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000432.html +0 -22
- data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000433.html +0 -21
- data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000434.html +0 -25
- data/doc/classes/Dnsruby/RR/PTR.html +0 -132
- data/doc/classes/Dnsruby/RR/RP.html +0 -183
- data/doc/classes/Dnsruby/RR/RP.src/M000435.html +0 -19
- data/doc/classes/Dnsruby/RR/RRSIG.html +0 -372
- data/doc/classes/Dnsruby/RR/RRSIG.src/M000450.html +0 -26
- data/doc/classes/Dnsruby/RR/RRSIG.src/M000451.html +0 -28
- data/doc/classes/Dnsruby/RR/RRSIG.src/M000452.html +0 -23
- data/doc/classes/Dnsruby/RR/RRSIG.src/M000453.html +0 -23
- data/doc/classes/Dnsruby/RR/RRSIG.src/M000454.html +0 -46
- data/doc/classes/Dnsruby/RR/RRSIG.src/M000455.html +0 -50
- data/doc/classes/Dnsruby/RR/RRSIG.src/M000456.html +0 -18
- data/doc/classes/Dnsruby/RR/RRSIG.src/M000457.html +0 -27
- data/doc/classes/Dnsruby/RR/RT.html +0 -155
- data/doc/classes/Dnsruby/RR/SOA.html +0 -233
- data/doc/classes/Dnsruby/RR/SOA.src/M000419.html +0 -24
- data/doc/classes/Dnsruby/RR/SOA.src/M000420.html +0 -27
- data/doc/classes/Dnsruby/RR/SPF.html +0 -138
- data/doc/classes/Dnsruby/RR/TKEY.html +0 -313
- data/doc/classes/Dnsruby/RR/TKEY.src/M000372.html +0 -19
- data/doc/classes/Dnsruby/RR/TKEY.src/M000373.html +0 -29
- data/doc/classes/Dnsruby/RR/TKEY.src/M000374.html +0 -21
- data/doc/classes/Dnsruby/RR/TKEY.src/M000375.html +0 -29
- data/doc/classes/Dnsruby/RR/TSIG.html +0 -524
- data/doc/classes/Dnsruby/RR/TSIG.src/M000421.html +0 -24
- data/doc/classes/Dnsruby/RR/TSIG.src/M000422.html +0 -32
- data/doc/classes/Dnsruby/RR/TSIG.src/M000423.html +0 -54
- data/doc/classes/Dnsruby/RR/TSIG.src/M000424.html +0 -121
- data/doc/classes/Dnsruby/RR/TSIG.src/M000425.html +0 -33
- data/doc/classes/Dnsruby/RR/TSIG.src/M000426.html +0 -25
- data/doc/classes/Dnsruby/RR/TSIG.src/M000427.html +0 -36
- data/doc/classes/Dnsruby/RR/TSIG.src/M000428.html +0 -22
- data/doc/classes/Dnsruby/RR/TSIG.src/M000429.html +0 -29
- data/doc/classes/Dnsruby/RR/TXT.html +0 -233
- data/doc/classes/Dnsruby/RR/TXT.src/M000414.html +0 -18
- data/doc/classes/Dnsruby/RR/TXT.src/M000415.html +0 -18
- data/doc/classes/Dnsruby/RR/TXT.src/M000416.html +0 -20
- data/doc/classes/Dnsruby/RR/TXT.src/M000417.html +0 -27
- data/doc/classes/Dnsruby/RR/TXT.src/M000418.html +0 -25
- data/doc/classes/Dnsruby/RR/X25.html +0 -203
- data/doc/classes/Dnsruby/RR/X25.src/M000411.html +0 -18
- data/doc/classes/Dnsruby/RR/X25.src/M000412.html +0 -18
- data/doc/classes/Dnsruby/RR/X25.src/M000413.html +0 -22
- data/doc/classes/Dnsruby/RRSet.html +0 -400
- data/doc/classes/Dnsruby/RRSet.src/M000575.html +0 -23
- data/doc/classes/Dnsruby/RRSet.src/M000576.html +0 -18
- data/doc/classes/Dnsruby/RRSet.src/M000577.html +0 -18
- data/doc/classes/Dnsruby/RRSet.src/M000578.html +0 -47
- data/doc/classes/Dnsruby/RRSet.src/M000579.html +0 -32
- data/doc/classes/Dnsruby/RRSet.src/M000580.html +0 -18
- data/doc/classes/Dnsruby/RRSet.src/M000581.html +0 -20
- data/doc/classes/Dnsruby/RRSet.src/M000582.html +0 -18
- data/doc/classes/Dnsruby/RRSet.src/M000583.html +0 -18
- data/doc/classes/Dnsruby/RRSet.src/M000584.html +0 -18
- data/doc/classes/Dnsruby/RRSet.src/M000585.html +0 -18
- data/doc/classes/Dnsruby/RRSet.src/M000586.html +0 -22
- data/doc/classes/Dnsruby/RRSet.src/M000587.html +0 -18
- data/doc/classes/Dnsruby/RRSet.src/M000588.html +0 -22
- data/doc/classes/Dnsruby/RRSet.src/M000589.html +0 -18
- data/doc/classes/Dnsruby/Recursor.html +0 -744
- data/doc/classes/Dnsruby/Recursor.src/M000639.html +0 -19
- data/doc/classes/Dnsruby/Recursor.src/M000640.html +0 -97
- data/doc/classes/Dnsruby/Recursor.src/M000641.html +0 -20
- data/doc/classes/Dnsruby/Recursor.src/M000642.html +0 -18
- data/doc/classes/Dnsruby/Recursor.src/M000643.html +0 -31
- data/doc/classes/Dnsruby/Recursor.src/M000644.html +0 -231
- data/doc/classes/Dnsruby/Refused.html +0 -119
- data/doc/classes/Dnsruby/Resolv.html +0 -401
- data/doc/classes/Dnsruby/Resolv.src/M000516.html +0 -18
- data/doc/classes/Dnsruby/Resolv.src/M000517.html +0 -18
- data/doc/classes/Dnsruby/Resolv.src/M000518.html +0 -18
- data/doc/classes/Dnsruby/Resolv.src/M000519.html +0 -18
- data/doc/classes/Dnsruby/Resolv.src/M000520.html +0 -18
- data/doc/classes/Dnsruby/Resolv.src/M000521.html +0 -18
- data/doc/classes/Dnsruby/Resolv.src/M000522.html +0 -18
- data/doc/classes/Dnsruby/Resolv.src/M000523.html +0 -19
- data/doc/classes/Dnsruby/Resolv.src/M000524.html +0 -20
- data/doc/classes/Dnsruby/Resolv.src/M000525.html +0 -29
- data/doc/classes/Dnsruby/Resolv.src/M000526.html +0 -19
- data/doc/classes/Dnsruby/Resolv.src/M000527.html +0 -20
- data/doc/classes/Dnsruby/Resolv.src/M000528.html +0 -25
- data/doc/classes/Dnsruby/ResolvError.html +0 -117
- data/doc/classes/Dnsruby/ResolvTimeout.html +0 -117
- data/doc/classes/Dnsruby/Resolver.html +0 -1114
- data/doc/classes/Dnsruby/Resolver.src/M000658.html +0 -24
- data/doc/classes/Dnsruby/Resolver.src/M000659.html +0 -27
- data/doc/classes/Dnsruby/Resolver.src/M000660.html +0 -28
- data/doc/classes/Dnsruby/Resolver.src/M000661.html +0 -18
- data/doc/classes/Dnsruby/Resolver.src/M000662.html +0 -51
- data/doc/classes/Dnsruby/Resolver.src/M000663.html +0 -25
- data/doc/classes/Dnsruby/Resolver.src/M000664.html +0 -22
- data/doc/classes/Dnsruby/Resolver.src/M000665.html +0 -18
- data/doc/classes/Dnsruby/Resolver.src/M000666.html +0 -20
- data/doc/classes/Dnsruby/Resolver.src/M000667.html +0 -19
- data/doc/classes/Dnsruby/Resolver.src/M000668.html +0 -21
- data/doc/classes/Dnsruby/Resolver.src/M000669.html +0 -21
- data/doc/classes/Dnsruby/Resolver.src/M000670.html +0 -27
- data/doc/classes/Dnsruby/Resolver.src/M000671.html +0 -19
- data/doc/classes/Dnsruby/Resolver.src/M000672.html +0 -19
- data/doc/classes/Dnsruby/Resolver.src/M000673.html +0 -19
- data/doc/classes/Dnsruby/Resolver.src/M000674.html +0 -19
- data/doc/classes/Dnsruby/Resolver.src/M000675.html +0 -19
- data/doc/classes/Dnsruby/Resolver.src/M000676.html +0 -19
- data/doc/classes/Dnsruby/Resolver.src/M000677.html +0 -19
- data/doc/classes/Dnsruby/Resolver.src/M000678.html +0 -19
- data/doc/classes/Dnsruby/Resolver.src/M000679.html +0 -19
- data/doc/classes/Dnsruby/Resolver.src/M000680.html +0 -19
- data/doc/classes/Dnsruby/Resolver.src/M000681.html +0 -26
- data/doc/classes/Dnsruby/Resolver.src/M000682.html +0 -18
- data/doc/classes/Dnsruby/Resolver.src/M000683.html +0 -23
- data/doc/classes/Dnsruby/Resolver.src/M000684.html +0 -18
- data/doc/classes/Dnsruby/ServFail.html +0 -119
- data/doc/classes/Dnsruby/SingleResolver.html +0 -801
- data/doc/classes/Dnsruby/SingleResolver.src/M000529.html +0 -18
- data/doc/classes/Dnsruby/SingleResolver.src/M000530.html +0 -24
- data/doc/classes/Dnsruby/SingleResolver.src/M000531.html +0 -36
- data/doc/classes/Dnsruby/SingleResolver.src/M000532.html +0 -18
- data/doc/classes/Dnsruby/SingleResolver.src/M000533.html +0 -19
- data/doc/classes/Dnsruby/SingleResolver.src/M000534.html +0 -58
- data/doc/classes/Dnsruby/SingleResolver.src/M000535.html +0 -19
- data/doc/classes/Dnsruby/SingleResolver.src/M000536.html +0 -19
- data/doc/classes/Dnsruby/SingleResolver.src/M000537.html +0 -25
- data/doc/classes/Dnsruby/SingleResolver.src/M000538.html +0 -57
- data/doc/classes/Dnsruby/SingleResolver.src/M000539.html +0 -21
- data/doc/classes/Dnsruby/SingleResolver.src/M000540.html +0 -19
- data/doc/classes/Dnsruby/SingleResolver.src/M000541.html +0 -26
- data/doc/classes/Dnsruby/SingleResolver.src/M000542.html +0 -26
- data/doc/classes/Dnsruby/SingleResolver.src/M000543.html +0 -36
- data/doc/classes/Dnsruby/SingleResolver.src/M000544.html +0 -21
- data/doc/classes/Dnsruby/SingleResolver.src/M000545.html +0 -31
- data/doc/classes/Dnsruby/SingleResolver.src/M000546.html +0 -47
- data/doc/classes/Dnsruby/SingleResolver.src/M000547.html +0 -35
- data/doc/classes/Dnsruby/SingleResolver.src/M000548.html +0 -24
- data/doc/classes/Dnsruby/SingleResolver.src/M000549.html +0 -21
- data/doc/classes/Dnsruby/TheLog.html +0 -188
- data/doc/classes/Dnsruby/TheLog.src/M000612.html +0 -18
- data/doc/classes/Dnsruby/TheLog.src/M000613.html +0 -18
- data/doc/classes/Dnsruby/TheLog.src/M000614.html +0 -18
- data/doc/classes/Dnsruby/Types.html +0 -441
- data/doc/classes/Dnsruby/Update.html +0 -368
- data/doc/classes/Dnsruby/Update.src/M000634.html +0 -32
- data/doc/classes/Dnsruby/Update.src/M000635.html +0 -36
- data/doc/classes/Dnsruby/Update.src/M000636.html +0 -32
- data/doc/classes/Dnsruby/Update.src/M000637.html +0 -41
- data/doc/classes/Dnsruby/Update.src/M000638.html +0 -34
- data/doc/classes/Dnsruby/VerifyError.html +0 -119
- data/doc/classes/Dnsruby/ZoneTransfer.html +0 -300
- data/doc/classes/Dnsruby/ZoneTransfer.src/M000500.html +0 -18
- data/doc/classes/Dnsruby/ZoneTransfer.src/M000501.html +0 -24
- data/doc/classes/Dnsruby/ZoneTransfer.src/M000502.html +0 -35
- data/doc/classes/Dnsruby/ZoneTransfer/Delta.html +0 -200
- data/doc/classes/Dnsruby/ZoneTransfer/Delta.src/M000503.html +0 -19
- data/doc/classes/Dnsruby/ZoneTransfer/Delta.src/M000504.html +0 -19
- data/doc/classes/DnssecTest.html +0 -242
- data/doc/classes/DnssecTest.src/M000235.html +0 -58
- data/doc/classes/DnssecTest.src/M000236.html +0 -28
- data/doc/classes/DnssecTest.src/M000237.html +0 -28
- data/doc/classes/DnssecTest.src/M000238.html +0 -28
- data/doc/classes/DnssecTest.src/M000239.html +0 -33
- data/doc/classes/DnssecTest.src/M000240.html +0 -24
- data/doc/classes/DnssecTest.src/M000241.html +0 -47
- data/doc/classes/DnssecTest.src/M000242.html +0 -30
- data/doc/classes/DsTest.html +0 -252
- data/doc/classes/DsTest.src/M000190.html +0 -25
- data/doc/classes/DsTest.src/M000191.html +0 -24
- data/doc/classes/DsTest.src/M000192.html +0 -26
- data/doc/classes/DsTest.src/M000193.html +0 -23
- data/doc/classes/DsTest.src/M000194.html +0 -31
- data/doc/classes/DsTest.src/M000195.html +0 -25
- data/doc/classes/Enumerable.html +0 -118
- data/doc/classes/Errno.html +0 -111
- data/doc/classes/Errno/ENOTEMPTY.html +0 -111
- data/doc/classes/EventMachineTestDeferrable.html +0 -212
- data/doc/classes/EventMachineTestDeferrable.src/M000100.html +0 -20
- data/doc/classes/EventMachineTestDeferrable.src/M000101.html +0 -19
- data/doc/classes/EventMachineTestDeferrable.src/M000102.html +0 -28
- data/doc/classes/EventMachineTestDeferrable.src/M000103.html +0 -29
- data/doc/classes/EventMachineTestDeferrable.src/M000104.html +0 -33
- data/doc/classes/EventMachineTestDeferrable.src/M000105.html +0 -32
- data/doc/classes/EventMachineTestResolver.html +0 -324
- data/doc/classes/EventMachineTestResolver.src/M000177.html +0 -21
- data/doc/classes/EventMachineTestResolver.src/M000178.html +0 -19
- data/doc/classes/EventMachineTestResolver.src/M000179.html +0 -20
- data/doc/classes/EventMachineTestResolver.src/M000180.html +0 -20
- data/doc/classes/EventMachineTestResolver.src/M000181.html +0 -24
- data/doc/classes/EventMachineTestResolver.src/M000182.html +0 -25
- data/doc/classes/EventMachineTestResolver.src/M000183.html +0 -31
- data/doc/classes/EventMachineTestResolver.src/M000184.html +0 -24
- data/doc/classes/EventMachineTestResolver.src/M000185.html +0 -39
- data/doc/classes/EventMachineTestResolver.src/M000186.html +0 -36
- data/doc/classes/EventMachineTestResolver.src/M000187.html +0 -32
- data/doc/classes/EventMachineTestResolver.src/M000188.html +0 -30
- data/doc/classes/EventMachineTestResolver.src/M000189.html +0 -22
- data/doc/classes/EventMachineTestSingleResolver.html +0 -227
- data/doc/classes/EventMachineTestSingleResolver.src/M000092.html +0 -21
- data/doc/classes/EventMachineTestSingleResolver.src/M000093.html +0 -19
- data/doc/classes/EventMachineTestSingleResolver.src/M000094.html +0 -31
- data/doc/classes/EventMachineTestSingleResolver.src/M000095.html +0 -33
- data/doc/classes/EventMachineTestSingleResolver.src/M000096.html +0 -33
- data/doc/classes/EventMachineTestSingleResolver.src/M000097.html +0 -32
- data/doc/classes/EventMachineTestSingleResolver.src/M000098.html +0 -23
- data/doc/classes/File.html +0 -166
- data/doc/classes/File.src/M000336.html +0 -20
- data/doc/classes/File.src/M000337.html +0 -20
- data/doc/classes/File.src/M000338.html +0 -18
- data/doc/classes/FileOperations.html +0 -375
- data/doc/classes/FileOperations.src/M000685.html +0 -31
- data/doc/classes/FileOperations.src/M000686.html +0 -20
- data/doc/classes/FileOperations.src/M000687.html +0 -20
- data/doc/classes/FileOperations.src/M000688.html +0 -24
- data/doc/classes/FileOperations.src/M000689.html +0 -34
- data/doc/classes/FileOperations.src/M000690.html +0 -27
- data/doc/classes/FileOperations.src/M000691.html +0 -21
- data/doc/classes/FileOperations.src/M000692.html +0 -19
- data/doc/classes/FileOperations.src/M000693.html +0 -40
- data/doc/classes/FileOperations.src/M000694.html +0 -19
- data/doc/classes/FileOperations.src/M000695.html +0 -20
- data/doc/classes/FileOperations.src/M000696.html +0 -18
- data/doc/classes/FileOperations.src/M000697.html +0 -18
- data/doc/classes/FileOperations.src/M000698.html +0 -18
- data/doc/classes/FileOperations.src/M000699.html +0 -20
- data/doc/classes/FileOperations.src/M000700.html +0 -20
- data/doc/classes/HookScriptAPI.html +0 -308
- data/doc/classes/HookScriptAPI.src/M000339.html +0 -18
- data/doc/classes/HookScriptAPI.src/M000341.html +0 -18
- data/doc/classes/HookScriptAPI.src/M000342.html +0 -18
- data/doc/classes/HookScriptAPI.src/M000343.html +0 -18
- data/doc/classes/HookScriptAPI.src/M000344.html +0 -18
- data/doc/classes/HookScriptAPI.src/M000345.html +0 -18
- data/doc/classes/HookScriptAPI.src/M000346.html +0 -18
- data/doc/classes/HookScriptAPI.src/M000347.html +0 -18
- data/doc/classes/HookScriptAPI.src/M000348.html +0 -20
- data/doc/classes/HookScriptAPI.src/M000349.html +0 -20
- data/doc/classes/HookScriptAPI.src/M000350.html +0 -20
- data/doc/classes/Installer.html +0 -1148
- data/doc/classes/Installer.src/M000243.html +0 -21
- data/doc/classes/Installer.src/M000244.html +0 -18
- data/doc/classes/Installer.src/M000245.html +0 -17
- data/doc/classes/Installer.src/M000246.html +0 -18
- data/doc/classes/Installer.src/M000247.html +0 -18
- data/doc/classes/Installer.src/M000248.html +0 -18
- data/doc/classes/Installer.src/M000249.html +0 -18
- data/doc/classes/Installer.src/M000250.html +0 -18
- data/doc/classes/Installer.src/M000251.html +0 -23
- data/doc/classes/Installer.src/M000252.html +0 -18
- data/doc/classes/Installer.src/M000255.html +0 -18
- data/doc/classes/Installer.src/M000259.html +0 -18
- data/doc/classes/Installer.src/M000260.html +0 -18
- data/doc/classes/Installer.src/M000261.html +0 -20
- data/doc/classes/Installer.src/M000263.html +0 -18
- data/doc/classes/Installer.src/M000267.html +0 -36
- data/doc/classes/Installer.src/M000268.html +0 -25
- data/doc/classes/Installer.src/M000269.html +0 -24
- data/doc/classes/Installer.src/M000270.html +0 -19
- data/doc/classes/Installer.src/M000271.html +0 -18
- data/doc/classes/Installer.src/M000272.html +0 -18
- data/doc/classes/Installer.src/M000273.html +0 -21
- data/doc/classes/Installer.src/M000274.html +0 -18
- data/doc/classes/Installer.src/M000275.html +0 -20
- data/doc/classes/Installer.src/M000276.html +0 -18
- data/doc/classes/Installer.src/M000277.html +0 -21
- data/doc/classes/Installer.src/M000278.html +0 -18
- data/doc/classes/Installer.src/M000279.html +0 -22
- data/doc/classes/Installer.src/M000280.html +0 -18
- data/doc/classes/Installer.src/M000281.html +0 -23
- data/doc/classes/Installer.src/M000282.html +0 -18
- data/doc/classes/Installer.src/M000283.html +0 -20
- data/doc/classes/Installer.src/M000284.html +0 -19
- data/doc/classes/Installer.src/M000285.html +0 -19
- data/doc/classes/Installer.src/M000286.html +0 -20
- data/doc/classes/Installer.src/M000287.html +0 -30
- data/doc/classes/Installer.src/M000288.html +0 -20
- data/doc/classes/Installer.src/M000294.html +0 -19
- data/doc/classes/Installer.src/M000295.html +0 -20
- data/doc/classes/Installer.src/M000298.html +0 -19
- data/doc/classes/Installer.src/M000302.html +0 -26
- data/doc/classes/Installer.src/M000303.html +0 -25
- data/doc/classes/Installer.src/M000304.html +0 -29
- data/doc/classes/Installer.src/M000305.html +0 -26
- data/doc/classes/Installer/Shebang.html +0 -202
- data/doc/classes/Installer/Shebang.src/M000306.html +0 -23
- data/doc/classes/Installer/Shebang.src/M000307.html +0 -19
- data/doc/classes/Installer/Shebang.src/M000308.html +0 -19
- data/doc/classes/Installer/Shebang.src/M000309.html +0 -18
- data/doc/classes/Nsec3ParamTest.html +0 -172
- data/doc/classes/Nsec3ParamTest.src/M000233.html +0 -26
- data/doc/classes/Nsec3ParamTest.src/M000234.html +0 -24
- data/doc/classes/Nsec3Test.html +0 -202
- data/doc/classes/Nsec3Test.src/M000207.html +0 -27
- data/doc/classes/Nsec3Test.src/M000208.html +0 -24
- data/doc/classes/Nsec3Test.src/M000209.html +0 -39
- data/doc/classes/Nsec3Test.src/M000210.html +0 -23
- data/doc/classes/NsecTest.html +0 -187
- data/doc/classes/NsecTest.src/M000333.html +0 -23
- data/doc/classes/NsecTest.src/M000334.html +0 -24
- data/doc/classes/NsecTest.src/M000335.html +0 -23
- data/doc/classes/RrsetTest.html +0 -137
- data/doc/classes/RrsetTest.src/M000310.html +0 -68
- data/doc/classes/RrsigTest.html +0 -150
- data/doc/classes/RrsigTest.src/M000099.html +0 -35
- data/doc/classes/SetupError.html +0 -111
- data/doc/classes/TestAResolverFile.html +0 -152
- data/doc/classes/TestAResolverFile.src/M000205.html +0 -18
- data/doc/classes/TestAResolverFile.src/M000206.html +0 -33
- data/doc/classes/TestAxfr.html +0 -137
- data/doc/classes/TestAxfr.src/M000106.html +0 -23
- data/doc/classes/TestDNS.html +0 -257
- data/doc/classes/TestDNS.src/M000196.html +0 -18
- data/doc/classes/TestDNS.src/M000197.html +0 -18
- data/doc/classes/TestDNS.src/M000198.html +0 -53
- data/doc/classes/TestDNS.src/M000199.html +0 -19
- data/doc/classes/TestDNS.src/M000200.html +0 -18
- data/doc/classes/TestDNS.src/M000201.html +0 -32
- data/doc/classes/TestDNS.src/M000202.html +0 -74
- data/doc/classes/TestDNS.src/M000203.html +0 -41
- data/doc/classes/TestDNS.src/M000204.html +0 -67
- data/doc/classes/TestDnsruby.html +0 -137
- data/doc/classes/TestDnsruby.src/M000211.html +0 -36
- data/doc/classes/TestEscapedChars.html +0 -152
- data/doc/classes/TestEscapedChars.src/M000014.html +0 -243
- data/doc/classes/TestEscapedChars.src/M000015.html +0 -248
- data/doc/classes/TestEventMachineSoak.html +0 -227
- data/doc/classes/TestEventMachineSoak.src/M000319.html +0 -19
- data/doc/classes/TestEventMachineSoak.src/M000320.html +0 -18
- data/doc/classes/TestEventMachineSoak.src/M000321.html +0 -18
- data/doc/classes/TestEventMachineSoak.src/M000322.html +0 -33
- data/doc/classes/TestEventMachineSoak.src/M000323.html +0 -34
- data/doc/classes/TestEventMachineSoak.src/M000324.html +0 -33
- data/doc/classes/TestEventMachineSoak.src/M000325.html +0 -33
- data/doc/classes/TestHeader.html +0 -137
- data/doc/classes/TestHeader.src/M000091.html +0 -98
- data/doc/classes/TestMisc.html +0 -167
- data/doc/classes/TestMisc.src/M000011.html +0 -28
- data/doc/classes/TestMisc.src/M000012.html +0 -50
- data/doc/classes/TestMisc.src/M000013.html +0 -84
- data/doc/classes/TestName.html +0 -182
- data/doc/classes/TestName.src/M000218.html +0 -24
- data/doc/classes/TestName.src/M000219.html +0 -23
- data/doc/classes/TestName.src/M000220.html +0 -21
- data/doc/classes/TestName.src/M000221.html +0 -21
- data/doc/classes/TestPacket.html +0 -182
- data/doc/classes/TestPacket.src/M000229.html +0 -154
- data/doc/classes/TestPacket.src/M000230.html +0 -25
- data/doc/classes/TestPacket.src/M000231.html +0 -23
- data/doc/classes/TestPacket.src/M000232.html +0 -32
- data/doc/classes/TestPacketUniquePush.html +0 -140
- data/doc/classes/TestPacketUniquePush.src/M000318.html +0 -81
- data/doc/classes/TestQuestion.html +0 -137
- data/doc/classes/TestQuestion.src/M000090.html +0 -45
- data/doc/classes/TestQueue.html +0 -137
- data/doc/classes/TestQueue.src/M000089.html +0 -27
- data/doc/classes/TestRR.html +0 -137
- data/doc/classes/TestRR.src/M000217.html +0 -256
- data/doc/classes/TestRecur.html +0 -137
- data/doc/classes/TestRecur.src/M000176.html +0 -20
- data/doc/classes/TestResOpt.html +0 -227
- data/doc/classes/TestResOpt.src/M000311.html +0 -37
- data/doc/classes/TestResOpt.src/M000312.html +0 -19
- data/doc/classes/TestResOpt.src/M000313.html +0 -30
- data/doc/classes/TestResOpt.src/M000314.html +0 -37
- data/doc/classes/TestResOpt.src/M000315.html +0 -45
- data/doc/classes/TestResOpt.src/M000316.html +0 -36
- data/doc/classes/TestResOpt.src/M000317.html +0 -60
- data/doc/classes/TestResolver.html +0 -357
- data/doc/classes/TestResolver.src/M000077.html +0 -18
- data/doc/classes/TestResolver.src/M000078.html +0 -20
- data/doc/classes/TestResolver.src/M000079.html +0 -20
- data/doc/classes/TestResolver.src/M000080.html +0 -24
- data/doc/classes/TestResolver.src/M000081.html +0 -25
- data/doc/classes/TestResolver.src/M000082.html +0 -31
- data/doc/classes/TestResolver.src/M000083.html +0 -24
- data/doc/classes/TestResolver.src/M000084.html +0 -42
- data/doc/classes/TestResolver.src/M000085.html +0 -38
- data/doc/classes/TestResolver.src/M000086.html +0 -34
- data/doc/classes/TestResolver.src/M000087.html +0 -30
- data/doc/classes/TestResolver.src/M000088.html +0 -41
- data/doc/classes/TestResolverConfig.html +0 -205
- data/doc/classes/TestResolverConfig.src/M000225.html +0 -18
- data/doc/classes/TestResolverConfig.src/M000226.html +0 -37
- data/doc/classes/TestResolverConfig.src/M000227.html +0 -23
- data/doc/classes/TestResolverConfig.src/M000228.html +0 -22
- data/doc/classes/TestResolverEnv.html +0 -141
- data/doc/classes/TestResolverEnv.src/M000332.html +0 -44
- data/doc/classes/TestRrOpt.html +0 -182
- data/doc/classes/TestRrOpt.src/M000007.html +0 -33
- data/doc/classes/TestRrOpt.src/M000008.html +0 -46
- data/doc/classes/TestRrOpt.src/M000009.html +0 -23
- data/doc/classes/TestRrOpt.src/M000010.html +0 -34
- data/doc/classes/TestRrTest.html +0 -155
- data/doc/classes/TestRrTest.src/M000224.html +0 -77
- data/doc/classes/TestRrUnknown.html +0 -167
- data/doc/classes/TestRrUnknown.src/M000074.html +0 -41
- data/doc/classes/TestRrUnknown.src/M000075.html +0 -39
- data/doc/classes/TestRrUnknown.src/M000076.html +0 -42
- data/doc/classes/TestSingleResolver.html +0 -293
- data/doc/classes/TestSingleResolver.src/M000149.html +0 -18
- data/doc/classes/TestSingleResolver.src/M000150.html +0 -19
- data/doc/classes/TestSingleResolver.src/M000151.html +0 -28
- data/doc/classes/TestSingleResolver.src/M000152.html +0 -30
- data/doc/classes/TestSingleResolver.src/M000153.html +0 -55
- data/doc/classes/TestSingleResolver.src/M000154.html +0 -26
- data/doc/classes/TestSingleResolver.src/M000155.html +0 -23
- data/doc/classes/TestSingleResolver.src/M000156.html +0 -27
- data/doc/classes/TestSingleResolver.src/M000157.html +0 -39
- data/doc/classes/TestSingleResolverSoak.html +0 -223
- data/doc/classes/TestSingleResolverSoak.src/M000326.html +0 -18
- data/doc/classes/TestSingleResolverSoak.src/M000327.html +0 -18
- data/doc/classes/TestSingleResolverSoak.src/M000328.html +0 -57
- data/doc/classes/TestSingleResolverSoak.src/M000329.html +0 -64
- data/doc/classes/TestSingleResolverSoak.src/M000330.html +0 -25
- data/doc/classes/TestSingleResolverSoak.src/M000331.html +0 -63
- data/doc/classes/TestSoakBase.html +0 -172
- data/doc/classes/TestSoakBase.src/M000072.html +0 -68
- data/doc/classes/TestSoakBase.src/M000073.html +0 -66
- data/doc/classes/TestTKey.html +0 -152
- data/doc/classes/TestTKey.src/M000215.html +0 -18
- data/doc/classes/TestTKey.src/M000216.html +0 -65
- data/doc/classes/TestTSig.html +0 -309
- data/doc/classes/TestTSig.src/M000138.html +0 -18
- data/doc/classes/TestTSig.src/M000139.html +0 -20
- data/doc/classes/TestTSig.src/M000140.html +0 -26
- data/doc/classes/TestTSig.src/M000141.html +0 -69
- data/doc/classes/TestTSig.src/M000142.html +0 -21
- data/doc/classes/TestTSig.src/M000143.html +0 -60
- data/doc/classes/TestTSig.src/M000144.html +0 -33
- data/doc/classes/TestTSig.src/M000145.html +0 -20
- data/doc/classes/TestTSig.src/M000146.html +0 -24
- data/doc/classes/TestTSig.src/M000147.html +0 -54
- data/doc/classes/TestTSig.src/M000148.html +0 -23
- data/doc/classes/TestTcp.html +0 -152
- data/doc/classes/TestTcp.src/M000222.html +0 -21
- data/doc/classes/TestTcp.src/M000223.html +0 -23
- data/doc/classes/TestUpdate.html +0 -152
- data/doc/classes/TestUpdate.src/M000174.html +0 -20
- data/doc/classes/TestUpdate.src/M000175.html +0 -203
- data/doc/classes/ToplevelInstaller.html +0 -621
- data/doc/classes/ToplevelInstaller.src/M000107.html +0 -23
- data/doc/classes/ToplevelInstaller.src/M000108.html +0 -18
- data/doc/classes/ToplevelInstaller.src/M000109.html +0 -25
- data/doc/classes/ToplevelInstaller.src/M000110.html +0 -21
- data/doc/classes/ToplevelInstaller.src/M000111.html +0 -18
- data/doc/classes/ToplevelInstaller.src/M000112.html +0 -18
- data/doc/classes/ToplevelInstaller.src/M000113.html +0 -38
- data/doc/classes/ToplevelInstaller.src/M000114.html +0 -18
- data/doc/classes/ToplevelInstaller.src/M000115.html +0 -18
- data/doc/classes/ToplevelInstaller.src/M000116.html +0 -18
- data/doc/classes/ToplevelInstaller.src/M000117.html +0 -18
- data/doc/classes/ToplevelInstaller.src/M000118.html +0 -18
- data/doc/classes/ToplevelInstaller.src/M000119.html +0 -40
- data/doc/classes/ToplevelInstaller.src/M000120.html +0 -18
- data/doc/classes/ToplevelInstaller.src/M000121.html +0 -18
- data/doc/classes/ToplevelInstaller.src/M000122.html +0 -21
- data/doc/classes/ToplevelInstaller.src/M000128.html +0 -40
- data/doc/classes/ToplevelInstaller.src/M000129.html +0 -31
- data/doc/classes/ToplevelInstaller.src/M000130.html +0 -52
- data/doc/classes/ToplevelInstaller.src/M000131.html +0 -19
- data/doc/classes/ToplevelInstaller.src/M000132.html +0 -18
- data/doc/classes/ToplevelInstaller.src/M000133.html +0 -18
- data/doc/classes/ToplevelInstaller.src/M000134.html +0 -18
- data/doc/classes/ToplevelInstaller.src/M000135.html +0 -20
- data/doc/classes/ToplevelInstaller.src/M000136.html +0 -18
- data/doc/classes/ToplevelInstaller.src/M000137.html +0 -18
- data/doc/classes/ToplevelInstallerMulti.html +0 -398
- data/doc/classes/ToplevelInstallerMulti.src/M000158.html +0 -21
- data/doc/classes/ToplevelInstallerMulti.src/M000159.html +0 -21
- data/doc/classes/ToplevelInstallerMulti.src/M000160.html +0 -23
- data/doc/classes/ToplevelInstallerMulti.src/M000161.html +0 -29
- data/doc/classes/ToplevelInstallerMulti.src/M000162.html +0 -22
- data/doc/classes/ToplevelInstallerMulti.src/M000163.html +0 -21
- data/doc/classes/ToplevelInstallerMulti.src/M000164.html +0 -21
- data/doc/classes/ToplevelInstallerMulti.src/M000165.html +0 -20
- data/doc/classes/ToplevelInstallerMulti.src/M000166.html +0 -20
- data/doc/classes/ToplevelInstallerMulti.src/M000167.html +0 -20
- data/doc/classes/ToplevelInstallerMulti.src/M000168.html +0 -21
- data/doc/classes/ToplevelInstallerMulti.src/M000169.html +0 -21
- data/doc/classes/ToplevelInstallerMulti.src/M000170.html +0 -25
- data/doc/classes/ToplevelInstallerMulti.src/M000171.html +0 -18
- data/doc/classes/ToplevelInstallerMulti.src/M000172.html +0 -18
- data/doc/classes/ToplevelInstallerMulti.src/M000173.html +0 -18
- data/doc/created.rid +0 -1
- data/doc/files/demo/axfr_rb.html +0 -158
- data/doc/files/demo/check_soa_rb.html +0 -138
- data/doc/files/demo/check_zone_rb.html +0 -231
- data/doc/files/demo/check_zone_rb.src/M000001.html +0 -81
- data/doc/files/demo/check_zone_rb.src/M000002.html +0 -30
- data/doc/files/demo/check_zone_rb.src/M000003.html +0 -23
- data/doc/files/demo/check_zone_rb.src/M000004.html +0 -23
- data/doc/files/demo/check_zone_rb.src/M000005.html +0 -23
- data/doc/files/demo/example_recurse_rb.html +0 -115
- data/doc/files/demo/mresolv_rb.html +0 -130
- data/doc/files/demo/mx_rb.html +0 -108
- data/doc/files/demo/rubydig_rb.html +0 -128
- data/doc/files/demo/trace_dns_rb.html +0 -108
- data/doc/files/lib/Dnsruby/Cache_rb.html +0 -109
- data/doc/files/lib/Dnsruby/Config_rb.html +0 -101
- data/doc/files/lib/Dnsruby/DNS_rb.html +0 -110
- data/doc/files/lib/Dnsruby/Hosts_rb.html +0 -108
- data/doc/files/lib/Dnsruby/Recursor_rb.html +0 -101
- data/doc/files/lib/Dnsruby/Resolver_rb.html +0 -110
- data/doc/files/lib/Dnsruby/SingleResolver_rb.html +0 -109
- data/doc/files/lib/Dnsruby/TheLog_rb.html +0 -110
- data/doc/files/lib/Dnsruby/code_mapper_rb.html +0 -101
- data/doc/files/lib/Dnsruby/dnssec_rb.html +0 -107
- data/doc/files/lib/Dnsruby/event_machine_interface_rb.html +0 -108
- data/doc/files/lib/Dnsruby/iana_ports_rb.html +0 -127
- data/doc/files/lib/Dnsruby/ipv4_rb.html +0 -101
- data/doc/files/lib/Dnsruby/ipv6_rb.html +0 -101
- data/doc/files/lib/Dnsruby/message_rb.html +0 -109
- data/doc/files/lib/Dnsruby/name_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/AAAA_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/AFSDB_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/A_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/CERT_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/DLV_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/DNSKEY_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/DS_rb.html +0 -108
- data/doc/files/lib/Dnsruby/resource/HINFO_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/IN_rb.html +0 -112
- data/doc/files/lib/Dnsruby/resource/ISDN_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/LOC_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/MINFO_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/MX_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/NAPTR_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/NSAP_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/NSEC3PARAM_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/NSEC3_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/NSEC_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/OPT_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/PX_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/RP_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/RRSIG_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/RT_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/SOA_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/SPF_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/SRV_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/TKEY_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/TSIG_rb.html +0 -114
- data/doc/files/lib/Dnsruby/resource/TXT_rb.html +0 -108
- data/doc/files/lib/Dnsruby/resource/X25_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/domain_name_rb.html +0 -101
- data/doc/files/lib/Dnsruby/resource/generic_rb.html +0 -132
- data/doc/files/lib/Dnsruby/resource/resource_rb.html +0 -110
- data/doc/files/lib/Dnsruby/select_thread_rb.html +0 -111
- data/doc/files/lib/Dnsruby/update_rb.html +0 -101
- data/doc/files/lib/Dnsruby/zone_transfer_rb.html +0 -101
- data/doc/files/lib/dnsruby_rb.html +0 -118
- data/doc/files/setup_rb.html +0 -148
- data/doc/files/setup_rb.src/M000006.html +0 -18
- data/doc/files/test/tc_axfr_rb.html +0 -110
- data/doc/files/test/tc_dns_rb.html +0 -117
- data/doc/files/test/tc_dnskey_rb.html +0 -109
- data/doc/files/test/tc_dnsruby_rb.html +0 -117
- data/doc/files/test/tc_dnssec_rb.html +0 -109
- data/doc/files/test/tc_ds_rb.html +0 -110
- data/doc/files/test/tc_escapedchars_rb.html +0 -117
- data/doc/files/test/tc_event_machine_deferrable_rb.html +0 -111
- data/doc/files/test/tc_event_machine_res_rb.html +0 -111
- data/doc/files/test/tc_event_machine_single_res_rb.html +0 -111
- data/doc/files/test/tc_event_machine_soak_rb.html +0 -113
- data/doc/files/test/tc_header_rb.html +0 -117
- data/doc/files/test/tc_misc_rb.html +0 -110
- data/doc/files/test/tc_name_rb.html +0 -117
- data/doc/files/test/tc_nsec3_rb.html +0 -109
- data/doc/files/test/tc_nsec3param_rb.html +0 -109
- data/doc/files/test/tc_nsec_rb.html +0 -109
- data/doc/files/test/tc_packet_rb.html +0 -117
- data/doc/files/test/tc_packet_unique_push_rb.html +0 -117
- data/doc/files/test/tc_question_rb.html +0 -117
- data/doc/files/test/tc_queue_rb.html +0 -109
- data/doc/files/test/tc_recur_rb.html +0 -109
- data/doc/files/test/tc_res_config_rb.html +0 -110
- data/doc/files/test/tc_res_env_rb.html +0 -117
- data/doc/files/test/tc_res_file_rb.html +0 -110
- data/doc/files/test/tc_res_opt_rb.html +0 -117
- data/doc/files/test/tc_resolver_rb.html +0 -117
- data/doc/files/test/tc_rr-opt_rb.html +0 -118
- data/doc/files/test/tc_rr-txt_rb.html +0 -117
- data/doc/files/test/tc_rr-unknown_rb.html +0 -110
- data/doc/files/test/tc_rr_rb.html +0 -117
- data/doc/files/test/tc_rrset_rb.html +0 -109
- data/doc/files/test/tc_rrsig_rb.html +0 -109
- data/doc/files/test/tc_single_resolver_rb.html +0 -117
- data/doc/files/test/tc_soak_base_rb.html +0 -110
- data/doc/files/test/tc_soak_rb.html +0 -121
- data/doc/files/test/tc_tcp_rb.html +0 -110
- data/doc/files/test/tc_tkey_rb.html +0 -111
- data/doc/files/test/tc_tsig_rb.html +0 -111
- data/doc/files/test/tc_update_rb.html +0 -117
- data/doc/files/test/ts_dnsruby_rb.html +0 -109
- data/doc/files/test/ts_offline_rb.html +0 -133
- data/doc/files/test/ts_online_rb.html +0 -128
- data/doc/fr_method_index.html +0 -726
data/lib/Dnsruby/Resolver.rb
CHANGED
|
@@ -13,12 +13,14 @@
|
|
|
13
13
|
#See the License for the specific language governing permissions and
|
|
14
14
|
#limitations under the License.
|
|
15
15
|
#++
|
|
16
|
-
require "Dnsruby/
|
|
16
|
+
#require "Dnsruby/resolver_register.rb"
|
|
17
|
+
require "Dnsruby/PacketSender"
|
|
17
18
|
require "Dnsruby/Recursor"
|
|
18
19
|
module Dnsruby
|
|
19
20
|
#== Description
|
|
20
21
|
#Dnsruby::Resolver is a DNS stub resolver.
|
|
21
|
-
#This class
|
|
22
|
+
#This class performs queries with retries across multiple nameservers.
|
|
23
|
+
#The system configured resolvers are used by default.
|
|
22
24
|
#
|
|
23
25
|
#The retry policy is a combination of the Net::DNS and dnsjava approach, and has the option of :
|
|
24
26
|
#* A total timeout for the query (defaults to 0, meaning "no total timeout")
|
|
@@ -31,6 +33,14 @@ module Dnsruby
|
|
|
31
33
|
#
|
|
32
34
|
# Note also that these timeouts are distinct from the SingleResolver's packet_timeout
|
|
33
35
|
#
|
|
36
|
+
# Timeouts apply to the initial query and response. If DNSSEC validation is to
|
|
37
|
+
# be performed, then additional queries may be required (these are performed automatically
|
|
38
|
+
# by Dnsruby). Each additional query will be performed with its own timeouts.
|
|
39
|
+
# So, even with a query_timeout of 5 seconds, a response which required extensive
|
|
40
|
+
# validation may take several times that long.
|
|
41
|
+
# (Future versions of Dnsruby may expose finer-grained events for client tracking of
|
|
42
|
+
# responses and validation)
|
|
43
|
+
#
|
|
34
44
|
#== Methods
|
|
35
45
|
#
|
|
36
46
|
#=== Synchronous
|
|
@@ -46,29 +56,24 @@ module Dnsruby
|
|
|
46
56
|
#
|
|
47
57
|
#== Event Loop
|
|
48
58
|
#Dnsruby runs a pure Ruby event loop to handle I/O in a single thread.
|
|
49
|
-
#
|
|
50
|
-
#See the Dnsruby::Resolver::use_eventmachine method for details.
|
|
51
|
-
#
|
|
52
|
-
#Note that, if using Dnsruby from an EventMachine loop, you will need to tell
|
|
53
|
-
#Dnsruby not to start the event loop itself :
|
|
54
|
-
#
|
|
55
|
-
# Dnsruby::Resolver::use_eventmachine(true)
|
|
56
|
-
# Dnsruby::Resolver::start_eventmachine_loop(false)
|
|
59
|
+
#Support for EventMachine has been deprecated.
|
|
57
60
|
class Resolver
|
|
58
|
-
@@event_machine_available=false
|
|
59
|
-
begin
|
|
60
|
-
require 'Dnsruby/event_machine_interface'
|
|
61
|
-
@@event_machine_available=true
|
|
62
|
-
Dnsruby.log.debug{"EventMachine loaded"}
|
|
63
|
-
rescue LoadError
|
|
64
|
-
Dnsruby.log.error{"EventMachine not found"}
|
|
65
|
-
end
|
|
66
61
|
DefaultQueryTimeout = 0
|
|
67
62
|
DefaultPacketTimeout = 10
|
|
68
63
|
DefaultRetryTimes = 4
|
|
69
64
|
DefaultRetryDelay = 5
|
|
70
65
|
DefaultPort = 53
|
|
71
|
-
|
|
66
|
+
DefaultDnssec = true
|
|
67
|
+
AbsoluteMinDnssecUdpSize = 1220
|
|
68
|
+
MinDnssecUdpSize = 4096
|
|
69
|
+
DefaultUDPSize = MinDnssecUdpSize
|
|
70
|
+
|
|
71
|
+
class EventType
|
|
72
|
+
RECEIVED = 0
|
|
73
|
+
VALIDATED = 1 # @TODO@ Should be COMPLETE?
|
|
74
|
+
ERROR = 2
|
|
75
|
+
end
|
|
76
|
+
|
|
72
77
|
# The port to send queries to on the resolver
|
|
73
78
|
attr_reader :port
|
|
74
79
|
|
|
@@ -85,11 +90,6 @@ module Dnsruby
|
|
|
85
90
|
# The source address to send queries from
|
|
86
91
|
attr_reader :src_address
|
|
87
92
|
|
|
88
|
-
# Should TCP queries be sent on a persistent socket?
|
|
89
|
-
attr_reader :persistent_tcp
|
|
90
|
-
# Should UDP queries be sent on a persistent socket?
|
|
91
|
-
attr_reader :persistent_udp
|
|
92
|
-
|
|
93
93
|
# Should the Recursion Desired bit be set?
|
|
94
94
|
attr_reader :recurse
|
|
95
95
|
|
|
@@ -100,7 +100,19 @@ module Dnsruby
|
|
|
100
100
|
attr_reader :config
|
|
101
101
|
|
|
102
102
|
# The array of SingleResolvers used for sending query messages
|
|
103
|
-
|
|
103
|
+
# attr_accessor :single_resolvers # :nodoc:
|
|
104
|
+
def single_resolvers=(s) # :nodoc:
|
|
105
|
+
@configured = true
|
|
106
|
+
# @single_res_mutex.synchronize {
|
|
107
|
+
@single_resolvers = s
|
|
108
|
+
# }
|
|
109
|
+
end
|
|
110
|
+
def single_resolvers # :nodoc:
|
|
111
|
+
if (!@configured)
|
|
112
|
+
add_config_nameservers
|
|
113
|
+
end
|
|
114
|
+
return @single_resolvers
|
|
115
|
+
end
|
|
104
116
|
|
|
105
117
|
#The timeout for any individual packet. This is the timeout used by SingleResolver
|
|
106
118
|
attr_reader :packet_timeout
|
|
@@ -119,15 +131,21 @@ module Dnsruby
|
|
|
119
131
|
|
|
120
132
|
# Use DNSSEC for this Resolver
|
|
121
133
|
attr_reader :dnssec
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
134
|
+
|
|
135
|
+
# Defines whether validation is performed by default on this Resolver when the
|
|
136
|
+
# query method is called.
|
|
137
|
+
# Note that send_message and send_async expect a
|
|
138
|
+
# Message object to be passed in, which is already configured to the callers
|
|
139
|
+
# requirements.
|
|
140
|
+
attr_accessor :do_validation
|
|
125
141
|
|
|
126
142
|
#--
|
|
127
143
|
#@TODO@ add load_balance? i.e. Target nameservers in a random, rather than pre-determined, order?
|
|
144
|
+
#This is best done when configuring the Resolver, as it will re-order servers based on their response times.
|
|
145
|
+
#
|
|
128
146
|
#++
|
|
129
147
|
|
|
130
|
-
# Query for a
|
|
148
|
+
# Query for a name. If a valid Message is received, then it is returned
|
|
131
149
|
# to the caller. Otherwise an exception (a Dnsruby::ResolvError or Dnsruby::ResolvTimeout) is raised.
|
|
132
150
|
#
|
|
133
151
|
# require 'Dnsruby'
|
|
@@ -140,11 +158,23 @@ module Dnsruby
|
|
|
140
158
|
msg = Message.new
|
|
141
159
|
msg.header.rd = 1
|
|
142
160
|
msg.add_question(name, type, klass)
|
|
161
|
+
msg.do_validation = @do_validation
|
|
143
162
|
if (@dnssec)
|
|
144
163
|
msg.header.cd = set_cd # We do our own validation by default
|
|
145
164
|
end
|
|
146
165
|
return send_message(msg)
|
|
147
166
|
end
|
|
167
|
+
|
|
168
|
+
def query_no_validation_or_recursion(name, type=Types.A, klass=Classes.IN) # :nodoc: all
|
|
169
|
+
msg = Message.new
|
|
170
|
+
msg.header.rd = false
|
|
171
|
+
msg.do_validation = false
|
|
172
|
+
msg.add_question(name, type, klass)
|
|
173
|
+
if (@dnssec)
|
|
174
|
+
msg.header.cd = true # We do our own validation by default
|
|
175
|
+
end
|
|
176
|
+
return send_message(msg)
|
|
177
|
+
end
|
|
148
178
|
|
|
149
179
|
# Send a message, and wait for the response. If a valid Message is received, then it is returned
|
|
150
180
|
# to the caller. Otherwise an exception (a Dnsruby::ResolvError or Dnsruby::ResolvTimeout) is raised.
|
|
@@ -153,7 +183,8 @@ module Dnsruby
|
|
|
153
183
|
#
|
|
154
184
|
# example :
|
|
155
185
|
#
|
|
156
|
-
# require '
|
|
186
|
+
# require 'dnsruby'
|
|
187
|
+
# include Dnsruby
|
|
157
188
|
# res = Dnsruby::Resolver.new
|
|
158
189
|
# begin
|
|
159
190
|
# response = res.send_message(Message.new("example.com", Types.MX))
|
|
@@ -166,18 +197,69 @@ module Dnsruby
|
|
|
166
197
|
Dnsruby.log.debug{"Resolver : sending message"}
|
|
167
198
|
q = Queue.new
|
|
168
199
|
send_async(message, q)
|
|
200
|
+
# # @TODO@ Add new queue tuples, e.g. :
|
|
201
|
+
# event_type = EventType::RECEIVED
|
|
202
|
+
# reply = nil
|
|
203
|
+
# while (event_type == EventType::RECEIVED)
|
|
204
|
+
# id, event_type, reply, error = q.pop
|
|
205
|
+
# Dnsruby.log.debug{"Resolver : result received"}
|
|
206
|
+
# if ((error != nil) && (event_type == EventType::ERROR))
|
|
207
|
+
# raise error
|
|
208
|
+
# end
|
|
209
|
+
# print "Reply = #{reply}\n"
|
|
210
|
+
# end
|
|
211
|
+
# print "Reply = #{reply}\n"
|
|
212
|
+
# return reply
|
|
213
|
+
|
|
169
214
|
id, result, error = q.pop
|
|
170
|
-
|
|
215
|
+
|
|
171
216
|
if (error != nil)
|
|
172
217
|
raise error
|
|
173
218
|
else
|
|
174
219
|
return result
|
|
175
220
|
end
|
|
176
221
|
end
|
|
222
|
+
|
|
223
|
+
# This method takes a Message (supplied by the client), and sends it to
|
|
224
|
+
# the configured nameservers. No changes are made to the Message before it
|
|
225
|
+
# is sent (TSIG signatures will be applied if configured on the Resolver).
|
|
226
|
+
# Retries are handled as the Resolver is configured to do.
|
|
227
|
+
# Incoming responses to the query are not cached or validated (although TCP
|
|
228
|
+
# fallback will be performed if the TC bit is set and the (Single)Resolver has
|
|
229
|
+
# ignore_truncation set to false).
|
|
230
|
+
# Note that the Message is left untouched - this means that no OPT records are
|
|
231
|
+
# added, even if the UDP transport for the server is specified at more than 512
|
|
232
|
+
# bytes. If it is desired to use EDNS for this packet, then you should call
|
|
233
|
+
# the Dnsruby::PacketSender#prepare_for_dnssec(msg), or
|
|
234
|
+
# Dnsruby::PacketSender#add_opt_rr(msg)
|
|
235
|
+
# The return value from this method is the [response, error] tuple. Either of
|
|
236
|
+
# these values may be nil - it is up to the client to check.
|
|
237
|
+
#
|
|
238
|
+
# example :
|
|
239
|
+
#
|
|
240
|
+
# require 'dnsruby'
|
|
241
|
+
# include Dnsruby
|
|
242
|
+
# res = Dnsruby::Resolver.new
|
|
243
|
+
# response, error = res.send_plain_message(Message.new("example.com", Types.MX))
|
|
244
|
+
# if (error)
|
|
245
|
+
# print "Error returned : #{error}\n"
|
|
246
|
+
# else
|
|
247
|
+
# process_response(response)
|
|
248
|
+
# end
|
|
249
|
+
def send_plain_message(message)
|
|
250
|
+
Dnsruby::TheLog.debug("Resolver : send_plain_message")
|
|
251
|
+
message.do_caching = false
|
|
252
|
+
message.do_validation = false
|
|
253
|
+
message.send_raw = true
|
|
254
|
+
q = Queue.new
|
|
255
|
+
send_async(message, q)
|
|
256
|
+
id, result, error = q.pop
|
|
257
|
+
return [result, error]
|
|
258
|
+
end
|
|
177
259
|
|
|
178
260
|
|
|
179
261
|
#Asynchronously send a Message to the server. The send can be done using just
|
|
180
|
-
#Dnsruby
|
|
262
|
+
#Dnsruby. Support for EventMachine has been deprecated.
|
|
181
263
|
#
|
|
182
264
|
#== Dnsruby pure Ruby event loop :
|
|
183
265
|
#
|
|
@@ -229,75 +311,23 @@ module Dnsruby
|
|
|
229
311
|
# end
|
|
230
312
|
# end
|
|
231
313
|
#
|
|
232
|
-
#== If EventMachine is being used :
|
|
233
|
-
#
|
|
234
|
-
#If EventMachine is being used (see Dnsruby::Resolver::use_eventmachine, then this method returns
|
|
235
|
-
#an EM::Deferrable object. When the response is known, then the Deferrable will complete.
|
|
236
|
-
#If a queue (and ID) is passed in, then the response will also be
|
|
237
|
-
#pushed to the Queue. Note that an ID is not automatically generated by this version.
|
|
238
|
-
#
|
|
239
|
-
#=== Example invocations :
|
|
240
|
-
#
|
|
241
|
-
# deferrable = res.send_async(msg)
|
|
242
|
-
# deferrable = res.send_async(msg, use_tcp)
|
|
243
|
-
# deferrable = res.send_async(msg, q, id, use_tcp)
|
|
244
|
-
#
|
|
245
|
-
#=== Example code
|
|
246
|
-
#* Here is an example of using the code in an EventMachine style :
|
|
247
|
-
#
|
|
248
|
-
# require 'Dnsruby'
|
|
249
|
-
# require 'eventmachine'
|
|
250
|
-
# res = Dnsruby::Resolver.new
|
|
251
|
-
# Dnsruby::Resolver.use_eventmachine
|
|
252
|
-
# Dnsruby::Resolver.start_eventmachine_loop(false)
|
|
253
|
-
# EventMachine::run {
|
|
254
|
-
# df = res.send_async(Dnsruby::Message.new("example.com"))
|
|
255
|
-
# df.callback {|msg|
|
|
256
|
-
# puts "Response : #{msg}"
|
|
257
|
-
# EM.stop}
|
|
258
|
-
# df.errback {|msg, err|
|
|
259
|
-
# puts "Response : #{msg}"
|
|
260
|
-
# puts "Error: #{err}"
|
|
261
|
-
# EM.stop}
|
|
262
|
-
# }
|
|
263
|
-
#
|
|
264
|
-
#* And an example in a normal Dnsruby style :
|
|
265
|
-
#
|
|
266
|
-
# require 'Dnsruby'
|
|
267
|
-
# res = Dnsruby::Resolver.new
|
|
268
|
-
# Dnsruby::Resolver.use_eventmachine
|
|
269
|
-
# Dnsruby::Resolver.start_eventmachine_loop(true) # default
|
|
270
|
-
# q = Queue.new
|
|
271
|
-
# id = res.send_async(Dnsruby::Message.new("example.com"),q)
|
|
272
|
-
# id, response, error = q.pop
|
|
273
|
-
#
|
|
274
314
|
def send_async(*args) # msg, client_queue, client_query_id)
|
|
275
|
-
if (
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
if (!@resolver_ruby) # @TODO@ Synchronize this?
|
|
282
|
-
@resolver_ruby = ResolverRuby.new(self)
|
|
283
|
-
end
|
|
284
|
-
return @resolver_ruby.send_async(*args)
|
|
315
|
+
if (!@configured)
|
|
316
|
+
add_config_nameservers
|
|
317
|
+
end
|
|
318
|
+
# @single_res_mutex.synchronize {
|
|
319
|
+
if (!@resolver_ruby) # @TODO@ Synchronize this?
|
|
320
|
+
@resolver_ruby = ResolverRuby.new(self)
|
|
285
321
|
end
|
|
322
|
+
# }
|
|
323
|
+
return @resolver_ruby.send_async(*args)
|
|
286
324
|
end
|
|
287
325
|
|
|
288
326
|
# Close the Resolver. Unfinished queries are terminated with OtherResolvError.
|
|
289
327
|
def close
|
|
290
|
-
|
|
328
|
+
@resolver_ruby.close if @resolver_ruby
|
|
291
329
|
end
|
|
292
330
|
|
|
293
|
-
# def make_query(*args)
|
|
294
|
-
# return @single_resolvers[0].make_query(*args)
|
|
295
|
-
# end
|
|
296
|
-
#
|
|
297
|
-
# def make_query_packet(args)
|
|
298
|
-
# return @single_resolvers[0].make_query_packet(args)
|
|
299
|
-
# end
|
|
300
|
-
#
|
|
301
331
|
# Create a new Resolver object. If no parameters are passed in, then the default
|
|
302
332
|
# system configuration will be used. Otherwise, a Hash may be passed in with the
|
|
303
333
|
# following optional elements :
|
|
@@ -309,8 +339,6 @@ module Dnsruby
|
|
|
309
339
|
# * :ignore_truncation
|
|
310
340
|
# * :src_address
|
|
311
341
|
# * :src_port
|
|
312
|
-
# * :persistent_tcp
|
|
313
|
-
# * :persistent_udp
|
|
314
342
|
# * :recurse
|
|
315
343
|
# * :udp_size
|
|
316
344
|
# * :config_info - see Config
|
|
@@ -320,9 +348,12 @@ module Dnsruby
|
|
|
320
348
|
# * :retry_times
|
|
321
349
|
# * :retry_delay
|
|
322
350
|
def initialize(*args)
|
|
323
|
-
@
|
|
351
|
+
# @TODO@ Should we allow :namesver to be an RRSet of NS records? Would then need to randomly order them?
|
|
324
352
|
@resolver_ruby = nil
|
|
325
353
|
@src_address = nil
|
|
354
|
+
@single_res_mutex = Mutex.new
|
|
355
|
+
@configured = false
|
|
356
|
+
@config = Config.new()
|
|
326
357
|
reset_attributes
|
|
327
358
|
|
|
328
359
|
# Process args
|
|
@@ -350,46 +381,58 @@ module Dnsruby
|
|
|
350
381
|
else
|
|
351
382
|
# Anything to do?
|
|
352
383
|
end
|
|
353
|
-
if (@single_resolvers==[])
|
|
354
|
-
add_config_nameservers
|
|
355
|
-
end
|
|
384
|
+
# if (@single_resolvers==[])
|
|
385
|
+
# add_config_nameservers
|
|
386
|
+
# end
|
|
356
387
|
update
|
|
388
|
+
# ResolverRegister::register_resolver(self)
|
|
357
389
|
end
|
|
358
390
|
|
|
359
|
-
def add_config_nameservers
|
|
391
|
+
def add_config_nameservers # :nodoc: all
|
|
392
|
+
if (!@configured)
|
|
393
|
+
@config.get_ready
|
|
394
|
+
end
|
|
395
|
+
@configured = true
|
|
396
|
+
@single_res_mutex.synchronize {
|
|
360
397
|
# Add the Config nameservers
|
|
361
398
|
@config.nameserver.each do |ns|
|
|
362
|
-
@single_resolvers.push(
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
399
|
+
@single_resolvers.push(PacketSender.new({:server=>ns, :dnssec=>@dnssec,
|
|
400
|
+
:use_tcp=>@use_tcp, :packet_timeout=>@packet_timeout,
|
|
401
|
+
:tsig => @tsig, :ignore_truncation=>@ignore_truncation,
|
|
402
|
+
:src_address=>@src_address, :src_port=>@src_port,
|
|
403
|
+
:recurse=>@recurse, :udp_size=>@udp_size}))
|
|
367
404
|
end
|
|
405
|
+
}
|
|
368
406
|
end
|
|
369
407
|
|
|
370
408
|
def set_config_nameserver(n)
|
|
409
|
+
# @TODO@ Should we allow NS RRSet here? If so, then .sort_by {rand}
|
|
410
|
+
if (!@configured)
|
|
411
|
+
@config.get_ready
|
|
412
|
+
end
|
|
413
|
+
@configured = true
|
|
371
414
|
if (n).kind_of?String
|
|
372
415
|
@config.nameserver=[n]
|
|
373
416
|
else
|
|
374
417
|
@config.nameserver=n
|
|
375
418
|
end
|
|
419
|
+
add_config_nameservers
|
|
376
420
|
end
|
|
377
421
|
|
|
378
422
|
def reset_attributes #:nodoc: all
|
|
379
|
-
if (@resolver_em)
|
|
380
|
-
@resolver_em.reset_attributes
|
|
381
|
-
end
|
|
382
423
|
if (@resolver_ruby)
|
|
383
424
|
@resolver_ruby.reset_attributes
|
|
384
425
|
end
|
|
385
426
|
|
|
386
427
|
# Attributes
|
|
428
|
+
@do_validation = true
|
|
387
429
|
@query_timeout = DefaultQueryTimeout
|
|
388
430
|
@retry_delay = DefaultRetryDelay
|
|
389
431
|
@retry_times = DefaultRetryTimes
|
|
390
432
|
@packet_timeout = DefaultPacketTimeout
|
|
391
433
|
@port = DefaultPort
|
|
392
434
|
@udp_size = DefaultUDPSize
|
|
435
|
+
@dnssec = DefaultDnssec
|
|
393
436
|
@use_tcp = false
|
|
394
437
|
@tsig = nil
|
|
395
438
|
@ignore_truncation = false
|
|
@@ -397,32 +440,51 @@ module Dnsruby
|
|
|
397
440
|
@src_address = '0.0.0.0'
|
|
398
441
|
@src_port = [0]
|
|
399
442
|
@recurse = true
|
|
400
|
-
@
|
|
401
|
-
@persistent_tcp = false
|
|
443
|
+
@single_res_mutex.synchronize {
|
|
402
444
|
@single_resolvers=[]
|
|
403
|
-
|
|
445
|
+
}
|
|
446
|
+
@configured = false
|
|
404
447
|
end
|
|
405
448
|
|
|
406
449
|
def update #:nodoc: all
|
|
407
450
|
#Update any resolvers we have with the latest config
|
|
408
|
-
@
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
:udp_size, :dnssec].each do |param|
|
|
412
|
-
|
|
413
|
-
res.send(param.to_s+"=", instance_variable_get("@"+param.to_s))
|
|
451
|
+
@single_res_mutex.synchronize {
|
|
452
|
+
@single_resolvers.each do |res|
|
|
453
|
+
update_internal_res(res)
|
|
414
454
|
end
|
|
415
|
-
|
|
455
|
+
}
|
|
416
456
|
end
|
|
417
457
|
|
|
418
|
-
# Add a new SingleResolver to the list of resolvers this Resolver object will
|
|
419
|
-
# query.
|
|
420
|
-
def add_resolver(
|
|
421
|
-
@
|
|
458
|
+
# # Add a new SingleResolver to the list of resolvers this Resolver object will
|
|
459
|
+
# # query.
|
|
460
|
+
# def add_resolver(internal) # :nodoc:
|
|
461
|
+
# # @TODO@ Make a new PacketSender from this SingleResolver!!
|
|
462
|
+
# @single_resolvers.push(internal)
|
|
463
|
+
# end
|
|
464
|
+
|
|
465
|
+
def add_server(server)# :nodoc:
|
|
466
|
+
@configured = true
|
|
467
|
+
res = PacketSender.new(server)
|
|
468
|
+
update_internal_res(res)
|
|
469
|
+
@single_res_mutex.synchronize {
|
|
470
|
+
@single_resolvers.push(res)
|
|
471
|
+
}
|
|
472
|
+
end
|
|
473
|
+
|
|
474
|
+
def update_internal_res(res)
|
|
475
|
+
[:port, :use_tcp, :tsig, :ignore_truncation, :packet_timeout,
|
|
476
|
+
:src_address, :src_port, :recurse,
|
|
477
|
+
:udp_size, :dnssec].each do |param|
|
|
478
|
+
|
|
479
|
+
res.send(param.to_s+"=", instance_variable_get("@"+param.to_s))
|
|
480
|
+
end
|
|
422
481
|
end
|
|
423
482
|
|
|
424
483
|
def nameserver=(n)
|
|
484
|
+
@configured = true
|
|
485
|
+
@single_res_mutex.synchronize {
|
|
425
486
|
@single_resolvers=[]
|
|
487
|
+
}
|
|
426
488
|
set_config_nameserver(n)
|
|
427
489
|
add_config_nameservers
|
|
428
490
|
end
|
|
@@ -458,8 +520,8 @@ module Dnsruby
|
|
|
458
520
|
# res.src_port=60015..60115
|
|
459
521
|
#
|
|
460
522
|
def src_port=(p)
|
|
461
|
-
if (
|
|
462
|
-
@src_port =
|
|
523
|
+
if (Resolver.check_port(p))
|
|
524
|
+
@src_port = Resolver.get_ports_from(p)
|
|
463
525
|
update
|
|
464
526
|
end
|
|
465
527
|
end
|
|
@@ -477,8 +539,8 @@ module Dnsruby
|
|
|
477
539
|
# res.add_src_port(60015..60115)
|
|
478
540
|
#
|
|
479
541
|
def add_src_port(p)
|
|
480
|
-
if (
|
|
481
|
-
a =
|
|
542
|
+
if (Resolver.check_port(p, @src_port))
|
|
543
|
+
a = Resolver.get_ports_from(p)
|
|
482
544
|
a.each do |x|
|
|
483
545
|
if ((@src_port.length > 0) && (x == 0))
|
|
484
546
|
raise ArgumentError.new("src_port of 0 only allowed as only src_port value (currently #{@src_port.length} values")
|
|
@@ -489,6 +551,48 @@ module Dnsruby
|
|
|
489
551
|
update
|
|
490
552
|
end
|
|
491
553
|
|
|
554
|
+
def Resolver.check_port(p, src_port=[])
|
|
555
|
+
if (p.class != Fixnum)
|
|
556
|
+
tmp_src_ports = Array.new(src_port)
|
|
557
|
+
p.each do |x|
|
|
558
|
+
if (!Resolver.check_port(x, tmp_src_ports))
|
|
559
|
+
return false
|
|
560
|
+
end
|
|
561
|
+
tmp_src_ports.push(x)
|
|
562
|
+
end
|
|
563
|
+
return true
|
|
564
|
+
end
|
|
565
|
+
if (Resolver.port_in_range(p))
|
|
566
|
+
if ((p == 0) && (src_port.length > 0))
|
|
567
|
+
return false
|
|
568
|
+
end
|
|
569
|
+
return true
|
|
570
|
+
else
|
|
571
|
+
Dnsruby.log.error("Illegal port (#{p})")
|
|
572
|
+
raise ArgumentError.new("Illegal port #{p}")
|
|
573
|
+
end
|
|
574
|
+
end
|
|
575
|
+
|
|
576
|
+
def Resolver.port_in_range(p)
|
|
577
|
+
if ((p == 0) || ((IANA_PORTS.index(p)) == nil &&
|
|
578
|
+
(p > 1024) && (p < 65535)))
|
|
579
|
+
return true
|
|
580
|
+
end
|
|
581
|
+
return false
|
|
582
|
+
end
|
|
583
|
+
|
|
584
|
+
def Resolver.get_ports_from(p)
|
|
585
|
+
a = []
|
|
586
|
+
if (p.class == Fixnum)
|
|
587
|
+
a = [p]
|
|
588
|
+
else
|
|
589
|
+
p.each do |x|
|
|
590
|
+
a.push(x)
|
|
591
|
+
end
|
|
592
|
+
end
|
|
593
|
+
return a
|
|
594
|
+
end
|
|
595
|
+
|
|
492
596
|
def use_tcp=(on)
|
|
493
597
|
@use_tcp = on
|
|
494
598
|
update
|
|
@@ -504,6 +608,29 @@ module Dnsruby
|
|
|
504
608
|
@tsig=t
|
|
505
609
|
update
|
|
506
610
|
end
|
|
611
|
+
|
|
612
|
+
def Resolver.get_tsig(args)
|
|
613
|
+
tsig = nil
|
|
614
|
+
if (args.length == 1)
|
|
615
|
+
if (args[0])
|
|
616
|
+
if (args[0].instance_of?RR::TSIG)
|
|
617
|
+
tsig = args[0]
|
|
618
|
+
elsif (args[0].instance_of?Array)
|
|
619
|
+
tsig = RR.new_from_hash({:type => Types.TSIG, :klass => Classes.ANY, :name => args[0][0], :key => args[0][1]})
|
|
620
|
+
end
|
|
621
|
+
else
|
|
622
|
+
# Dnsruby.log.debug{"TSIG signing switched off"}
|
|
623
|
+
return nil
|
|
624
|
+
end
|
|
625
|
+
elsif (args.length ==2)
|
|
626
|
+
tsig = RR.new_from_hash({:type => Types.TSIG, :klass => Classes.ANY, :name => args[0], :key => args[1]})
|
|
627
|
+
else
|
|
628
|
+
raise ArgumentError.new("Wrong number of arguments to tsig=")
|
|
629
|
+
end
|
|
630
|
+
Dnsruby.log.info{"TSIG signing now using #{tsig.name}, key=#{tsig.key}"}
|
|
631
|
+
return tsig
|
|
632
|
+
end
|
|
633
|
+
|
|
507
634
|
|
|
508
635
|
def ignore_truncation=(on)
|
|
509
636
|
@ignore_truncation = on
|
|
@@ -537,6 +664,12 @@ module Dnsruby
|
|
|
537
664
|
|
|
538
665
|
def dnssec=(d)
|
|
539
666
|
@dnssec = d
|
|
667
|
+
if (d)
|
|
668
|
+
# Set the UDP size (RFC 4035 section 4.1)
|
|
669
|
+
if (@udp_size < MinDnssecUdpSize)
|
|
670
|
+
self.udp_size = MinDnssecUdpSize
|
|
671
|
+
end
|
|
672
|
+
end
|
|
540
673
|
update
|
|
541
674
|
end
|
|
542
675
|
|
|
@@ -544,262 +677,46 @@ module Dnsruby
|
|
|
544
677
|
@udp_size = s
|
|
545
678
|
update
|
|
546
679
|
end
|
|
547
|
-
|
|
548
|
-
#
|
|
549
|
-
|
|
550
|
-
#be used instead.
|
|
551
|
-
#
|
|
552
|
-
#If EventMachine is not available on the platform, then a RuntimeError will be raised.
|
|
553
|
-
#
|
|
554
|
-
#Takes a bool to say whether or not to use EventMachine.
|
|
555
|
-
def Resolver.use_eventmachine(on=true)
|
|
556
|
-
if (on && !@@event_machine_available)
|
|
557
|
-
raise RuntimeError.new("EventMachine is not available in this environment!")
|
|
558
|
-
end
|
|
559
|
-
@@use_eventmachine = on
|
|
560
|
-
if (on)
|
|
561
|
-
Dnsruby.log.info{"EventMachine will be used for IO"}
|
|
562
|
-
else
|
|
563
|
-
Dnsruby.log.info{"EventMachine will not be used for IO"}
|
|
564
|
-
end
|
|
565
|
-
end
|
|
566
|
-
#Check whether EventMachine will be used by Dnsruby
|
|
567
|
-
def Resolver.eventmachine?
|
|
568
|
-
return @@use_eventmachine
|
|
569
|
-
end
|
|
570
|
-
#If EventMachine is being used, then this method tells Dnsruby whether or not
|
|
571
|
-
#to start the EventMachine loop. If you want to use Dnsruby client code as
|
|
572
|
-
#is, but using EventMachine for I/O, then Dnsruby must start the EventMachine
|
|
573
|
-
#loop for you. This is the default behaviour.
|
|
574
|
-
#If you want to use EventMachine-style code, where everything is wrapped
|
|
575
|
-
#up in an EventMachine::run{} call, then this method should be called with
|
|
576
|
-
#false as the parameter.
|
|
577
|
-
#
|
|
578
|
-
#Takes a bool argument to say whether or not to start the event loop when required.
|
|
579
|
-
def Resolver.start_eventmachine_loop(on=true)
|
|
580
|
-
@@start_eventmachine_loop=on
|
|
581
|
-
if (on)
|
|
582
|
-
Dnsruby.log.info{"EventMachine loop will be started by Dnsruby"}
|
|
583
|
-
else
|
|
584
|
-
Dnsruby.log.info{"EventMachine loop will not be started by Dnsruby"}
|
|
585
|
-
end
|
|
586
|
-
end
|
|
587
|
-
#Checks whether Dnsruby will start the EventMachine loop when required.
|
|
588
|
-
def Resolver.start_eventmachine_loop?
|
|
589
|
-
return @@start_eventmachine_loop
|
|
680
|
+
|
|
681
|
+
def single_res_mutex # :nodoc: all
|
|
682
|
+
return @single_res_mutex
|
|
590
683
|
end
|
|
684
|
+
|
|
591
685
|
def generate_timeouts(base=0) #:nodoc: all
|
|
592
686
|
#These should be be pegged to the single_resolver they are targetting :
|
|
593
687
|
# e.g. timeouts[timeout1]=nameserver
|
|
594
688
|
timeouts = {}
|
|
595
689
|
retry_delay = @retry_delay
|
|
596
|
-
@
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
servers=[]
|
|
601
|
-
@single_resolvers.each do |r| servers.push(r.server) end
|
|
602
|
-
@single_resolvers.each_index do |i|
|
|
603
|
-
res= @single_resolvers[i]
|
|
604
|
-
offset = (i*@retry_delay.to_f/@single_resolvers.length)
|
|
605
|
-
if (retry_count==0)
|
|
606
|
-
timeouts[base+offset]=[res, retry_count]
|
|
607
|
-
else
|
|
608
|
-
if (timeouts.has_key?(base+retry_delay+offset))
|
|
609
|
-
Dnsruby.log.error{"Duplicate timeout key!"}
|
|
610
|
-
raise RuntimeError.new("Duplicate timeout key!")
|
|
611
|
-
end
|
|
612
|
-
timeouts[base+retry_delay+offset]=[res, retry_count]
|
|
690
|
+
# @single_res_mutex.synchronize {
|
|
691
|
+
@retry_times.times do |retry_count|
|
|
692
|
+
if (retry_count>0)
|
|
693
|
+
retry_delay *= 2
|
|
613
694
|
end
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
# NOTE - EM does not work properly on Windows with version 0.8.1 - do not use!
|
|
623
|
-
class ResolverEM #:nodoc: all
|
|
624
|
-
TIMER_PERIOD = 0.1
|
|
625
|
-
def initialize(parent)
|
|
626
|
-
@parent=parent
|
|
627
|
-
end
|
|
628
|
-
def reset_attributes #:nodoc: all
|
|
629
|
-
end
|
|
630
|
-
class PersistentData
|
|
631
|
-
attr_accessor :outstanding, :deferrable, :to_send, :timeouts, :timer_procs, :timer_keys_sorted, :finish
|
|
632
|
-
end
|
|
633
|
-
def send_async(*args) #msg, client_queue=nil, client_query_id=nil)
|
|
634
|
-
msg=args[0]
|
|
635
|
-
client_queue=nil
|
|
636
|
-
client_query_id=nil
|
|
637
|
-
if (args.length>1)
|
|
638
|
-
client_queue=args[1]
|
|
639
|
-
if (args.length > 2)
|
|
640
|
-
client_query_id = args[2]
|
|
641
|
-
end
|
|
642
|
-
end
|
|
643
|
-
# We want to send the query to the first resolver.
|
|
644
|
-
# We then want to set up all the timers for all of the events which might happen
|
|
645
|
-
# (first round timers, retry timers, etc.)
|
|
646
|
-
# The callbacks for these should be able to cancel any of the rest (including any for broken resolvers)
|
|
647
|
-
# We can then forget about the query, as all the callbacks will be lodged with EventMachine.
|
|
648
|
-
|
|
649
|
-
EventMachineInterface::start_em_for_resolver(self)
|
|
650
|
-
persistent_data = PersistentData.new
|
|
651
|
-
persistent_data.deferrable = EM::DefaultDeferrable.new
|
|
652
|
-
persistent_data.outstanding = []
|
|
653
|
-
persistent_data.to_send = 0
|
|
654
|
-
persistent_data.timeouts=@parent.generate_timeouts(Time.now)
|
|
655
|
-
persistent_data.timer_procs = {}
|
|
656
|
-
persistent_data.finish = false
|
|
657
|
-
persistent_data.timeouts.keys.sort.each do |timeout|
|
|
658
|
-
value = persistent_data.timeouts[timeout]
|
|
659
|
-
# timeout = timeout.round
|
|
660
|
-
single_resolver, retry_count = value
|
|
661
|
-
persistent_data.to_send+=1
|
|
662
|
-
df = nil
|
|
663
|
-
if (timeout == 0)
|
|
664
|
-
# Send immediately
|
|
665
|
-
Dnsruby.log.debug{"Sending first EM query"}
|
|
666
|
-
df = send_new_em_query(single_resolver, msg, client_queue, client_query_id, persistent_data)
|
|
667
|
-
persistent_data.outstanding.push(df)
|
|
668
|
-
else
|
|
669
|
-
# Send later
|
|
670
|
-
persistent_data.timer_procs[timeout]=Proc.new{
|
|
671
|
-
Dnsruby.log.debug{"Sending #{timeout} delayed EM query"}
|
|
672
|
-
df = send_new_em_query(single_resolver, msg, client_queue, client_query_id, persistent_data)
|
|
673
|
-
persistent_data.outstanding.push(df)
|
|
674
|
-
}
|
|
675
|
-
end
|
|
676
|
-
end
|
|
677
|
-
query_timeout = @parent.query_timeout
|
|
678
|
-
if (query_timeout > 0)
|
|
679
|
-
persistent_data.timer_procs[Time.now+query_timeout]=Proc.new{
|
|
680
|
-
cancel_queries(persistent_data)
|
|
681
|
-
return_to_client(persistent_data.deferrable, client_queue, client_query_id, nil, ResolvTimeout.new("Query timed out after query_timeout=#{query_timeout.round} seconds"))
|
|
682
|
-
}
|
|
683
|
-
end
|
|
684
|
-
persistent_data.timer_keys_sorted = persistent_data.timer_procs.keys.sort
|
|
685
|
-
EventMachine::add_timer(0) {process_eventmachine_timers(persistent_data)}
|
|
686
|
-
return persistent_data.deferrable
|
|
687
|
-
end
|
|
688
|
-
|
|
689
|
-
# Close the Resolver. Unfinished queries are terminated with OtherResolvError.
|
|
690
|
-
def close
|
|
691
|
-
# @TODO@ We need a list of open deferrables so that we can complete them
|
|
692
|
-
end
|
|
693
|
-
|
|
694
|
-
def process_eventmachine_timers(persistent_data)
|
|
695
|
-
if (persistent_data.finish)
|
|
696
|
-
return
|
|
697
|
-
end
|
|
698
|
-
now = Time.now
|
|
699
|
-
persistent_data.timer_keys_sorted.each do |timeout|
|
|
700
|
-
if (timeout > now)
|
|
701
|
-
break
|
|
702
|
-
end
|
|
703
|
-
persistent_data.timer_procs[timeout].call
|
|
704
|
-
persistent_data.timer_procs.delete(timeout)
|
|
705
|
-
persistent_data.timer_keys_sorted.delete(timeout)
|
|
706
|
-
end
|
|
707
|
-
EventMachine::add_timer(TIMER_PERIOD) {process_eventmachine_timers(persistent_data)}
|
|
708
|
-
end
|
|
709
|
-
|
|
710
|
-
def send_new_em_query(single_resolver, msg, client_queue, client_query_id, persistent_data)
|
|
711
|
-
# Pick a new QID here
|
|
712
|
-
new_msg = msg.dup();
|
|
713
|
-
new_msg.header = msg.header.dup();
|
|
714
|
-
new_msg.header.id = rand(65535);
|
|
715
|
-
df = single_resolver.send_async(new_msg) # client_queue, client_query_id)
|
|
716
|
-
persistent_data.to_send-=1
|
|
717
|
-
df.callback { |answer|
|
|
718
|
-
Dnsruby.log.debug{"Response returned"}
|
|
719
|
-
persistent_data.outstanding.delete(df)
|
|
720
|
-
cancel_queries(persistent_data)
|
|
721
|
-
return_to_client(persistent_data.deferrable, client_queue, client_query_id, answer, nil)
|
|
722
|
-
}
|
|
723
|
-
df.errback { |response, error|
|
|
724
|
-
Dnsruby.log.debug{"Error #{error} returned"}
|
|
725
|
-
persistent_data.outstanding.delete(df)
|
|
726
|
-
if (response!="cancelling")
|
|
727
|
-
|
|
728
|
-
if (error.kind_of?(ResolvTimeout))
|
|
729
|
-
# - if it was a timeout, then check which number it was, and how many retries are expected on that server
|
|
730
|
-
# - if it was the last retry, on the last server, then return a timeout to the client (and clean up)
|
|
731
|
-
# - otherwise, continue
|
|
732
|
-
# Do we have any more packets to send to this resolver?
|
|
733
|
-
if (persistent_data.outstanding.empty? && persistent_data.to_send==0)
|
|
734
|
-
Dnsruby.log.debug{"Sending timeout to client"}
|
|
735
|
-
return_to_client(persistent_data.deferrable, client_queue, client_query_id, response, error)
|
|
736
|
-
end
|
|
737
|
-
elsif (error.kind_of?NXDomain)
|
|
738
|
-
# - if it was an NXDomain, then return that to the client, and stop all new queries (and clean up)
|
|
739
|
-
Dnsruby.log.debug{"NXDomain - returning to client"}
|
|
740
|
-
cancel_queries(persistent_data)
|
|
741
|
-
return_to_client(persistent_data.deferrable, client_queue, client_query_id, response, error)
|
|
742
|
-
elsif (error.kind_of?FormErr)
|
|
743
|
-
# - if it was a FormErr, then return that to the client, and stop all new queries (and clean up)
|
|
744
|
-
Dnsruby.log.debug{"FormErr - returning to client"}
|
|
745
|
-
cancel_queries(persistent_data)
|
|
746
|
-
return_to_client(persistent_data.deferrable, client_queue, client_query_id, response, error)
|
|
747
|
-
else
|
|
748
|
-
# - if it was any other error, then remove that server from the list for that query
|
|
749
|
-
# If a Too Many Open Files error, then don't remove, but let retry work.
|
|
750
|
-
if (!(error.to_s=~/Errno::EMFILE/))
|
|
751
|
-
remove_server(single_resolver, persistent_data)
|
|
752
|
-
Dnsruby.log.debug{"Removing #{single_resolver.server} from resolver list for this query"}
|
|
695
|
+
# servers=[]
|
|
696
|
+
# @single_resolvers.each do |r| servers.push(r.server) end
|
|
697
|
+
@single_resolvers.each_index do |i|
|
|
698
|
+
res= @single_resolvers[i]
|
|
699
|
+
next if !res # @TODO@ WHY?1
|
|
700
|
+
offset = (i*@retry_delay.to_f/@single_resolvers.length)
|
|
701
|
+
if (retry_count==0)
|
|
702
|
+
timeouts[base+offset]=[res, retry_count]
|
|
753
703
|
else
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
Dnsruby.log.debug{"Sending error to client"}
|
|
760
|
-
return_to_client(persistent_data.deferrable, client_queue, client_query_id, response, error)
|
|
704
|
+
if (timeouts.has_key?(base+retry_delay+offset))
|
|
705
|
+
Dnsruby.log.error{"Duplicate timeout key!"}
|
|
706
|
+
raise RuntimeError.new("Duplicate timeout key!")
|
|
707
|
+
end
|
|
708
|
+
timeouts[base+retry_delay+offset]=[res, retry_count]
|
|
761
709
|
end
|
|
762
710
|
end
|
|
763
711
|
end
|
|
764
|
-
}
|
|
765
|
-
return
|
|
766
|
-
end
|
|
767
|
-
|
|
768
|
-
def remove_server(server, persistent_data)
|
|
769
|
-
# Go through persistent_data.timeouts and check all the values for that resolver
|
|
770
|
-
persistent_data.timeouts.each do |key, value|
|
|
771
|
-
if (value[0] == server)
|
|
772
|
-
# Remove the server from the list
|
|
773
|
-
persistent_data.timer_procs.delete(key)
|
|
774
|
-
persistent_data.timer_keys_sorted.delete(key)
|
|
775
|
-
end
|
|
776
|
-
end
|
|
777
|
-
end
|
|
778
|
-
|
|
779
|
-
def cancel_queries(persistent_data)
|
|
780
|
-
Dnsruby.log.debug{"Cancelling EM queries"}
|
|
781
|
-
persistent_data.outstanding.each do |df|
|
|
782
|
-
df.set_deferred_status :failed, "cancelling", "cancelling"
|
|
783
|
-
end
|
|
784
|
-
# Cancel the next tick
|
|
785
|
-
persistent_data.finish = true
|
|
786
|
-
end
|
|
787
|
-
|
|
788
|
-
def return_to_client(deferrable, client_queue, client_query_id, answer, error)
|
|
789
|
-
if (client_queue)
|
|
790
|
-
client_queue.push([client_query_id, answer, error])
|
|
791
|
-
end
|
|
792
|
-
# We call set_defered_status when done
|
|
793
|
-
if (error != nil)
|
|
794
|
-
deferrable.set_deferred_status :failed, answer, error
|
|
795
|
-
else
|
|
796
|
-
deferrable.set_deferred_status :succeeded, answer
|
|
797
|
-
end
|
|
798
|
-
EventMachineInterface::stop_em_for_resolver(self)
|
|
712
|
+
# }
|
|
713
|
+
return timeouts
|
|
799
714
|
end
|
|
800
715
|
end
|
|
716
|
+
|
|
801
717
|
|
|
802
718
|
# This class implements the I/O using pure Ruby, with no dependencies.
|
|
719
|
+
# Support for EventMachine has been deprecated.
|
|
803
720
|
class ResolverRuby #:nodoc: all
|
|
804
721
|
def initialize(parent)
|
|
805
722
|
reset_attributes
|
|
@@ -807,7 +724,7 @@ module Dnsruby
|
|
|
807
724
|
end
|
|
808
725
|
def reset_attributes #:nodoc: all
|
|
809
726
|
# data structures
|
|
810
|
-
@mutex=Mutex.new
|
|
727
|
+
# @mutex=Mutex.new
|
|
811
728
|
@query_list = {}
|
|
812
729
|
@timeouts = {}
|
|
813
730
|
end
|
|
@@ -837,22 +754,26 @@ module Dnsruby
|
|
|
837
754
|
|
|
838
755
|
if (!client_queue.kind_of?Queue)
|
|
839
756
|
Dnsruby.log.error{"Wrong type for client_queue in Resolver#send_async"}
|
|
757
|
+
# @TODO@ Handle different queue tuples - push this to generic send_error method
|
|
840
758
|
client_queue.push([client_query_id, ArgumentError.new("Wrong type of client_queue passed to Dnsruby::Resolver#send_async - should have been Queue, was #{client_queue.class}")])
|
|
841
759
|
return
|
|
842
760
|
end
|
|
843
761
|
|
|
844
762
|
if (!msg.kind_of?Message)
|
|
845
763
|
Dnsruby.log.error{"Wrong type for msg in Resolver#send_async"}
|
|
764
|
+
# @TODO@ Handle different queue tuples - push this to generic send_error method
|
|
846
765
|
client_queue.push([client_query_id, ArgumentError.new("Wrong type of msg passed to Dnsruby::Resolver#send_async - should have been Message, was #{msg.class}")])
|
|
847
766
|
return
|
|
848
767
|
end
|
|
849
768
|
|
|
850
769
|
tick_needed=false
|
|
851
770
|
# add to our data structures
|
|
852
|
-
@mutex.synchronize{
|
|
771
|
+
# @mutex.synchronize{
|
|
772
|
+
@parent.single_res_mutex.synchronize {
|
|
853
773
|
tick_needed = true if @query_list.empty?
|
|
854
774
|
if (@query_list.has_key?client_query_id)
|
|
855
775
|
Dnsruby.log.error{"Duplicate query id requested (#{client_query_id}"}
|
|
776
|
+
# @TODO@ Handle different queue tuples - push this to generic send_error method
|
|
856
777
|
client_queue.push([client_query_id, ArgumentError.new("Client query ID already in use")])
|
|
857
778
|
return
|
|
858
779
|
end
|
|
@@ -887,7 +808,8 @@ module Dnsruby
|
|
|
887
808
|
|
|
888
809
|
# Close the Resolver. Unfinished queries are terminated with OtherResolvError.
|
|
889
810
|
def close
|
|
890
|
-
@mutex.synchronize {
|
|
811
|
+
# @mutex.synchronize {
|
|
812
|
+
@parent.single_res_mutex.synchronize {
|
|
891
813
|
@query_list.each do |client_query_id, values|
|
|
892
814
|
msg, client_queue, q, outstanding = values
|
|
893
815
|
send_result_and_close(client_queue, client_query_id, q, nil, OtherResolvError.new("Resolver closing!"))
|
|
@@ -899,34 +821,56 @@ module Dnsruby
|
|
|
899
821
|
#
|
|
900
822
|
# Send the result back to the client, and close the socket for that query by removing
|
|
901
823
|
# the query from the select thread.
|
|
902
|
-
def
|
|
824
|
+
def send_result_and_stop_querying(client_queue, client_query_id, select_queue, msg, error) #:nodoc: all
|
|
825
|
+
stop_querying(client_query_id)
|
|
826
|
+
send_result(client_queue, client_query_id, select_queue, msg, error)
|
|
827
|
+
end
|
|
828
|
+
|
|
829
|
+
# MUST BE CALLED IN A SYNCHRONIZED BLOCK!
|
|
830
|
+
#
|
|
831
|
+
# Stops send any more packets for a client-level query
|
|
832
|
+
def stop_querying(client_query_id) #:nodoc: all
|
|
833
|
+
@timeouts.delete(client_query_id)
|
|
834
|
+
end
|
|
835
|
+
|
|
836
|
+
# MUST BE CALLED IN A SYNCHRONIZED BLOCK!
|
|
837
|
+
#
|
|
838
|
+
# Sends the result to the client's queue, and removes the queue observer from the select thread
|
|
839
|
+
def send_result(client_queue, client_query_id, select_queue, msg, error) #:nodoc: all
|
|
840
|
+
stop_querying(client_query_id) # @TODO@ !
|
|
903
841
|
# We might still get some callbacks, which we should ignore
|
|
904
842
|
st = SelectThread.instance
|
|
905
843
|
st.remove_observer(select_queue, self)
|
|
906
844
|
# @mutex.synchronize{
|
|
907
845
|
# Remove the query from all of the data structures
|
|
908
|
-
@timeouts.delete(client_query_id)
|
|
909
846
|
@query_list.delete(client_query_id)
|
|
910
847
|
# }
|
|
911
848
|
# Return the response to the client
|
|
912
|
-
|
|
849
|
+
if (error != nil)
|
|
850
|
+
# client_queue.push([client_query_id, Resolver::EventType::ERROR, msg, error])
|
|
851
|
+
client_queue.push([client_query_id, msg, error])
|
|
852
|
+
else
|
|
853
|
+
# client_queue.push([client_query_id, Resolver::EventType::VALIDATED, msg, error])
|
|
854
|
+
client_queue.push([client_query_id, msg, error])
|
|
855
|
+
end
|
|
913
856
|
end
|
|
914
857
|
|
|
915
|
-
# This method is called
|
|
916
|
-
# It should arguably be called from another worker thread...
|
|
858
|
+
# This method is called twice a second from the select loop, in the select thread.
|
|
859
|
+
# It should arguably be called from another worker thread... (which also handles the queue)
|
|
917
860
|
# Each tick, we check if any timeouts have occurred. If so, we take the appropriate action :
|
|
918
861
|
# Return a timeout to the client, or send a new query
|
|
919
862
|
def tick #:nodoc: all
|
|
920
863
|
# Handle the tick
|
|
921
864
|
# Do we have any retries due to be sent yet?
|
|
922
|
-
@mutex.synchronize{
|
|
865
|
+
# @mutex.synchronize{
|
|
866
|
+
@parent.single_res_mutex.synchronize {
|
|
923
867
|
time_now = Time.now
|
|
924
868
|
@timeouts.keys.each do |client_query_id|
|
|
925
869
|
msg, client_queue, select_queue, outstanding = @query_list[client_query_id]
|
|
926
870
|
query_timeout, timeouts = @timeouts[client_query_id]
|
|
927
871
|
if (query_timeout < Time.now)
|
|
928
872
|
#Time the query out
|
|
929
|
-
|
|
873
|
+
send_result_and_stop_querying(client_queue, client_query_id, select_queue, nil, ResolvTimeout.new("Query timed out"))
|
|
930
874
|
next
|
|
931
875
|
end
|
|
932
876
|
timeouts_done = []
|
|
@@ -941,11 +885,10 @@ module Dnsruby
|
|
|
941
885
|
timeouts_done.push(timeout)
|
|
942
886
|
timeouts.delete(timeout)
|
|
943
887
|
|
|
944
|
-
# Pick a new QID here
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
res.send_async(new_msg, select_queue, id)
|
|
888
|
+
# Pick a new QID here @TODO@ !!!
|
|
889
|
+
# msg.header.id = rand(65535);
|
|
890
|
+
# print "New query : #{new_msg}\n"
|
|
891
|
+
res.send_async(msg, select_queue, id)
|
|
949
892
|
else
|
|
950
893
|
break
|
|
951
894
|
end
|
|
@@ -962,8 +905,8 @@ module Dnsruby
|
|
|
962
905
|
# It's probably a good idea to create a new "worker thread" to take items from the select thread queue and
|
|
963
906
|
# call this method in the worker thread.
|
|
964
907
|
#
|
|
965
|
-
# Time to process a new queue event.
|
|
966
908
|
def handle_queue_event(queue, id) #:nodoc: all
|
|
909
|
+
# Time to process a new queue event.
|
|
967
910
|
# If we get a callback for an ID we don't know about, don't worry -
|
|
968
911
|
# just ignore it. It may be for a query we've already completed.
|
|
969
912
|
#
|
|
@@ -972,98 +915,216 @@ module Dnsruby
|
|
|
972
915
|
# @TODO@ Tick could poll the queue and then call this method if needed - no need for observer interface.
|
|
973
916
|
# @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!
|
|
974
917
|
#
|
|
918
|
+
# So - two types of response :
|
|
919
|
+
# 1) we've got a coherent response (or error) - stop sending more packets for that query!
|
|
920
|
+
# 2) we've validated the response - it's ready to be sent to the client
|
|
921
|
+
#
|
|
922
|
+
# so need two more methods :
|
|
923
|
+
# handleValidationResponse : basically calls send_result_and_close and
|
|
924
|
+
# handleValidationError : does the same as handleValidationResponse, but for errors
|
|
925
|
+
# can leave handleError alone
|
|
926
|
+
# but need to change handleResponse to stop sending, rather than send_result_and_close.
|
|
927
|
+
#
|
|
928
|
+
# @TODO@ Also, we could really do with a MaxValidationTimeout - if validation not OK within
|
|
929
|
+
# this time, then raise Timeout (and stop validation)?
|
|
930
|
+
#
|
|
931
|
+
# @TODO@ Also, should there be some facility to stop validator following same chain
|
|
932
|
+
# concurrently?
|
|
933
|
+
#
|
|
934
|
+
# @TODO@ Also, should have option to speak only to configured resolvers (not follow authoritative chain)
|
|
935
|
+
#
|
|
975
936
|
if (queue.empty?)
|
|
976
937
|
Dnsruby.log.fatal{"Queue empty in handle_queue_event!"}
|
|
977
938
|
raise RuntimeError.new("Severe internal error - Queue empty in handle_queue_event")
|
|
978
939
|
end
|
|
979
|
-
event_id, response, error = queue.pop
|
|
940
|
+
event_id, event_type, response, error = queue.pop
|
|
980
941
|
# We should remove this packet from the list of outstanding packets for this query
|
|
981
942
|
resolver, msg, client_query_id, retry_count = id
|
|
982
943
|
if (id != event_id)
|
|
983
944
|
Dnsruby.log.error{"Serious internal error!! #{id} expected, #{event_id} received"}
|
|
984
945
|
raise RuntimeError.new("Serious internal error!! #{id} expected, #{event_id} received")
|
|
985
946
|
end
|
|
986
|
-
@mutex.synchronize{
|
|
947
|
+
# @mutex.synchronize{
|
|
948
|
+
@parent.single_res_mutex.synchronize {
|
|
987
949
|
if (@query_list[client_query_id]==nil)
|
|
950
|
+
# print "Dead query response - ignoring\n"
|
|
988
951
|
Dnsruby.log.debug{"Ignoring response for dead query"}
|
|
989
952
|
return
|
|
990
953
|
end
|
|
991
954
|
msg, client_queue, select_queue, outstanding = @query_list[client_query_id]
|
|
992
|
-
if (
|
|
993
|
-
|
|
994
|
-
|
|
955
|
+
if (event_type == Resolver::EventType::RECEIVED ||
|
|
956
|
+
event_type == Resolver::EventType::ERROR)
|
|
957
|
+
if (!outstanding.include?id)
|
|
958
|
+
Dnsruby.log.error{"Query id not on outstanding list! #{outstanding.length} items. #{id} not on #{outstanding}"}
|
|
959
|
+
raise RuntimeError.new("Query id not on outstanding!")
|
|
960
|
+
end
|
|
961
|
+
outstanding.delete(id)
|
|
962
|
+
end
|
|
963
|
+
# }
|
|
964
|
+
if (event_type == Resolver::EventType::RECEIVED)
|
|
965
|
+
# if (event.kind_of?(Exception))
|
|
966
|
+
if (error != nil)
|
|
967
|
+
handle_error_response(queue, event_id, error, response)
|
|
968
|
+
else # if (event.kind_of?(Message))
|
|
969
|
+
handle_response(queue, event_id, response)
|
|
970
|
+
# else
|
|
971
|
+
# Dnsruby.log.error("Random object #{event.class} returned through queue to Resolver")
|
|
972
|
+
end
|
|
973
|
+
elsif (event_type == Resolver::EventType::VALIDATED)
|
|
974
|
+
if (error != nil)
|
|
975
|
+
handle_validation_error(queue, event_id, error, response)
|
|
976
|
+
else
|
|
977
|
+
handle_validation_response(queue, event_id, response)
|
|
978
|
+
end
|
|
979
|
+
elsif (event_type == Resolver::EventType::ERROR)
|
|
980
|
+
handle_error_response(queue, event_id, error, response)
|
|
981
|
+
else
|
|
982
|
+
# print "ERROR - UNKNOWN EVENT TYPE IN RESOLVER : #{event_type}\n"
|
|
983
|
+
TheLog.error("ERROR - UNKNOWN EVENT TYPE IN RESOLVER : #{event_type}")
|
|
995
984
|
end
|
|
996
|
-
outstanding.delete(id)
|
|
997
985
|
}
|
|
998
|
-
# if (event.kind_of?(Exception))
|
|
999
|
-
if (error != nil)
|
|
1000
|
-
handle_error_response(queue, event_id, error, response)
|
|
1001
|
-
else # if (event.kind_of?(Message))
|
|
1002
|
-
handle_response(queue, event_id, response)
|
|
1003
|
-
# else
|
|
1004
|
-
# Dnsruby.log.error("Random object #{event.class} returned through queue to Resolver")
|
|
1005
|
-
end
|
|
1006
986
|
end
|
|
1007
987
|
|
|
1008
988
|
def handle_error_response(select_queue, query_id, error, response) #:nodoc: all
|
|
1009
989
|
#Handle an error
|
|
1010
|
-
@mutex.synchronize{
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
990
|
+
# @mutex.synchronize{
|
|
991
|
+
Dnsruby.log.debug{"handling error #{error.class}, #{error}"}
|
|
992
|
+
# Check what sort of error it was :
|
|
993
|
+
resolver, msg, client_query_id, retry_count = query_id
|
|
994
|
+
msg, client_queue, select_queue, outstanding = @query_list[client_query_id]
|
|
995
|
+
if (error.kind_of?(ResolvTimeout))
|
|
996
|
+
# - if it was a timeout, then check which number it was, and how many retries are expected on that server
|
|
997
|
+
# - if it was the last retry, on the last server, then return a timeout to the client (and clean up)
|
|
998
|
+
# - otherwise, continue
|
|
999
|
+
# Do we have any more packets to send to this resolver?
|
|
1000
|
+
|
|
1001
|
+
decrement_resolver_priority(resolver)
|
|
1002
|
+
timeouts = @timeouts[client_query_id]
|
|
1003
|
+
if (outstanding.empty? && timeouts && timeouts[1].values.empty?)
|
|
1004
|
+
Dnsruby.log.debug{"Sending timeout to client"}
|
|
1005
|
+
send_result_and_stop_querying(client_queue, client_query_id, select_queue, response, error)
|
|
1006
|
+
end
|
|
1007
|
+
elsif (error.kind_of?NXDomain)
|
|
1008
|
+
# - if it was an NXDomain, then return that to the client, and stop all new queries (and clean up)
|
|
1009
|
+
# send_result_and_stop_querying(client_queue, client_query_id, select_queue, response, error)
|
|
1010
|
+
increment_resolver_priority(resolver) if (!response.cached)
|
|
1011
|
+
stop_querying(client_query_id)
|
|
1012
|
+
# @TODO@ Does the client want notified at this point?
|
|
1013
|
+
else
|
|
1014
|
+
# - if it was any other error, then remove that server from the list for that query
|
|
1015
|
+
# If a Too Many Open Files error, then don't remove, but let retry work.
|
|
1016
|
+
timeouts = @timeouts[client_query_id]
|
|
1017
|
+
if (!(error.to_s=~/Errno::EMFILE/))
|
|
1018
|
+
Dnsruby.log.debug{"Removing #{resolver.server} from resolver list for this query"}
|
|
1019
|
+
timeouts[1].each do |key, value|
|
|
1020
|
+
res = value[0]
|
|
1021
|
+
if (res == resolver)
|
|
1022
|
+
timeouts[1].delete(key)
|
|
1039
1023
|
end
|
|
1040
|
-
else
|
|
1041
|
-
Dnsruby.log.debug{"NOT Removing #{resolver.server} due to Errno::EMFILE"}
|
|
1042
|
-
end
|
|
1043
|
-
# - if it was the last server, then return an error to the client (and clean up)
|
|
1044
|
-
if (outstanding.empty? && timeouts[1].values.empty?)
|
|
1045
|
-
# if (outstanding.empty?)
|
|
1046
|
-
Dnsruby.log.debug{"Sending error to client"}
|
|
1047
|
-
send_result_and_close(client_queue, client_query_id, select_queue, response, error)
|
|
1048
1024
|
end
|
|
1025
|
+
# Also stick it to the back of the list for future queries
|
|
1026
|
+
demote_resolver(resolver)
|
|
1027
|
+
else
|
|
1028
|
+
Dnsruby.log.debug{"NOT Removing #{resolver.server} due to Errno::EMFILE"}
|
|
1049
1029
|
end
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1030
|
+
# - if it was the last server, then return an error to the client (and clean up)
|
|
1031
|
+
if (outstanding.empty? && timeouts && timeouts[1].values.empty?)
|
|
1032
|
+
# if (outstanding.empty?)
|
|
1033
|
+
Dnsruby.log.debug{"Sending error to client"}
|
|
1034
|
+
send_result_and_stop_querying(client_queue, client_query_id, select_queue, response, error)
|
|
1035
|
+
end
|
|
1036
|
+
end
|
|
1037
|
+
#@TODO@ If we're still sending packets for this query, but none are outstanding, then
|
|
1038
|
+
#jumpstart the next query?
|
|
1039
|
+
# }
|
|
1040
|
+
end
|
|
1041
|
+
|
|
1042
|
+
# TO BE CALLED IN A SYNCHRONIZED BLOCK
|
|
1043
|
+
def increment_resolver_priority(res)
|
|
1044
|
+
TheLog.debug("Incrementing resolver priority for #{res.server}\n")
|
|
1045
|
+
# @parent.single_res_mutex.synchronize {
|
|
1046
|
+
index = @parent.single_resolvers.index(res)
|
|
1047
|
+
if (index > 0)
|
|
1048
|
+
@parent.single_resolvers.delete(res)
|
|
1049
|
+
@parent.single_resolvers.insert(index-1,res)
|
|
1050
|
+
end
|
|
1051
|
+
# }
|
|
1052
|
+
end
|
|
1053
|
+
|
|
1054
|
+
# TO BE CALLED IN A SYNCHRONIZED BLOCK
|
|
1055
|
+
def decrement_resolver_priority(res)
|
|
1056
|
+
TheLog.debug("Decrementing resolver priority for #{res.server}\n")
|
|
1057
|
+
# @parent.single_res_mutex.synchronize {
|
|
1058
|
+
index = @parent.single_resolvers.index(res)
|
|
1059
|
+
if (index < @parent.single_resolvers.length)
|
|
1060
|
+
@parent.single_resolvers.delete(res)
|
|
1061
|
+
@parent.single_resolvers.insert(index+1,res)
|
|
1062
|
+
end
|
|
1063
|
+
# }
|
|
1064
|
+
end
|
|
1065
|
+
|
|
1066
|
+
# TO BE CALLED IN A SYNCHRONIZED BLOCK
|
|
1067
|
+
def demote_resolver(res)
|
|
1068
|
+
TheLog.debug("Demoting resolver priority for #{res.server} to bottom\n")
|
|
1069
|
+
# @parent.single_res_mutex.synchronize {
|
|
1070
|
+
@parent.single_resolvers.delete(res)
|
|
1071
|
+
@parent.single_resolvers.push(res)
|
|
1072
|
+
# }
|
|
1053
1073
|
end
|
|
1054
1074
|
|
|
1055
1075
|
def handle_response(select_queue, query_id, response) #:nodoc: all
|
|
1056
1076
|
# Handle a good response
|
|
1077
|
+
# Should also stick resolver more to the front of the list for future queries
|
|
1057
1078
|
Dnsruby.log.debug{"Handling good response"}
|
|
1058
1079
|
resolver, msg, client_query_id, retry_count = query_id
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1080
|
+
increment_resolver_priority(resolver) if (!response.cached)
|
|
1081
|
+
# @mutex.synchronize{
|
|
1082
|
+
query, client_queue, s_queue, outstanding = @query_list[client_query_id]
|
|
1083
|
+
if (s_queue != select_queue)
|
|
1084
|
+
Dnsruby.log.error{"Serious internal error : expected select queue #{s_queue}, got #{select_queue}"}
|
|
1085
|
+
raise RuntimeError.new("Serious internal error : expected select queue #{s_queue}, got #{select_queue}")
|
|
1086
|
+
end
|
|
1087
|
+
# send_result_and_close(client_queue, client_query_id, select_queue, response, nil)
|
|
1088
|
+
stop_querying(client_query_id)
|
|
1089
|
+
# @TODO@ Does the client want notified at this point?
|
|
1090
|
+
# client_queue.push([client_query_id, Resolver::EventType::RECEIVED, msg, nil])
|
|
1091
|
+
# }
|
|
1092
|
+
end
|
|
1093
|
+
|
|
1094
|
+
def handle_validation_response(select_queue, query_id, response) #:nodoc: all
|
|
1095
|
+
resolver, msg, client_query_id, retry_count = query_id
|
|
1096
|
+
# @mutex.synchronize {
|
|
1097
|
+
query, client_queue, s_queue, outstanding = @query_list[client_query_id]
|
|
1098
|
+
if (s_queue != select_queue)
|
|
1099
|
+
Dnsruby.log.error{"Serious internal error : expected select queue #{s_queue}, got #{select_queue}"}
|
|
1100
|
+
raise RuntimeError.new("Serious internal error : expected select queue #{s_queue}, got #{select_queue}")
|
|
1101
|
+
end
|
|
1102
|
+
if (response.rcode == RCode.NXDOMAIN)
|
|
1103
|
+
send_result(client_queue, client_query_id, select_queue, response, NXDomain.new)
|
|
1104
|
+
else
|
|
1105
|
+
# @TODO@ Was there an error validating? Should we raise an exception for certain security levels?
|
|
1106
|
+
# This should be configurable by the client.
|
|
1107
|
+
# send_result_and_close(client_queue, client_query_id, select_queue, response, nil)
|
|
1108
|
+
send_result(client_queue, client_query_id, select_queue, response, nil)
|
|
1109
|
+
# }
|
|
1110
|
+
end
|
|
1067
1111
|
end
|
|
1068
|
-
|
|
1069
|
-
|
|
1112
|
+
|
|
1113
|
+
def handle_validation_error(select_queue, query_id, error, response)
|
|
1114
|
+
resolver, msg, client_query_id, retry_count = query_id
|
|
1115
|
+
query, client_queue, s_queue, outstanding = @query_list[client_query_id]
|
|
1116
|
+
if (s_queue != select_queue)
|
|
1117
|
+
Dnsruby.log.error{"Serious internal error : expected select queue #{s_queue}, got #{select_queue}"}
|
|
1118
|
+
raise RuntimeError.new("Serious internal error : expected select queue #{s_queue}, got #{select_queue}")
|
|
1119
|
+
end
|
|
1120
|
+
# For some errors, we immediately send result. For others, should we retry?
|
|
1121
|
+
# Either :
|
|
1122
|
+
# handle_error_response(queue, event_id, error, response)
|
|
1123
|
+
# Or:
|
|
1124
|
+
send_result(client_queue, client_query_id, select_queue, response, error)
|
|
1125
|
+
#
|
|
1126
|
+
#
|
|
1127
|
+
end
|
|
1128
|
+
end
|
|
1129
|
+
end
|
|
1130
|
+
require "Dnsruby/SingleResolver"
|