Add an address for a nameserver when a new zone is created during install

https://fedorahosted.org/freeipa/ticket/881
This commit is contained in:
Jakub Hrozek
2011-01-31 18:05:07 +01:00
committed by Rob Crittenden
parent a7e89190fa
commit 0dce1bc9e1
4 changed files with 28 additions and 14 deletions

View File

@@ -486,13 +486,14 @@ output: Output('summary', (<type 'unicode'>, <type 'NoneType'>), 'User-friendly
output: Output('result', <type 'bool'>, 'True means the operation was successful') output: Output('result', <type 'bool'>, 'True means the operation was successful')
output: Output('value', <type 'unicode'>, "The primary_key value of the entry, e.g. 'jdoe' for a user") output: Output('value', <type 'unicode'>, "The primary_key value of the entry, e.g. 'jdoe' for a user")
command: dnsrecord_add command: dnsrecord_add
args: 2,45,3 args: 2,46,3
arg: Str('dnszoneidnsname', cli_name='dnszone', label=Gettext('Zone name', domain='ipa', localedir=None), query=True, required=True) arg: Str('dnszoneidnsname', cli_name='dnszone', label=Gettext('Zone name', domain='ipa', localedir=None), query=True, required=True)
arg: Str('idnsname', attribute=True, cli_name='name', label=Gettext('Record name', domain='ipa', localedir=None), multivalue=False, primary_key=True, required=True) arg: Str('idnsname', attribute=True, cli_name='name', label=Gettext('Record name', domain='ipa', localedir=None), multivalue=False, primary_key=True, required=True)
option: Int('dnsttl', attribute=True, cli_name='ttl', label=Gettext('Time to live', domain='ipa', localedir=None), multivalue=False, required=False) option: Int('dnsttl', attribute=True, cli_name='ttl', label=Gettext('Time to live', domain='ipa', localedir=None), multivalue=False, required=False)
option: StrEnum('dnsclass', attribute=True, cli_name='class', label=Gettext('Class', domain='ipa', localedir=None), multivalue=False, required=False, values=(u'IN', u'CS', u'CH', u'HS')) option: StrEnum('dnsclass', attribute=True, cli_name='class', label=Gettext('Class', domain='ipa', localedir=None), multivalue=False, required=False, values=(u'IN', u'CS', u'CH', u'HS'))
option: Str('addattr*', validate_add_attribute, cli_name='addattr', exclude='webui') option: Str('addattr*', validate_add_attribute, cli_name='addattr', exclude='webui')
option: Str('setattr*', validate_set_attribute, cli_name='setattr', exclude='webui') option: Str('setattr*', validate_set_attribute, cli_name='setattr', exclude='webui')
option: Flag('force', autofill=True, default=False, flags=['no_option', 'no_output'])
option: Flag('all', autofill=True, cli_name='all', default=False, exclude='webui', flags=['no_output']) option: Flag('all', autofill=True, cli_name='all', default=False, exclude='webui', flags=['no_output'])
option: Flag('raw', autofill=True, cli_name='raw', default=False, exclude='webui', flags=['no_output']) option: Flag('raw', autofill=True, cli_name='raw', default=False, exclude='webui', flags=['no_output'])
option: Str('version?', exclude='webui', flags=['no_option', 'no_output']) option: Str('version?', exclude='webui', flags=['no_option', 'no_output'])
@@ -723,7 +724,7 @@ option: Str('idnsupdatepolicy', attribute=True, cli_name='update_policy', label=
option: Flag('idnsallowdynupdate', attribute=True, autofill=True, cli_name='allow_dynupdate', default=False, label=Gettext('Dynamic update', domain='ipa', localedir=None), multivalue=False, required=True) option: Flag('idnsallowdynupdate', attribute=True, autofill=True, cli_name='allow_dynupdate', default=False, label=Gettext('Dynamic update', domain='ipa', localedir=None), multivalue=False, required=True)
option: Str('addattr*', validate_add_attribute, cli_name='addattr', exclude='webui') option: Str('addattr*', validate_add_attribute, cli_name='addattr', exclude='webui')
option: Str('setattr*', validate_set_attribute, cli_name='setattr', exclude='webui') option: Str('setattr*', validate_set_attribute, cli_name='setattr', exclude='webui')
option: Flag('force', autofill=True, default=False,lag('force', autofill=True, default=False, doc=Gettext('force DNS zone even if name server not in DNS', domain='ipa', localedir=None)) option: Flag('force', autofill=True, default=False,lag('force', autofill=True, default=False, doc=Gettext('force DNS zone creation even if name server not in DNS', domain='ipa', localedir=None))
option: Str('ip_address?', _validate_ipaddr,tr('ip_address?', _validate_ipaddr, doc=Gettext('Add the nameserver to DNS with this IP address', domain='ipa', localedir=None)) option: Str('ip_address?', _validate_ipaddr,tr('ip_address?', _validate_ipaddr, doc=Gettext('Add the nameserver to DNS with this IP address', domain='ipa', localedir=None))
option: Flag('all', autofill=True, cli_name='all', default=False, exclude='webui', flags=['no_output']) option: Flag('all', autofill=True, cli_name='all', default=False, exclude='webui', flags=['no_output'])
option: Flag('raw', autofill=True, cli_name='raw', default=False, exclude='webui', flags=['no_output']) option: Flag('raw', autofill=True, cli_name='raw', default=False, exclude='webui', flags=['no_output'])

View File

@@ -28,7 +28,7 @@ from optparse import OptionParser
from ipapython import ipautil from ipapython import ipautil
from ipaserver.install import bindinstance, dsinstance, installutils, certs from ipaserver.install import bindinstance, dsinstance, installutils, certs
from ipaserver.install.bindinstance import add_zone, add_reverze_zone, add_rr, add_ptr_rr from ipaserver.install.bindinstance import add_zone, add_reverse_zone, add_rr, add_ptr_rr
from ipaserver.install.replication import check_replication_plugin from ipaserver.install.replication import check_replication_plugin
from ipaserver.plugins.ldap2 import ldap2 from ipaserver.plugins.ldap2 import ldap2
from ipapython import version from ipapython import version
@@ -417,9 +417,9 @@ def main():
name = domain.pop(0) name = domain.pop(0)
domain = ".".join(domain) domain = ".".join(domain)
zone = add_zone(domain) zone = add_zone(domain, nsaddr=options.ip_address)
add_rr(zone, name, "A", options.ip_address) add_rr(zone, name, "A", options.ip_address)
add_reverze_zone(options.ip_address) add_reverse_zone(options.ip_address)
add_ptr_rr(options.ip_address, replica_fqdn) add_ptr_rr(options.ip_address, replica_fqdn)
try: try:

View File

@@ -286,7 +286,7 @@ class dnszone_add(LDAPCreate):
""" """
takes_options = LDAPCreate.takes_options + ( takes_options = LDAPCreate.takes_options + (
Flag('force', Flag('force',
doc=_('force DNS zone even if name server not in DNS'), doc=_('force DNS zone creation even if name server not in DNS'),
), ),
Str('ip_address?', _validate_ipaddr, Str('ip_address?', _validate_ipaddr,
doc=_('Add the nameserver to DNS with this IP address'), doc=_('Add the nameserver to DNS with this IP address'),
@@ -577,6 +577,12 @@ class dnsrecord_add(LDAPCreate, dnsrecord_cmd_w_record_options):
Add new DNS resource record. Add new DNS resource record.
""" """
no_option_msg = 'No options to add a specific record provided.' no_option_msg = 'No options to add a specific record provided.'
takes_options = LDAPCreate.takes_options + (
Flag('force',
flags=['no_option', 'no_output'],
doc=_('force NS record creation even if its hostname is not in DNS'),
),
)
def get_options(self): def get_options(self):
for option in super(dnsrecord_add, self).get_options(): for option in super(dnsrecord_add, self).get_options():
@@ -589,6 +595,9 @@ class dnsrecord_add(LDAPCreate, dnsrecord_cmd_w_record_options):
return super(dnsrecord_add, self).args_options_2_entry(*keys, **options) return super(dnsrecord_add, self).args_options_2_entry(*keys, **options)
def _nsrecord_pre_callback(self, ldap, dn, entry_attrs, *keys, **options): def _nsrecord_pre_callback(self, ldap, dn, entry_attrs, *keys, **options):
if options.get('force', False):
return dn
for ns in options['nsrecord']: for ns in options['nsrecord']:
is_ns_rec_resolvable(ns) is_ns_rec_resolvable(ns)
return dn return dn

View File

@@ -116,7 +116,7 @@ def dns_zone_exists(name):
else: else:
return True return True
def add_zone(name, update_policy=None, zonemgr=None, dns_backup=None): def add_zone(name, zonemgr=None, dns_backup=None, nsaddr=None, update_policy=None):
if not update_policy: if not update_policy:
update_policy = "grant %s krb5-self * A;" % api.env.realm update_policy = "grant %s krb5-self * A;" % api.env.realm
@@ -124,16 +124,16 @@ def add_zone(name, update_policy=None, zonemgr=None, dns_backup=None):
api.Command.dnszone_add(unicode(name), api.Command.dnszone_add(unicode(name),
idnssoamname=unicode(api.env.host+"."), idnssoamname=unicode(api.env.host+"."),
idnssoarname=unicode(zonemgr), idnssoarname=unicode(zonemgr),
ip_address=unicode(nsaddr),
idnsallowdynupdate=True, idnsallowdynupdate=True,
idnsupdatepolicy=unicode(update_policy)) idnsupdatepolicy=unicode(update_policy))
except (errors.DuplicateEntry, errors.EmptyModlist): except (errors.DuplicateEntry, errors.EmptyModlist):
pass pass
add_rr(name, "@", "NS", api.env.host+".", dns_backup) add_rr(name, "@", "NS", api.env.host+'.', dns_backup, force=True)
return name return name
def add_reverze_zone(ip_address, update_policy=None, dns_backup=None): def add_reverse_zone(ip_address, update_policy=None, dns_backup=None):
zone, name = get_reverse_zone(ip_address) zone, name = get_reverse_zone(ip_address)
if not update_policy: if not update_policy:
update_policy = "grant %s krb5-subdomain %s. PTR;" % (api.env.realm, zone) update_policy = "grant %s krb5-subdomain %s. PTR;" % (api.env.realm, zone)
@@ -141,16 +141,18 @@ def add_reverze_zone(ip_address, update_policy=None, dns_backup=None):
api.Command.dnszone_add(unicode(zone), api.Command.dnszone_add(unicode(zone),
idnssoamname=unicode(api.env.host+"."), idnssoamname=unicode(api.env.host+"."),
idnsallowdynupdate=True, idnsallowdynupdate=True,
ip_address=unicode(ip_address),
idnsupdatepolicy=unicode(update_policy)) idnsupdatepolicy=unicode(update_policy))
except (errors.DuplicateEntry, errors.EmptyModlist): except (errors.DuplicateEntry, errors.EmptyModlist):
pass pass
add_rr(zone, "@", "NS", api.env.host+".", dns_backup) add_rr(zone, "@", "NS", api.env.host+".", dns_backup, force=True)
return zone return zone
def add_rr(zone, name, type, rdata, dns_backup=None): def add_rr(zone, name, type, rdata, dns_backup=None, **kwargs):
addkw = { '%srecord' % unicode(type.lower()) : unicode(rdata) } addkw = { '%srecord' % unicode(type.lower()) : unicode(rdata) }
addkw.update(kwargs)
try: try:
api.Command.dnsrecord_add(unicode(zone), unicode(name), **addkw) api.Command.dnsrecord_add(unicode(zone), unicode(name), **addkw)
except (errors.DuplicateEntry, errors.EmptyModlist): except (errors.DuplicateEntry, errors.EmptyModlist):
@@ -348,7 +350,9 @@ class BindInstance(service.Service):
self._ldap_mod("dns.ldif", self.sub_dict) self._ldap_mod("dns.ldif", self.sub_dict)
def __setup_zone(self): def __setup_zone(self):
zone = add_zone(self.domain, zonemgr=self.zonemgr, dns_backup=self.dns_backup) zone = add_zone(self.domain, self.zonemgr,
self.dns_backup, self.ip_address)
def __add_self(self): def __add_self(self):
zone = self.domain zone = self.domain
@@ -376,7 +380,7 @@ class BindInstance(service.Service):
add_ptr_rr(self.ip_address, self.fqdn) add_ptr_rr(self.ip_address, self.fqdn)
def __setup_reverse_zone(self): def __setup_reverse_zone(self):
add_reverze_zone(self.ip_address, dns_backup=self.dns_backup) add_reverse_zone(self.ip_address, dns_backup=self.dns_backup)
def __setup_principal(self): def __setup_principal(self):
dns_principal = "DNS/" + self.fqdn + "@" + self.realm dns_principal = "DNS/" + self.fqdn + "@" + self.realm