module Flareon

Constants

CT

Special ct value to add to every query.

Header sent in every query.

URL

Base URL for cloudflare's DNS over HTTPs endpoint.

VERSION

Public Class Methods

batch_query(names, type: "A", json: false) { |query(name, type: type, json: json)| ... } click to toggle source
# File lib/flareon.rb, line 128
def self.batch_query(names, type: "A", json: false)
  results = [] unless block_given?
  names.each do |name|
    if block_given?
      yield Flareon.query(name, type: type, json: json)
    else
      results << Flareon.query(name, type: type, json: json)
    end
  end
  return results unless block_given?
end
batch_query_multithreaded(names, type: "A", json: false, threads: 4) { |result| ... } click to toggle source
# File lib/flareon.rb, line 140
def self.batch_query_multithreaded(names, type: "A", json: false, threads: 4)
  results = Parallel.map(names, in_threads: threads) do |name|
    Flareon.query(name, type: type, json: json)      
  end
  if block_given?
    results.each { |result| yield result }
  end
  return results 
end
dig(name, type: "A", json: false)
Alias for: query
nslookup(name, type: "A", json: false)
Alias for: query
query(name, type: "A", json: false) click to toggle source

Query the DNS over HTTPs endpoint.

IPv4 DNS query

result = Flareon.query("google.com")
# or
result = Flareon.query("google.com", type: "A")
# or
result = Flareon.query("google.com", type: 1)

IPv6 DNS query

result = Flareon.query("google.com", type: "AAAA") 
# or
result = Flareon.query("google.com", type: 28)

Mail exchange record query

result = Flareon.query("google.com", type: "MX") 
# or
result = Flareon.query("google.com", type: 15)

Raw JSON response ( not parsed )

result = Flareon.query("google.com", json: true)
# File lib/flareon.rb, line 34
def self.query(name, type: "A", json: false)
  buffer = StringIO.new
  query  = { name: name, type: type, ct: CT }
  response = HTTParty.get(URL, stream_body: true, query: query, headers: HEADER) do |fragment|
    buffer << fragment
  end
  if response.success?
    buffer = buffer.string
    if json
      return buffer
    else
      return JSON.parse(buffer)
    end
  else
    raise "Got HTTP response code #{response.code}"
  end
end
Also aliased as: nslookup, dig
resolve(name, type: "A") click to toggle source

Resolve a given domain name to a IP address.

# File lib/flareon.rb, line 68
def self.resolve(name, type: "A")
  unless type == "A" || type == "AAAA"
    raise "Unsupported resolve type!" 
  end
  resp = Flareon.query(name, type: type)
  if resp["Status"] == 0
    return nil unless resp.has_key? "Answer"
    return resp["Answer"][0]["data"]
  else
    raise resp 
  end 
end
resolve?(name, type: "A") click to toggle source

Check if a given domain name is resolvable to an IPv4 or IPv6 address.

# File lib/flareon.rb, line 60
def self.resolve?(name, type: "A")
  return true if Flareon.resolve(name, type: type) 
  false
rescue
  return false
end
resolve_all(name, type: :both) { |answer| ... } click to toggle source

Resolve a given domain name to all addresses (IPv4/IPv6).

Resolve all IP addresses

results = Flareon.resolve_all("google.com")
# or
results = Flareon.resolve_all("google.com", type: :both)
# or
Flareon.resolve_all("google.com") do |ip_address|
  # do something with the ip_address
  puts ip_address
end

Resolve all IPv4 addresses

results = Flareon.resolve_all("google.com", type: 1)
# or
results = Flareon.resolve_all("google.com", type: "A")
# File lib/flareon.rb, line 97
def self.resolve_all(name, type: :both)
  unless type == "A" || type == "AAAA" || type == :both
    raise "Unsupported resolve type!" 
  end
  results = [] unless block_given?
  case type
  when "A", "AAAA"
    resp = Flareon.query(name, type: type)
    if resp["Status"] == 0
      resp["Answer"].each do |answer|
        if block_given?
          yield answer["data"]
        else
          results << answer["data"]
        end
      end
    else
      raise resp 
    end
  when :both
    if block_given?
      Flareon.resolve_all(name, type: "A")    { |ip| yield ip }
      Flareon.resolve_all(name, type: "AAAA") { |ip| yield ip } 
    else
      Flareon.resolve_all(name, type: "A")    { |ip| results << ip }
      Flareon.resolve_all(name, type: "AAAA") { |ip| results << ip }
    end
  end
  return results unless block_given?
end