On Sat, Jul 10, 2010 at 5:07 PM, Ray <[email protected]> wrote:
> I am writing a very similar script and I am new to dnsPython.
> Would you mind posting your sample code that listens on port 53
> and responds with an A record? (The only difference in my case is
> that I am responding with a CNAME).

Here.
import dns.message
import dns.rrset
import socket

def requestHandler(address, message):
    resp = None
    try:
        message_id = ord(message[0]) * 256 + ord(message[1])
        print 'msg id = ' + str(message_id)
        if message_id in serving_ids:
            # the request is already taken, drop this message
            print 'I am already serving this request.'
            return
        serving_ids.append(message_id)
        try:
            msg = dns.message.from_wire(message)
            try:
                op = msg.opcode()
                if op == 0:
                    # standard and inverse query
                    qs = msg.question
                    if len(qs) > 0:
                        q = qs[0]
                        print 'request is ' + str(q)
                        if q.rdtype == dns.rdatatype.A:
                            resp = std_qry(msg)
                        else:
                            # not implemented
                            resp = self.make_response(qry=msg, RCODE=4)   # RCODE =  4    Not Implemented
                else:
                    # not implemented
                    resp = self.make_response(qry=msg, RCODE=4)   # RCODE =  4    Not Implemented

            except Exception, e:
                print 'got ' + repr(e)
                resp = self.make_response(qry=msg, RCODE=2)   # RCODE =  2    Server Error
                print 'resp = ' + repr(resp.to_wire())

        except Exception, e:
            print 'got ' + repr(e)
            resp = self.make_response(id=message_id, RCODE=1)   # RCODE =  1    Format Error
            print 'resp = ' + repr(resp.to_wire())

    except Exception, e:
        # message was crap, not even the ID
        print 'got ' + repr(e)

    if resp:
        s.sendto(resp.to_wire(), address)


def std_qry(msg):
    qs = msg.question
    print str(len(qs)) + ' questions.'

    answers = []
    nxdomain = False
    for q in qs:
        qname = q.name.to_text()[:-1]
        print 'q name = ' + qname

        if qname.lower() == 'alice.com':
            resp = make_response(qry=msg)
            print 'returns: 1.2.3.4'
            rrset = dns.rrset.from_text(q.name, 1000,
                   dns.rdataclass.IN, dns.rdatatype.A, '1.2.3.4')
            resp.answer.append(rrset)
            print 'returns: 1.2.5.6'
            rrset = dns.rrset.from_text(q.name, 1000,
                   dns.rdataclass.IN, dns.rdatatype.A, '1.2.5.6')
            resp.answer.append(rrset)
            return resp
        else:
            return make_response(qry=msg, RCODE=3)   # RCODE =  3    Name Error


def make_response(qry=None, id=None, RCODE=0):
    if qry is None and id is None:
        raise Exception, 'bad use of make_response'
    if qry is None:
        resp = dns.message.Message(id)
        # QR = 1
        resp.flags |= dns.flags.QR
        if RCODE != 1:
            raise Exception, 'bad use of make_response'
    else:
        resp = dns.message.make_response(qry)
    resp.flags |= dns.flags.AA
    resp.flags |= dns.flags.RA
    resp.set_rcode(RCODE)
    return resp

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 53))
print 'binded to UDP port 53.'
serving_ids = []

while True:
    print 'waiting requests.'
    message, address = s.recvfrom(1024)
    print 'serving a request.'
    requestHandler(address, message)

_______________________________________________
dnspython-users mailing list
[email protected]
http://howl.play-bow.org/mailman/listinfo.cgi/dnspython-users

Reply via email to