s4-dbcheck: offer to fix dsServiceName to be in GUID form
authorAndrew Tridgell <tridge@samba.org>
Thu, 11 Aug 2011 06:59:11 +0000 (16:59 +1000)
committerAndrew Tridgell <tridge@samba.org>
Fri, 12 Aug 2011 02:00:07 +0000 (04:00 +0200)
this fixes the dsServiceName so it can handle server renames

Pair-Programmed-With: Andrew Bartlett <abartlet@samba.org>

source4/scripting/python/samba/dbchecker.py

index b16b75aa165c2fa1ed4eecc5d987bdf5b5acd03e..85c7f80b91f658a2a162788d13c3d726698097bf 100644 (file)
@@ -77,10 +77,17 @@ class dbcheck(object):
         res = self.samdb.search(base=DN, scope=scope, attrs=['dn'], controls=controls)
         self.report('Checking %u objects' % len(res))
         error_count = 0
+
         for object in res:
             error_count += self.check_object(object.dn, attrs=attrs)
+
+        if DN is None:
+            error_count += self.check_rootdse()
+
         if error_count != 0 and not self.fix:
             self.report("Please use --fix to fix these errors")
+
+
         self.report('Checked %u objects (%u errors)' % (len(res), error_count))
 
         return error_count
@@ -480,6 +487,42 @@ class dbcheck(object):
 
         return error_count
 
+    ################################################################
+    # check special @ROOTDSE attributes
+    def check_rootdse(self):
+        '''check the @ROOTDSE special object'''
+        dn = ldb.Dn(self.samdb, '@ROOTDSE')
+        if self.verbose:
+            self.report("Checking object %s" % dn)
+        res = self.samdb.search(base=dn, scope=ldb.SCOPE_BASE)
+        if len(res) != 1:
+            self.report("Object %s disappeared during check" % dn)
+            return 1
+        obj = res[0]
+        error_count = 0
+
+        # check that the dsServiceName is in GUID form
+        if not 'dsServiceName' in obj:
+            self.report('ERROR: dsServiceName missing in @ROOTDSE')
+            return error_count+1
+
+        if not obj['dsServiceName'][0].startswith('<GUID='):
+            self.report('ERROR: dsServiceName not in GUID form in @ROOTDSE')
+            error_count += 1
+            if not self.confirm('Change dsServiceName to GUID form?'):
+                return error_count
+            res = self.samdb.search(base=ldb.Dn(self.samdb, obj['dsServiceName'][0]),
+                                    scope=ldb.SCOPE_BASE, attrs=['objectGUID'])
+            guid_str = str(ndr_unpack(misc.GUID, res[0]['objectGUID'][0]))
+            m = ldb.Message()
+            m.dn = dn
+            m['dsServiceName'] = ldb.MessageElement("<GUID=%s>" % guid_str,
+                                                    ldb.FLAG_MOD_REPLACE, 'dsServiceName')
+            if self.do_modify(m, [], "Failed to change dsServiceName to GUID form", validate=False):
+                self.report("Changed dsServiceName to GUID form")
+        return error_count
+
+
     ###############################################
     # re-index the database
     def reindex_database(self):