Kaydet (Commit) ebdaaf40 authored tarafından Eric V. Smith's avatar Eric V. Smith

Issue #20480: Add ipaddress.reverse_pointer. Patch by Leon Weber.

üst 6b230880
...@@ -146,6 +146,20 @@ write code that handles both IP versions correctly. ...@@ -146,6 +146,20 @@ write code that handles both IP versions correctly.
the appropriate length (most significant octet first). This is 4 bytes the appropriate length (most significant octet first). This is 4 bytes
for IPv4 and 16 bytes for IPv6. 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 .. attribute:: is_multicast
``True`` if the address is reserved for multicast use. See ``True`` if the address is reserved for multicast use. See
...@@ -226,6 +240,7 @@ write code that handles both IP versions correctly. ...@@ -226,6 +240,7 @@ write code that handles both IP versions correctly.
:class:`IPv4Address` class: :class:`IPv4Address` class:
.. attribute:: packed .. attribute:: packed
.. attribute:: reverse_pointer
.. attribute:: version .. attribute:: version
.. attribute:: max_prefixlen .. attribute:: max_prefixlen
.. attribute:: is_multicast .. attribute:: is_multicast
......
...@@ -435,6 +435,17 @@ class _IPAddressBase(_TotalOrderingMixin): ...@@ -435,6 +435,17 @@ class _IPAddressBase(_TotalOrderingMixin):
"""Return the shorthand version of the IP address as a string.""" """Return the shorthand version of the IP address as a string."""
return str(self) 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 @property
def version(self): def version(self):
msg = '%200s has no version specified' % (type(self),) msg = '%200s has no version specified' % (type(self),)
...@@ -1221,6 +1232,15 @@ class _BaseV4: ...@@ -1221,6 +1232,15 @@ class _BaseV4:
return True return True
return False 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 @property
def max_prefixlen(self): def max_prefixlen(self):
return self._max_prefixlen return self._max_prefixlen
...@@ -1784,6 +1804,15 @@ class _BaseV6: ...@@ -1784,6 +1804,15 @@ class _BaseV6:
return '%s/%d' % (':'.join(parts), self._prefixlen) return '%s/%d' % (':'.join(parts), self._prefixlen)
return ':'.join(parts) 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 @property
def max_prefixlen(self): def max_prefixlen(self):
return self._max_prefixlen return self._max_prefixlen
......
...@@ -1593,6 +1593,14 @@ class IpaddrUnitTest(unittest.TestCase): ...@@ -1593,6 +1593,14 @@ class IpaddrUnitTest(unittest.TestCase):
addr3.exploded) addr3.exploded)
self.assertEqual('192.168.178.1', addr4.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): def testIntRepresentation(self):
self.assertEqual(16909060, int(self.ipv4_address)) self.assertEqual(16909060, int(self.ipv4_address))
self.assertEqual(42540616829182469433547762482097946625, self.assertEqual(42540616829182469433547762482097946625,
......
...@@ -1392,6 +1392,7 @@ Bob Watson ...@@ -1392,6 +1392,7 @@ Bob Watson
David Watson David Watson
Aaron Watters Aaron Watters
Henrik Weber Henrik Weber
Leon Weber
Corran Webster Corran Webster
Glyn Webster Glyn Webster
Phil Webster Phil Webster
......
...@@ -37,6 +37,8 @@ Core and Builtins ...@@ -37,6 +37,8 @@ Core and Builtins
- Issue #12546: Allow \x00 to be used as a fill character when using str, int, - Issue #12546: Allow \x00 to be used as a fill character when using str, int,
float, and complex __format__ methods. float, and complex __format__ methods.
- Issue #20480: Add ipaddress.reverse_pointer. Patch by Leon Weber.
Library Library
------- -------
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment