class Matchd::Rule

Constants

NotImplementedError
REGEXP_MATCHER
REGEXP_OPTIONS

Attributes

raw[R]

Public Class Methods

new(options) click to toggle source
# File lib/matchd/rule.rb, line 42
def initialize(options)
  @raw = options
  @name = options.fetch("match")
  @resource_classes = Array(options.fetch("resource_class"))
end
parse_match(name) click to toggle source

parses a Regexp lookalike String into Regexp or returns the String

# File lib/matchd/rule.rb, line 20
def self.parse_match(name)
  if name.is_a?(Regexp)
    name
  elsif (r = name.match(REGEXP_MATCHER))
    regexp_opts = r[2].each_char.reduce(0) { |o, c| o |= REGEXP_OPTIONS[c] } # rubocop:disable Lint/UselessAssignment # No, it's not!
    Regexp.new(r[1], regexp_opts)
  else
    name
  end
end
parse_resource_class(resource_class) click to toggle source
# File lib/matchd/rule.rb, line 31
def self.parse_resource_class(resource_class)
  resource_class.map do |klass|
    case klass
    when ::Resolv::DNS::Resource then klass
    when String, Symbol then ::Resolv::DNS::Resource::IN.const_get(klass.upcase)
    end
  end
end

Public Instance Methods

call(server, name, resource_class, transaction) click to toggle source

This is the main interface for executing rules. It tests if this rule matches by calling {#matches?} and runs it by calling {#visit!}

@param server [Matchd::Server] @param name [String] The query name @param resource_class [Resolv::DNS::Resource] The query IN ressource @param transaction [Async::DNS::Transaction] @return [TrueClass|FalseClass] Whether further processing shall stop

# File lib/matchd/rule.rb, line 82
def call(server, name, resource_class, transaction)
  return false unless matches?(name, resource_class)

  visit!(server, name, resource_class, transaction)
end
match_name() click to toggle source

@private

# File lib/matchd/rule.rb, line 89
def match_name
  @match_name ||= self.class.parse_match(@name)
end
match_resource_classes() click to toggle source

@private

# File lib/matchd/rule.rb, line 94
def match_resource_classes
  @match_resource_classes ||= self.class.parse_resource_class(@resource_classes)
end
matches?(query_name, query_resource_class) click to toggle source

Checks if this rule matches a DNS query (name and ressource class). @return [TrueClass|FalseClass]

# File lib/matchd/rule.rb, line 68
def matches?(query_name, query_resource_class)
  name_for_match === query_name && # rubocop:disable Style/CaseEquality #  This does string equality and Regexp matching at the same time
    resource_classes_for_match.include?(query_resource_class)
end
visit!(_server, _name, _resource_class, _transaction) click to toggle source

Implements the rule logic formulating the DNS response to a query. It's return value signals whether this rule was a successful match (in the sense of the rule) and evaluating later rules shall be stopped.

@note You should not need to call this method directly, use {#call} instead .

@abstract This method needs to be implemented by subclasses.

@param server [Matchd::Server] @param name [String] The query name @param resource_class [Resolv::DNS::Resource] The query IN ressource @param transaction [Async::DNS::Transaction] @return [TrueClass|FalseClass] Whether further processing shall stop

# File lib/matchd/rule.rb, line 62
def visit!(_server, _name, _resource_class, _transaction)
  raise NotImplementedError
end