2 Unix SMB/CIFS implementation.
3 Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007
4 Copyright (C) Matthias Dieter Wallnöfer 2009
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "ldb_errors.h"
25 #include "param/param.h"
26 #include "auth/credentials/credentials.h"
27 #include "dsdb/samdb/samdb.h"
28 #include "lib/ldb-samba/ldif_handlers.h"
29 #include "librpc/ndr/libndr.h"
31 #include "lib/ldb/pyldb.h"
32 #include "libcli/util/pyerrors.h"
33 #include "libcli/security/security.h"
34 #include "auth/pyauth.h"
35 #include "param/pyparam.h"
36 #include "auth/credentials/pycredentials.h"
37 #include "lib/socket/netif.h"
38 #include "lib/socket/netif_proto.h"
40 /* FIXME: These should be in a header file somewhere, once we finish moving
41 * away from SWIG .. */
42 #define PyErr_LDB_OR_RAISE(py_ldb, ldb) \
43 /* if (!PyLdb_Check(py_ldb)) { \
44 PyErr_SetString(py_ldb_get_exception(), "Ldb connection object required"); \
47 ldb = PyLdb_AsLdbContext(py_ldb);
49 static void PyErr_SetLdbError(PyObject *error, int ret, struct ldb_context *ldb_ctx)
51 if (ret == LDB_ERR_PYTHON_EXCEPTION)
52 return; /* Python exception should already be set, just keep that */
54 PyErr_SetObject(error,
55 Py_BuildValue(discard_const_p(char, "(i,s)"), ret,
56 ldb_ctx == NULL?ldb_strerror(ret):ldb_errstring(ldb_ctx)));
59 static PyObject *py_ldb_get_exception(void)
61 PyObject *mod = PyImport_ImportModule("ldb");
65 return PyObject_GetAttrString(mod, "LdbError");
68 static PyObject *py_generate_random_str(PyObject *self, PyObject *args)
73 if (!PyArg_ParseTuple(args, "i", &len))
76 retstr = generate_random_str(NULL, len);
77 ret = PyString_FromString(retstr);
82 static PyObject *py_generate_random_password(PyObject *self, PyObject *args)
87 if (!PyArg_ParseTuple(args, "ii", &min, &max))
90 retstr = generate_random_password(NULL, min, max);
94 ret = PyString_FromString(retstr);
99 static PyObject *py_unix2nttime(PyObject *self, PyObject *args)
103 if (!PyArg_ParseTuple(args, "I", &t))
106 unix_to_nt_time(&nt, t);
108 return PyLong_FromLongLong((uint64_t)nt);
111 static PyObject *py_nttime2unix(PyObject *self, PyObject *args)
115 if (!PyArg_ParseTuple(args, "K", &nt))
118 t = nt_time_to_unix(nt);
120 return PyInt_FromLong((uint64_t)t);
123 static PyObject *py_nttime2string(PyObject *self, PyObject *args)
130 if (!PyArg_ParseTuple(args, "K", &nt))
132 tmp_ctx = talloc_new(NULL);
134 string = nt_time_string(tmp_ctx, nt);
135 ret = PyString_FromString(string);
137 talloc_free(tmp_ctx);
141 static PyObject *py_set_debug_level(PyObject *self, PyObject *args)
144 if (!PyArg_ParseTuple(args, "I", &level))
146 (DEBUGLEVEL) = level;
150 static PyObject *py_dsdb_set_schema_from_ldif(PyObject *self, PyObject *args)
155 struct ldb_context *ldb;
157 if (!PyArg_ParseTuple(args, "Oss", &py_ldb, &pf, &df))
160 PyErr_LDB_OR_RAISE(py_ldb, ldb);
162 result = dsdb_set_schema_from_ldif(ldb, pf, df);
163 PyErr_WERROR_IS_ERR_RAISE(result);
168 static PyObject *py_dsdb_write_prefixes_from_schema_to_ldb(PyObject *self, PyObject *args)
171 struct ldb_context *ldb;
173 struct dsdb_schema *schema;
175 if (!PyArg_ParseTuple(args, "O", &py_ldb))
178 PyErr_LDB_OR_RAISE(py_ldb, ldb);
180 schema = dsdb_get_schema(ldb, NULL);
182 PyErr_SetString(PyExc_RuntimeError, "Failed to set find a schema on ldb!\n");
186 result = dsdb_write_prefixes_from_schema_to_ldb(NULL, ldb, schema);
187 PyErr_WERROR_IS_ERR_RAISE(result);
192 static PyObject *py_dsdb_set_schema_from_ldb(PyObject *self, PyObject *args)
195 struct ldb_context *ldb;
196 PyObject *py_from_ldb;
197 struct ldb_context *from_ldb;
198 struct dsdb_schema *schema;
200 if (!PyArg_ParseTuple(args, "OO", &py_ldb, &py_from_ldb))
203 PyErr_LDB_OR_RAISE(py_ldb, ldb);
205 PyErr_LDB_OR_RAISE(py_from_ldb, from_ldb);
207 schema = dsdb_get_schema(from_ldb, NULL);
209 PyErr_SetString(PyExc_RuntimeError, "Failed to set find a schema on 'from' ldb!\n");
213 ret = dsdb_reference_schema(ldb, schema, true);
214 PyErr_LDB_ERROR_IS_ERR_RAISE(py_ldb_get_exception(), ret, ldb);
220 return the list of interface IPs we have configured
221 takes an loadparm context, returns a list of IPs in string form
223 Does not return addresses on 127.0.0.0/8
225 static PyObject *py_interface_ips(PyObject *self, PyObject *args)
231 struct loadparm_context *lp_ctx;
232 struct interface *ifaces;
236 if (!PyArg_ParseTuple(args, "Oi", &py_lp_ctx, &all_interfaces))
239 tmp_ctx = talloc_new(NULL);
241 lp_ctx = lp_from_py_object(NULL, py_lp_ctx); /* FIXME: leaky */
242 if (lp_ctx == NULL) {
243 PyErr_SetString(PyExc_TypeError, "Expected loadparm object");
244 talloc_free(tmp_ctx);
248 load_interfaces(tmp_ctx, lp_interfaces(lp_ctx), &ifaces);
250 count = iface_count(ifaces);
252 /* first count how many are not loopback addresses */
253 for (ifcount = i = 0; i<count; i++) {
254 const char *ip = iface_n_ip(ifaces, i);
255 if (!(!all_interfaces && iface_same_net(ip, "127.0.0.1", "255.0.0.0"))) {
260 pylist = PyList_New(ifcount);
261 for (ifcount = i = 0; i<count; i++) {
262 const char *ip = iface_n_ip(ifaces, i);
263 if (!(!all_interfaces && iface_same_net(ip, "127.0.0.1", "255.0.0.0"))) {
264 PyList_SetItem(pylist, ifcount, PyString_FromString(ip));
268 talloc_free(tmp_ctx);
273 static PyMethodDef py_misc_methods[] = {
274 { "generate_random_str", (PyCFunction)py_generate_random_str, METH_VARARGS,
275 "generate_random_str(len) -> string\n"
276 "Generate random string with specified length." },
277 { "generate_random_password", (PyCFunction)py_generate_random_password, METH_VARARGS,
278 "generate_random_password(min, max) -> string\n"
279 "Generate random password with a length >= min and <= max." },
280 { "unix2nttime", (PyCFunction)py_unix2nttime, METH_VARARGS,
281 "unix2nttime(timestamp) -> nttime" },
282 { "nttime2unix", (PyCFunction)py_nttime2unix, METH_VARARGS,
283 "nttime2unix(nttime) -> timestamp" },
284 { "nttime2string", (PyCFunction)py_nttime2string, METH_VARARGS,
285 "nttime2string(nttime) -> string" },
286 { "dsdb_set_schema_from_ldif", (PyCFunction)py_dsdb_set_schema_from_ldif, METH_VARARGS,
288 { "dsdb_write_prefixes_from_schema_to_ldb", (PyCFunction)py_dsdb_write_prefixes_from_schema_to_ldb, METH_VARARGS,
290 { "dsdb_set_schema_from_ldb", (PyCFunction)py_dsdb_set_schema_from_ldb, METH_VARARGS,
292 { "set_debug_level", (PyCFunction)py_set_debug_level, METH_VARARGS,
294 { "interface_ips", (PyCFunction)py_interface_ips, METH_VARARGS,
295 "get interface IP address list"},
303 debug_setup_talloc_log();
305 m = Py_InitModule3("_glue", py_misc_methods,
306 "Python bindings for miscellaneous Samba functions.");
310 PyModule_AddObject(m, "version", PyString_FromString(SAMBA_VERSION_STRING));
312 /* one of the most annoying things about python scripts is
313 that they don't die when you hit control-C. This fixes that
314 sillyness. As we do all database operations using
315 transactions, this is also safe. In fact, not dying
316 immediately is unsafe as we could end up treating the
317 control-C exception as a different error and try to modify
318 as database incorrectly
320 signal(SIGINT, SIG_DFL);