python3 port for provision.c
[metze/samba/wip.git] / source4 / param / provision.c
index fd97f69cb35d3653804b39ec17973c5360d86729..4dab31f5c20a0bbb077fb3de07d81a6f63b7d96e 100644 (file)
 */
 
 #include <Python.h>
+#include "python/py3compat.h"
+#include <ldb.h>
+#include <pyldb.h>
 #include "includes.h"
-#include "auth/auth.h"
-#include "ldb/include/ldb.h"
-#include "ldb_errors.h"
-#include "libcli/raw/libcliraw.h"
 #include "librpc/ndr/libndr.h"
-
-#include "param/param.h"
 #include "param/provision.h"
 #include "param/secrets.h"
-#include "lib/talloc/pytalloc.h"
-#include "librpc/rpc/pyrpc.h"
-#include "scripting/python/modules.h"
-#include "lib/ldb/pyldb.h"
+#include <pytalloc.h>
+#include "python/modules.h"
 #include "param/pyparam.h"
 #include "dynconfig/dynconfig.h"
 
 static PyObject *provision_module(void)
 {
-       PyObject *name = PyString_FromString("samba.provision");
+       PyObject *name = PyStr_FromString("samba.provision");
        if (name == NULL)
                return NULL;
        return PyImport_Import(name);
@@ -46,7 +41,7 @@ static PyObject *provision_module(void)
 
 static PyObject *schema_module(void)
 {
-       PyObject *name = PyString_FromString("samba.schema");
+       PyObject *name = PyStr_FromString("samba.schema");
        if (name == NULL)
                return NULL;
        return PyImport_Import(name);
@@ -54,7 +49,7 @@ static PyObject *schema_module(void)
 
 static PyObject *ldb_module(void)
 {
-       PyObject *name = PyString_FromString("ldb");
+       PyObject *name = PyStr_FromString("ldb");
        if (name == NULL)
                return NULL;
        return PyImport_Import(name);
@@ -90,7 +85,7 @@ NTSTATUS provision_bare(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx,
        DEBUG(0,("Provision for Become-DC test using python\n"));
 
        Py_Initialize();
-       py_update_path("bin"); /* FIXME: Can't assume this is always the case */
+       py_update_path(); /* Put the samba path at the start of sys.path */
 
        provision_mod = provision_module();
 
@@ -129,57 +124,52 @@ NTSTATUS provision_bare(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx,
        configfile = lpcfg_configfile(lp_ctx);
        if (configfile != NULL) {
                PyDict_SetItemString(parameters, "smbconf", 
-                                    PyString_FromString(configfile));
+                                    PyStr_FromString(configfile));
        }
 
        PyDict_SetItemString(parameters, "rootdn", 
-                                                PyString_FromString(settings->root_dn_str));
+                                                PyStr_FromString(settings->root_dn_str));
        if (settings->targetdir != NULL)
                PyDict_SetItemString(parameters, "targetdir", 
-                                                        PyString_FromString(settings->targetdir));
-       if (file_exist("setup/provision.smb.conf.dc")) {
-               PyDict_SetItemString(parameters, "setup_dir",
-                                    PyString_FromString("setup"));
-       } else {
-               PyDict_SetItemString(parameters, "setup_dir",
-                                    PyString_FromString(dyn_SETUPDIR));
-       }
+                                                        PyStr_FromString(settings->targetdir));
        PyDict_SetItemString(parameters, "hostname", 
-                                                PyString_FromString(settings->netbios_name));
+                                                PyStr_FromString(settings->netbios_name));
        PyDict_SetItemString(parameters, "domain", 
-                                                PyString_FromString(settings->domain));
+                                                PyStr_FromString(settings->domain));
        PyDict_SetItemString(parameters, "realm", 
-                                                PyString_FromString(settings->realm));
+                                                PyStr_FromString(settings->realm));
        if (settings->root_dn_str)
                PyDict_SetItemString(parameters, "rootdn", 
-                                    PyString_FromString(settings->root_dn_str));
+                                    PyStr_FromString(settings->root_dn_str));
 
        if (settings->domain_dn_str) 
                PyDict_SetItemString(parameters, "domaindn", 
-                                    PyString_FromString(settings->domain_dn_str));
+                                    PyStr_FromString(settings->domain_dn_str));
 
        if (settings->schema_dn_str) 
                PyDict_SetItemString(parameters, "schemadn", 
-                                    PyString_FromString(settings->schema_dn_str));
+                                    PyStr_FromString(settings->schema_dn_str));
        
        if (settings->config_dn_str) 
                PyDict_SetItemString(parameters, "configdn", 
-                                    PyString_FromString(settings->config_dn_str));
+                                    PyStr_FromString(settings->config_dn_str));
        
        if (settings->server_dn_str) 
                PyDict_SetItemString(parameters, "serverdn", 
-                                    PyString_FromString(settings->server_dn_str));
+                                    PyStr_FromString(settings->server_dn_str));
        
        if (settings->site_name) 
                PyDict_SetItemString(parameters, "sitename", 
-                                    PyString_FromString(settings->site_name));
+                                    PyStr_FromString(settings->site_name));
 
        PyDict_SetItemString(parameters, "machinepass", 
-                            PyString_FromString(settings->machine_password));
+                            PyStr_FromString(settings->machine_password));
 
        
        PyDict_SetItemString(parameters, "debuglevel", PyInt_FromLong(DEBUGLEVEL));
 
+       PyDict_SetItemString(parameters, "use_ntvfs", PyInt_FromLong(settings->use_ntvfs));
+
        py_result = PyEval_CallObjectWithKeywords(provision_fn, NULL, parameters);
 
        Py_DECREF(parameters);
@@ -190,7 +180,7 @@ NTSTATUS provision_bare(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx,
                return NT_STATUS_UNSUCCESSFUL;
        }
 
-       result->domaindn = talloc_strdup(mem_ctx, PyString_AsString(PyObject_GetAttrString(py_result, "domaindn")));
+       result->domaindn = talloc_strdup(mem_ctx, PyStr_AsString(PyObject_GetAttrString(py_result, "domaindn")));
 
        /* FIXME paths */
        py_lp_ctx = PyObject_GetAttrString(py_result, "lp");
@@ -199,7 +189,7 @@ NTSTATUS provision_bare(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx,
                return NT_STATUS_UNSUCCESSFUL;
        }
        result->lp_ctx = lpcfg_from_py_object(mem_ctx, py_lp_ctx);
-       result->samdb = PyLdb_AsLdbContext(PyObject_GetAttrString(py_result, "samdb"));
+       result->samdb = pyldb_Ldb_AsLdbContext(PyObject_GetAttrString(py_result, "samdb"));
 
        return NT_STATUS_OK;
 }
@@ -216,7 +206,7 @@ static PyObject *py_dom_sid_FromSid(struct dom_sid *sid)
        if (dom_sid_Type == NULL)
                return NULL;
 
-       return py_talloc_reference((PyTypeObject *)dom_sid_Type, sid);
+       return pytalloc_reference((PyTypeObject *)dom_sid_Type, sid);
 }
 
 NTSTATUS provision_store_self_join(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx,
@@ -228,12 +218,15 @@ NTSTATUS provision_store_self_join(TALLOC_CTX *mem_ctx, struct loadparm_context
        PyObject *provision_mod, *provision_dict, *provision_fn, *py_result, *parameters, *py_sid;
        struct ldb_context *ldb;
        TALLOC_CTX *tmp_mem = talloc_new(mem_ctx);
+
+       *error_string = NULL;
+
        if (!tmp_mem) {
                return NT_STATUS_NO_MEMORY;
        }
 
        /* Open the secrets database */
-       ldb = secrets_db_connect(tmp_mem, event_ctx, lp_ctx);
+       ldb = secrets_db_connect(tmp_mem, lp_ctx);
        if (!ldb) {
                *error_string
                        = talloc_asprintf(mem_ctx, 
@@ -253,7 +246,7 @@ NTSTATUS provision_store_self_join(TALLOC_CTX *mem_ctx, struct loadparm_context
        }
 
        Py_Initialize();
-       py_update_path("bin"); /* FIXME: Can't assume this is always the case */
+       py_update_path(); /* Put the samba path at the start of sys.path */
        provision_mod = provision_module();
 
        if (provision_mod == NULL) {
@@ -287,15 +280,15 @@ NTSTATUS provision_store_self_join(TALLOC_CTX *mem_ctx, struct loadparm_context
        PyDict_SetItemString(parameters, "secretsdb", 
                             PyLdb_FromLdbContext(ldb));
        PyDict_SetItemString(parameters, "domain", 
-                            PyString_FromString(settings->domain_name));
+                            PyStr_FromString(settings->domain_name));
        if (settings->realm != NULL) {
                PyDict_SetItemString(parameters, "realm",
-                                    PyString_FromString(settings->realm));
+                                    PyStr_FromString(settings->realm));
        }
        PyDict_SetItemString(parameters, "machinepass", 
-                            PyString_FromString(settings->machine_password));
+                            PyStr_FromString(settings->machine_password));
        PyDict_SetItemString(parameters, "netbiosname", 
-                            PyString_FromString(settings->netbios_name));
+                            PyStr_FromString(settings->netbios_name));
 
        py_sid = py_dom_sid_FromSid(settings->domain_sid);
        if (py_sid == NULL) {
@@ -343,16 +336,15 @@ failure:
 }
 
 
-struct ldb_context *provision_get_schema(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx,
+struct ldb_context *provision_get_schema(TALLOC_CTX *mem_ctx,
+                                        struct loadparm_context *lp_ctx,
+                                        const char *schema_dn,
                                         DATA_BLOB *override_prefixmap)
 {
-       const char *setupdir;
        PyObject *schema_mod, *schema_dict, *schema_fn, *py_result, *parameters;
        
-       DEBUG(0,("Schema for DRS tests using python\n"));
-
        Py_Initialize();
-       py_update_path("bin"); /* FIXME: Can't assume this is always the case */
+       py_update_path(); /* Put the samba path at the start of sys.path */
 
        schema_mod = schema_module();
 
@@ -378,12 +370,14 @@ struct ldb_context *provision_get_schema(TALLOC_CTX *mem_ctx, struct loadparm_co
        
        parameters = PyDict_New();
 
-       setupdir = lpcfg_setupdir(lp_ctx);
-       PyDict_SetItemString(parameters, "setup_dir", 
-                            PyString_FromString(setupdir));
+       if (schema_dn) {
+               PyDict_SetItemString(parameters, "schemadn",
+                                    PyStr_FromString(schema_dn));
+       }
+
        if (override_prefixmap) {
                PyDict_SetItemString(parameters, "override_prefixmap",
-                                    PyString_FromStringAndSize((const char *)override_prefixmap->data,
+                                    PyStr_FromStringAndSize((const char *)override_prefixmap->data,
                                                                override_prefixmap->length));
        }
 
@@ -397,5 +391,5 @@ struct ldb_context *provision_get_schema(TALLOC_CTX *mem_ctx, struct loadparm_co
                return NULL;
        }
 
-       return PyLdb_AsLdbContext(PyObject_GetAttrString(py_result, "ldb"));
+       return pyldb_Ldb_AsLdbContext(PyObject_GetAttrString(py_result, "ldb"));
 }