pax_global_header00006660000000000000000000000064127036463240014521gustar00rootroot0000000000000052 comment=3f88decbb1c99b0447de71ded8135d52756b25cb ruby-rubydns-1.0.3/000077500000000000000000000000001270364632400141675ustar00rootroot00000000000000ruby-rubydns-1.0.3/.gitignore000066400000000000000000000004131270364632400161550ustar00rootroot00000000000000*.gem *.rbc /.config /coverage/ /InstalledFiles /pkg/ /spec/reports/ /test/tmp/ /test/version_tmp/ tmp /.yardoc/ /_yardoc/ /doc/ /rdoc/ /.bundle/ /lib/bundler/man/ Gemfile.lock .ruby-version .ruby-gemset /examples/log /examples/run /spec/rubydns/server/bind9/log/ruby-rubydns-1.0.3/.simplecov000066400000000000000000000003441270364632400161720ustar00rootroot00000000000000 SimpleCov.start do add_filter "/spec/" end # Work correctly across forks: pid = Process.pid SimpleCov.at_exit do SimpleCov.result.format! if Process.pid == pid end if ENV['TRAVIS'] require 'coveralls' Coveralls.wear! end ruby-rubydns-1.0.3/.travis.yml000066400000000000000000000003171270364632400163010ustar00rootroot00000000000000language: ruby before_install: - sudo apt-get update -qq - sudo apt-get install -y bind9 rvm: - 2.2 - 2.1 - 2.0.0 - 1.9.3 - rbx-2 matrix: allow_failures: - rvm: rbx-2 env: COVERAGE=true ruby-rubydns-1.0.3/.yardopts000066400000000000000000000000221270364632400160270ustar00rootroot00000000000000--markup=markdown ruby-rubydns-1.0.3/Gemfile000066400000000000000000000002411270364632400154570ustar00rootroot00000000000000source 'https://rubygems.org' # Specify your gem's dependencies in trenni.gemspec gemspec group :test do gem 'simplecov' gem 'coveralls', require: false end ruby-rubydns-1.0.3/README.md000066400000000000000000000276011270364632400154540ustar00rootroot00000000000000# RubyDNS [![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/ioquatix/rubydns?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) RubyDNS is a high-performance DNS server which can be easily integrated into other projects or used as a stand-alone daemon. By default it uses rule-based pattern matching. Results can be hard-coded, computed, fetched from a remote DNS server or fetched from a local cache, depending on requirements. In addition, RubyDNS includes a high-performance asynchronous DNS resolver built on top of [Celluloid][1]. This module can be used by itself in client applications without using the full RubyDNS server stack. For examples and documentation please see the main [project page][2]. [1]: https://celluloid.io [2]: http://www.codeotaku.com/projects/rubydns/ [![Build Status](https://travis-ci.org/ioquatix/rubydns.svg?branch=master)](https://travis-ci.org/ioquatix/rubydns) [![Code Climate](https://codeclimate.com/github/ioquatix/rubydns.png)](https://codeclimate.com/github/ioquatix/rubydns) [![Coverage Status](https://coveralls.io/repos/ioquatix/rubydns/badge.svg?branch=master)](https://coveralls.io/r/ioquatix/rubydns?branch=master) ## Installation Add this line to your application's Gemfile: gem 'rubydns' And then execute: $ bundle Or install it yourself as: $ gem install rubydns ## Usage This is copied from `test/examples/test-dns-2.rb`. It has been simplified slightly. #!/usr/bin/env ruby require 'rubydns' INTERFACES = [ [:udp, "0.0.0.0", 5300], [:tcp, "0.0.0.0", 5300] ] Name = Resolv::DNS::Name IN = Resolv::DNS::Resource::IN # Use upstream DNS for name resolution. UPSTREAM = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]]) # Start the RubyDNS server RubyDNS::run_server(:listen => INTERFACES) do match(/test\.mydomain\.org/, IN::A) do |transaction| transaction.respond!("10.0.0.80") end # Default DNS handler otherwise do |transaction| transaction.passthrough!(UPSTREAM) end end Start the server using `./test.rb`. You can then test it using dig: $ dig @localhost -p 5300 test.mydomain.org $ dig @localhost -p 5300 google.com ### File Handle Limitations On some platforms (e.g. Mac OS X) the number of file descriptors is relatively low by default and should be increased by calling `ulimit -n 10000` before running tests or even before starting a server which expects a large number of concurrent incoming connections. ### Custom servers It is possible to create and integrate your own custom servers. class MyServer < RubyDNS::Server def process(name, resource_class, transaction) transaction.fail!(:NXDomain) end end # Use the RubyDNS infrastructure for running the daemon: # If asynchronous is true, it will return immediately, otherwise, it will block the current thread until Ctrl-C is pressed (SIGINT). RubyDNS::run_server(asynchronous: false, server_class: MyServer) # Directly instantiate the celluloid supervisor: supervisor = MyServer.supervise supervisor.actors.first.run This is the best way to integrate with other projects. ## Performance We welcome additional benchmarks and feedback regarding RubyDNS performance. To check the current performance results, consult the [travis build job output](https://travis-ci.org/ioquatix/rubydns). ### Server The performance is on the same magnitude as `bind9`. Some basic benchmarks resolving 1000 names concurrently, repeated 5 times, using `RubyDNS::Resolver` gives the following: user system total real RubyDNS::Server 4.280000 0.450000 4.730000 ( 4.854862) Bind9 4.970000 0.520000 5.490000 ( 5.541213) These benchmarks are included in the unit tests. To test bind9 performance, it must be installed and `which named` must return the executable. ### Resolver The `RubyDNS::Resolver` is highly concurrent and can resolve individual names as fast as the built in `Resolv::DNS` resolver. Because the resolver is asynchronous, when dealing with multiple names, it can work more efficiently: user system total real RubyDNS::Resolver 0.020000 0.010000 0.030000 ( 0.030507) Resolv::DNS 0.070000 0.010000 0.080000 ( 1.465975) These benchmarks are included in the unit tests. ### DNSSEC support DNSSEC is currently not supported and is [unlikely to be supported in the future](http://sockpuppet.org/blog/2015/01/15/against-dnssec/). ## Compatibility ### Migrating from RubyDNS 0.8.x to 0.9.x RubyDNS 0.9.0 is based on a branch which replaced EventMachine with Celluloid. This reduces the complexity in writing concurrent systems hugely, but it is also a largely untested code path. RubyDNS 0.8.x using EventMachine has been tested over 4 years now by many projects. The reason for the change is simply that EventMachine is now a dead project and no longer being maintained/supported. The ramifications of this are: no IPv6 support, crashes/segfaults in certain workloads with no workable solution going forward, and lack of integration with external libraries. The difference for authors integrating RubyDNS in a daemon should be minimal. For users integrating RubyDNS into an existing system, you need to be aware of the contracts imposed by Celluloid, namely, whether it affects other parts of your system. Some areas of Celluloid are well developed, others are still needing attention (e.g. how it handles forking child processes). We expect the 0.8 branch should remain stable for a long time, but 0.9 branch will eventually become the 1.0 release. The benefits of using Celluloid include: fault tolerance, high performance, scalability across multiple hardware threads (when using Rubinius or JRuby), simpler integration with 3rd party data (e.g. `defer` has now been removed since it isn't necessary with celluloid). ### Migrating from RubyDNS 0.7.x to 0.8.x The primary change is the removal of the dependency on `RExec` which was used for daemons and the addition of the testing dependency `process-daemon`. In order to create and run your own daemon, you may use `process-daemon` or another tool of your choice. The transaction options are now conveniently available: transaction.options[key] == transaction[key] The remote peer address used to be available directly via `transaction[:peer]` but profiling revealed that the `EventMachine::Connection#get_peername` was moderately expensive. Therefore, the incoming connection is now available in `transaction[:connection]` and more specifically `transaction[:peer]` is no longer available and replaced by `transaction[:connection].peername` which gives `[ip_address, port]`. ### Migrating from RubyDNS 0.6.x to 0.7.x The asynchronous deferred processing became the default and only method for processing requests in `0.7.0`. This simplifies the API but there were a few changes, notably the removal of `defer!` and the addition of `defer`. The reason for this was due to issues relating to deferred processing and the flow of control, which were confusing and introduced bugs in specific situations. Now, you can assume flow control through the entire block even with non-blocking functions. RubyDNS::run_server(:listen => SERVER_PORTS) do match(/\.*.com/, IN::A) do |transaction| # Won't block and won't continue until fiber.resume is called. defer do |fiber| # No domain exists, after 5 seconds: EventMachine::Timer.new(5) do transaction.fail!(:NXDomain) fiber.resume end end end otherwise do transaction.fail!(:NXDomain) end end You can see a complete example in `test/test_slow_server.rb`. #### Server structure changes When integrating RubyDNS into another project, the rule based DSL is often a hurdle rather than a feature. Thus, the rule-based DSL component of `RubyDNS::Server` class has been separated into a derived `RubyDNS::RuleBasedServer` class. `RubyDNS::Server` can be derived and the `RubyDNS::Server#process` method can be overridden to provide a single entry point for DNS processing. In addition, `RubyDNS::Server#run` can now start the server, provided you are within an `EventMachine#run` context. The existing entry point, `RubyDNS::run_server` provides the same rule-based DSL as previous versions. #### Method name changes Some method names have changed to improve consistency. - `failure!` became `fail!` - `append` became `add` - `append_query!` became `append!` ### Migrating from RubyDNS 0.5.x to 0.6.x The order of arguments to pattern based rules has changed. For regular expression based rules, the arguments are now ordered `|transaction, match_data|`. The main reason for this change was that in many cases match_data is not important and can thus be ignored, e.g. `|transaction|`. Going forward, Ruby 1.8.x is no longer supported. ### Migrating from RubyDNS 0.4.x to 0.5.x The system standard resolver was synchronous, and this could stall the server when making upstream requests to other DNS servers. A new resolver `RubyDNS::Resolver` now provides an asynchronous interface and the `Transaction::passthrough` makes exclusive use of this to provide high performance asynchonous resolution. Here is a basic example of how to use the new resolver in full. It is important to provide both `:udp` and `:tcp` connection specifications, so that large requests will be handled correctly: resolver = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]]) EventMachine::run do resolver.query('google.com', IN::A) do |response| case response when RubyDNS::Message puts "Got response: #{response.answers.first}" else # Response is of class RubyDNS::ResolutionFailure puts "Failed: #{response.message}" end EventMachine::stop end end Existing code that uses `Resolv::DNS` as a resolver will need to be updated: # 1/ Add this at the top of your file; Host specific system information: require 'rubydns/system' # 2/ Change from R = Resolv::DNS.new to: R = RubyDNS::Resolver.new(RubyDNS::System::nameservers) Everything else in the server can remain the same. You can see a complete example in `test/test_resolver.rb`. ### Migrating from RubyDNS 0.3.x to 0.4.x Due to changes in `resolv.rb`, superficial parts of RubyDNS have changed. Rather than using `:A` to specify A-records, one must now use the class name. match(..., :A) becomes IN = Resolv::DNS::Resource::IN match(..., IN::A) ## Contributing 1. Fork it 2. Create your feature branch (`git checkout -b my-new-feature`) 3. Commit your changes (`git commit -am 'Add some feature'`) 4. Push to the branch (`git push origin my-new-feature`) 5. Create new Pull Request ### Desired Features * Support for more features of DNS such as zone transfer. * Support reverse records more easily. * Some kind of system level integration, e.g. registering a DNS server with the currently running system resolver. ## License Released under the MIT license. Copyright, 2009, 2012, 2014, by [Samuel G. D. Williams](http://www.codeotaku.com/samuel-williams). Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ruby-rubydns-1.0.3/Rakefile000066400000000000000000000004001270364632400156260ustar00rootroot00000000000000require "bundler/gem_tasks" require "rspec/core/rake_task" RSpec::Core::RakeTask.new(:spec) do |task| task.rspec_opts = ["--require", "simplecov"] if ENV['COVERAGE'] end task :default => :spec require 'celluloid' Celluloid.logger.level = Logger::ERROR ruby-rubydns-1.0.3/bin/000077500000000000000000000000001270364632400147375ustar00rootroot00000000000000ruby-rubydns-1.0.3/bin/rubydns-check000077500000000000000000000222211270364632400174250ustar00rootroot00000000000000#!/usr/bin/env ruby # Copyright, 2009, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # Pulls down DNS data from old-dns # rd-dns-check -s old-dns.mydomain.com -d mydomain.com. -f old-dns.yml # Check data against old-dns # rd-dns-check -s old-dns.mydomain.com -d mydomain.com. -c old-dns.yml # Check data against new DNS server # rd-dns-check -s 10.0.0.36 -d mydomain.com. -c old-dns.yml require 'yaml' require 'optparse' require 'set' class DNSRecord def initialize(arr) @record = arr normalize end def normalize @record[0] = @record[0].downcase @record[1] = @record[1].upcase @record[2] = @record[2].upcase @record[3] = @record[3].downcase end def hostname @record[0] end def klass @record[1] end def type @record[2] end def value @record[3] end def is_address? ["A", "AAAA"].include?(type) end def is_cname? return type == "CNAME" end def to_s "#{hostname.ljust(50)} #{klass.rjust(4)} #{type.rjust(5)} #{value}" end def key "#{hostname}:#{klass}:#{type}".downcase end def to_a @record end def == other return @record == other.to_a end end def dig(dns_server, cmd, exclude = ["TXT", "HINFO", "SOA", "NS"]) records = [] IO.popen("dig @#{dns_server} +nottlid +nocmd +noall +answer " + cmd) do |p| p.each do |line| r = line.chomp.split(/\s/, 4) next if exclude.include?(r[2]) records << DNSRecord.new(r) end end return records end def retrieve_records(dns_server, dns_root) return dig(dns_server, "#{dns_root} AXFR") end def resolve_hostname(dns_server, hostname) return dig(dns_server, "#{hostname} A").first end def resolve_address(dns_server, address) return dig(dns_server, "-x #{address}").first end def print_summary(records, errors, okay, &block) puts "[ Summary ]".center(72, "=") puts "Checked #{records.size} record(s). #{errors} errors." if errors == 0 puts "Everything seemed okay." else puts "The following records are okay:" okay.each do |r| if block_given? yield r else puts "".rjust(12) + r.to_s end end end end # Resolve hostnames to IP address "A" or "AAAA" records. # Works through CNAME records in order to find out the final # address if possible. Checks for loops in CNAME records. def resolve_addresses(records) addresses = {} cnames = {} # Extract all hostname -> ip address mappings records.each do |r| if r.is_address? addresses[r.hostname] = r elsif r.is_cname? cnames[r.hostname] = r end end cnames.each do |hostname, r| q = r trail = [] failed = false # Keep track of CNAME records to avoid loops while q.is_cname? trail << q q = cnames[q.value] || addresses[q.value] # Q could be nil at this point, which means there was no address record # Q could be already part of the trail, which means there was a loop if q == nil || trail.include?(q) failed = true break end end if failed q = trail.last puts "*** Warning: CNAME record #{hostname} does not point to actual address!" trail.each_with_index do |r, idx| puts idx.to_s.rjust(10) + ": " + r.to_s end end addresses[r.hostname] = q end return addresses, cnames end def check_reverse(records, dns_server) errors = 0 okay = [] puts "[ Checking Reverse Lookups ]".center(72, "=") records.each do |r| next unless r.is_address? sr = resolve_address(dns_server, r.value) if sr == nil puts "*** Could not resolve host" puts "".rjust(12) + r.to_s errors += 1 elsif r.hostname != sr.value puts "*** Hostname does not match" puts "Primary: ".rjust(12) + r.to_s puts "Secondary: ".rjust(12) + sr.to_s errors += 1 else okay << [r, sr] end end print_summary(records, errors, okay) do |r| puts "Primary:".rjust(12) + r[0].to_s puts "Secondary:".rjust(12) + r[1].to_s end end def ping_records(records) addresses, cnames = resolve_addresses(records) errors = 0 okay = [] puts "[ Pinging Records ]".center(72, "=") addresses.each do |hostname, r| ping = "ping -c 5 -t 5 -i 1 -o #{r.value} > /dev/null" system(ping) if $?.exitstatus == 0 okay << r else puts "*** Could not ping host #{hostname.dump}: #{ping.dump}" puts "".rjust(12) + r.to_s errors += 1 end end print_summary(records, errors, okay) end def query_records(primary, secondary_server) addresses, cnames = resolve_addresses(primary) okay = [] errors = 0 primary.each do |r| sr = resolve_hostname(secondary_server, r.hostname) if sr == nil puts "*** Could not resolve hostname #{r.hostname.dump}" puts "Primary: ".rjust(12) + r.to_s rsr = resolve_address(secondary_server, (addresses[r.value] || r).value) puts "Address: ".rjust(12) + rsr.to_s if rsr errors += 1 elsif sr.value != r.value ra = addresses[r.value] if r.is_cname? sra = addresses[sr.value] if sr.is_cname? if (sra || sr).value != (ra || r).value puts "*** IP Address does not match" puts "Primary: ".rjust(12) + r.to_s puts "Resolved: ".rjust(12) + ra.to_s if ra puts "Secondary: ".rjust(12) + sr.to_s puts "Resolved: ".rjust(12) + sra.to_s if sra errors += 1 end else okay << r end end print_summary(primary, errors, okay) end def check_records(primary, secondary) s = {} okay = [] errors = 0 secondary.each do |r| s[r.key] = r end puts "[ Checking Records ]".center(72, "=") primary.each do |r| sr = s[r.key] if sr == nil puts "*** Could not find record" puts "Primary: ".rjust(12) + r.to_s errors += 1 elsif sr != r puts "*** Records are different" puts "Primary: ".rjust(12) + r.to_s puts "Secondary: ".rjust(12) + sr.to_s errors += 1 else okay << r end end print_summary(primary, errors, okay) end OPTIONS = { :DNSServer => nil, :DNSRoot => ".", } ARGV.options do |o| script_name = File.basename($0) o.set_summary_indent(' ') o.banner = "Usage: #{script_name} [options]" o.define_head "This script is designed to test and check DNS servers." o.on("-s ns.my.domain.", "--server ns.my.domain.", String, "The DNS server to query.") { |host| OPTIONS[:DNSServer] = host } o.on("-d my.domain.", "--domain my.domain.", String, "The DNS zone to transfer/test.") { |host| OPTIONS[:DNSRoot] = host } o.on("-f output.yml", "--fetch output.yml", String, "Pull down a list of hosts. Filters TXT and HINFO records. DNS transfers must be enabled.") { |f| records = retrieve_records(OPTIONS[:DNSServer], OPTIONS[:DNSRoot]) output = (f ? File.open(f, "w") : STDOUT) output.write(YAML::dump(records)) puts "#{records.size} record(s) retrieved." } o.on("-c input.yml", "--check input.yml", String, "Check that the DNS server returns results as specified by the file.") { |f| input = (f ? File.open(f) : STDIN) master_records = YAML::load(input.read) secondary_records = retrieve_records(OPTIONS[:DNSServer], OPTIONS[:DNSRoot]) check_records(master_records, secondary_records) } o.on("-q input.yml", "--query input.yml", String, "Query the remote DNS server with all hostnames in the given file, and checks the IP addresses are consistent.") { |f| input = (f ? File.open(f) : STDIN) master_records = YAML::load(input.read) query_records(master_records, OPTIONS[:DNSServer]) } o.on("-p input.yml", "--ping input.yml", String, "Ping all hosts to check if they are available or not.") { |f| input = (f ? File.open(f) : STDIN) master_records = YAML::load(input.read) ping_records(master_records) } o.on("-r input.yml", "--reverse input.yml", String, "Check that all address records have appropriate reverse entries.") { |f| input = (f ? File.open(f) : STDIN) master_records = YAML::load(input.read) check_reverse(master_records, OPTIONS[:DNSServer]) } o.separator "" o.separator "Help and Copyright information" o.on_tail("--copy", "Display copyright information") { puts "#{script_name}. Copyright (c) 2009, 2011 Samuel Williams. Released under the MIT license." puts "See http://www.oriontransfer.co.nz/ for more information." exit } o.on_tail("-h", "--help", "Show this help message.") { puts o; exit } end.parse!ruby-rubydns-1.0.3/examples/000077500000000000000000000000001270364632400160055ustar00rootroot00000000000000ruby-rubydns-1.0.3/examples/Gemfile000066400000000000000000000001651270364632400173020ustar00rootroot00000000000000source 'https://rubygems.org' gem 'rubydns', path: '../' gem "process-daemon" gem 'nokogiri' gem 'http' gem 'geoip' ruby-rubydns-1.0.3/examples/README.md000066400000000000000000000131011270364632400172600ustar00rootroot00000000000000# RubyDNS Examples This directory contains several examples of customized RubyDNS servers, intended to demonstrate how RubyDNS can be easily customized to specific needs. ## FlakeyDNS (flakey-dns.rb) A DNS server that selectively drops queries based on the requested domain name. Queries for domains that match specified regular expressions (like 'microsoft.com' or 'sco.com') return NXDomain, while all other queries are passed to upstream resolvers. By default this server will listen for UDP requests on port 5300 and does not need to be started as root. To start the server, ensure that you're in the examples subdirectory and type bundle bundle exec ./flakey-dns.rb start To see it in action you can then query some domains. For example, dig @localhost -p 5300 slashdot.org -t A dig @localhost -p 5300 www.hackernews.com -t A give the correct results. But dig @localhost -p 5300 microsoft.com -t A dig @localhost -p 5300 www.microsoft.com -t A dig @localhost -p 5300 www.microsoft.com all give an NXDomain result. ## FortuneDNS (fortune-dns.rb) A DNS server that allows a client to generate fortunes and fetch them with subsequent requests. The server 'remembers' the fortunes it generates, and can serve them to future requests. The reason for this is because most fortunes won't fit over UDP (maximum size 512 bytes) and the client will request the same fortune via TCP. You will need to have the `fortune` app installed on your system. It comes installed by default on most Linux distributions, and can be installed on a Mac with Homebrew by typing: # Homebrew brew install fortune # MacPorts sudo port install fortune # Arch Linux sudo pacman -S fortune-mod By default this server will listen for UDP and TCP requests on port 53, and needs to be started as root. It assumes the existence of a user 'daemon', as whom the process will run. If such a user doesn't exist on your system, you will need to either create such a user or update the script to use a user that exists on your system. To start the server, ensure that you're in the examples subdirectory and type bundle sudo bundle exec ./fortune-dns.rb start To create a new fortune type dig @localhost fortune -t TXT This will result in an DNS answer that looks something like this: fortune. 0 IN TXT "Text Size: 714 Byte Size: 714" fortune. 0 IN CNAME 32bf3bf2b0a2255f2df00ed9e95c8185.fortune. Take the CNAME from this result and query it. For our example this would be: dig @localhost 32bf3bf2b0a2255f2df00ed9e95c8185.fortune -t TXT And your answer will be a fortune. You can also generate a 'short' fortune by typing the following: dig @localhost short.fortune -t TXT or view the fortune stats with: dig @localhost stats.fortune -t TXT ## GeoIPDNS (geoip-dns.rb) A sample DNS daemon that demonstrates how to use RubyDNS to build responses that vary based on the geolocation of the requesting peer. Clients of this server who request A records will get an answer IP address based on the continent of the client IP address. Please note that use of this example requires that the peer have a public IP address. IP addresses on private networks or the localhost IP (127.0.0.1) cannot be resolved to a location, and so will always yield the unknown result. This daemon requires the file downloaded from [MaxMind](http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz) For more information on the GeoIP library, please click [here](http://www.maxmind.com/en/geolite) or [here](https://github.com/cjheath/geoip). This file should be unzipped and placed in the examples root directory, i.e. `examples/GeoLiteCountry.dat`. By default this server will listen for UDP requests on port 5300 and does not need to be started as root. To start the server, ensure that you're in the examples subdirectory and type bundle sudo bundle exec ./geoip-dns.rb start To see the behavior, run a DNS query against the server where you are running the GeoIPDNS daemon. Depending on the continent to which the client machine's IP address is mapped, you will receive a different IP address in the answer section: Africa - 1.1.1.1 Antarctica - 1.1.2.1 Asia - 1.1.3.1 Europe - 1.1.4.1 North America - 1.1.5.1 Oceania - 1.1.6.1 South America - 1.1.7.1 ## WikipediaDNS (wikipedia-dns.rb) A DNS server that queries Wikipedia and returns summaries for specifically crafted queries. By default this server will listen for UDP and TCP requests on port 53, and needs to be started as root. It assumes the existence of a user 'daemon', as whom the process will run. If such a user doesn't exist on your system, you will need to either create such a user or update the script to use a user that exists on your system. To start the server, ensure that you're in the examples subdirectory and type bundle sudo bundle exec ./wikipedia-dns.rb start To query Wikipedia, pick a term - say, 'helium' - and make a DNS query like dig @localhost helium.wikipedia -t TXT The answer section should contain the summary for this topic from Wikipedia helium.wikipedia. 86400 IN TXT "Helium is a chemical element with symbol He and atomic number 2. It is a colorless, odorless, tasteless, non-toxic, inert, monatomic gas that heads the noble gas group in the periodic table. Its boiling and melting points are the lowest among the elements" " and it exists only as a gas except in extreme conditions." Long blocks of text cannot be easily replied in DNS as they must be chunked into segments at most 255 bytes. Long replies must be sent back using TCP. ruby-rubydns-1.0.3/examples/flakey-dns.rb000077500000000000000000000047231270364632400204000ustar00rootroot00000000000000#!/usr/bin/env ruby # Copyright, 2009, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'process/daemon' require 'rubydns' require 'rubydns/system' INTERFACES = [ [:udp, '0.0.0.0', 5300] ] # A DNS server that selectively drops queries based on the requested domain # name. Queries for domains that match specified regular expresssions # (like 'microsoft.com' or 'sco.com') return NXDomain, while all other # queries are passed to upstream resolvers. class FlakeyDNS < Process::Daemon Name = Resolv::DNS::Name IN = Resolv::DNS::Resource::IN def startup RubyDNS.run_server(listen: INTERFACES) do # Use a Celluloid supervisor so the system recovers if the actor dies fallback_resolver_supervisor = RubyDNS::Resolver.supervise(RubyDNS::System.nameservers) # Fail the resolution of certain domains ;) match(/(m?i?c?r?o?s?o?f?t)/) do |transaction, match_data| if match_data[1].size > 7 logger.info 'Dropping domain MICROSOFT...' transaction.fail!(:NXDomain) else # Pass the request to the otherwise handler false end end # Hmm.... match(/^(.+\.)?sco\./) do |transaction| logger.info 'Dropping domain SCO...' transaction.fail!(:NXDomain) end # Default DNS handler otherwise do |transaction| logger.info 'Passing DNS request upstream...' transaction.passthrough!(fallback_resolver_supervisor.actors.first) end end end end FlakeyDNS.daemonize ruby-rubydns-1.0.3/examples/fortune-dns.rb000077500000000000000000000063711270364632400206100ustar00rootroot00000000000000#!/usr/bin/env ruby # encoding: utf-8 # Copyright, 2009, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'process/daemon' require 'process/daemon/privileges' require 'rubydns' require 'rubydns/extensions/string' require 'digest/md5' # You might need to change the user name "daemon". This can be a user name # or a user id. RUN_AS = 'daemon' if Process::Daemon::Privileges.current_user != 'root' $stderr.puts 'Sorry, this command needs to be run as root!' exit 1 end # A DNS server that allows a client to generate fortunes and fetch them with # subsequent requests. The server 'remembers' the fortunes it generates, # and can serve them to future requests. class FortuneDNS < Process::Daemon Name = Resolv::DNS::Name IN = Resolv::DNS::Resource::IN def startup cache = {} stats = { requested: 0 } # Start the RubyDNS server RubyDNS.run_server do on(:start) do Process::Daemon::Privileges.change_user(RUN_AS) if ARGV.include?('--debug') @logger.level = Logger::DEBUG $stderr.sync = true else @logger.level = Logger::WARN end end match(/short\.fortune/, IN::TXT) do |transaction| fortune = `fortune -s`.gsub(/\s+/, ' ').strip transaction.respond!(*fortune.chunked, ttl: 0) end match(/stats\.fortune/, IN::TXT) do |transaction| $stderr.puts "Sending stats: #{stats.inspect}" transaction.respond!(stats.inspect) end match(/([a-f0-9]*)\.fortune/, IN::TXT) do |transaction, match| fortune = cache[match[1]] stats[:requested] += 1 if fortune transaction.respond!(*fortune.chunked) else transaction.fail!(:NXDomain) end end match(/fortune/, [IN::CNAME, IN::TXT]) do |transaction| fortune = `fortune`.gsub(/\s+/, ' ').strip checksum = Digest::MD5.hexdigest(fortune) cache[checksum] = fortune answer_txt = "Text Size: #{fortune.size} Byte Size: #{fortune.bytesize}" transaction.respond!(answer_txt, resource_class: IN::TXT, ttl: 0) answer_cname = Name.create(checksum + '.fortune') transaction.respond!(answer_cname, resource_class: IN::CNAME, ttl: 0) end # Default DNS handler otherwise do |transaction| transaction.fail!(:NXDomain) end end end end FortuneDNS.daemonize ruby-rubydns-1.0.3/examples/geoip-dns.rb000077500000000000000000000101011270364632400202130ustar00rootroot00000000000000#!/usr/bin/env ruby # Copyright, 2009, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'geoip' require 'process/daemon' require 'rubydns' require 'rubydns/system' INTERFACES = [ [:udp, '0.0.0.0', 5300] ] # Path to the GeoIP file downloaded from # http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz # If you have renamed the ungzipped file, or have placed it somewhere other than # the repository root directory you will need to update this path. PATH_TO_GEOIP_DAT_FILE = File.expand_path('../GeoIP.dat', File.dirname(__FILE__)) # A sample DNS daemon that demonstrates how to use RubyDNS to build responses # that vary based on the geolocation of the requesting peer. Clients of # this server who request A records will get an answer IP address based # on the continent of the client IP address. # # Please note that use of this example requires that the peer have a public # IP address. IP addresses on private networks or the localhost IP (127.0.0.1) # cannot be resolved to a location, and so will always yield the unknown result. # This daemon requires the file downloaded from # http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz # For more information, please see http://www.maxmind.com/en/geolite and # http://geoip.rubyforge.org class GeoIPDNS < Process::Daemon GEO = GeoIP.new(PATH_TO_GEOIP_DAT_FILE) Name = Resolv::DNS::Name IN = Resolv::DNS::Resource::IN def startup RubyDNS.run_server(listen: INTERFACES) do fallback_resolver_supervisor = RubyDNS::Resolver.supervise(RubyDNS::System.nameservers) match(//, IN::A) do |transaction| logger.debug 'In block' # The IP Address of the peer is stored in the transaction options # with the key :peer ip_address = transaction.options[:peer] logger.debug "Looking up geographic information for peer #{ip_address}" location = GeoIPDNS.ip_to_location(ip_address) if location logger.debug "Found location #{location} for #{ip_address}" else logger.debug "Could not resolve location for #{ip_address}" end code = location ? location.continent_code : nil answer = GeoIPDNS.answer_for_continent_code(code) logger.debug "Answer is #{answer}" transaction.respond!(answer) end # Default DNS handler otherwise do |transaction| logger.debug 'In otherwise' transaction.passthrough!(fallback_resolver_supervisor.actors.first) end end end # Maps each continent code to a fixed IP address for the response. # A simple mapper to demonstrate the behavior. def self.answer_for_continent_code(code) case code when 'AF' then '1.1.1.1' when 'AN' then '1.1.2.1' when 'AS' then '1.1.3.1' when 'EU' then '1.1.4.1' when 'NA' then '1.1.5.1' when 'OC' then '1.1.6.1' when 'SA' then '1.1.7.1' else '1.1.8.1' end end # Finds the continent code for the specified IP address. # Returns nil if the IP address cannot be mapped to a location. def self.ip_to_location(ip_address) return nil unless ip_address GEO.country(ip_address) end end GeoIPDNS.daemonize ruby-rubydns-1.0.3/examples/wikipedia-dns.rb000077500000000000000000000066651270364632400211020ustar00rootroot00000000000000#!/usr/bin/env ruby # encoding: utf-8 # Copyright, 2009, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'rubydns' require 'rubydns/extensions/string' require 'process/daemon' require 'process/daemon/privileges' require 'cgi' require 'nokogiri' require 'json' require 'digest/md5' # You might need to change the user name "daemon". This can be a user name # or a user id. RUN_AS = 'daemon' if Process::Daemon::Privileges.current_user != 'root' $stderr.puts 'Sorry, this command needs to be run as root!' exit 1 end require 'http' # Celluloid::IO fetcher to retrieve URLs. class HttpFetcher include Celluloid::IO def get(url) # Note: For SSL support specify: # ssl_socket_class: Celluloid::IO::SSLSocket HTTP.get(url, socket_class: Celluloid::IO::TCPSocket) end end # Encapsulates the logic for fetching information from Wikipedia. module Wikipedia def self.summary_url(title) "http://en.wikipedia.org/w/api.php?action=parse&page=#{CGI.escape title}&prop=text§ion=0&format=json" end def self.extract_summary(json_text) document = JSON.parse(json_text) return Nokogiri::HTML(document['parse']['text']['*']).css('p')[0].text rescue return 'Invalid Article.' end end # A DNS server that queries Wikipedia and returns summaries for # specifically crafted queries. class WikipediaDNS < Process::Daemon Name = Resolv::DNS::Name IN = Resolv::DNS::Resource::IN def startup # Don't buffer output (for debug purposes) $stderr.sync = true stats = { requested: 0 } # Use a Celluloid supervisor so the system recovers if the actor dies fetcher = HttpFetcher.supervise # Start the RubyDNS server RubyDNS.run_server do on(:start) do Process::Daemon::Privileges.change_user(RUN_AS) if ARGV.include?('--debug') @logger.level = Logger::DEBUG else @logger.level = Logger::WARN end end match(/stats\.wikipedia/, IN::TXT) do |transaction| transaction.respond!(*stats.inspect.chunked) end match(/(.+)\.wikipedia/, IN::TXT) do |transaction, match_data| title = match_data[1] stats[:requested] += 1 response = fetcher.actors.first.get(Wikipedia.summary_url(title)) summary = Wikipedia.extract_summary(response).force_encoding('ASCII-8BIT') transaction.respond!(*summary.chunked) end # Default DNS handler otherwise do |transaction| transaction.fail!(:NXDomain) end end end end WikipediaDNS.daemonize ruby-rubydns-1.0.3/lib/000077500000000000000000000000001270364632400147355ustar00rootroot00000000000000ruby-rubydns-1.0.3/lib/rubydns.rb000066400000000000000000000033661270364632400167600ustar00rootroot00000000000000# Copyright, 2009, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require_relative 'rubydns/version' require_relative 'rubydns/message' require_relative 'rubydns/server' require_relative 'rubydns/resolver' require_relative 'rubydns/handler' require_relative 'rubydns/logger' module RubyDNS # Run a server with the given rules. def self.run_server (options = {}, &block) server_class = options[:server_class] || RuleBasedServer supervisor = server_class.supervise(options, &block) supervisor.actors.first.run if options[:asynchronous] return supervisor else read, write = IO.pipe trap(:INT) { write.puts } IO.select([read]) supervisor.terminate end end end ruby-rubydns-1.0.3/lib/rubydns/000077500000000000000000000000001270364632400164235ustar00rootroot00000000000000ruby-rubydns-1.0.3/lib/rubydns/chunked.rb000066400000000000000000000026721270364632400204000ustar00rootroot00000000000000# Copyright, 2009, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. module RubyDNS # Produces an array of arrays of binary data with each sub-array a maximum of chunk_size bytes. def self.chunked(string, chunk_size = 255) chunks = [] offset = 0 while offset < string.bytesize chunks << string.byteslice(offset, chunk_size) offset += chunk_size end return chunks end end ruby-rubydns-1.0.3/lib/rubydns/extensions/000077500000000000000000000000001270364632400206225ustar00rootroot00000000000000ruby-rubydns-1.0.3/lib/rubydns/extensions/resolv.rb000066400000000000000000000061411270364632400224630ustar00rootroot00000000000000# Copyright, 2009, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'resolv' class Resolv class DNS class Message # Merge the given message with this message. A number of heuristics are applied in order to ensure that the result makes sense. For example, If the current message is not recursive but is being merged with a message that was recursive, this bit is maintained. If either message is authoritive, then the result is also authoritive. # # Modifies the current message in place. def merge! (other) # Authoritive Answer @aa = @aa && other.aa @question += other.question @answer += other.answer @authority += other.authority @additional += other.additional # Recursion Available @ra = @ra || other.ra # Result Code (Error Code) @rcode = other.rcode unless other.rcode == 0 # Recursion Desired @rd = @rd || other.rd end end class OriginError < ArgumentError end class Name def to_s "#{@labels.join('.')}#{@absolute ? '.' : ''}" end def inspect "#<#{self.class}: #{self.to_s}>" end # Return the name, typically absolute, with the specified origin as a suffix. If the origin is nil, don't change the name, but change it to absolute (as specified). def with_origin(origin, absolute = true) return self.class.new(@labels, absolute) if origin == nil origin = Label.split(origin) if String === origin return self.class.new(@labels + origin, absolute) end # Return the name, typically relative, without the specified origin suffix. If the origin is nil, don't change the name, but change it to absolute (as specified). def without_origin(origin, absolute = false) return self.class.new(@labels, absolute) if origin == nil origin = Label.split(origin) if String === origin if @labels.last(origin.length) == origin return self.class.new(@labels.first(@labels.length - origin.length), absolute) else raise OriginError.new("#{self} does not end with #{origin.join('.')}") end end end end endruby-rubydns-1.0.3/lib/rubydns/extensions/string.rb000066400000000000000000000024431270364632400224600ustar00rootroot00000000000000# Copyright, 2009, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require_relative '../chunked' class String # Chunk a string which is required for the TEXT `resource_class`. def chunked(chunk_size = 255) RubyDNS::chunked(self) end end ruby-rubydns-1.0.3/lib/rubydns/handler.rb000066400000000000000000000127601270364632400203730ustar00rootroot00000000000000# Copyright, 2009, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require_relative 'transport' module RubyDNS class GenericHandler include Celluloid::IO def initialize(server) @server = server @logger = @server.logger || Celluloid.logger end def error_response(query = nil, code = Resolv::DNS::RCode::ServFail) # Encoding may fail, so we need to handle this particular case: server_failure = Resolv::DNS::Message::new(query ? query.id : 0) server_failure.qr = 1 server_failure.opcode = query ? query.opcode : 0 server_failure.aa = 1 server_failure.rd = 0 server_failure.ra = 0 server_failure.rcode = code # We can't do anything at this point... return server_failure end def process_query(data, options) @logger.debug "<> Receiving incoming query (#{data.bytesize} bytes) to #{self.class.name}..." query = nil begin query = RubyDNS::decode_message(data) return @server.process_query(query, options) rescue Celluloid::ResumableError # Celluloid terminates tasks, we may be stuck in a task when the server is terminated. We don't want to reply to the client in this case, because the server is being terminated. It might be an option to return a server failure raise rescue StandardError => error @logger.error "<> Error processing request: #{error.inspect}!" RubyDNS::log_exception(@logger, error) return error_response(query) end end end # Handling incoming UDP requests, which are single data packets, and pass them on to the given server. class UDPSocketHandler < GenericHandler include Celluloid::IO def initialize(server, socket) super(server) @socket = socket async.run end def run loop { handle_connection } end def respond(input_data, remote_host, remote_port) options = {peer: remote_host, port: remote_port, proto: :udp} response = process_query(input_data, options) output_data = response.encode @logger.debug "<#{response.id}> Writing #{output_data.bytesize} bytes response to client via UDP..." if output_data.bytesize > UDP_TRUNCATION_SIZE @logger.warn "<#{response.id}>Response via UDP was larger than #{UDP_TRUNCATION_SIZE}!" # Reencode data with truncation flag marked as true: truncation_error = Resolv::DNS::Message.new(response.id) truncation_error.tc = 1 output_data = truncation_error.encode end @socket.send(output_data, 0, remote_host, remote_port) rescue IOError => error @logger.warn "<> UDP response failed: #{error.inspect}!" rescue EOFError => error @logger.warn "<> UDP session ended prematurely: #{error.inspect}!" rescue DecodeError @logger.warn "<> Could not decode incoming UDP data!" end def handle_connection # @logger.debug "Waiting for incoming UDP packet #{@socket.inspect}..." input_data, (_, remote_port, remote_host) = @socket.recvfrom(UDP_TRUNCATION_SIZE, 0) async.respond(input_data, remote_host, remote_port) rescue IOError => error @logger.warn "<> UDP connection failed: #{error.inspect}!" rescue EOFError => error @logger.warn "<> UDP session ended prematurely!" end end class UDPHandler < UDPSocketHandler def initialize(server, host, port) family = RubyDNS::address_family(host) socket = UDPSocket.new(family) socket.bind(host, port) super(server, socket) end finalizer :finalize def finalize @socket.close if @socket end end class TCPSocketHandler < GenericHandler def initialize(server, socket) super(server) @socket = socket async.run end def run loop { async.handle_connection @socket.accept } end def handle_connection(socket) _, remote_port, remote_host = socket.peeraddr options = {peer: remote_host, port: remote_port, proto: :tcp} input_data = StreamTransport.read_chunk(socket) response = process_query(input_data, options) length = StreamTransport.write_message(socket, response) @logger.debug "<#{response.id}> Wrote #{length} bytes via TCP..." rescue EOFError => error @logger.warn "<> TCP session ended prematurely!" rescue DecodeError @logger.warn "<> Could not decode incoming TCP data!" ensure socket.close end end class TCPHandler < TCPSocketHandler def initialize(server, host, port) socket = TCPServer.new(host, port) super(server, socket) end finalizer :finalize def finalize @socket.close if @socket end end end ruby-rubydns-1.0.3/lib/rubydns/logger.rb000066400000000000000000000026211270364632400202300ustar00rootroot00000000000000# Copyright, 2009, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'logger' module RubyDNS # Logs an exception nicely to a standard `Logger`. def self.log_exception(logger, exception) logger.error "#{exception.class}: #{exception.message}" if exception.backtrace Array(exception.backtrace).each { |at| logger.error at } end end end ruby-rubydns-1.0.3/lib/rubydns/message.rb000066400000000000000000000050521270364632400203760ustar00rootroot00000000000000# Copyright, 2009, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'stringio' require 'resolv' require 'base64' require_relative 'logger' require_relative 'extensions/resolv' module RubyDNS UDP_TRUNCATION_SIZE = 512 # The DNS message container. Message = Resolv::DNS::Message DecodeError = Resolv::DNS::DecodeError @@dump_bad_message = nil # Call this function with a path where bad messages will be saved. Any message that causes an exception to be thrown while decoding the binary will be saved in base64 for later inspection. The log file could grow quickly so be careful - not designed for long term use. def self.log_bad_messages!(log_path) bad_messages_log = Logger.new(log_path, 10, 1024*100) bad_messages_log.level = Logger::DEBUG @dump_bad_message = lambda do |error, data| bad_messages_log.debug("Bad message: #{Base64.encode64(data)}") RubyDNS.log_exception(bad_messages_log, error) end end # Decodes binary data into a {Message}. def self.decode_message(data) # Otherwise the decode process might fail with non-binary data. if data.respond_to? :force_encoding data.force_encoding("BINARY") end begin return Message.decode(data) rescue DecodeError raise rescue StandardError => error new_error = DecodeError.new(error.message) new_error.set_backtrace(error.backtrace) raise new_error end rescue => error # Log the bad messsage if required: if @dump_bad_message @dump_bad_message.call(error, data) end raise end end ruby-rubydns-1.0.3/lib/rubydns/resolver.rb000066400000000000000000000220621270364632400206130ustar00rootroot00000000000000# Copyright, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require_relative 'handler' require 'securerandom' require 'celluloid/io' module RubyDNS class InvalidProtocolError < StandardError end class InvalidResponseError < StandardError end class ResolutionFailure < StandardError end class Resolver # Wait for up to 2 seconds for a response. Override with `options[:timeout]` DEFAULT_TIMEOUT = 5.0 # 10ms wait between making requests. Override with `options[:delay]` DEFAULT_DELAY = 0.01 # Try a given request 5 times before failing. Override with `options[:retries]`. DEFAULT_RETRIES = 10 include Celluloid::IO # Servers are specified in the same manor as options[:listen], e.g. # [:tcp/:udp, address, port] # In the case of multiple servers, they will be checked in sequence. def initialize(servers, options = {}) @servers = servers @options = options @origin = options[:origin] || nil @logger = options[:logger] || Celluloid.logger end attr_accessor :origin def fully_qualified_name(name) # If we are passed an existing deconstructed name: if Resolv::DNS::Name === name if name.absolute? return name else return name.with_origin(@origin) end end # ..else if we have a string, we need to do some basic processing: if name.end_with? '.' return Resolv::DNS::Name.create(name) else return Resolv::DNS::Name.create(name).with_origin(@origin) end end # Provides the next sequence identification number which is used to keep track of DNS messages. def next_id! # Using sequential numbers for the query ID is generally a bad thing because over UDP they can be spoofed. 16-bits isn't hard to guess either, but over UDP we also use a random port, so this makes effectively 32-bits of entropy to guess per request. SecureRandom.random_number(2**16) end # Look up a named resource of the given resource_class. def query(name, resource_class = Resolv::DNS::Resource::IN::A) message = Resolv::DNS::Message.new(next_id!) message.rd = 1 message.add_question fully_qualified_name(name), resource_class dispatch_request(message) end # Yields a list of `Resolv::IPv4` and `Resolv::IPv6` addresses for the given `name` and `resource_class`. Raises a ResolutionFailure if no severs respond. def addresses_for(name, resource_class = Resolv::DNS::Resource::IN::A, options = {}) name = fully_qualified_name(name) cache = options.fetch(:cache, {}) retries = options.fetch(:retries, DEFAULT_RETRIES) delay = options.fetch(:delay, DEFAULT_DELAY) records = lookup(name, resource_class, cache) do |name, resource_class| response = nil retries.times do |i| # Wait 10ms before trying again: sleep delay if delay and i > 0 response = query(name, resource_class) break if response end response or abort ResolutionFailure.new("Could not resolve #{name} after #{retries} attempt(s).") end addresses = [] if records records.each do |record| if record.respond_to? :address addresses << record.address else # The most common case here is that record.class is IN::CNAME and we need to figure out the address. Usually the upstream DNS server would have replied with this too, and this will be loaded from the response if possible without requesting additional information. addresses += addresses_for(record.name, record.class, options.merge(cache: cache)) end end end if addresses.size > 0 return addresses else abort ResolutionFailure.new("Could not find any addresses for #{name}.") end end def request_timeout @options[:timeout] || DEFAULT_TIMEOUT end # Send the message to available servers. If no servers respond correctly, nil is returned. This result indicates a failure of the resolver to correctly contact any server and get a valid response. def dispatch_request(message) request = Request.new(message, @servers) request.each do |server| @logger.debug "[#{message.id}] Sending request #{message.question.inspect} to server #{server.inspect}" if @logger begin response = nil # This may be causing a problem, perhaps try: # after(timeout) { socket.close } # https://github.com/celluloid/celluloid-io/issues/121 timeout(request_timeout) do response = try_server(request, server) end if valid_response(message, response) return response end rescue Task::TimeoutError @logger.debug "[#{message.id}] Request timed out!" if @logger rescue InvalidResponseError @logger.warn "[#{message.id}] Invalid response from network: #{$!}!" if @logger rescue DecodeError @logger.warn "[#{message.id}] Error while decoding data from network: #{$!}!" if @logger rescue IOError @logger.warn "[#{message.id}] Error while reading from network: #{$!}!" if @logger end end return nil end private # Lookup a name/resource_class record but use the records cache if possible reather than making a new request if possible. def lookup(name, resource_class = Resolv::DNS::Resource::IN::A, records = {}) records.fetch(name) do response = yield(name, resource_class) if response response.answer.each do |name, ttl, record| (records[name] ||= []) << record end end records[name] end end def try_server(request, server) case server[0] when :udp try_udp_server(request, server[1], server[2]) when :tcp try_tcp_server(request, server[1], server[2]) else raise InvalidProtocolError.new(server) end end def valid_response(message, response) if response.tc != 0 @logger.warn "[#{message.id}] Received truncated response!" if @logger elsif response.id != message.id @logger.warn "[#{message.id}] Received response with incorrect message id: #{response.id}!" if @logger else @logger.debug "[#{message.id}] Received valid response with #{response.answer.count} answer(s)." if @logger return true end return false end def try_udp_server(request, host, port) family = RubyDNS::address_family(host) socket = UDPSocket.new(family) socket.send(request.packet, 0, host, port) data, (_, remote_port) = socket.recvfrom(UDP_TRUNCATION_SIZE, 0) # Need to check host, otherwise security issue. # May indicate some kind of spoofing attack: if port != remote_port raise InvalidResponseError.new("Data was not received from correct remote port (#{port} != #{remote_port})") end message = RubyDNS::decode_message(data) ensure socket.close if socket end def try_tcp_server(request, host, port) begin socket = TCPSocket.new(host, port) rescue Errno::EALREADY # This is a hack to work around faulty behaviour in celluloid-io: # https://github.com/celluloid/celluloid/issues/436 raise IOError.new("Could not connect to remote host!") end StreamTransport.write_chunk(socket, request.packet) input_data = StreamTransport.read_chunk(socket) message = RubyDNS::decode_message(input_data) rescue Errno::ECONNREFUSED => error raise IOError.new(error.message) rescue Errno::EPIPE => error raise IOError.new(error.message) rescue Errno::ECONNRESET => error raise IOError.new(error.message) ensure socket.close if socket end # Manages a single DNS question message across one or more servers. class Request def initialize(message, servers) @message = message @packet = message.encode @servers = servers.dup # We select the protocol based on the size of the data: if @packet.bytesize > UDP_TRUNCATION_SIZE @servers.delete_if{|server| server[0] == :udp} end end attr :message attr :packet attr :logger def each(&block) @servers.each do |server| next if @packet.bytesize > UDP_TRUNCATION_SIZE yield server end end def update_id!(id) @message.id = id @packet = @message.encode end end end end ruby-rubydns-1.0.3/lib/rubydns/server.rb000066400000000000000000000250741270364632400202660ustar00rootroot00000000000000# Copyright, 2009, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'celluloid/io' require_relative 'transaction' require_relative 'logger' module RubyDNS class UDPSocketWrapper < Celluloid::IO::UDPSocket def initialize(socket) @socket = socket end end class TCPServerWrapper < Celluloid::IO::TCPServer def initialize(server) @server = server end end class Server include Celluloid::IO finalizer :shutdown # The default server interfaces DEFAULT_INTERFACES = [[:udp, "0.0.0.0", 53], [:tcp, "0.0.0.0", 53]] # Instantiate a server with a block # # server = Server.new do # match(/server.mydomain.com/, IN::A) do |transaction| # transaction.respond!("1.2.3.4") # end # end # def initialize(options = {}) @handlers = [] @logger = options[:logger] || Celluloid.logger @interfaces = options[:listen] || DEFAULT_INTERFACES @origin = options[:origin] || '.' end # Records are relative to this origin: attr_accessor :origin attr_accessor :logger # Fire the named event as part of running the server. def fire(event_name) end def shutdown fire(:stop) end # Give a name and a record type, try to match a rule and use it for processing the given arguments. def process(name, resource_class, transaction) raise NotImplementedError.new end # Process an incoming DNS message. Returns a serialized message to be sent back to the client. def process_query(query, options = {}, &block) start_time = Time.now # Setup response response = Resolv::DNS::Message::new(query.id) response.qr = 1 # 0 = Query, 1 = Response response.opcode = query.opcode # Type of Query; copy from query response.aa = 1 # Is this an authoritative response: 0 = No, 1 = Yes response.rd = query.rd # Is Recursion Desired, copied from query response.ra = 0 # Does name server support recursion: 0 = No, 1 = Yes response.rcode = 0 # Response code: 0 = No errors transaction = nil begin query.question.each do |question, resource_class| begin question = question.without_origin(@origin) @logger.debug {"<#{query.id}> Processing question #{question} #{resource_class}..."} transaction = Transaction.new(self, query, question, resource_class, response, options) transaction.process rescue Resolv::DNS::OriginError # This is triggered if the question is not part of the specified @origin: @logger.debug {"<#{query.id}> Skipping question #{question} #{resource_class} because #{$!}"} end end rescue Celluloid::ResumableError raise rescue StandardError => error @logger.error "<#{query.id}> Exception thrown while processing #{transaction}!" RubyDNS.log_exception(@logger, error) response.rcode = Resolv::DNS::RCode::ServFail end end_time = Time.now @logger.debug {"<#{query.id}> Time to process request: #{end_time - start_time}s"} return response end # # By default the server runs on port 53, both TCP and UDP, which is usually a priviledged port and requires root access to bind. You can change this by specifying `options[:listen]` which should contain an array of `[protocol, interface address, port]` specifications. # # INTERFACES = [[:udp, "0.0.0.0", 5300]] # RubyDNS::run_server(:listen => INTERFACES) do # ... # end # # You can specify already connected sockets if need be: # # socket = UDPSocket.new; socket.bind("0.0.0.0", 53) # Process::Sys.setuid(server_uid) # INTERFACES = [socket] # def run @logger.info "Starting RubyDNS server (v#{RubyDNS::VERSION})..." fire(:setup) # Setup server sockets @interfaces.each do |spec| if spec.is_a?(BasicSocket) spec.do_not_reverse_lookup protocol = spec.getsockopt(Socket::SOL_SOCKET, Socket::SO_TYPE).unpack("i")[0] ip = spec.local_address.ip_address port = spec.local_address.ip_port case protocol when Socket::SOCK_DGRAM @logger.info "<> Attaching to pre-existing UDP socket #{ip}:#{port}" link UDPSocketHandler.new(self, UDPSocketWrapper.new(spec)) when Socket::SOCK_STREAM @logger.info "<> Attaching to pre-existing TCP socket #{ip}:#{port}" link TCPSocketHandler.new(self, TCPServerWrapper.new(spec)) else raise ArgumentError.new("Unknown socket protocol: #{protocol}") end elsif spec[0] == :udp @logger.info "<> Listening on #{spec.join(':')}" link UDPHandler.new(self, spec[1], spec[2]) elsif spec[0] == :tcp @logger.info "<> Listening on #{spec.join(':')}" link TCPHandler.new(self, spec[1], spec[2]) else raise ArgumentError.new("Invalid connection specification: #{spec.inspect}") end end fire(:start) end end # Provides the core of the RubyDNS domain-specific language (DSL). It contains a list of rules which are used to match against incoming DNS questions. These rules are used to generate responses which are either DNS resource records or failures. class RuleBasedServer < Server # Represents a single rule in the server. class Rule def initialize(pattern, callback) @pattern = pattern @callback = callback end # Returns true if the name and resource_class are sufficient: def match(name, resource_class) # If the pattern doesn't specify any resource classes, we implicitly pass this test: return true if @pattern.size < 2 # Otherwise, we try to match against some specific resource classes: if Class === @pattern[1] @pattern[1] == resource_class else @pattern[1].include?(resource_class) rescue false end end # Invoke the rule, if it matches the incoming request, it is evaluated and returns `true`, otherwise returns `false`. def call(server, name, resource_class, transaction) unless match(name, resource_class) server.logger.debug "<#{transaction.query.id}> Resource class #{resource_class} failed to match #{@pattern[1].inspect}!" return false end # Does this rule match against the supplied name? case @pattern[0] when Regexp match_data = @pattern[0].match(name) if match_data server.logger.debug "<#{transaction.query.id}> Regexp pattern matched with #{match_data.inspect}." @callback[transaction, match_data] return true end when String if @pattern[0] == name server.logger.debug "<#{transaction.query.id}> String pattern matched." @callback[transaction] return true end else if (@pattern[0].call(name, resource_class) rescue false) server.logger.debug "<#{transaction.query.id}> Callable pattern matched." @callback[transaction] return true end end server.logger.debug "<#{transaction.query.id}> No pattern matched." # We failed to match the pattern. return false end def to_s @pattern.inspect end end # Don't wrap the block going into initialize. execute_block_on_receiver :initialize # Instantiate a server with a block # # server = Server.new do # match(/server.mydomain.com/, IN::A) do |transaction| # transaction.respond!("1.2.3.4") # end # end # def initialize(options = {}, &block) super(options) @events = {} @rules = [] @otherwise = nil if block_given? instance_eval(&block) end end attr_accessor :logger # This function connects a pattern with a block. A pattern is either a String or a Regex instance. Optionally, a second argument can be provided which is either a String, Symbol or Array of resource record types which the rule matches against. # # match("www.google.com") # match("gmail.com", IN::MX) # match(/g?mail.(com|org|net)/, [IN::MX, IN::A]) # def match(*pattern, &block) @rules << Rule.new(pattern, block) end # Register a named event which may be invoked later using #fire # # on(:start) do |server| # Process::Daemon::Permissions.change_user(RUN_AS) # end def on(event_name, &block) @events[event_name] = block end # Fire the named event, which must have been registered using on. def fire(event_name) callback = @events[event_name] if callback callback.call(self) end end # Specify a default block to execute if all other rules fail to match. This block is typially used to pass the request on to another server (i.e. recursive request). # # otherwise do |transaction| # transaction.passthrough!($R) # end # def otherwise(&block) @otherwise = block end # If you match a rule, but decide within the rule that it isn't the correct one to use, you can call `next!` to evaluate the next rule - in other words, to continue falling down through the list of rules. def next! throw :next end # Give a name and a record type, try to match a rule and use it for processing the given arguments. def process(name, resource_class, transaction) @logger.debug {"<#{transaction.query.id}> Searching for #{name} #{resource_class.name}"} @rules.each do |rule| @logger.debug {"<#{transaction.query.id}> Checking rule #{rule}..."} catch (:next) do # If the rule returns true, we assume that it was successful and no further rules need to be evaluated. return if rule.call(self, name, resource_class, transaction) end end if @otherwise @otherwise.call(transaction) else @logger.warn "<#{transaction.query.id}> Failed to handle #{name} #{resource_class.name}!" end end end end ruby-rubydns-1.0.3/lib/rubydns/system.rb000066400000000000000000000071011270364632400202730ustar00rootroot00000000000000# Copyright, 2009, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. begin require 'win32/resolv' rescue LoadError # Ignore this - we aren't running on windows. end module RubyDNS # This module encapsulates system dependent name lookup functionality. module System RESOLV_CONF = "/etc/resolv.conf" HOSTS = "/etc/hosts" def self.hosts_path if RUBY_PLATFORM =~ /mswin32|mingw|bccwin/ Win32::Resolv.get_hosts_path else HOSTS end end # This code is very experimental class Hosts def initialize @addresses = {} @names = {} end attr :addresses attr :names # This is used to match names against the list of known hosts: def call(name) @names.include?(name) end def lookup(name) addresses = @names[name] if addresses addresses.last else nil end end alias [] lookup def add(address, names) @addresses[address] ||= [] @addresses[address] += names names.each do |name| @names[name] ||= [] @names[name] << address end end def parse_hosts(io) io.each do |line| line.sub!(/#.*/, '') address, hostname, *aliases = line.split(/\s+/) add(address, [hostname] + aliases) end end def self.local hosts = self.new path = System::hosts_path if path and File.exist?(path) File.open(path) do |file| hosts.parse_hosts(file) end end return hosts end end def self.parse_resolv_configuration(path) nameservers = [] File.open(path) do |file| file.each do |line| # Remove any comments: line.sub!(/[#;].*/, '') # Extract resolv.conf command: keyword, *args = line.split(/\s+/) case keyword when 'nameserver' nameservers += args end end end return nameservers end def self.standard_connections(nameservers) connections = [] nameservers.each do |host| connections << [:udp, host, 53] connections << [:tcp, host, 53] end return connections end # Get a list of standard nameserver connections which can be used for querying any standard servers that the system has been configured with. There is no equivalent facility to use the `hosts` file at present. def self.nameservers nameservers = [] if File.exist? RESOLV_CONF nameservers = parse_resolv_configuration(RESOLV_CONF) elsif defined?(Win32::Resolv) and RUBY_PLATFORM =~ /mswin32|cygwin|mingw|bccwin/ search, nameservers = Win32::Resolv.get_resolv_info end return standard_connections(nameservers) end end end ruby-rubydns-1.0.3/lib/rubydns/transaction.rb000066400000000000000000000202161270364632400212760ustar00rootroot00000000000000# Copyright, 2009, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. module RubyDNS # This class provides all details of a single DNS question and response. This is used by the DSL to provide DNS related functionality. # # The main functions to complete the transaction are: {#append!} (evaluate a new query and append the results), {#passthrough!} (pass the query to an upstream server), {#respond!} (compute a specific response) and {#fail!} (fail with an error code). class Transaction # The default time used for responses (24 hours). DEFAULT_TTL = 86400 def initialize(server, query, question, resource_class, response, options = {}) @server = server @query = query @question = question @resource_class = resource_class @response = response @options = options end # The resource_class that was requested. This is typically used to generate a response. attr :resource_class # The incoming query which is a set of questions. attr :query # The question that this transaction represents. attr :question # The current full response to the incoming query. attr :response # Any options or configuration associated with the given transaction. attr :options def [] key @options[key] end # The name of the question, which is typically the requested hostname. def name @question.to_s end # Shows the question name and resource class. Suitable for debugging purposes. def to_s "#{name} #{@resource_class.name}" end # Run a new query through the rules with the given name and resource type. The results of this query are appended to the current transaction's `response`. def append!(name, resource_class = nil, options = {}) Transaction.new(@server, @query, name, resource_class || @resource_class, @response, options).process end # Use the given resolver to respond to the question. Uses `passthrough` to do the lookup and merges the result. # # If a block is supplied, this function yields with the `response` message if successful. This could be used, for example, to update a cache or modify the reply. # # If recursion is not requested, the result is `fail!(:Refused)`. This check is ignored if an explicit `options[:name]` or `options[:force]` is given. # # If the resolver can't reach upstream servers, `fail!(:ServFail)` is invoked. def passthrough!(resolver, options = {}, &block) if @query.rd || options[:force] || options[:name] response = passthrough(resolver, options) if response yield response if block_given? # Recursion is available and is being used: # See issue #26 for more details. @response.ra = 1 @response.merge!(response) else fail!(:ServFail) end else fail!(:Refused) end end # Use the given resolver to respond to the question. # # A block must be supplied, and provided a valid response is received from the upstream server, this function yields with the reply and reply_name. # # If `options[:name]` is provided, this overrides the default query name sent to the upstream server. The same logic applies to `options[:resource_class]`. def passthrough(resolver, options = {}) query_name = options[:name] || name query_resource_class = options[:resource_class] || resource_class resolver.query(query_name, query_resource_class) end # Respond to the given query with a resource record. The arguments to this function depend on the `resource_class` requested. This function instantiates the resource class with the supplied arguments, and then passes it to {#append!}. # # e.g. For A records: `respond!("1.2.3.4")`, For MX records: `respond!(10, Name.create("mail.blah.com"))` # The last argument can optionally be a hash of `options`. If `options[:resource_class]` is provided, it overrides the default resource class of transaction. Additional `options` are passed to {#append!}. # # See `Resolv::DNS::Resource` for more information about the various `resource_classes` available (http://www.ruby-doc.org/stdlib/libdoc/resolv/rdoc/index.html). def respond!(*args) append_question! options = args.last.kind_of?(Hash) ? args.pop : {} resource_class = options[:resource_class] || @resource_class if resource_class == nil raise ArgumentError.new("Could not instantiate resource #{resource_class}!") end @server.logger.info "Resource class: #{resource_class.inspect}" resource = resource_class.new(*args) @server.logger.info "Resource: #{resource.inspect}" add([resource], options) end # Append a list of resources. # # By default resources are appended to the `answers` section, but this can be changed by setting `options[:section]` to either `:authority` or `:additional`. # # The time-to-live (TTL) of the resources can be specified using `options[:ttl]` and defaults to `DEFAULT_TTL`. def add(resources, options = {}) # Use the default options if provided: options = options.merge(@options) ttl = options[:ttl] || DEFAULT_TTL name = options[:name] || @question.to_s + "." section = (options[:section] || 'answer').to_sym method = "add_#{section}".to_sym resources.each do |resource| @server.logger.debug "#{method}: #{resource.inspect} #{resource.class::TypeValue} #{resource.class::ClassValue}" @response.send(method, name, ttl, resource) end end # This function indicates that there was a failure to resolve the given question. The single argument must be an integer error code, typically given by the constants in {Resolv::DNS::RCode}. # # The easiest way to use this function it to simply supply a symbol. Here is a list of the most commonly used ones: # # - `:NoError`: No error occurred. # - `:FormErr`: The incoming data was not formatted correctly. # - `:ServFail`: The operation caused a server failure (internal error, etc). # - `:NXDomain`: Non-eXistant Domain (domain record does not exist). # - `:NotImp`: The operation requested is not implemented. # - `:Refused`: The operation was refused by the server. # - `:NotAuth`: The server is not authoritive for the zone. # # See [RFC2929](http://www.rfc-editor.org/rfc/rfc2929.txt) for more information about DNS error codes (specifically, page 3). # # **This function will complete deferred transactions.** def fail!(rcode) append_question! if rcode.kind_of? Symbol @response.rcode = Resolv::DNS::RCode.const_get(rcode) else @response.rcode = rcode.to_i end end # @deprecated def failure!(*args) @server.logger.warn "failure! is deprecated, use fail! instead" fail!(*args) end # A helper method to process the transaction on the given server. Unless the transaction is deferred, it will {#succeed} on completion. def process @server.process(name, @resource_class, self) end protected # A typical response to a DNS request includes both the question and response. This helper appends the question unless it looks like the user is already managing that aspect of the response. def append_question! if @response.question.size == 0 @response.add_question(@question, @resource_class) end end end end ruby-rubydns-1.0.3/lib/rubydns/transport.rb000066400000000000000000000044511270364632400210100ustar00rootroot00000000000000# Copyright, 2009, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'stringio' require 'ipaddr' require_relative 'message' module RubyDNS def self.address_family(host) return IPAddr.new(host).family end # A helper class for processing incoming network data. class BinaryStringIO < StringIO def initialize super set_encoding("BINARY") end end module StreamTransport def self.read_chunk(socket) # The data buffer: buffer = BinaryStringIO.new # First we need to read in the length of the packet while buffer.size < 2 buffer.write socket.readpartial(1) end # Read in the length, the first two bytes: length = buffer.string.byteslice(0, 2).unpack('n')[0] # Read data until we have the amount specified: while (buffer.size - 2) < length required = (2 + length) - buffer.size # Read precisely the required amount: buffer.write socket.readpartial(required) end return buffer.string.byteslice(2, length) end def self.write_message(socket, message) write_chunk(socket, message.encode) end def self.write_chunk(socket, output_data) socket.write([output_data.bytesize].pack('n')) socket.write(output_data) return output_data.bytesize end end end ruby-rubydns-1.0.3/lib/rubydns/version.rb000066400000000000000000000022311270364632400204330ustar00rootroot00000000000000# Copyright, 2009, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. module RubyDNS VERSION = '1.0.3' end ruby-rubydns-1.0.3/rubydns.gemspec000066400000000000000000000032721270364632400172260ustar00rootroot00000000000000# -*- encoding: utf-8 -*- lib = File.expand_path('../lib', __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require 'rubydns/version' Gem::Specification.new do |spec| spec.name = "rubydns" spec.version = RubyDNS::VERSION spec.authors = ["Samuel Williams"] spec.email = ["samuel.williams@oriontransfer.co.nz"] spec.description = <<-EOF RubyDNS is a high-performance DNS server which can be easily integrated into other projects or used as a stand-alone daemon. By default it uses rule-based pattern matching. Results can be hard-coded, computed, fetched from a remote DNS server or fetched from a local cache, depending on requirements. In addition, RubyDNS includes a high-performance asynchronous DNS resolver built on top of Celluloid. This module can be used by itself in client applications without using the full RubyDNS server stack. EOF spec.summary = "An easy to use DNS server and resolver for Ruby." spec.homepage = "http://www.codeotaku.com/projects/rubydns" spec.license = "MIT" spec.files = `git ls-files`.split($/) spec.executables = spec.files.grep(%r{^bin/}).map{ |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"] spec.has_rdoc = "yard" spec.required_ruby_version = '>= 1.9.3' spec.add_dependency("celluloid", "= 0.16.0") spec.add_dependency("celluloid-io", "= 0.16.2") spec.add_dependency("timers", "~> 4.0.1") spec.add_development_dependency "bundler", "~> 1.3" spec.add_development_dependency "process-daemon", "~> 0.5.5" spec.add_development_dependency "rspec", "~> 3.2.0" spec.add_development_dependency "rake" end ruby-rubydns-1.0.3/spec/000077500000000000000000000000001270364632400151215ustar00rootroot00000000000000ruby-rubydns-1.0.3/spec/rubydns/000077500000000000000000000000001270364632400166075ustar00rootroot00000000000000ruby-rubydns-1.0.3/spec/rubydns/celluloid_bug_spec.rb000066400000000000000000000045311270364632400227620ustar00rootroot00000000000000#!/usr/bin/env ruby # Copyright, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'rubydns' module RubyDNS::CelluloidBugSpec describe RubyDNS::Resolver do context 'benchmark' do domains = %W( Facebook.com Twitter.com Google.com Youtube.com Wordpress.org Adobe.com Blogspot.com Wikipedia.org Linkedin.com Wordpress.com Yahoo.com Amazon.com Flickr.com Pinterest.com Tumblr.com W3.org Apple.com Myspace.com Vimeo.com Microsoft.com Youtu.be Qq.com Digg.com Baidu.com Stumbleupon.com Addthis.com Statcounter.com Feedburner.com TradeMe.co.nz Delicious.com Nytimes.com Reddit.com Weebly.com Bbc.co.uk Blogger.com Msn.com Macromedia.com Goo.gl Instagram.com Gov.uk Icio.us Yandex.ru Cnn.com Webs.com Google.de T.co Livejournal.com Imdb.com Mail.ru Jimdo.com ) it 'should be faster than native resolver' do Celluloid.logger.level = Logger::ERROR resolver = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]], timeout: 0.1) futures = domains.map { |domain| resolver.future.addresses_for(domain) } futures.map { |future| future.value } end end end end ruby-rubydns-1.0.3/spec/rubydns/daemon_spec.rb000077500000000000000000000062661270364632400214260ustar00rootroot00000000000000#!/usr/bin/env ruby # Copyright, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'rubydns' require 'process/daemon' class BasicTestServer < Process::Daemon SERVER_PORTS = [[:udp, '127.0.0.1', 5350], [:tcp, '127.0.0.1', 5350]] IN = Resolv::DNS::Resource::IN def working_directory File.expand_path("../tmp", __FILE__) end def startup Celluloid.boot # Start the RubyDNS server RubyDNS::run_server(:listen => SERVER_PORTS) do match("test.local", IN::A) do |transaction| transaction.respond!("192.168.1.1") end match(/foo.*/, IN::A) do |transaction| transaction.respond!("192.168.1.2") end match(/peername/, IN::A) do |transaction| transaction.respond!(transaction[:peer]) end # Default DNS handler otherwise do |transaction| transaction.fail!(:NXDomain) end end end end describe "RubyDNS Daemonized Server" do before(:all) do Celluloid.shutdown # Trying to fork with Celluloid running is a recipe for disaster. # BasicTestServer.controller output: $stderr BasicTestServer.start Celluloid.boot end after(:all) do BasicTestServer.stop end it "should resolve local domain correctly" do expect(BasicTestServer.status).to be == :running resolver = RubyDNS::Resolver.new(BasicTestServer::SERVER_PORTS, search_domain: '') response = resolver.query("test.local") answer = response.answer.first expect(answer[0].to_s).to be == "test.local." expect(answer[2].address.to_s).to be == "192.168.1.1" end it "should pattern match correctly" do expect(BasicTestServer.status).to be == :running resolver = RubyDNS::Resolver.new(BasicTestServer::SERVER_PORTS) response = resolver.query("foobar") answer = response.answer.first expect(answer[0]).to be == resolver.fully_qualified_name("foobar") expect(answer[2].address.to_s).to be == "192.168.1.2" end it "should give peer ip address" do expect(BasicTestServer.status).to be == :running resolver = RubyDNS::Resolver.new(BasicTestServer::SERVER_PORTS) response = resolver.query("peername") answer = response.answer.first expect(answer[2].address.to_s).to be == "127.0.0.1" end end ruby-rubydns-1.0.3/spec/rubydns/hosts.txt000066400000000000000000000000501270364632400205030ustar00rootroot00000000000000# A testing host: 1.2.3.4 testing applesruby-rubydns-1.0.3/spec/rubydns/injected_supervisor_spec.rb000066400000000000000000000041121270364632400242320ustar00rootroot00000000000000#!/usr/bin/env ruby # Copyright, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'rubydns' require 'rubydns/extensions/string' module RubyDNS::InjectedSupervisorSpec class TestServer < RubyDNS::RuleBasedServer def test_message 'Testing...' end end SERVER_PORTS = [[:udp, '127.0.0.1', 5520]] IN = Resolv::DNS::Resource::IN describe "RubyDNS Injected Supervisor" do before(:all) do Celluloid.shutdown Celluloid.boot # Start the RubyDNS server RubyDNS::run_server(listen: SERVER_PORTS, server_class: TestServer, asynchronous: true) do match("test_message", IN::TXT) do |transaction| transaction.respond!(*test_message.chunked) end # Default DNS handler otherwise do |transaction| transaction.fail!(:NXDomain) end end end it "should use the injected class" do resolver = RubyDNS::Resolver.new(SERVER_PORTS) response = resolver.query("test_message", IN::TXT) text = response.answer.first expect(text[2].strings.join).to be == 'Testing...' end end end ruby-rubydns-1.0.3/spec/rubydns/ipv6_spec.rb000066400000000000000000000046611270364632400210410ustar00rootroot00000000000000#!/usr/bin/env ruby # Copyright, 2014, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'rubydns' require 'rubydns/system' module RubyDNS::IPv6Spec IN = Resolv::DNS::Resource::IN describe RubyDNS::TCPSocketHandler do before(:all) do Celluloid.shutdown Celluloid.boot end it "should create server with existing TCP socket" do @server = RubyDNS::run_server(:listen => [[:tcp, '::', 2002]], asynchronous: true) do resolver = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]]) match(/.*\.com/, IN::A) do |transaction| transaction.passthrough!(resolver) end end resolver = RubyDNS::Resolver.new([[:tcp, '::1', 2002]]) response = resolver.query('google.com') expect(response.class).to be == RubyDNS::Message end end describe RubyDNS::UDPSocketHandler do before(:all) do Celluloid.shutdown Celluloid.boot end it "should create server with existing UDP socket" do @server = RubyDNS::run_server(:listen => [[:udp, '::', 2002]], asynchronous: true) do resolver = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]]) match(/.*\.com/, IN::A) do |transaction| transaction.passthrough!(resolver) end end resolver = RubyDNS::Resolver.new([[:udp, '::1', 2002]]) response = resolver.query('google.com') expect(response.class).to be == RubyDNS::Message end end end ruby-rubydns-1.0.3/spec/rubydns/message_spec.rb000077500000000000000000000042761270364632400216060ustar00rootroot00000000000000#!/usr/bin/env ruby # Copyright, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'rubydns' require 'base64' module RubyDNS::MessageSpec describe RubyDNS::Message do it "should be decoded correctly" do data = Base64.decode64(<<-EOF) HQCBgAABAAgAAAABA3d3dwV5YWhvbwNjb20AAAEAAcAMAAUAAQAAASwADwZm ZC1mcDMDd2cxAWLAEMArAAUAAQAAASwACQZkcy1mcDPAMsBGAAUAAQAAADwA FQ5kcy1hbnktZnAzLWxmYgN3YTHANsBbAAUAAQAAASwAEg9kcy1hbnktZnAz LXJlYWzAasB8AAEAAQAAADwABGKK/B7AfAABAAEAAAA8AARii7SVwHwAAQAB AAAAPAAEYou3GMB8AAEAAQAAADwABGKK/W0AACkQAAAAAAAAAA== EOF message = RubyDNS::decode_message(data) expect(message.class).to be == RubyDNS::Message expect(message.id).to be == 0x1d00 expect(message.question.count).to be == 1 expect(message.answer.count).to be == 8 expect(message.authority.count).to be == 0 expect(message.additional.count).to be == 1 end it "should fail to decode due to bad AAAA length" do data = Base64.decode64(<<-EOF) 6p6BgAABAAEAAAABCGJhaWNhaWNuA2NvbQAAHAABwAwAHAABAAABHgAEMhd7 dwAAKRAAAAAAAAAA EOF expect{RubyDNS::decode_message(data)}.to raise_error(RubyDNS::DecodeError) end end end ruby-rubydns-1.0.3/spec/rubydns/origin_spec.rb000066400000000000000000000071101270364632400214340ustar00rootroot00000000000000#!/usr/bin/env rspec # Copyright, 2014, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'rubydns' module RubyDNS::OriginSpec describe RubyDNS::Resolver do it "should generate fully qualified domain name with specified origin" do resolver = RubyDNS::Resolver.new([], origin: "foo.bar.") fully_qualified_name = resolver.fully_qualified_name("baz") expect(fully_qualified_name).to be_absolute expect(fully_qualified_name.to_s).to be == "baz.foo.bar." end end describe Resolv::DNS::Name do let(:name) {Resolv::DNS::Name.create("foo.bar")} it "should be relative" do expect(name).to_not be_absolute expect(name.to_s).to be == "foo.bar" end it "should add the specified origin" do fully_qualified_name = name.with_origin("org") expect(fully_qualified_name.to_a.size).to be 3 expect(fully_qualified_name).to be_absolute expect(fully_qualified_name.to_s).to be == "foo.bar.org." end it "should handle nil origin as absolute" do fully_qualified_name = name.with_origin(nil) expect(fully_qualified_name.to_a.size).to be 2 expect(fully_qualified_name).to be_absolute expect(fully_qualified_name.to_s).to be == "foo.bar." end it "should handle empty origin as absolute" do fully_qualified_name = name.with_origin('') expect(fully_qualified_name.to_a.size).to be 2 expect(fully_qualified_name).to be_absolute expect(fully_qualified_name.to_s).to be == "foo.bar." end end describe Resolv::DNS::Name do let(:name) {Resolv::DNS::Name.create("foo.bar.")} it "should be absolute" do expect(name).to be_absolute expect(name.to_s).to be == "foo.bar." end it "should remove the specified origin" do relative_name = name.without_origin("bar") expect(relative_name.to_a.size).to be 1 expect(relative_name).to_not be_absolute expect(relative_name.to_s).to be == "foo" end it "should not remove nil origin but become relative" do relative_name = name.without_origin(nil) expect(relative_name.to_a.size).to be 2 expect(relative_name).to_not be_absolute expect(relative_name.to_s).to be == "foo.bar" end it "should not remove empty string origin but become relative" do relative_name = name.without_origin('') expect(relative_name.to_a.size).to be 2 expect(relative_name).to_not be_absolute expect(relative_name.to_s).to be == "foo.bar" end it "should not raise an exception when origin isn't valid" do expect{name.without_origin('bob')}.to raise_exception(Resolv::DNS::OriginError) end end end ruby-rubydns-1.0.3/spec/rubydns/passthrough_spec.rb000077500000000000000000000051401270364632400225200ustar00rootroot00000000000000#!/usr/bin/env ruby # Copyright, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'rubydns' module RubyDNS::PassthroughSpec SERVER_PORTS = [[:udp, '127.0.0.1', 5340], [:tcp, '127.0.0.1', 5340]] Name = Resolv::DNS::Name IN = Resolv::DNS::Resource::IN describe "RubyDNS Passthrough Server" do before(:all) do Celluloid.shutdown Celluloid.boot # Start the RubyDNS server @server = RubyDNS::run_server(:listen => SERVER_PORTS, asynchronous: true) do resolver = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]]) match(/.*\.com/, IN::A) do |transaction| transaction.passthrough!(resolver) end match(/a-(.*\.org)/) do |transaction, match_data| transaction.passthrough!(resolver, :name => match_data[1]) end # Default DNS handler otherwise do |transaction| transaction.fail!(:NXDomain) end end end it "should resolve domain correctly" do resolver = RubyDNS::Resolver.new(SERVER_PORTS) response = resolver.query("google.com") expect(response.ra).to be == 1 answer = response.answer.first expect(answer).not_to be == nil expect(answer.count).to be > 0 addresses = answer.select {|record| record.kind_of? Resolv::DNS::Resource::IN::A} expect(addresses.size).to be > 0 end it "should resolve prefixed domain correctly" do resolver = RubyDNS::Resolver.new(SERVER_PORTS) response = resolver.query("a-slashdot.org") answer = response.answer.first expect(answer).not_to be == nil expect(answer.count).to be > 0 end end end ruby-rubydns-1.0.3/spec/rubydns/resolver_performance_spec.rb000077500000000000000000000053371270364632400244030ustar00rootroot00000000000000#!/usr/bin/env ruby # Copyright, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'rubydns' module RubyDNS::ResolverPerformanceSpec describe RubyDNS::Resolver do context 'benchmark' do domains = %W{ Facebook.com Twitter.com Google.com Youtube.com Wordpress.org Adobe.com Blogspot.com Wikipedia.org Linkedin.com Wordpress.com Yahoo.com Amazon.com Flickr.com Pinterest.com Tumblr.com W3.org Apple.com Myspace.com Vimeo.com Microsoft.com Youtu.be Qq.com Digg.com Baidu.com Stumbleupon.com Addthis.com Statcounter.com Feedburner.com TradeMe.co.nz Delicious.com Nytimes.com Reddit.com Weebly.com Bbc.co.uk Blogger.com Msn.com Macromedia.com Goo.gl Instagram.com Gov.uk Icio.us Yandex.ru Cnn.com Webs.com Google.de T.co Livejournal.com Imdb.com Mail.ru Jimdo.com } before do require 'benchmark' end it 'should be faster than native resolver' do Celluloid.logger.level = Logger::ERROR Benchmark.bm(20) do |x| a = x.report("RubyDNS::Resolver") do resolver = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]]) futures = domains.collect{|domain| resolver.future.addresses_for(domain)} futures.collect{|future| future.value} end b = x.report("Resolv::DNS") do resolver = Resolv::DNS.new(:nameserver => "8.8.8.8") resolved = domains.collect do |domain| [domain, resolver.getaddresses(domain)] end end expect(a.real).to be < b.real end end end end end ruby-rubydns-1.0.3/spec/rubydns/resolver_spec.rb000077500000000000000000000100011270364632400220020ustar00rootroot00000000000000#!/usr/bin/env rspec # Copyright, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'rubydns' module RubyDNS::ResolverSpec describe RubyDNS::Resolver do class JunkUDPServer include Celluloid::IO def initialize @socket = UDPSocket.new @socket.bind("0.0.0.0", 6060) async.run end finalizer :shutdown def finalize @socket.close if @socket end def run data, (_, port, host) = @socket.recvfrom(1024, 0) @socket.send("Foobar", 0, host, port) end end class JunkTCPServer include Celluloid::IO def initialize @socket = TCPServer.new("0.0.0.0", 6060) async.run end finalizer :shutdown def finalize @socket.close if @socket end def run # @logger.debug "Waiting for incoming TCP connections #{@socket.inspect}..." loop { async.handle_connection @socket.accept } end def handle_connection(socket) socket.write("\0\0obar") ensure socket.close end end before(:all) do Celluloid.shutdown Celluloid.boot JunkUDPServer.supervise JunkTCPServer.supervise end it "should result in non-existent domain" do resolver = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]]) response = resolver.query('foobar.oriontransfer.org') expect(response.rcode).to be == Resolv::DNS::RCode::NXDomain end it "should result in some answers" do resolver = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]]) response = resolver.query('google.com') expect(response.class).to be == RubyDNS::Message expect(response.answer.size).to be > 0 end it "should return no results" do resolver = RubyDNS::Resolver.new([]) response = resolver.query('google.com') expect(response).to be == nil end it "should fail to get addresses" do resolver = RubyDNS::Resolver.new([]) expect{resolver.addresses_for('google.com')}.to raise_error(RubyDNS::ResolutionFailure) end it "should fail with decode error from bad udp server" do resolver = RubyDNS::Resolver.new([[:udp, "0.0.0.0", 6060]]) response = resolver.query('google.com') expect(response).to be == nil end it "should fail with decode error from bad tcp server" do resolver = RubyDNS::Resolver.new([[:tcp, "0.0.0.0", 6060]]) response = resolver.query('google.com') expect(response).to be == nil end it "should return some IPv4 and IPv6 addresses" do resolver = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]]) addresses = resolver.addresses_for("www.google.com.") expect(addresses.size).to be > 0 addresses.each do |address| expect(address).to be_kind_of(Resolv::IPv4) | be_kind_of(Resolv::IPv6) end end it "should recursively resolve CNAME records" do resolver = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]]) addresses = resolver.addresses_for('www.baidu.com') expect(addresses.size).to be > 0 end end end ruby-rubydns-1.0.3/spec/rubydns/rules_spec.rb000077500000000000000000000055131270364632400213070ustar00rootroot00000000000000#!/usr/bin/env ruby # Copyright, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'rubydns' module RubyDNS::RulesSpec describe RubyDNS::RuleBasedServer do IN = Resolv::DNS::Resource::IN true_callback = Proc.new { true } it "should match string patterns correctly" do server = double(:logger => Logger.new("/dev/null")) transaction = double(:query => Resolv::DNS::Message.new(0)) rule = RubyDNS::RuleBasedServer::Rule.new(["foobar", IN::A], true_callback) expect(rule.call(server, "foobar", IN::A, transaction)).to be == true expect(rule.call(server, "barfoo", IN::A, transaction)).to be == false expect(rule.call(server, "foobar", IN::TXT, transaction)).to be == false end it "should match regular expression patterns correctly" do server = double(:logger => Logger.new("/dev/null")) transaction = double(:query => Resolv::DNS::Message.new(0)) rule = RubyDNS::RuleBasedServer::Rule.new([/foo/, IN::A], true_callback) expect(rule.call(server, "foobar", IN::A, transaction)).to be == true expect(rule.call(server, "barbaz", IN::A, transaction)).to be == false expect(rule.call(server, "foobar", IN::TXT, transaction)).to be == false end it "should match callback patterns correctly" do server = double(:logger => Logger.new("/dev/null")) transaction = double(:query => Resolv::DNS::Message.new(0)) calls = 0 callback = Proc.new do |name, resource_class| # A counter used to check the number of times this block was invoked. calls += 1 name.size == 6 end rule = RubyDNS::RuleBasedServer::Rule.new([callback], true_callback) expect(rule.call(server, "foobar", IN::A, transaction)).to be == true expect(rule.call(server, "foobarbaz", IN::A, transaction)).to be == false expect(calls).to be == 2 end end end ruby-rubydns-1.0.3/spec/rubydns/server/000077500000000000000000000000001270364632400201155ustar00rootroot00000000000000ruby-rubydns-1.0.3/spec/rubydns/server/bind9/000077500000000000000000000000001270364632400211225ustar00rootroot00000000000000ruby-rubydns-1.0.3/spec/rubydns/server/bind9/generate-local.rb000077500000000000000000000011351270364632400243340ustar00rootroot00000000000000#!/usr/bin/env ruby File.open("local.zone", "w") do |f| f.write(DATA.read) (1..5_000).each do |i| f.puts "domain#{i} IN A #{69}.#{(i >> 16)%256}.#{(i >> 8)%256}.#{i%256}" end end __END__ ; ; BIND data file for local loopback interface ; $TTL 604800 @ IN SOA ns.local. postmaster.localhost ( 2 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; local. IN NS ns.local. ns.local. IN A 127.0.0.1 ruby-rubydns-1.0.3/spec/rubydns/server/bind9/local.zone000066400000000000000000004066211270364632400231220ustar00rootroot00000000000000; ; BIND data file for local loopback interface ; $TTL 604800 @ IN SOA ns.local. postmaster.localhost ( 2 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; local. IN NS ns.local. ns.local. IN A 127.0.0.1 domain1 IN A 69.0.0.1 domain2 IN A 69.0.0.2 domain3 IN A 69.0.0.3 domain4 IN A 69.0.0.4 domain5 IN A 69.0.0.5 domain6 IN A 69.0.0.6 domain7 IN A 69.0.0.7 domain8 IN A 69.0.0.8 domain9 IN A 69.0.0.9 domain10 IN A 69.0.0.10 domain11 IN A 69.0.0.11 domain12 IN A 69.0.0.12 domain13 IN A 69.0.0.13 domain14 IN A 69.0.0.14 domain15 IN A 69.0.0.15 domain16 IN A 69.0.0.16 domain17 IN A 69.0.0.17 domain18 IN A 69.0.0.18 domain19 IN A 69.0.0.19 domain20 IN A 69.0.0.20 domain21 IN A 69.0.0.21 domain22 IN A 69.0.0.22 domain23 IN A 69.0.0.23 domain24 IN A 69.0.0.24 domain25 IN A 69.0.0.25 domain26 IN A 69.0.0.26 domain27 IN A 69.0.0.27 domain28 IN A 69.0.0.28 domain29 IN A 69.0.0.29 domain30 IN A 69.0.0.30 domain31 IN A 69.0.0.31 domain32 IN A 69.0.0.32 domain33 IN A 69.0.0.33 domain34 IN A 69.0.0.34 domain35 IN A 69.0.0.35 domain36 IN A 69.0.0.36 domain37 IN A 69.0.0.37 domain38 IN A 69.0.0.38 domain39 IN A 69.0.0.39 domain40 IN A 69.0.0.40 domain41 IN A 69.0.0.41 domain42 IN A 69.0.0.42 domain43 IN A 69.0.0.43 domain44 IN A 69.0.0.44 domain45 IN A 69.0.0.45 domain46 IN A 69.0.0.46 domain47 IN A 69.0.0.47 domain48 IN A 69.0.0.48 domain49 IN A 69.0.0.49 domain50 IN A 69.0.0.50 domain51 IN A 69.0.0.51 domain52 IN A 69.0.0.52 domain53 IN A 69.0.0.53 domain54 IN A 69.0.0.54 domain55 IN A 69.0.0.55 domain56 IN A 69.0.0.56 domain57 IN A 69.0.0.57 domain58 IN A 69.0.0.58 domain59 IN A 69.0.0.59 domain60 IN A 69.0.0.60 domain61 IN A 69.0.0.61 domain62 IN A 69.0.0.62 domain63 IN A 69.0.0.63 domain64 IN A 69.0.0.64 domain65 IN A 69.0.0.65 domain66 IN A 69.0.0.66 domain67 IN A 69.0.0.67 domain68 IN A 69.0.0.68 domain69 IN A 69.0.0.69 domain70 IN A 69.0.0.70 domain71 IN A 69.0.0.71 domain72 IN A 69.0.0.72 domain73 IN A 69.0.0.73 domain74 IN A 69.0.0.74 domain75 IN A 69.0.0.75 domain76 IN A 69.0.0.76 domain77 IN A 69.0.0.77 domain78 IN A 69.0.0.78 domain79 IN A 69.0.0.79 domain80 IN A 69.0.0.80 domain81 IN A 69.0.0.81 domain82 IN A 69.0.0.82 domain83 IN A 69.0.0.83 domain84 IN A 69.0.0.84 domain85 IN A 69.0.0.85 domain86 IN A 69.0.0.86 domain87 IN A 69.0.0.87 domain88 IN A 69.0.0.88 domain89 IN A 69.0.0.89 domain90 IN A 69.0.0.90 domain91 IN A 69.0.0.91 domain92 IN A 69.0.0.92 domain93 IN A 69.0.0.93 domain94 IN A 69.0.0.94 domain95 IN A 69.0.0.95 domain96 IN A 69.0.0.96 domain97 IN A 69.0.0.97 domain98 IN A 69.0.0.98 domain99 IN A 69.0.0.99 domain100 IN A 69.0.0.100 domain101 IN A 69.0.0.101 domain102 IN A 69.0.0.102 domain103 IN A 69.0.0.103 domain104 IN A 69.0.0.104 domain105 IN A 69.0.0.105 domain106 IN A 69.0.0.106 domain107 IN A 69.0.0.107 domain108 IN A 69.0.0.108 domain109 IN A 69.0.0.109 domain110 IN A 69.0.0.110 domain111 IN A 69.0.0.111 domain112 IN A 69.0.0.112 domain113 IN A 69.0.0.113 domain114 IN A 69.0.0.114 domain115 IN A 69.0.0.115 domain116 IN A 69.0.0.116 domain117 IN A 69.0.0.117 domain118 IN A 69.0.0.118 domain119 IN A 69.0.0.119 domain120 IN A 69.0.0.120 domain121 IN A 69.0.0.121 domain122 IN A 69.0.0.122 domain123 IN A 69.0.0.123 domain124 IN A 69.0.0.124 domain125 IN A 69.0.0.125 domain126 IN A 69.0.0.126 domain127 IN A 69.0.0.127 domain128 IN A 69.0.0.128 domain129 IN A 69.0.0.129 domain130 IN A 69.0.0.130 domain131 IN A 69.0.0.131 domain132 IN A 69.0.0.132 domain133 IN A 69.0.0.133 domain134 IN A 69.0.0.134 domain135 IN A 69.0.0.135 domain136 IN A 69.0.0.136 domain137 IN A 69.0.0.137 domain138 IN A 69.0.0.138 domain139 IN A 69.0.0.139 domain140 IN A 69.0.0.140 domain141 IN A 69.0.0.141 domain142 IN A 69.0.0.142 domain143 IN A 69.0.0.143 domain144 IN A 69.0.0.144 domain145 IN A 69.0.0.145 domain146 IN A 69.0.0.146 domain147 IN A 69.0.0.147 domain148 IN A 69.0.0.148 domain149 IN A 69.0.0.149 domain150 IN A 69.0.0.150 domain151 IN A 69.0.0.151 domain152 IN A 69.0.0.152 domain153 IN A 69.0.0.153 domain154 IN A 69.0.0.154 domain155 IN A 69.0.0.155 domain156 IN A 69.0.0.156 domain157 IN A 69.0.0.157 domain158 IN A 69.0.0.158 domain159 IN A 69.0.0.159 domain160 IN A 69.0.0.160 domain161 IN A 69.0.0.161 domain162 IN A 69.0.0.162 domain163 IN A 69.0.0.163 domain164 IN A 69.0.0.164 domain165 IN A 69.0.0.165 domain166 IN A 69.0.0.166 domain167 IN A 69.0.0.167 domain168 IN A 69.0.0.168 domain169 IN A 69.0.0.169 domain170 IN A 69.0.0.170 domain171 IN A 69.0.0.171 domain172 IN A 69.0.0.172 domain173 IN A 69.0.0.173 domain174 IN A 69.0.0.174 domain175 IN A 69.0.0.175 domain176 IN A 69.0.0.176 domain177 IN A 69.0.0.177 domain178 IN A 69.0.0.178 domain179 IN A 69.0.0.179 domain180 IN A 69.0.0.180 domain181 IN A 69.0.0.181 domain182 IN A 69.0.0.182 domain183 IN A 69.0.0.183 domain184 IN A 69.0.0.184 domain185 IN A 69.0.0.185 domain186 IN A 69.0.0.186 domain187 IN A 69.0.0.187 domain188 IN A 69.0.0.188 domain189 IN A 69.0.0.189 domain190 IN A 69.0.0.190 domain191 IN A 69.0.0.191 domain192 IN A 69.0.0.192 domain193 IN A 69.0.0.193 domain194 IN A 69.0.0.194 domain195 IN A 69.0.0.195 domain196 IN A 69.0.0.196 domain197 IN A 69.0.0.197 domain198 IN A 69.0.0.198 domain199 IN A 69.0.0.199 domain200 IN A 69.0.0.200 domain201 IN A 69.0.0.201 domain202 IN A 69.0.0.202 domain203 IN A 69.0.0.203 domain204 IN A 69.0.0.204 domain205 IN A 69.0.0.205 domain206 IN A 69.0.0.206 domain207 IN A 69.0.0.207 domain208 IN A 69.0.0.208 domain209 IN A 69.0.0.209 domain210 IN A 69.0.0.210 domain211 IN A 69.0.0.211 domain212 IN A 69.0.0.212 domain213 IN A 69.0.0.213 domain214 IN A 69.0.0.214 domain215 IN A 69.0.0.215 domain216 IN A 69.0.0.216 domain217 IN A 69.0.0.217 domain218 IN A 69.0.0.218 domain219 IN A 69.0.0.219 domain220 IN A 69.0.0.220 domain221 IN A 69.0.0.221 domain222 IN A 69.0.0.222 domain223 IN A 69.0.0.223 domain224 IN A 69.0.0.224 domain225 IN A 69.0.0.225 domain226 IN A 69.0.0.226 domain227 IN A 69.0.0.227 domain228 IN A 69.0.0.228 domain229 IN A 69.0.0.229 domain230 IN A 69.0.0.230 domain231 IN A 69.0.0.231 domain232 IN A 69.0.0.232 domain233 IN A 69.0.0.233 domain234 IN A 69.0.0.234 domain235 IN A 69.0.0.235 domain236 IN A 69.0.0.236 domain237 IN A 69.0.0.237 domain238 IN A 69.0.0.238 domain239 IN A 69.0.0.239 domain240 IN A 69.0.0.240 domain241 IN A 69.0.0.241 domain242 IN A 69.0.0.242 domain243 IN A 69.0.0.243 domain244 IN A 69.0.0.244 domain245 IN A 69.0.0.245 domain246 IN A 69.0.0.246 domain247 IN A 69.0.0.247 domain248 IN A 69.0.0.248 domain249 IN A 69.0.0.249 domain250 IN A 69.0.0.250 domain251 IN A 69.0.0.251 domain252 IN A 69.0.0.252 domain253 IN A 69.0.0.253 domain254 IN A 69.0.0.254 domain255 IN A 69.0.0.255 domain256 IN A 69.0.1.0 domain257 IN A 69.0.1.1 domain258 IN A 69.0.1.2 domain259 IN A 69.0.1.3 domain260 IN A 69.0.1.4 domain261 IN A 69.0.1.5 domain262 IN A 69.0.1.6 domain263 IN A 69.0.1.7 domain264 IN A 69.0.1.8 domain265 IN A 69.0.1.9 domain266 IN A 69.0.1.10 domain267 IN A 69.0.1.11 domain268 IN A 69.0.1.12 domain269 IN A 69.0.1.13 domain270 IN A 69.0.1.14 domain271 IN A 69.0.1.15 domain272 IN A 69.0.1.16 domain273 IN A 69.0.1.17 domain274 IN A 69.0.1.18 domain275 IN A 69.0.1.19 domain276 IN A 69.0.1.20 domain277 IN A 69.0.1.21 domain278 IN A 69.0.1.22 domain279 IN A 69.0.1.23 domain280 IN A 69.0.1.24 domain281 IN A 69.0.1.25 domain282 IN A 69.0.1.26 domain283 IN A 69.0.1.27 domain284 IN A 69.0.1.28 domain285 IN A 69.0.1.29 domain286 IN A 69.0.1.30 domain287 IN A 69.0.1.31 domain288 IN A 69.0.1.32 domain289 IN A 69.0.1.33 domain290 IN A 69.0.1.34 domain291 IN A 69.0.1.35 domain292 IN A 69.0.1.36 domain293 IN A 69.0.1.37 domain294 IN A 69.0.1.38 domain295 IN A 69.0.1.39 domain296 IN A 69.0.1.40 domain297 IN A 69.0.1.41 domain298 IN A 69.0.1.42 domain299 IN A 69.0.1.43 domain300 IN A 69.0.1.44 domain301 IN A 69.0.1.45 domain302 IN A 69.0.1.46 domain303 IN A 69.0.1.47 domain304 IN A 69.0.1.48 domain305 IN A 69.0.1.49 domain306 IN A 69.0.1.50 domain307 IN A 69.0.1.51 domain308 IN A 69.0.1.52 domain309 IN A 69.0.1.53 domain310 IN A 69.0.1.54 domain311 IN A 69.0.1.55 domain312 IN A 69.0.1.56 domain313 IN A 69.0.1.57 domain314 IN A 69.0.1.58 domain315 IN A 69.0.1.59 domain316 IN A 69.0.1.60 domain317 IN A 69.0.1.61 domain318 IN A 69.0.1.62 domain319 IN A 69.0.1.63 domain320 IN A 69.0.1.64 domain321 IN A 69.0.1.65 domain322 IN A 69.0.1.66 domain323 IN A 69.0.1.67 domain324 IN A 69.0.1.68 domain325 IN A 69.0.1.69 domain326 IN A 69.0.1.70 domain327 IN A 69.0.1.71 domain328 IN A 69.0.1.72 domain329 IN A 69.0.1.73 domain330 IN A 69.0.1.74 domain331 IN A 69.0.1.75 domain332 IN A 69.0.1.76 domain333 IN A 69.0.1.77 domain334 IN A 69.0.1.78 domain335 IN A 69.0.1.79 domain336 IN A 69.0.1.80 domain337 IN A 69.0.1.81 domain338 IN A 69.0.1.82 domain339 IN A 69.0.1.83 domain340 IN A 69.0.1.84 domain341 IN A 69.0.1.85 domain342 IN A 69.0.1.86 domain343 IN A 69.0.1.87 domain344 IN A 69.0.1.88 domain345 IN A 69.0.1.89 domain346 IN A 69.0.1.90 domain347 IN A 69.0.1.91 domain348 IN A 69.0.1.92 domain349 IN A 69.0.1.93 domain350 IN A 69.0.1.94 domain351 IN A 69.0.1.95 domain352 IN A 69.0.1.96 domain353 IN A 69.0.1.97 domain354 IN A 69.0.1.98 domain355 IN A 69.0.1.99 domain356 IN A 69.0.1.100 domain357 IN A 69.0.1.101 domain358 IN A 69.0.1.102 domain359 IN A 69.0.1.103 domain360 IN A 69.0.1.104 domain361 IN A 69.0.1.105 domain362 IN A 69.0.1.106 domain363 IN A 69.0.1.107 domain364 IN A 69.0.1.108 domain365 IN A 69.0.1.109 domain366 IN A 69.0.1.110 domain367 IN A 69.0.1.111 domain368 IN A 69.0.1.112 domain369 IN A 69.0.1.113 domain370 IN A 69.0.1.114 domain371 IN A 69.0.1.115 domain372 IN A 69.0.1.116 domain373 IN A 69.0.1.117 domain374 IN A 69.0.1.118 domain375 IN A 69.0.1.119 domain376 IN A 69.0.1.120 domain377 IN A 69.0.1.121 domain378 IN A 69.0.1.122 domain379 IN A 69.0.1.123 domain380 IN A 69.0.1.124 domain381 IN A 69.0.1.125 domain382 IN A 69.0.1.126 domain383 IN A 69.0.1.127 domain384 IN A 69.0.1.128 domain385 IN A 69.0.1.129 domain386 IN A 69.0.1.130 domain387 IN A 69.0.1.131 domain388 IN A 69.0.1.132 domain389 IN A 69.0.1.133 domain390 IN A 69.0.1.134 domain391 IN A 69.0.1.135 domain392 IN A 69.0.1.136 domain393 IN A 69.0.1.137 domain394 IN A 69.0.1.138 domain395 IN A 69.0.1.139 domain396 IN A 69.0.1.140 domain397 IN A 69.0.1.141 domain398 IN A 69.0.1.142 domain399 IN A 69.0.1.143 domain400 IN A 69.0.1.144 domain401 IN A 69.0.1.145 domain402 IN A 69.0.1.146 domain403 IN A 69.0.1.147 domain404 IN A 69.0.1.148 domain405 IN A 69.0.1.149 domain406 IN A 69.0.1.150 domain407 IN A 69.0.1.151 domain408 IN A 69.0.1.152 domain409 IN A 69.0.1.153 domain410 IN A 69.0.1.154 domain411 IN A 69.0.1.155 domain412 IN A 69.0.1.156 domain413 IN A 69.0.1.157 domain414 IN A 69.0.1.158 domain415 IN A 69.0.1.159 domain416 IN A 69.0.1.160 domain417 IN A 69.0.1.161 domain418 IN A 69.0.1.162 domain419 IN A 69.0.1.163 domain420 IN A 69.0.1.164 domain421 IN A 69.0.1.165 domain422 IN A 69.0.1.166 domain423 IN A 69.0.1.167 domain424 IN A 69.0.1.168 domain425 IN A 69.0.1.169 domain426 IN A 69.0.1.170 domain427 IN A 69.0.1.171 domain428 IN A 69.0.1.172 domain429 IN A 69.0.1.173 domain430 IN A 69.0.1.174 domain431 IN A 69.0.1.175 domain432 IN A 69.0.1.176 domain433 IN A 69.0.1.177 domain434 IN A 69.0.1.178 domain435 IN A 69.0.1.179 domain436 IN A 69.0.1.180 domain437 IN A 69.0.1.181 domain438 IN A 69.0.1.182 domain439 IN A 69.0.1.183 domain440 IN A 69.0.1.184 domain441 IN A 69.0.1.185 domain442 IN A 69.0.1.186 domain443 IN A 69.0.1.187 domain444 IN A 69.0.1.188 domain445 IN A 69.0.1.189 domain446 IN A 69.0.1.190 domain447 IN A 69.0.1.191 domain448 IN A 69.0.1.192 domain449 IN A 69.0.1.193 domain450 IN A 69.0.1.194 domain451 IN A 69.0.1.195 domain452 IN A 69.0.1.196 domain453 IN A 69.0.1.197 domain454 IN A 69.0.1.198 domain455 IN A 69.0.1.199 domain456 IN A 69.0.1.200 domain457 IN A 69.0.1.201 domain458 IN A 69.0.1.202 domain459 IN A 69.0.1.203 domain460 IN A 69.0.1.204 domain461 IN A 69.0.1.205 domain462 IN A 69.0.1.206 domain463 IN A 69.0.1.207 domain464 IN A 69.0.1.208 domain465 IN A 69.0.1.209 domain466 IN A 69.0.1.210 domain467 IN A 69.0.1.211 domain468 IN A 69.0.1.212 domain469 IN A 69.0.1.213 domain470 IN A 69.0.1.214 domain471 IN A 69.0.1.215 domain472 IN A 69.0.1.216 domain473 IN A 69.0.1.217 domain474 IN A 69.0.1.218 domain475 IN A 69.0.1.219 domain476 IN A 69.0.1.220 domain477 IN A 69.0.1.221 domain478 IN A 69.0.1.222 domain479 IN A 69.0.1.223 domain480 IN A 69.0.1.224 domain481 IN A 69.0.1.225 domain482 IN A 69.0.1.226 domain483 IN A 69.0.1.227 domain484 IN A 69.0.1.228 domain485 IN A 69.0.1.229 domain486 IN A 69.0.1.230 domain487 IN A 69.0.1.231 domain488 IN A 69.0.1.232 domain489 IN A 69.0.1.233 domain490 IN A 69.0.1.234 domain491 IN A 69.0.1.235 domain492 IN A 69.0.1.236 domain493 IN A 69.0.1.237 domain494 IN A 69.0.1.238 domain495 IN A 69.0.1.239 domain496 IN A 69.0.1.240 domain497 IN A 69.0.1.241 domain498 IN A 69.0.1.242 domain499 IN A 69.0.1.243 domain500 IN A 69.0.1.244 domain501 IN A 69.0.1.245 domain502 IN A 69.0.1.246 domain503 IN A 69.0.1.247 domain504 IN A 69.0.1.248 domain505 IN A 69.0.1.249 domain506 IN A 69.0.1.250 domain507 IN A 69.0.1.251 domain508 IN A 69.0.1.252 domain509 IN A 69.0.1.253 domain510 IN A 69.0.1.254 domain511 IN A 69.0.1.255 domain512 IN A 69.0.2.0 domain513 IN A 69.0.2.1 domain514 IN A 69.0.2.2 domain515 IN A 69.0.2.3 domain516 IN A 69.0.2.4 domain517 IN A 69.0.2.5 domain518 IN A 69.0.2.6 domain519 IN A 69.0.2.7 domain520 IN A 69.0.2.8 domain521 IN A 69.0.2.9 domain522 IN A 69.0.2.10 domain523 IN A 69.0.2.11 domain524 IN A 69.0.2.12 domain525 IN A 69.0.2.13 domain526 IN A 69.0.2.14 domain527 IN A 69.0.2.15 domain528 IN A 69.0.2.16 domain529 IN A 69.0.2.17 domain530 IN A 69.0.2.18 domain531 IN A 69.0.2.19 domain532 IN A 69.0.2.20 domain533 IN A 69.0.2.21 domain534 IN A 69.0.2.22 domain535 IN A 69.0.2.23 domain536 IN A 69.0.2.24 domain537 IN A 69.0.2.25 domain538 IN A 69.0.2.26 domain539 IN A 69.0.2.27 domain540 IN A 69.0.2.28 domain541 IN A 69.0.2.29 domain542 IN A 69.0.2.30 domain543 IN A 69.0.2.31 domain544 IN A 69.0.2.32 domain545 IN A 69.0.2.33 domain546 IN A 69.0.2.34 domain547 IN A 69.0.2.35 domain548 IN A 69.0.2.36 domain549 IN A 69.0.2.37 domain550 IN A 69.0.2.38 domain551 IN A 69.0.2.39 domain552 IN A 69.0.2.40 domain553 IN A 69.0.2.41 domain554 IN A 69.0.2.42 domain555 IN A 69.0.2.43 domain556 IN A 69.0.2.44 domain557 IN A 69.0.2.45 domain558 IN A 69.0.2.46 domain559 IN A 69.0.2.47 domain560 IN A 69.0.2.48 domain561 IN A 69.0.2.49 domain562 IN A 69.0.2.50 domain563 IN A 69.0.2.51 domain564 IN A 69.0.2.52 domain565 IN A 69.0.2.53 domain566 IN A 69.0.2.54 domain567 IN A 69.0.2.55 domain568 IN A 69.0.2.56 domain569 IN A 69.0.2.57 domain570 IN A 69.0.2.58 domain571 IN A 69.0.2.59 domain572 IN A 69.0.2.60 domain573 IN A 69.0.2.61 domain574 IN A 69.0.2.62 domain575 IN A 69.0.2.63 domain576 IN A 69.0.2.64 domain577 IN A 69.0.2.65 domain578 IN A 69.0.2.66 domain579 IN A 69.0.2.67 domain580 IN A 69.0.2.68 domain581 IN A 69.0.2.69 domain582 IN A 69.0.2.70 domain583 IN A 69.0.2.71 domain584 IN A 69.0.2.72 domain585 IN A 69.0.2.73 domain586 IN A 69.0.2.74 domain587 IN A 69.0.2.75 domain588 IN A 69.0.2.76 domain589 IN A 69.0.2.77 domain590 IN A 69.0.2.78 domain591 IN A 69.0.2.79 domain592 IN A 69.0.2.80 domain593 IN A 69.0.2.81 domain594 IN A 69.0.2.82 domain595 IN A 69.0.2.83 domain596 IN A 69.0.2.84 domain597 IN A 69.0.2.85 domain598 IN A 69.0.2.86 domain599 IN A 69.0.2.87 domain600 IN A 69.0.2.88 domain601 IN A 69.0.2.89 domain602 IN A 69.0.2.90 domain603 IN A 69.0.2.91 domain604 IN A 69.0.2.92 domain605 IN A 69.0.2.93 domain606 IN A 69.0.2.94 domain607 IN A 69.0.2.95 domain608 IN A 69.0.2.96 domain609 IN A 69.0.2.97 domain610 IN A 69.0.2.98 domain611 IN A 69.0.2.99 domain612 IN A 69.0.2.100 domain613 IN A 69.0.2.101 domain614 IN A 69.0.2.102 domain615 IN A 69.0.2.103 domain616 IN A 69.0.2.104 domain617 IN A 69.0.2.105 domain618 IN A 69.0.2.106 domain619 IN A 69.0.2.107 domain620 IN A 69.0.2.108 domain621 IN A 69.0.2.109 domain622 IN A 69.0.2.110 domain623 IN A 69.0.2.111 domain624 IN A 69.0.2.112 domain625 IN A 69.0.2.113 domain626 IN A 69.0.2.114 domain627 IN A 69.0.2.115 domain628 IN A 69.0.2.116 domain629 IN A 69.0.2.117 domain630 IN A 69.0.2.118 domain631 IN A 69.0.2.119 domain632 IN A 69.0.2.120 domain633 IN A 69.0.2.121 domain634 IN A 69.0.2.122 domain635 IN A 69.0.2.123 domain636 IN A 69.0.2.124 domain637 IN A 69.0.2.125 domain638 IN A 69.0.2.126 domain639 IN A 69.0.2.127 domain640 IN A 69.0.2.128 domain641 IN A 69.0.2.129 domain642 IN A 69.0.2.130 domain643 IN A 69.0.2.131 domain644 IN A 69.0.2.132 domain645 IN A 69.0.2.133 domain646 IN A 69.0.2.134 domain647 IN A 69.0.2.135 domain648 IN A 69.0.2.136 domain649 IN A 69.0.2.137 domain650 IN A 69.0.2.138 domain651 IN A 69.0.2.139 domain652 IN A 69.0.2.140 domain653 IN A 69.0.2.141 domain654 IN A 69.0.2.142 domain655 IN A 69.0.2.143 domain656 IN A 69.0.2.144 domain657 IN A 69.0.2.145 domain658 IN A 69.0.2.146 domain659 IN A 69.0.2.147 domain660 IN A 69.0.2.148 domain661 IN A 69.0.2.149 domain662 IN A 69.0.2.150 domain663 IN A 69.0.2.151 domain664 IN A 69.0.2.152 domain665 IN A 69.0.2.153 domain666 IN A 69.0.2.154 domain667 IN A 69.0.2.155 domain668 IN A 69.0.2.156 domain669 IN A 69.0.2.157 domain670 IN A 69.0.2.158 domain671 IN A 69.0.2.159 domain672 IN A 69.0.2.160 domain673 IN A 69.0.2.161 domain674 IN A 69.0.2.162 domain675 IN A 69.0.2.163 domain676 IN A 69.0.2.164 domain677 IN A 69.0.2.165 domain678 IN A 69.0.2.166 domain679 IN A 69.0.2.167 domain680 IN A 69.0.2.168 domain681 IN A 69.0.2.169 domain682 IN A 69.0.2.170 domain683 IN A 69.0.2.171 domain684 IN A 69.0.2.172 domain685 IN A 69.0.2.173 domain686 IN A 69.0.2.174 domain687 IN A 69.0.2.175 domain688 IN A 69.0.2.176 domain689 IN A 69.0.2.177 domain690 IN A 69.0.2.178 domain691 IN A 69.0.2.179 domain692 IN A 69.0.2.180 domain693 IN A 69.0.2.181 domain694 IN A 69.0.2.182 domain695 IN A 69.0.2.183 domain696 IN A 69.0.2.184 domain697 IN A 69.0.2.185 domain698 IN A 69.0.2.186 domain699 IN A 69.0.2.187 domain700 IN A 69.0.2.188 domain701 IN A 69.0.2.189 domain702 IN A 69.0.2.190 domain703 IN A 69.0.2.191 domain704 IN A 69.0.2.192 domain705 IN A 69.0.2.193 domain706 IN A 69.0.2.194 domain707 IN A 69.0.2.195 domain708 IN A 69.0.2.196 domain709 IN A 69.0.2.197 domain710 IN A 69.0.2.198 domain711 IN A 69.0.2.199 domain712 IN A 69.0.2.200 domain713 IN A 69.0.2.201 domain714 IN A 69.0.2.202 domain715 IN A 69.0.2.203 domain716 IN A 69.0.2.204 domain717 IN A 69.0.2.205 domain718 IN A 69.0.2.206 domain719 IN A 69.0.2.207 domain720 IN A 69.0.2.208 domain721 IN A 69.0.2.209 domain722 IN A 69.0.2.210 domain723 IN A 69.0.2.211 domain724 IN A 69.0.2.212 domain725 IN A 69.0.2.213 domain726 IN A 69.0.2.214 domain727 IN A 69.0.2.215 domain728 IN A 69.0.2.216 domain729 IN A 69.0.2.217 domain730 IN A 69.0.2.218 domain731 IN A 69.0.2.219 domain732 IN A 69.0.2.220 domain733 IN A 69.0.2.221 domain734 IN A 69.0.2.222 domain735 IN A 69.0.2.223 domain736 IN A 69.0.2.224 domain737 IN A 69.0.2.225 domain738 IN A 69.0.2.226 domain739 IN A 69.0.2.227 domain740 IN A 69.0.2.228 domain741 IN A 69.0.2.229 domain742 IN A 69.0.2.230 domain743 IN A 69.0.2.231 domain744 IN A 69.0.2.232 domain745 IN A 69.0.2.233 domain746 IN A 69.0.2.234 domain747 IN A 69.0.2.235 domain748 IN A 69.0.2.236 domain749 IN A 69.0.2.237 domain750 IN A 69.0.2.238 domain751 IN A 69.0.2.239 domain752 IN A 69.0.2.240 domain753 IN A 69.0.2.241 domain754 IN A 69.0.2.242 domain755 IN A 69.0.2.243 domain756 IN A 69.0.2.244 domain757 IN A 69.0.2.245 domain758 IN A 69.0.2.246 domain759 IN A 69.0.2.247 domain760 IN A 69.0.2.248 domain761 IN A 69.0.2.249 domain762 IN A 69.0.2.250 domain763 IN A 69.0.2.251 domain764 IN A 69.0.2.252 domain765 IN A 69.0.2.253 domain766 IN A 69.0.2.254 domain767 IN A 69.0.2.255 domain768 IN A 69.0.3.0 domain769 IN A 69.0.3.1 domain770 IN A 69.0.3.2 domain771 IN A 69.0.3.3 domain772 IN A 69.0.3.4 domain773 IN A 69.0.3.5 domain774 IN A 69.0.3.6 domain775 IN A 69.0.3.7 domain776 IN A 69.0.3.8 domain777 IN A 69.0.3.9 domain778 IN A 69.0.3.10 domain779 IN A 69.0.3.11 domain780 IN A 69.0.3.12 domain781 IN A 69.0.3.13 domain782 IN A 69.0.3.14 domain783 IN A 69.0.3.15 domain784 IN A 69.0.3.16 domain785 IN A 69.0.3.17 domain786 IN A 69.0.3.18 domain787 IN A 69.0.3.19 domain788 IN A 69.0.3.20 domain789 IN A 69.0.3.21 domain790 IN A 69.0.3.22 domain791 IN A 69.0.3.23 domain792 IN A 69.0.3.24 domain793 IN A 69.0.3.25 domain794 IN A 69.0.3.26 domain795 IN A 69.0.3.27 domain796 IN A 69.0.3.28 domain797 IN A 69.0.3.29 domain798 IN A 69.0.3.30 domain799 IN A 69.0.3.31 domain800 IN A 69.0.3.32 domain801 IN A 69.0.3.33 domain802 IN A 69.0.3.34 domain803 IN A 69.0.3.35 domain804 IN A 69.0.3.36 domain805 IN A 69.0.3.37 domain806 IN A 69.0.3.38 domain807 IN A 69.0.3.39 domain808 IN A 69.0.3.40 domain809 IN A 69.0.3.41 domain810 IN A 69.0.3.42 domain811 IN A 69.0.3.43 domain812 IN A 69.0.3.44 domain813 IN A 69.0.3.45 domain814 IN A 69.0.3.46 domain815 IN A 69.0.3.47 domain816 IN A 69.0.3.48 domain817 IN A 69.0.3.49 domain818 IN A 69.0.3.50 domain819 IN A 69.0.3.51 domain820 IN A 69.0.3.52 domain821 IN A 69.0.3.53 domain822 IN A 69.0.3.54 domain823 IN A 69.0.3.55 domain824 IN A 69.0.3.56 domain825 IN A 69.0.3.57 domain826 IN A 69.0.3.58 domain827 IN A 69.0.3.59 domain828 IN A 69.0.3.60 domain829 IN A 69.0.3.61 domain830 IN A 69.0.3.62 domain831 IN A 69.0.3.63 domain832 IN A 69.0.3.64 domain833 IN A 69.0.3.65 domain834 IN A 69.0.3.66 domain835 IN A 69.0.3.67 domain836 IN A 69.0.3.68 domain837 IN A 69.0.3.69 domain838 IN A 69.0.3.70 domain839 IN A 69.0.3.71 domain840 IN A 69.0.3.72 domain841 IN A 69.0.3.73 domain842 IN A 69.0.3.74 domain843 IN A 69.0.3.75 domain844 IN A 69.0.3.76 domain845 IN A 69.0.3.77 domain846 IN A 69.0.3.78 domain847 IN A 69.0.3.79 domain848 IN A 69.0.3.80 domain849 IN A 69.0.3.81 domain850 IN A 69.0.3.82 domain851 IN A 69.0.3.83 domain852 IN A 69.0.3.84 domain853 IN A 69.0.3.85 domain854 IN A 69.0.3.86 domain855 IN A 69.0.3.87 domain856 IN A 69.0.3.88 domain857 IN A 69.0.3.89 domain858 IN A 69.0.3.90 domain859 IN A 69.0.3.91 domain860 IN A 69.0.3.92 domain861 IN A 69.0.3.93 domain862 IN A 69.0.3.94 domain863 IN A 69.0.3.95 domain864 IN A 69.0.3.96 domain865 IN A 69.0.3.97 domain866 IN A 69.0.3.98 domain867 IN A 69.0.3.99 domain868 IN A 69.0.3.100 domain869 IN A 69.0.3.101 domain870 IN A 69.0.3.102 domain871 IN A 69.0.3.103 domain872 IN A 69.0.3.104 domain873 IN A 69.0.3.105 domain874 IN A 69.0.3.106 domain875 IN A 69.0.3.107 domain876 IN A 69.0.3.108 domain877 IN A 69.0.3.109 domain878 IN A 69.0.3.110 domain879 IN A 69.0.3.111 domain880 IN A 69.0.3.112 domain881 IN A 69.0.3.113 domain882 IN A 69.0.3.114 domain883 IN A 69.0.3.115 domain884 IN A 69.0.3.116 domain885 IN A 69.0.3.117 domain886 IN A 69.0.3.118 domain887 IN A 69.0.3.119 domain888 IN A 69.0.3.120 domain889 IN A 69.0.3.121 domain890 IN A 69.0.3.122 domain891 IN A 69.0.3.123 domain892 IN A 69.0.3.124 domain893 IN A 69.0.3.125 domain894 IN A 69.0.3.126 domain895 IN A 69.0.3.127 domain896 IN A 69.0.3.128 domain897 IN A 69.0.3.129 domain898 IN A 69.0.3.130 domain899 IN A 69.0.3.131 domain900 IN A 69.0.3.132 domain901 IN A 69.0.3.133 domain902 IN A 69.0.3.134 domain903 IN A 69.0.3.135 domain904 IN A 69.0.3.136 domain905 IN A 69.0.3.137 domain906 IN A 69.0.3.138 domain907 IN A 69.0.3.139 domain908 IN A 69.0.3.140 domain909 IN A 69.0.3.141 domain910 IN A 69.0.3.142 domain911 IN A 69.0.3.143 domain912 IN A 69.0.3.144 domain913 IN A 69.0.3.145 domain914 IN A 69.0.3.146 domain915 IN A 69.0.3.147 domain916 IN A 69.0.3.148 domain917 IN A 69.0.3.149 domain918 IN A 69.0.3.150 domain919 IN A 69.0.3.151 domain920 IN A 69.0.3.152 domain921 IN A 69.0.3.153 domain922 IN A 69.0.3.154 domain923 IN A 69.0.3.155 domain924 IN A 69.0.3.156 domain925 IN A 69.0.3.157 domain926 IN A 69.0.3.158 domain927 IN A 69.0.3.159 domain928 IN A 69.0.3.160 domain929 IN A 69.0.3.161 domain930 IN A 69.0.3.162 domain931 IN A 69.0.3.163 domain932 IN A 69.0.3.164 domain933 IN A 69.0.3.165 domain934 IN A 69.0.3.166 domain935 IN A 69.0.3.167 domain936 IN A 69.0.3.168 domain937 IN A 69.0.3.169 domain938 IN A 69.0.3.170 domain939 IN A 69.0.3.171 domain940 IN A 69.0.3.172 domain941 IN A 69.0.3.173 domain942 IN A 69.0.3.174 domain943 IN A 69.0.3.175 domain944 IN A 69.0.3.176 domain945 IN A 69.0.3.177 domain946 IN A 69.0.3.178 domain947 IN A 69.0.3.179 domain948 IN A 69.0.3.180 domain949 IN A 69.0.3.181 domain950 IN A 69.0.3.182 domain951 IN A 69.0.3.183 domain952 IN A 69.0.3.184 domain953 IN A 69.0.3.185 domain954 IN A 69.0.3.186 domain955 IN A 69.0.3.187 domain956 IN A 69.0.3.188 domain957 IN A 69.0.3.189 domain958 IN A 69.0.3.190 domain959 IN A 69.0.3.191 domain960 IN A 69.0.3.192 domain961 IN A 69.0.3.193 domain962 IN A 69.0.3.194 domain963 IN A 69.0.3.195 domain964 IN A 69.0.3.196 domain965 IN A 69.0.3.197 domain966 IN A 69.0.3.198 domain967 IN A 69.0.3.199 domain968 IN A 69.0.3.200 domain969 IN A 69.0.3.201 domain970 IN A 69.0.3.202 domain971 IN A 69.0.3.203 domain972 IN A 69.0.3.204 domain973 IN A 69.0.3.205 domain974 IN A 69.0.3.206 domain975 IN A 69.0.3.207 domain976 IN A 69.0.3.208 domain977 IN A 69.0.3.209 domain978 IN A 69.0.3.210 domain979 IN A 69.0.3.211 domain980 IN A 69.0.3.212 domain981 IN A 69.0.3.213 domain982 IN A 69.0.3.214 domain983 IN A 69.0.3.215 domain984 IN A 69.0.3.216 domain985 IN A 69.0.3.217 domain986 IN A 69.0.3.218 domain987 IN A 69.0.3.219 domain988 IN A 69.0.3.220 domain989 IN A 69.0.3.221 domain990 IN A 69.0.3.222 domain991 IN A 69.0.3.223 domain992 IN A 69.0.3.224 domain993 IN A 69.0.3.225 domain994 IN A 69.0.3.226 domain995 IN A 69.0.3.227 domain996 IN A 69.0.3.228 domain997 IN A 69.0.3.229 domain998 IN A 69.0.3.230 domain999 IN A 69.0.3.231 domain1000 IN A 69.0.3.232 domain1001 IN A 69.0.3.233 domain1002 IN A 69.0.3.234 domain1003 IN A 69.0.3.235 domain1004 IN A 69.0.3.236 domain1005 IN A 69.0.3.237 domain1006 IN A 69.0.3.238 domain1007 IN A 69.0.3.239 domain1008 IN A 69.0.3.240 domain1009 IN A 69.0.3.241 domain1010 IN A 69.0.3.242 domain1011 IN A 69.0.3.243 domain1012 IN A 69.0.3.244 domain1013 IN A 69.0.3.245 domain1014 IN A 69.0.3.246 domain1015 IN A 69.0.3.247 domain1016 IN A 69.0.3.248 domain1017 IN A 69.0.3.249 domain1018 IN A 69.0.3.250 domain1019 IN A 69.0.3.251 domain1020 IN A 69.0.3.252 domain1021 IN A 69.0.3.253 domain1022 IN A 69.0.3.254 domain1023 IN A 69.0.3.255 domain1024 IN A 69.0.4.0 domain1025 IN A 69.0.4.1 domain1026 IN A 69.0.4.2 domain1027 IN A 69.0.4.3 domain1028 IN A 69.0.4.4 domain1029 IN A 69.0.4.5 domain1030 IN A 69.0.4.6 domain1031 IN A 69.0.4.7 domain1032 IN A 69.0.4.8 domain1033 IN A 69.0.4.9 domain1034 IN A 69.0.4.10 domain1035 IN A 69.0.4.11 domain1036 IN A 69.0.4.12 domain1037 IN A 69.0.4.13 domain1038 IN A 69.0.4.14 domain1039 IN A 69.0.4.15 domain1040 IN A 69.0.4.16 domain1041 IN A 69.0.4.17 domain1042 IN A 69.0.4.18 domain1043 IN A 69.0.4.19 domain1044 IN A 69.0.4.20 domain1045 IN A 69.0.4.21 domain1046 IN A 69.0.4.22 domain1047 IN A 69.0.4.23 domain1048 IN A 69.0.4.24 domain1049 IN A 69.0.4.25 domain1050 IN A 69.0.4.26 domain1051 IN A 69.0.4.27 domain1052 IN A 69.0.4.28 domain1053 IN A 69.0.4.29 domain1054 IN A 69.0.4.30 domain1055 IN A 69.0.4.31 domain1056 IN A 69.0.4.32 domain1057 IN A 69.0.4.33 domain1058 IN A 69.0.4.34 domain1059 IN A 69.0.4.35 domain1060 IN A 69.0.4.36 domain1061 IN A 69.0.4.37 domain1062 IN A 69.0.4.38 domain1063 IN A 69.0.4.39 domain1064 IN A 69.0.4.40 domain1065 IN A 69.0.4.41 domain1066 IN A 69.0.4.42 domain1067 IN A 69.0.4.43 domain1068 IN A 69.0.4.44 domain1069 IN A 69.0.4.45 domain1070 IN A 69.0.4.46 domain1071 IN A 69.0.4.47 domain1072 IN A 69.0.4.48 domain1073 IN A 69.0.4.49 domain1074 IN A 69.0.4.50 domain1075 IN A 69.0.4.51 domain1076 IN A 69.0.4.52 domain1077 IN A 69.0.4.53 domain1078 IN A 69.0.4.54 domain1079 IN A 69.0.4.55 domain1080 IN A 69.0.4.56 domain1081 IN A 69.0.4.57 domain1082 IN A 69.0.4.58 domain1083 IN A 69.0.4.59 domain1084 IN A 69.0.4.60 domain1085 IN A 69.0.4.61 domain1086 IN A 69.0.4.62 domain1087 IN A 69.0.4.63 domain1088 IN A 69.0.4.64 domain1089 IN A 69.0.4.65 domain1090 IN A 69.0.4.66 domain1091 IN A 69.0.4.67 domain1092 IN A 69.0.4.68 domain1093 IN A 69.0.4.69 domain1094 IN A 69.0.4.70 domain1095 IN A 69.0.4.71 domain1096 IN A 69.0.4.72 domain1097 IN A 69.0.4.73 domain1098 IN A 69.0.4.74 domain1099 IN A 69.0.4.75 domain1100 IN A 69.0.4.76 domain1101 IN A 69.0.4.77 domain1102 IN A 69.0.4.78 domain1103 IN A 69.0.4.79 domain1104 IN A 69.0.4.80 domain1105 IN A 69.0.4.81 domain1106 IN A 69.0.4.82 domain1107 IN A 69.0.4.83 domain1108 IN A 69.0.4.84 domain1109 IN A 69.0.4.85 domain1110 IN A 69.0.4.86 domain1111 IN A 69.0.4.87 domain1112 IN A 69.0.4.88 domain1113 IN A 69.0.4.89 domain1114 IN A 69.0.4.90 domain1115 IN A 69.0.4.91 domain1116 IN A 69.0.4.92 domain1117 IN A 69.0.4.93 domain1118 IN A 69.0.4.94 domain1119 IN A 69.0.4.95 domain1120 IN A 69.0.4.96 domain1121 IN A 69.0.4.97 domain1122 IN A 69.0.4.98 domain1123 IN A 69.0.4.99 domain1124 IN A 69.0.4.100 domain1125 IN A 69.0.4.101 domain1126 IN A 69.0.4.102 domain1127 IN A 69.0.4.103 domain1128 IN A 69.0.4.104 domain1129 IN A 69.0.4.105 domain1130 IN A 69.0.4.106 domain1131 IN A 69.0.4.107 domain1132 IN A 69.0.4.108 domain1133 IN A 69.0.4.109 domain1134 IN A 69.0.4.110 domain1135 IN A 69.0.4.111 domain1136 IN A 69.0.4.112 domain1137 IN A 69.0.4.113 domain1138 IN A 69.0.4.114 domain1139 IN A 69.0.4.115 domain1140 IN A 69.0.4.116 domain1141 IN A 69.0.4.117 domain1142 IN A 69.0.4.118 domain1143 IN A 69.0.4.119 domain1144 IN A 69.0.4.120 domain1145 IN A 69.0.4.121 domain1146 IN A 69.0.4.122 domain1147 IN A 69.0.4.123 domain1148 IN A 69.0.4.124 domain1149 IN A 69.0.4.125 domain1150 IN A 69.0.4.126 domain1151 IN A 69.0.4.127 domain1152 IN A 69.0.4.128 domain1153 IN A 69.0.4.129 domain1154 IN A 69.0.4.130 domain1155 IN A 69.0.4.131 domain1156 IN A 69.0.4.132 domain1157 IN A 69.0.4.133 domain1158 IN A 69.0.4.134 domain1159 IN A 69.0.4.135 domain1160 IN A 69.0.4.136 domain1161 IN A 69.0.4.137 domain1162 IN A 69.0.4.138 domain1163 IN A 69.0.4.139 domain1164 IN A 69.0.4.140 domain1165 IN A 69.0.4.141 domain1166 IN A 69.0.4.142 domain1167 IN A 69.0.4.143 domain1168 IN A 69.0.4.144 domain1169 IN A 69.0.4.145 domain1170 IN A 69.0.4.146 domain1171 IN A 69.0.4.147 domain1172 IN A 69.0.4.148 domain1173 IN A 69.0.4.149 domain1174 IN A 69.0.4.150 domain1175 IN A 69.0.4.151 domain1176 IN A 69.0.4.152 domain1177 IN A 69.0.4.153 domain1178 IN A 69.0.4.154 domain1179 IN A 69.0.4.155 domain1180 IN A 69.0.4.156 domain1181 IN A 69.0.4.157 domain1182 IN A 69.0.4.158 domain1183 IN A 69.0.4.159 domain1184 IN A 69.0.4.160 domain1185 IN A 69.0.4.161 domain1186 IN A 69.0.4.162 domain1187 IN A 69.0.4.163 domain1188 IN A 69.0.4.164 domain1189 IN A 69.0.4.165 domain1190 IN A 69.0.4.166 domain1191 IN A 69.0.4.167 domain1192 IN A 69.0.4.168 domain1193 IN A 69.0.4.169 domain1194 IN A 69.0.4.170 domain1195 IN A 69.0.4.171 domain1196 IN A 69.0.4.172 domain1197 IN A 69.0.4.173 domain1198 IN A 69.0.4.174 domain1199 IN A 69.0.4.175 domain1200 IN A 69.0.4.176 domain1201 IN A 69.0.4.177 domain1202 IN A 69.0.4.178 domain1203 IN A 69.0.4.179 domain1204 IN A 69.0.4.180 domain1205 IN A 69.0.4.181 domain1206 IN A 69.0.4.182 domain1207 IN A 69.0.4.183 domain1208 IN A 69.0.4.184 domain1209 IN A 69.0.4.185 domain1210 IN A 69.0.4.186 domain1211 IN A 69.0.4.187 domain1212 IN A 69.0.4.188 domain1213 IN A 69.0.4.189 domain1214 IN A 69.0.4.190 domain1215 IN A 69.0.4.191 domain1216 IN A 69.0.4.192 domain1217 IN A 69.0.4.193 domain1218 IN A 69.0.4.194 domain1219 IN A 69.0.4.195 domain1220 IN A 69.0.4.196 domain1221 IN A 69.0.4.197 domain1222 IN A 69.0.4.198 domain1223 IN A 69.0.4.199 domain1224 IN A 69.0.4.200 domain1225 IN A 69.0.4.201 domain1226 IN A 69.0.4.202 domain1227 IN A 69.0.4.203 domain1228 IN A 69.0.4.204 domain1229 IN A 69.0.4.205 domain1230 IN A 69.0.4.206 domain1231 IN A 69.0.4.207 domain1232 IN A 69.0.4.208 domain1233 IN A 69.0.4.209 domain1234 IN A 69.0.4.210 domain1235 IN A 69.0.4.211 domain1236 IN A 69.0.4.212 domain1237 IN A 69.0.4.213 domain1238 IN A 69.0.4.214 domain1239 IN A 69.0.4.215 domain1240 IN A 69.0.4.216 domain1241 IN A 69.0.4.217 domain1242 IN A 69.0.4.218 domain1243 IN A 69.0.4.219 domain1244 IN A 69.0.4.220 domain1245 IN A 69.0.4.221 domain1246 IN A 69.0.4.222 domain1247 IN A 69.0.4.223 domain1248 IN A 69.0.4.224 domain1249 IN A 69.0.4.225 domain1250 IN A 69.0.4.226 domain1251 IN A 69.0.4.227 domain1252 IN A 69.0.4.228 domain1253 IN A 69.0.4.229 domain1254 IN A 69.0.4.230 domain1255 IN A 69.0.4.231 domain1256 IN A 69.0.4.232 domain1257 IN A 69.0.4.233 domain1258 IN A 69.0.4.234 domain1259 IN A 69.0.4.235 domain1260 IN A 69.0.4.236 domain1261 IN A 69.0.4.237 domain1262 IN A 69.0.4.238 domain1263 IN A 69.0.4.239 domain1264 IN A 69.0.4.240 domain1265 IN A 69.0.4.241 domain1266 IN A 69.0.4.242 domain1267 IN A 69.0.4.243 domain1268 IN A 69.0.4.244 domain1269 IN A 69.0.4.245 domain1270 IN A 69.0.4.246 domain1271 IN A 69.0.4.247 domain1272 IN A 69.0.4.248 domain1273 IN A 69.0.4.249 domain1274 IN A 69.0.4.250 domain1275 IN A 69.0.4.251 domain1276 IN A 69.0.4.252 domain1277 IN A 69.0.4.253 domain1278 IN A 69.0.4.254 domain1279 IN A 69.0.4.255 domain1280 IN A 69.0.5.0 domain1281 IN A 69.0.5.1 domain1282 IN A 69.0.5.2 domain1283 IN A 69.0.5.3 domain1284 IN A 69.0.5.4 domain1285 IN A 69.0.5.5 domain1286 IN A 69.0.5.6 domain1287 IN A 69.0.5.7 domain1288 IN A 69.0.5.8 domain1289 IN A 69.0.5.9 domain1290 IN A 69.0.5.10 domain1291 IN A 69.0.5.11 domain1292 IN A 69.0.5.12 domain1293 IN A 69.0.5.13 domain1294 IN A 69.0.5.14 domain1295 IN A 69.0.5.15 domain1296 IN A 69.0.5.16 domain1297 IN A 69.0.5.17 domain1298 IN A 69.0.5.18 domain1299 IN A 69.0.5.19 domain1300 IN A 69.0.5.20 domain1301 IN A 69.0.5.21 domain1302 IN A 69.0.5.22 domain1303 IN A 69.0.5.23 domain1304 IN A 69.0.5.24 domain1305 IN A 69.0.5.25 domain1306 IN A 69.0.5.26 domain1307 IN A 69.0.5.27 domain1308 IN A 69.0.5.28 domain1309 IN A 69.0.5.29 domain1310 IN A 69.0.5.30 domain1311 IN A 69.0.5.31 domain1312 IN A 69.0.5.32 domain1313 IN A 69.0.5.33 domain1314 IN A 69.0.5.34 domain1315 IN A 69.0.5.35 domain1316 IN A 69.0.5.36 domain1317 IN A 69.0.5.37 domain1318 IN A 69.0.5.38 domain1319 IN A 69.0.5.39 domain1320 IN A 69.0.5.40 domain1321 IN A 69.0.5.41 domain1322 IN A 69.0.5.42 domain1323 IN A 69.0.5.43 domain1324 IN A 69.0.5.44 domain1325 IN A 69.0.5.45 domain1326 IN A 69.0.5.46 domain1327 IN A 69.0.5.47 domain1328 IN A 69.0.5.48 domain1329 IN A 69.0.5.49 domain1330 IN A 69.0.5.50 domain1331 IN A 69.0.5.51 domain1332 IN A 69.0.5.52 domain1333 IN A 69.0.5.53 domain1334 IN A 69.0.5.54 domain1335 IN A 69.0.5.55 domain1336 IN A 69.0.5.56 domain1337 IN A 69.0.5.57 domain1338 IN A 69.0.5.58 domain1339 IN A 69.0.5.59 domain1340 IN A 69.0.5.60 domain1341 IN A 69.0.5.61 domain1342 IN A 69.0.5.62 domain1343 IN A 69.0.5.63 domain1344 IN A 69.0.5.64 domain1345 IN A 69.0.5.65 domain1346 IN A 69.0.5.66 domain1347 IN A 69.0.5.67 domain1348 IN A 69.0.5.68 domain1349 IN A 69.0.5.69 domain1350 IN A 69.0.5.70 domain1351 IN A 69.0.5.71 domain1352 IN A 69.0.5.72 domain1353 IN A 69.0.5.73 domain1354 IN A 69.0.5.74 domain1355 IN A 69.0.5.75 domain1356 IN A 69.0.5.76 domain1357 IN A 69.0.5.77 domain1358 IN A 69.0.5.78 domain1359 IN A 69.0.5.79 domain1360 IN A 69.0.5.80 domain1361 IN A 69.0.5.81 domain1362 IN A 69.0.5.82 domain1363 IN A 69.0.5.83 domain1364 IN A 69.0.5.84 domain1365 IN A 69.0.5.85 domain1366 IN A 69.0.5.86 domain1367 IN A 69.0.5.87 domain1368 IN A 69.0.5.88 domain1369 IN A 69.0.5.89 domain1370 IN A 69.0.5.90 domain1371 IN A 69.0.5.91 domain1372 IN A 69.0.5.92 domain1373 IN A 69.0.5.93 domain1374 IN A 69.0.5.94 domain1375 IN A 69.0.5.95 domain1376 IN A 69.0.5.96 domain1377 IN A 69.0.5.97 domain1378 IN A 69.0.5.98 domain1379 IN A 69.0.5.99 domain1380 IN A 69.0.5.100 domain1381 IN A 69.0.5.101 domain1382 IN A 69.0.5.102 domain1383 IN A 69.0.5.103 domain1384 IN A 69.0.5.104 domain1385 IN A 69.0.5.105 domain1386 IN A 69.0.5.106 domain1387 IN A 69.0.5.107 domain1388 IN A 69.0.5.108 domain1389 IN A 69.0.5.109 domain1390 IN A 69.0.5.110 domain1391 IN A 69.0.5.111 domain1392 IN A 69.0.5.112 domain1393 IN A 69.0.5.113 domain1394 IN A 69.0.5.114 domain1395 IN A 69.0.5.115 domain1396 IN A 69.0.5.116 domain1397 IN A 69.0.5.117 domain1398 IN A 69.0.5.118 domain1399 IN A 69.0.5.119 domain1400 IN A 69.0.5.120 domain1401 IN A 69.0.5.121 domain1402 IN A 69.0.5.122 domain1403 IN A 69.0.5.123 domain1404 IN A 69.0.5.124 domain1405 IN A 69.0.5.125 domain1406 IN A 69.0.5.126 domain1407 IN A 69.0.5.127 domain1408 IN A 69.0.5.128 domain1409 IN A 69.0.5.129 domain1410 IN A 69.0.5.130 domain1411 IN A 69.0.5.131 domain1412 IN A 69.0.5.132 domain1413 IN A 69.0.5.133 domain1414 IN A 69.0.5.134 domain1415 IN A 69.0.5.135 domain1416 IN A 69.0.5.136 domain1417 IN A 69.0.5.137 domain1418 IN A 69.0.5.138 domain1419 IN A 69.0.5.139 domain1420 IN A 69.0.5.140 domain1421 IN A 69.0.5.141 domain1422 IN A 69.0.5.142 domain1423 IN A 69.0.5.143 domain1424 IN A 69.0.5.144 domain1425 IN A 69.0.5.145 domain1426 IN A 69.0.5.146 domain1427 IN A 69.0.5.147 domain1428 IN A 69.0.5.148 domain1429 IN A 69.0.5.149 domain1430 IN A 69.0.5.150 domain1431 IN A 69.0.5.151 domain1432 IN A 69.0.5.152 domain1433 IN A 69.0.5.153 domain1434 IN A 69.0.5.154 domain1435 IN A 69.0.5.155 domain1436 IN A 69.0.5.156 domain1437 IN A 69.0.5.157 domain1438 IN A 69.0.5.158 domain1439 IN A 69.0.5.159 domain1440 IN A 69.0.5.160 domain1441 IN A 69.0.5.161 domain1442 IN A 69.0.5.162 domain1443 IN A 69.0.5.163 domain1444 IN A 69.0.5.164 domain1445 IN A 69.0.5.165 domain1446 IN A 69.0.5.166 domain1447 IN A 69.0.5.167 domain1448 IN A 69.0.5.168 domain1449 IN A 69.0.5.169 domain1450 IN A 69.0.5.170 domain1451 IN A 69.0.5.171 domain1452 IN A 69.0.5.172 domain1453 IN A 69.0.5.173 domain1454 IN A 69.0.5.174 domain1455 IN A 69.0.5.175 domain1456 IN A 69.0.5.176 domain1457 IN A 69.0.5.177 domain1458 IN A 69.0.5.178 domain1459 IN A 69.0.5.179 domain1460 IN A 69.0.5.180 domain1461 IN A 69.0.5.181 domain1462 IN A 69.0.5.182 domain1463 IN A 69.0.5.183 domain1464 IN A 69.0.5.184 domain1465 IN A 69.0.5.185 domain1466 IN A 69.0.5.186 domain1467 IN A 69.0.5.187 domain1468 IN A 69.0.5.188 domain1469 IN A 69.0.5.189 domain1470 IN A 69.0.5.190 domain1471 IN A 69.0.5.191 domain1472 IN A 69.0.5.192 domain1473 IN A 69.0.5.193 domain1474 IN A 69.0.5.194 domain1475 IN A 69.0.5.195 domain1476 IN A 69.0.5.196 domain1477 IN A 69.0.5.197 domain1478 IN A 69.0.5.198 domain1479 IN A 69.0.5.199 domain1480 IN A 69.0.5.200 domain1481 IN A 69.0.5.201 domain1482 IN A 69.0.5.202 domain1483 IN A 69.0.5.203 domain1484 IN A 69.0.5.204 domain1485 IN A 69.0.5.205 domain1486 IN A 69.0.5.206 domain1487 IN A 69.0.5.207 domain1488 IN A 69.0.5.208 domain1489 IN A 69.0.5.209 domain1490 IN A 69.0.5.210 domain1491 IN A 69.0.5.211 domain1492 IN A 69.0.5.212 domain1493 IN A 69.0.5.213 domain1494 IN A 69.0.5.214 domain1495 IN A 69.0.5.215 domain1496 IN A 69.0.5.216 domain1497 IN A 69.0.5.217 domain1498 IN A 69.0.5.218 domain1499 IN A 69.0.5.219 domain1500 IN A 69.0.5.220 domain1501 IN A 69.0.5.221 domain1502 IN A 69.0.5.222 domain1503 IN A 69.0.5.223 domain1504 IN A 69.0.5.224 domain1505 IN A 69.0.5.225 domain1506 IN A 69.0.5.226 domain1507 IN A 69.0.5.227 domain1508 IN A 69.0.5.228 domain1509 IN A 69.0.5.229 domain1510 IN A 69.0.5.230 domain1511 IN A 69.0.5.231 domain1512 IN A 69.0.5.232 domain1513 IN A 69.0.5.233 domain1514 IN A 69.0.5.234 domain1515 IN A 69.0.5.235 domain1516 IN A 69.0.5.236 domain1517 IN A 69.0.5.237 domain1518 IN A 69.0.5.238 domain1519 IN A 69.0.5.239 domain1520 IN A 69.0.5.240 domain1521 IN A 69.0.5.241 domain1522 IN A 69.0.5.242 domain1523 IN A 69.0.5.243 domain1524 IN A 69.0.5.244 domain1525 IN A 69.0.5.245 domain1526 IN A 69.0.5.246 domain1527 IN A 69.0.5.247 domain1528 IN A 69.0.5.248 domain1529 IN A 69.0.5.249 domain1530 IN A 69.0.5.250 domain1531 IN A 69.0.5.251 domain1532 IN A 69.0.5.252 domain1533 IN A 69.0.5.253 domain1534 IN A 69.0.5.254 domain1535 IN A 69.0.5.255 domain1536 IN A 69.0.6.0 domain1537 IN A 69.0.6.1 domain1538 IN A 69.0.6.2 domain1539 IN A 69.0.6.3 domain1540 IN A 69.0.6.4 domain1541 IN A 69.0.6.5 domain1542 IN A 69.0.6.6 domain1543 IN A 69.0.6.7 domain1544 IN A 69.0.6.8 domain1545 IN A 69.0.6.9 domain1546 IN A 69.0.6.10 domain1547 IN A 69.0.6.11 domain1548 IN A 69.0.6.12 domain1549 IN A 69.0.6.13 domain1550 IN A 69.0.6.14 domain1551 IN A 69.0.6.15 domain1552 IN A 69.0.6.16 domain1553 IN A 69.0.6.17 domain1554 IN A 69.0.6.18 domain1555 IN A 69.0.6.19 domain1556 IN A 69.0.6.20 domain1557 IN A 69.0.6.21 domain1558 IN A 69.0.6.22 domain1559 IN A 69.0.6.23 domain1560 IN A 69.0.6.24 domain1561 IN A 69.0.6.25 domain1562 IN A 69.0.6.26 domain1563 IN A 69.0.6.27 domain1564 IN A 69.0.6.28 domain1565 IN A 69.0.6.29 domain1566 IN A 69.0.6.30 domain1567 IN A 69.0.6.31 domain1568 IN A 69.0.6.32 domain1569 IN A 69.0.6.33 domain1570 IN A 69.0.6.34 domain1571 IN A 69.0.6.35 domain1572 IN A 69.0.6.36 domain1573 IN A 69.0.6.37 domain1574 IN A 69.0.6.38 domain1575 IN A 69.0.6.39 domain1576 IN A 69.0.6.40 domain1577 IN A 69.0.6.41 domain1578 IN A 69.0.6.42 domain1579 IN A 69.0.6.43 domain1580 IN A 69.0.6.44 domain1581 IN A 69.0.6.45 domain1582 IN A 69.0.6.46 domain1583 IN A 69.0.6.47 domain1584 IN A 69.0.6.48 domain1585 IN A 69.0.6.49 domain1586 IN A 69.0.6.50 domain1587 IN A 69.0.6.51 domain1588 IN A 69.0.6.52 domain1589 IN A 69.0.6.53 domain1590 IN A 69.0.6.54 domain1591 IN A 69.0.6.55 domain1592 IN A 69.0.6.56 domain1593 IN A 69.0.6.57 domain1594 IN A 69.0.6.58 domain1595 IN A 69.0.6.59 domain1596 IN A 69.0.6.60 domain1597 IN A 69.0.6.61 domain1598 IN A 69.0.6.62 domain1599 IN A 69.0.6.63 domain1600 IN A 69.0.6.64 domain1601 IN A 69.0.6.65 domain1602 IN A 69.0.6.66 domain1603 IN A 69.0.6.67 domain1604 IN A 69.0.6.68 domain1605 IN A 69.0.6.69 domain1606 IN A 69.0.6.70 domain1607 IN A 69.0.6.71 domain1608 IN A 69.0.6.72 domain1609 IN A 69.0.6.73 domain1610 IN A 69.0.6.74 domain1611 IN A 69.0.6.75 domain1612 IN A 69.0.6.76 domain1613 IN A 69.0.6.77 domain1614 IN A 69.0.6.78 domain1615 IN A 69.0.6.79 domain1616 IN A 69.0.6.80 domain1617 IN A 69.0.6.81 domain1618 IN A 69.0.6.82 domain1619 IN A 69.0.6.83 domain1620 IN A 69.0.6.84 domain1621 IN A 69.0.6.85 domain1622 IN A 69.0.6.86 domain1623 IN A 69.0.6.87 domain1624 IN A 69.0.6.88 domain1625 IN A 69.0.6.89 domain1626 IN A 69.0.6.90 domain1627 IN A 69.0.6.91 domain1628 IN A 69.0.6.92 domain1629 IN A 69.0.6.93 domain1630 IN A 69.0.6.94 domain1631 IN A 69.0.6.95 domain1632 IN A 69.0.6.96 domain1633 IN A 69.0.6.97 domain1634 IN A 69.0.6.98 domain1635 IN A 69.0.6.99 domain1636 IN A 69.0.6.100 domain1637 IN A 69.0.6.101 domain1638 IN A 69.0.6.102 domain1639 IN A 69.0.6.103 domain1640 IN A 69.0.6.104 domain1641 IN A 69.0.6.105 domain1642 IN A 69.0.6.106 domain1643 IN A 69.0.6.107 domain1644 IN A 69.0.6.108 domain1645 IN A 69.0.6.109 domain1646 IN A 69.0.6.110 domain1647 IN A 69.0.6.111 domain1648 IN A 69.0.6.112 domain1649 IN A 69.0.6.113 domain1650 IN A 69.0.6.114 domain1651 IN A 69.0.6.115 domain1652 IN A 69.0.6.116 domain1653 IN A 69.0.6.117 domain1654 IN A 69.0.6.118 domain1655 IN A 69.0.6.119 domain1656 IN A 69.0.6.120 domain1657 IN A 69.0.6.121 domain1658 IN A 69.0.6.122 domain1659 IN A 69.0.6.123 domain1660 IN A 69.0.6.124 domain1661 IN A 69.0.6.125 domain1662 IN A 69.0.6.126 domain1663 IN A 69.0.6.127 domain1664 IN A 69.0.6.128 domain1665 IN A 69.0.6.129 domain1666 IN A 69.0.6.130 domain1667 IN A 69.0.6.131 domain1668 IN A 69.0.6.132 domain1669 IN A 69.0.6.133 domain1670 IN A 69.0.6.134 domain1671 IN A 69.0.6.135 domain1672 IN A 69.0.6.136 domain1673 IN A 69.0.6.137 domain1674 IN A 69.0.6.138 domain1675 IN A 69.0.6.139 domain1676 IN A 69.0.6.140 domain1677 IN A 69.0.6.141 domain1678 IN A 69.0.6.142 domain1679 IN A 69.0.6.143 domain1680 IN A 69.0.6.144 domain1681 IN A 69.0.6.145 domain1682 IN A 69.0.6.146 domain1683 IN A 69.0.6.147 domain1684 IN A 69.0.6.148 domain1685 IN A 69.0.6.149 domain1686 IN A 69.0.6.150 domain1687 IN A 69.0.6.151 domain1688 IN A 69.0.6.152 domain1689 IN A 69.0.6.153 domain1690 IN A 69.0.6.154 domain1691 IN A 69.0.6.155 domain1692 IN A 69.0.6.156 domain1693 IN A 69.0.6.157 domain1694 IN A 69.0.6.158 domain1695 IN A 69.0.6.159 domain1696 IN A 69.0.6.160 domain1697 IN A 69.0.6.161 domain1698 IN A 69.0.6.162 domain1699 IN A 69.0.6.163 domain1700 IN A 69.0.6.164 domain1701 IN A 69.0.6.165 domain1702 IN A 69.0.6.166 domain1703 IN A 69.0.6.167 domain1704 IN A 69.0.6.168 domain1705 IN A 69.0.6.169 domain1706 IN A 69.0.6.170 domain1707 IN A 69.0.6.171 domain1708 IN A 69.0.6.172 domain1709 IN A 69.0.6.173 domain1710 IN A 69.0.6.174 domain1711 IN A 69.0.6.175 domain1712 IN A 69.0.6.176 domain1713 IN A 69.0.6.177 domain1714 IN A 69.0.6.178 domain1715 IN A 69.0.6.179 domain1716 IN A 69.0.6.180 domain1717 IN A 69.0.6.181 domain1718 IN A 69.0.6.182 domain1719 IN A 69.0.6.183 domain1720 IN A 69.0.6.184 domain1721 IN A 69.0.6.185 domain1722 IN A 69.0.6.186 domain1723 IN A 69.0.6.187 domain1724 IN A 69.0.6.188 domain1725 IN A 69.0.6.189 domain1726 IN A 69.0.6.190 domain1727 IN A 69.0.6.191 domain1728 IN A 69.0.6.192 domain1729 IN A 69.0.6.193 domain1730 IN A 69.0.6.194 domain1731 IN A 69.0.6.195 domain1732 IN A 69.0.6.196 domain1733 IN A 69.0.6.197 domain1734 IN A 69.0.6.198 domain1735 IN A 69.0.6.199 domain1736 IN A 69.0.6.200 domain1737 IN A 69.0.6.201 domain1738 IN A 69.0.6.202 domain1739 IN A 69.0.6.203 domain1740 IN A 69.0.6.204 domain1741 IN A 69.0.6.205 domain1742 IN A 69.0.6.206 domain1743 IN A 69.0.6.207 domain1744 IN A 69.0.6.208 domain1745 IN A 69.0.6.209 domain1746 IN A 69.0.6.210 domain1747 IN A 69.0.6.211 domain1748 IN A 69.0.6.212 domain1749 IN A 69.0.6.213 domain1750 IN A 69.0.6.214 domain1751 IN A 69.0.6.215 domain1752 IN A 69.0.6.216 domain1753 IN A 69.0.6.217 domain1754 IN A 69.0.6.218 domain1755 IN A 69.0.6.219 domain1756 IN A 69.0.6.220 domain1757 IN A 69.0.6.221 domain1758 IN A 69.0.6.222 domain1759 IN A 69.0.6.223 domain1760 IN A 69.0.6.224 domain1761 IN A 69.0.6.225 domain1762 IN A 69.0.6.226 domain1763 IN A 69.0.6.227 domain1764 IN A 69.0.6.228 domain1765 IN A 69.0.6.229 domain1766 IN A 69.0.6.230 domain1767 IN A 69.0.6.231 domain1768 IN A 69.0.6.232 domain1769 IN A 69.0.6.233 domain1770 IN A 69.0.6.234 domain1771 IN A 69.0.6.235 domain1772 IN A 69.0.6.236 domain1773 IN A 69.0.6.237 domain1774 IN A 69.0.6.238 domain1775 IN A 69.0.6.239 domain1776 IN A 69.0.6.240 domain1777 IN A 69.0.6.241 domain1778 IN A 69.0.6.242 domain1779 IN A 69.0.6.243 domain1780 IN A 69.0.6.244 domain1781 IN A 69.0.6.245 domain1782 IN A 69.0.6.246 domain1783 IN A 69.0.6.247 domain1784 IN A 69.0.6.248 domain1785 IN A 69.0.6.249 domain1786 IN A 69.0.6.250 domain1787 IN A 69.0.6.251 domain1788 IN A 69.0.6.252 domain1789 IN A 69.0.6.253 domain1790 IN A 69.0.6.254 domain1791 IN A 69.0.6.255 domain1792 IN A 69.0.7.0 domain1793 IN A 69.0.7.1 domain1794 IN A 69.0.7.2 domain1795 IN A 69.0.7.3 domain1796 IN A 69.0.7.4 domain1797 IN A 69.0.7.5 domain1798 IN A 69.0.7.6 domain1799 IN A 69.0.7.7 domain1800 IN A 69.0.7.8 domain1801 IN A 69.0.7.9 domain1802 IN A 69.0.7.10 domain1803 IN A 69.0.7.11 domain1804 IN A 69.0.7.12 domain1805 IN A 69.0.7.13 domain1806 IN A 69.0.7.14 domain1807 IN A 69.0.7.15 domain1808 IN A 69.0.7.16 domain1809 IN A 69.0.7.17 domain1810 IN A 69.0.7.18 domain1811 IN A 69.0.7.19 domain1812 IN A 69.0.7.20 domain1813 IN A 69.0.7.21 domain1814 IN A 69.0.7.22 domain1815 IN A 69.0.7.23 domain1816 IN A 69.0.7.24 domain1817 IN A 69.0.7.25 domain1818 IN A 69.0.7.26 domain1819 IN A 69.0.7.27 domain1820 IN A 69.0.7.28 domain1821 IN A 69.0.7.29 domain1822 IN A 69.0.7.30 domain1823 IN A 69.0.7.31 domain1824 IN A 69.0.7.32 domain1825 IN A 69.0.7.33 domain1826 IN A 69.0.7.34 domain1827 IN A 69.0.7.35 domain1828 IN A 69.0.7.36 domain1829 IN A 69.0.7.37 domain1830 IN A 69.0.7.38 domain1831 IN A 69.0.7.39 domain1832 IN A 69.0.7.40 domain1833 IN A 69.0.7.41 domain1834 IN A 69.0.7.42 domain1835 IN A 69.0.7.43 domain1836 IN A 69.0.7.44 domain1837 IN A 69.0.7.45 domain1838 IN A 69.0.7.46 domain1839 IN A 69.0.7.47 domain1840 IN A 69.0.7.48 domain1841 IN A 69.0.7.49 domain1842 IN A 69.0.7.50 domain1843 IN A 69.0.7.51 domain1844 IN A 69.0.7.52 domain1845 IN A 69.0.7.53 domain1846 IN A 69.0.7.54 domain1847 IN A 69.0.7.55 domain1848 IN A 69.0.7.56 domain1849 IN A 69.0.7.57 domain1850 IN A 69.0.7.58 domain1851 IN A 69.0.7.59 domain1852 IN A 69.0.7.60 domain1853 IN A 69.0.7.61 domain1854 IN A 69.0.7.62 domain1855 IN A 69.0.7.63 domain1856 IN A 69.0.7.64 domain1857 IN A 69.0.7.65 domain1858 IN A 69.0.7.66 domain1859 IN A 69.0.7.67 domain1860 IN A 69.0.7.68 domain1861 IN A 69.0.7.69 domain1862 IN A 69.0.7.70 domain1863 IN A 69.0.7.71 domain1864 IN A 69.0.7.72 domain1865 IN A 69.0.7.73 domain1866 IN A 69.0.7.74 domain1867 IN A 69.0.7.75 domain1868 IN A 69.0.7.76 domain1869 IN A 69.0.7.77 domain1870 IN A 69.0.7.78 domain1871 IN A 69.0.7.79 domain1872 IN A 69.0.7.80 domain1873 IN A 69.0.7.81 domain1874 IN A 69.0.7.82 domain1875 IN A 69.0.7.83 domain1876 IN A 69.0.7.84 domain1877 IN A 69.0.7.85 domain1878 IN A 69.0.7.86 domain1879 IN A 69.0.7.87 domain1880 IN A 69.0.7.88 domain1881 IN A 69.0.7.89 domain1882 IN A 69.0.7.90 domain1883 IN A 69.0.7.91 domain1884 IN A 69.0.7.92 domain1885 IN A 69.0.7.93 domain1886 IN A 69.0.7.94 domain1887 IN A 69.0.7.95 domain1888 IN A 69.0.7.96 domain1889 IN A 69.0.7.97 domain1890 IN A 69.0.7.98 domain1891 IN A 69.0.7.99 domain1892 IN A 69.0.7.100 domain1893 IN A 69.0.7.101 domain1894 IN A 69.0.7.102 domain1895 IN A 69.0.7.103 domain1896 IN A 69.0.7.104 domain1897 IN A 69.0.7.105 domain1898 IN A 69.0.7.106 domain1899 IN A 69.0.7.107 domain1900 IN A 69.0.7.108 domain1901 IN A 69.0.7.109 domain1902 IN A 69.0.7.110 domain1903 IN A 69.0.7.111 domain1904 IN A 69.0.7.112 domain1905 IN A 69.0.7.113 domain1906 IN A 69.0.7.114 domain1907 IN A 69.0.7.115 domain1908 IN A 69.0.7.116 domain1909 IN A 69.0.7.117 domain1910 IN A 69.0.7.118 domain1911 IN A 69.0.7.119 domain1912 IN A 69.0.7.120 domain1913 IN A 69.0.7.121 domain1914 IN A 69.0.7.122 domain1915 IN A 69.0.7.123 domain1916 IN A 69.0.7.124 domain1917 IN A 69.0.7.125 domain1918 IN A 69.0.7.126 domain1919 IN A 69.0.7.127 domain1920 IN A 69.0.7.128 domain1921 IN A 69.0.7.129 domain1922 IN A 69.0.7.130 domain1923 IN A 69.0.7.131 domain1924 IN A 69.0.7.132 domain1925 IN A 69.0.7.133 domain1926 IN A 69.0.7.134 domain1927 IN A 69.0.7.135 domain1928 IN A 69.0.7.136 domain1929 IN A 69.0.7.137 domain1930 IN A 69.0.7.138 domain1931 IN A 69.0.7.139 domain1932 IN A 69.0.7.140 domain1933 IN A 69.0.7.141 domain1934 IN A 69.0.7.142 domain1935 IN A 69.0.7.143 domain1936 IN A 69.0.7.144 domain1937 IN A 69.0.7.145 domain1938 IN A 69.0.7.146 domain1939 IN A 69.0.7.147 domain1940 IN A 69.0.7.148 domain1941 IN A 69.0.7.149 domain1942 IN A 69.0.7.150 domain1943 IN A 69.0.7.151 domain1944 IN A 69.0.7.152 domain1945 IN A 69.0.7.153 domain1946 IN A 69.0.7.154 domain1947 IN A 69.0.7.155 domain1948 IN A 69.0.7.156 domain1949 IN A 69.0.7.157 domain1950 IN A 69.0.7.158 domain1951 IN A 69.0.7.159 domain1952 IN A 69.0.7.160 domain1953 IN A 69.0.7.161 domain1954 IN A 69.0.7.162 domain1955 IN A 69.0.7.163 domain1956 IN A 69.0.7.164 domain1957 IN A 69.0.7.165 domain1958 IN A 69.0.7.166 domain1959 IN A 69.0.7.167 domain1960 IN A 69.0.7.168 domain1961 IN A 69.0.7.169 domain1962 IN A 69.0.7.170 domain1963 IN A 69.0.7.171 domain1964 IN A 69.0.7.172 domain1965 IN A 69.0.7.173 domain1966 IN A 69.0.7.174 domain1967 IN A 69.0.7.175 domain1968 IN A 69.0.7.176 domain1969 IN A 69.0.7.177 domain1970 IN A 69.0.7.178 domain1971 IN A 69.0.7.179 domain1972 IN A 69.0.7.180 domain1973 IN A 69.0.7.181 domain1974 IN A 69.0.7.182 domain1975 IN A 69.0.7.183 domain1976 IN A 69.0.7.184 domain1977 IN A 69.0.7.185 domain1978 IN A 69.0.7.186 domain1979 IN A 69.0.7.187 domain1980 IN A 69.0.7.188 domain1981 IN A 69.0.7.189 domain1982 IN A 69.0.7.190 domain1983 IN A 69.0.7.191 domain1984 IN A 69.0.7.192 domain1985 IN A 69.0.7.193 domain1986 IN A 69.0.7.194 domain1987 IN A 69.0.7.195 domain1988 IN A 69.0.7.196 domain1989 IN A 69.0.7.197 domain1990 IN A 69.0.7.198 domain1991 IN A 69.0.7.199 domain1992 IN A 69.0.7.200 domain1993 IN A 69.0.7.201 domain1994 IN A 69.0.7.202 domain1995 IN A 69.0.7.203 domain1996 IN A 69.0.7.204 domain1997 IN A 69.0.7.205 domain1998 IN A 69.0.7.206 domain1999 IN A 69.0.7.207 domain2000 IN A 69.0.7.208 domain2001 IN A 69.0.7.209 domain2002 IN A 69.0.7.210 domain2003 IN A 69.0.7.211 domain2004 IN A 69.0.7.212 domain2005 IN A 69.0.7.213 domain2006 IN A 69.0.7.214 domain2007 IN A 69.0.7.215 domain2008 IN A 69.0.7.216 domain2009 IN A 69.0.7.217 domain2010 IN A 69.0.7.218 domain2011 IN A 69.0.7.219 domain2012 IN A 69.0.7.220 domain2013 IN A 69.0.7.221 domain2014 IN A 69.0.7.222 domain2015 IN A 69.0.7.223 domain2016 IN A 69.0.7.224 domain2017 IN A 69.0.7.225 domain2018 IN A 69.0.7.226 domain2019 IN A 69.0.7.227 domain2020 IN A 69.0.7.228 domain2021 IN A 69.0.7.229 domain2022 IN A 69.0.7.230 domain2023 IN A 69.0.7.231 domain2024 IN A 69.0.7.232 domain2025 IN A 69.0.7.233 domain2026 IN A 69.0.7.234 domain2027 IN A 69.0.7.235 domain2028 IN A 69.0.7.236 domain2029 IN A 69.0.7.237 domain2030 IN A 69.0.7.238 domain2031 IN A 69.0.7.239 domain2032 IN A 69.0.7.240 domain2033 IN A 69.0.7.241 domain2034 IN A 69.0.7.242 domain2035 IN A 69.0.7.243 domain2036 IN A 69.0.7.244 domain2037 IN A 69.0.7.245 domain2038 IN A 69.0.7.246 domain2039 IN A 69.0.7.247 domain2040 IN A 69.0.7.248 domain2041 IN A 69.0.7.249 domain2042 IN A 69.0.7.250 domain2043 IN A 69.0.7.251 domain2044 IN A 69.0.7.252 domain2045 IN A 69.0.7.253 domain2046 IN A 69.0.7.254 domain2047 IN A 69.0.7.255 domain2048 IN A 69.0.8.0 domain2049 IN A 69.0.8.1 domain2050 IN A 69.0.8.2 domain2051 IN A 69.0.8.3 domain2052 IN A 69.0.8.4 domain2053 IN A 69.0.8.5 domain2054 IN A 69.0.8.6 domain2055 IN A 69.0.8.7 domain2056 IN A 69.0.8.8 domain2057 IN A 69.0.8.9 domain2058 IN A 69.0.8.10 domain2059 IN A 69.0.8.11 domain2060 IN A 69.0.8.12 domain2061 IN A 69.0.8.13 domain2062 IN A 69.0.8.14 domain2063 IN A 69.0.8.15 domain2064 IN A 69.0.8.16 domain2065 IN A 69.0.8.17 domain2066 IN A 69.0.8.18 domain2067 IN A 69.0.8.19 domain2068 IN A 69.0.8.20 domain2069 IN A 69.0.8.21 domain2070 IN A 69.0.8.22 domain2071 IN A 69.0.8.23 domain2072 IN A 69.0.8.24 domain2073 IN A 69.0.8.25 domain2074 IN A 69.0.8.26 domain2075 IN A 69.0.8.27 domain2076 IN A 69.0.8.28 domain2077 IN A 69.0.8.29 domain2078 IN A 69.0.8.30 domain2079 IN A 69.0.8.31 domain2080 IN A 69.0.8.32 domain2081 IN A 69.0.8.33 domain2082 IN A 69.0.8.34 domain2083 IN A 69.0.8.35 domain2084 IN A 69.0.8.36 domain2085 IN A 69.0.8.37 domain2086 IN A 69.0.8.38 domain2087 IN A 69.0.8.39 domain2088 IN A 69.0.8.40 domain2089 IN A 69.0.8.41 domain2090 IN A 69.0.8.42 domain2091 IN A 69.0.8.43 domain2092 IN A 69.0.8.44 domain2093 IN A 69.0.8.45 domain2094 IN A 69.0.8.46 domain2095 IN A 69.0.8.47 domain2096 IN A 69.0.8.48 domain2097 IN A 69.0.8.49 domain2098 IN A 69.0.8.50 domain2099 IN A 69.0.8.51 domain2100 IN A 69.0.8.52 domain2101 IN A 69.0.8.53 domain2102 IN A 69.0.8.54 domain2103 IN A 69.0.8.55 domain2104 IN A 69.0.8.56 domain2105 IN A 69.0.8.57 domain2106 IN A 69.0.8.58 domain2107 IN A 69.0.8.59 domain2108 IN A 69.0.8.60 domain2109 IN A 69.0.8.61 domain2110 IN A 69.0.8.62 domain2111 IN A 69.0.8.63 domain2112 IN A 69.0.8.64 domain2113 IN A 69.0.8.65 domain2114 IN A 69.0.8.66 domain2115 IN A 69.0.8.67 domain2116 IN A 69.0.8.68 domain2117 IN A 69.0.8.69 domain2118 IN A 69.0.8.70 domain2119 IN A 69.0.8.71 domain2120 IN A 69.0.8.72 domain2121 IN A 69.0.8.73 domain2122 IN A 69.0.8.74 domain2123 IN A 69.0.8.75 domain2124 IN A 69.0.8.76 domain2125 IN A 69.0.8.77 domain2126 IN A 69.0.8.78 domain2127 IN A 69.0.8.79 domain2128 IN A 69.0.8.80 domain2129 IN A 69.0.8.81 domain2130 IN A 69.0.8.82 domain2131 IN A 69.0.8.83 domain2132 IN A 69.0.8.84 domain2133 IN A 69.0.8.85 domain2134 IN A 69.0.8.86 domain2135 IN A 69.0.8.87 domain2136 IN A 69.0.8.88 domain2137 IN A 69.0.8.89 domain2138 IN A 69.0.8.90 domain2139 IN A 69.0.8.91 domain2140 IN A 69.0.8.92 domain2141 IN A 69.0.8.93 domain2142 IN A 69.0.8.94 domain2143 IN A 69.0.8.95 domain2144 IN A 69.0.8.96 domain2145 IN A 69.0.8.97 domain2146 IN A 69.0.8.98 domain2147 IN A 69.0.8.99 domain2148 IN A 69.0.8.100 domain2149 IN A 69.0.8.101 domain2150 IN A 69.0.8.102 domain2151 IN A 69.0.8.103 domain2152 IN A 69.0.8.104 domain2153 IN A 69.0.8.105 domain2154 IN A 69.0.8.106 domain2155 IN A 69.0.8.107 domain2156 IN A 69.0.8.108 domain2157 IN A 69.0.8.109 domain2158 IN A 69.0.8.110 domain2159 IN A 69.0.8.111 domain2160 IN A 69.0.8.112 domain2161 IN A 69.0.8.113 domain2162 IN A 69.0.8.114 domain2163 IN A 69.0.8.115 domain2164 IN A 69.0.8.116 domain2165 IN A 69.0.8.117 domain2166 IN A 69.0.8.118 domain2167 IN A 69.0.8.119 domain2168 IN A 69.0.8.120 domain2169 IN A 69.0.8.121 domain2170 IN A 69.0.8.122 domain2171 IN A 69.0.8.123 domain2172 IN A 69.0.8.124 domain2173 IN A 69.0.8.125 domain2174 IN A 69.0.8.126 domain2175 IN A 69.0.8.127 domain2176 IN A 69.0.8.128 domain2177 IN A 69.0.8.129 domain2178 IN A 69.0.8.130 domain2179 IN A 69.0.8.131 domain2180 IN A 69.0.8.132 domain2181 IN A 69.0.8.133 domain2182 IN A 69.0.8.134 domain2183 IN A 69.0.8.135 domain2184 IN A 69.0.8.136 domain2185 IN A 69.0.8.137 domain2186 IN A 69.0.8.138 domain2187 IN A 69.0.8.139 domain2188 IN A 69.0.8.140 domain2189 IN A 69.0.8.141 domain2190 IN A 69.0.8.142 domain2191 IN A 69.0.8.143 domain2192 IN A 69.0.8.144 domain2193 IN A 69.0.8.145 domain2194 IN A 69.0.8.146 domain2195 IN A 69.0.8.147 domain2196 IN A 69.0.8.148 domain2197 IN A 69.0.8.149 domain2198 IN A 69.0.8.150 domain2199 IN A 69.0.8.151 domain2200 IN A 69.0.8.152 domain2201 IN A 69.0.8.153 domain2202 IN A 69.0.8.154 domain2203 IN A 69.0.8.155 domain2204 IN A 69.0.8.156 domain2205 IN A 69.0.8.157 domain2206 IN A 69.0.8.158 domain2207 IN A 69.0.8.159 domain2208 IN A 69.0.8.160 domain2209 IN A 69.0.8.161 domain2210 IN A 69.0.8.162 domain2211 IN A 69.0.8.163 domain2212 IN A 69.0.8.164 domain2213 IN A 69.0.8.165 domain2214 IN A 69.0.8.166 domain2215 IN A 69.0.8.167 domain2216 IN A 69.0.8.168 domain2217 IN A 69.0.8.169 domain2218 IN A 69.0.8.170 domain2219 IN A 69.0.8.171 domain2220 IN A 69.0.8.172 domain2221 IN A 69.0.8.173 domain2222 IN A 69.0.8.174 domain2223 IN A 69.0.8.175 domain2224 IN A 69.0.8.176 domain2225 IN A 69.0.8.177 domain2226 IN A 69.0.8.178 domain2227 IN A 69.0.8.179 domain2228 IN A 69.0.8.180 domain2229 IN A 69.0.8.181 domain2230 IN A 69.0.8.182 domain2231 IN A 69.0.8.183 domain2232 IN A 69.0.8.184 domain2233 IN A 69.0.8.185 domain2234 IN A 69.0.8.186 domain2235 IN A 69.0.8.187 domain2236 IN A 69.0.8.188 domain2237 IN A 69.0.8.189 domain2238 IN A 69.0.8.190 domain2239 IN A 69.0.8.191 domain2240 IN A 69.0.8.192 domain2241 IN A 69.0.8.193 domain2242 IN A 69.0.8.194 domain2243 IN A 69.0.8.195 domain2244 IN A 69.0.8.196 domain2245 IN A 69.0.8.197 domain2246 IN A 69.0.8.198 domain2247 IN A 69.0.8.199 domain2248 IN A 69.0.8.200 domain2249 IN A 69.0.8.201 domain2250 IN A 69.0.8.202 domain2251 IN A 69.0.8.203 domain2252 IN A 69.0.8.204 domain2253 IN A 69.0.8.205 domain2254 IN A 69.0.8.206 domain2255 IN A 69.0.8.207 domain2256 IN A 69.0.8.208 domain2257 IN A 69.0.8.209 domain2258 IN A 69.0.8.210 domain2259 IN A 69.0.8.211 domain2260 IN A 69.0.8.212 domain2261 IN A 69.0.8.213 domain2262 IN A 69.0.8.214 domain2263 IN A 69.0.8.215 domain2264 IN A 69.0.8.216 domain2265 IN A 69.0.8.217 domain2266 IN A 69.0.8.218 domain2267 IN A 69.0.8.219 domain2268 IN A 69.0.8.220 domain2269 IN A 69.0.8.221 domain2270 IN A 69.0.8.222 domain2271 IN A 69.0.8.223 domain2272 IN A 69.0.8.224 domain2273 IN A 69.0.8.225 domain2274 IN A 69.0.8.226 domain2275 IN A 69.0.8.227 domain2276 IN A 69.0.8.228 domain2277 IN A 69.0.8.229 domain2278 IN A 69.0.8.230 domain2279 IN A 69.0.8.231 domain2280 IN A 69.0.8.232 domain2281 IN A 69.0.8.233 domain2282 IN A 69.0.8.234 domain2283 IN A 69.0.8.235 domain2284 IN A 69.0.8.236 domain2285 IN A 69.0.8.237 domain2286 IN A 69.0.8.238 domain2287 IN A 69.0.8.239 domain2288 IN A 69.0.8.240 domain2289 IN A 69.0.8.241 domain2290 IN A 69.0.8.242 domain2291 IN A 69.0.8.243 domain2292 IN A 69.0.8.244 domain2293 IN A 69.0.8.245 domain2294 IN A 69.0.8.246 domain2295 IN A 69.0.8.247 domain2296 IN A 69.0.8.248 domain2297 IN A 69.0.8.249 domain2298 IN A 69.0.8.250 domain2299 IN A 69.0.8.251 domain2300 IN A 69.0.8.252 domain2301 IN A 69.0.8.253 domain2302 IN A 69.0.8.254 domain2303 IN A 69.0.8.255 domain2304 IN A 69.0.9.0 domain2305 IN A 69.0.9.1 domain2306 IN A 69.0.9.2 domain2307 IN A 69.0.9.3 domain2308 IN A 69.0.9.4 domain2309 IN A 69.0.9.5 domain2310 IN A 69.0.9.6 domain2311 IN A 69.0.9.7 domain2312 IN A 69.0.9.8 domain2313 IN A 69.0.9.9 domain2314 IN A 69.0.9.10 domain2315 IN A 69.0.9.11 domain2316 IN A 69.0.9.12 domain2317 IN A 69.0.9.13 domain2318 IN A 69.0.9.14 domain2319 IN A 69.0.9.15 domain2320 IN A 69.0.9.16 domain2321 IN A 69.0.9.17 domain2322 IN A 69.0.9.18 domain2323 IN A 69.0.9.19 domain2324 IN A 69.0.9.20 domain2325 IN A 69.0.9.21 domain2326 IN A 69.0.9.22 domain2327 IN A 69.0.9.23 domain2328 IN A 69.0.9.24 domain2329 IN A 69.0.9.25 domain2330 IN A 69.0.9.26 domain2331 IN A 69.0.9.27 domain2332 IN A 69.0.9.28 domain2333 IN A 69.0.9.29 domain2334 IN A 69.0.9.30 domain2335 IN A 69.0.9.31 domain2336 IN A 69.0.9.32 domain2337 IN A 69.0.9.33 domain2338 IN A 69.0.9.34 domain2339 IN A 69.0.9.35 domain2340 IN A 69.0.9.36 domain2341 IN A 69.0.9.37 domain2342 IN A 69.0.9.38 domain2343 IN A 69.0.9.39 domain2344 IN A 69.0.9.40 domain2345 IN A 69.0.9.41 domain2346 IN A 69.0.9.42 domain2347 IN A 69.0.9.43 domain2348 IN A 69.0.9.44 domain2349 IN A 69.0.9.45 domain2350 IN A 69.0.9.46 domain2351 IN A 69.0.9.47 domain2352 IN A 69.0.9.48 domain2353 IN A 69.0.9.49 domain2354 IN A 69.0.9.50 domain2355 IN A 69.0.9.51 domain2356 IN A 69.0.9.52 domain2357 IN A 69.0.9.53 domain2358 IN A 69.0.9.54 domain2359 IN A 69.0.9.55 domain2360 IN A 69.0.9.56 domain2361 IN A 69.0.9.57 domain2362 IN A 69.0.9.58 domain2363 IN A 69.0.9.59 domain2364 IN A 69.0.9.60 domain2365 IN A 69.0.9.61 domain2366 IN A 69.0.9.62 domain2367 IN A 69.0.9.63 domain2368 IN A 69.0.9.64 domain2369 IN A 69.0.9.65 domain2370 IN A 69.0.9.66 domain2371 IN A 69.0.9.67 domain2372 IN A 69.0.9.68 domain2373 IN A 69.0.9.69 domain2374 IN A 69.0.9.70 domain2375 IN A 69.0.9.71 domain2376 IN A 69.0.9.72 domain2377 IN A 69.0.9.73 domain2378 IN A 69.0.9.74 domain2379 IN A 69.0.9.75 domain2380 IN A 69.0.9.76 domain2381 IN A 69.0.9.77 domain2382 IN A 69.0.9.78 domain2383 IN A 69.0.9.79 domain2384 IN A 69.0.9.80 domain2385 IN A 69.0.9.81 domain2386 IN A 69.0.9.82 domain2387 IN A 69.0.9.83 domain2388 IN A 69.0.9.84 domain2389 IN A 69.0.9.85 domain2390 IN A 69.0.9.86 domain2391 IN A 69.0.9.87 domain2392 IN A 69.0.9.88 domain2393 IN A 69.0.9.89 domain2394 IN A 69.0.9.90 domain2395 IN A 69.0.9.91 domain2396 IN A 69.0.9.92 domain2397 IN A 69.0.9.93 domain2398 IN A 69.0.9.94 domain2399 IN A 69.0.9.95 domain2400 IN A 69.0.9.96 domain2401 IN A 69.0.9.97 domain2402 IN A 69.0.9.98 domain2403 IN A 69.0.9.99 domain2404 IN A 69.0.9.100 domain2405 IN A 69.0.9.101 domain2406 IN A 69.0.9.102 domain2407 IN A 69.0.9.103 domain2408 IN A 69.0.9.104 domain2409 IN A 69.0.9.105 domain2410 IN A 69.0.9.106 domain2411 IN A 69.0.9.107 domain2412 IN A 69.0.9.108 domain2413 IN A 69.0.9.109 domain2414 IN A 69.0.9.110 domain2415 IN A 69.0.9.111 domain2416 IN A 69.0.9.112 domain2417 IN A 69.0.9.113 domain2418 IN A 69.0.9.114 domain2419 IN A 69.0.9.115 domain2420 IN A 69.0.9.116 domain2421 IN A 69.0.9.117 domain2422 IN A 69.0.9.118 domain2423 IN A 69.0.9.119 domain2424 IN A 69.0.9.120 domain2425 IN A 69.0.9.121 domain2426 IN A 69.0.9.122 domain2427 IN A 69.0.9.123 domain2428 IN A 69.0.9.124 domain2429 IN A 69.0.9.125 domain2430 IN A 69.0.9.126 domain2431 IN A 69.0.9.127 domain2432 IN A 69.0.9.128 domain2433 IN A 69.0.9.129 domain2434 IN A 69.0.9.130 domain2435 IN A 69.0.9.131 domain2436 IN A 69.0.9.132 domain2437 IN A 69.0.9.133 domain2438 IN A 69.0.9.134 domain2439 IN A 69.0.9.135 domain2440 IN A 69.0.9.136 domain2441 IN A 69.0.9.137 domain2442 IN A 69.0.9.138 domain2443 IN A 69.0.9.139 domain2444 IN A 69.0.9.140 domain2445 IN A 69.0.9.141 domain2446 IN A 69.0.9.142 domain2447 IN A 69.0.9.143 domain2448 IN A 69.0.9.144 domain2449 IN A 69.0.9.145 domain2450 IN A 69.0.9.146 domain2451 IN A 69.0.9.147 domain2452 IN A 69.0.9.148 domain2453 IN A 69.0.9.149 domain2454 IN A 69.0.9.150 domain2455 IN A 69.0.9.151 domain2456 IN A 69.0.9.152 domain2457 IN A 69.0.9.153 domain2458 IN A 69.0.9.154 domain2459 IN A 69.0.9.155 domain2460 IN A 69.0.9.156 domain2461 IN A 69.0.9.157 domain2462 IN A 69.0.9.158 domain2463 IN A 69.0.9.159 domain2464 IN A 69.0.9.160 domain2465 IN A 69.0.9.161 domain2466 IN A 69.0.9.162 domain2467 IN A 69.0.9.163 domain2468 IN A 69.0.9.164 domain2469 IN A 69.0.9.165 domain2470 IN A 69.0.9.166 domain2471 IN A 69.0.9.167 domain2472 IN A 69.0.9.168 domain2473 IN A 69.0.9.169 domain2474 IN A 69.0.9.170 domain2475 IN A 69.0.9.171 domain2476 IN A 69.0.9.172 domain2477 IN A 69.0.9.173 domain2478 IN A 69.0.9.174 domain2479 IN A 69.0.9.175 domain2480 IN A 69.0.9.176 domain2481 IN A 69.0.9.177 domain2482 IN A 69.0.9.178 domain2483 IN A 69.0.9.179 domain2484 IN A 69.0.9.180 domain2485 IN A 69.0.9.181 domain2486 IN A 69.0.9.182 domain2487 IN A 69.0.9.183 domain2488 IN A 69.0.9.184 domain2489 IN A 69.0.9.185 domain2490 IN A 69.0.9.186 domain2491 IN A 69.0.9.187 domain2492 IN A 69.0.9.188 domain2493 IN A 69.0.9.189 domain2494 IN A 69.0.9.190 domain2495 IN A 69.0.9.191 domain2496 IN A 69.0.9.192 domain2497 IN A 69.0.9.193 domain2498 IN A 69.0.9.194 domain2499 IN A 69.0.9.195 domain2500 IN A 69.0.9.196 domain2501 IN A 69.0.9.197 domain2502 IN A 69.0.9.198 domain2503 IN A 69.0.9.199 domain2504 IN A 69.0.9.200 domain2505 IN A 69.0.9.201 domain2506 IN A 69.0.9.202 domain2507 IN A 69.0.9.203 domain2508 IN A 69.0.9.204 domain2509 IN A 69.0.9.205 domain2510 IN A 69.0.9.206 domain2511 IN A 69.0.9.207 domain2512 IN A 69.0.9.208 domain2513 IN A 69.0.9.209 domain2514 IN A 69.0.9.210 domain2515 IN A 69.0.9.211 domain2516 IN A 69.0.9.212 domain2517 IN A 69.0.9.213 domain2518 IN A 69.0.9.214 domain2519 IN A 69.0.9.215 domain2520 IN A 69.0.9.216 domain2521 IN A 69.0.9.217 domain2522 IN A 69.0.9.218 domain2523 IN A 69.0.9.219 domain2524 IN A 69.0.9.220 domain2525 IN A 69.0.9.221 domain2526 IN A 69.0.9.222 domain2527 IN A 69.0.9.223 domain2528 IN A 69.0.9.224 domain2529 IN A 69.0.9.225 domain2530 IN A 69.0.9.226 domain2531 IN A 69.0.9.227 domain2532 IN A 69.0.9.228 domain2533 IN A 69.0.9.229 domain2534 IN A 69.0.9.230 domain2535 IN A 69.0.9.231 domain2536 IN A 69.0.9.232 domain2537 IN A 69.0.9.233 domain2538 IN A 69.0.9.234 domain2539 IN A 69.0.9.235 domain2540 IN A 69.0.9.236 domain2541 IN A 69.0.9.237 domain2542 IN A 69.0.9.238 domain2543 IN A 69.0.9.239 domain2544 IN A 69.0.9.240 domain2545 IN A 69.0.9.241 domain2546 IN A 69.0.9.242 domain2547 IN A 69.0.9.243 domain2548 IN A 69.0.9.244 domain2549 IN A 69.0.9.245 domain2550 IN A 69.0.9.246 domain2551 IN A 69.0.9.247 domain2552 IN A 69.0.9.248 domain2553 IN A 69.0.9.249 domain2554 IN A 69.0.9.250 domain2555 IN A 69.0.9.251 domain2556 IN A 69.0.9.252 domain2557 IN A 69.0.9.253 domain2558 IN A 69.0.9.254 domain2559 IN A 69.0.9.255 domain2560 IN A 69.0.10.0 domain2561 IN A 69.0.10.1 domain2562 IN A 69.0.10.2 domain2563 IN A 69.0.10.3 domain2564 IN A 69.0.10.4 domain2565 IN A 69.0.10.5 domain2566 IN A 69.0.10.6 domain2567 IN A 69.0.10.7 domain2568 IN A 69.0.10.8 domain2569 IN A 69.0.10.9 domain2570 IN A 69.0.10.10 domain2571 IN A 69.0.10.11 domain2572 IN A 69.0.10.12 domain2573 IN A 69.0.10.13 domain2574 IN A 69.0.10.14 domain2575 IN A 69.0.10.15 domain2576 IN A 69.0.10.16 domain2577 IN A 69.0.10.17 domain2578 IN A 69.0.10.18 domain2579 IN A 69.0.10.19 domain2580 IN A 69.0.10.20 domain2581 IN A 69.0.10.21 domain2582 IN A 69.0.10.22 domain2583 IN A 69.0.10.23 domain2584 IN A 69.0.10.24 domain2585 IN A 69.0.10.25 domain2586 IN A 69.0.10.26 domain2587 IN A 69.0.10.27 domain2588 IN A 69.0.10.28 domain2589 IN A 69.0.10.29 domain2590 IN A 69.0.10.30 domain2591 IN A 69.0.10.31 domain2592 IN A 69.0.10.32 domain2593 IN A 69.0.10.33 domain2594 IN A 69.0.10.34 domain2595 IN A 69.0.10.35 domain2596 IN A 69.0.10.36 domain2597 IN A 69.0.10.37 domain2598 IN A 69.0.10.38 domain2599 IN A 69.0.10.39 domain2600 IN A 69.0.10.40 domain2601 IN A 69.0.10.41 domain2602 IN A 69.0.10.42 domain2603 IN A 69.0.10.43 domain2604 IN A 69.0.10.44 domain2605 IN A 69.0.10.45 domain2606 IN A 69.0.10.46 domain2607 IN A 69.0.10.47 domain2608 IN A 69.0.10.48 domain2609 IN A 69.0.10.49 domain2610 IN A 69.0.10.50 domain2611 IN A 69.0.10.51 domain2612 IN A 69.0.10.52 domain2613 IN A 69.0.10.53 domain2614 IN A 69.0.10.54 domain2615 IN A 69.0.10.55 domain2616 IN A 69.0.10.56 domain2617 IN A 69.0.10.57 domain2618 IN A 69.0.10.58 domain2619 IN A 69.0.10.59 domain2620 IN A 69.0.10.60 domain2621 IN A 69.0.10.61 domain2622 IN A 69.0.10.62 domain2623 IN A 69.0.10.63 domain2624 IN A 69.0.10.64 domain2625 IN A 69.0.10.65 domain2626 IN A 69.0.10.66 domain2627 IN A 69.0.10.67 domain2628 IN A 69.0.10.68 domain2629 IN A 69.0.10.69 domain2630 IN A 69.0.10.70 domain2631 IN A 69.0.10.71 domain2632 IN A 69.0.10.72 domain2633 IN A 69.0.10.73 domain2634 IN A 69.0.10.74 domain2635 IN A 69.0.10.75 domain2636 IN A 69.0.10.76 domain2637 IN A 69.0.10.77 domain2638 IN A 69.0.10.78 domain2639 IN A 69.0.10.79 domain2640 IN A 69.0.10.80 domain2641 IN A 69.0.10.81 domain2642 IN A 69.0.10.82 domain2643 IN A 69.0.10.83 domain2644 IN A 69.0.10.84 domain2645 IN A 69.0.10.85 domain2646 IN A 69.0.10.86 domain2647 IN A 69.0.10.87 domain2648 IN A 69.0.10.88 domain2649 IN A 69.0.10.89 domain2650 IN A 69.0.10.90 domain2651 IN A 69.0.10.91 domain2652 IN A 69.0.10.92 domain2653 IN A 69.0.10.93 domain2654 IN A 69.0.10.94 domain2655 IN A 69.0.10.95 domain2656 IN A 69.0.10.96 domain2657 IN A 69.0.10.97 domain2658 IN A 69.0.10.98 domain2659 IN A 69.0.10.99 domain2660 IN A 69.0.10.100 domain2661 IN A 69.0.10.101 domain2662 IN A 69.0.10.102 domain2663 IN A 69.0.10.103 domain2664 IN A 69.0.10.104 domain2665 IN A 69.0.10.105 domain2666 IN A 69.0.10.106 domain2667 IN A 69.0.10.107 domain2668 IN A 69.0.10.108 domain2669 IN A 69.0.10.109 domain2670 IN A 69.0.10.110 domain2671 IN A 69.0.10.111 domain2672 IN A 69.0.10.112 domain2673 IN A 69.0.10.113 domain2674 IN A 69.0.10.114 domain2675 IN A 69.0.10.115 domain2676 IN A 69.0.10.116 domain2677 IN A 69.0.10.117 domain2678 IN A 69.0.10.118 domain2679 IN A 69.0.10.119 domain2680 IN A 69.0.10.120 domain2681 IN A 69.0.10.121 domain2682 IN A 69.0.10.122 domain2683 IN A 69.0.10.123 domain2684 IN A 69.0.10.124 domain2685 IN A 69.0.10.125 domain2686 IN A 69.0.10.126 domain2687 IN A 69.0.10.127 domain2688 IN A 69.0.10.128 domain2689 IN A 69.0.10.129 domain2690 IN A 69.0.10.130 domain2691 IN A 69.0.10.131 domain2692 IN A 69.0.10.132 domain2693 IN A 69.0.10.133 domain2694 IN A 69.0.10.134 domain2695 IN A 69.0.10.135 domain2696 IN A 69.0.10.136 domain2697 IN A 69.0.10.137 domain2698 IN A 69.0.10.138 domain2699 IN A 69.0.10.139 domain2700 IN A 69.0.10.140 domain2701 IN A 69.0.10.141 domain2702 IN A 69.0.10.142 domain2703 IN A 69.0.10.143 domain2704 IN A 69.0.10.144 domain2705 IN A 69.0.10.145 domain2706 IN A 69.0.10.146 domain2707 IN A 69.0.10.147 domain2708 IN A 69.0.10.148 domain2709 IN A 69.0.10.149 domain2710 IN A 69.0.10.150 domain2711 IN A 69.0.10.151 domain2712 IN A 69.0.10.152 domain2713 IN A 69.0.10.153 domain2714 IN A 69.0.10.154 domain2715 IN A 69.0.10.155 domain2716 IN A 69.0.10.156 domain2717 IN A 69.0.10.157 domain2718 IN A 69.0.10.158 domain2719 IN A 69.0.10.159 domain2720 IN A 69.0.10.160 domain2721 IN A 69.0.10.161 domain2722 IN A 69.0.10.162 domain2723 IN A 69.0.10.163 domain2724 IN A 69.0.10.164 domain2725 IN A 69.0.10.165 domain2726 IN A 69.0.10.166 domain2727 IN A 69.0.10.167 domain2728 IN A 69.0.10.168 domain2729 IN A 69.0.10.169 domain2730 IN A 69.0.10.170 domain2731 IN A 69.0.10.171 domain2732 IN A 69.0.10.172 domain2733 IN A 69.0.10.173 domain2734 IN A 69.0.10.174 domain2735 IN A 69.0.10.175 domain2736 IN A 69.0.10.176 domain2737 IN A 69.0.10.177 domain2738 IN A 69.0.10.178 domain2739 IN A 69.0.10.179 domain2740 IN A 69.0.10.180 domain2741 IN A 69.0.10.181 domain2742 IN A 69.0.10.182 domain2743 IN A 69.0.10.183 domain2744 IN A 69.0.10.184 domain2745 IN A 69.0.10.185 domain2746 IN A 69.0.10.186 domain2747 IN A 69.0.10.187 domain2748 IN A 69.0.10.188 domain2749 IN A 69.0.10.189 domain2750 IN A 69.0.10.190 domain2751 IN A 69.0.10.191 domain2752 IN A 69.0.10.192 domain2753 IN A 69.0.10.193 domain2754 IN A 69.0.10.194 domain2755 IN A 69.0.10.195 domain2756 IN A 69.0.10.196 domain2757 IN A 69.0.10.197 domain2758 IN A 69.0.10.198 domain2759 IN A 69.0.10.199 domain2760 IN A 69.0.10.200 domain2761 IN A 69.0.10.201 domain2762 IN A 69.0.10.202 domain2763 IN A 69.0.10.203 domain2764 IN A 69.0.10.204 domain2765 IN A 69.0.10.205 domain2766 IN A 69.0.10.206 domain2767 IN A 69.0.10.207 domain2768 IN A 69.0.10.208 domain2769 IN A 69.0.10.209 domain2770 IN A 69.0.10.210 domain2771 IN A 69.0.10.211 domain2772 IN A 69.0.10.212 domain2773 IN A 69.0.10.213 domain2774 IN A 69.0.10.214 domain2775 IN A 69.0.10.215 domain2776 IN A 69.0.10.216 domain2777 IN A 69.0.10.217 domain2778 IN A 69.0.10.218 domain2779 IN A 69.0.10.219 domain2780 IN A 69.0.10.220 domain2781 IN A 69.0.10.221 domain2782 IN A 69.0.10.222 domain2783 IN A 69.0.10.223 domain2784 IN A 69.0.10.224 domain2785 IN A 69.0.10.225 domain2786 IN A 69.0.10.226 domain2787 IN A 69.0.10.227 domain2788 IN A 69.0.10.228 domain2789 IN A 69.0.10.229 domain2790 IN A 69.0.10.230 domain2791 IN A 69.0.10.231 domain2792 IN A 69.0.10.232 domain2793 IN A 69.0.10.233 domain2794 IN A 69.0.10.234 domain2795 IN A 69.0.10.235 domain2796 IN A 69.0.10.236 domain2797 IN A 69.0.10.237 domain2798 IN A 69.0.10.238 domain2799 IN A 69.0.10.239 domain2800 IN A 69.0.10.240 domain2801 IN A 69.0.10.241 domain2802 IN A 69.0.10.242 domain2803 IN A 69.0.10.243 domain2804 IN A 69.0.10.244 domain2805 IN A 69.0.10.245 domain2806 IN A 69.0.10.246 domain2807 IN A 69.0.10.247 domain2808 IN A 69.0.10.248 domain2809 IN A 69.0.10.249 domain2810 IN A 69.0.10.250 domain2811 IN A 69.0.10.251 domain2812 IN A 69.0.10.252 domain2813 IN A 69.0.10.253 domain2814 IN A 69.0.10.254 domain2815 IN A 69.0.10.255 domain2816 IN A 69.0.11.0 domain2817 IN A 69.0.11.1 domain2818 IN A 69.0.11.2 domain2819 IN A 69.0.11.3 domain2820 IN A 69.0.11.4 domain2821 IN A 69.0.11.5 domain2822 IN A 69.0.11.6 domain2823 IN A 69.0.11.7 domain2824 IN A 69.0.11.8 domain2825 IN A 69.0.11.9 domain2826 IN A 69.0.11.10 domain2827 IN A 69.0.11.11 domain2828 IN A 69.0.11.12 domain2829 IN A 69.0.11.13 domain2830 IN A 69.0.11.14 domain2831 IN A 69.0.11.15 domain2832 IN A 69.0.11.16 domain2833 IN A 69.0.11.17 domain2834 IN A 69.0.11.18 domain2835 IN A 69.0.11.19 domain2836 IN A 69.0.11.20 domain2837 IN A 69.0.11.21 domain2838 IN A 69.0.11.22 domain2839 IN A 69.0.11.23 domain2840 IN A 69.0.11.24 domain2841 IN A 69.0.11.25 domain2842 IN A 69.0.11.26 domain2843 IN A 69.0.11.27 domain2844 IN A 69.0.11.28 domain2845 IN A 69.0.11.29 domain2846 IN A 69.0.11.30 domain2847 IN A 69.0.11.31 domain2848 IN A 69.0.11.32 domain2849 IN A 69.0.11.33 domain2850 IN A 69.0.11.34 domain2851 IN A 69.0.11.35 domain2852 IN A 69.0.11.36 domain2853 IN A 69.0.11.37 domain2854 IN A 69.0.11.38 domain2855 IN A 69.0.11.39 domain2856 IN A 69.0.11.40 domain2857 IN A 69.0.11.41 domain2858 IN A 69.0.11.42 domain2859 IN A 69.0.11.43 domain2860 IN A 69.0.11.44 domain2861 IN A 69.0.11.45 domain2862 IN A 69.0.11.46 domain2863 IN A 69.0.11.47 domain2864 IN A 69.0.11.48 domain2865 IN A 69.0.11.49 domain2866 IN A 69.0.11.50 domain2867 IN A 69.0.11.51 domain2868 IN A 69.0.11.52 domain2869 IN A 69.0.11.53 domain2870 IN A 69.0.11.54 domain2871 IN A 69.0.11.55 domain2872 IN A 69.0.11.56 domain2873 IN A 69.0.11.57 domain2874 IN A 69.0.11.58 domain2875 IN A 69.0.11.59 domain2876 IN A 69.0.11.60 domain2877 IN A 69.0.11.61 domain2878 IN A 69.0.11.62 domain2879 IN A 69.0.11.63 domain2880 IN A 69.0.11.64 domain2881 IN A 69.0.11.65 domain2882 IN A 69.0.11.66 domain2883 IN A 69.0.11.67 domain2884 IN A 69.0.11.68 domain2885 IN A 69.0.11.69 domain2886 IN A 69.0.11.70 domain2887 IN A 69.0.11.71 domain2888 IN A 69.0.11.72 domain2889 IN A 69.0.11.73 domain2890 IN A 69.0.11.74 domain2891 IN A 69.0.11.75 domain2892 IN A 69.0.11.76 domain2893 IN A 69.0.11.77 domain2894 IN A 69.0.11.78 domain2895 IN A 69.0.11.79 domain2896 IN A 69.0.11.80 domain2897 IN A 69.0.11.81 domain2898 IN A 69.0.11.82 domain2899 IN A 69.0.11.83 domain2900 IN A 69.0.11.84 domain2901 IN A 69.0.11.85 domain2902 IN A 69.0.11.86 domain2903 IN A 69.0.11.87 domain2904 IN A 69.0.11.88 domain2905 IN A 69.0.11.89 domain2906 IN A 69.0.11.90 domain2907 IN A 69.0.11.91 domain2908 IN A 69.0.11.92 domain2909 IN A 69.0.11.93 domain2910 IN A 69.0.11.94 domain2911 IN A 69.0.11.95 domain2912 IN A 69.0.11.96 domain2913 IN A 69.0.11.97 domain2914 IN A 69.0.11.98 domain2915 IN A 69.0.11.99 domain2916 IN A 69.0.11.100 domain2917 IN A 69.0.11.101 domain2918 IN A 69.0.11.102 domain2919 IN A 69.0.11.103 domain2920 IN A 69.0.11.104 domain2921 IN A 69.0.11.105 domain2922 IN A 69.0.11.106 domain2923 IN A 69.0.11.107 domain2924 IN A 69.0.11.108 domain2925 IN A 69.0.11.109 domain2926 IN A 69.0.11.110 domain2927 IN A 69.0.11.111 domain2928 IN A 69.0.11.112 domain2929 IN A 69.0.11.113 domain2930 IN A 69.0.11.114 domain2931 IN A 69.0.11.115 domain2932 IN A 69.0.11.116 domain2933 IN A 69.0.11.117 domain2934 IN A 69.0.11.118 domain2935 IN A 69.0.11.119 domain2936 IN A 69.0.11.120 domain2937 IN A 69.0.11.121 domain2938 IN A 69.0.11.122 domain2939 IN A 69.0.11.123 domain2940 IN A 69.0.11.124 domain2941 IN A 69.0.11.125 domain2942 IN A 69.0.11.126 domain2943 IN A 69.0.11.127 domain2944 IN A 69.0.11.128 domain2945 IN A 69.0.11.129 domain2946 IN A 69.0.11.130 domain2947 IN A 69.0.11.131 domain2948 IN A 69.0.11.132 domain2949 IN A 69.0.11.133 domain2950 IN A 69.0.11.134 domain2951 IN A 69.0.11.135 domain2952 IN A 69.0.11.136 domain2953 IN A 69.0.11.137 domain2954 IN A 69.0.11.138 domain2955 IN A 69.0.11.139 domain2956 IN A 69.0.11.140 domain2957 IN A 69.0.11.141 domain2958 IN A 69.0.11.142 domain2959 IN A 69.0.11.143 domain2960 IN A 69.0.11.144 domain2961 IN A 69.0.11.145 domain2962 IN A 69.0.11.146 domain2963 IN A 69.0.11.147 domain2964 IN A 69.0.11.148 domain2965 IN A 69.0.11.149 domain2966 IN A 69.0.11.150 domain2967 IN A 69.0.11.151 domain2968 IN A 69.0.11.152 domain2969 IN A 69.0.11.153 domain2970 IN A 69.0.11.154 domain2971 IN A 69.0.11.155 domain2972 IN A 69.0.11.156 domain2973 IN A 69.0.11.157 domain2974 IN A 69.0.11.158 domain2975 IN A 69.0.11.159 domain2976 IN A 69.0.11.160 domain2977 IN A 69.0.11.161 domain2978 IN A 69.0.11.162 domain2979 IN A 69.0.11.163 domain2980 IN A 69.0.11.164 domain2981 IN A 69.0.11.165 domain2982 IN A 69.0.11.166 domain2983 IN A 69.0.11.167 domain2984 IN A 69.0.11.168 domain2985 IN A 69.0.11.169 domain2986 IN A 69.0.11.170 domain2987 IN A 69.0.11.171 domain2988 IN A 69.0.11.172 domain2989 IN A 69.0.11.173 domain2990 IN A 69.0.11.174 domain2991 IN A 69.0.11.175 domain2992 IN A 69.0.11.176 domain2993 IN A 69.0.11.177 domain2994 IN A 69.0.11.178 domain2995 IN A 69.0.11.179 domain2996 IN A 69.0.11.180 domain2997 IN A 69.0.11.181 domain2998 IN A 69.0.11.182 domain2999 IN A 69.0.11.183 domain3000 IN A 69.0.11.184 domain3001 IN A 69.0.11.185 domain3002 IN A 69.0.11.186 domain3003 IN A 69.0.11.187 domain3004 IN A 69.0.11.188 domain3005 IN A 69.0.11.189 domain3006 IN A 69.0.11.190 domain3007 IN A 69.0.11.191 domain3008 IN A 69.0.11.192 domain3009 IN A 69.0.11.193 domain3010 IN A 69.0.11.194 domain3011 IN A 69.0.11.195 domain3012 IN A 69.0.11.196 domain3013 IN A 69.0.11.197 domain3014 IN A 69.0.11.198 domain3015 IN A 69.0.11.199 domain3016 IN A 69.0.11.200 domain3017 IN A 69.0.11.201 domain3018 IN A 69.0.11.202 domain3019 IN A 69.0.11.203 domain3020 IN A 69.0.11.204 domain3021 IN A 69.0.11.205 domain3022 IN A 69.0.11.206 domain3023 IN A 69.0.11.207 domain3024 IN A 69.0.11.208 domain3025 IN A 69.0.11.209 domain3026 IN A 69.0.11.210 domain3027 IN A 69.0.11.211 domain3028 IN A 69.0.11.212 domain3029 IN A 69.0.11.213 domain3030 IN A 69.0.11.214 domain3031 IN A 69.0.11.215 domain3032 IN A 69.0.11.216 domain3033 IN A 69.0.11.217 domain3034 IN A 69.0.11.218 domain3035 IN A 69.0.11.219 domain3036 IN A 69.0.11.220 domain3037 IN A 69.0.11.221 domain3038 IN A 69.0.11.222 domain3039 IN A 69.0.11.223 domain3040 IN A 69.0.11.224 domain3041 IN A 69.0.11.225 domain3042 IN A 69.0.11.226 domain3043 IN A 69.0.11.227 domain3044 IN A 69.0.11.228 domain3045 IN A 69.0.11.229 domain3046 IN A 69.0.11.230 domain3047 IN A 69.0.11.231 domain3048 IN A 69.0.11.232 domain3049 IN A 69.0.11.233 domain3050 IN A 69.0.11.234 domain3051 IN A 69.0.11.235 domain3052 IN A 69.0.11.236 domain3053 IN A 69.0.11.237 domain3054 IN A 69.0.11.238 domain3055 IN A 69.0.11.239 domain3056 IN A 69.0.11.240 domain3057 IN A 69.0.11.241 domain3058 IN A 69.0.11.242 domain3059 IN A 69.0.11.243 domain3060 IN A 69.0.11.244 domain3061 IN A 69.0.11.245 domain3062 IN A 69.0.11.246 domain3063 IN A 69.0.11.247 domain3064 IN A 69.0.11.248 domain3065 IN A 69.0.11.249 domain3066 IN A 69.0.11.250 domain3067 IN A 69.0.11.251 domain3068 IN A 69.0.11.252 domain3069 IN A 69.0.11.253 domain3070 IN A 69.0.11.254 domain3071 IN A 69.0.11.255 domain3072 IN A 69.0.12.0 domain3073 IN A 69.0.12.1 domain3074 IN A 69.0.12.2 domain3075 IN A 69.0.12.3 domain3076 IN A 69.0.12.4 domain3077 IN A 69.0.12.5 domain3078 IN A 69.0.12.6 domain3079 IN A 69.0.12.7 domain3080 IN A 69.0.12.8 domain3081 IN A 69.0.12.9 domain3082 IN A 69.0.12.10 domain3083 IN A 69.0.12.11 domain3084 IN A 69.0.12.12 domain3085 IN A 69.0.12.13 domain3086 IN A 69.0.12.14 domain3087 IN A 69.0.12.15 domain3088 IN A 69.0.12.16 domain3089 IN A 69.0.12.17 domain3090 IN A 69.0.12.18 domain3091 IN A 69.0.12.19 domain3092 IN A 69.0.12.20 domain3093 IN A 69.0.12.21 domain3094 IN A 69.0.12.22 domain3095 IN A 69.0.12.23 domain3096 IN A 69.0.12.24 domain3097 IN A 69.0.12.25 domain3098 IN A 69.0.12.26 domain3099 IN A 69.0.12.27 domain3100 IN A 69.0.12.28 domain3101 IN A 69.0.12.29 domain3102 IN A 69.0.12.30 domain3103 IN A 69.0.12.31 domain3104 IN A 69.0.12.32 domain3105 IN A 69.0.12.33 domain3106 IN A 69.0.12.34 domain3107 IN A 69.0.12.35 domain3108 IN A 69.0.12.36 domain3109 IN A 69.0.12.37 domain3110 IN A 69.0.12.38 domain3111 IN A 69.0.12.39 domain3112 IN A 69.0.12.40 domain3113 IN A 69.0.12.41 domain3114 IN A 69.0.12.42 domain3115 IN A 69.0.12.43 domain3116 IN A 69.0.12.44 domain3117 IN A 69.0.12.45 domain3118 IN A 69.0.12.46 domain3119 IN A 69.0.12.47 domain3120 IN A 69.0.12.48 domain3121 IN A 69.0.12.49 domain3122 IN A 69.0.12.50 domain3123 IN A 69.0.12.51 domain3124 IN A 69.0.12.52 domain3125 IN A 69.0.12.53 domain3126 IN A 69.0.12.54 domain3127 IN A 69.0.12.55 domain3128 IN A 69.0.12.56 domain3129 IN A 69.0.12.57 domain3130 IN A 69.0.12.58 domain3131 IN A 69.0.12.59 domain3132 IN A 69.0.12.60 domain3133 IN A 69.0.12.61 domain3134 IN A 69.0.12.62 domain3135 IN A 69.0.12.63 domain3136 IN A 69.0.12.64 domain3137 IN A 69.0.12.65 domain3138 IN A 69.0.12.66 domain3139 IN A 69.0.12.67 domain3140 IN A 69.0.12.68 domain3141 IN A 69.0.12.69 domain3142 IN A 69.0.12.70 domain3143 IN A 69.0.12.71 domain3144 IN A 69.0.12.72 domain3145 IN A 69.0.12.73 domain3146 IN A 69.0.12.74 domain3147 IN A 69.0.12.75 domain3148 IN A 69.0.12.76 domain3149 IN A 69.0.12.77 domain3150 IN A 69.0.12.78 domain3151 IN A 69.0.12.79 domain3152 IN A 69.0.12.80 domain3153 IN A 69.0.12.81 domain3154 IN A 69.0.12.82 domain3155 IN A 69.0.12.83 domain3156 IN A 69.0.12.84 domain3157 IN A 69.0.12.85 domain3158 IN A 69.0.12.86 domain3159 IN A 69.0.12.87 domain3160 IN A 69.0.12.88 domain3161 IN A 69.0.12.89 domain3162 IN A 69.0.12.90 domain3163 IN A 69.0.12.91 domain3164 IN A 69.0.12.92 domain3165 IN A 69.0.12.93 domain3166 IN A 69.0.12.94 domain3167 IN A 69.0.12.95 domain3168 IN A 69.0.12.96 domain3169 IN A 69.0.12.97 domain3170 IN A 69.0.12.98 domain3171 IN A 69.0.12.99 domain3172 IN A 69.0.12.100 domain3173 IN A 69.0.12.101 domain3174 IN A 69.0.12.102 domain3175 IN A 69.0.12.103 domain3176 IN A 69.0.12.104 domain3177 IN A 69.0.12.105 domain3178 IN A 69.0.12.106 domain3179 IN A 69.0.12.107 domain3180 IN A 69.0.12.108 domain3181 IN A 69.0.12.109 domain3182 IN A 69.0.12.110 domain3183 IN A 69.0.12.111 domain3184 IN A 69.0.12.112 domain3185 IN A 69.0.12.113 domain3186 IN A 69.0.12.114 domain3187 IN A 69.0.12.115 domain3188 IN A 69.0.12.116 domain3189 IN A 69.0.12.117 domain3190 IN A 69.0.12.118 domain3191 IN A 69.0.12.119 domain3192 IN A 69.0.12.120 domain3193 IN A 69.0.12.121 domain3194 IN A 69.0.12.122 domain3195 IN A 69.0.12.123 domain3196 IN A 69.0.12.124 domain3197 IN A 69.0.12.125 domain3198 IN A 69.0.12.126 domain3199 IN A 69.0.12.127 domain3200 IN A 69.0.12.128 domain3201 IN A 69.0.12.129 domain3202 IN A 69.0.12.130 domain3203 IN A 69.0.12.131 domain3204 IN A 69.0.12.132 domain3205 IN A 69.0.12.133 domain3206 IN A 69.0.12.134 domain3207 IN A 69.0.12.135 domain3208 IN A 69.0.12.136 domain3209 IN A 69.0.12.137 domain3210 IN A 69.0.12.138 domain3211 IN A 69.0.12.139 domain3212 IN A 69.0.12.140 domain3213 IN A 69.0.12.141 domain3214 IN A 69.0.12.142 domain3215 IN A 69.0.12.143 domain3216 IN A 69.0.12.144 domain3217 IN A 69.0.12.145 domain3218 IN A 69.0.12.146 domain3219 IN A 69.0.12.147 domain3220 IN A 69.0.12.148 domain3221 IN A 69.0.12.149 domain3222 IN A 69.0.12.150 domain3223 IN A 69.0.12.151 domain3224 IN A 69.0.12.152 domain3225 IN A 69.0.12.153 domain3226 IN A 69.0.12.154 domain3227 IN A 69.0.12.155 domain3228 IN A 69.0.12.156 domain3229 IN A 69.0.12.157 domain3230 IN A 69.0.12.158 domain3231 IN A 69.0.12.159 domain3232 IN A 69.0.12.160 domain3233 IN A 69.0.12.161 domain3234 IN A 69.0.12.162 domain3235 IN A 69.0.12.163 domain3236 IN A 69.0.12.164 domain3237 IN A 69.0.12.165 domain3238 IN A 69.0.12.166 domain3239 IN A 69.0.12.167 domain3240 IN A 69.0.12.168 domain3241 IN A 69.0.12.169 domain3242 IN A 69.0.12.170 domain3243 IN A 69.0.12.171 domain3244 IN A 69.0.12.172 domain3245 IN A 69.0.12.173 domain3246 IN A 69.0.12.174 domain3247 IN A 69.0.12.175 domain3248 IN A 69.0.12.176 domain3249 IN A 69.0.12.177 domain3250 IN A 69.0.12.178 domain3251 IN A 69.0.12.179 domain3252 IN A 69.0.12.180 domain3253 IN A 69.0.12.181 domain3254 IN A 69.0.12.182 domain3255 IN A 69.0.12.183 domain3256 IN A 69.0.12.184 domain3257 IN A 69.0.12.185 domain3258 IN A 69.0.12.186 domain3259 IN A 69.0.12.187 domain3260 IN A 69.0.12.188 domain3261 IN A 69.0.12.189 domain3262 IN A 69.0.12.190 domain3263 IN A 69.0.12.191 domain3264 IN A 69.0.12.192 domain3265 IN A 69.0.12.193 domain3266 IN A 69.0.12.194 domain3267 IN A 69.0.12.195 domain3268 IN A 69.0.12.196 domain3269 IN A 69.0.12.197 domain3270 IN A 69.0.12.198 domain3271 IN A 69.0.12.199 domain3272 IN A 69.0.12.200 domain3273 IN A 69.0.12.201 domain3274 IN A 69.0.12.202 domain3275 IN A 69.0.12.203 domain3276 IN A 69.0.12.204 domain3277 IN A 69.0.12.205 domain3278 IN A 69.0.12.206 domain3279 IN A 69.0.12.207 domain3280 IN A 69.0.12.208 domain3281 IN A 69.0.12.209 domain3282 IN A 69.0.12.210 domain3283 IN A 69.0.12.211 domain3284 IN A 69.0.12.212 domain3285 IN A 69.0.12.213 domain3286 IN A 69.0.12.214 domain3287 IN A 69.0.12.215 domain3288 IN A 69.0.12.216 domain3289 IN A 69.0.12.217 domain3290 IN A 69.0.12.218 domain3291 IN A 69.0.12.219 domain3292 IN A 69.0.12.220 domain3293 IN A 69.0.12.221 domain3294 IN A 69.0.12.222 domain3295 IN A 69.0.12.223 domain3296 IN A 69.0.12.224 domain3297 IN A 69.0.12.225 domain3298 IN A 69.0.12.226 domain3299 IN A 69.0.12.227 domain3300 IN A 69.0.12.228 domain3301 IN A 69.0.12.229 domain3302 IN A 69.0.12.230 domain3303 IN A 69.0.12.231 domain3304 IN A 69.0.12.232 domain3305 IN A 69.0.12.233 domain3306 IN A 69.0.12.234 domain3307 IN A 69.0.12.235 domain3308 IN A 69.0.12.236 domain3309 IN A 69.0.12.237 domain3310 IN A 69.0.12.238 domain3311 IN A 69.0.12.239 domain3312 IN A 69.0.12.240 domain3313 IN A 69.0.12.241 domain3314 IN A 69.0.12.242 domain3315 IN A 69.0.12.243 domain3316 IN A 69.0.12.244 domain3317 IN A 69.0.12.245 domain3318 IN A 69.0.12.246 domain3319 IN A 69.0.12.247 domain3320 IN A 69.0.12.248 domain3321 IN A 69.0.12.249 domain3322 IN A 69.0.12.250 domain3323 IN A 69.0.12.251 domain3324 IN A 69.0.12.252 domain3325 IN A 69.0.12.253 domain3326 IN A 69.0.12.254 domain3327 IN A 69.0.12.255 domain3328 IN A 69.0.13.0 domain3329 IN A 69.0.13.1 domain3330 IN A 69.0.13.2 domain3331 IN A 69.0.13.3 domain3332 IN A 69.0.13.4 domain3333 IN A 69.0.13.5 domain3334 IN A 69.0.13.6 domain3335 IN A 69.0.13.7 domain3336 IN A 69.0.13.8 domain3337 IN A 69.0.13.9 domain3338 IN A 69.0.13.10 domain3339 IN A 69.0.13.11 domain3340 IN A 69.0.13.12 domain3341 IN A 69.0.13.13 domain3342 IN A 69.0.13.14 domain3343 IN A 69.0.13.15 domain3344 IN A 69.0.13.16 domain3345 IN A 69.0.13.17 domain3346 IN A 69.0.13.18 domain3347 IN A 69.0.13.19 domain3348 IN A 69.0.13.20 domain3349 IN A 69.0.13.21 domain3350 IN A 69.0.13.22 domain3351 IN A 69.0.13.23 domain3352 IN A 69.0.13.24 domain3353 IN A 69.0.13.25 domain3354 IN A 69.0.13.26 domain3355 IN A 69.0.13.27 domain3356 IN A 69.0.13.28 domain3357 IN A 69.0.13.29 domain3358 IN A 69.0.13.30 domain3359 IN A 69.0.13.31 domain3360 IN A 69.0.13.32 domain3361 IN A 69.0.13.33 domain3362 IN A 69.0.13.34 domain3363 IN A 69.0.13.35 domain3364 IN A 69.0.13.36 domain3365 IN A 69.0.13.37 domain3366 IN A 69.0.13.38 domain3367 IN A 69.0.13.39 domain3368 IN A 69.0.13.40 domain3369 IN A 69.0.13.41 domain3370 IN A 69.0.13.42 domain3371 IN A 69.0.13.43 domain3372 IN A 69.0.13.44 domain3373 IN A 69.0.13.45 domain3374 IN A 69.0.13.46 domain3375 IN A 69.0.13.47 domain3376 IN A 69.0.13.48 domain3377 IN A 69.0.13.49 domain3378 IN A 69.0.13.50 domain3379 IN A 69.0.13.51 domain3380 IN A 69.0.13.52 domain3381 IN A 69.0.13.53 domain3382 IN A 69.0.13.54 domain3383 IN A 69.0.13.55 domain3384 IN A 69.0.13.56 domain3385 IN A 69.0.13.57 domain3386 IN A 69.0.13.58 domain3387 IN A 69.0.13.59 domain3388 IN A 69.0.13.60 domain3389 IN A 69.0.13.61 domain3390 IN A 69.0.13.62 domain3391 IN A 69.0.13.63 domain3392 IN A 69.0.13.64 domain3393 IN A 69.0.13.65 domain3394 IN A 69.0.13.66 domain3395 IN A 69.0.13.67 domain3396 IN A 69.0.13.68 domain3397 IN A 69.0.13.69 domain3398 IN A 69.0.13.70 domain3399 IN A 69.0.13.71 domain3400 IN A 69.0.13.72 domain3401 IN A 69.0.13.73 domain3402 IN A 69.0.13.74 domain3403 IN A 69.0.13.75 domain3404 IN A 69.0.13.76 domain3405 IN A 69.0.13.77 domain3406 IN A 69.0.13.78 domain3407 IN A 69.0.13.79 domain3408 IN A 69.0.13.80 domain3409 IN A 69.0.13.81 domain3410 IN A 69.0.13.82 domain3411 IN A 69.0.13.83 domain3412 IN A 69.0.13.84 domain3413 IN A 69.0.13.85 domain3414 IN A 69.0.13.86 domain3415 IN A 69.0.13.87 domain3416 IN A 69.0.13.88 domain3417 IN A 69.0.13.89 domain3418 IN A 69.0.13.90 domain3419 IN A 69.0.13.91 domain3420 IN A 69.0.13.92 domain3421 IN A 69.0.13.93 domain3422 IN A 69.0.13.94 domain3423 IN A 69.0.13.95 domain3424 IN A 69.0.13.96 domain3425 IN A 69.0.13.97 domain3426 IN A 69.0.13.98 domain3427 IN A 69.0.13.99 domain3428 IN A 69.0.13.100 domain3429 IN A 69.0.13.101 domain3430 IN A 69.0.13.102 domain3431 IN A 69.0.13.103 domain3432 IN A 69.0.13.104 domain3433 IN A 69.0.13.105 domain3434 IN A 69.0.13.106 domain3435 IN A 69.0.13.107 domain3436 IN A 69.0.13.108 domain3437 IN A 69.0.13.109 domain3438 IN A 69.0.13.110 domain3439 IN A 69.0.13.111 domain3440 IN A 69.0.13.112 domain3441 IN A 69.0.13.113 domain3442 IN A 69.0.13.114 domain3443 IN A 69.0.13.115 domain3444 IN A 69.0.13.116 domain3445 IN A 69.0.13.117 domain3446 IN A 69.0.13.118 domain3447 IN A 69.0.13.119 domain3448 IN A 69.0.13.120 domain3449 IN A 69.0.13.121 domain3450 IN A 69.0.13.122 domain3451 IN A 69.0.13.123 domain3452 IN A 69.0.13.124 domain3453 IN A 69.0.13.125 domain3454 IN A 69.0.13.126 domain3455 IN A 69.0.13.127 domain3456 IN A 69.0.13.128 domain3457 IN A 69.0.13.129 domain3458 IN A 69.0.13.130 domain3459 IN A 69.0.13.131 domain3460 IN A 69.0.13.132 domain3461 IN A 69.0.13.133 domain3462 IN A 69.0.13.134 domain3463 IN A 69.0.13.135 domain3464 IN A 69.0.13.136 domain3465 IN A 69.0.13.137 domain3466 IN A 69.0.13.138 domain3467 IN A 69.0.13.139 domain3468 IN A 69.0.13.140 domain3469 IN A 69.0.13.141 domain3470 IN A 69.0.13.142 domain3471 IN A 69.0.13.143 domain3472 IN A 69.0.13.144 domain3473 IN A 69.0.13.145 domain3474 IN A 69.0.13.146 domain3475 IN A 69.0.13.147 domain3476 IN A 69.0.13.148 domain3477 IN A 69.0.13.149 domain3478 IN A 69.0.13.150 domain3479 IN A 69.0.13.151 domain3480 IN A 69.0.13.152 domain3481 IN A 69.0.13.153 domain3482 IN A 69.0.13.154 domain3483 IN A 69.0.13.155 domain3484 IN A 69.0.13.156 domain3485 IN A 69.0.13.157 domain3486 IN A 69.0.13.158 domain3487 IN A 69.0.13.159 domain3488 IN A 69.0.13.160 domain3489 IN A 69.0.13.161 domain3490 IN A 69.0.13.162 domain3491 IN A 69.0.13.163 domain3492 IN A 69.0.13.164 domain3493 IN A 69.0.13.165 domain3494 IN A 69.0.13.166 domain3495 IN A 69.0.13.167 domain3496 IN A 69.0.13.168 domain3497 IN A 69.0.13.169 domain3498 IN A 69.0.13.170 domain3499 IN A 69.0.13.171 domain3500 IN A 69.0.13.172 domain3501 IN A 69.0.13.173 domain3502 IN A 69.0.13.174 domain3503 IN A 69.0.13.175 domain3504 IN A 69.0.13.176 domain3505 IN A 69.0.13.177 domain3506 IN A 69.0.13.178 domain3507 IN A 69.0.13.179 domain3508 IN A 69.0.13.180 domain3509 IN A 69.0.13.181 domain3510 IN A 69.0.13.182 domain3511 IN A 69.0.13.183 domain3512 IN A 69.0.13.184 domain3513 IN A 69.0.13.185 domain3514 IN A 69.0.13.186 domain3515 IN A 69.0.13.187 domain3516 IN A 69.0.13.188 domain3517 IN A 69.0.13.189 domain3518 IN A 69.0.13.190 domain3519 IN A 69.0.13.191 domain3520 IN A 69.0.13.192 domain3521 IN A 69.0.13.193 domain3522 IN A 69.0.13.194 domain3523 IN A 69.0.13.195 domain3524 IN A 69.0.13.196 domain3525 IN A 69.0.13.197 domain3526 IN A 69.0.13.198 domain3527 IN A 69.0.13.199 domain3528 IN A 69.0.13.200 domain3529 IN A 69.0.13.201 domain3530 IN A 69.0.13.202 domain3531 IN A 69.0.13.203 domain3532 IN A 69.0.13.204 domain3533 IN A 69.0.13.205 domain3534 IN A 69.0.13.206 domain3535 IN A 69.0.13.207 domain3536 IN A 69.0.13.208 domain3537 IN A 69.0.13.209 domain3538 IN A 69.0.13.210 domain3539 IN A 69.0.13.211 domain3540 IN A 69.0.13.212 domain3541 IN A 69.0.13.213 domain3542 IN A 69.0.13.214 domain3543 IN A 69.0.13.215 domain3544 IN A 69.0.13.216 domain3545 IN A 69.0.13.217 domain3546 IN A 69.0.13.218 domain3547 IN A 69.0.13.219 domain3548 IN A 69.0.13.220 domain3549 IN A 69.0.13.221 domain3550 IN A 69.0.13.222 domain3551 IN A 69.0.13.223 domain3552 IN A 69.0.13.224 domain3553 IN A 69.0.13.225 domain3554 IN A 69.0.13.226 domain3555 IN A 69.0.13.227 domain3556 IN A 69.0.13.228 domain3557 IN A 69.0.13.229 domain3558 IN A 69.0.13.230 domain3559 IN A 69.0.13.231 domain3560 IN A 69.0.13.232 domain3561 IN A 69.0.13.233 domain3562 IN A 69.0.13.234 domain3563 IN A 69.0.13.235 domain3564 IN A 69.0.13.236 domain3565 IN A 69.0.13.237 domain3566 IN A 69.0.13.238 domain3567 IN A 69.0.13.239 domain3568 IN A 69.0.13.240 domain3569 IN A 69.0.13.241 domain3570 IN A 69.0.13.242 domain3571 IN A 69.0.13.243 domain3572 IN A 69.0.13.244 domain3573 IN A 69.0.13.245 domain3574 IN A 69.0.13.246 domain3575 IN A 69.0.13.247 domain3576 IN A 69.0.13.248 domain3577 IN A 69.0.13.249 domain3578 IN A 69.0.13.250 domain3579 IN A 69.0.13.251 domain3580 IN A 69.0.13.252 domain3581 IN A 69.0.13.253 domain3582 IN A 69.0.13.254 domain3583 IN A 69.0.13.255 domain3584 IN A 69.0.14.0 domain3585 IN A 69.0.14.1 domain3586 IN A 69.0.14.2 domain3587 IN A 69.0.14.3 domain3588 IN A 69.0.14.4 domain3589 IN A 69.0.14.5 domain3590 IN A 69.0.14.6 domain3591 IN A 69.0.14.7 domain3592 IN A 69.0.14.8 domain3593 IN A 69.0.14.9 domain3594 IN A 69.0.14.10 domain3595 IN A 69.0.14.11 domain3596 IN A 69.0.14.12 domain3597 IN A 69.0.14.13 domain3598 IN A 69.0.14.14 domain3599 IN A 69.0.14.15 domain3600 IN A 69.0.14.16 domain3601 IN A 69.0.14.17 domain3602 IN A 69.0.14.18 domain3603 IN A 69.0.14.19 domain3604 IN A 69.0.14.20 domain3605 IN A 69.0.14.21 domain3606 IN A 69.0.14.22 domain3607 IN A 69.0.14.23 domain3608 IN A 69.0.14.24 domain3609 IN A 69.0.14.25 domain3610 IN A 69.0.14.26 domain3611 IN A 69.0.14.27 domain3612 IN A 69.0.14.28 domain3613 IN A 69.0.14.29 domain3614 IN A 69.0.14.30 domain3615 IN A 69.0.14.31 domain3616 IN A 69.0.14.32 domain3617 IN A 69.0.14.33 domain3618 IN A 69.0.14.34 domain3619 IN A 69.0.14.35 domain3620 IN A 69.0.14.36 domain3621 IN A 69.0.14.37 domain3622 IN A 69.0.14.38 domain3623 IN A 69.0.14.39 domain3624 IN A 69.0.14.40 domain3625 IN A 69.0.14.41 domain3626 IN A 69.0.14.42 domain3627 IN A 69.0.14.43 domain3628 IN A 69.0.14.44 domain3629 IN A 69.0.14.45 domain3630 IN A 69.0.14.46 domain3631 IN A 69.0.14.47 domain3632 IN A 69.0.14.48 domain3633 IN A 69.0.14.49 domain3634 IN A 69.0.14.50 domain3635 IN A 69.0.14.51 domain3636 IN A 69.0.14.52 domain3637 IN A 69.0.14.53 domain3638 IN A 69.0.14.54 domain3639 IN A 69.0.14.55 domain3640 IN A 69.0.14.56 domain3641 IN A 69.0.14.57 domain3642 IN A 69.0.14.58 domain3643 IN A 69.0.14.59 domain3644 IN A 69.0.14.60 domain3645 IN A 69.0.14.61 domain3646 IN A 69.0.14.62 domain3647 IN A 69.0.14.63 domain3648 IN A 69.0.14.64 domain3649 IN A 69.0.14.65 domain3650 IN A 69.0.14.66 domain3651 IN A 69.0.14.67 domain3652 IN A 69.0.14.68 domain3653 IN A 69.0.14.69 domain3654 IN A 69.0.14.70 domain3655 IN A 69.0.14.71 domain3656 IN A 69.0.14.72 domain3657 IN A 69.0.14.73 domain3658 IN A 69.0.14.74 domain3659 IN A 69.0.14.75 domain3660 IN A 69.0.14.76 domain3661 IN A 69.0.14.77 domain3662 IN A 69.0.14.78 domain3663 IN A 69.0.14.79 domain3664 IN A 69.0.14.80 domain3665 IN A 69.0.14.81 domain3666 IN A 69.0.14.82 domain3667 IN A 69.0.14.83 domain3668 IN A 69.0.14.84 domain3669 IN A 69.0.14.85 domain3670 IN A 69.0.14.86 domain3671 IN A 69.0.14.87 domain3672 IN A 69.0.14.88 domain3673 IN A 69.0.14.89 domain3674 IN A 69.0.14.90 domain3675 IN A 69.0.14.91 domain3676 IN A 69.0.14.92 domain3677 IN A 69.0.14.93 domain3678 IN A 69.0.14.94 domain3679 IN A 69.0.14.95 domain3680 IN A 69.0.14.96 domain3681 IN A 69.0.14.97 domain3682 IN A 69.0.14.98 domain3683 IN A 69.0.14.99 domain3684 IN A 69.0.14.100 domain3685 IN A 69.0.14.101 domain3686 IN A 69.0.14.102 domain3687 IN A 69.0.14.103 domain3688 IN A 69.0.14.104 domain3689 IN A 69.0.14.105 domain3690 IN A 69.0.14.106 domain3691 IN A 69.0.14.107 domain3692 IN A 69.0.14.108 domain3693 IN A 69.0.14.109 domain3694 IN A 69.0.14.110 domain3695 IN A 69.0.14.111 domain3696 IN A 69.0.14.112 domain3697 IN A 69.0.14.113 domain3698 IN A 69.0.14.114 domain3699 IN A 69.0.14.115 domain3700 IN A 69.0.14.116 domain3701 IN A 69.0.14.117 domain3702 IN A 69.0.14.118 domain3703 IN A 69.0.14.119 domain3704 IN A 69.0.14.120 domain3705 IN A 69.0.14.121 domain3706 IN A 69.0.14.122 domain3707 IN A 69.0.14.123 domain3708 IN A 69.0.14.124 domain3709 IN A 69.0.14.125 domain3710 IN A 69.0.14.126 domain3711 IN A 69.0.14.127 domain3712 IN A 69.0.14.128 domain3713 IN A 69.0.14.129 domain3714 IN A 69.0.14.130 domain3715 IN A 69.0.14.131 domain3716 IN A 69.0.14.132 domain3717 IN A 69.0.14.133 domain3718 IN A 69.0.14.134 domain3719 IN A 69.0.14.135 domain3720 IN A 69.0.14.136 domain3721 IN A 69.0.14.137 domain3722 IN A 69.0.14.138 domain3723 IN A 69.0.14.139 domain3724 IN A 69.0.14.140 domain3725 IN A 69.0.14.141 domain3726 IN A 69.0.14.142 domain3727 IN A 69.0.14.143 domain3728 IN A 69.0.14.144 domain3729 IN A 69.0.14.145 domain3730 IN A 69.0.14.146 domain3731 IN A 69.0.14.147 domain3732 IN A 69.0.14.148 domain3733 IN A 69.0.14.149 domain3734 IN A 69.0.14.150 domain3735 IN A 69.0.14.151 domain3736 IN A 69.0.14.152 domain3737 IN A 69.0.14.153 domain3738 IN A 69.0.14.154 domain3739 IN A 69.0.14.155 domain3740 IN A 69.0.14.156 domain3741 IN A 69.0.14.157 domain3742 IN A 69.0.14.158 domain3743 IN A 69.0.14.159 domain3744 IN A 69.0.14.160 domain3745 IN A 69.0.14.161 domain3746 IN A 69.0.14.162 domain3747 IN A 69.0.14.163 domain3748 IN A 69.0.14.164 domain3749 IN A 69.0.14.165 domain3750 IN A 69.0.14.166 domain3751 IN A 69.0.14.167 domain3752 IN A 69.0.14.168 domain3753 IN A 69.0.14.169 domain3754 IN A 69.0.14.170 domain3755 IN A 69.0.14.171 domain3756 IN A 69.0.14.172 domain3757 IN A 69.0.14.173 domain3758 IN A 69.0.14.174 domain3759 IN A 69.0.14.175 domain3760 IN A 69.0.14.176 domain3761 IN A 69.0.14.177 domain3762 IN A 69.0.14.178 domain3763 IN A 69.0.14.179 domain3764 IN A 69.0.14.180 domain3765 IN A 69.0.14.181 domain3766 IN A 69.0.14.182 domain3767 IN A 69.0.14.183 domain3768 IN A 69.0.14.184 domain3769 IN A 69.0.14.185 domain3770 IN A 69.0.14.186 domain3771 IN A 69.0.14.187 domain3772 IN A 69.0.14.188 domain3773 IN A 69.0.14.189 domain3774 IN A 69.0.14.190 domain3775 IN A 69.0.14.191 domain3776 IN A 69.0.14.192 domain3777 IN A 69.0.14.193 domain3778 IN A 69.0.14.194 domain3779 IN A 69.0.14.195 domain3780 IN A 69.0.14.196 domain3781 IN A 69.0.14.197 domain3782 IN A 69.0.14.198 domain3783 IN A 69.0.14.199 domain3784 IN A 69.0.14.200 domain3785 IN A 69.0.14.201 domain3786 IN A 69.0.14.202 domain3787 IN A 69.0.14.203 domain3788 IN A 69.0.14.204 domain3789 IN A 69.0.14.205 domain3790 IN A 69.0.14.206 domain3791 IN A 69.0.14.207 domain3792 IN A 69.0.14.208 domain3793 IN A 69.0.14.209 domain3794 IN A 69.0.14.210 domain3795 IN A 69.0.14.211 domain3796 IN A 69.0.14.212 domain3797 IN A 69.0.14.213 domain3798 IN A 69.0.14.214 domain3799 IN A 69.0.14.215 domain3800 IN A 69.0.14.216 domain3801 IN A 69.0.14.217 domain3802 IN A 69.0.14.218 domain3803 IN A 69.0.14.219 domain3804 IN A 69.0.14.220 domain3805 IN A 69.0.14.221 domain3806 IN A 69.0.14.222 domain3807 IN A 69.0.14.223 domain3808 IN A 69.0.14.224 domain3809 IN A 69.0.14.225 domain3810 IN A 69.0.14.226 domain3811 IN A 69.0.14.227 domain3812 IN A 69.0.14.228 domain3813 IN A 69.0.14.229 domain3814 IN A 69.0.14.230 domain3815 IN A 69.0.14.231 domain3816 IN A 69.0.14.232 domain3817 IN A 69.0.14.233 domain3818 IN A 69.0.14.234 domain3819 IN A 69.0.14.235 domain3820 IN A 69.0.14.236 domain3821 IN A 69.0.14.237 domain3822 IN A 69.0.14.238 domain3823 IN A 69.0.14.239 domain3824 IN A 69.0.14.240 domain3825 IN A 69.0.14.241 domain3826 IN A 69.0.14.242 domain3827 IN A 69.0.14.243 domain3828 IN A 69.0.14.244 domain3829 IN A 69.0.14.245 domain3830 IN A 69.0.14.246 domain3831 IN A 69.0.14.247 domain3832 IN A 69.0.14.248 domain3833 IN A 69.0.14.249 domain3834 IN A 69.0.14.250 domain3835 IN A 69.0.14.251 domain3836 IN A 69.0.14.252 domain3837 IN A 69.0.14.253 domain3838 IN A 69.0.14.254 domain3839 IN A 69.0.14.255 domain3840 IN A 69.0.15.0 domain3841 IN A 69.0.15.1 domain3842 IN A 69.0.15.2 domain3843 IN A 69.0.15.3 domain3844 IN A 69.0.15.4 domain3845 IN A 69.0.15.5 domain3846 IN A 69.0.15.6 domain3847 IN A 69.0.15.7 domain3848 IN A 69.0.15.8 domain3849 IN A 69.0.15.9 domain3850 IN A 69.0.15.10 domain3851 IN A 69.0.15.11 domain3852 IN A 69.0.15.12 domain3853 IN A 69.0.15.13 domain3854 IN A 69.0.15.14 domain3855 IN A 69.0.15.15 domain3856 IN A 69.0.15.16 domain3857 IN A 69.0.15.17 domain3858 IN A 69.0.15.18 domain3859 IN A 69.0.15.19 domain3860 IN A 69.0.15.20 domain3861 IN A 69.0.15.21 domain3862 IN A 69.0.15.22 domain3863 IN A 69.0.15.23 domain3864 IN A 69.0.15.24 domain3865 IN A 69.0.15.25 domain3866 IN A 69.0.15.26 domain3867 IN A 69.0.15.27 domain3868 IN A 69.0.15.28 domain3869 IN A 69.0.15.29 domain3870 IN A 69.0.15.30 domain3871 IN A 69.0.15.31 domain3872 IN A 69.0.15.32 domain3873 IN A 69.0.15.33 domain3874 IN A 69.0.15.34 domain3875 IN A 69.0.15.35 domain3876 IN A 69.0.15.36 domain3877 IN A 69.0.15.37 domain3878 IN A 69.0.15.38 domain3879 IN A 69.0.15.39 domain3880 IN A 69.0.15.40 domain3881 IN A 69.0.15.41 domain3882 IN A 69.0.15.42 domain3883 IN A 69.0.15.43 domain3884 IN A 69.0.15.44 domain3885 IN A 69.0.15.45 domain3886 IN A 69.0.15.46 domain3887 IN A 69.0.15.47 domain3888 IN A 69.0.15.48 domain3889 IN A 69.0.15.49 domain3890 IN A 69.0.15.50 domain3891 IN A 69.0.15.51 domain3892 IN A 69.0.15.52 domain3893 IN A 69.0.15.53 domain3894 IN A 69.0.15.54 domain3895 IN A 69.0.15.55 domain3896 IN A 69.0.15.56 domain3897 IN A 69.0.15.57 domain3898 IN A 69.0.15.58 domain3899 IN A 69.0.15.59 domain3900 IN A 69.0.15.60 domain3901 IN A 69.0.15.61 domain3902 IN A 69.0.15.62 domain3903 IN A 69.0.15.63 domain3904 IN A 69.0.15.64 domain3905 IN A 69.0.15.65 domain3906 IN A 69.0.15.66 domain3907 IN A 69.0.15.67 domain3908 IN A 69.0.15.68 domain3909 IN A 69.0.15.69 domain3910 IN A 69.0.15.70 domain3911 IN A 69.0.15.71 domain3912 IN A 69.0.15.72 domain3913 IN A 69.0.15.73 domain3914 IN A 69.0.15.74 domain3915 IN A 69.0.15.75 domain3916 IN A 69.0.15.76 domain3917 IN A 69.0.15.77 domain3918 IN A 69.0.15.78 domain3919 IN A 69.0.15.79 domain3920 IN A 69.0.15.80 domain3921 IN A 69.0.15.81 domain3922 IN A 69.0.15.82 domain3923 IN A 69.0.15.83 domain3924 IN A 69.0.15.84 domain3925 IN A 69.0.15.85 domain3926 IN A 69.0.15.86 domain3927 IN A 69.0.15.87 domain3928 IN A 69.0.15.88 domain3929 IN A 69.0.15.89 domain3930 IN A 69.0.15.90 domain3931 IN A 69.0.15.91 domain3932 IN A 69.0.15.92 domain3933 IN A 69.0.15.93 domain3934 IN A 69.0.15.94 domain3935 IN A 69.0.15.95 domain3936 IN A 69.0.15.96 domain3937 IN A 69.0.15.97 domain3938 IN A 69.0.15.98 domain3939 IN A 69.0.15.99 domain3940 IN A 69.0.15.100 domain3941 IN A 69.0.15.101 domain3942 IN A 69.0.15.102 domain3943 IN A 69.0.15.103 domain3944 IN A 69.0.15.104 domain3945 IN A 69.0.15.105 domain3946 IN A 69.0.15.106 domain3947 IN A 69.0.15.107 domain3948 IN A 69.0.15.108 domain3949 IN A 69.0.15.109 domain3950 IN A 69.0.15.110 domain3951 IN A 69.0.15.111 domain3952 IN A 69.0.15.112 domain3953 IN A 69.0.15.113 domain3954 IN A 69.0.15.114 domain3955 IN A 69.0.15.115 domain3956 IN A 69.0.15.116 domain3957 IN A 69.0.15.117 domain3958 IN A 69.0.15.118 domain3959 IN A 69.0.15.119 domain3960 IN A 69.0.15.120 domain3961 IN A 69.0.15.121 domain3962 IN A 69.0.15.122 domain3963 IN A 69.0.15.123 domain3964 IN A 69.0.15.124 domain3965 IN A 69.0.15.125 domain3966 IN A 69.0.15.126 domain3967 IN A 69.0.15.127 domain3968 IN A 69.0.15.128 domain3969 IN A 69.0.15.129 domain3970 IN A 69.0.15.130 domain3971 IN A 69.0.15.131 domain3972 IN A 69.0.15.132 domain3973 IN A 69.0.15.133 domain3974 IN A 69.0.15.134 domain3975 IN A 69.0.15.135 domain3976 IN A 69.0.15.136 domain3977 IN A 69.0.15.137 domain3978 IN A 69.0.15.138 domain3979 IN A 69.0.15.139 domain3980 IN A 69.0.15.140 domain3981 IN A 69.0.15.141 domain3982 IN A 69.0.15.142 domain3983 IN A 69.0.15.143 domain3984 IN A 69.0.15.144 domain3985 IN A 69.0.15.145 domain3986 IN A 69.0.15.146 domain3987 IN A 69.0.15.147 domain3988 IN A 69.0.15.148 domain3989 IN A 69.0.15.149 domain3990 IN A 69.0.15.150 domain3991 IN A 69.0.15.151 domain3992 IN A 69.0.15.152 domain3993 IN A 69.0.15.153 domain3994 IN A 69.0.15.154 domain3995 IN A 69.0.15.155 domain3996 IN A 69.0.15.156 domain3997 IN A 69.0.15.157 domain3998 IN A 69.0.15.158 domain3999 IN A 69.0.15.159 domain4000 IN A 69.0.15.160 domain4001 IN A 69.0.15.161 domain4002 IN A 69.0.15.162 domain4003 IN A 69.0.15.163 domain4004 IN A 69.0.15.164 domain4005 IN A 69.0.15.165 domain4006 IN A 69.0.15.166 domain4007 IN A 69.0.15.167 domain4008 IN A 69.0.15.168 domain4009 IN A 69.0.15.169 domain4010 IN A 69.0.15.170 domain4011 IN A 69.0.15.171 domain4012 IN A 69.0.15.172 domain4013 IN A 69.0.15.173 domain4014 IN A 69.0.15.174 domain4015 IN A 69.0.15.175 domain4016 IN A 69.0.15.176 domain4017 IN A 69.0.15.177 domain4018 IN A 69.0.15.178 domain4019 IN A 69.0.15.179 domain4020 IN A 69.0.15.180 domain4021 IN A 69.0.15.181 domain4022 IN A 69.0.15.182 domain4023 IN A 69.0.15.183 domain4024 IN A 69.0.15.184 domain4025 IN A 69.0.15.185 domain4026 IN A 69.0.15.186 domain4027 IN A 69.0.15.187 domain4028 IN A 69.0.15.188 domain4029 IN A 69.0.15.189 domain4030 IN A 69.0.15.190 domain4031 IN A 69.0.15.191 domain4032 IN A 69.0.15.192 domain4033 IN A 69.0.15.193 domain4034 IN A 69.0.15.194 domain4035 IN A 69.0.15.195 domain4036 IN A 69.0.15.196 domain4037 IN A 69.0.15.197 domain4038 IN A 69.0.15.198 domain4039 IN A 69.0.15.199 domain4040 IN A 69.0.15.200 domain4041 IN A 69.0.15.201 domain4042 IN A 69.0.15.202 domain4043 IN A 69.0.15.203 domain4044 IN A 69.0.15.204 domain4045 IN A 69.0.15.205 domain4046 IN A 69.0.15.206 domain4047 IN A 69.0.15.207 domain4048 IN A 69.0.15.208 domain4049 IN A 69.0.15.209 domain4050 IN A 69.0.15.210 domain4051 IN A 69.0.15.211 domain4052 IN A 69.0.15.212 domain4053 IN A 69.0.15.213 domain4054 IN A 69.0.15.214 domain4055 IN A 69.0.15.215 domain4056 IN A 69.0.15.216 domain4057 IN A 69.0.15.217 domain4058 IN A 69.0.15.218 domain4059 IN A 69.0.15.219 domain4060 IN A 69.0.15.220 domain4061 IN A 69.0.15.221 domain4062 IN A 69.0.15.222 domain4063 IN A 69.0.15.223 domain4064 IN A 69.0.15.224 domain4065 IN A 69.0.15.225 domain4066 IN A 69.0.15.226 domain4067 IN A 69.0.15.227 domain4068 IN A 69.0.15.228 domain4069 IN A 69.0.15.229 domain4070 IN A 69.0.15.230 domain4071 IN A 69.0.15.231 domain4072 IN A 69.0.15.232 domain4073 IN A 69.0.15.233 domain4074 IN A 69.0.15.234 domain4075 IN A 69.0.15.235 domain4076 IN A 69.0.15.236 domain4077 IN A 69.0.15.237 domain4078 IN A 69.0.15.238 domain4079 IN A 69.0.15.239 domain4080 IN A 69.0.15.240 domain4081 IN A 69.0.15.241 domain4082 IN A 69.0.15.242 domain4083 IN A 69.0.15.243 domain4084 IN A 69.0.15.244 domain4085 IN A 69.0.15.245 domain4086 IN A 69.0.15.246 domain4087 IN A 69.0.15.247 domain4088 IN A 69.0.15.248 domain4089 IN A 69.0.15.249 domain4090 IN A 69.0.15.250 domain4091 IN A 69.0.15.251 domain4092 IN A 69.0.15.252 domain4093 IN A 69.0.15.253 domain4094 IN A 69.0.15.254 domain4095 IN A 69.0.15.255 domain4096 IN A 69.0.16.0 domain4097 IN A 69.0.16.1 domain4098 IN A 69.0.16.2 domain4099 IN A 69.0.16.3 domain4100 IN A 69.0.16.4 domain4101 IN A 69.0.16.5 domain4102 IN A 69.0.16.6 domain4103 IN A 69.0.16.7 domain4104 IN A 69.0.16.8 domain4105 IN A 69.0.16.9 domain4106 IN A 69.0.16.10 domain4107 IN A 69.0.16.11 domain4108 IN A 69.0.16.12 domain4109 IN A 69.0.16.13 domain4110 IN A 69.0.16.14 domain4111 IN A 69.0.16.15 domain4112 IN A 69.0.16.16 domain4113 IN A 69.0.16.17 domain4114 IN A 69.0.16.18 domain4115 IN A 69.0.16.19 domain4116 IN A 69.0.16.20 domain4117 IN A 69.0.16.21 domain4118 IN A 69.0.16.22 domain4119 IN A 69.0.16.23 domain4120 IN A 69.0.16.24 domain4121 IN A 69.0.16.25 domain4122 IN A 69.0.16.26 domain4123 IN A 69.0.16.27 domain4124 IN A 69.0.16.28 domain4125 IN A 69.0.16.29 domain4126 IN A 69.0.16.30 domain4127 IN A 69.0.16.31 domain4128 IN A 69.0.16.32 domain4129 IN A 69.0.16.33 domain4130 IN A 69.0.16.34 domain4131 IN A 69.0.16.35 domain4132 IN A 69.0.16.36 domain4133 IN A 69.0.16.37 domain4134 IN A 69.0.16.38 domain4135 IN A 69.0.16.39 domain4136 IN A 69.0.16.40 domain4137 IN A 69.0.16.41 domain4138 IN A 69.0.16.42 domain4139 IN A 69.0.16.43 domain4140 IN A 69.0.16.44 domain4141 IN A 69.0.16.45 domain4142 IN A 69.0.16.46 domain4143 IN A 69.0.16.47 domain4144 IN A 69.0.16.48 domain4145 IN A 69.0.16.49 domain4146 IN A 69.0.16.50 domain4147 IN A 69.0.16.51 domain4148 IN A 69.0.16.52 domain4149 IN A 69.0.16.53 domain4150 IN A 69.0.16.54 domain4151 IN A 69.0.16.55 domain4152 IN A 69.0.16.56 domain4153 IN A 69.0.16.57 domain4154 IN A 69.0.16.58 domain4155 IN A 69.0.16.59 domain4156 IN A 69.0.16.60 domain4157 IN A 69.0.16.61 domain4158 IN A 69.0.16.62 domain4159 IN A 69.0.16.63 domain4160 IN A 69.0.16.64 domain4161 IN A 69.0.16.65 domain4162 IN A 69.0.16.66 domain4163 IN A 69.0.16.67 domain4164 IN A 69.0.16.68 domain4165 IN A 69.0.16.69 domain4166 IN A 69.0.16.70 domain4167 IN A 69.0.16.71 domain4168 IN A 69.0.16.72 domain4169 IN A 69.0.16.73 domain4170 IN A 69.0.16.74 domain4171 IN A 69.0.16.75 domain4172 IN A 69.0.16.76 domain4173 IN A 69.0.16.77 domain4174 IN A 69.0.16.78 domain4175 IN A 69.0.16.79 domain4176 IN A 69.0.16.80 domain4177 IN A 69.0.16.81 domain4178 IN A 69.0.16.82 domain4179 IN A 69.0.16.83 domain4180 IN A 69.0.16.84 domain4181 IN A 69.0.16.85 domain4182 IN A 69.0.16.86 domain4183 IN A 69.0.16.87 domain4184 IN A 69.0.16.88 domain4185 IN A 69.0.16.89 domain4186 IN A 69.0.16.90 domain4187 IN A 69.0.16.91 domain4188 IN A 69.0.16.92 domain4189 IN A 69.0.16.93 domain4190 IN A 69.0.16.94 domain4191 IN A 69.0.16.95 domain4192 IN A 69.0.16.96 domain4193 IN A 69.0.16.97 domain4194 IN A 69.0.16.98 domain4195 IN A 69.0.16.99 domain4196 IN A 69.0.16.100 domain4197 IN A 69.0.16.101 domain4198 IN A 69.0.16.102 domain4199 IN A 69.0.16.103 domain4200 IN A 69.0.16.104 domain4201 IN A 69.0.16.105 domain4202 IN A 69.0.16.106 domain4203 IN A 69.0.16.107 domain4204 IN A 69.0.16.108 domain4205 IN A 69.0.16.109 domain4206 IN A 69.0.16.110 domain4207 IN A 69.0.16.111 domain4208 IN A 69.0.16.112 domain4209 IN A 69.0.16.113 domain4210 IN A 69.0.16.114 domain4211 IN A 69.0.16.115 domain4212 IN A 69.0.16.116 domain4213 IN A 69.0.16.117 domain4214 IN A 69.0.16.118 domain4215 IN A 69.0.16.119 domain4216 IN A 69.0.16.120 domain4217 IN A 69.0.16.121 domain4218 IN A 69.0.16.122 domain4219 IN A 69.0.16.123 domain4220 IN A 69.0.16.124 domain4221 IN A 69.0.16.125 domain4222 IN A 69.0.16.126 domain4223 IN A 69.0.16.127 domain4224 IN A 69.0.16.128 domain4225 IN A 69.0.16.129 domain4226 IN A 69.0.16.130 domain4227 IN A 69.0.16.131 domain4228 IN A 69.0.16.132 domain4229 IN A 69.0.16.133 domain4230 IN A 69.0.16.134 domain4231 IN A 69.0.16.135 domain4232 IN A 69.0.16.136 domain4233 IN A 69.0.16.137 domain4234 IN A 69.0.16.138 domain4235 IN A 69.0.16.139 domain4236 IN A 69.0.16.140 domain4237 IN A 69.0.16.141 domain4238 IN A 69.0.16.142 domain4239 IN A 69.0.16.143 domain4240 IN A 69.0.16.144 domain4241 IN A 69.0.16.145 domain4242 IN A 69.0.16.146 domain4243 IN A 69.0.16.147 domain4244 IN A 69.0.16.148 domain4245 IN A 69.0.16.149 domain4246 IN A 69.0.16.150 domain4247 IN A 69.0.16.151 domain4248 IN A 69.0.16.152 domain4249 IN A 69.0.16.153 domain4250 IN A 69.0.16.154 domain4251 IN A 69.0.16.155 domain4252 IN A 69.0.16.156 domain4253 IN A 69.0.16.157 domain4254 IN A 69.0.16.158 domain4255 IN A 69.0.16.159 domain4256 IN A 69.0.16.160 domain4257 IN A 69.0.16.161 domain4258 IN A 69.0.16.162 domain4259 IN A 69.0.16.163 domain4260 IN A 69.0.16.164 domain4261 IN A 69.0.16.165 domain4262 IN A 69.0.16.166 domain4263 IN A 69.0.16.167 domain4264 IN A 69.0.16.168 domain4265 IN A 69.0.16.169 domain4266 IN A 69.0.16.170 domain4267 IN A 69.0.16.171 domain4268 IN A 69.0.16.172 domain4269 IN A 69.0.16.173 domain4270 IN A 69.0.16.174 domain4271 IN A 69.0.16.175 domain4272 IN A 69.0.16.176 domain4273 IN A 69.0.16.177 domain4274 IN A 69.0.16.178 domain4275 IN A 69.0.16.179 domain4276 IN A 69.0.16.180 domain4277 IN A 69.0.16.181 domain4278 IN A 69.0.16.182 domain4279 IN A 69.0.16.183 domain4280 IN A 69.0.16.184 domain4281 IN A 69.0.16.185 domain4282 IN A 69.0.16.186 domain4283 IN A 69.0.16.187 domain4284 IN A 69.0.16.188 domain4285 IN A 69.0.16.189 domain4286 IN A 69.0.16.190 domain4287 IN A 69.0.16.191 domain4288 IN A 69.0.16.192 domain4289 IN A 69.0.16.193 domain4290 IN A 69.0.16.194 domain4291 IN A 69.0.16.195 domain4292 IN A 69.0.16.196 domain4293 IN A 69.0.16.197 domain4294 IN A 69.0.16.198 domain4295 IN A 69.0.16.199 domain4296 IN A 69.0.16.200 domain4297 IN A 69.0.16.201 domain4298 IN A 69.0.16.202 domain4299 IN A 69.0.16.203 domain4300 IN A 69.0.16.204 domain4301 IN A 69.0.16.205 domain4302 IN A 69.0.16.206 domain4303 IN A 69.0.16.207 domain4304 IN A 69.0.16.208 domain4305 IN A 69.0.16.209 domain4306 IN A 69.0.16.210 domain4307 IN A 69.0.16.211 domain4308 IN A 69.0.16.212 domain4309 IN A 69.0.16.213 domain4310 IN A 69.0.16.214 domain4311 IN A 69.0.16.215 domain4312 IN A 69.0.16.216 domain4313 IN A 69.0.16.217 domain4314 IN A 69.0.16.218 domain4315 IN A 69.0.16.219 domain4316 IN A 69.0.16.220 domain4317 IN A 69.0.16.221 domain4318 IN A 69.0.16.222 domain4319 IN A 69.0.16.223 domain4320 IN A 69.0.16.224 domain4321 IN A 69.0.16.225 domain4322 IN A 69.0.16.226 domain4323 IN A 69.0.16.227 domain4324 IN A 69.0.16.228 domain4325 IN A 69.0.16.229 domain4326 IN A 69.0.16.230 domain4327 IN A 69.0.16.231 domain4328 IN A 69.0.16.232 domain4329 IN A 69.0.16.233 domain4330 IN A 69.0.16.234 domain4331 IN A 69.0.16.235 domain4332 IN A 69.0.16.236 domain4333 IN A 69.0.16.237 domain4334 IN A 69.0.16.238 domain4335 IN A 69.0.16.239 domain4336 IN A 69.0.16.240 domain4337 IN A 69.0.16.241 domain4338 IN A 69.0.16.242 domain4339 IN A 69.0.16.243 domain4340 IN A 69.0.16.244 domain4341 IN A 69.0.16.245 domain4342 IN A 69.0.16.246 domain4343 IN A 69.0.16.247 domain4344 IN A 69.0.16.248 domain4345 IN A 69.0.16.249 domain4346 IN A 69.0.16.250 domain4347 IN A 69.0.16.251 domain4348 IN A 69.0.16.252 domain4349 IN A 69.0.16.253 domain4350 IN A 69.0.16.254 domain4351 IN A 69.0.16.255 domain4352 IN A 69.0.17.0 domain4353 IN A 69.0.17.1 domain4354 IN A 69.0.17.2 domain4355 IN A 69.0.17.3 domain4356 IN A 69.0.17.4 domain4357 IN A 69.0.17.5 domain4358 IN A 69.0.17.6 domain4359 IN A 69.0.17.7 domain4360 IN A 69.0.17.8 domain4361 IN A 69.0.17.9 domain4362 IN A 69.0.17.10 domain4363 IN A 69.0.17.11 domain4364 IN A 69.0.17.12 domain4365 IN A 69.0.17.13 domain4366 IN A 69.0.17.14 domain4367 IN A 69.0.17.15 domain4368 IN A 69.0.17.16 domain4369 IN A 69.0.17.17 domain4370 IN A 69.0.17.18 domain4371 IN A 69.0.17.19 domain4372 IN A 69.0.17.20 domain4373 IN A 69.0.17.21 domain4374 IN A 69.0.17.22 domain4375 IN A 69.0.17.23 domain4376 IN A 69.0.17.24 domain4377 IN A 69.0.17.25 domain4378 IN A 69.0.17.26 domain4379 IN A 69.0.17.27 domain4380 IN A 69.0.17.28 domain4381 IN A 69.0.17.29 domain4382 IN A 69.0.17.30 domain4383 IN A 69.0.17.31 domain4384 IN A 69.0.17.32 domain4385 IN A 69.0.17.33 domain4386 IN A 69.0.17.34 domain4387 IN A 69.0.17.35 domain4388 IN A 69.0.17.36 domain4389 IN A 69.0.17.37 domain4390 IN A 69.0.17.38 domain4391 IN A 69.0.17.39 domain4392 IN A 69.0.17.40 domain4393 IN A 69.0.17.41 domain4394 IN A 69.0.17.42 domain4395 IN A 69.0.17.43 domain4396 IN A 69.0.17.44 domain4397 IN A 69.0.17.45 domain4398 IN A 69.0.17.46 domain4399 IN A 69.0.17.47 domain4400 IN A 69.0.17.48 domain4401 IN A 69.0.17.49 domain4402 IN A 69.0.17.50 domain4403 IN A 69.0.17.51 domain4404 IN A 69.0.17.52 domain4405 IN A 69.0.17.53 domain4406 IN A 69.0.17.54 domain4407 IN A 69.0.17.55 domain4408 IN A 69.0.17.56 domain4409 IN A 69.0.17.57 domain4410 IN A 69.0.17.58 domain4411 IN A 69.0.17.59 domain4412 IN A 69.0.17.60 domain4413 IN A 69.0.17.61 domain4414 IN A 69.0.17.62 domain4415 IN A 69.0.17.63 domain4416 IN A 69.0.17.64 domain4417 IN A 69.0.17.65 domain4418 IN A 69.0.17.66 domain4419 IN A 69.0.17.67 domain4420 IN A 69.0.17.68 domain4421 IN A 69.0.17.69 domain4422 IN A 69.0.17.70 domain4423 IN A 69.0.17.71 domain4424 IN A 69.0.17.72 domain4425 IN A 69.0.17.73 domain4426 IN A 69.0.17.74 domain4427 IN A 69.0.17.75 domain4428 IN A 69.0.17.76 domain4429 IN A 69.0.17.77 domain4430 IN A 69.0.17.78 domain4431 IN A 69.0.17.79 domain4432 IN A 69.0.17.80 domain4433 IN A 69.0.17.81 domain4434 IN A 69.0.17.82 domain4435 IN A 69.0.17.83 domain4436 IN A 69.0.17.84 domain4437 IN A 69.0.17.85 domain4438 IN A 69.0.17.86 domain4439 IN A 69.0.17.87 domain4440 IN A 69.0.17.88 domain4441 IN A 69.0.17.89 domain4442 IN A 69.0.17.90 domain4443 IN A 69.0.17.91 domain4444 IN A 69.0.17.92 domain4445 IN A 69.0.17.93 domain4446 IN A 69.0.17.94 domain4447 IN A 69.0.17.95 domain4448 IN A 69.0.17.96 domain4449 IN A 69.0.17.97 domain4450 IN A 69.0.17.98 domain4451 IN A 69.0.17.99 domain4452 IN A 69.0.17.100 domain4453 IN A 69.0.17.101 domain4454 IN A 69.0.17.102 domain4455 IN A 69.0.17.103 domain4456 IN A 69.0.17.104 domain4457 IN A 69.0.17.105 domain4458 IN A 69.0.17.106 domain4459 IN A 69.0.17.107 domain4460 IN A 69.0.17.108 domain4461 IN A 69.0.17.109 domain4462 IN A 69.0.17.110 domain4463 IN A 69.0.17.111 domain4464 IN A 69.0.17.112 domain4465 IN A 69.0.17.113 domain4466 IN A 69.0.17.114 domain4467 IN A 69.0.17.115 domain4468 IN A 69.0.17.116 domain4469 IN A 69.0.17.117 domain4470 IN A 69.0.17.118 domain4471 IN A 69.0.17.119 domain4472 IN A 69.0.17.120 domain4473 IN A 69.0.17.121 domain4474 IN A 69.0.17.122 domain4475 IN A 69.0.17.123 domain4476 IN A 69.0.17.124 domain4477 IN A 69.0.17.125 domain4478 IN A 69.0.17.126 domain4479 IN A 69.0.17.127 domain4480 IN A 69.0.17.128 domain4481 IN A 69.0.17.129 domain4482 IN A 69.0.17.130 domain4483 IN A 69.0.17.131 domain4484 IN A 69.0.17.132 domain4485 IN A 69.0.17.133 domain4486 IN A 69.0.17.134 domain4487 IN A 69.0.17.135 domain4488 IN A 69.0.17.136 domain4489 IN A 69.0.17.137 domain4490 IN A 69.0.17.138 domain4491 IN A 69.0.17.139 domain4492 IN A 69.0.17.140 domain4493 IN A 69.0.17.141 domain4494 IN A 69.0.17.142 domain4495 IN A 69.0.17.143 domain4496 IN A 69.0.17.144 domain4497 IN A 69.0.17.145 domain4498 IN A 69.0.17.146 domain4499 IN A 69.0.17.147 domain4500 IN A 69.0.17.148 domain4501 IN A 69.0.17.149 domain4502 IN A 69.0.17.150 domain4503 IN A 69.0.17.151 domain4504 IN A 69.0.17.152 domain4505 IN A 69.0.17.153 domain4506 IN A 69.0.17.154 domain4507 IN A 69.0.17.155 domain4508 IN A 69.0.17.156 domain4509 IN A 69.0.17.157 domain4510 IN A 69.0.17.158 domain4511 IN A 69.0.17.159 domain4512 IN A 69.0.17.160 domain4513 IN A 69.0.17.161 domain4514 IN A 69.0.17.162 domain4515 IN A 69.0.17.163 domain4516 IN A 69.0.17.164 domain4517 IN A 69.0.17.165 domain4518 IN A 69.0.17.166 domain4519 IN A 69.0.17.167 domain4520 IN A 69.0.17.168 domain4521 IN A 69.0.17.169 domain4522 IN A 69.0.17.170 domain4523 IN A 69.0.17.171 domain4524 IN A 69.0.17.172 domain4525 IN A 69.0.17.173 domain4526 IN A 69.0.17.174 domain4527 IN A 69.0.17.175 domain4528 IN A 69.0.17.176 domain4529 IN A 69.0.17.177 domain4530 IN A 69.0.17.178 domain4531 IN A 69.0.17.179 domain4532 IN A 69.0.17.180 domain4533 IN A 69.0.17.181 domain4534 IN A 69.0.17.182 domain4535 IN A 69.0.17.183 domain4536 IN A 69.0.17.184 domain4537 IN A 69.0.17.185 domain4538 IN A 69.0.17.186 domain4539 IN A 69.0.17.187 domain4540 IN A 69.0.17.188 domain4541 IN A 69.0.17.189 domain4542 IN A 69.0.17.190 domain4543 IN A 69.0.17.191 domain4544 IN A 69.0.17.192 domain4545 IN A 69.0.17.193 domain4546 IN A 69.0.17.194 domain4547 IN A 69.0.17.195 domain4548 IN A 69.0.17.196 domain4549 IN A 69.0.17.197 domain4550 IN A 69.0.17.198 domain4551 IN A 69.0.17.199 domain4552 IN A 69.0.17.200 domain4553 IN A 69.0.17.201 domain4554 IN A 69.0.17.202 domain4555 IN A 69.0.17.203 domain4556 IN A 69.0.17.204 domain4557 IN A 69.0.17.205 domain4558 IN A 69.0.17.206 domain4559 IN A 69.0.17.207 domain4560 IN A 69.0.17.208 domain4561 IN A 69.0.17.209 domain4562 IN A 69.0.17.210 domain4563 IN A 69.0.17.211 domain4564 IN A 69.0.17.212 domain4565 IN A 69.0.17.213 domain4566 IN A 69.0.17.214 domain4567 IN A 69.0.17.215 domain4568 IN A 69.0.17.216 domain4569 IN A 69.0.17.217 domain4570 IN A 69.0.17.218 domain4571 IN A 69.0.17.219 domain4572 IN A 69.0.17.220 domain4573 IN A 69.0.17.221 domain4574 IN A 69.0.17.222 domain4575 IN A 69.0.17.223 domain4576 IN A 69.0.17.224 domain4577 IN A 69.0.17.225 domain4578 IN A 69.0.17.226 domain4579 IN A 69.0.17.227 domain4580 IN A 69.0.17.228 domain4581 IN A 69.0.17.229 domain4582 IN A 69.0.17.230 domain4583 IN A 69.0.17.231 domain4584 IN A 69.0.17.232 domain4585 IN A 69.0.17.233 domain4586 IN A 69.0.17.234 domain4587 IN A 69.0.17.235 domain4588 IN A 69.0.17.236 domain4589 IN A 69.0.17.237 domain4590 IN A 69.0.17.238 domain4591 IN A 69.0.17.239 domain4592 IN A 69.0.17.240 domain4593 IN A 69.0.17.241 domain4594 IN A 69.0.17.242 domain4595 IN A 69.0.17.243 domain4596 IN A 69.0.17.244 domain4597 IN A 69.0.17.245 domain4598 IN A 69.0.17.246 domain4599 IN A 69.0.17.247 domain4600 IN A 69.0.17.248 domain4601 IN A 69.0.17.249 domain4602 IN A 69.0.17.250 domain4603 IN A 69.0.17.251 domain4604 IN A 69.0.17.252 domain4605 IN A 69.0.17.253 domain4606 IN A 69.0.17.254 domain4607 IN A 69.0.17.255 domain4608 IN A 69.0.18.0 domain4609 IN A 69.0.18.1 domain4610 IN A 69.0.18.2 domain4611 IN A 69.0.18.3 domain4612 IN A 69.0.18.4 domain4613 IN A 69.0.18.5 domain4614 IN A 69.0.18.6 domain4615 IN A 69.0.18.7 domain4616 IN A 69.0.18.8 domain4617 IN A 69.0.18.9 domain4618 IN A 69.0.18.10 domain4619 IN A 69.0.18.11 domain4620 IN A 69.0.18.12 domain4621 IN A 69.0.18.13 domain4622 IN A 69.0.18.14 domain4623 IN A 69.0.18.15 domain4624 IN A 69.0.18.16 domain4625 IN A 69.0.18.17 domain4626 IN A 69.0.18.18 domain4627 IN A 69.0.18.19 domain4628 IN A 69.0.18.20 domain4629 IN A 69.0.18.21 domain4630 IN A 69.0.18.22 domain4631 IN A 69.0.18.23 domain4632 IN A 69.0.18.24 domain4633 IN A 69.0.18.25 domain4634 IN A 69.0.18.26 domain4635 IN A 69.0.18.27 domain4636 IN A 69.0.18.28 domain4637 IN A 69.0.18.29 domain4638 IN A 69.0.18.30 domain4639 IN A 69.0.18.31 domain4640 IN A 69.0.18.32 domain4641 IN A 69.0.18.33 domain4642 IN A 69.0.18.34 domain4643 IN A 69.0.18.35 domain4644 IN A 69.0.18.36 domain4645 IN A 69.0.18.37 domain4646 IN A 69.0.18.38 domain4647 IN A 69.0.18.39 domain4648 IN A 69.0.18.40 domain4649 IN A 69.0.18.41 domain4650 IN A 69.0.18.42 domain4651 IN A 69.0.18.43 domain4652 IN A 69.0.18.44 domain4653 IN A 69.0.18.45 domain4654 IN A 69.0.18.46 domain4655 IN A 69.0.18.47 domain4656 IN A 69.0.18.48 domain4657 IN A 69.0.18.49 domain4658 IN A 69.0.18.50 domain4659 IN A 69.0.18.51 domain4660 IN A 69.0.18.52 domain4661 IN A 69.0.18.53 domain4662 IN A 69.0.18.54 domain4663 IN A 69.0.18.55 domain4664 IN A 69.0.18.56 domain4665 IN A 69.0.18.57 domain4666 IN A 69.0.18.58 domain4667 IN A 69.0.18.59 domain4668 IN A 69.0.18.60 domain4669 IN A 69.0.18.61 domain4670 IN A 69.0.18.62 domain4671 IN A 69.0.18.63 domain4672 IN A 69.0.18.64 domain4673 IN A 69.0.18.65 domain4674 IN A 69.0.18.66 domain4675 IN A 69.0.18.67 domain4676 IN A 69.0.18.68 domain4677 IN A 69.0.18.69 domain4678 IN A 69.0.18.70 domain4679 IN A 69.0.18.71 domain4680 IN A 69.0.18.72 domain4681 IN A 69.0.18.73 domain4682 IN A 69.0.18.74 domain4683 IN A 69.0.18.75 domain4684 IN A 69.0.18.76 domain4685 IN A 69.0.18.77 domain4686 IN A 69.0.18.78 domain4687 IN A 69.0.18.79 domain4688 IN A 69.0.18.80 domain4689 IN A 69.0.18.81 domain4690 IN A 69.0.18.82 domain4691 IN A 69.0.18.83 domain4692 IN A 69.0.18.84 domain4693 IN A 69.0.18.85 domain4694 IN A 69.0.18.86 domain4695 IN A 69.0.18.87 domain4696 IN A 69.0.18.88 domain4697 IN A 69.0.18.89 domain4698 IN A 69.0.18.90 domain4699 IN A 69.0.18.91 domain4700 IN A 69.0.18.92 domain4701 IN A 69.0.18.93 domain4702 IN A 69.0.18.94 domain4703 IN A 69.0.18.95 domain4704 IN A 69.0.18.96 domain4705 IN A 69.0.18.97 domain4706 IN A 69.0.18.98 domain4707 IN A 69.0.18.99 domain4708 IN A 69.0.18.100 domain4709 IN A 69.0.18.101 domain4710 IN A 69.0.18.102 domain4711 IN A 69.0.18.103 domain4712 IN A 69.0.18.104 domain4713 IN A 69.0.18.105 domain4714 IN A 69.0.18.106 domain4715 IN A 69.0.18.107 domain4716 IN A 69.0.18.108 domain4717 IN A 69.0.18.109 domain4718 IN A 69.0.18.110 domain4719 IN A 69.0.18.111 domain4720 IN A 69.0.18.112 domain4721 IN A 69.0.18.113 domain4722 IN A 69.0.18.114 domain4723 IN A 69.0.18.115 domain4724 IN A 69.0.18.116 domain4725 IN A 69.0.18.117 domain4726 IN A 69.0.18.118 domain4727 IN A 69.0.18.119 domain4728 IN A 69.0.18.120 domain4729 IN A 69.0.18.121 domain4730 IN A 69.0.18.122 domain4731 IN A 69.0.18.123 domain4732 IN A 69.0.18.124 domain4733 IN A 69.0.18.125 domain4734 IN A 69.0.18.126 domain4735 IN A 69.0.18.127 domain4736 IN A 69.0.18.128 domain4737 IN A 69.0.18.129 domain4738 IN A 69.0.18.130 domain4739 IN A 69.0.18.131 domain4740 IN A 69.0.18.132 domain4741 IN A 69.0.18.133 domain4742 IN A 69.0.18.134 domain4743 IN A 69.0.18.135 domain4744 IN A 69.0.18.136 domain4745 IN A 69.0.18.137 domain4746 IN A 69.0.18.138 domain4747 IN A 69.0.18.139 domain4748 IN A 69.0.18.140 domain4749 IN A 69.0.18.141 domain4750 IN A 69.0.18.142 domain4751 IN A 69.0.18.143 domain4752 IN A 69.0.18.144 domain4753 IN A 69.0.18.145 domain4754 IN A 69.0.18.146 domain4755 IN A 69.0.18.147 domain4756 IN A 69.0.18.148 domain4757 IN A 69.0.18.149 domain4758 IN A 69.0.18.150 domain4759 IN A 69.0.18.151 domain4760 IN A 69.0.18.152 domain4761 IN A 69.0.18.153 domain4762 IN A 69.0.18.154 domain4763 IN A 69.0.18.155 domain4764 IN A 69.0.18.156 domain4765 IN A 69.0.18.157 domain4766 IN A 69.0.18.158 domain4767 IN A 69.0.18.159 domain4768 IN A 69.0.18.160 domain4769 IN A 69.0.18.161 domain4770 IN A 69.0.18.162 domain4771 IN A 69.0.18.163 domain4772 IN A 69.0.18.164 domain4773 IN A 69.0.18.165 domain4774 IN A 69.0.18.166 domain4775 IN A 69.0.18.167 domain4776 IN A 69.0.18.168 domain4777 IN A 69.0.18.169 domain4778 IN A 69.0.18.170 domain4779 IN A 69.0.18.171 domain4780 IN A 69.0.18.172 domain4781 IN A 69.0.18.173 domain4782 IN A 69.0.18.174 domain4783 IN A 69.0.18.175 domain4784 IN A 69.0.18.176 domain4785 IN A 69.0.18.177 domain4786 IN A 69.0.18.178 domain4787 IN A 69.0.18.179 domain4788 IN A 69.0.18.180 domain4789 IN A 69.0.18.181 domain4790 IN A 69.0.18.182 domain4791 IN A 69.0.18.183 domain4792 IN A 69.0.18.184 domain4793 IN A 69.0.18.185 domain4794 IN A 69.0.18.186 domain4795 IN A 69.0.18.187 domain4796 IN A 69.0.18.188 domain4797 IN A 69.0.18.189 domain4798 IN A 69.0.18.190 domain4799 IN A 69.0.18.191 domain4800 IN A 69.0.18.192 domain4801 IN A 69.0.18.193 domain4802 IN A 69.0.18.194 domain4803 IN A 69.0.18.195 domain4804 IN A 69.0.18.196 domain4805 IN A 69.0.18.197 domain4806 IN A 69.0.18.198 domain4807 IN A 69.0.18.199 domain4808 IN A 69.0.18.200 domain4809 IN A 69.0.18.201 domain4810 IN A 69.0.18.202 domain4811 IN A 69.0.18.203 domain4812 IN A 69.0.18.204 domain4813 IN A 69.0.18.205 domain4814 IN A 69.0.18.206 domain4815 IN A 69.0.18.207 domain4816 IN A 69.0.18.208 domain4817 IN A 69.0.18.209 domain4818 IN A 69.0.18.210 domain4819 IN A 69.0.18.211 domain4820 IN A 69.0.18.212 domain4821 IN A 69.0.18.213 domain4822 IN A 69.0.18.214 domain4823 IN A 69.0.18.215 domain4824 IN A 69.0.18.216 domain4825 IN A 69.0.18.217 domain4826 IN A 69.0.18.218 domain4827 IN A 69.0.18.219 domain4828 IN A 69.0.18.220 domain4829 IN A 69.0.18.221 domain4830 IN A 69.0.18.222 domain4831 IN A 69.0.18.223 domain4832 IN A 69.0.18.224 domain4833 IN A 69.0.18.225 domain4834 IN A 69.0.18.226 domain4835 IN A 69.0.18.227 domain4836 IN A 69.0.18.228 domain4837 IN A 69.0.18.229 domain4838 IN A 69.0.18.230 domain4839 IN A 69.0.18.231 domain4840 IN A 69.0.18.232 domain4841 IN A 69.0.18.233 domain4842 IN A 69.0.18.234 domain4843 IN A 69.0.18.235 domain4844 IN A 69.0.18.236 domain4845 IN A 69.0.18.237 domain4846 IN A 69.0.18.238 domain4847 IN A 69.0.18.239 domain4848 IN A 69.0.18.240 domain4849 IN A 69.0.18.241 domain4850 IN A 69.0.18.242 domain4851 IN A 69.0.18.243 domain4852 IN A 69.0.18.244 domain4853 IN A 69.0.18.245 domain4854 IN A 69.0.18.246 domain4855 IN A 69.0.18.247 domain4856 IN A 69.0.18.248 domain4857 IN A 69.0.18.249 domain4858 IN A 69.0.18.250 domain4859 IN A 69.0.18.251 domain4860 IN A 69.0.18.252 domain4861 IN A 69.0.18.253 domain4862 IN A 69.0.18.254 domain4863 IN A 69.0.18.255 domain4864 IN A 69.0.19.0 domain4865 IN A 69.0.19.1 domain4866 IN A 69.0.19.2 domain4867 IN A 69.0.19.3 domain4868 IN A 69.0.19.4 domain4869 IN A 69.0.19.5 domain4870 IN A 69.0.19.6 domain4871 IN A 69.0.19.7 domain4872 IN A 69.0.19.8 domain4873 IN A 69.0.19.9 domain4874 IN A 69.0.19.10 domain4875 IN A 69.0.19.11 domain4876 IN A 69.0.19.12 domain4877 IN A 69.0.19.13 domain4878 IN A 69.0.19.14 domain4879 IN A 69.0.19.15 domain4880 IN A 69.0.19.16 domain4881 IN A 69.0.19.17 domain4882 IN A 69.0.19.18 domain4883 IN A 69.0.19.19 domain4884 IN A 69.0.19.20 domain4885 IN A 69.0.19.21 domain4886 IN A 69.0.19.22 domain4887 IN A 69.0.19.23 domain4888 IN A 69.0.19.24 domain4889 IN A 69.0.19.25 domain4890 IN A 69.0.19.26 domain4891 IN A 69.0.19.27 domain4892 IN A 69.0.19.28 domain4893 IN A 69.0.19.29 domain4894 IN A 69.0.19.30 domain4895 IN A 69.0.19.31 domain4896 IN A 69.0.19.32 domain4897 IN A 69.0.19.33 domain4898 IN A 69.0.19.34 domain4899 IN A 69.0.19.35 domain4900 IN A 69.0.19.36 domain4901 IN A 69.0.19.37 domain4902 IN A 69.0.19.38 domain4903 IN A 69.0.19.39 domain4904 IN A 69.0.19.40 domain4905 IN A 69.0.19.41 domain4906 IN A 69.0.19.42 domain4907 IN A 69.0.19.43 domain4908 IN A 69.0.19.44 domain4909 IN A 69.0.19.45 domain4910 IN A 69.0.19.46 domain4911 IN A 69.0.19.47 domain4912 IN A 69.0.19.48 domain4913 IN A 69.0.19.49 domain4914 IN A 69.0.19.50 domain4915 IN A 69.0.19.51 domain4916 IN A 69.0.19.52 domain4917 IN A 69.0.19.53 domain4918 IN A 69.0.19.54 domain4919 IN A 69.0.19.55 domain4920 IN A 69.0.19.56 domain4921 IN A 69.0.19.57 domain4922 IN A 69.0.19.58 domain4923 IN A 69.0.19.59 domain4924 IN A 69.0.19.60 domain4925 IN A 69.0.19.61 domain4926 IN A 69.0.19.62 domain4927 IN A 69.0.19.63 domain4928 IN A 69.0.19.64 domain4929 IN A 69.0.19.65 domain4930 IN A 69.0.19.66 domain4931 IN A 69.0.19.67 domain4932 IN A 69.0.19.68 domain4933 IN A 69.0.19.69 domain4934 IN A 69.0.19.70 domain4935 IN A 69.0.19.71 domain4936 IN A 69.0.19.72 domain4937 IN A 69.0.19.73 domain4938 IN A 69.0.19.74 domain4939 IN A 69.0.19.75 domain4940 IN A 69.0.19.76 domain4941 IN A 69.0.19.77 domain4942 IN A 69.0.19.78 domain4943 IN A 69.0.19.79 domain4944 IN A 69.0.19.80 domain4945 IN A 69.0.19.81 domain4946 IN A 69.0.19.82 domain4947 IN A 69.0.19.83 domain4948 IN A 69.0.19.84 domain4949 IN A 69.0.19.85 domain4950 IN A 69.0.19.86 domain4951 IN A 69.0.19.87 domain4952 IN A 69.0.19.88 domain4953 IN A 69.0.19.89 domain4954 IN A 69.0.19.90 domain4955 IN A 69.0.19.91 domain4956 IN A 69.0.19.92 domain4957 IN A 69.0.19.93 domain4958 IN A 69.0.19.94 domain4959 IN A 69.0.19.95 domain4960 IN A 69.0.19.96 domain4961 IN A 69.0.19.97 domain4962 IN A 69.0.19.98 domain4963 IN A 69.0.19.99 domain4964 IN A 69.0.19.100 domain4965 IN A 69.0.19.101 domain4966 IN A 69.0.19.102 domain4967 IN A 69.0.19.103 domain4968 IN A 69.0.19.104 domain4969 IN A 69.0.19.105 domain4970 IN A 69.0.19.106 domain4971 IN A 69.0.19.107 domain4972 IN A 69.0.19.108 domain4973 IN A 69.0.19.109 domain4974 IN A 69.0.19.110 domain4975 IN A 69.0.19.111 domain4976 IN A 69.0.19.112 domain4977 IN A 69.0.19.113 domain4978 IN A 69.0.19.114 domain4979 IN A 69.0.19.115 domain4980 IN A 69.0.19.116 domain4981 IN A 69.0.19.117 domain4982 IN A 69.0.19.118 domain4983 IN A 69.0.19.119 domain4984 IN A 69.0.19.120 domain4985 IN A 69.0.19.121 domain4986 IN A 69.0.19.122 domain4987 IN A 69.0.19.123 domain4988 IN A 69.0.19.124 domain4989 IN A 69.0.19.125 domain4990 IN A 69.0.19.126 domain4991 IN A 69.0.19.127 domain4992 IN A 69.0.19.128 domain4993 IN A 69.0.19.129 domain4994 IN A 69.0.19.130 domain4995 IN A 69.0.19.131 domain4996 IN A 69.0.19.132 domain4997 IN A 69.0.19.133 domain4998 IN A 69.0.19.134 domain4999 IN A 69.0.19.135 domain5000 IN A 69.0.19.136 ruby-rubydns-1.0.3/spec/rubydns/server/bind9/named.conf000066400000000000000000000002451270364632400230560ustar00rootroot00000000000000 options { directory "./"; listen-on-v6 { none; }; listen-on { 127.0.0.1; }; pid-file "./named.pid"; }; zone "local" { type master; file "./local.zone"; }; ruby-rubydns-1.0.3/spec/rubydns/server/bind9/named.run000066400000000000000000000000001270364632400227220ustar00rootroot00000000000000ruby-rubydns-1.0.3/spec/rubydns/server/million.rb000077500000000000000000000050061270364632400221110ustar00rootroot00000000000000#!/usr/bin/env ruby # Copyright, 2009, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'rubydns' require 'benchmark' require 'stackprof' Name = Resolv::DNS::Name IN = Resolv::DNS::Resource::IN # Generate a million A record "domains": million = {} Benchmark.bm do |x| x.report("Generate names") do (1..1_000_000).each do |i| domain = "domain#{i}.local" million[domain] = "#{69}.#{(i >> 16)%256}.#{(i >> 8)%256}.#{i%256}" end end end # Run the server: StackProf.run(mode: :cpu, out: 'rubydns.stackprof') do RubyDNS::run_server(:listen => [[:udp, '0.0.0.0', 5300]]) do @logger.level = Logger::WARN match(//, IN::A) do |transaction| transaction.respond!(million[transaction.name]) end # Default DNS handler otherwise do |transaction| logger.info "Passing DNS request upstream..." transaction.fail!(:NXDomain) end end end # Expected output: # # > dig @localhost -p 5300 domain1000000 # # ; <<>> DiG 9.8.3-P1 <<>> @localhost -p 5300 domain1000000 # ; (3 servers found) # ;; global options: +cmd # ;; Got answer: # ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50336 # ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 # ;; WARNING: recursion requested but not available # # ;; QUESTION SECTION: # ;domain1000000. IN A # # ;; ANSWER SECTION: # domain1000000. 86400 IN A 69.15.66.64 # # ;; Query time: 1 msec # ;; SERVER: 127.0.0.1#5300(127.0.0.1) # ;; WHEN: Fri May 16 19:17:48 2014 # ;; MSG SIZE rcvd: 47 # ruby-rubydns-1.0.3/spec/rubydns/server/rubydns.stackprof000066400000000000000000000143621270364632400235270ustar00rootroot00000000000000{ : versionf1.1: mode:cpu: intervaliè: samplesi :gc_samplesiì:missed_samplesi: frames{>l+ÜgD{ : name"##.run: fileI"S/Users/samuel/.rvm/gems/ruby-2.1.2/gems/eventmachine-1.0.3/lib/eventmachine.rb:EF: linei•:total_samplesië; i:: edges{l+ô•€i¶: lines{i»[iêi9i½[iil+ ›Œ€{ ; "*#.run_server;I"I/Users/samuel/.rvm/gems/ruby-2.1.2/gems/rubydns-0.8.3/lib/rubydns.rb;F;i#;ië; i;{l+ÜgDië;{i&[iëil+4$D{ ; "block in
;I"R/Users/samuel/Documents/Programming/Internet/rubydns/test/examples/million.rb;T;i4;ië; i;{l+ ›Œ€ië;{i5[iëil+h'D{ ; "
;@;ië; i;{l+4$Dië;{i4[iëil+`\†€{ ; @#;I"./million.rb;T;ië; i;{l+h'Diël+¸q‘€{ ; "Logger#add;I"B/Users/samuel/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/logger.rb;F;il;i; i;{im[iiio[iil+q‘€{ ; "Logger#debug;@0;i;i; i;{l+¸q‘€i;{i[iil+ÀÌ’€{ ; "(RubyDNS::RuleBasedServer::Rule#call;I"P/Users/samuel/.rvm/gems/ruby-2.1.2/gems/rubydns-0.8.3/lib/rubydns/server.rb;F;i ;i); i;{l+q‘€il+”#Di&;{i­[iii¯[i&il+ÔÇ’€{ ; "9block (2 levels) in RubyDNS::RuleBasedServer#process;@>;i;i); i;{l+ÀÌ’€i);{i[i)il+LÈ’€{ ; ".block in RubyDNS::RuleBasedServer#process;@>;i;i.; i;{l+ÔÇ’€i)l+0Ë’€il+q‘€i;{i[i)ii[i il+ØÈ’€{ ; "%RubyDNS::RuleBasedServer#process;@>;i;i/; i;{l+LÈ’€i.l+q‘€i;{i[i.ii[iil+œ“€{ ; "!RubyDNS::Transaction#process;I"U/Users/samuel/.rvm/gems/ruby-2.1.2/gems/rubydns-0.8.3/lib/rubydns/transaction.rb;F;iÑ;i/; i;{l+ØÈ’€i/;{iÒ[i/il+<Ó’€{ ; "6block (2 levels) in RubyDNS::Server#process_query;@>;iV;i0; i;{l+œ“€i/l+q‘€i;{i[[i/iiW[iil+Õ’€{ ; "+block in RubyDNS::Server#process_query;@>;iR;iN; i ;{l+<Ó’€i0l+|•€il+q‘€i;{ iV[i0iid[iiif[i i ig[iil+”Õ’€{ ; ""RubyDNS::Server#process_query;@>;iF;i½; i»;{l+lNˆ€i;{iR[iªiªih[iiiJ[iil+•€{ ; "'#.process;I"Q/Users/samuel/.rvm/gems/ruby-2.1.2/gems/rubydns-0.8.3/lib/rubydns/handler.rb;F;i-;i¶; iø;{l+”Õ’€i½l+$QŒ€i;{i4[i½ii.[iøiøi2[iil+ô•€{ ; "%RubyDNS::UDPHandler#receive_data;@ƒ;iN;i¶; i;{l+•€i¶;{iQ[i¶il+|•€{ ; ".block in RubyDNS::UDPHandler#receive_data;@ƒ;iQ;i; i;{l+q‘€il+HEˆ€i;{iT[iiiR[iil+ÀTˆ€{ ; "Resolv::DNS::Label::Str#==;I"B/Users/samuel/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/resolv.rb;F;iŸ;i ; i ;{i [i i l+pTˆ€{ ; "!Resolv::DNS::Label::Str#eql?;@ž;i£;i ; i;{l+ÀTˆ€i ;{i¤[i il+ô9ˆ€{ ; "=block in Resolv::DNS::Message::MessageEncoder#put_labels;@ž;i­;i; i;{ l+pTˆ€i l+,9ˆ€i l+ Tˆ€i l+<=ˆ€i;{ i¯[i ii´[i ii³[i ii°[iil+”:ˆ€{ ; "4Resolv::DNS::Message::MessageEncoder#put_labels;@ž;i¬;i; i;{l+ô9ˆ€i;{i­[iil+ä:ˆ€{ ; "2Resolv::DNS::Message::MessageEncoder#put_name;@ž;i¨;i; i;{l+”:ˆ€i;{i©[iil+ÜBˆ€{ ; "4block (3 levels) in Resolv::DNS::Message#encode;@ž;iw;i; i;{l+ä:ˆ€i l+<=ˆ€il+Ø<ˆ€i;{iy[i iiz[iii{[iil+hCˆ€{ ; "4block (2 levels) in Resolv::DNS::Message#encode;@ž;iv;i; i;{l+ÜBˆ€i;{iw[iil+ÐDˆ€{ ; ")block in Resolv::DNS::Message#encode;@ž;ic;i; i;{l+hCˆ€il+DDˆ€il+<=ˆ€i;{iv[iiiq[iiid[iil+h>ˆ€{ ; "4Resolv::DNS::Message::MessageEncoder#initialize;@ž;i‚;i; i;{l+ÐDˆ€i;{i…[iil+HEˆ€{ ; " Resolv::DNS::Message#encode;@ž;ib;i; i;{l+h>ˆ€i;{ic[iil+0Ë’€{ ; "(RubyDNS::RuleBasedServer::Rule#to_s;@>;iË;i; i;{iÌ[iil+<=ˆ€{ ; "2Resolv::DNS::Message::MessageEncoder#put_pack;@ž;i;i; i;{i‘[iil+Wˆ€{ ; "%#.split;@ž;iŠ;i ; i ;{l+Wˆ€i;{iŒ[i i i[iil+Sˆ€{ ; "Resolv::DNS::Name.create;@ž;i¸;i; i ;{l+Wˆ€i ;{i½[ii l+Lˆ€{ ; "$Resolv::DNS::Message#add_answer;@ž;i>;i; i;{l+Sˆ€i;{i?[iil+l“€{ ; "&block in RubyDNS::Transaction#add;@b;i©;i; i;{l+Lˆ€il+q‘€i l+Ô܇€i ;{i¬[iiiª[i il+ ž“€{ ; "RubyDNS::Transaction#add;@b;iŸ;i; i;{l+l“€il+HOˆ€i;{i©[iii¤[iii§[iil+Àž“€{ ; ""RubyDNS::Transaction#respond!;@b;i‰;i&; i;{ l+ ž“€il+Ô܇€i l+ôˆ€il+ p‘€i;{ i—[iii•[i ii”[iii“[iil+”#D{ ; "block (3 levels) in
;@;i8;i&; i;{l+Àž“€i&;{i9[i&il+ˆÝ‡€{ ; "Resolv::IPv4#to_s;@ž;i' ;i ; i ;{i( [i i l+Ô܇€{ ; "Resolv::IPv4#inspect;@ž;i+ ;i; i ;{l+ˆÝ‡€i ;{i, [ii l+DDˆ€{ ; "4block (2 levels) in Resolv::DNS::Message#encode;@ž;iq;i; i;{l+<=ˆ€il+ä:ˆ€i;{it[iiis[iil+ =ˆ€{ ; "3Resolv::DNS::Message::MessageEncoder#put_bytes;@ž;iŒ;i; i;{i[iil+hˆ€{ ; ".Resolv::DNS::Resource::IN::A#encode_rdata;@ž;iR;i; i;{l+ =ˆ€i;{iS[iil+è@ˆ€{ ; "4block (4 levels) in Resolv::DNS::Message#encode;@ž;i{;i; i;{l+hˆ€i;{i{[iil+Ø<ˆ€{ ; "6Resolv::DNS::Message::MessageEncoder#put_length16;@ž;i”;i; i;{l+è@ˆ€i;{i˜[iiiš[iil+@߇€{ ; "Resolv::IPv4.create;@ž;i ;i; i;{i [iil+ôˆ€{ ; ",Resolv::DNS::Resource::IN::A#initialize;@ž;iI;i; i;{l+@߇€i;{iJ[iil+`<ˆ€{ ; "4Resolv::DNS::Message::MessageEncoder#put_string;@ž;i;i ; i;{l+<=ˆ€i;{iŸ[iiiž[iil+,9ˆ€{ ; "3Resolv::DNS::Message::MessageEncoder#put_label;@ž;iº;i ; i;{l+`<ˆ€i ;{i»[i il+ Tˆ€{ ; "!Resolv::DNS::Label::Str#hash;@ž;i§;i ; i ;{i¨[i i l+ØUˆ€{ ; "'Resolv::DNS::Label::Str#initialize;@ž;i‘;i; i;{i“[iil+Wˆ€{ ; ".block in #.split;@ž;iŒ;i; i;{l+ØUˆ€i;{iŒ[iil+ p‘€{ ; "Logger#info;@0;i±;i; i;{l+¸q‘€i;{i²[iil+tUˆ€{ ; "!Resolv::DNS::Label::Str#to_s;@ž;i—;i; i;{i˜[iil+HOˆ€{ ; "Resolv::DNS::Name#to_s;@ž;i ;i; i;{l+tUˆ€i;{i [iil+lNˆ€{ ; "$Resolv::DNS::Message#initialize;@ž;i;i; i;{i[iil+´8ˆ€{ ; " Resolv::DNS::Message.decode;@ž;i¿;i; i;{l+lNˆ€i;{iÀ[iil+$QŒ€{ ; ".#.decode_message;I"Q/Users/samuel/.rvm/gems/ruby-2.1.2/gems/rubydns-0.8.3/lib/rubydns/message.rb;F;i9;i; i;{l+´8ˆ€i;{i@[iiruby-rubydns-1.0.3/spec/rubydns/server_performance_spec.rb000077500000000000000000000072331270364632400240450ustar00rootroot00000000000000#!/usr/bin/env ruby # Copyright, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'rubydns' require 'benchmark' require 'process/daemon' module RubyDNS::ServerPerformanceSpec describe RubyDNS::Server do context 'benchmark' do class ServerPerformanceRubyDNS < Process::Daemon IN = Resolv::DNS::Resource::IN def working_directory File.expand_path("../tmp", __FILE__) end def startup puts "Booting celluloid..." Celluloid.boot million = {} puts "Generating domains..." (1..5_000).each do |i| domain = "domain#{i}.local" million[domain] = "#{69}.#{(i >> 16)%256}.#{(i >> 8)%256}.#{i%256}" end puts "Starting DNS server..." RubyDNS::run_server(:listen => [[:udp, '0.0.0.0', 5300]]) do @logger.level = Logger::WARN match(//, IN::A) do |transaction| puts "Responding to #{transaction.name}" transaction.respond!(million[transaction.name]) end # Default DNS handler otherwise do |transaction| transaction.fail!(:NXDomain) end end end end class ServerPerformanceBind9 < Process::Daemon def working_directory File.expand_path("../server/bind9", __FILE__) end def startup exec(self.class.named_executable, "-c", "named.conf", "-f", "-p", "5400", "-g") end def self.named_executable # Check if named executable is available: @named ||= `which named`.chomp end end before do Celluloid.shutdown @servers = [] @servers << ["RubyDNS::Server", 5300] @domains = (1..1000).collect do |i| "domain#{i}.local" end ServerPerformanceRubyDNS.start unless ServerPerformanceBind9.named_executable.empty? ServerPerformanceBind9.start @servers << ["Bind9", 5400] end sleep 2 Celluloid.boot end after do ServerPerformanceRubyDNS.stop unless ServerPerformanceBind9.named_executable.empty? ServerPerformanceBind9.stop end end it 'it takes time' do Celluloid.logger.level = Logger::ERROR Benchmark.bm(20) do |x| @servers.each do |name, port| resolver = RubyDNS::Resolver.new([[:udp, '127.0.0.1', port]]) x.report(name) do # Number of requests remaining since this is an asynchronous event loop: 5.times do pending = @domains.size futures = @domains.collect{|domain| resolver.future.addresses_for(domain)} futures.collect do |future| expect(future.value).to_not be nil end end end end end end end end end ruby-rubydns-1.0.3/spec/rubydns/slow_server_spec.rb000077500000000000000000000051461270364632400225310ustar00rootroot00000000000000#!/usr/bin/env ruby # Copyright, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'rubydns' module RubyDNS::SlowServerSpec SERVER_PORTS = [[:udp, '127.0.0.1', 5330], [:tcp, '127.0.0.1', 5330]] IN = Resolv::DNS::Resource::IN describe "RubyDNS Slow Server" do before(:all) do Celluloid.shutdown Celluloid.boot @server = RubyDNS::run_server(:listen => SERVER_PORTS, asynchronous: true) do match(/\.*.com/, IN::A) do |transaction| sleep 2 transaction.fail!(:NXDomain) end otherwise do |transaction| transaction.fail!(:NXDomain) end end end it "get no answer after 2 seconds" do start_time = Time.now resolver = RubyDNS::Resolver.new(SERVER_PORTS, :timeout => 10) response = resolver.query("apple.com", IN::A) expect(response.answer.length).to be == 0 end_time = Time.now expect(end_time - start_time).to be_within(0.1).of(2.0) end it "times out after 1 second" do start_time = Time.now resolver = RubyDNS::Resolver.new(SERVER_PORTS, :timeout => 0.5) response = resolver.query("apple.com", IN::A) expect(response).to be nil end_time = Time.now expect(end_time - start_time).to be_within(0.1).of(1.0) end it "gets no answer immediately" do start_time = Time.now resolver = RubyDNS::Resolver.new(SERVER_PORTS, :timeout => 0.5) response = resolver.query("oriontransfer.org", IN::A) expect(response.answer.length).to be 0 end_time = Time.now expect(end_time - start_time).to be_within(0.1).of(0.0) end end end ruby-rubydns-1.0.3/spec/rubydns/socket_spec.rb000066400000000000000000000051241270364632400214400ustar00rootroot00000000000000#!/usr/bin/env ruby # Copyright, 2014, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'rubydns' require 'rubydns/system' module RubyDNS::SocketSpec IN = Resolv::DNS::Resource::IN describe RubyDNS::TCPSocketHandler do before(:all) do Celluloid.shutdown Celluloid.boot end it "should create server with existing TCP socket" do socket = TCPServer.new('127.0.0.1', 2002) # Start the RubyDNS server @server = RubyDNS::run_server(:listen => [socket], asynchronous: true) do resolver = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]]) match(/.*\.com/, IN::A) do |transaction| transaction.passthrough!(resolver) end end resolver = RubyDNS::Resolver.new([[:tcp, '127.0.0.1', 2002]]) response = resolver.query('google.com') expect(response.class).to be == RubyDNS::Message end end describe RubyDNS::UDPSocketHandler do before(:all) do Celluloid.shutdown Celluloid.boot end it "should create server with existing UDP socket" do socket = UDPSocket.new socket.bind('127.0.0.1', 2002) # Start the RubyDNS server @server = RubyDNS::run_server(:listen => [socket], asynchronous: true) do resolver = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]]) match(/.*\.com/, IN::A) do |transaction| transaction.passthrough!(resolver) end end resolver = RubyDNS::Resolver.new([[:udp, '127.0.0.1', 2002]]) response = resolver.query('google.com') expect(response.class).to be == RubyDNS::Message end end end ruby-rubydns-1.0.3/spec/rubydns/system_spec.rb000077500000000000000000000040411270364632400214740ustar00rootroot00000000000000#!/usr/bin/env ruby # Copyright, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'rubydns' require 'rubydns/system' module RubyDNS::SystemSpec describe RubyDNS::System do before(:all) do Celluloid.shutdown Celluloid.boot end it "should have at least one namesever" do expect(RubyDNS::System::nameservers.length).to be > 0 end it "should respond to query for google.com" do resolver = RubyDNS::Resolver.new(RubyDNS::System::nameservers) response = resolver.query('google.com') expect(response.class).to be == RubyDNS::Message expect(response.rcode).to be == Resolv::DNS::RCode::NoError end end describe RubyDNS::System::Hosts do it "should parse the hosts file" do hosts = RubyDNS::System::Hosts.new # Load the test hosts data: File.open(File.expand_path("../hosts.txt", __FILE__)) do |file| hosts.parse_hosts(file) end expect(hosts.call('testing')).to be == true expect(hosts['testing']).to be == '1.2.3.4' end end end ruby-rubydns-1.0.3/spec/rubydns/transaction_spec.rb000077500000000000000000000111721270364632400225000ustar00rootroot00000000000000#!/usr/bin/env rspec # Copyright, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'rubydns' require 'yaml' module RubyDNS::TransactionSpec SERVER_PORTS = [[:udp, '8.8.8.8', 53], [:tcp, '8.8.8.8', 53]] IN = Resolv::DNS::Resource::IN describe RubyDNS::Transaction do let(:server) { RubyDNS::Server.new } let(:query) { RubyDNS::Message.new(0) } let(:question) { Resolv::DNS::Name.create("www.google.com.") } let(:response) { RubyDNS::Message.new(0) } let(:resolver) { RubyDNS::Resolver.new([[:udp, '8.8.8.8', 53], [:tcp, '8.8.8.8', 53]])} it "should append an address" do transaction = RubyDNS::Transaction.new(server, query, question, IN::A, response) transaction.respond!("1.2.3.4") expect(transaction.response.answer[0][0]).to be == question expect(transaction.response.answer[0][2].address.to_s).to be == "1.2.3.4" end it "should passthrough the request" do transaction = RubyDNS::Transaction.new(server, query, question, IN::A, response) expect(transaction.response.answer.size).to be 0 transaction.passthrough!(resolver) expect(transaction.response.answer.size).to be > 0 end it "should return a response on passthrough" do transaction = RubyDNS::Transaction.new(server, query, question, IN::A, response) expect(transaction.response.answer.size).to be 0 response = transaction.passthrough(resolver) expect(response.answer.length).to be > 0 end it "should call the block with the response when invoking passthrough!" do transaction = RubyDNS::Transaction.new(server, query, question, IN::A, response) expect(transaction.response.answer.size).to be 0 passthrough_response = nil transaction.passthrough!(resolver) do |response| passthrough_response = response end expect(passthrough_response.answer.length).to be > 0 end it "should fail the request" do transaction = RubyDNS::Transaction.new(server, query, question, IN::A, response) transaction.fail! :NXDomain expect(transaction.response.rcode).to be Resolv::DNS::RCode::NXDomain end it "should return AAAA record" do transaction = RubyDNS::Transaction.new(server, query, question, IN::AAAA, response) expect(transaction.response.answer.size).to be 0 transaction.passthrough!(resolver) expect(transaction.response.answer.first[2]).to be_kind_of IN::AAAA end it "should return MX record" do transaction = RubyDNS::Transaction.new(server,query,"google.com",IN::MX, response) expect(transaction.response.answer.size).to be 0 transaction.passthrough!(resolver) expect(transaction.response.answer.first[2]).to be_kind_of IN::MX end it "should return NS record" do transaction = RubyDNS::Transaction.new(server, query, "google.com", IN::NS, response) expect(transaction.response.answer.size).to be 0 transaction.passthrough!(resolver) expect(transaction.response.answer.first[2]).to be_kind_of IN::NS end it "should return PTR record" do transaction = RubyDNS::Transaction.new(server, query, "8.8.8.8.in-addr.arpa", IN::PTR, response) expect(transaction.response.answer.size).to be 0 transaction.passthrough!(resolver) expect(transaction.response.answer.first[2]).to be_kind_of IN::PTR end it "should return SOA record" do transaction = RubyDNS::Transaction.new(server, query, "google.com", IN::SOA, response) expect(transaction.response.answer.size).to be 0 transaction.passthrough!(resolver) expect(transaction.response.answer.first[2]).to be_kind_of IN::SOA end end end ruby-rubydns-1.0.3/spec/rubydns/truncation_spec.rb000077500000000000000000000040251270364632400223400ustar00rootroot00000000000000#!/usr/bin/env ruby # Copyright, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'rubydns' require 'rubydns/extensions/string' module RubyDNS::TruncationSpec SERVER_PORTS = [[:udp, '127.0.0.1', 5520], [:tcp, '127.0.0.1', 5520]] IN = Resolv::DNS::Resource::IN describe "RubyDNS Truncation Server" do before(:all) do Celluloid.shutdown Celluloid.boot # Start the RubyDNS server RubyDNS::run_server(:listen => SERVER_PORTS, asynchronous: true) do match("truncation", IN::TXT) do |transaction| text = "Hello World! " * 100 transaction.respond!(*text.chunked) end # Default DNS handler otherwise do |transaction| transaction.fail!(:NXDomain) end end end it "should use tcp because of large response" do resolver = RubyDNS::Resolver.new(SERVER_PORTS) response = resolver.query("truncation", IN::TXT) text = response.answer.first expect(text[2].strings.join).to be == ("Hello World! " * 100) end end end