5 dnspython is a DNS toolkit for Python. It supports almost all record
6 types. It can be used for queries, zone transfers, and dynamic
7 updates. It supports TSIG authenticated messages and EDNS0.
9 dnspython provides both high and low level access to DNS. The high
10 level classes perform queries for data of a given name, type, and
11 class, and return an answer set. The low level classes allow direct
12 manipulation of DNS zones, messages, names, and records.
14 To see a few of the ways dnspython can be used, look in the examples/
17 dnspython originated at Nominum where it was developed to facilitate
18 the testing of DNS software. Nominum has generously allowed it to be
19 open sourced under a BSD-style license, and helps support its future
20 development by continuing to employ the author :).
25 This is dnspython 1.9.0
29 dnspython now uses poll() instead of select() when available.
31 Bugs fixed since 1.8.0
37 Support for hmac-sha1, hmac-sha224, hmac-sha256, hmac-sha384
38 and hmac-sha512 has been contributed by Kevin Chen.
40 The tokenizer's tokens are now Token objects instead of (type,
43 Bugs fixed since 1.7.1:
45 Escapes in masterfiles now work correctly. Previously they
46 were only working correctly when the text involved was part of
49 When constructing a DDNS update, if the present() method was
50 used with a single rdata, a zero TTL was not added.
52 The entropy pool needed locking to be thread safe.
54 The entropy pool's reading of /dev/random could cause
57 The entropy pool did buffered reads, potentially consuming more
58 randomness than we needed.
60 The entropy pool did not seed with high quality randomness on
63 SRV records were compared incorrectly.
65 In the e164 query function, the resolver parameter was not
72 Bugs fixed since 1.7.0:
74 The 1.7.0 kitting process inadventently omitted the code for the
77 Negative DDNS prerequisites are now handled correctly.
81 Rdatas now have a to_digestable() method, which returns the
82 DNSSEC canonical form of the rdata, suitable for use in
83 signature computations.
85 The NSEC3, NSEC3PARAM, DLV, and HIP RR types are now supported.
87 An entropy module has been added and is used to randomize query ids.
89 EDNS0 options are now supported.
91 UDP IXFR is now supported.
93 The wire format parser now has a 'one_rr_per_rrset' mode, which
94 suppresses the usual coalescing of all RRs of a given type into a
97 Various helpful DNSSEC-related constants are now defined.
99 The resolver's query() method now has an optional 'source' parameter,
100 allowing the source IP address to be specified.
102 Bugs fixed since 1.6.0:
104 On Windows, the resolver set the domain incorrectly.
106 DS RR parsing only allowed one Base64 chunk.
108 TSIG validation didn't always use absolute names.
110 NSEC.to_text() only printed the last window.
112 We did not canonicalize IPv6 addresses before comparing them; we
113 would thus treat equivalent but different textual forms, e.g.
114 "1:00::1" and "1::1" as being non-equivalent.
116 If the peer set a TSIG error, we didn't raise an exception.
118 Some EDNS bugs in the message code have been fixed (see the ChangeLog
122 Added dns.inet.is_multicast().
124 Bugs fixed since 1.5.0:
126 If select() raises an exception due to EINTR, we should just
129 If the queried address is a multicast address, then don't
130 check that the address of the response is the same as the
133 NAPTR comparisons didn't compare the preference field due to a
136 Testing of whether a Windows NIC is enabled now works on Vista
137 thanks to code contributed by Paul Marks.
141 Answer objects now support more of the python sequence
142 protocol, forwarding the requests to the answer rrset.
143 E.g. "for a in answer" is equivalent to "for a in
144 answer.rrset", "answer[i]" is equivalent to "answer.rrset[i]",
145 and "answer[i:j]" is equivalent to "answer.rrset[i:j]".
147 Making requests using EDNS, including indicating DNSSEC awareness,
148 is now easier. For example, you can now say:
150 q = dns.message.make_query('www.dnspython.org', 'MX',
153 dns.query.xfr() can now be used for IXFR.
155 Support has been added for the DHCID, IPSECKEY, and SPF RR types.
157 UDP messages from unexpected sources can now be ignored by
158 setting ignore_unexpected to True when calling dns.query.udp.
160 Bugs fixed since 1.4.0:
162 If /etc/resolv.conf didn't exist, we raised an exception
163 instead of simply using the default resolver configuration.
165 In dns.resolver.Resolver._config_win32_fromkey(), we were
166 passing the wrong variable to self._config_win32_search().
170 You can now convert E.164 numbers to/from their ENUM name
174 >>> n = dns.e164.from_e164("+1 555 1212")
176 <DNS name 2.1.2.1.5.5.5.1.e164.arpa.>
177 >>> dns.e164.to_e164(n)
180 You can now convert IPv4 and IPv6 address to/from their
181 corresponding DNS reverse map names:
183 >>> import dns.reversename
184 >>> n = dns.reversename.from_address("127.0.0.1")
186 <DNS name 1.0.0.127.in-addr.arpa.>
187 >>> dns.reversename.to_address(n)
190 You can now convert between Unicode strings and their IDN ACE
193 >>> n = dns.name.from_text(u'les-\u00e9l\u00e8ves.example.')
195 <DNS name xn--les-lves-50ai.example.>
197 u'les-\xe9l\xe8ves.example.'
199 The origin parameter to dns.zone.from_text() and dns.zone.to_text()
200 is now optional. If not specified, the origin will be taken from
201 the first $ORIGIN statement in the master file.
203 Sanity checking of a zone can be disabled; this is useful when
204 working with files which are zone fragments.
206 Bugs fixed since 1.3.5:
208 The correct delimiter was not used when retrieving the
209 list of nameservers from the registry in certain versions of
212 The floating-point version of latitude and longitude in LOC RRs
213 (float_latitude and float_longitude) had incorrect signs for
214 south latitudes and west longitudes.
216 BIND 8 TTL syntax is now accepted in all TTL-like places (i.e.
217 SOA fields refresh, retry, expire, and minimum; SIG/RRSIG
220 TTLs are now bounds checked when their text form is parsed,
221 and their values must be in the closed interval [0, 2^31 - 1].
225 In the resolver, if time goes backward a little bit, ignore
228 zone_for_name() has been added to the resolver module. It
229 returns the zone which is authoritative for the specified
230 name, which is handy for dynamic update. E.g.
233 print dns.resolver.zone_for_name('www.dnspython.org')
235 will output "dnspython.org." and
237 print dns.resolver.zone_for_name('a.b.c.d.e.f.example.')
241 The default resolver can be fetched with the
242 get_default_resolver() method.
244 You can now get the parent (immediate superdomain) of a name
245 by using the parent() method.
247 Zone.iterate_rdatasets() and Zone.iterate_rdatas() now have
248 a default rdtype of dns.rdatatype.ANY like the documentation
251 A Dynamic DNS example, ddns.py, has been added.
255 The source address and port may now be specified when calling
256 dns.query.{udp,tcp,xfr}.
258 The resolver now does exponential backoff each time it runs
259 through all of the nameservers.
261 Rcodes which indicate a nameserver is likely to be a
262 "permanent failure" for a query cause the nameserver to be removed
263 from the mix for that query.
267 dns.message.Message.find_rrset() now uses an index, vastly
268 improving the from_wire() performance of large messages such
271 Added dns.message.make_response(), which creates a skeletal
272 response for the specified query.
274 Added opcode() and set_opcode() convenience methods to the
275 dns.message.Message class. Added the request_payload
276 attribute to the Message class.
278 The 'file' parameter of dns.name.Name.to_wire() is now
279 optional; if omitted, the wire form will be returned as the
280 value of the function.
282 dns.zone.from_xfr() in relativization mode incorrectly set
283 zone.origin to the empty name.
285 The masterfile parser incorrectly rejected TXT records where a
286 value was not quoted.
290 The NSEC format doesn't allow specifying types by number, so
291 we shouldn't either. (Using the unknown type format is still
294 The resolver wasn't catching dns.exception.Timeout, so a timeout
295 erroneously caused the whole resolution to fail instead of just
296 going on to the next server.
298 The renderer module didn't import random, causing an exception
299 to be raised if a query id wasn't provided when a Renderer was
302 The conversion of LOC milliseconds values from text to binary was
303 incorrect if the length of the milliseconds string was not 3.
307 Added support for the SSHFP type.
311 Added support for new DNSSEC types RRSIG, NSEC, and DNSKEY.
313 This release fixes all known bugs.
315 See the ChangeLog file for more detailed information on changes since
326 To build and install dnspython, type
328 python setup.py install
333 For the latest in releases, documentation, and information, visit the
334 dnspython home page at
336 http://www.dnspython.org/
342 Documentation is sparse at the moment. Use pydoc, or read the HTML
343 documentation at the dnspython home page, or download the HTML
349 Bug reports may be sent to bugs@dnspython.org
354 A number of mailing lists are available. Visit the dnspython home
355 page to subscribe or unsubscribe.