コード例 #1
0
    def setUp(self):
        self.results = None
        self.d = defer.Deferred()
        self.d.addCallback(self._gotResults)
        self.controller = client.AXFRController('fooby.com', self.d)

        self.soa = dns.RRHeader(name='fooby.com', type=dns.SOA, cls=dns.IN, ttl=86400, auth=False,
                                payload=dns.Record_SOA(mname='fooby.com',
                                                       rname='hooj.fooby.com',
                                                       serial=100,
                                                       refresh=200,
                                                       retry=300,
                                                       expire=400,
                                                       minimum=500,
                                                       ttl=600))

        self.records = [
            self.soa,
            dns.RRHeader(name='fooby.com', type=dns.NS, cls=dns.IN, ttl=700, auth=False,
                         payload=dns.Record_NS(name='ns.twistedmatrix.com', ttl=700)),

            dns.RRHeader(name='fooby.com', type=dns.MX, cls=dns.IN, ttl=700, auth=False,
                         payload=dns.Record_MX(preference=10, exchange='mail.mv3d.com', ttl=700)),

            dns.RRHeader(name='fooby.com', type=dns.A, cls=dns.IN, ttl=700, auth=False,
                         payload=dns.Record_A(address='64.123.27.105', ttl=700)),
            self.soa
            ]
コード例 #2
0
ファイル: server.py プロジェクト: elad661/wildcard-dns-server
    def __init__(self,
                 wildcard_domain,
                 debug_level=0,
                 ns_domain=None,
                 my_ip=None):

        common.ResolverBase.__init__(self)
        self._cache = {}

        self._debug_level = debug_level
        self.ns_domain = ns_domain
        self.wildcard_domain = wildcard_domain
        self.my_ip = bytes(my_ip)

        self.soa = dns.Record_SOA(mname=self.wildcard_domain,
                                  rname=self.wildcard_domain,
                                  serial=0,
                                  refresh=TTL,
                                  minimum=TTL,
                                  expire=TTL * 24,
                                  ttl=TTL)

        # Create regex pattern corresponding to xip.io style DNS
        # wilcard domain.

        pattern = (r'(.*\.)?(?P<ipaddr>\d+\.\d+\.\d+\.\d+)\.%s' %
                   re.escape(wildcard_domain))

        if self._debug_level > 0:
            print('wildcard %s' % pattern, file=sys.stderr)

        self._wildcard = re.compile(pattern)
コード例 #3
0
    def __parseLine(self, line):
        tokens = line.split(None, 2)
        # reject if incorrectly formatted.
        if len(tokens) != 3:
            raise RuntimeError(
                "line '%s': wrong # of tokens %d." %(line, len(tokens)))

        rname, rtype, rvalue = tokens
        # # if rvalue is a list, make sure to store it as one!
        if rvalue.startswith("["):
            rvalue = json.loads(rvalue)

        # create correct payload
        payload = None
        if rtype == "A":
            payload = dns.Record_A(address=rvalue)
        elif rtype == "CNAME":
            payload = dns.Record_CNAME(name=rvalue)
        elif rtype == "MX":
            payload = dns.Record_MX(name=rvalue[0],
                                    preference=int(rvalue[1]))
        elif rtype == "NS":
            payload = dns.Record_NS(name=rvalue)
        elif rtype == "SOA":
            payload = dns.Record_SOA(mname=rvalue[0], rname=rvalue[1])
        elif rtype == "TXT":
            payload = dns.Record_TXT(data=[rvalue])
        else:
            raise "cannot parse line!"

        return dns.RRHeader(name=rname,
                            type=self.__query_types[rtype],
                            payload=payload,
                            ttl=0) # set TTL to 0 for now so that we can
コード例 #4
0
ファイル: controller.py プロジェクト: nalle/dyndd
    def _Record_SOA(self, query):
        d = self.lookup_result['domain']
        answers = [dns.RRHeader(
                name=query.name.name, type=dns.SOA,
                payload=dns.Record_SOA(mname=self.lookup_result['domain'],
                                       rname="hostmaster." % d,
                                       serial=int(time.time()),
                                       refresh=3600,
                                       ttl=5), auth=True)]

        return answers, [], []
コード例 #5
0
 def packResultSOA(value):
     if edns is not None:
         if edns.rdlength > 8:
             add.append(dns.RRHeader('', dns.EDNS, 4096, edns.ttl, edns.payload, True))
         else: 
             add.append(dns.RRHeader('', dns.EDNS, 4096, 0, dns.Record_EDNS(None, 0), True))
     
     return [(dns.RRHeader(name, dns.SOA, dns.IN, value['ttl'], dns.Record_SOA(value['record'], value['email'], value['serial'], value['refresh'], value['retry'], value['expire'], value['ttl']), True),), 
         (), 
         add
     ]
コード例 #6
0
ファイル: test_templates.py プロジェクト: 0xPoly/ooni-probe
 def test_represent_answer_soa(self):
     ptr_record = dns.RRHeader(payload=dns.Record_SOA(
         mname='example.com', rname='foo.example.com'),
                               type=dns.SOA)
     represented_answer = {}
     represented_answer['ttl'] = None
     represented_answer['answer_type'] = 'SOA'
     represented_answer['hostname'] = 'example.com'
     represented_answer['responsible_name'] = 'foo.example.com'
     represented_answer['serial_number'] = 0
     represented_answer['refresh_interval'] = 0
     represented_answer['retry_interval'] = 0
     represented_answer['minimum_ttl'] = 0
     represented_answer['expiration_limit'] = 0
     self.assertEqual(dnst.representAnswer(ptr_record), represented_answer)
コード例 #7
0
    def _do_soa_response(self, name=None):
        """
        Ensure a standard response to a SOA query.
        """
        answer = dns.RRHeader(
            name=name,
            payload=dns.Record_SOA(mname=name.lower(),
                rname='info.'+name.lower(),
                serial=0, refresh=300, retry=300, expire=300, minimum=300,
                ttl=300),
            type=dns.SOA)
        answers = [answer]
        authority = []
        additional = []

        return answers, authority, additional
コード例 #8
0
ファイル: test_dns.py プロジェクト: bopopescu/cc-2
 def test_soa(self):
     """
     The repr of a L{dns.Record_SOA} instance includes all of the
     authority fields.
     """
     self.assertEqual(
         repr(
             dns.Record_SOA(mname='mName',
                            rname='rName',
                            serial=123,
                            refresh=456,
                            retry=789,
                            expire=10,
                            minimum=11,
                            ttl=12)),
         "<SOA mname=mName rname=rName serial=123 refresh=456 "
         "retry=789 expire=10 minimum=11 ttl=12>")
コード例 #9
0
    def loadFile(self, base):
        self.base = base

        self.soa = (
            base,
            dns.Record_SOA(
                base,
                # mname = self.ns_name,
                # rname = '???',
                serial="1970010100",
                refresh="7D",
                expire="7D",
                minimum="7D",
                ttl="7D",
            ),
        )

        self.records = DNSEchoRecordProducer(self.base, self.ns_name,
                                             self.extra_records)
コード例 #10
0
ファイル: dns_filter.py プロジェクト: ilhanmercan/dns-filter
 def _doDynamicResponse(self, query):
     """
     Calculate the response to a query.
     """
     name = query.name.name
     answers = [
         dns.RRHeader(
             name=name,
             type=dns.CNAME,
             payload=dns.Record_CNAME(
                 name=self.cname,
             ),
         ),
         dns.RRHeader(
             name=name,
             type=dns.SOA,
             payload=dns.Record_SOA(
                 serial=2018101700,
                 refresh=10800,
                 minimum=86400,
                 expire=604800,
                 retry=2000,
             ),
         ),
         dns.RRHeader(
             name=name,
             type=dns.NS,
             payload=dns.Record_NS(
                 name=self.nameserver1,
             ),
         ),
         dns.RRHeader(
             name=name,
             type=dns.NS,
             payload=dns.Record_NS(
                 name=self.nameserver2,
             ),
         ),
     ]
     authority = []
     additional = []
     return answers, authority, additional
コード例 #11
0
ファイル: ipdns.py プロジェクト: xmonader/ipdns
 def __init__(self, domain, ns_server, ns_email, ns_records):
     self.domain = domain
     self.ns_server = ns_server
     self.ns_email = ns_email
     self._matcher = re.compile(r'^.*?-?(\d+)\.%s$' %
                                domain.replace('.', '\\.'))
     self.ns_records = dict()
     for record in ns_records.split(','):
         ns, ip = record.split(':', 1)
         name = "%s.%s" % (ns, domain)
         self.ns_records[name] = dns.RRHeader(
             name=name, payload=dns.Record_A(address=ip))
     self.authority = dns.RRHeader(name=self.domain,
                                   type=dns.SOA,
                                   payload=dns.Record_SOA(
                                       mname=self.ns_server,
                                       rname=self.ns_email,
                                       serial=1,
                                       refresh="1H",
                                       retry="1H",
                                       expire="1H",
                                       minimum="1H"))
コード例 #12
0
ファイル: tap.py プロジェクト: warner/flancer
 def update_records(self):
     resolvers = []
     self._da = {}
     for z,zd in self._data["zones"].items():
         soa = dns.Record_SOA(
             mname=zd["server_name"],
             rname="root." + z, # what is this for?
             serial=1, # must be int, fit in struct.pack("L") so 32-bits
             refresh="1M",
             retry="1M",
             expire="1M",
             minimum="1M",
             )
         ns = dns.Record_NS(zd["server_name"])
         records = {
             z: [soa, ns],
             }
         da = DynamicAuthority(z, soa, records)
         resolvers.append(da)
         self._authorities[z] = da
     print(self._dns_server.resolver)
     self._dns_server.resolver = ResolverChain(resolvers)
コード例 #13
0
def justPayload(results):
    return [r.payload for r in results[0]]


class NoFileAuthority(authority.FileAuthority):
    def __init__(self, soa, records):
        # Yes, skip FileAuthority
        common.ResolverBase.__init__(self)
        self.soa, self.records = soa, records


soa_record = dns.Record_SOA(mname='test-domain.com',
                            rname='root.test-domain.com',
                            serial=100,
                            refresh=1234,
                            minimum=7654,
                            expire=19283784,
                            retry=15,
                            ttl=1)

reverse_soa = dns.Record_SOA(mname='93.84.28.in-addr.arpa',
                             rname='93.84.28.in-addr.arpa',
                             serial=120,
                             refresh=54321,
                             minimum=382,
                             expire=11193983,
                             retry=30,
                             ttl=3)

my_soa = dns.Record_SOA(
    mname='my-domain.com',
コード例 #14
0
ファイル: resolver.py プロジェクト: ziqi521/SnitchDNS
    def __build_answer(self,
                       query,
                       db_zone,
                       db_record,
                       is_conditional_response=False):
        record = None
        # Calculate the query type (in case it's a request for A but a CNAME is returned).
        query_type = REV_TYPES[db_record.type]
        if query_type == dns.A:
            record = dns.Record_A(address=db_record.property(
                'address', conditional=is_conditional_response),
                                  ttl=db_record.ttl)
        elif query_type == dns.AAAA:
            record = dns.Record_AAAA(address=db_record.property(
                'address', conditional=is_conditional_response),
                                     ttl=db_record.ttl)
        elif query_type == dns.AFSDB:
            record = dns.Record_AFSDB(subtype=int(
                db_record.property('subtype',
                                   conditional=is_conditional_response)),
                                      hostname=db_record.property(
                                          'hostname',
                                          conditional=is_conditional_response))
        elif query_type == dns.CNAME:
            record = dns.Record_CNAME(name=db_record.property(
                'name', conditional=is_conditional_response),
                                      ttl=db_record.ttl)
        elif query_type == dns.DNAME:
            record = dns.Record_DNAME(name=db_record.property(
                'name', conditional=is_conditional_response),
                                      ttl=db_record.ttl)
        elif query_type == dns.HINFO:
            record = dns.Record_HINFO(
                cpu=db_record.property(
                    'cpu', conditional=is_conditional_response).encode(),
                os=db_record.property(
                    'os', conditional=is_conditional_response).encode())
        elif query_type == dns.MX:
            record = dns.Record_MX(preference=int(
                db_record.property('preference',
                                   conditional=is_conditional_response)),
                                   name=db_record.property(
                                       'name',
                                       conditional=is_conditional_response))
        elif query_type == dns.NAPTR:
            record = dns.Record_NAPTR(
                order=int(
                    db_record.property('order',
                                       conditional=is_conditional_response)),
                preference=int(
                    db_record.property('preference',
                                       conditional=is_conditional_response)),
                flags=db_record.property(
                    'flags', conditional=is_conditional_response).encode(),
                service=db_record.property(
                    'service', conditional=is_conditional_response).encode(),
                regexp=db_record.property(
                    'regexp', conditional=is_conditional_response).encode(),
                replacement=db_record.property(
                    'replacement', conditional=is_conditional_response))
        elif query_type == dns.NS:
            record = dns.Record_NS(name=db_record.property(
                'name', conditional=is_conditional_response),
                                   ttl=db_record.ttl)
        elif query_type == dns.PTR:
            record = dns.Record_PTR(name=db_record.property(
                'name', conditional=is_conditional_response),
                                    ttl=db_record.ttl)
        elif query_type == dns.RP:
            record = dns.Record_RP(
                mbox=db_record.property('mbox',
                                        conditional=is_conditional_response),
                txt=db_record.property('txt',
                                       conditional=is_conditional_response))
        elif query_type == dns.SOA:
            record = dns.Record_SOA(
                mname=db_record.property('mname',
                                         conditional=is_conditional_response),
                rname=db_record.property('rname',
                                         conditional=is_conditional_response),
                serial=int(
                    db_record.property('serial',
                                       conditional=is_conditional_response)),
                refresh=int(
                    db_record.property('refresh',
                                       conditional=is_conditional_response)),
                retry=int(
                    db_record.property('retry',
                                       conditional=is_conditional_response)),
                expire=int(
                    db_record.property('expire',
                                       conditional=is_conditional_response)),
                minimum=int(
                    db_record.property('minimum',
                                       conditional=is_conditional_response)))
        elif query_type == dns.SPF:
            record = dns.Record_SPF(
                db_record.property(
                    'data', conditional=is_conditional_response).encode())
        elif query_type == dns.SRV:
            record = dns.Record_SRV(
                priority=int(
                    db_record.property('priority',
                                       conditional=is_conditional_response)),
                port=int(
                    db_record.property('port',
                                       conditional=is_conditional_response)),
                weight=int(
                    db_record.property('weight',
                                       conditional=is_conditional_response)),
                target=db_record.property('target',
                                          conditional=is_conditional_response))
        elif query_type == dns.SSHFP:
            record = dns.Record_SSHFP(
                algorithm=int(
                    db_record.property('algorithm',
                                       conditional=is_conditional_response)),
                fingerprintType=int(
                    db_record.property('fingerprint_type',
                                       conditional=is_conditional_response)),
                fingerprint=db_record.property(
                    'fingerprint',
                    conditional=is_conditional_response).encode())
        elif query_type == dns.TSIG:
            record = dns.Record_TSIG(
                algorithm=db_record.property(
                    'algorithm', conditional=is_conditional_response).encode(),
                timeSigned=int(
                    db_record.property('timesigned',
                                       conditional=is_conditional_response)),
                fudge=int(
                    db_record.property('fudge',
                                       conditional=is_conditional_response)),
                originalID=int(
                    db_record.property('original_id',
                                       conditional=is_conditional_response)),
                MAC=db_record.property(
                    'mac', conditional=is_conditional_response).encode(),
                otherData=db_record.property(
                    'other_data',
                    conditional=is_conditional_response).encode())
        elif query_type == dns.TXT:
            record = dns.Record_TXT(
                db_record.property(
                    'data', conditional=is_conditional_response).encode())
        else:
            pass

        if not record:
            return None

        answer = dns.RRHeader(name=query.name.name,
                              type=query_type,
                              cls=query.cls,
                              ttl=db_record.ttl,
                              payload=record)
        return answer
コード例 #15
0
def start_local_dns_server(args):
    all_records = {}

    def _push_record(name, r):
        print('pushing record: |%s|' % name)
        if all_records.get(name) is not None:
            all_records[name].append(r)
            return
        all_records[name] = [r]

    def _maybe_split_up_txt_data(name, txt_data, r_ttl):
        start = 0
        txt_data_list = []
        while len(txt_data[start:]) > 0:
            next_read = len(txt_data[start:])
            if next_read > 255:
                next_read = 255
            txt_data_list.append(txt_data[start:start + next_read])
            start += next_read
        _push_record(name, dns.Record_TXT(*txt_data_list, ttl=r_ttl))

    with open(args.records_config_path) as config:
        test_records_config = yaml.load(config)
    common_zone_name = test_records_config['resolver_tests_common_zone_name']
    for group in test_records_config['resolver_component_tests']:
        for name in group['records'].keys():
            for record in group['records'][name]:
                r_type = record['type']
                r_data = record['data']
                r_ttl = int(record['TTL'])
                record_full_name = '%s.%s' % (name, common_zone_name)
                assert record_full_name[-1] == '.'
                record_full_name = record_full_name[:-1]
                if r_type == 'A':
                    _push_record(record_full_name,
                                 dns.Record_A(r_data, ttl=r_ttl))
                if r_type == 'AAAA':
                    _push_record(record_full_name,
                                 dns.Record_AAAA(r_data, ttl=r_ttl))
                if r_type == 'SRV':
                    p, w, port, target = r_data.split(' ')
                    p = int(p)
                    w = int(w)
                    port = int(port)
                    target_full_name = '%s.%s' % (target, common_zone_name)
                    r_data = '%s %s %s %s' % (p, w, port, target_full_name)
                    _push_record(
                        record_full_name,
                        dns.Record_SRV(p, w, port, target_full_name,
                                       ttl=r_ttl))
                if r_type == 'TXT':
                    _maybe_split_up_txt_data(record_full_name, r_data, r_ttl)
    # Server health check record
    _push_record(_SERVER_HEALTH_CHECK_RECORD_NAME,
                 dns.Record_A(_SERVER_HEALTH_CHECK_RECORD_DATA, ttl=0))
    soa_record = dns.Record_SOA(mname=common_zone_name)
    test_domain_com = NoFileAuthority(
        soa=(common_zone_name, soa_record),
        records=all_records,
    )
    server = twisted.names.server.DNSServerFactory(
        authorities=[test_domain_com], verbose=2)
    server.noisy = 2
    twisted.internet.reactor.listenTCP(args.port, server)
    dns_proto = twisted.names.dns.DNSDatagramProtocol(server)
    dns_proto.noisy = 2
    twisted.internet.reactor.listenUDP(args.port, dns_proto)
    print('starting local dns server on 127.0.0.1:%s' % args.port)
    print('starting twisted.internet.reactor')
    twisted.internet.reactor.suggestThreadPoolSize(1)
    twisted.internet.reactor.run()
コード例 #16
0
ファイル: test_dns.py プロジェクト: bopopescu/cc-2
 def test_soa(self):
     """
     Two L{dns.Record_SOA} instances compare equal if and only if they have
     the same mname, rname, serial, refresh, minimum, expire, retry, and
     ttl.
     """
     # Vary the mname
     self._equalityTest(
         dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30),
         dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30),
         dns.Record_SOA('xname', 'rname', 123, 456, 789, 10, 20, 30))
     # Vary the rname
     self._equalityTest(
         dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30),
         dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30),
         dns.Record_SOA('mname', 'xname', 123, 456, 789, 10, 20, 30))
     # Vary the serial
     self._equalityTest(
         dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30),
         dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30),
         dns.Record_SOA('mname', 'rname', 1, 456, 789, 10, 20, 30))
     # Vary the refresh
     self._equalityTest(
         dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30),
         dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30),
         dns.Record_SOA('mname', 'rname', 123, 1, 789, 10, 20, 30))
     # Vary the minimum
     self._equalityTest(
         dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30),
         dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30),
         dns.Record_SOA('mname', 'rname', 123, 456, 1, 10, 20, 30))
     # Vary the expire
     self._equalityTest(
         dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30),
         dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30),
         dns.Record_SOA('mname', 'rname', 123, 456, 789, 1, 20, 30))
     # Vary the retry
     self._equalityTest(
         dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30),
         dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30),
         dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 1, 30))
     # Vary the ttl
     self._equalityTest(
         dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30),
         dns.Record_SOA('mname', 'rname', 123, 456, 789, 10, 20, 30),
         dns.Record_SOA('mname', 'xname', 123, 456, 789, 10, 20, 1))