class RubyDNS::RuleBasedServer::Rule

Represents a single rule in the server.

Public Class Methods

new(pattern, callback) click to toggle source
# File lib/rubydns/rule_based_server.rb, line 28
def initialize(pattern, callback)
        @pattern = pattern
        @callback = callback
end

Public Instance Methods

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

Invoke the rule, if it matches the incoming request, it is evaluated and returns ‘true`, otherwise returns `false`.

# File lib/rubydns/rule_based_server.rb, line 47
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
match(name, resource_class) click to toggle source

Returns true if the name and resource_class are sufficient:

# File lib/rubydns/rule_based_server.rb, line 34
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
to_s() click to toggle source
# File lib/rubydns/rule_based_server.rb, line 90
def to_s
        @pattern.inspect
end