mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
Delete old SRV records during uninstallation
This commit is contained in:
committed by
Rob Crittenden
parent
1340875165
commit
1a9d49730d
@@ -87,7 +87,7 @@ def get_reverse_zone(ip_address):
|
|||||||
|
|
||||||
return zone, name
|
return zone, name
|
||||||
|
|
||||||
def add_zone(name, update_policy=None):
|
def add_zone(name, update_policy=None, dns_backup=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
|
||||||
|
|
||||||
@@ -99,11 +99,11 @@ def add_zone(name, update_policy=None):
|
|||||||
except (errors.DuplicateEntry, errors.EmptyModlist):
|
except (errors.DuplicateEntry, errors.EmptyModlist):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
add_rr(name, "@", "NS", api.env.host+".")
|
add_rr(name, "@", "NS", api.env.host+".", dns_backup)
|
||||||
|
|
||||||
return name
|
return name
|
||||||
|
|
||||||
def add_reverze_zone(ip_address, update_policy=None):
|
def add_reverze_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)
|
||||||
@@ -115,24 +115,75 @@ def add_reverze_zone(ip_address, update_policy=None):
|
|||||||
except (errors.DuplicateEntry, errors.EmptyModlist):
|
except (errors.DuplicateEntry, errors.EmptyModlist):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
add_rr(zone, "@", "NS", api.env.host)
|
add_rr(zone, "@", "NS", api.env.host, dns_backup)
|
||||||
|
|
||||||
return zone
|
return zone
|
||||||
|
|
||||||
def add_rr(zone, name, type, rdata):
|
def add_rr(zone, name, type, rdata, dns_backup=None):
|
||||||
try:
|
try:
|
||||||
api.Command.dns_add_rr(unicode(zone), unicode(name),
|
api.Command.dns_add_rr(unicode(zone), unicode(name),
|
||||||
unicode(type), unicode(rdata))
|
unicode(type), unicode(rdata))
|
||||||
except (errors.DuplicateEntry, errors.EmptyModlist):
|
except (errors.DuplicateEntry, errors.EmptyModlist):
|
||||||
pass
|
pass
|
||||||
|
if dns_backup:
|
||||||
|
dns_backup.add(zone, type, name, rdata)
|
||||||
|
|
||||||
def add_ptr_rr(ip_address, fqdn):
|
def add_ptr_rr(ip_address, fqdn, dns_backup=None):
|
||||||
zone, name = get_reverse_zone(ip_address)
|
zone, name = get_reverse_zone(ip_address)
|
||||||
add_rr(zone, name, "PTR", fqdn+".")
|
add_rr(zone, name, "PTR", fqdn+".", dns_backup)
|
||||||
|
|
||||||
|
|
||||||
|
class DnsBackup(object):
|
||||||
|
def __init__(self, service):
|
||||||
|
self.service = service
|
||||||
|
self.zones = {}
|
||||||
|
|
||||||
|
def add(self, zone, record_type, host, rdata):
|
||||||
|
"""
|
||||||
|
Backup a DNS record in the file store so it can later be removed.
|
||||||
|
"""
|
||||||
|
if zone not in self.zones:
|
||||||
|
zone_id = len(self.zones)
|
||||||
|
self.zones[zone] = (zone_id, 0)
|
||||||
|
self.service.backup_state("dns_zone_%s" % zone_id, zone)
|
||||||
|
|
||||||
|
(zone_id, record_id) = self.zones[zone]
|
||||||
|
self.service.backup_state("dns_record_%s_%s" % (zone_id, record_id),
|
||||||
|
"%s %s %s" % (record_type, host, rdata))
|
||||||
|
self.zones[zone] = (zone_id, record_id + 1)
|
||||||
|
|
||||||
|
def clear_records(self, have_ldap):
|
||||||
|
"""
|
||||||
|
Remove all records from the file store. If we are connected to
|
||||||
|
ldap, we will also remove them there.
|
||||||
|
"""
|
||||||
|
i = 0
|
||||||
|
while True:
|
||||||
|
zone = self.service.restore_state("dns_zone_%s" % i)
|
||||||
|
if not zone:
|
||||||
|
return
|
||||||
|
|
||||||
|
j = 0
|
||||||
|
while True:
|
||||||
|
dns_record = self.service.restore_state("dns_record_%s_%s" % (i, j))
|
||||||
|
if not dns_record:
|
||||||
|
break
|
||||||
|
if have_ldap:
|
||||||
|
type, host, rdata = dns_record.split(" ", 2)
|
||||||
|
try:
|
||||||
|
api.Command.dns_del_rr(unicode(zone), unicode(host),
|
||||||
|
unicode(type), unicode(rdata))
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
j += 1
|
||||||
|
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
|
||||||
class BindInstance(service.Service):
|
class BindInstance(service.Service):
|
||||||
def __init__(self, fstore=None, dm_password=None):
|
def __init__(self, fstore=None, dm_password=None):
|
||||||
service.Service.__init__(self, "named", dm_password=dm_password)
|
service.Service.__init__(self, "named", dm_password=dm_password)
|
||||||
|
self.dns_backup = DnsBackup(self)
|
||||||
self.named_user = None
|
self.named_user = None
|
||||||
self.fqdn = None
|
self.fqdn = None
|
||||||
self.domain = None
|
self.domain = None
|
||||||
@@ -246,14 +297,18 @@ class BindInstance(service.Service):
|
|||||||
("_kpasswd._udp", "SRV", "0 100 464 %s" % self.host),
|
("_kpasswd._udp", "SRV", "0 100 464 %s" % self.host),
|
||||||
)
|
)
|
||||||
|
|
||||||
zone = add_zone(self.domain)
|
zone = add_zone(self.domain, dns_backup=self.dns_backup)
|
||||||
|
|
||||||
for (host, type, rdata) in resource_records:
|
for (host, type, rdata) in resource_records:
|
||||||
add_rr(zone, host, type, rdata)
|
if type == "SRV":
|
||||||
|
add_rr(zone, host, type, rdata, self.dns_backup)
|
||||||
|
else:
|
||||||
|
add_rr(zone, host, type, rdata)
|
||||||
if self.ntp:
|
if self.ntp:
|
||||||
add_rr(zone, "_ntp._udp", "SRV", "0 100 123 "+self.host)
|
add_rr(zone, "_ntp._udp", "SRV", "0 100 123 %s" % self.host)
|
||||||
|
|
||||||
def __setup_reverse_zone(self):
|
def __setup_reverse_zone(self):
|
||||||
add_reverze_zone(self.ip_address)
|
add_reverze_zone(self.ip_address, dns_backup=self.dns_backup)
|
||||||
add_ptr_rr(self.ip_address, self.fqdn)
|
add_ptr_rr(self.ip_address, self.fqdn)
|
||||||
|
|
||||||
def __setup_principal(self):
|
def __setup_principal(self):
|
||||||
@@ -325,6 +380,8 @@ class BindInstance(service.Service):
|
|||||||
running = self.restore_state("running")
|
running = self.restore_state("running")
|
||||||
enabled = self.restore_state("enabled")
|
enabled = self.restore_state("enabled")
|
||||||
|
|
||||||
|
self.dns_backup.clear_records(api.Backend.ldap2.isconnected())
|
||||||
|
|
||||||
if not running is None:
|
if not running is None:
|
||||||
self.stop()
|
self.stop()
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user