changeset: 90270:5992d2c9522c parent: 90268:ab7f57e92629 user: Eric V. Smith date: Mon Apr 14 12:58:07 2014 -0400 files: Doc/library/ipaddress.rst Lib/ipaddress.py Lib/test/test_ipaddress.py Misc/ACKS Misc/NEWS description: Issue #20480: Add ipaddress.reverse_pointer. Patch by Leon Weber. diff -r ab7f57e92629 -r 5992d2c9522c Doc/library/ipaddress.rst --- a/Doc/library/ipaddress.rst Mon Apr 14 12:16:18 2014 -0400 +++ b/Doc/library/ipaddress.rst Mon Apr 14 12:58:07 2014 -0400 @@ -146,6 +146,20 @@ the appropriate length (most significant octet first). This is 4 bytes for IPv4 and 16 bytes for IPv6. + .. attribute:: reverse_pointer + + The name of the reverse DNS PTR record for the IP address, e.g.:: + + >>> ipaddress.ip_address("127.0.0.1").reverse_pointer + '1.0.0.127.in-addr.arpa' + >>> ipaddress.ip_address("2001:db8::1").reverse_pointer + '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa' + + This is the name that could be used for performing a PTR lookup, not the + resolved hostname itself. + + .. versionadded:: 3.5 + .. attribute:: is_multicast ``True`` if the address is reserved for multicast use. See @@ -226,6 +240,7 @@ :class:`IPv4Address` class: .. attribute:: packed + .. attribute:: reverse_pointer .. attribute:: version .. attribute:: max_prefixlen .. attribute:: is_multicast diff -r ab7f57e92629 -r 5992d2c9522c Lib/ipaddress.py --- a/Lib/ipaddress.py Mon Apr 14 12:16:18 2014 -0400 +++ b/Lib/ipaddress.py Mon Apr 14 12:58:07 2014 -0400 @@ -436,6 +436,17 @@ return str(self) @property + def reverse_pointer(self): + """The name of the reverse DNS pointer for the IP address, e.g.: + >>> ipaddress.ip_address("127.0.0.1").reverse_pointer + '1.0.0.127.in-addr.arpa' + >>> ipaddress.ip_address("2001:db8::1").reverse_pointer + '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa' + + """ + return self._reverse_pointer() + + @property def version(self): msg = '%200s has no version specified' % (type(self),) raise NotImplementedError(msg) @@ -1221,6 +1232,15 @@ return True return False + def _reverse_pointer(self): + """Return the reverse DNS pointer name for the IPv4 address. + + This implements the method described in RFC1035 3.5. + + """ + reverse_octets = str(self).split('.')[::-1] + return '.'.join(reverse_octets) + '.in-addr.arpa' + @property def max_prefixlen(self): return self._max_prefixlen @@ -1784,6 +1804,15 @@ return '%s/%d' % (':'.join(parts), self._prefixlen) return ':'.join(parts) + def _reverse_pointer(self): + """Return the reverse DNS pointer name for the IPv6 address. + + This implements the method described in RFC3596 2.5. + + """ + reverse_chars = self.exploded[::-1].replace(':', '') + return '.'.join(reverse_chars) + '.ip6.arpa' + @property def max_prefixlen(self): return self._max_prefixlen diff -r ab7f57e92629 -r 5992d2c9522c Lib/test/test_ipaddress.py --- a/Lib/test/test_ipaddress.py Mon Apr 14 12:16:18 2014 -0400 +++ b/Lib/test/test_ipaddress.py Mon Apr 14 12:58:07 2014 -0400 @@ -1593,6 +1593,14 @@ addr3.exploded) self.assertEqual('192.168.178.1', addr4.exploded) + def testReversePointer(self): + addr1 = ipaddress.IPv4Address('127.0.0.1') + addr2 = ipaddress.IPv6Address('2001:db8::1') + self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer) + self.assertEqual('1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.' + + 'b.d.0.1.0.0.2.ip6.arpa', + addr2.reverse_pointer) + def testIntRepresentation(self): self.assertEqual(16909060, int(self.ipv4_address)) self.assertEqual(42540616829182469433547762482097946625, diff -r ab7f57e92629 -r 5992d2c9522c Misc/ACKS --- a/Misc/ACKS Mon Apr 14 12:16:18 2014 -0400 +++ b/Misc/ACKS Mon Apr 14 12:58:07 2014 -0400 @@ -1392,6 +1392,7 @@ David Watson Aaron Watters Henrik Weber +Leon Weber Corran Webster Glyn Webster Phil Webster diff -r ab7f57e92629 -r 5992d2c9522c Misc/NEWS --- a/Misc/NEWS Mon Apr 14 12:16:18 2014 -0400 +++ b/Misc/NEWS Mon Apr 14 12:58:07 2014 -0400 @@ -37,6 +37,8 @@ - Issue #12546: Allow \x00 to be used as a fill character when using str, int, float, and complex __format__ methods. +- Issue #20480: Add ipaddress.reverse_pointer. Patch by Leon Weber. + Library -------