21de49
From e879ca9b693a10f456f03d3c471afa49321516f9 Mon Sep 17 00:00:00 2001
21de49
From: Florence Blanc-Renaud <flo@redhat.com>
21de49
Date: Thu, 13 Dec 2018 14:54:07 +0100
21de49
Subject: [PATCH] replication: check remote ds version before editing
21de49
 attributes
21de49
21de49
When the remote server has an old DS version, update of the
21de49
replication attributes nsds5ReplicaReleaseTimeout nsds5ReplicaBackoffMax
21de49
and nsDS5ReplicaBindDnGroupCheckInterval fails even if the remote
21de49
schema has been updated.
21de49
21de49
Check first the remote server version and update the attributes only if
21de49
the version is high enough.
21de49
A previous fix was already performing this check (commit 02f4a7a),
21de49
but not in all the cases. This fix also handles when the remote server
21de49
already has a cn=replica entry (for instance because it has already
21de49
established replication with another host).
21de49
21de49
Fixes https://pagure.io/freeipa/issue/7796
21de49
21de49
Reviewed-By: Christian Heimes <cheimes@redhat.com>
21de49
Reviewed-By: Christian Heimes <cheimes@redhat.com>
21de49
---
21de49
 ipaserver/install/replication.py | 33 ++++++++++++++++++++++++++------
21de49
 1 file changed, 27 insertions(+), 6 deletions(-)
21de49
21de49
diff --git a/ipaserver/install/replication.py b/ipaserver/install/replication.py
21de49
index 92a99cd9482f86d6820230479bf94c871669572e..70629b4528f033908c584bfaf0793cfa4ce259d4 100644
21de49
--- a/ipaserver/install/replication.py
21de49
+++ b/ipaserver/install/replication.py
21de49
@@ -215,6 +215,22 @@ def wait_for_entry(connection, dn, timeout, attr=None, attrvalue='*',
21de49
             time.sleep(1)
21de49
 
21de49
 
21de49
+def get_ds_version(conn):
21de49
+    """Returns the DS version
21de49
+
21de49
+    Retrieves the DS version from the vendorVersion attribute stored in LDAP.
21de49
+    :param conn: LDAP connection established and authenticated to the server
21de49
+                 for which we need the version
21de49
+    :return: a tuple containing the DS version
21de49
+    """
21de49
+    # Find which 389-ds is installed
21de49
+    rootdse = conn.get_entry(DN(''), ['vendorVersion'])
21de49
+    version = rootdse.single_value.get('vendorVersion')
21de49
+    mo = re.search(r'(\d+)\.(\d+)\.(\d+)[\.\d]*', version)
21de49
+    vendor_version = tuple(int(v) for v in mo.groups())
21de49
+    return vendor_version
21de49
+
21de49
+
21de49
 class ReplicationManager(object):
21de49
     """Manage replication agreements
21de49
 
21de49
@@ -527,8 +543,16 @@ class ReplicationManager(object):
21de49
             # Add the new replication manager
21de49
             binddns.append(replica_binddn)
21de49
 
21de49
-        for key, value in REPLICA_CREATION_SETTINGS.items():
21de49
-            entry[key] = value
21de49
+        # If the remote server has 389-ds < 1.3, it does not
21de49
+        # support the attributes we are trying to set.
21de49
+        # Find which 389-ds is installed
21de49
+        vendor_version = get_ds_version(conn)
21de49
+        if vendor_version >= (1, 3, 0):
21de49
+            for key, value in REPLICA_CREATION_SETTINGS.items():
21de49
+                entry[key] = value
21de49
+        else:
21de49
+            logger.debug("replication attributes not supported "
21de49
+                         "on remote master, skipping update.")
21de49
 
21de49
         try:
21de49
             conn.update_entry(entry)
21de49
@@ -604,10 +628,7 @@ class ReplicationManager(object):
21de49
         # If the remote server has 389-ds < 1.3, it does not
21de49
         # support the attributes we are trying to set.
21de49
         # Find which 389-ds is installed
21de49
-        rootdse = r_conn.get_entry(DN(''), ['vendorVersion'])
21de49
-        version = rootdse.single_value.get('vendorVersion')
21de49
-        mo = re.search(r'(\d+)\.(\d+)\.(\d+)[\.\d]*', version)
21de49
-        vendor_version = tuple(int(v) for v in mo.groups())
21de49
+        vendor_version = get_ds_version(r_conn)
21de49
         if vendor_version >= (1, 3, 0):
21de49
             # 389-ds understands the replication attributes,
21de49
             # we can safely modify them
21de49
-- 
21de49
2.17.2
21de49