示例#1
0
 def test_ptr(self):
     """
     The repr of a L{dns.Record_PTR} instance includes the name of the
     pointer and the TTL of the record.
     """
     self.assertEqual(repr(dns.Record_PTR('example.com', 4321)),
                      "<PTR name=example.com ttl=4321>")
示例#2
0
 def test_represent_answer_ptr(self):
     ptr_record = dns.RRHeader(payload=dns.Record_PTR(name="example.com"),
                               type=dns.PTR)
     self.assertEqual(dnst.representAnswer(ptr_record), {
         'hostname': 'example.com',
         'answer_type': 'PTR'
     })
 def test_PTR(self):
     """
     PTR records are loaded.
     """
     [answers, [], []] = self.successResultOf(
         self.auth.lookupPointer(b"2.0.0.10.in-addr.arpa"))
     rr = answers[0]
     self.assertEqual(
         dns.Record_PTR(name=b"no-in.example.com", ),
         rr.payload,
     )
示例#4
0
 def _lookup(self, name, cls, qtype, timeout):
     if qtype == 12:  # Reverse Query:
         hostname = self.__getRandomName()
         ip = '.'.join(reversed(name[:-13].split('.')))
         self.__logInfo('Reverse-Query', "%s --> %s" % (ip, hostname), True)
         rr = dns.RRHeader(name=name,
                           type=qtype,
                           cls=cls,
                           ttl=60,
                           payload=dns.Record_PTR(name=hostname, ttl=60))
         results = [rr]
         authority = addtional = []
         return defer.succeed((results, authority, addtional))
示例#5
0
    def create_message(self, instances, name, prop, record=dns.A):
        """
        Construct a message to return to the client.
        
        instances is a reservation list (the output from ec2_connection.get_all_instances)
        name is the query value
        prop is the property to inspect on each instance to return
        record is a constant that indicates what type of record to create in the 
               payload.
        """
        output = ([], [], [])

        if not instances:
            self.log.debug("No instances found for '%s'" % (name))
            return output

        for instance in instances[0].instances:

            value = self._tag_or_property(instance, prop)
            self.log.debug("%s: %s %s" % (name, prop, value))
            if not value:
                continue

            if record == dns.A:
                payload = dns.Record_A(str(value))
            elif record == dns.PTR:
                payload = dns.Record_PTR(str(value))
            else:
                raise ValueError, "Record constant '%s' is not supported" % (
                    record)

            answer = dns.RRHeader(name,
                                  type=record,
                                  payload=payload,
                                  ttl=self.ttl)

            output[0].append(answer)

            for extra_prop in self.extra:
                extra_value = self._tag_or_property(instance, extra_prop)
                self.log.debug("%s: %s = %s" % (name, extra_prop, extra_value))
                if extra_value:
                    string = "%s = %s" % (extra_prop, extra_value)
                    extra = dns.Record_TXT(str(string))
                    extra_rr = dns.RRHeader(name,
                                            type=dns.TXT,
                                            payload=extra,
                                            ttl=self.ttl)
                    output[2].append(extra_rr)

        return output
示例#6
0
    def _doDynamicResponse(self, query):
        myip = b'%s' % (query.name.name[:-9][::-1].replace(".",""))
	myptr = "-".join([myip[:4], myip[4:8], myip[8:12], myip[12:16], myip[16:20], myip[20:24], myip[24:28], myip[28:]])+self._mysuffix
	_payload = dns.Record_PTR(name=myptr)
        answer = dns.RRHeader(
            name=query.name.name,
	    type=_payload.TYPE,
	    ttl=3600,
	    auth=True,
	    payload=_payload)
        answers = [answer]
        authority = []
        additional = []
        return answers, authority, additional
示例#7
0
    def create_message(self, instances, name, prop, record=dns.A):
        """
        Construct a message to return to the client.
        
        instances is a reservation list (the output from ec2_connection.get_all_instances)
        name is the query value
        prop is the property to inspect on each instance to return
        record is a constant that indicates what type of record to create in the 
               payload.
        """
        output = ([], [], [])

        print "OUTPUT FROM CREATE_MESSAGE type %s" % (record)

        if not instances:
            print "NO INSTANCES FOUND"
            return output

        for instance in instances[0].instances:

            value = self._tag_or_property(instance, prop)
            print "VALUE: %s %s" % (prop, value)
            if not value:
                continue

            if record == dns.A:
                payload = dns.Record_A(str(value))
            elif record == dns.PTR:
                payload = dns.Record_PTR(str(value))
            else:
                raise ValueError, "Record constant '%s' is not supported" % (
                    record)

            answer = dns.RRHeader(name, type=record, payload=payload)

            output[0].append(answer)

            for extra_prop in self.extra:
                extra_value = self._tag_or_property(instance, extra_prop)

                if extra_value:
                    string = "%s = %s" % (extra_prop, extra_value)
                    extra = dns.Record_TXT(str(string))
                    extra_rr = dns.RRHeader(name, type=dns.TXT, payload=extra)
                    output[2].append(extra_rr)

        print "OUTPUT"
        pprint.pprint(output)

        return output
示例#8
0
    def lookupPointer(self, query, timeout=None):
        answers = []
        authority = []
        additional = []

        containerName = self.__findContainerByPTRQuery(query)

        if containerName is None:
            return super().lookupPointer(query, timeout)

        p = dns.Record_PTR(name=containerName)
        answer = dns.RRHeader(name=query, payload=p, type=dns.PTR)
        answers.append(answer)
        return defer.succeed((answers, authority, additional))
示例#9
0
 def makeResult(value):
     print "dht: %s -> %s" % (dhtQueryString(name, type), value)
     response = dns.RRHeader(name=name, type=type, ttl=10)
     if type == dns.A:
         payload = dns.Record_A(address=value, ttl=10)
     elif type == dns.AAAA:
         payload = dns.Record_AAAA(address=value, ttl=10)
     elif type == dns.CNAME:
         payload = dns.Record_CNAME(name=value, ttl=10)
     elif type == dns.MX:
         payload = dns.Record_MX(name=value, ttl=10)
     elif type == dns.PTR:
         payload = dns.Record_PTR(name=value, ttl=10)
     response.payload = payload
     return ([response], [], [])
示例#10
0
 def _lookup(self, name, cls, type, timeout):
     containers = getRunningContainers()
     if name in containers:
         if name.endswith('.in-addr.arpa'):
             return defer.succeed(([
                 dns.RRHeader(name=name,
                              ttl=TTL,
                              payload=dns.Record_PTR(name=containers[name],
                                                     ttl=TTL),
                              auth=True,
                              type=type)
             ], (), ()))
         else:
             return defer.succeed(([
                 dns.RRHeader(name=name,
                              ttl=TTL,
                              payload=dns.Record_A(containers[name],
                                                   ttl=TTL),
                              auth=True)
             ], (), ()))
     print "Falling back to default impl"
     return client.Resolver._lookup(self, name, cls, type, timeout)
示例#11
0
        def browse(localname):
            services = []

            def handler(zeroconf, service_type, name, state_change):
                if state_change is ServiceStateChange.Added:
                    services.append(name)

            sb = ServiceBrowser(self.zeroconf, localname, [handler])
            time.sleep(timeout)
            sb.cancel()

            answers, additional = [], []
            for service in services:
                answers.append(
                    dns.RRHeader(name=localname[:-6] + domain,
                                 ttl=ttl,
                                 type=dns.PTR,
                                 payload=dns.Record_PTR(name=service[:-6] +
                                                        domain)))
                #txt_ans, _, _ = txt(service)
                #srv_ans, _, a_ans = srv(service)
                #additional += a_ans + txt_ans + srv_ans
            return answers, [], additional
示例#12
0
 def testPTR(self):
     """Test DNS 'PTR' record queries"""
     return self.namesTest(
         self.resolver.lookupPointer('123.93.84.28.in-addr.arpa'),
         [dns.Record_PTR('test.host-reverse.lookup.com', ttl=11193983)])
示例#13
0
            #
            #  Python bug
            #           dns.Record_A('255.255.255.255'),
            #
            dns.Record_A('255.255.255.254'),
            dns.Record_A('0.0.0.0')
        ],
        'cname.test-domain.com': [dns.Record_CNAME('test-domain.com')],
        'anothertest-domain.com': [dns.Record_A('1.2.3.4')],
    })

reverse_domain = NoFileAuthority(
    soa=('93.84.28.in-addr.arpa', reverse_soa),
    records={
        '123.93.84.28.in-addr.arpa':
        [dns.Record_PTR('test.host-reverse.lookup.com'), reverse_soa]
    })

my_domain_com = NoFileAuthority(soa=('my-domain.com', my_soa),
                                records={
                                    'my-domain.com': [
                                        my_soa,
                                        dns.Record_A('1.2.3.4', ttl='1S'),
                                        dns.Record_NS('ns1.domain', ttl='2M'),
                                        dns.Record_NS('ns2.domain', ttl='3H'),
                                        dns.Record_SRV(257,
                                                       16383,
                                                       43690,
                                                       'some.other.place.fool',
                                                       ttl='4D')
                                    ]
示例#14
0
            dns.Record_A(b'255.255.255.254'),
            dns.Record_A(b'0.0.0.0')
        ],
        b'cname.test-domain.com': [
            dns.Record_CNAME(b'test-domain.com')
        ],
        b'anothertest-domain.com': [
            dns.Record_A(b'1.2.3.4')],
    }
)

reverse_domain = NoFileAuthority(
    soa = (b'93.84.28.in-addr.arpa', reverse_soa),
    records = {
        b'123.93.84.28.in-addr.arpa': [
             dns.Record_PTR(b'test.host-reverse.lookup.com'),
             reverse_soa
        ]
    }
)


my_domain_com = NoFileAuthority(
    soa = (b'my-domain.com', my_soa),
    records = {
        b'my-domain.com': [
            my_soa,
            dns.Record_A(b'1.2.3.4', ttl='1S'),
            dns.Record_NS(b'ns1.domain', ttl=b'2M'),
            dns.Record_NS(b'ns2.domain', ttl='3H'),
            dns.Record_SRV(257, 16383, 43690, b'some.other.place.fool',
            #  Python bug
            #           dns.Record_A('255.255.255.255'),
            #
            dns.Record_A(b"255.255.255.254"),
            dns.Record_A(b"0.0.0.0"),
        ],
        b"cname.test-domain.com": [dns.Record_CNAME(b"test-domain.com")],
        b"anothertest-domain.com": [dns.Record_A(b"1.2.3.4")],
    },
)

reverse_domain = NoFileAuthority(
    soa=(b"93.84.28.in-addr.arpa", reverse_soa),
    records={
        b"123.93.84.28.in-addr.arpa": [
            dns.Record_PTR(b"test.host-reverse.lookup.com"),
            reverse_soa,
        ]
    },
)

my_domain_com = NoFileAuthority(
    soa=(b"my-domain.com", my_soa),
    records={
        b"my-domain.com": [
            my_soa,
            dns.Record_A(b"1.2.3.4", ttl="1S"),
            dns.Record_NS(b"ns1.domain", ttl=b"2M"),
            dns.Record_NS(b"ns2.domain", ttl="3H"),
            dns.Record_SRV(257,
                           16383,
示例#16
0
    def query(self, query, timeout=None):
        logging.debug("Received Query from %s: name=%s type=%s timeout=%s",
                      self.src_ip,
                      query.name.name,
                      query.type,
                      timeout)

        if query.type not in (dns.A, dns.PTR):
            logging.info("Query type %s is not supported.", query.type)
            return defer.fail(error.DomainError())

        # Native logic says never redirect
        is_auth = True

        # If config says so, let's redirect by default
        if self.config['default-action'] == 'redirect':
            is_auth = False

        if 'auth-plugin' in self.config and 'type' in self.config['auth-plugin']:
            try:
                plugin_name = self.config['auth-plugin']['type']
                plugin = auth_factory(plugin_name, self.config)
                is_auth = plugin.auth(self.src_ip, query.type, query.name.name)
                logging.debug("Answer from auth plugin '%s': %s", plugin_name, is_auth)
            except Exception:
                logging.exception("Auth plugin raised exception:")

        if is_auth:
            return defer.fail(error.DomainError())

        redirect_a_records = ['10.0.0.1',]
        redirect_ptr_records = ['portal.local.',]
        ttl = 30

        if 'ttl' in self.config:
            ttl = self.config['ttl'] or ttl

        if 'default-a-records' in self.config:
            redirect_a_records = self.config['default-a-records'] or redirect_a_records

        if 'default-ptr-records' in self.config:
            redirect_ptr_records = self.config['default-ptr-records'] or redirect_ptr_records

        answers = []
        payloads = []

        if query.type == dns.A:
            for a_rec in redirect_a_records:
                payloads.append(dns.Record_A(address=a_rec, ttl=ttl))

        # TODO: Multiple PTR records? Fix this.
        if query.type == dns.PTR:
            for ptr_rec in redirect_ptr_records:
                payloads.append(dns.Record_PTR(name=ptr_rec, ttl=ttl))

        for payload in payloads:
            logging.debug("Adding payload: %s", payload)
            answers.append(dns.RRHeader(name=query.name.name, type=query.type, payload=payload))

        logging.debug("Sending Response: answers=%s", answers)
        return defer.succeed((answers, [], []))
示例#17
0
    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