Module: DevDNSd::ApplicationMethods::Server

Included in:
DevDNSd::Application
Defined in:
lib/devdnsd/application.rb

Overview

Methods to process requests.

Instance Method Summary collapse

Instance Method Details

#perform_serverObject

Starts the DNS server.

Returns:

  • (Object)

    The result of stop callbacks.



275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
# File 'lib/devdnsd/application.rb', line 275

def perform_server
  application = self
  RubyDNS::run_server(listen: [[:udp, @config.address, @config.port.to_integer]]) do
    self.logger = application.logger

    match(/.+/, DevDNSd::Application::ANY_CLASSES) do |transaction, match_data|
      transaction.append_question!
      application.config.rules.each { |rule| application.process_rule_in_classes(rule, match_data, transaction) } # During debugging, wrap the inside of the block with a begin rescue and PRINT the exception because RubyDNS hides it.
    end

    # Default DNS handler and event handlers
    otherwise { |transaction| transaction.failure!(:NXDomain) }
    on(:start) { application.on_start }
    on(:stop) { application.on_stop }
  end
end

#process_rule(rule, type, match_data, transaction) ⇒ Object

Processes a DNS rule.

Parameters:

  • rule (Rule)

    The rule to process.

  • type (Symbol)

    The type of the query.

  • match_data (MatchData|nil)

    If the rule pattern was a Regexp, then this holds the match data, otherwise nil is passed.

  • transaction (RubyDNS::Transaction)


298
299
300
301
302
303
304
305
306
307
308
309
# File 'lib/devdnsd/application.rb', line 298

def process_rule(rule, type, match_data, transaction)
  reply, type = perform_process_rule(rule, type, match_data, transaction)
  logger.debug(reply ? i18n.reply(reply, type) : i18n.no_reply)

  if reply then
    transaction.respond!(*finalize_reply(reply, rule, type))
  elsif reply.is_a?(FalseClass) then
    false
  else
    nil
  end
end

#process_rule_in_classes(rule, match_data, transaction) ⇒ Object

Processes a rule against a set of DNS resource classes.

Parameters:

  • rule (Rule)

    The rule to process.

  • match_data (MatchData|nil)

    If the rule pattern was a Regexp, then this holds the match data, otherwise nil is passed.

  • transaction (RubyDNS::Transaction)


316
317
318
319
320
321
322
323
324
325
326
327
# File 'lib/devdnsd/application.rb', line 316

def process_rule_in_classes(rule, match_data, transaction)
  # Get the subset of handled class that is valid for the rule
  resource_classes = DevDNSd::Application::ANY_CLASSES & rule.resource_class.ensure_array
  resource_classes = resource_classes & [transaction.resource_class] if transaction.resource_class != DevDNSd::Application::ANY_REQUEST

  if resource_classes.present? then
    resource_classes.each do |resource_class| # Now for every class
      matches = rule.match_host(match_data[0])
      process_rule(rule, resource_class, rule.is_regexp? ? matches : nil, transaction) if matches
    end
  end
end