diff options
Diffstat (limited to 'ipalib')
-rw-r--r-- | ipalib/plugins/dns.py | 11 | ||||
-rw-r--r-- | ipalib/util.py | 18 |
2 files changed, 28 insertions, 1 deletions
diff --git a/ipalib/plugins/dns.py b/ipalib/plugins/dns.py index 562f23a0..5484119d 100644 --- a/ipalib/plugins/dns.py +++ b/ipalib/plugins/dns.py @@ -33,7 +33,8 @@ from ipalib.plugins.baseldap import * from ipalib import _, ngettext from ipalib.util import (validate_zonemgr, normalize_zonemgr, validate_hostname, validate_dns_label, validate_domain_name, - get_dns_forward_zone_update_policy, get_dns_reverse_zone_update_policy) + get_dns_forward_zone_update_policy, get_dns_reverse_zone_update_policy, + get_reverse_zone_default) from ipapython.ipautil import valid_ip, CheckedIPAddress, is_host_resolvable __doc__ = _(""" @@ -254,6 +255,14 @@ def _create_zone_serial(): return int(time.time()) def _reverse_zone_name(netstr): + try: + netaddr.IPAddress(netstr) + except (netaddr.AddrFormatError, ValueError): + pass + else: + # use more sensible default prefix than netaddr default + return unicode(get_reverse_zone_default(netstr)) + net = netaddr.IPNetwork(netstr) items = net.ip.reverse_dns.split('.') if net.version == 4: diff --git a/ipalib/util.py b/ipalib/util.py index 1d590092..df8791ba 100644 --- a/ipalib/util.py +++ b/ipalib/util.py @@ -27,6 +27,7 @@ import time import socket import re import decimal +import netaddr from types import NoneType from weakref import WeakKeyDictionary from dns import resolver, rdatatype @@ -172,6 +173,12 @@ def normalize_zonemgr(zonemgr): return zonemgr +def normalize_zone(zone): + if zone[-1] != '.': + return zone + '.' + else: + return zone + def validate_dns_label(dns_label, allow_underscore=False): label_chars = r'a-z0-9' underscore_err_msg = '' @@ -487,6 +494,17 @@ def get_dns_reverse_zone_update_policy(realm, reverse_zone, rrtypes=('PTR',)): return policy +def get_reverse_zone_default(ip_address): + ip = netaddr.IPAddress(ip_address) + items = ip.reverse_dns.split('.') + + if ip.version == 4: + items = items[1:] # /24 for IPv4 + elif ip.version == 6: + items = items[16:] # /64 for IPv6 + + return normalize_zone('.'.join(items)) + def validate_rdn_param(ugettext, value): try: rdn = RDN(value) |