Skip to content

Instantly share code, notes, and snippets.

@gleicon
Created July 10, 2011 03:31
Show Gist options
  • Select an option

  • Save gleicon/1074227 to your computer and use it in GitHub Desktop.

Select an option

Save gleicon/1074227 to your computer and use it in GitHub Desktop.
gevent/dnslib/redis based DNS server
# dns server using dnslib and gevent
# based on https://bitbucket.org/paulc/dnslib/src/80d85555aae4/src/server/gevent_server.py
# set the key as
# set IP:name ip_addr
# set TXT:name txtfield
# fallback on gevent's dns resolver
# gleicon 2011
import gevent
from gevent import socket
import gevent.dns;
from gevent import monkey;
monkey.patch_socket()
import urllib2,sys
import redis
import random
from dnslib import *
AF_INET = 2
SOCK_DGRAM = 2
s = socket.socket(AF_INET,SOCK_DGRAM)
s.bind(('',53))
def dns_handler(s, peer, data, r):
request = DNSRecord.parse(data)
id = request.header.id
qname = request.q.qname
qtype = request.q.qtype
IP = r.get("IP:%s" % qname)
TXT = r.get("TXT:%s" % qname)
if not IP:
try:
IP = socket.gethostbyname(str(qname))
except Exception, e:
print 'Host not found'
IP = '0.0.0.0'
print "Request (%s): %r (%s) - Response: %s" % (str(peer), qname.label, QTYPE[qtype], IP)
reply = DNSRecord(DNSHeader(id=id,qr=1,aa=1,ra=1),q=request.q)
if qtype == QTYPE.A:
reply.add_answer(RR(qname,qtype,rdata=A(IP)))
elif qtype == QTYPE['*']:
reply.add_answer(RR(qname,QTYPE.A,rdata=A(IP)))
reply.add_answer(RR(qname,QTYPE.MX,rdata=MX(IP)))
reply.add_answer(RR(qname,QTYPE.TXT,rdata=TXT(TXT)))
else:
reply.add_answer(RR(qname,QTYPE.CNAME,rdata=CNAME(TXT)))
s.sendto(reply.pack(),peer)
def main():
r = redis.Redis()
while True:
data,peer = s.recvfrom(8192)
gevent.spawn(dns_handler, s, peer, data, r)
if __name__ == '__main__':
main()
@denik
Copy link
Copy Markdown

denik commented Jul 10, 2011

gevent.dns module is gone in gevent 1.0.
However gevent 1.0 implements socket.gethostbyname_ex() (using c-ares library which is better than libevent-dns)

@gleicon
Copy link
Copy Markdown
Author

gleicon commented Jul 10, 2011

thanks, fixing it

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment