diff options
| -rwxr-xr-x | source4/scripting/bin/upgradeprovision | 9 | ||||
| -rw-r--r-- | source4/scripting/python/samba/__init__.py | 29 | ||||
| -rw-r--r-- | source4/scripting/python/samba/provision.py | 2 | ||||
| -rw-r--r-- | source4/scripting/python/samba/samdb.py | 26 | ||||
| -rw-r--r-- | source4/scripting/python/samba/schema.py | 5 | ||||
| -rwxr-xr-x | source4/scripting/python/samba/upgradehelpers.py | 4 | 
6 files changed, 36 insertions, 39 deletions
diff --git a/source4/scripting/bin/upgradeprovision b/source4/scripting/bin/upgradeprovision index 1c33132769..47e50ece57 100755 --- a/source4/scripting/bin/upgradeprovision +++ b/source4/scripting/bin/upgradeprovision @@ -107,7 +107,7 @@ hashOverwrittenAtt = {  "prefixMap": replace, "systemMayContain": replace,  backlinked = [] -forwardlinked = {} +forwardlinked = set()  dn_syntax_att = []  def define_what_to_log(opts):      what = 0 @@ -223,7 +223,8 @@ def populate_links(samdb, schemadn):      linkedAttHash = get_linked_attributes(Dn(samdb, str(schemadn)), samdb)      backlinked.extend(linkedAttHash.values())      for t in linkedAttHash.keys(): -        forwardlinked[t] = 1 +        forwardlinked.add(t) +  def populate_dnsyntax(samdb, schemadn):      """Populate an array with all the attributes that have DN synthax @@ -777,7 +778,7 @@ def update_present(ref_samdb, samdb, basedn, listPresent, usns, invocationid):              if usns is not None:                  # We have updated by provision usn information so let's exploit                  # replMetadataProperties -                if forwardlinked.has_key(att): +                if att in forwardlinked:                      handle_links(samdb, att, basedn, current[0]["dn"],                                      current[0][att], reference[0][att], delta) @@ -952,7 +953,7 @@ def update_partition(ref_samdb, samdb, basedn, names, schema, provisionUSNs):      # a complete schema is needed as the insertion of attributes      # and class is done against it      # and the schema is self validated -    samdb.set_schema_from_ldb(schema.ldb) +    samdb.set_schema(schema)      try:          message(SIMPLE, "There are %d missing objects" % (len(listMissing)))          add_deletedobj_containers(ref_samdb, samdb, names) diff --git a/source4/scripting/python/samba/__init__.py b/source4/scripting/python/samba/__init__.py index ca433127ba..3eefaa7ffc 100644 --- a/source4/scripting/python/samba/__init__.py +++ b/source4/scripting/python/samba/__init__.py @@ -133,7 +133,11 @@ class Ldb(_Ldb):          return self.schema_format_value(attribute, values.pop())      def erase_users_computers(self, dn): -        """Erases user and computer objects from our AD. This is needed since the 'samldb' module denies the deletion of primary groups. Therefore all groups shouldn't be primary somewhere anymore.""" +        """Erases user and computer objects from our AD. +         +        This is needed since the 'samldb' module denies the deletion of primary +        groups. Therefore all groups shouldn't be primary somewhere anymore. +        """          try:              res = self.search(base=dn, scope=ldb.SCOPE_SUBTREE, attrs=[], @@ -167,8 +171,8 @@ class Ldb(_Ldb):          # Delete the 'visible' records, and the invisble 'deleted' records (if this DB supports it)          for msg in self.search(basedn, ldb.SCOPE_SUBTREE, -                               "(&(|(objectclass=*)(distinguishedName=*))(!(distinguishedName=@BASEINFO)))", -                               [], controls=["show_deleted:0"]): +                       "(&(|(objectclass=*)(distinguishedName=*))(!(distinguishedName=@BASEINFO)))", +                       [], controls=["show_deleted:0"]):              try:                  self.delete(msg.dn, ["relax:0"])              except ldb.LdbError, (errno, _): @@ -192,7 +196,6 @@ class Ldb(_Ldb):      def erase(self):          """Erase this ldb, removing all records.""" -          self.erase_except_schema_controlled()          # delete the specials @@ -259,33 +262,17 @@ class Ldb(_Ldb):          :param ldif: LDIF text.          """          for changetype, msg in self.parse_ldif(ldif): -            if (changetype == ldb.CHANGETYPE_ADD): +            if changetype == ldb.CHANGETYPE_ADD:                  self.add(msg, controls)              else:                  self.modify(msg, controls) -    def set_domain_sid(self, sid): -        """Change the domain SID used by this LDB. - -        :param sid: The new domain sid to use. -        """ -        dsdb.samdb_set_domain_sid(self, sid) -      def domain_sid(self):          """Read the domain SID used by this LDB.          """          dsdb.samdb_get_domain_sid(self) -    def set_schema_from_ldif(self, pf, df): -        dsdb.dsdb_set_schema_from_ldif(self, pf, df) - -    def set_schema_from_ldb(self, ldb): -        dsdb.dsdb_set_schema_from_ldb(self, ldb) - -    def write_prefixes_from_schema(self): -        dsdb.dsdb_write_prefixes_from_schema_to_ldb(self) -  def substitute_var(text, values):      """Substitute strings of the form ${NAME} in str, replacing diff --git a/source4/scripting/python/samba/provision.py b/source4/scripting/python/samba/provision.py index 873be6730d..ca62b6062f 100644 --- a/source4/scripting/python/samba/provision.py +++ b/source4/scripting/python/samba/provision.py @@ -976,7 +976,7 @@ def setup_samdb(path, setup_path, session_info, provision_backend, lp, names,      logger.info("Pre-loading the Samba 4 and AD schema")      # Load the schema from the one we computed earlier -    samdb.set_schema_from_ldb(schema.ldb) +    samdb.set_schema(schema)      # And now we can connect to the DB - the schema won't be loaded from the DB      samdb.connect(path) diff --git a/source4/scripting/python/samba/samdb.py b/source4/scripting/python/samba/samdb.py index a47db9680a..0a3ca41604 100644 --- a/source4/scripting/python/samba/samdb.py +++ b/source4/scripting/python/samba/samdb.py @@ -150,7 +150,7 @@ pwdLastSet: 0          else:              self.transaction_commit() -    def deletegroup (self, groupname): +    def deletegroup(self, groupname):          """Deletes a group          :param groupname: Name of the target group @@ -162,19 +162,16 @@ pwdLastSet: 0              targetgroup = self.search(base=self.domain_dn(), scope=ldb.SCOPE_SUBTREE,                                 expression=groupfilter, attrs=[])              if len(targetgroup) == 0: -                print('Unable to find group "%s"' % (groupname or expression)) -                raise +                raise Exception('Unable to find group "%s"' % groupname)              assert(len(targetgroup) == 1) - -            self.delete (targetgroup[0].dn); - +            self.delete(targetgroup[0].dn);          except:              self.transaction_cancel()              raise          else:              self.transaction_commit() -    def add_remove_group_members (self, groupname, listofmembers, +    def add_remove_group_members(self, groupname, listofmembers,                                    add_members_operation=True):          """Adds or removes group members @@ -191,8 +188,7 @@ pwdLastSet: 0              targetgroup = self.search(base=self.domain_dn(), scope=ldb.SCOPE_SUBTREE,                                 expression=groupfilter, attrs=['member'])              if len(targetgroup) == 0: -                print('Unable to find group "%s"' % (groupname or expression)) -                raise +                raise Exception('Unable to find group "%s"' % groupname)              assert(len(targetgroup) == 1)              modified = False @@ -364,8 +360,7 @@ member: %s              res = self.search(base=self.domain_dn(), scope=ldb.SCOPE_SUBTREE,                                expression=filter, attrs=[])              if len(res) == 0: -                print('Unable to find user "%s"' % (username or filter)) -                raise +                raise Exception('Unable to find user "%s"' % (username or filter))              assert(len(res) == 1)              user_dn = res[0].dn @@ -480,3 +475,12 @@ accountExpires: %u      def load_partition_usn(self, base_dn):          return dsdb.dsdb_load_partition_usn(self, base_dn) + +    def set_schema(self, schema): +        self.set_schema_from_ldb(schema.ldb) + +    def set_schema_from_ldb(self, ldb): +        dsdb.dsdb_set_schema_from_ldb(self, ldb) + +    def write_prefixes_from_schema(self): +        dsdb.dsdb_write_prefixes_from_schema_to_ldb(self) diff --git a/source4/scripting/python/samba/schema.py b/source4/scripting/python/samba/schema.py index 2495cf2e0c..9e8db65d6e 100644 --- a/source4/scripting/python/samba/schema.py +++ b/source4/scripting/python/samba/schema.py @@ -106,7 +106,10 @@ class Schema(object):          # We don't actually add this ldif, just parse it          prefixmap_ldif = "dn: cn=schema\nprefixMap:: %s\n\n" % self.prefixmap_data -        self.ldb.set_schema_from_ldif(prefixmap_ldif, self.schema_data) +        self.set_from_ldif(prefixmap_ldif, self.schema_data) + +    def set_from_ldif(self, pf, df): +        dsdb.dsdb_set_schema_from_ldif(self.ldb, pf, df)      def write_to_tmp_ldb(self, schemadb_path):          self.ldb.connect(url=schemadb_path) diff --git a/source4/scripting/python/samba/upgradehelpers.py b/source4/scripting/python/samba/upgradehelpers.py index 5a37dab108..428d43450f 100755 --- a/source4/scripting/python/samba/upgradehelpers.py +++ b/source4/scripting/python/samba/upgradehelpers.py @@ -38,6 +38,7 @@ from samba.provision import (ProvisionNames, provision_paths_from_lp,                              setsysvolacl)  from samba.dcerpc import misc, security, xattr  from samba.ndr import ndr_unpack +from samba.samdb import SamDB  # All the ldb related to registry are commented because the path for them is relative  # in the provisionPath object @@ -66,6 +67,7 @@ hashAttrNotCopied = {   "dn": 1, "whenCreated": 1, "whenChanged": 1,                          "sAMAccountType":1 }  class ProvisionLDB(object): +      def __init__(self):          self.sam = None          self.secrets = None @@ -155,7 +157,7 @@ def get_ldbs(paths, creds, session, lp):      ldbs = ProvisionLDB() -    ldbs.sam = Ldb(paths.samdb, session_info=session, credentials=creds, lp=lp, options=["modules:samba_dsdb"]) +    ldbs.sam = SamDB(paths.samdb, session_info=session, credentials=creds, lp=lp, options=["modules:samba_dsdb"])      ldbs.secrets = Ldb(paths.secrets, session_info=session, credentials=creds, lp=lp)      ldbs.idmap = Ldb(paths.idmapdb, session_info=session, credentials=creds, lp=lp)      ldbs.privilege = Ldb(paths.privilege, session_info=session, credentials=creds, lp=lp)  | 
