]> granicus.if.org Git - python/commitdiff
Issue #20480: Add ipaddress.reverse_pointer. Patch by Leon Weber.
authorEric V. Smith <eric@trueblade.com>
Mon, 14 Apr 2014 16:58:07 +0000 (12:58 -0400)
committerEric V. Smith <eric@trueblade.com>
Mon, 14 Apr 2014 16:58:07 +0000 (12:58 -0400)
Doc/library/ipaddress.rst
Lib/ipaddress.py
Lib/test/test_ipaddress.py
Misc/ACKS
Misc/NEWS

index 9625e71b0422bcf114ece03a0157f1e6db6550b3..0bc27ff276f2760e496f34cfbfa0db6fc49b307a 100644 (file)
@@ -146,6 +146,20 @@ write code that handles both IP versions correctly.
       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 @@ write code that handles both IP versions correctly.
    :class:`IPv4Address` class:
 
    .. attribute:: packed
+   .. attribute:: reverse_pointer
    .. attribute:: version
    .. attribute:: max_prefixlen
    .. attribute:: is_multicast
index 54df39ae5622019bd14504731f3c866f3d27ed24..1e451f887372908a931d0fbb674997d8db0fa95c 100644 (file)
@@ -435,6 +435,17 @@ class _IPAddressBase(_TotalOrderingMixin):
         """Return the shorthand version of the IP address as a string."""
         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),)
@@ -1221,6 +1232,15 @@ class _BaseV4:
             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 @@ class _BaseV6:
             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
index f2947b9c8abd2f6600ab5dc5c11a2151a98c0cd6..33adb3b35a3ff17e3cc17108a09aa5cca41a8a62 100644 (file)
@@ -1593,6 +1593,14 @@ class IpaddrUnitTest(unittest.TestCase):
                          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,
index 463d752037ac57607b5aa22b68c59409a501e6db..d3866fd6a2705719a938c1422cab5bd409ab6869 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1392,6 +1392,7 @@ Bob Watson
 David Watson
 Aaron Watters
 Henrik Weber
+Leon Weber
 Corran Webster
 Glyn Webster
 Phil Webster
index 01ad416f77386a945e21329af236dc2115eed313..d23f24bc3477399e127031636eff2a648be41e23 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -37,6 +37,8 @@ Core and Builtins
 - 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
 -------