return PyImport_Import(name);
}
+static PyObject *schema_module(void)
+{
+ PyObject *name = PyString_FromString("samba.schema");
+ if (name == NULL)
+ return NULL;
+ return PyImport_Import(name);
+}
+
NTSTATUS provision_bare(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx,
struct provision_settings *settings,
struct provision_result *result)
PyErr_Clear();
return NT_STATUS_UNSUCCESSFUL;
}
+
+
+struct ldb_context *provision_get_schema(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx)
+{
+ const char *setupdir;
+ PyObject *schema_mod, *schema_dict, *schema_fn, *py_result, *parameters;
+
+ DEBUG(0,("Schema for DRS tests using python\n"));
+
+ py_load_samba_modules();
+ Py_Initialize();
+ py_update_path("bin"); /* FIXME: Can't assume this is always the case */
+
+ schema_mod = schema_module();
+
+ if (schema_mod == NULL) {
+ PyErr_Print();
+ DEBUG(0, ("Unable to import schema Python module.\n"));
+ return NULL;
+ }
+
+ schema_dict = PyModule_GetDict(schema_mod);
+
+ if (schema_dict == NULL) {
+ DEBUG(0, ("Unable to get dictionary for schema module\n"));
+ return NULL;
+ }
+
+ schema_fn = PyDict_GetItemString(schema_dict, "ldb_with_schema");
+ if (schema_fn == NULL) {
+ PyErr_Print();
+ DEBUG(0, ("Unable to get schema_get_ldb function\n"));
+ return NULL;
+ }
+
+ parameters = PyDict_New();
+
+ setupdir = lp_setupdir(lp_ctx);
+ PyDict_SetItemString(parameters, "setup_dir",
+ PyString_FromString(setupdir));
+
+ py_result = PyEval_CallObjectWithKeywords(schema_fn, NULL, parameters);
+
+ Py_DECREF(parameters);
+
+ if (py_result == NULL) {
+ PyErr_Print();
+ PyErr_Clear();
+ return NULL;
+ }
+
+ return PyLdb_AsLdbContext(PyObject_GetAttrString(py_result, "ldb"));
+}
from samba import Ldb
from samba.ndr import ndr_pack
from ldb import SCOPE_SUBTREE, SCOPE_ONELEVEL, SCOPE_BASE
+import os
def get_schema_descriptor(domain_sid):
sddl = "O:SAG:SAD:(A;CI;RPLCLORC;;;AU)(A;CI;RPWPCRCCLCLORCWOWDSW;;;SA)" \
return attributes
+def ldb_with_schema(setup_dir=None, schemadn="cn=schema,cn=configuration,dc=example,dc=com",
+ serverdn="cn=server,cn=servers,cn=default-first-site-name,cn=sites,cn=cn=configuration,dc=example,dc=com",
+ domainsid=None):
+ """Load schema for the SamDB from the AD schema files and samba4_schema.ldif
+
+ :param setup_dir: Setup path
+ :param schemadn: DN of the schema
+ :param serverdn: DN of the server
+
+ Returns the schema data loaded as an object, with .ldb being a
+ new ldb with the schema loaded. This allows certain tests to
+ operate without a remote or local schema.
+ """
+
+ def setup_path(file):
+ return os.path.join(setup_dir, file)
+
+ if domainsid is None:
+ domainsid = security.random_sid()
+ else:
+ domainsid = security.dom_sid(domainsid)
+ return Schema(setup_path, domainsid, schemadn=schemadn, serverdn=serverdn)