[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Thu Nov 12 04:25:07 MST 2009


The branch, master has been updated
       via  0d6c305... s4:dsdb Make callbacks in extended_dn_out clearer to follow
       via  5740648... s4:selftest Mark the RPC-DSSYNC test as knownfail for now
       via  68639bf... s4:libcli/ldap Add 'relax' OID to known network representations
       via  f3bc54a... s4:provision - Added LDBBackend and ExistingBackend.
       via  55bb60a... s4:provision - Added constructors for FDSBackend and OpenLDAPBackend.
       via  1564067... s4:provision - Added setup() method in LDAPBackend.
       via  ba12eb9... s4:provision - Moved provision_xxx_backend() into backend-specific provision() method.
       via  be766a3... s4:provision - Added start() method in LDAPBackend.
       via  fbc5696... s4:provision - Added initial implementation of FDSBackend and OpenLDAPBackend.
      from  8006e0e... s3: Fix debug messages in check_reduced_name

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 0d6c3058b22b387b264393f83fc0c069243c27b7
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Thu Nov 12 21:31:11 2009 +1100

    s4:dsdb Make callbacks in extended_dn_out clearer to follow

commit 57406482791dfeadbda177ffbba4f02443f7aa76
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Thu Nov 12 21:14:13 2009 +1100

    s4:selftest Mark the RPC-DSSYNC test as knownfail for now
    
    We need to work on the provision or LDB modules to avoid DN attributes
    without GUIDs (caused because the target does not exist at creation
    time).
    
    Andrew Bartlett

commit 68639bfd64f063d1c6e373a2fc276b2bbb7073ca
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Thu Nov 12 17:16:25 2009 +1100

    s4:libcli/ldap Add 'relax' OID to known network representations
    
    This patch, inspired by a patche by Endi S. Dewata
    <edewata at redhat.com>, allows this control to be passed to the LDAP
    backend.
    
    Andrew Bartlett

commit f3bc54a8f1a405bfd8886bd46a1c2ca1b47acae7
Author: Endi S. Dewata <edewata at redhat.com>
Date:   Thu Nov 5 22:29:55 2009 -0600

    s4:provision - Added LDBBackend and ExistingBackend.

commit 55bb60a5db559a06a05a1be6633d92b8f6555c08
Author: Endi S. Dewata <edewata at redhat.com>
Date:   Thu Nov 5 21:55:34 2009 -0600

    s4:provision - Added constructors for FDSBackend and OpenLDAPBackend.

commit 1564067fbc8490bcef5523db1d7e997dca00f0bf
Author: Endi S. Dewata <edewata at redhat.com>
Date:   Thu Nov 5 18:49:37 2009 -0600

    s4:provision - Added setup() method in LDAPBackend.

commit ba12eb99a04671197b92c998d72c09fd5c23c5da
Author: Endi S. Dewata <edewata at redhat.com>
Date:   Thu Nov 5 17:36:34 2009 -0600

    s4:provision - Moved provision_xxx_backend() into backend-specific provision() method.

commit be766a384173bb02c5306e5884d1228973fe5dd7
Author: Endi S. Dewata <edewata at redhat.com>
Date:   Thu Nov 5 12:04:05 2009 -0600

    s4:provision - Added start() method in LDAPBackend.

commit fbc5696e38754b6014875c231edd5f56479e134b
Author: Endi S. Dewata <edewata at redhat.com>
Date:   Thu Nov 5 11:15:55 2009 -0600

    s4:provision - Added initial implementation of FDSBackend and OpenLDAPBackend.

-----------------------------------------------------------------------

Summary of changes:
 source4/dsdb/samdb/ldb_modules/extended_dn_out.c   |    7 +-
 source4/libcli/ldap/ldap_controls.c                |    2 +
 source4/scripting/python/samba/provision.py        |   52 +-
 source4/scripting/python/samba/provisionbackend.py |  851 +++++++++++---------
 source4/selftest/knownfail                         |    1 +
 5 files changed, 508 insertions(+), 405 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/dsdb/samdb/ldb_modules/extended_dn_out.c b/source4/dsdb/samdb/ldb_modules/extended_dn_out.c
index f946cb1..bf70c3e 100644
--- a/source4/dsdb/samdb/ldb_modules/extended_dn_out.c
+++ b/source4/dsdb/samdb/ldb_modules/extended_dn_out.c
@@ -489,6 +489,11 @@ static int extended_callback(struct ldb_request *req, struct ldb_reply *ares,
 	return ldb_module_send_entry(ac->req, msg, ares->controls);
 }
 
+static int extended_callback_ldb(struct ldb_request *req, struct ldb_reply *ares)
+{
+	return extended_callback(req, ares, NULL);
+}
+
 static int extended_callback_openldap(struct ldb_request *req, struct ldb_reply *ares)
 {
 	return extended_callback(req, ares, handle_dereference_openldap);
@@ -642,7 +647,7 @@ static int extended_dn_out_search(struct ldb_module *module, struct ldb_request
 
 static int extended_dn_out_ldb_search(struct ldb_module *module, struct ldb_request *req)
 {
-	return extended_dn_out_search(module, req, extended_callback_openldap);
+	return extended_dn_out_search(module, req, extended_callback_ldb);
 }
 
 static int extended_dn_out_openldap_search(struct ldb_module *module, struct ldb_request *req)
diff --git a/source4/libcli/ldap/ldap_controls.c b/source4/libcli/ldap/ldap_controls.c
index 86493c8..1572f25 100644
--- a/source4/libcli/ldap/ldap_controls.c
+++ b/source4/libcli/ldap/ldap_controls.c
@@ -1274,6 +1274,8 @@ static const struct ldap_control_handler ldap_known_controls[] = {
 /* DSDB_EXTENDED_REPLICATED_OBJECTS_OID is internal only, and has no network representation */
 	{ "1.3.6.1.4.1.7165.4.4.1", NULL, NULL },
 	{ DSDB_OPENLDAP_DEREFERENCE_CONTROL, decode_openldap_dereference, encode_openldap_dereference},
+/* LDB_CONTROL_RELAX_OID has no data (so no need for pull/push functions) */
+	{ LDB_CONTROL_RELAX_OID, NULL, NULL },
 	{ NULL, NULL, NULL }
 };
 
diff --git a/source4/scripting/python/samba/provision.py b/source4/scripting/python/samba/provision.py
index 98f9298..86e7cec 100644
--- a/source4/scripting/python/samba/provision.py
+++ b/source4/scripting/python/samba/provision.py
@@ -52,7 +52,7 @@ import urllib
 from ldb import SCOPE_SUBTREE, SCOPE_ONELEVEL, SCOPE_BASE, LdbError
 from ms_display_specifiers import read_ms_ldif
 from schema import Schema
-from provisionbackend import ProvisionBackend
+from provisionbackend import LDBBackend, ExistingBackend, FDSBackend, OpenLDAPBackend
 from signal import SIGTERM
 from dcerpc.misc import SEC_CHAN_BDC, SEC_CHAN_WKSTA
 
@@ -623,7 +623,7 @@ def setup_samdb_partitions(samdb_path, setup_path, message, lp, session_info,
             backend_modules = ["nsuniqueid", "paged_searches"]
             # We can handle linked attributes here, as we don't have directory-side subtree operations
             tdb_modules_list = ["extended_dn_out_fds"]
-        elif ldap_backend.ldap_backend_type == "openldap":
+        elif provision_backend.ldap_backend_type == "openldap":
             backend_modules = ["entryuuid", "paged_searches"]
             # OpenLDAP handles subtree renames, so we don't want to do any of these things
             tdb_modules_list = ["extended_dn_out_openldap"]
@@ -1233,19 +1233,50 @@ def provision(setup_dir, message, session_info,
     
     schema = Schema(setup_path, domainsid, schemadn=names.schemadn, serverdn=names.serverdn)
     
-    provision_backend = ProvisionBackend(backend_type,
+    if backend_type == "ldb":
+        provision_backend = LDBBackend(backend_type,
+                                         paths=paths, setup_path=setup_path,
+                                         lp=lp, credentials=credentials, 
+                                         names=names,
+                                         message=message)
+    elif backend_type == "existing":
+        provision_backend = ExistingBackend(backend_type,
+                                         paths=paths, setup_path=setup_path,
+                                         lp=lp, credentials=credentials, 
+                                         names=names,
+                                         message=message)
+    elif backend_type == "fedora-ds":
+        provision_backend = FDSBackend(backend_type,
                                          paths=paths, setup_path=setup_path,
                                          lp=lp, credentials=credentials, 
                                          names=names,
                                          message=message, hostname=hostname,
-                                         root=root, schema=schema,
+                                         schema=schema,
                                          ldapadminpass=ldapadminpass,
-                                         ldap_backend_extra_port=ldap_backend_extra_port,
-                                         ol_mmr_urls=ol_mmr_urls, 
                                          slapd_path=slapd_path,
-                                         setup_ds_path=setup_ds_path,
+                                         ldap_backend_extra_port=ldap_backend_extra_port,
                                          ldap_dryrun_mode=ldap_dryrun_mode,
+                                         root=root,
+                                         setup_ds_path=setup_ds_path,
                                          domainsid=domainsid)
+    elif backend_type == "openldap":
+        provision_backend = OpenLDAPBackend(backend_type,
+                                         paths=paths, setup_path=setup_path,
+                                         lp=lp, credentials=credentials, 
+                                         names=names,
+                                         message=message, hostname=hostname,
+                                         schema=schema,
+                                         ldapadminpass=ldapadminpass,
+                                         slapd_path=slapd_path,
+                                         ldap_backend_extra_port=ldap_backend_extra_port,
+                                         ldap_dryrun_mode=ldap_dryrun_mode,
+                                         ol_mmr_urls=ol_mmr_urls, 
+                                         nosync=nosync)
+    else:
+        raise ProvisioningError("Unknown LDAP backend type selected")
+
+    provision_backend.setup()
+    provision_backend.start()
 
     # only install a new shares config db if there is none
     if not os.path.exists(paths.shareconf):
@@ -1365,11 +1396,8 @@ def provision(setup_dir, message, session_info,
                              realm=names.realm)
             message("A Kerberos configuration suitable for Samba 4 has been generated at %s" % paths.krb5conf)
 
-    if provision_backend.post_setup is not None:
-        provision_backend.post_setup()
-
-    if provision_backend.shutdown is not None:
-        provision_backend.shutdown()
+    provision_backend.post_setup()
+    provision_backend.shutdown()
     
     create_phpldapadmin_config(paths.phpldapadminconfig, setup_path, 
                                ldapi_url)
diff --git a/source4/scripting/python/samba/provisionbackend.py b/source4/scripting/python/samba/provisionbackend.py
index f809202..7ef556c 100644
--- a/source4/scripting/python/samba/provisionbackend.py
+++ b/source4/scripting/python/samba/provisionbackend.py
@@ -26,6 +26,7 @@
 """Functions for setting up a Samba configuration (LDB and LDAP backends)."""
 
 from base64 import b64encode
+import ldb
 import os
 import sys
 import uuid
@@ -55,54 +56,110 @@ def setup_db_config(setup_path, dbdir):
 
 class ProvisionBackend(object):
     def __init__(self, backend_type, paths=None, setup_path=None, lp=None, credentials=None, 
-                 names=None, message=None, 
-                 hostname=None, root=None, 
-                 schema=None, ldapadminpass=None,
-                 ldap_backend_extra_port=None,
-                 ol_mmr_urls=None, 
-                 setup_ds_path=None, slapd_path=None, 
-                 nosync=False, ldap_dryrun_mode=False,
-                 domainsid=None):
-        """Provision an LDAP backend for samba4
-        
-        This works for OpenLDAP and Fedora DS
-        """
+                 names=None, message=None):
+        """Provision a backend for samba4"""
         self.paths = paths
-        self.slapd_command = None
-        self.slapd_command_escaped = None
+        self.setup_path = setup_path
+        self.lp = lp
+        self.credentials = credentials
+        self.names = names
+        self.message = message
 
         self.type = backend_type
         
         # Set a default - the code for "existing" below replaces this
         self.ldap_backend_type = backend_type
 
-        self.post_setup = None
-        self.shutdown = None
+    def setup(self):
+        pass
+
+    def start(self):
+        pass
+
+    def shutdown(self):
+        pass
+
+    def post_setup(self):
+        pass
+
 
-        if self.type is "ldb":
-            self.credentials = None
-            self.secrets_credentials = None
+class LDBBackend(ProvisionBackend):
+    def __init__(self, backend_type, paths=None, setup_path=None, lp=None, credentials=None, 
+                 names=None, message=None):
+
+        super(LDBBackend, self).__init__(
+                backend_type=backend_type,
+                paths=paths, setup_path=setup_path,
+                lp=lp, credentials=credentials,
+                names=names,
+                message=message)
+
+    def setup(self):
+        self.credentials = None
+        self.secrets_credentials = None
     
-            # Wipe the old sam.ldb databases away
-            shutil.rmtree(paths.samdb + ".d", True)
-            return
+        # Wipe the old sam.ldb databases away
+        shutil.rmtree(self.paths.samdb + ".d", True)
+
+
+class ExistingBackend(ProvisionBackend):
+    def __init__(self, backend_type, paths=None, setup_path=None, lp=None, credentials=None, 
+                 names=None, message=None):
+
+        super(ExistingBackend, self).__init__(
+                backend_type=backend_type,
+                paths=paths, setup_path=setup_path,
+                lp=lp, credentials=credentials,
+                names=names,
+                message=message)
 
         self.ldapi_uri = "ldapi://" + urllib.quote(os.path.join(paths.ldapdir, "ldapi"), safe="")
-        
-        if self.type == "existing":
-            #Check to see that this 'existing' LDAP backend in fact exists
-            ldapi_db = Ldb(self.ldapi_uri, credentials=credentials)
-            search_ol_rootdse = ldapi_db.search(base="", scope=SCOPE_BASE,
-                                                expression="(objectClass=OpenLDAProotDSE)")
 
-            # If we have got here, then we must have a valid connection to the LDAP server, with valid credentials supplied
-            self.credentials = credentials
-            # This caused them to be set into the long-term database later in the script.
-            self.secrets_credentials = credentials
+    def setup(self):
+        #Check to see that this 'existing' LDAP backend in fact exists
+        ldapi_db = Ldb(self.ldapi_uri, credentials=self.credentials)
+        search_ol_rootdse = ldapi_db.search(base="", scope=SCOPE_BASE,
+                                            expression="(objectClass=OpenLDAProotDSE)")
 
-            self.ldap_backend_type = "openldap" #For now, assume existing backends at least emulate OpenLDAP
-            return
-    
+        # If we have got here, then we must have a valid connection to the LDAP server, with valid credentials supplied
+        # This caused them to be set into the long-term database later in the script.
+        self.secrets_credentials = self.credentials
+
+        self.ldap_backend_type = "openldap" #For now, assume existing backends at least emulate OpenLDAP
+
+
+class LDAPBackend(ProvisionBackend):
+    def __init__(self, backend_type, paths=None, setup_path=None, lp=None, credentials=None,
+                 names=None, message=None,
+                 hostname=None,
+                 schema=None,
+                 ldapadminpass=None,
+                 slapd_path=None,
+                 ldap_backend_extra_port=None,
+                 ldap_dryrun_mode=False):
+
+        super(LDAPBackend, self).__init__(
+                backend_type=backend_type,
+                paths=paths, setup_path=setup_path,
+                lp=lp, credentials=credentials,
+                names=names,
+                message=message)
+
+        self.hostname = hostname
+        self.schema = schema
+
+        self.ldapadminpass = ldapadminpass
+
+        self.slapd_path = slapd_path
+        self.slapd_command = None
+        self.slapd_command_escaped = None
+
+        self.ldap_backend_extra_port = ldap_backend_extra_port
+        self.ldap_dryrun_mode = ldap_dryrun_mode
+
+        self.ldapi_uri = "ldapi://" + urllib.quote(os.path.join(paths.ldapdir, "ldapi"), safe="")
+
+    def setup(self):
         # we will shortly start slapd with ldapi for final provisioning. first check with ldapsearch -> rootDSE via self.ldapi_uri
         # if another instance of slapd is already running 
         try:
@@ -110,10 +167,10 @@ class ProvisionBackend(object):
             search_ol_rootdse = ldapi_db.search(base="", scope=SCOPE_BASE,
                                                 expression="(objectClass=OpenLDAProotDSE)");
             try:
-                f = open(paths.slapdpid, "r")
+                f = open(self.paths.slapdpid, "r")
                 p = f.read()
                 f.close()
-                message("Check for slapd Process with PID: " + str(p) + " and terminate it manually.")
+                self.message("Check for slapd Process with PID: " + str(p) + " and terminate it manually.")
             except:
                 pass
             
@@ -123,87 +180,48 @@ class ProvisionBackend(object):
             pass
 
         # Try to print helpful messages when the user has not specified the path to slapd
-        if slapd_path is None:
+        if self.slapd_path is None:
             raise ProvisioningError("Warning: LDAP-Backend must be setup with path to slapd, e.g. --slapd-path=\"/usr/local/libexec/slapd\"!")
-        if not os.path.exists(slapd_path):
-            message (slapd_path)
+        if not os.path.exists(self.slapd_path):
+            self.message (self.slapd_path)
             raise ProvisioningError("Warning: Given Path to slapd does not exist!")
 
 
-        if not os.path.isdir(paths.ldapdir):
-            os.makedirs(paths.ldapdir, 0700)
+        if not os.path.isdir(self.paths.ldapdir):
+            os.makedirs(self.paths.ldapdir, 0700)
 
         # Put the LDIF of the schema into a database so we can search on
         # it to generate schema-dependent configurations in Fedora DS and
         # OpenLDAP
-        schemadb_path = os.path.join(paths.ldapdir, "schema-tmp.ldb")
+        schemadb_path = os.path.join(self.paths.ldapdir, "schema-tmp.ldb")
         try:
             os.unlink(schemadb_path)
         except OSError:
             pass
 
-        schema.write_to_tmp_ldb(schemadb_path);
+        self.schema.write_to_tmp_ldb(schemadb_path);
 
         self.credentials = Credentials()
-        self.credentials.guess(lp)
+        self.credentials.guess(self.lp)
         #Kerberos to an ldapi:// backend makes no sense
         self.credentials.set_kerberos_state(DONT_USE_KERBEROS)
+        self.credentials.set_password(self.ldapadminpass)
 
         self.secrets_credentials = Credentials()
-        self.secrets_credentials.guess(lp)
+        self.secrets_credentials.guess(self.lp)
         #Kerberos to an ldapi:// backend makes no sense
         self.secrets_credentials.set_kerberos_state(DONT_USE_KERBEROS)
+        self.secrets_credentials.set_username("samba-admin")
+        self.secrets_credentials.set_password(self.ldapadminpass)
 
+        self.provision()
 
-        def ldap_backend_shutdown(self):
-            # if an LDAP backend is in use, terminate slapd after final provision and check its proper termination
-            if self.slapd.poll() is None:
-                #Kill the slapd
-                if hasattr(self.slapd, "terminate"):
-                    self.slapd.terminate()
-                else:
-                    # Older python versions don't have .terminate()
-                    import signal
-                    os.kill(self.slapd.pid, signal.SIGTERM)
-            
-                #and now wait for it to die
-                self.slapd.communicate()
-
-        self.shutdown = ldap_backend_shutdown
-
-        if self.type == "fedora-ds":
-            provision_fds_backend(self, setup_path=setup_path,
-                                  names=names, message=message, 
-                                  hostname=hostname,
-                                  ldapadminpass=ldapadminpass, root=root, 
-                                  schema=schema,
-                                  ldap_backend_extra_port=ldap_backend_extra_port, 
-                                  setup_ds_path=setup_ds_path,
-                                  slapd_path=slapd_path,
-                                  nosync=nosync,
-                                  ldap_dryrun_mode=ldap_dryrun_mode,
-                                  domainsid=domainsid)
-            
-        elif self.type == "openldap":
-            provision_openldap_backend(self, setup_path=setup_path,
-                                       names=names, message=message, 
-                                       hostname=hostname,
-                                       ldapadminpass=ldapadminpass, root=root, 
-                                       schema=schema,
-                                       ldap_backend_extra_port=ldap_backend_extra_port, 
-                                       ol_mmr_urls=ol_mmr_urls, 
-                                       slapd_path=slapd_path,
-                                       nosync=nosync,
-                                       ldap_dryrun_mode=ldap_dryrun_mode)
-        else:
-            raise ProvisioningError("Unknown LDAP backend type selected")
-
-        self.credentials.set_password(ldapadminpass)
-        self.secrets_credentials.set_username("samba-admin")
-        self.secrets_credentials.set_password(ldapadminpass)
+    def provision(self):
+        pass
 
+    def start(self):
         self.slapd_command_escaped = "\'" + "\' \'".join(self.slapd_command) + "\'"
-        setup_file(setup_path("ldap_backend_startup.sh"), paths.ldapdir + "/ldap_backend_startup.sh", {
+        setup_file(self.setup_path("ldap_backend_startup.sh"), self.paths.ldapdir + "/ldap_backend_startup.sh", {
                 "SLAPD_COMMAND" : self.slapd_command_escaped})
 
         # Now start the slapd, so we can provision onto it.  We keep the
@@ -214,7 +232,7 @@ class ProvisionBackend(object):
         while self.slapd.poll() is None:
             # Wait until the socket appears
             try:
-                ldapi_db = Ldb(self.ldapi_uri, lp=lp, credentials=self.credentials)
+                ldapi_db = Ldb(self.ldapi_uri, lp=self.lp, credentials=self.credentials)
                 search_ol_rootdse = ldapi_db.search(base="", scope=SCOPE_BASE,
                                                     expression="(objectClass=OpenLDAProotDSE)")
                 # If we have got here, then we must have a valid connection to the LDAP server!
@@ -225,371 +243,424 @@ class ProvisionBackend(object):
         
         raise ProvisioningError("slapd died before we could make a connection to it")
 
+    def shutdown(self):
+        # if an LDAP backend is in use, terminate slapd after final provision and check its proper termination
+        if self.slapd.poll() is None:
+            #Kill the slapd
+            if hasattr(self.slapd, "terminate"):
+                self.slapd.terminate()
+            else:
+                # Older python versions don't have .terminate()
+                import signal
+                os.kill(self.slapd.pid, signal.SIGTERM)
+    
+            #and now wait for it to die
+            self.slapd.communicate()
 
-def provision_openldap_backend(result, setup_path=None, names=None,
-                               message=None, 
-                               hostname=None, ldapadminpass=None, root=None, 
-                               schema=None, 
-                               ldap_backend_extra_port=None,
-                               ol_mmr_urls=None, 
-                               slapd_path=None, nosync=False,
-                               ldap_dryrun_mode=False):
-
-    # Wipe the directories so we can start
-    shutil.rmtree(os.path.join(result.paths.ldapdir, "db"), True)
 
-    #Allow the test scripts to turn off fsync() for OpenLDAP as for TDB and LDB
-    nosync_config = ""
-    if nosync:
-        nosync_config = "dbnosync"
+class OpenLDAPBackend(LDAPBackend):
+    def __init__(self, backend_type, paths=None, setup_path=None, lp=None, credentials=None,
+                 names=None, message=None,
+                 hostname=None,
+                 schema=None,
+                 ldapadminpass=None,
+                 slapd_path=None,
+                 ldap_backend_extra_port=None,
+                 ldap_dryrun_mode=False,
+                 ol_mmr_urls=None,
+                 nosync=False):
+
+        super(OpenLDAPBackend, self).__init__(
+                backend_type=backend_type,
+                paths=paths, setup_path=setup_path,
+                lp=lp, credentials=credentials,
+                names=names,
+                message=message,
+                hostname=hostname,
+                schema=schema,
+                ldapadminpass=ldapadminpass,
+                slapd_path=slapd_path,
+                ldap_backend_extra_port=ldap_backend_extra_port,
+                ldap_dryrun_mode=ldap_dryrun_mode)
+
+        self.ol_mmr_urls = ol_mmr_urls
+        self.nosync = nosync
+
+    def provision(self):
+        # Wipe the directories so we can start
+        shutil.rmtree(os.path.join(self.paths.ldapdir, "db"), True)
+
+        #Allow the test scripts to turn off fsync() for OpenLDAP as for TDB and LDB
+        nosync_config = ""
+        if self.nosync:
+            nosync_config = "dbnosync"
         
-    lnkattr = schema.linked_attributes()
-    refint_attributes = ""
-    memberof_config = "# Generated from Samba4 schema\n"
-    for att in  lnkattr.keys():
-        if lnkattr[att] is not None:
-            refint_attributes = refint_attributes + " " + att 
+        lnkattr = self.schema.linked_attributes()
+        refint_attributes = ""
+        memberof_config = "# Generated from Samba4 schema\n"
+        for att in  lnkattr.keys():
+            if lnkattr[att] is not None:
+                refint_attributes = refint_attributes + " " + att 
             
-            memberof_config += read_and_sub_file(setup_path("memberof.conf"),


-- 
Samba Shared Repository


More information about the samba-cvs mailing list