class EventMachine::DNSBL::Server

Public Class Methods

new(zones = MemoryZone.new) click to toggle source
# File lib/eventmachine/dnsbl/server.rb, line 7
def initialize(zones = MemoryZone.new)
        @zones = zones
end

Public Instance Methods

add_record(qname, answer, ttl=300) click to toggle source
# File lib/eventmachine/dnsbl/server.rb, line 42
def add_record(qname, answer, ttl=300)
        rr = ResourceRecord.new(qname, ttl, answer)
        @rr[qname] = [] unless @rr[qname]
        @rr[qname] << rr
end
del_all_records(qname) click to toggle source
# File lib/eventmachine/dnsbl/server.rb, line 53
def del_all_records(qname)
        @rr.delete(qname)
end
del_record(qname, answer) click to toggle source
# File lib/eventmachine/dnsbl/server.rb, line 48
def del_record(qname, answer)
        return nil unless @rr[qname]
        @rr[qname].delete_if {|rr| rr.answer == answer}
end
get_records(qname, qtype) click to toggle source
# File lib/eventmachine/dnsbl/server.rb, line 57
def get_records(qname, qtype)
        return nil unless @rr[qname]
        @rr[qname].find_all {|rr| rr.answer.class == qtype}
end
receive_data(data) click to toggle source
# File lib/eventmachine/dnsbl/server.rb, line 11
def receive_data(data)
        dns = Resolv::DNS::Message.decode(data)
        dns.qr = 1
        dns.aa = 1
        return if dns.opcode != Resolv::DNS::OpCode::Query
        unless dns.question.length == 1 and dns.question[0][1] == Resolv::DNS::Resource::IN::A
                dns.rcode = Resolv::DNS::RCode::FormErr
                res = dns.encode
                send_data res
                return
        end
        query, qtype = dns.question[0]
        rs = @zones.get_records(query.to_s, qtype)
        unless rs
                dns.rcode = Resolv::DNS::RCode::NXDomain
                res = dns.encode
                send_data res
                return
        end
        # add the records them to the set of answers
        rs.each do |rr|
                dns.add_answer(query,rr.ttl,rr.answer)
        end
        # Make sure that we are authoritative for the response! Otherwise, return REFUSED
        dns.rcode = Resolv::DNS::RCode::NoError # Or Refused
        res = dns.encode
        #port, ip = Socket.unpack_sockaddr_in(get_peername)
        #puts "DEBUG: #{ip}:#{port} #{res.length}"
        send_data res
end