From 5bc7e5a9c790c80f73b82f8ef175799b3c84eaaa Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Fri, 21 Jan 2011 14:32:55 -0500 Subject: Populate shared tree with replica related values Fixes: https://fedorahosted.org/freeipa/ticket/820 --- install/tools/ipa-replica-install | 1 + ipaserver/install/dsinstance.py | 22 ++++++++++++++++++++++ ipaserver/install/replication.py | 29 +++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/install/tools/ipa-replica-install b/install/tools/ipa-replica-install index 3c912a75..69c0e7ea 100755 --- a/install/tools/ipa-replica-install +++ b/install/tools/ipa-replica-install @@ -445,6 +445,7 @@ def main(): print "ipa-client-install returned: " + str(e) raise RuntimeError("Failed to configure the client") + ds.replica_populate() ds.init_memberof() try: diff --git a/ipaserver/install/dsinstance.py b/ipaserver/install/dsinstance.py index 9a121ea6..7bf29ce9 100644 --- a/ipaserver/install/dsinstance.py +++ b/ipaserver/install/dsinstance.py @@ -737,3 +737,25 @@ class DsInstance(service.Service): def __root_autobind(self): self._ldap_mod("root-autobind.ldif") + def replica_populate(self): + self.ldap_connect() + + dn = "cn=default,ou=profile,%s" % self.suffix + try: + ret = self.admin_conn.search_s(dn, ldap.SCOPE_BASE, + '(objectclass=*)')[0] + srvlist = ret.data.get('defaultServerList') + if len(srvlist) > 0: + srvlist = srvlist[0].split() + if not self.fqdn in srvlist: + srvlist.append(self.fqdn) + attr = ' '.join(srvlist) + mod = [(ldap.MOD_REPLACE, 'defaultServerList', attr)] + self.admin_conn.modify_s(dn, mod) + except ldap.NO_SUCH_OBJECT: + pass + except ldap.TYPE_OR_VALUE_EXISTS: + pass + + self.ldap_disconnect() + diff --git a/ipaserver/install/replication.py b/ipaserver/install/replication.py index 21e6bcc4..3c2f3c18 100644 --- a/ipaserver/install/replication.py +++ b/ipaserver/install/replication.py @@ -730,6 +730,11 @@ class ReplicationManager: return IPA_REPLICA def replica_cleanup(self, replica, realm, force=False): + """ + This function removes information about the replica in parts + of the shared tree that expose it, so clients stop trying to + use this replica. + """ err = None @@ -789,6 +794,30 @@ class ReplicationManager: pass except errors.NotFound: pass + except Exception, e: + if not force: + raise e + elif not err: + err = e + + try: + dn = 'cn=default,ou=profile,%s' % self.suffix + ret = self.conn.search_s(dn, ldap.SCOPE_BASE, + '(objectclass=*)')[0] + srvlist = ret.data.get('defaultServerList') + if len(srvlist) > 0: + srvlist = srvlist[0].split() + if replica in srvlist: + srvlist.remove(replica) + attr = ' '.join(srvlist) + mod = [(ldap.MOD_REPLACE, 'defaultServerList', attr)] + self.conn.modify_s(dn, mod) + except ldap.NO_SUCH_OBJECT: + pass + except ldap.NO_SUCH_ATTRIBUTE: + pass + except ldap.TYPE_OR_VALUE_EXISTS: + pass except Exception, e: if force and err: raise err -- cgit