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