diff options
Diffstat (limited to 'ipalib')
-rw-r--r-- | ipalib/frontend.py | 6 | ||||
-rw-r--r-- | ipalib/plugins/dns.py | 30 |
2 files changed, 35 insertions, 1 deletions
diff --git a/ipalib/frontend.py b/ipalib/frontend.py index 8ac04662f..35343105c 100644 --- a/ipalib/frontend.py +++ b/ipalib/frontend.py @@ -408,7 +408,11 @@ class Command(HasParam): self.debug( 'raw: %s(%s)', self.name, ', '.join(self._repr_iter(**params)) ) - params.update(self.get_default(**params)) + while True: + default = self.get_default(**params) + if len(default) == 0: + break + params.update(default) params = self.normalize(**params) params = self.convert(**params) self.debug( diff --git a/ipalib/plugins/dns.py b/ipalib/plugins/dns.py index 2928a9000..23abdd94d 100644 --- a/ipalib/plugins/dns.py +++ b/ipalib/plugins/dns.py @@ -28,6 +28,10 @@ EXAMPLES: ipa dnszone-add example.com --name-server nameserver.example.com --admin-email admin@example.com + Add new reverse zone specified by network IP address: + ipa dnszone-add --name-from-ip 80.142.15.0/24 + --name-server nameserver.example.com + Add second nameserver for example.com: ipa dnsrecord-add example.com @ --ns-rec nameserver2.example.com @@ -141,6 +145,16 @@ def _create_zone_serial(**kwargs): """Generate serial number for zones.""" return int('%s01' % time.strftime('%Y%d%m')) +def _reverse_zone_name(netstr): + net = netaddr.IPNetwork(netstr) + items = net.ip.reverse_dns.split('.') + if net.version == 4: + return u'.'.join(items[4 - net.prefixlen / 8:]) + elif net.version == 6: + return u'.'.join(items[32 - net.prefixlen / 4:]) + else: + return None + def _validate_ipaddr(ugettext, ipaddr): try: ip = netaddr.IPAddress(ipaddr) @@ -293,9 +307,14 @@ class dnszone(LDAPObject): cli_name='name', label=_('Zone name'), doc=_('Zone name (FQDN)'), + default_from=lambda name_from_ip: _reverse_zone_name(name_from_ip), normalizer=lambda value: value.lower(), primary_key=True, ), + Str('name_from_ip?', _validate_ipnet, + label=_('Reverse zone IP network'), + doc=_('IP network to create reverse zone name from'), + ), Str('idnssoamname', cli_name='name_server', label=_('Authoritative nameserver'), @@ -401,6 +420,9 @@ class dnszone_add(LDAPCreate): if not dns_container_exists(self.api.Backend.ldap2): raise errors.NotFound(reason=_('DNS is not configured')) + if 'name_from_ip' in entry_attrs: + del entry_attrs['name_from_ip'] + entry_attrs['idnszoneactive'] = 'TRUE' entry_attrs['idnsallowdynupdate'] = str( entry_attrs.get('idnsallowdynupdate', False) @@ -445,6 +467,8 @@ class dnszone_mod(LDAPUpdate): Modify DNS zone (SOA record). """ def pre_callback(self, ldap, dn, entry_attrs, *keys, **options): + if 'name_from_ip' in entry_attrs: + del entry_attrs['name_from_ip'] entry_attrs['idnsallowdynupdate'] = str( entry_attrs.get('idnsallowdynupdate', False) ).upper() @@ -457,6 +481,12 @@ class dnszone_find(LDAPSearch): """ Search for DNS zones (SOA records). """ + def args_options_2_entry(self, *args, **options): + if 'name_from_ip' in options: + if 'idnsname' not in options: + options['idnsname'] = self.obj.params['idnsname'].get_default(**options) + del options['name_from_ip'] + return super(dnszone_find, self).args_options_2_entry(self, *args, **options) takes_options = LDAPSearch.takes_options + ( Flag('forward_only', |