From d71122aa1cf49a506ed37f27c9ea81ecf2de8d57 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Sat, 28 Sep 2013 13:47:49 +0200 Subject: [PATCH] dns: implement querying directly the master server --- nsupdate/main/_tests/test_dnstools.py | 27 +++++++++++++++++++++ nsupdate/main/dnstools.py | 34 +++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 nsupdate/main/_tests/test_dnstools.py create mode 100644 nsupdate/main/dnstools.py diff --git a/nsupdate/main/_tests/test_dnstools.py b/nsupdate/main/_tests/test_dnstools.py new file mode 100644 index 0000000..a69b265 --- /dev/null +++ b/nsupdate/main/_tests/test_dnstools.py @@ -0,0 +1,27 @@ +""" +Tests for dnstools module. +""" + +import pytest + +from nsupdate.main.dnstools import (query_ns, NONEXISTING_HOST, WWW_HOST, WWW_IPV4_HOST, WWW_IPV4_IP, + WWW_IPV6_HOST, WWW_IPV6_IP, ) + +from dns.resolver import NXDOMAIN + + +class Tests(object): + def test_queries_ok(self): + """ + check some simple dns lookups + """ + assert query_ns(WWW_IPV4_HOST, 'A') == WWW_IPV4_IP # v4 ONLY + assert query_ns(WWW_IPV6_HOST, 'AAAA') == WWW_IPV6_IP # v6 ONLY + assert query_ns(WWW_HOST, 'A') == WWW_IPV4_IP # v4 and v6, query v4 + assert query_ns(WWW_HOST, 'AAAA') == WWW_IPV6_IP # v4 and v6, query v6 + + def test_queries_failing(self): + with pytest.raises(NXDOMAIN): + query_ns(NONEXISTING_HOST, 'A') + with pytest.raises(NXDOMAIN): + query_ns(NONEXISTING_HOST, 'AAAA') diff --git a/nsupdate/main/dnstools.py b/nsupdate/main/dnstools.py new file mode 100644 index 0000000..1cd5ce4 --- /dev/null +++ b/nsupdate/main/dnstools.py @@ -0,0 +1,34 @@ +""" +Misc. DNS related code: query, dynamic update, etc. +""" + +SERVER = '85.10.192.104' # ns1.thinkmo.de (master / dynamic upd server for nsupdate.info) +BASEDOMAIN = 'nsupdate.info' + +NONEXISTING_HOST = 'nonexisting.' + BASEDOMAIN +WWW_HOST = 'www.' + BASEDOMAIN +WWW_IPV4_HOST = 'www.ipv4.' + BASEDOMAIN +WWW_IPV6_HOST = 'www.ipv6.' + BASEDOMAIN +WWW_IPV4_IP = '178.32.221.14' +WWW_IPV6_IP = '2001:41d0:8:e00e::1' + +import dns.name +import dns.resolver + +def query_ns(qname, rdtype): + """ + query a dns name from our master server + + :param qname: the query name + :type qname: dns.name.Name object or str + :param rdtype: the query type + :type rdtype: int or str + :return: IP (as str) + """ + resolver = dns.resolver.Resolver(configure=False) + # we do not configure it from resolv.conf, but patch in the values we + # want into the documented attributes: + resolver.nameservers = [SERVER, ] + resolver.search = [dns.name.from_text(BASEDOMAIN), ] + answer = resolver.query(qname, rdtype) + return str(list(answer)[0])