dnspython  1.16.0
About: dnspython is a DNS toolkit (for Python 2.x) that supports almost all record types.
  Fossies Dox: dnspython-1.16.0.tar.gz  ("inofficial" and yet experimental doxygen-generated source code documentation)  

reversename.py
Go to the documentation of this file.
1 # Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
2 
3 # Copyright (C) 2006-2017 Nominum, Inc.
4 #
5 # Permission to use, copy, modify, and distribute this software and its
6 # documentation for any purpose with or without fee is hereby granted,
7 # provided that the above copyright notice and this permission notice
8 # appear in all copies.
9 #
10 # THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
11 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
13 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
16 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 
18 """DNS Reverse Map Names."""
19 
20 import binascii
21 
22 import dns.name
23 import dns.ipv6
24 import dns.ipv4
25 
26 from dns._compat import PY3
27 
28 ipv4_reverse_domain = dns.name.from_text('in-addr.arpa.')
29 ipv6_reverse_domain = dns.name.from_text('ip6.arpa.')
30 
31 
32 def from_address(text):
33  """Convert an IPv4 or IPv6 address in textual form into a Name object whose
34  value is the reverse-map domain name of the address.
35 
36  *text*, a ``text``, is an IPv4 or IPv6 address in textual form
37  (e.g. '127.0.0.1', '::1')
38 
39  Raises ``dns.exception.SyntaxError`` if the address is badly formed.
40 
41  Returns a ``dns.name.Name``.
42  """
43 
44  try:
45  v6 = dns.ipv6.inet_aton(text)
46  if dns.ipv6.is_mapped(v6):
47  if PY3:
48  parts = ['%d' % byte for byte in v6[12:]]
49  else:
50  parts = ['%d' % ord(byte) for byte in v6[12:]]
51  origin = ipv4_reverse_domain
52  else:
53  parts = [x for x in str(binascii.hexlify(v6).decode())]
54  origin = ipv6_reverse_domain
55  except Exception:
56  parts = ['%d' %
57  byte for byte in bytearray(dns.ipv4.inet_aton(text))]
58  origin = ipv4_reverse_domain
59  parts.reverse()
60  return dns.name.from_text('.'.join(parts), origin=origin)
61 
62 
63 def to_address(name):
64  """Convert a reverse map domain name into textual address form.
65 
66  *name*, a ``dns.name.Name``, an IPv4 or IPv6 address in reverse-map name
67  form.
68 
69  Raises ``dns.exception.SyntaxError`` if the name does not have a
70  reverse-map form.
71 
72  Returns a ``text``.
73  """
74 
75  if name.is_subdomain(ipv4_reverse_domain):
76  name = name.relativize(ipv4_reverse_domain)
77  labels = list(name.labels)
78  labels.reverse()
79  text = b'.'.join(labels)
80  # run through inet_aton() to check syntax and make pretty.
82  elif name.is_subdomain(ipv6_reverse_domain):
83  name = name.relativize(ipv6_reverse_domain)
84  labels = list(name.labels)
85  labels.reverse()
86  parts = []
87  i = 0
88  l = len(labels)
89  while i < l:
90  parts.append(b''.join(labels[i:i + 4]))
91  i += 4
92  text = b':'.join(parts)
93  # run through inet_aton() to check syntax and make pretty.
95  else:
96  raise dns.exception.SyntaxError('unknown reverse-map address family')
dns.ipv6.inet_ntoa
def inet_ntoa(address)
Definition: ipv6.py:29
dns.ipv4
Definition: ipv4.py:1
dns.reversename.from_address
def from_address(text)
Definition: reversename.py:32
dns.exception.SyntaxError
Definition: exception.py:113
dns.ipv6.inet_aton
def inet_aton(text)
Definition: ipv6.py:100
dns.name.from_text
def from_text(text, origin=root, idna_codec=None)
Definition: name.py:873
dns.ipv4.inet_ntoa
def inet_ntoa(address)
Definition: ipv4.py:25
dns.ipv4.inet_aton
def inet_aton(text)
Definition: ipv4.py:40
dns.ipv6
Definition: ipv6.py:1
dns.name
Definition: name.py:1
dns._compat
Definition: _compat.py:1
dns.reversename.to_address
def to_address(name)
Definition: reversename.py:63
dns.ipv6.is_mapped
def is_mapped(address)
Definition: ipv6.py:173