diff options
author | bubulle <bubulle@alioth.debian.org> | 2012-01-26 19:58:37 +0000 |
---|---|---|
committer | bubulle <bubulle@alioth.debian.org> | 2012-01-26 19:58:37 +0000 |
commit | cb25bc5ca98dff7a896f596f9f1586a4739ad8ec (patch) | |
tree | 31bd310956a0c533e3e46cb88aec6e00b5eedf53 /source4/scripting/python/pyglue.c | |
parent | 5f021ee1efe415ba8fe4281d0622204a68074ea8 (diff) | |
download | samba-cb25bc5ca98dff7a896f596f9f1586a4739ad8ec.tar.gz |
Load samba-3.6.2 into branches/samba/upstream.upstream/3.6.2
git-svn-id: svn://svn.debian.org/svn/pkg-samba/branches/samba/upstream@3992 fc4039ab-9d04-0410-8cac-899223bdd6b0
Diffstat (limited to 'source4/scripting/python/pyglue.c')
-rw-r--r-- | source4/scripting/python/pyglue.c | 540 |
1 files changed, 103 insertions, 437 deletions
diff --git a/source4/scripting/python/pyglue.c b/source4/scripting/python/pyglue.c index 753f2df464..f89785f971 100644 --- a/source4/scripting/python/pyglue.c +++ b/source4/scripting/python/pyglue.c @@ -17,55 +17,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <Python.h> #include "includes.h" -#include "ldb.h" -#include "ldb_errors.h" -#include "ldb_wrap.h" -#include "param/param.h" -#include "auth/credentials/credentials.h" -#include "dsdb/samdb/samdb.h" -#include "lib/ldb-samba/ldif_handlers.h" -#include "librpc/ndr/libndr.h" #include "version.h" -#include <Python.h> -#include "lib/ldb/pyldb.h" -#include "libcli/util/pyerrors.h" -#include "libcli/security/security.h" -#include "auth/pyauth.h" #include "param/pyparam.h" -#include "auth/credentials/pycredentials.h" - -#ifndef Py_RETURN_NONE -#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None -#endif - -/* FIXME: These should be in a header file somewhere, once we finish moving - * away from SWIG .. */ -#define PyErr_LDB_OR_RAISE(py_ldb, ldb) \ -/* if (!PyLdb_Check(py_ldb)) { \ - PyErr_SetString(py_ldb_get_exception(), "Ldb connection object required"); \ - return NULL; \ - } */\ - ldb = PyLdb_AsLdbContext(py_ldb); - -static void PyErr_SetLdbError(PyObject *error, int ret, struct ldb_context *ldb_ctx) -{ - if (ret == LDB_ERR_PYTHON_EXCEPTION) - return; /* Python exception should already be set, just keep that */ - - PyErr_SetObject(error, - Py_BuildValue(discard_const_p(char, "(i,s)"), ret, - ldb_ctx == NULL?ldb_strerror(ret):ldb_errstring(ldb_ctx))); -} +#include "lib/socket/netif.h" -static PyObject *py_ldb_get_exception(void) -{ - PyObject *mod = PyImport_ImportModule("ldb"); - if (mod == NULL) - return NULL; - - return PyObject_GetAttrString(mod, "LdbError"); -} +void init_glue(void); static PyObject *py_generate_random_str(PyObject *self, PyObject *args) { @@ -81,473 +39,181 @@ static PyObject *py_generate_random_str(PyObject *self, PyObject *args) return ret; } -static PyObject *py_unix2nttime(PyObject *self, PyObject *args) -{ - time_t t; - NTTIME nt; - if (!PyArg_ParseTuple(args, "I", &t)) - return NULL; - - unix_to_nt_time(&nt, t); - - return PyInt_FromLong((uint64_t)nt); -} - -static PyObject *py_set_debug_level(PyObject *self, PyObject *args) -{ - unsigned level; - if (!PyArg_ParseTuple(args, "I", &level)) - return NULL; - (DEBUGLEVEL) = level; - Py_RETURN_NONE; -} - -static PyObject *py_ldb_set_credentials(PyObject *self, PyObject *args) -{ - PyObject *py_creds, *py_ldb; - struct cli_credentials *creds; - struct ldb_context *ldb; - if (!PyArg_ParseTuple(args, "OO", &py_ldb, &py_creds)) - return NULL; - - PyErr_LDB_OR_RAISE(py_ldb, ldb); - - creds = cli_credentials_from_py_object(py_creds); - if (creds == NULL) { - PyErr_SetString(PyExc_TypeError, "Expected credentials object"); - return NULL; - } - - ldb_set_opaque(ldb, "credentials", creds); - - Py_RETURN_NONE; -} - -static PyObject *py_ldb_set_loadparm(PyObject *self, PyObject *args) +static PyObject *py_generate_random_password(PyObject *self, PyObject *args) { - PyObject *py_lp_ctx, *py_ldb; - struct loadparm_context *lp_ctx; - struct ldb_context *ldb; - if (!PyArg_ParseTuple(args, "OO", &py_ldb, &py_lp_ctx)) - return NULL; - - PyErr_LDB_OR_RAISE(py_ldb, ldb); - - lp_ctx = lp_from_py_object(py_lp_ctx); - if (lp_ctx == NULL) { - PyErr_SetString(PyExc_TypeError, "Expected loadparm object"); - return NULL; - } - - ldb_set_opaque(ldb, "loadparm", lp_ctx); - - Py_RETURN_NONE; -} - - -static PyObject *py_ldb_set_session_info(PyObject *self, PyObject *args) -{ - PyObject *py_session_info, *py_ldb; - struct auth_session_info *info; - struct ldb_context *ldb; - if (!PyArg_ParseTuple(args, "OO", &py_ldb, &py_session_info)) - return NULL; - - PyErr_LDB_OR_RAISE(py_ldb, ldb); - /*if (!PyAuthSession_Check(py_session_info)) { - PyErr_SetString(PyExc_TypeError, "Expected session info object"); - return NULL; - }*/ - - info = PyAuthSession_AsSession(py_session_info); - - ldb_set_opaque(ldb, "sessionInfo", info); - - Py_RETURN_NONE; -} - -static PyObject *py_ldb_set_utf8_casefold(PyObject *self, PyObject *args) -{ - PyObject *py_ldb; - struct ldb_context *ldb; - - if (!PyArg_ParseTuple(args, "O", &py_ldb)) - return NULL; - - PyErr_LDB_OR_RAISE(py_ldb, ldb); - - ldb_set_utf8_fns(ldb, NULL, wrap_casefold); - - Py_RETURN_NONE; -} - -static PyObject *py_samdb_set_domain_sid(PyLdbObject *self, PyObject *args) -{ - PyObject *py_ldb, *py_sid; - struct ldb_context *ldb; - struct dom_sid *sid; - bool ret; - - if (!PyArg_ParseTuple(args, "OO", &py_ldb, &py_sid)) - return NULL; - - PyErr_LDB_OR_RAISE(py_ldb, ldb); - - sid = dom_sid_parse_talloc(NULL, PyString_AsString(py_sid)); - - ret = samdb_set_domain_sid(ldb, sid); - if (!ret) { - PyErr_SetString(PyExc_RuntimeError, "set_domain_sid failed"); - return NULL; - } - Py_RETURN_NONE; -} - -static PyObject *py_samdb_get_domain_sid(PyLdbObject *self, PyObject *args) -{ - PyObject *py_ldb; - struct ldb_context *ldb; - const struct dom_sid *sid; + int min, max; PyObject *ret; char *retstr; - - if (!PyArg_ParseTuple(args, "O", &py_ldb)) + if (!PyArg_ParseTuple(args, "ii", &min, &max)) return NULL; - - PyErr_LDB_OR_RAISE(py_ldb, ldb); - sid = samdb_domain_sid(ldb); - if (!sid) { - PyErr_SetString(PyExc_RuntimeError, "samdb_domain_sid failed"); + retstr = generate_random_password(NULL, min, max); + if (retstr == NULL) { return NULL; - } - retstr = dom_sid_string(NULL, sid); + } ret = PyString_FromString(retstr); talloc_free(retstr); return ret; } -static PyObject *py_ldb_register_samba_handlers(PyObject *self, PyObject *args) +static PyObject *py_unix2nttime(PyObject *self, PyObject *args) { - PyObject *py_ldb; - struct ldb_context *ldb; - int ret; - - if (!PyArg_ParseTuple(args, "O", &py_ldb)) + time_t t; + NTTIME nt; + if (!PyArg_ParseTuple(args, "I", &t)) return NULL; - PyErr_LDB_OR_RAISE(py_ldb, ldb); - ret = ldb_register_samba_handlers(ldb); + unix_to_nt_time(&nt, t); - PyErr_LDB_ERROR_IS_ERR_RAISE(py_ldb_get_exception(), ret, ldb); - Py_RETURN_NONE; + return PyLong_FromLongLong((uint64_t)nt); } -static PyObject *py_dsdb_set_ntds_invocation_id(PyObject *self, PyObject *args) +static PyObject *py_nttime2unix(PyObject *self, PyObject *args) { - PyObject *py_ldb, *py_guid; - bool ret; - struct GUID guid; - struct ldb_context *ldb; - if (!PyArg_ParseTuple(args, "OO", &py_ldb, &py_guid)) + time_t t; + NTTIME nt; + if (!PyArg_ParseTuple(args, "K", &nt)) return NULL; - PyErr_LDB_OR_RAISE(py_ldb, ldb); - GUID_from_string(PyString_AsString(py_guid), &guid); + t = nt_time_to_unix(nt); - ret = samdb_set_ntds_invocation_id(ldb, &guid); - if (!ret) { - PyErr_SetString(PyExc_RuntimeError, "set_ntds_invocation_id failed"); - return NULL; - } - Py_RETURN_NONE; + return PyInt_FromLong((uint64_t)t); } -static PyObject *py_dsdb_set_opaque_integer(PyObject *self, PyObject *args) +static PyObject *py_nttime2string(PyObject *self, PyObject *args) { - PyObject *py_ldb; - int value; - int *old_val, *new_val; - char *py_opaque_name, *opaque_name_talloc; - struct ldb_context *ldb; + PyObject *ret; + NTTIME nt; TALLOC_CTX *tmp_ctx; - - if (!PyArg_ParseTuple(args, "Osi", &py_ldb, &py_opaque_name, &value)) + const char *string; + if (!PyArg_ParseTuple(args, "K", &nt)) return NULL; - PyErr_LDB_OR_RAISE(py_ldb, ldb); - - /* see if we have a cached copy */ - old_val = (int *)ldb_get_opaque(ldb, - py_opaque_name); - - if (old_val) { - *old_val = value; - Py_RETURN_NONE; - } - - tmp_ctx = talloc_new(ldb); + tmp_ctx = talloc_new(NULL); if (tmp_ctx == NULL) { - goto failed; - } - - new_val = talloc(tmp_ctx, int); - if (!new_val) { - goto failed; - } - - opaque_name_talloc = talloc_strdup(tmp_ctx, py_opaque_name); - if (!opaque_name_talloc) { - goto failed; + PyErr_NoMemory(); + return NULL; } - - *new_val = value; - /* cache the domain_sid in the ldb */ - if (ldb_set_opaque(ldb, opaque_name_talloc, new_val) != LDB_SUCCESS) { - goto failed; - } + string = nt_time_string(tmp_ctx, nt); + ret = PyString_FromString(string); - talloc_steal(ldb, new_val); - talloc_steal(ldb, opaque_name_talloc); talloc_free(tmp_ctx); - Py_RETURN_NONE; - -failed: - talloc_free(tmp_ctx); - PyErr_SetString(PyExc_RuntimeError, "Failed to set opaque integer into the ldb!\n"); - return NULL; + return ret; } -static PyObject *py_dsdb_set_global_schema(PyObject *self, PyObject *args) +static PyObject *py_set_debug_level(PyObject *self, PyObject *args) { - PyObject *py_ldb; - struct ldb_context *ldb; - int ret; - if (!PyArg_ParseTuple(args, "O", &py_ldb)) + unsigned level; + if (!PyArg_ParseTuple(args, "I", &level)) return NULL; - - PyErr_LDB_OR_RAISE(py_ldb, ldb); - - ret = dsdb_set_global_schema(ldb); - PyErr_LDB_ERROR_IS_ERR_RAISE(py_ldb_get_exception(), ret, ldb); - + (DEBUGLEVEL) = level; Py_RETURN_NONE; } -static PyObject *py_dsdb_set_schema_from_ldif(PyObject *self, PyObject *args) +static PyObject *py_get_debug_level(PyObject *self) { - WERROR result; - char *pf, *df; - PyObject *py_ldb; - struct ldb_context *ldb; - - if (!PyArg_ParseTuple(args, "Oss", &py_ldb, &pf, &df)) - return NULL; - - PyErr_LDB_OR_RAISE(py_ldb, ldb); - - result = dsdb_set_schema_from_ldif(ldb, pf, df); - PyErr_WERROR_IS_ERR_RAISE(result); - - Py_RETURN_NONE; + return PyInt_FromLong(DEBUGLEVEL); } -static PyObject *py_dsdb_convert_schema_to_openldap(PyObject *self, PyObject *args) -{ - char *target_str, *mapping; - PyObject *py_ldb; - struct ldb_context *ldb; - PyObject *ret; - char *retstr; - - if (!PyArg_ParseTuple(args, "Oss", &py_ldb, &target_str, &mapping)) - return NULL; - - PyErr_LDB_OR_RAISE(py_ldb, ldb); - - retstr = dsdb_convert_schema_to_openldap(ldb, target_str, mapping); - if (!retstr) { - PyErr_SetString(PyExc_RuntimeError, "dsdb_convert_schema_to_openldap failed"); - return NULL; - } - ret = PyString_FromString(retstr); - talloc_free(retstr); - return ret; -} +/* + return the list of interface IPs we have configured + takes an loadparm context, returns a list of IPs in string form -static PyObject *py_dsdb_write_prefixes_from_schema_to_ldb(PyObject *self, PyObject *args) + Does not return addresses on 127.0.0.0/8 + */ +static PyObject *py_interface_ips(PyObject *self, PyObject *args) { - PyObject *py_ldb; - struct ldb_context *ldb; - WERROR result; - struct dsdb_schema *schema; + PyObject *pylist; + int count; + TALLOC_CTX *tmp_ctx; + PyObject *py_lp_ctx; + struct loadparm_context *lp_ctx; + struct interface *ifaces; + int i, ifcount; + int all_interfaces; - if (!PyArg_ParseTuple(args, "O", &py_ldb)) + if (!PyArg_ParseTuple(args, "Oi", &py_lp_ctx, &all_interfaces)) return NULL; - PyErr_LDB_OR_RAISE(py_ldb, ldb); - - schema = dsdb_get_schema(ldb); - if (!schema) { - PyErr_SetString(PyExc_RuntimeError, "Failed to set find a schema on ldb!\n"); + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == NULL) { + PyErr_NoMemory(); return NULL; } - result = dsdb_write_prefixes_from_schema_to_ldb(NULL, ldb, schema); - PyErr_WERROR_IS_ERR_RAISE(result); - - Py_RETURN_NONE; -} - -static PyObject *py_dsdb_set_schema_from_ldb(PyObject *self, PyObject *args) -{ - PyObject *py_ldb; - struct ldb_context *ldb; - PyObject *py_from_ldb; - struct ldb_context *from_ldb; - struct dsdb_schema *schema; - int ret; - if (!PyArg_ParseTuple(args, "OO", &py_ldb, &py_from_ldb)) - return NULL; - - PyErr_LDB_OR_RAISE(py_ldb, ldb); - - PyErr_LDB_OR_RAISE(py_from_ldb, from_ldb); - - schema = dsdb_get_schema(from_ldb); - if (!schema) { - PyErr_SetString(PyExc_RuntimeError, "Failed to set find a schema on 'from' ldb!\n"); + lp_ctx = lpcfg_from_py_object(tmp_ctx, py_lp_ctx); + if (lp_ctx == NULL) { + talloc_free(tmp_ctx); return NULL; } - ret = dsdb_reference_schema(ldb, schema, true); - PyErr_LDB_ERROR_IS_ERR_RAISE(py_ldb_get_exception(), ret, ldb); + load_interfaces(tmp_ctx, lpcfg_interfaces(lp_ctx), &ifaces); - Py_RETURN_NONE; -} + count = iface_count(ifaces); -static PyObject *py_dom_sid_to_rid(PyLdbObject *self, PyObject *args) -{ - PyObject *py_sid; - struct dom_sid *sid; - uint32_t rid; - NTSTATUS status; - - if(!PyArg_ParseTuple(args, "O", &py_sid)) - return NULL; - - sid = dom_sid_parse_talloc(NULL, PyString_AsString(py_sid)); - - status = dom_sid_split_rid(NULL, sid, NULL, &rid); - if (!NT_STATUS_IS_OK(status)) { - PyErr_SetString(PyExc_RuntimeError, "dom_sid_split_rid failed"); - return NULL; + /* first count how many are not loopback addresses */ + for (ifcount = i = 0; i<count; i++) { + const char *ip = iface_n_ip(ifaces, i); + if (!(!all_interfaces && iface_same_net(ip, "127.0.0.1", "255.0.0.0"))) { + ifcount++; + } } - return PyInt_FromLong(rid); + pylist = PyList_New(ifcount); + for (ifcount = i = 0; i<count; i++) { + const char *ip = iface_n_ip(ifaces, i); + if (!(!all_interfaces && iface_same_net(ip, "127.0.0.1", "255.0.0.0"))) { + PyList_SetItem(pylist, ifcount, PyString_FromString(ip)); + ifcount++; + } + } + talloc_free(tmp_ctx); + return pylist; } static PyMethodDef py_misc_methods[] = { { "generate_random_str", (PyCFunction)py_generate_random_str, METH_VARARGS, - "random_password(len) -> string\n" - "Generate random password with specified length." }, + "generate_random_str(len) -> string\n" + "Generate random string with specified length." }, + { "generate_random_password", (PyCFunction)py_generate_random_password, + METH_VARARGS, "generate_random_password(min, max) -> string\n" + "Generate random password with a length >= min and <= max." }, { "unix2nttime", (PyCFunction)py_unix2nttime, METH_VARARGS, "unix2nttime(timestamp) -> nttime" }, - { "ldb_set_credentials", (PyCFunction)py_ldb_set_credentials, METH_VARARGS, - "ldb_set_credentials(ldb, credentials) -> None\n" - "Set credentials to use when connecting." }, - { "ldb_set_session_info", (PyCFunction)py_ldb_set_session_info, METH_VARARGS, - "ldb_set_session_info(ldb, session_info)\n" - "Set session info to use when connecting." }, - { "ldb_set_loadparm", (PyCFunction)py_ldb_set_loadparm, METH_VARARGS, - "ldb_set_loadparm(ldb, session_info)\n" - "Set loadparm context to use when connecting." }, - { "samdb_set_domain_sid", (PyCFunction)py_samdb_set_domain_sid, METH_VARARGS, - "samdb_set_domain_sid(samdb, sid)\n" - "Set SID of domain to use." }, - { "samdb_get_domain_sid", (PyCFunction)py_samdb_get_domain_sid, METH_VARARGS, - "samdb_get_domain_sid(samdb)\n" - "Get SID of domain in use." }, - { "ldb_register_samba_handlers", (PyCFunction)py_ldb_register_samba_handlers, METH_VARARGS, - "ldb_register_samba_handlers(ldb)\n" - "Register Samba-specific LDB modules and schemas." }, - { "ldb_set_utf8_casefold", (PyCFunction)py_ldb_set_utf8_casefold, METH_VARARGS, - "ldb_set_utf8_casefold(ldb)\n" - "Set the right Samba casefolding function for UTF8 charset." }, - { "dsdb_set_ntds_invocation_id", (PyCFunction)py_dsdb_set_ntds_invocation_id, METH_VARARGS, - NULL }, - { "dsdb_set_opaque_integer", (PyCFunction)py_dsdb_set_opaque_integer, METH_VARARGS, - NULL }, - { "dsdb_set_global_schema", (PyCFunction)py_dsdb_set_global_schema, METH_VARARGS, - NULL }, - { "dsdb_set_schema_from_ldif", (PyCFunction)py_dsdb_set_schema_from_ldif, METH_VARARGS, - NULL }, - { "dsdb_write_prefixes_from_schema_to_ldb", (PyCFunction)py_dsdb_write_prefixes_from_schema_to_ldb, METH_VARARGS, - NULL }, - { "dsdb_set_schema_from_ldb", (PyCFunction)py_dsdb_set_schema_from_ldb, METH_VARARGS, - NULL }, - { "dsdb_convert_schema_to_openldap", (PyCFunction)py_dsdb_convert_schema_to_openldap, METH_VARARGS, - NULL }, - { "dom_sid_to_rid", (PyCFunction)py_dom_sid_to_rid, METH_VARARGS, - NULL }, + { "nttime2unix", (PyCFunction)py_nttime2unix, METH_VARARGS, + "nttime2unix(nttime) -> timestamp" }, + { "nttime2string", (PyCFunction)py_nttime2string, METH_VARARGS, + "nttime2string(nttime) -> string" }, { "set_debug_level", (PyCFunction)py_set_debug_level, METH_VARARGS, "set debug level" }, + { "get_debug_level", (PyCFunction)py_get_debug_level, METH_NOARGS, + "get debug level" }, + { "interface_ips", (PyCFunction)py_interface_ips, METH_VARARGS, + "get interface IP address list"}, { NULL } }; -void initglue(void) +void init_glue(void) { PyObject *m; - m = Py_InitModule3("glue", py_misc_methods, + debug_setup_talloc_log(); + + m = Py_InitModule3("_glue", py_misc_methods, "Python bindings for miscellaneous Samba functions."); if (m == NULL) return; - PyModule_AddObject(m, "version", PyString_FromString(SAMBA_VERSION_STRING)); - - /* "userAccountControl" flags */ - PyModule_AddObject(m, "UF_NORMAL_ACCOUNT", PyInt_FromLong(UF_NORMAL_ACCOUNT)); - PyModule_AddObject(m, "UF_TEMP_DUPLICATE_ACCOUNT", PyInt_FromLong(UF_TEMP_DUPLICATE_ACCOUNT)); - PyModule_AddObject(m, "UF_SERVER_TRUST_ACCOUNT", PyInt_FromLong(UF_SERVER_TRUST_ACCOUNT)); - PyModule_AddObject(m, "UF_WORKSTATION_TRUST_ACCOUNT", PyInt_FromLong(UF_WORKSTATION_TRUST_ACCOUNT)); - PyModule_AddObject(m, "UF_INTERDOMAIN_TRUST_ACCOUNT", PyInt_FromLong(UF_INTERDOMAIN_TRUST_ACCOUNT)); - PyModule_AddObject(m, "UF_PASSWD_NOTREQD", PyInt_FromLong(UF_PASSWD_NOTREQD)); - PyModule_AddObject(m, "UF_ACCOUNTDISABLE", PyInt_FromLong(UF_ACCOUNTDISABLE)); - - /* "groupType" flags */ - PyModule_AddObject(m, "GTYPE_SECURITY_BUILTIN_LOCAL_GROUP", PyInt_FromLong(GTYPE_SECURITY_BUILTIN_LOCAL_GROUP)); - PyModule_AddObject(m, "GTYPE_SECURITY_GLOBAL_GROUP", PyInt_FromLong(GTYPE_SECURITY_GLOBAL_GROUP)); - PyModule_AddObject(m, "GTYPE_SECURITY_DOMAIN_LOCAL_GROUP", PyInt_FromLong(GTYPE_SECURITY_DOMAIN_LOCAL_GROUP)); - PyModule_AddObject(m, "GTYPE_SECURITY_UNIVERSAL_GROUP", PyInt_FromLong(GTYPE_SECURITY_UNIVERSAL_GROUP)); - PyModule_AddObject(m, "GTYPE_DISTRIBUTION_GLOBAL_GROUP", PyInt_FromLong(GTYPE_DISTRIBUTION_GLOBAL_GROUP)); - PyModule_AddObject(m, "GTYPE_DISTRIBUTION_DOMAIN_LOCAL_GROUP", PyInt_FromLong(GTYPE_DISTRIBUTION_DOMAIN_LOCAL_GROUP)); - PyModule_AddObject(m, "GTYPE_DISTRIBUTION_UNIVERSAL_GROUP", PyInt_FromLong(GTYPE_DISTRIBUTION_UNIVERSAL_GROUP)); - - /* "sAMAccountType" flags */ - PyModule_AddObject(m, "ATYPE_NORMAL_ACCOUNT", PyInt_FromLong(ATYPE_NORMAL_ACCOUNT)); - PyModule_AddObject(m, "ATYPE_WORKSTATION_TRUST", PyInt_FromLong(ATYPE_WORKSTATION_TRUST)); - PyModule_AddObject(m, "ATYPE_INTERDOMAIN_TRUST", PyInt_FromLong(ATYPE_INTERDOMAIN_TRUST)); - PyModule_AddObject(m, "ATYPE_SECURITY_GLOBAL_GROUP", PyInt_FromLong(ATYPE_SECURITY_GLOBAL_GROUP)); - PyModule_AddObject(m, "ATYPE_SECURITY_LOCAL_GROUP", PyInt_FromLong(ATYPE_SECURITY_LOCAL_GROUP)); - PyModule_AddObject(m, "ATYPE_SECURITY_UNIVERSAL_GROUP", PyInt_FromLong(ATYPE_SECURITY_UNIVERSAL_GROUP)); - PyModule_AddObject(m, "ATYPE_DISTRIBUTION_GLOBAL_GROUP", PyInt_FromLong(ATYPE_DISTRIBUTION_GLOBAL_GROUP)); - PyModule_AddObject(m, "ATYPE_DISTRIBUTION_LOCAL_GROUP", PyInt_FromLong(ATYPE_DISTRIBUTION_LOCAL_GROUP)); - PyModule_AddObject(m, "ATYPE_DISTRIBUTION_UNIVERSAL_GROUP", PyInt_FromLong(ATYPE_DISTRIBUTION_UNIVERSAL_GROUP)); - - /* "domainFunctionality", "forestFunctionality" flags in the rootDSE */ - PyModule_AddObject(m, "DS_DOMAIN_FUNCTION_2000", PyInt_FromLong(DS_DOMAIN_FUNCTION_2000)); - PyModule_AddObject(m, "DS_DOMAIN_FUNCTION_2003_MIXED", PyInt_FromLong(DS_DOMAIN_FUNCTION_2003_MIXED)); - PyModule_AddObject(m, "DS_DOMAIN_FUNCTION_2003", PyInt_FromLong(DS_DOMAIN_FUNCTION_2003)); - PyModule_AddObject(m, "DS_DOMAIN_FUNCTION_2008", PyInt_FromLong(DS_DOMAIN_FUNCTION_2008)); - PyModule_AddObject(m, "DS_DOMAIN_FUNCTION_2008_R2", PyInt_FromLong(DS_DOMAIN_FUNCTION_2008_R2)); - - /* "domainControllerFunctionality" flags in the rootDSE */ - PyModule_AddObject(m, "DS_DC_FUNCTION_2000", PyInt_FromLong(DS_DC_FUNCTION_2000)); - PyModule_AddObject(m, "DS_DC_FUNCTION_2003", PyInt_FromLong(DS_DC_FUNCTION_2003)); - PyModule_AddObject(m, "DS_DC_FUNCTION_2008", PyInt_FromLong(DS_DC_FUNCTION_2008)); - PyModule_AddObject(m, "DS_DC_FUNCTION_2008_R2", PyInt_FromLong(DS_DC_FUNCTION_2008_R2)); + PyModule_AddObject(m, "version", + PyString_FromString(SAMBA_VERSION_STRING)); + + /* one of the most annoying things about python scripts is + that they don't die when you hit control-C. This fixes that + sillyness. As we do all database operations using + transactions, this is also safe. + */ + signal(SIGINT, SIG_DFL); } |