s4-upgradedns: Update serverdn with only the attributes that have changed
authorAmitay Isaacs <amitay@gmail.com>
Thu, 19 Apr 2012 23:39:53 +0000 (09:39 +1000)
committerAmitay Isaacs <amitay@samba.org>
Tue, 1 May 2012 03:28:03 +0000 (05:28 +0200)
This fixes the issue of ldb 'Operations Error' when trying to modify
hasPartialReplicaNCs attribute.

Autobuild-User: Amitay Isaacs <amitay@samba.org>
Autobuild-Date: Tue May  1 05:28:04 CEST 2012 on sn-devel-104

source4/scripting/bin/samba_upgradedns

index 5a335a91f4316074159898d067011dbd3bc4369d..bd6a8b9371730330b9a9f9d3df5915cd6c9fe477 100755 (executable)
@@ -390,24 +390,34 @@ if __name__ == '__main__':
             for nc in ncs:
                 partial_nclist.append(nc)
 
-        modified = False
+        modified_master = False
+        modified_partial = False
         for nc in dns_nclist:
             if nc not in master_nclist:
                 master_nclist.append(nc)
-                modified = True
+                modified_master = True
             if nc in partial_nclist:
                 partial_nclist.remove(nc)
-                modified = True
+                modified_partial = True
 
-        if modified:
+        if modified_master or modified_partial:
             logger.debug("Updating msDS-hasMasterNCs and hasPartialReplicaNCs attributes")
-            msg["msDS-hasMasterNCs"] = ldb.MessageElement(master_nclist,
-                                                          ldb.FLAG_MOD_REPLACE,
-                                                          "msDS-hasMasterNCs")
-            msg["hasPartialReplicaNCs"] = ldb.MessageElement(partial_nclist,
-                                                             ldb.FLAG_MOD_REPLACE,
-                                                             "hasPartialReplicaNCs")
-            ldbs.sam.modify(msg)
+            m = ldb.Message()
+            m.dn = msg.dn
+            if modified_master:
+                m["msDS-hasMasterNCs"] = ldb.MessageElement(master_nclist,
+                                                            ldb.FLAG_MOD_REPLACE,
+                                                            "msDS-hasMasterNCs")
+            if modified_partial:
+                if partial_nclist:
+                    m["hasPartialReplicaNCs"] = ldb.MessageElement(partial_nclist,
+                                                                   ldb.FLAG_MOD_REPLACE,
+                                                                   "hasPartialReplicaNCs")
+                else:
+                    m["hasPartialReplicaNCs"] = ldb.MessageElement(ncs,
+                                                                   ldb.FLAG_MOD_DELETE,
+                                                                   "hasPartialReplicaNCs")
+            ldbs.sam.modify(m)
     except Exception:
         raise