[Twisted-Python] Trouble with Record_TXT

exarkun at twistedmatrix.com exarkun at twistedmatrix.com
Wed Jun 11 11:43:36 MDT 2014


On 05:19 pm, nahraf34 at janisary.us wrote:
>Hi all,
>
>I am attempting to write a small DNS server that returns custom TXT 
>record
>when I do:
>
>dig -t TXT -p 10053 @127.0.0.1 testdomain.com
>
>The code is as follows:
>
>----------
>
>#!/usr/bin/python
>
>from twisted.internet import reactor
>from twisted.names import client, dns, server
>
>class DynamicResolver(object):
>   def query(self, query, timeout=None):
>      name = query.name.name
>
>#     answer = dns.RRHeader(
>#        name = name,
>#        payload = dns.Record_A(address=b'1.2.3.4'))
>
>      answer = dns.RRHeader(
>         name = name,
>         payload = dns.Record_TXT(data='FirstSecond', ttl=3333))
>
>      answers = [answer]
>      authority = []
>      additional = []
>
>      return answers, authority, additional
>
>def main():
>   factory = server.DNSServerFactory(
>      clients = [DynamicResolver()]
>   )
>
>   protocol = dns.DNSDatagramProtocol(controller=factory)
>
>   reactor.listenUDP(10053, protocol)
>   reactor.listenTCP(10053, factory)
>
>   reactor.run()
>
>if __name__ == '__main__':
>   main()
>
>----------
>
>You will notice three lines of code are commented out. They are sample 
>code for
>an A record that work just fine. But the attempt at Record_TXT fails.
>
>I receive the following error when I attempt to perform the dig 
>command:
>
>-----------
>
>$ python servlet.py
>Unhandled Error
>Traceback (most recent call last):
>  File "/usr/local/lib/python2.7/dist-packages/twisted/names/dns.py", 
>line 2326, in datagramReceived
>    self.controller.messageReceived(m, self, addr)
>  File "/usr/local/lib/python2.7/dist-packages/twisted/names/server.py", 
>line 192, in messageReceived
>    self.handleQuery(message, proto, address)
>  File "/usr/local/lib/python2.7/dist-packages/twisted/names/server.py", 
>line 136, in handleQuery
>    return self.resolver.query(query).addCallback(
>  File "/usr/local/lib/python2.7/dist-packages/twisted/names/common.py", 
>line 73, in query
>    return defer.maybeDeferred(method, query.name.name, timeout)
>--- <exception caught here> ---
>  File "/usr/local/lib/python2.7/dist- 
>packages/twisted/internet/defer.py", line 139, in maybeDeferred
>    result = f(*args, **kw)
>  File "/usr/local/lib/python2.7/dist-packages/twisted/names/common.py", 
>line 81, in lookupAddress
>    return self._lookup(name, dns.IN, dns.A, timeout)
>  File "/usr/local/lib/python2.7/dist- 
>packages/twisted/names/resolve.py", line 79, in _lookup
>    d = self.resolvers[0].query(q, timeout)
>  File "servlet.py", line 16, in query
>    payload = dns.Record_TXT(data='FirstSecond', ttl=3333))
>  File "/usr/local/lib/python2.7/dist-packages/twisted/names/dns.py", 
>line 867, in __init__
>    assert (payload is None) or isinstance(payload, UnknownRecord) or 
>(payload.TYPE == type)
>exceptions.AssertionError:
>
>-----------
>
>I'm a little confused, because I followed the documentation as 
>referenced here:
>http://twistedmatrix.com/documents/current/api/twisted.names.dns.Record_TXT.html
>
>Any ideas what this error means and why it is happening?

The problem here is how you're using the `RRHeader` initializer.  It 
(somewhat unhelpfully) accepts a separate `type` argument.  The value of 
the `type` argument and the type of the payload must match.  The default 
type is `A` (as in `Record_A`).

If you change your code to do something like 
`RRHeader(type=payload.type, payload=payload)` then I think you'll get 
the behavior you're after.

Jean-Paul



More information about the Twisted-Python mailing list