diff options
| author | Andrew Bartlett <abartlet@samba.org> | 2009-08-13 14:37:06 +1000 | 
|---|---|---|
| committer | Andrew Bartlett <abartlet@samba.org> | 2009-08-17 09:50:57 +1000 | 
| commit | 14aff84adca85fd8124212e735c54363a577450a (patch) | |
| tree | 2106141c91f0aed341be302e65529b70a46cf45d /source4/scripting/python | |
| parent | 51d2d3df6db016250c12bf8c97374402dc4cb277 (diff) | |
| download | samba-14aff84adca85fd8124212e735c54363a577450a.tar.gz samba-14aff84adca85fd8124212e735c54363a577450a.tar.bz2 samba-14aff84adca85fd8124212e735c54363a577450a.zip  | |
s4:python Push some helper functions from SamDB into samba.Ldb
This makes it possible to do a bit more of the provision with Samba
helpers, but without some of the otherwise useful things (such as
loading in the global schema) that SamDB does.
Rewrite provision_erase to use a recursive search, rather than a
looping subtree search.  This is much more efficient, particularly now
we have one-level indexes enabled.
Delete the @INDEX and similar records *after* deleting all other
visible records, this hopefully also assists performance.
Andrew Bartlett
Diffstat (limited to 'source4/scripting/python')
| -rw-r--r-- | source4/scripting/python/samba/__init__.py | 90 | ||||
| -rw-r--r-- | source4/scripting/python/samba/samdb.py | 31 | 
2 files changed, 57 insertions, 64 deletions
diff --git a/source4/scripting/python/samba/__init__.py b/source4/scripting/python/samba/__init__.py index e6875b3f02..5e4fa7223f 100644 --- a/source4/scripting/python/samba/__init__.py +++ b/source4/scripting/python/samba/__init__.py @@ -121,17 +121,8 @@ class Ldb(ldb.Ldb):      def erase(self):          """Erase this ldb, removing all records.""" -        # delete the specials -        for attr in ["@INDEXLIST", "@ATTRIBUTES", "@SUBCLASSES", "@MODULES",  -                     "@OPTIONS", "@PARTITION", "@KLUDGEACL"]: -            try: -                self.delete(attr) -            except ldb.LdbError, (ldb.ERR_NO_SUCH_OBJECT, _): -                # Ignore missing dn errors -                pass -          basedn = "" -        # and the rest +        # Delete the 'visible' records          for msg in self.search(basedn, ldb.SCOPE_SUBTREE,                   "(&(|(objectclass=*)(distinguishedName=*))(!(distinguishedName=@BASEINFO)))",                   ["distinguishedName"]): @@ -144,37 +135,39 @@ class Ldb(ldb.Ldb):          res = self.search(basedn, ldb.SCOPE_SUBTREE, "(&(|(objectclass=*)(distinguishedName=*))(!(distinguishedName=@BASEINFO)))", ["distinguishedName"])          assert len(res) == 0 +        # delete the specials +        for attr in ["@INDEXLIST", "@ATTRIBUTES", "@SUBCLASSES", "@MODULES",  +                     "@OPTIONS", "@PARTITION", "@KLUDGEACL"]: +            try: +                self.delete(attr) +            except ldb.LdbError, (ldb.ERR_NO_SUCH_OBJECT, _): +                # Ignore missing dn errors +                pass +      def erase_partitions(self):          """Erase an ldb, removing all records.""" + +        def erase_recursive(self, dn): +            try: +                res = self.search(base=dn, scope=ldb.SCOPE_ONELEVEL, attrs=[]) +            except ldb.LdbError, (ldb.ERR_NO_SUCH_OBJECT, _): +                # Ignore no such object errors +                return +                pass +             +            for msg in res: +                erase_recursive(self, msg.dn) + +            self.delete(dn) +          res = self.search("", ldb.SCOPE_BASE, "(objectClass=*)",                            ["namingContexts"])          assert len(res) == 1          if not "namingContexts" in res[0]:              return          for basedn in res[0]["namingContexts"]: -            previous_remaining = 1 -            current_remaining = 0 - -            k = 0 -            while ++k < 10 and (previous_remaining != current_remaining): -                # and the rest -                try: -                    res2 = self.search(basedn, ldb.SCOPE_SUBTREE, "(|(objectclass=*)(distinguishedName=*))", ["distinguishedName"]) -                except ldb.LdbError, (ldb.ERR_NO_SUCH_OBJECT, _): -                    # Ignore missing dn errors -                    return - -                previous_remaining = current_remaining -                current_remaining = len(res2) -                for msg in res2: -                    try: -                        self.delete(msg.dn) -                    # Ignore no such object errors -                    except ldb.LdbError, (ldb.ERR_NO_SUCH_OBJECT, _): -                        pass -                    # Ignore not allowed on non leaf errors -                    except ldb.LdbError, (ldb.ERR_NOT_ALLOWED_ON_NON_LEAF, _): -                        pass +            # Try and erase from the bottom-up in the tree +            erase_recursive(self, basedn)      def load_ldif_file_add(self, ldif_path):          """Load a LDIF file. @@ -200,6 +193,37 @@ class Ldb(ldb.Ldb):          for changetype, msg in self.parse_ldif(ldif):              self.modify(msg) +    def set_domain_sid(self, sid): +        """Change the domain SID used by this LDB. + +        :param sid: The new domain sid to use. +        """ +        glue.samdb_set_domain_sid(self, sid) + +    def set_schema_from_ldif(self, pf, df): +        glue.dsdb_set_schema_from_ldif(self, pf, df) + +    def set_schema_from_ldb(self, ldb): +        glue.dsdb_set_schema_from_ldb(self, ldb) + +    def convert_schema_to_openldap(self, target, mapping): +        return glue.dsdb_convert_schema_to_openldap(self, target, mapping) + +    def set_invocation_id(self, invocation_id): +        """Set the invocation id for this SamDB handle. +         +        :param invocation_id: GUID of the invocation id. +        """ +        glue.dsdb_set_ntds_invocation_id(self, invocation_id) + +    def set_opaque_integer(self, name, value): +        """Set an integer as an opaque (a flag or other value) value on the database +         +        :param name: The name for the opaque value +        :param value: The integer value +        """ +        glue.dsdb_set_opaque_integer(self, name, value) +  def substitute_var(text, values):      """substitute strings of the form ${NAME} in str, replacing diff --git a/source4/scripting/python/samba/samdb.py b/source4/scripting/python/samba/samdb.py index c7b42b612a..c22e79b67f 100644 --- a/source4/scripting/python/samba/samdb.py +++ b/source4/scripting/python/samba/samdb.py @@ -209,37 +209,6 @@ userPassword:: %s              raise          self.transaction_commit() -    def set_domain_sid(self, sid): -        """Change the domain SID used by this SamDB. - -        :param sid: The new domain sid to use. -        """ -        glue.samdb_set_domain_sid(self, sid) - -    def set_schema_from_ldif(self, pf, df): -        glue.dsdb_set_schema_from_ldif(self, pf, df) - -    def set_schema_from_ldb(self, ldb): -        glue.dsdb_set_schema_from_ldb(self, ldb) - -    def convert_schema_to_openldap(self, target, mapping): -        return glue.dsdb_convert_schema_to_openldap(self, target, mapping) - -    def set_invocation_id(self, invocation_id): -        """Set the invocation id for this SamDB handle. -         -        :param invocation_id: GUID of the invocation id. -        """ -        glue.dsdb_set_ntds_invocation_id(self, invocation_id) - -    def set_opaque_integer(self, name, value): -        """Set an integer as an opaque (a flag or other value) value on the database -         -        :param name: The name for the opaque value -        :param value: The integer value -        """ -        glue.dsdb_set_opaque_integer(self, name, value) -      def setexpiry(self, user, expiry_seconds, noexpiry):          """Set the account expiry for a user  | 
