summaryrefslogtreecommitdiffstats
path: root/ipalib
diff options
context:
space:
mode:
Diffstat (limited to 'ipalib')
-rw-r--r--ipalib/plugins/dns.py11
-rw-r--r--ipalib/util.py18
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)