summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Kosek <mkosek@redhat.com>2012-03-23 10:29:30 +0100
committerMartin Kosek <mkosek@redhat.com>2012-03-23 16:08:17 +0100
commit11ef6708350c5575a77f0b1298107d3715e96ff8 (patch)
tree11cc260198641fc4b997305c293f4c993fbdb64d
parentd9e8b9a3ed7b26e9cb6bb891cf0d5bb4fcd66dbf (diff)
downloadfreeipa-11ef6708350c5575a77f0b1298107d3715e96ff8.tar.gz
freeipa-11ef6708350c5575a77f0b1298107d3715e96ff8.tar.xz
freeipa-11ef6708350c5575a77f0b1298107d3715e96ff8.zip
Avoid deleting DNS zone when a context is reused
When dnsrecord-del pre_callback detects that the record does not contain any records, it sets a flag to connection context and deletes the record object later. However, when more dnsrecord-del commands share the same context (and this is the case of "ipa-replica-manage del $MASTER" DNS cleanup), it may reuse a positive flag from previous dnsrecord-del command and delete the root DNS zone record and thus effectively delete the zone. This patch makes sure that this flag is always initialized to a sane value in dnsrecord-del pre_callback to make sure that the DNS zone is not deleted. It also fixes pre_callback function definition to prevent adding attrs_list to "keys" parameter and thus confuse developers. https://fedorahosted.org/freeipa/ticket/2503
-rw-r--r--ipalib/plugins/dns.py17
1 files changed, 12 insertions, 5 deletions
diff --git a/ipalib/plugins/dns.py b/ipalib/plugins/dns.py
index eef6ab1de..96548099b 100644
--- a/ipalib/plugins/dns.py
+++ b/ipalib/plugins/dns.py
@@ -2414,7 +2414,7 @@ class dnsrecord_del(LDAPUpdate):
continue
yield option
- def pre_callback(self, ldap, dn, entry_attrs, *keys, **options):
+ def pre_callback(self, ldap, dn, entry_attrs, attrs_list, *keys, **options):
try:
(dn_, old_entry) = ldap.get_entry(
dn, _record_attributes,
@@ -2443,13 +2443,19 @@ class dnsrecord_del(LDAPUpdate):
value=val)
entry_attrs[attr] = list(set(old_entry[attr]))
+ del_all = False
if not self.obj.is_pkey_zone_record(*keys):
- del_all = True
+ record_found = False
for attr in old_entry:
if old_entry[attr]:
- del_all = False
+ record_found = True
break
- setattr(context, 'del_all', del_all)
+ del_all = not record_found
+
+ # set del_all flag in context
+ # when the flag is enabled, the entire DNS record object is deleted
+ # in a post callback
+ setattr(context, 'del_all', del_all)
return dn
@@ -2465,7 +2471,8 @@ class dnsrecord_del(LDAPUpdate):
result = super(dnsrecord_del, self).execute(*keys, **options)
- if getattr(context, 'del_all', False):
+ if getattr(context, 'del_all', False) and not \
+ self.obj.is_pkey_zone_record(*keys):
return self.obj.methods.delentry(*keys)
return result