class Stubby::Extensions::DNS::Server

Constants

IN
UPSTREAM

Public Instance Methods

expand_rule(trigger, instruction) click to toggle source
# File lib/stubby/extensions/dns.rb, line 79
def expand_rule(trigger, instruction)
  i = URI.parse(instruction)
  t = URI.parse(trigger)

  # If not specifying a record type, match a
  t.path = "/a" if t.path.empty?
      
  if i.scheme.nil?
    { t.to_s => "dns-a://#{instruction}" }
  else
    { t.to_s => instruction }
  end
end
process(name, resource_class, transaction) click to toggle source
# File lib/stubby/extensions/dns.rb, line 25
def process(name, resource_class, transaction)
    body = HTTPI.post("http://#{STUBBY_MASTER}:9000/rules/search.json", 
      trigger: "dns://#{name}/#{symbol_from_resource_class(resource_class)}").body

    instruction = MultiJson.load(body)

    if instruction.nil? or instruction == "@"
      transaction.passthrough!(UPSTREAM)
      return
    end

    url = URI.parse(instruction)

    response_resource_class = resource url.scheme.gsub('dns-', '')

    if !IPAddress.valid?(url.host) and response_resource_class == IN::A
      response_resource_class = IN::CNAME
    end

    response = url.host

    if [IN::CNAME, IN::MX].include? response_resource_class
      response = Resolv::DNS::Name.create(url.host)
    end

    puts "DNS: #{name} => #{response}-#{resource_class.name})"

    if response_resource_class == IN::MX
      transaction.respond!(10, response,
        :resource_class => response_resource_class,
        :ttl => 0)
    else
      transaction.respond!(response, 
        :resource_class => response_resource_class, 
        :ttl => 0)
    end
end
restore!() click to toggle source
# File lib/stubby/extensions/dns.rb, line 75
def restore!
  restore_references
end
run!(session, options) click to toggle source
# File lib/stubby/extensions/dns.rb, line 63
def run!(session, options)
  return if options[:dns] == false
  trap("INT"){ stop! }

  @session = session
  setup_references and run_dns_server
end
stop!() click to toggle source
# File lib/stubby/extensions/dns.rb, line 71
def stop!
  teardown_references and stop_dns_server
end

Private Instance Methods

resource(pattern) click to toggle source
# File lib/stubby/extensions/dns.rb, line 95
def resource(pattern)
  return IN::A unless pattern.respond_to? :to_sym
  symbol_to_resource_class[pattern.to_sym] || IN::A
end
run_dns_server() click to toggle source
# File lib/stubby/extensions/dns.rb, line 120
def run_dns_server
  logger.level = Logger::INFO

  EventMachine.run do
    run(:listen => [[:tcp, STUBBY_MASTER, 53],
      [:udp, STUBBY_MASTER, 53]])
  end
end
stop_dns_server() click to toggle source
# File lib/stubby/extensions/dns.rb, line 129
def stop_dns_server
  fire :stop
  EventMachine::stop_event_loop
rescue
end
symbol_from_resource_class(klass) click to toggle source
# File lib/stubby/extensions/dns.rb, line 100
def symbol_from_resource_class(klass)
  symbol_to_resource_class.invert[klass] || :a
end
symbol_to_resource_class() click to toggle source
# File lib/stubby/extensions/dns.rb, line 104
def symbol_to_resource_class
  {
    a:      IN::A,
    aaaa:   IN::AAAA,
    srv:    IN::SRV,
    wks:    IN::WKS,
    minfo:  IN::MINFO,
    mx:     IN::MX,
    ns:     IN::NS,
    ptr:    IN::PTR,
    soa:    IN::SOA,
    txt:    IN::TXT,
    cname:  IN::CNAME
  }
end