• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt/router/samba-3.0.25b/source/python/
1/*
2   Python wrappers for DCERPC/SMB client routines.
3
4   Copyright (C) Tim Potter, 2003
5
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 2 of the License, or
9   (at your option) any later version.
10
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.
15
16   You should have received a copy of the GNU General Public License
17   along with this program; if not, write to the Free Software
18   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include "python/py_srvsvc.h"
22
23/* Exceptions this module can raise */
24
25PyObject *srvsvc_error, *srvsvc_werror;
26
27static struct const_vals {
28	char *name;
29	uint32 value;
30} module_const_vals[] = {
31	{ "SV_TYPE_WORKSTATION", SV_TYPE_WORKSTATION },
32	{ "SV_TYPE_SERVER", SV_TYPE_SERVER },
33	{ "SV_TYPE_SQLSERVER", SV_TYPE_SQLSERVER },
34	{ "SV_TYPE_DOMAIN_CTRL", SV_TYPE_DOMAIN_CTRL },
35	{ "SV_TYPE_DOMAIN_BAKCTRL", SV_TYPE_DOMAIN_BAKCTRL },
36	{ "SV_TYPE_TIME_SOURCE", SV_TYPE_TIME_SOURCE },
37	{ "SV_TYPE_AFP", SV_TYPE_AFP },
38	{ "SV_TYPE_NOVELL", SV_TYPE_NOVELL },
39	{ "SV_TYPE_DOMAIN_MEMBER", SV_TYPE_DOMAIN_MEMBER },
40	{ "SV_TYPE_PRINTQ_SERVER", SV_TYPE_PRINTQ_SERVER },
41	{ "SV_TYPE_DIALIN_SERVER", SV_TYPE_DIALIN_SERVER },
42	{ "SV_TYPE_SERVER_UNIX", SV_TYPE_SERVER_UNIX },
43	{ "SV_TYPE_NT", SV_TYPE_NT },
44	{ "SV_TYPE_WFW", SV_TYPE_WFW },
45	{ "SV_TYPE_SERVER_MFPN", SV_TYPE_SERVER_MFPN },
46	{ "SV_TYPE_SERVER_NT", SV_TYPE_SERVER_NT },
47	{ "SV_TYPE_POTENTIAL_BROWSER", SV_TYPE_POTENTIAL_BROWSER },
48	{ "SV_TYPE_BACKUP_BROWSER", SV_TYPE_BACKUP_BROWSER },
49	{ "SV_TYPE_MASTER_BROWSER", SV_TYPE_MASTER_BROWSER },
50	{ "SV_TYPE_DOMAIN_MASTER", SV_TYPE_DOMAIN_MASTER },
51	{ "SV_TYPE_SERVER_OSF", SV_TYPE_SERVER_OSF },
52	{ "SV_TYPE_SERVER_VMS", SV_TYPE_SERVER_VMS },
53	{ "SV_TYPE_WIN95_PLUS", SV_TYPE_WIN95_PLUS },
54	{ "SV_TYPE_DFS_SERVER", SV_TYPE_DFS_SERVER },
55	{ "SV_TYPE_ALTERNATE_XPORT", SV_TYPE_ALTERNATE_XPORT },
56	{ "SV_TYPE_LOCAL_LIST_ONLY", SV_TYPE_LOCAL_LIST_ONLY },
57	{ "SV_TYPE_DOMAIN_ENUM", SV_TYPE_DOMAIN_ENUM },
58	{ NULL },
59};
60
61static void const_init(PyObject *dict)
62{
63	struct const_vals *tmp;
64	PyObject *obj;
65
66	for (tmp = module_const_vals; tmp->name; tmp++) {
67		obj = PyInt_FromLong(tmp->value);
68		PyDict_SetItemString(dict, tmp->name, obj);
69		Py_DECREF(obj);
70	}
71}
72
73/* NetServerGetInfo */
74
75PyObject *srvsvc_netservergetinfo(PyObject *self, PyObject *args,
76				  PyObject *kw)
77{
78	static char *kwlist[] = { "server", "level", "creds", NULL };
79	char *unc_name, *server, *errstr;
80	PyObject *creds = NULL, *result = NULL;
81	struct cli_state *cli;
82	TALLOC_CTX *mem_ctx = NULL;
83	uint32 level;
84	SRV_INFO_CTR ctr;
85	WERROR status;
86
87	if (!PyArg_ParseTupleAndKeywords(
88		    args, kw, "si|O", kwlist, &unc_name, &level, &creds))
89		return NULL;
90
91	if (unc_name[0] != '\\' || unc_name[1] != '\\') {
92		PyErr_SetString(PyExc_ValueError, "UNC name required");
93		return NULL;
94	}
95
96	server = SMB_STRDUP(unc_name + 2);
97
98	if (strchr(server, '\\')) {
99		char *c = strchr(server, '\\');
100		*c = 0;
101	}
102
103	if (creds && creds != Py_None && !PyDict_Check(creds)) {
104		PyErr_SetString(PyExc_TypeError,
105				"credentials must be dictionary or None");
106		return NULL;
107	}
108
109	if (!(cli = open_pipe_creds(server, creds, PI_SRVSVC, &errstr))) {
110		PyErr_SetString(srvsvc_error, errstr);
111		free(errstr);
112		goto done;
113	}
114
115	if (!(mem_ctx = talloc_init("srvsvc_netservergetinfo"))) {
116		PyErr_SetString(srvsvc_error,
117				"unable to init talloc context\n");
118		goto done;
119	}
120
121	ZERO_STRUCT(ctr);
122
123	status = rpccli_srvsvc_net_srv_get_info(cli->pipe_list, mem_ctx, level, &ctr);
124
125	if (!W_ERROR_IS_OK(status)) {
126		PyErr_SetObject(srvsvc_error, py_werror_tuple(status));
127		goto done;
128	}
129
130	if (level != ctr.switch_value) {
131		PyErr_SetString(srvsvc_error, "container level value wrong");
132		goto done;
133	}
134
135	switch(level) {
136	case 101:
137		py_from_SRV_INFO_101(&result, &ctr.srv.sv101);
138		break;
139	}
140
141	Py_INCREF(result);
142
143done:
144	if (mem_ctx)
145		talloc_destroy(mem_ctx);
146
147	return result;
148}
149
150/*
151 * Module initialisation
152 */
153
154static PyMethodDef srvsvc_methods[] = {
155	{ "netservergetinfo", (PyCFunction)srvsvc_netservergetinfo,
156	  METH_VARARGS | METH_KEYWORDS,
157	  "Retrieve information about a particular server." },
158
159	{ "setup_logging", (PyCFunction)py_setup_logging,
160	  METH_VARARGS | METH_KEYWORDS,
161	  "Set up debug logging.\n"
162"\n"
163"Initialises Samba's debug logging system.  One argument is expected which\n"
164"is a boolean specifying whether debugging is interactive and sent to stdout\n"
165"or logged to a file.\n"
166"\n"
167"Example:\n"
168"\n"
169">>> srvsvc.setup_logging(interactive = 1)" },
170
171	{ "get_debuglevel", (PyCFunction)get_debuglevel,
172	  METH_VARARGS,
173	  "Set the current debug level.\n"
174"\n"
175"Example:\n"
176"\n"
177">>> srvsvc.get_debuglevel()\n"
178"0" },
179
180	{ "set_debuglevel", (PyCFunction)set_debuglevel,
181	  METH_VARARGS,
182	  "Get the current debug level.\n"
183"\n"
184"Example:\n"
185"\n"
186">>> srvsvc.set_debuglevel(10)" },
187
188	{ NULL }
189};
190
191void initsrvsvc(void)
192{
193	PyObject *module, *dict;
194
195	/* Initialise module */
196
197	module = Py_InitModule("srvsvc", srvsvc_methods);
198	dict = PyModule_GetDict(module);
199
200	/* Exceptions we can raise */
201
202	srvsvc_error = PyErr_NewException("srvsvc.error", NULL, NULL);
203	PyDict_SetItemString(dict, "error", srvsvc_error);
204
205	srvsvc_werror = PyErr_NewException("srvsvc.werror", NULL, NULL);
206	PyDict_SetItemString(dict, "werror", srvsvc_werror);
207
208	/* Initialise constants */
209
210	const_init(dict);
211
212	/* Do samba initialisation */
213
214	py_samba_init();
215}
216