Skip to content

Instantly share code, notes, and snippets.

@cormoran
Created May 6, 2016 02:38
Show Gist options
  • Save cormoran/bf77872d9510a5b372cccd37066abe5b to your computer and use it in GitHub Desktop.
Save cormoran/bf77872d9510a5b372cccd37066abe5b to your computer and use it in GitHub Desktop.
#!/usr/bin/env python2
# coding=utf-8
import json
from twisted.internet import reactor, defer
from twisted.names import client, dns, error, server
class MyResolver(object):
def __init__ (self, resource_path):
with open(resource_path) as f:
self.table = json.load(f)
def _ResponseRequired(self, query):
if query.type == dns.A:
return query.name.name in self.table
return False
def _Response(self, query):
name = query.name.name
answer = dns.RRHeader(
name=name,
payload=dns.Record_A(address=b'%s' % self.table[name]))
answers = [answer]
authority = []
additional = []
return answers, authority, additional
def query(self, query, timeout=None):
if self._ResponseRequired(query):
return defer.succeed(self._Response(query))
else:
return defer.fail(error.DomainError())
def main():
factory = server.DNSServerFactory(
#clients=[MyResolver(), client.Resolver(resolv='/etc/resolv.conf')]
clients=[MyResolver('config.json'), client.Resolver(servers=[('8.8.8.8',53), ('8.8.4.4',53)])]
)
protocol = dns.DNSDatagramProtocol(controller=factory)
reactor.listenUDP(53, protocol)
reactor.listenTCP(53, factory)
reactor.run()
if __name__ == '__main__':
raise SystemExit(main())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment