• 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, 2002
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_spoolss.h"
22
23/* Exceptions this module can raise */
24
25PyObject *spoolss_error, *spoolss_werror;
26
27/*
28 * Method dispatch table
29 */
30
31static PyMethodDef spoolss_methods[] = {
32
33	/* Open/close printer handles */
34
35	{ "openprinter", (PyCFunction)spoolss_openprinter, METH_VARARGS | METH_KEYWORDS,
36	  "Open a printer by name in UNC format.\n"
37"\n"
38"Optionally a dictionary of (domain, username, password) may be given in\n"
39"which case they are used when opening the RPC pipe.  An access mask may\n"
40"also be given which defaults to MAXIMUM_ALLOWED_ACCESS.\n"
41"\n"
42"Example:\n"
43"\n"
44">>> hnd = spoolss.openprinter(\"\\\\\\\\NPSD-PDC2\\\\meanie\")"},
45
46	{ "closeprinter", spoolss_closeprinter, METH_VARARGS,
47	  "Close a printer handle opened with openprinter or addprinter.\n"
48"\n"
49"Example:\n"
50"\n"
51">>> spoolss.closeprinter(hnd)"},
52
53	{ "addprinterex", (PyCFunction)spoolss_addprinterex, METH_VARARGS,
54	  "addprinterex()"},
55
56	/* Server enumeratation functions */
57
58	{ "enumprinters", (PyCFunction)spoolss_enumprinters,
59	  METH_VARARGS | METH_KEYWORDS,
60	  "Enumerate printers on a print server.\n"
61"\n"
62"Return a list of printers on a print server.  The credentials, info level\n"
63"and flags may be specified as keyword arguments.\n"
64"\n"
65"Example:\n"
66"\n"
67">>> print spoolss.enumprinters(\"\\\\\\\\npsd-pdc2\")\n"
68"[{'comment': 'i am a comment', 'printer_name': 'meanie', 'flags': 8388608, \n"
69"  'description': 'meanie,Generic / Text Only,i am a location'}, \n"
70" {'comment': '', 'printer_name': 'fileprint', 'flags': 8388608, \n"
71"  'description': 'fileprint,Generic / Text Only,'}]"},
72
73	{ "enumports", (PyCFunction)spoolss_enumports,
74	  METH_VARARGS | METH_KEYWORDS,
75	  "Enumerate ports on a print server.\n"
76"\n"
77"Return a list of ports on a print server.\n"
78"\n"
79"Example:\n"
80"\n"
81">>> print spoolss.enumports(\"\\\\\\\\npsd-pdc2\")\n"
82"[{'name': 'LPT1:'}, {'name': 'LPT2:'}, {'name': 'COM1:'}, \n"
83"{'name': 'COM2:'}, {'name': 'FILE:'}, {'name': '\\\\nautilus1\\zpekt3r'}]"},
84
85	{ "enumprinterdrivers", (PyCFunction)spoolss_enumprinterdrivers,
86	  METH_VARARGS | METH_KEYWORDS,
87	  "Enumerate printer drivers on a print server.\n"
88"\n"
89"Return a list of printer drivers."},
90
91	/* Miscellaneous other commands */
92
93	{ "getprinterdriverdir", (PyCFunction)spoolss_getprinterdriverdir,
94	  METH_VARARGS | METH_KEYWORDS,
95	  "Return printer driver directory.\n"
96"\n"
97"Return the printer driver directory for a given architecture.  The\n"
98"architecture defaults to \"Windows NT x86\"."},
99
100	/* Other stuff - this should really go into a samba config module
101  	   but for the moment let's leave it here. */
102
103	{ "setup_logging", (PyCFunction)py_setup_logging,
104	  METH_VARARGS | METH_KEYWORDS,
105	  "Set up debug logging.\n"
106"\n"
107"Initialises Samba's debug logging system.  One argument is expected which\n"
108"is a boolean specifying whether debugging is interactive and sent to stdout\n"
109"or logged to a file.\n"
110"\n"
111"Example:\n"
112"\n"
113">>> spoolss.setup_logging(interactive = 1)" },
114
115	{ "get_debuglevel", (PyCFunction)get_debuglevel,
116	  METH_VARARGS,
117	  "Set the current debug level.\n"
118"\n"
119"Example:\n"
120"\n"
121">>> spoolss.get_debuglevel()\n"
122"0" },
123
124	{ "set_debuglevel", (PyCFunction)set_debuglevel,
125	  METH_VARARGS,
126	  "Get the current debug level.\n"
127"\n"
128"Example:\n"
129"\n"
130">>> spoolss.set_debuglevel(10)" },
131
132	/* Printer driver routines */
133
134	{ "addprinterdriver", (PyCFunction)spoolss_addprinterdriver,
135	  METH_VARARGS | METH_KEYWORDS,
136	  "Add a printer driver." },
137
138	{ "addprinterdriverex", (PyCFunction)spoolss_addprinterdriverex,
139	  METH_VARARGS | METH_KEYWORDS,
140	  "Add a printer driver." },
141
142	{ "deleteprinterdriver", (PyCFunction)spoolss_deleteprinterdriver,
143	  METH_VARARGS | METH_KEYWORDS,
144	  "Delete a printer driver." },
145
146	{ "deleteprinterdriverex", (PyCFunction)spoolss_deleteprinterdriverex,
147	  METH_VARARGS | METH_KEYWORDS,
148	  "Delete a printer driver." },
149
150	{ NULL }
151};
152
153/* Methods attached to a spoolss handle object */
154
155static PyMethodDef spoolss_hnd_methods[] = {
156
157	/* Printer info */
158
159	{ "getprinter", (PyCFunction)spoolss_hnd_getprinter,
160           METH_VARARGS | METH_KEYWORDS,
161	  "Get printer information.\n"
162"\n"
163"Return a dictionary of print information.  The info level defaults to 1.\n"
164"\n"
165"Example:\n"
166"\n"
167">>> hnd.getprinter()\n"
168"{'comment': 'i am a comment', 'printer_name': '\\\\NPSD-PDC2\\meanie',\n"
169" 'description': '\\\\NPSD-PDC2\\meanie,Generic / Text Only,i am a location',\n"
170" 'flags': 8388608}"},
171
172	{ "setprinter", (PyCFunction)spoolss_hnd_setprinter,
173          METH_VARARGS | METH_KEYWORDS,
174	  "Set printer information."},
175
176	/* Printer drivers */
177
178	{ "getprinterdriver", (PyCFunction)spoolss_hnd_getprinterdriver,
179	  METH_VARARGS | METH_KEYWORDS,
180	  "Return printer driver information.\n"
181"\n"
182"Return a dictionary of printer driver information for the printer driver\n"
183"bound to this printer."},
184
185	/* Forms */
186
187	{ "enumforms", (PyCFunction)spoolss_hnd_enumforms,
188          METH_VARARGS | METH_KEYWORDS,
189	  "Enumerate supported forms.\n"
190"\n"
191"Return a list of forms supported by this printer or print server."},
192
193	{ "setform", (PyCFunction)spoolss_hnd_setform,
194          METH_VARARGS | METH_KEYWORDS,
195	  "Set form data.\n"
196"\n"
197"Set the form given by the dictionary argument."},
198
199	{ "addform", (PyCFunction)spoolss_hnd_addform,
200          METH_VARARGS | METH_KEYWORDS,
201	  "Add a new form." },
202
203	{ "getform", (PyCFunction)spoolss_hnd_getform,
204          METH_VARARGS | METH_KEYWORDS,
205	  "Get form properties." },
206
207	{ "deleteform", (PyCFunction)spoolss_hnd_deleteform,
208          METH_VARARGS | METH_KEYWORDS,
209	  "Delete a form." },
210
211        /* Job related methods */
212
213        { "enumjobs", (PyCFunction)spoolss_hnd_enumjobs,
214          METH_VARARGS | METH_KEYWORDS,
215          "Enumerate jobs." },
216
217        { "setjob", (PyCFunction)spoolss_hnd_setjob,
218          METH_VARARGS | METH_KEYWORDS,
219          "Set job information." },
220
221        { "getjob", (PyCFunction)spoolss_hnd_getjob,
222          METH_VARARGS | METH_KEYWORDS,
223          "Get job information." },
224
225        { "startpageprinter", (PyCFunction)spoolss_hnd_startpageprinter,
226           METH_VARARGS | METH_KEYWORDS,
227          "Notify spooler that a page is about to be printed." },
228
229        { "endpageprinter", (PyCFunction)spoolss_hnd_endpageprinter,
230           METH_VARARGS | METH_KEYWORDS,
231          "Notify spooler that a page is about to be printed." },
232
233        { "startdocprinter", (PyCFunction)spoolss_hnd_startdocprinter,
234           METH_VARARGS | METH_KEYWORDS,
235          "Notify spooler that a document is about to be printed." },
236
237        { "enddocprinter", (PyCFunction)spoolss_hnd_enddocprinter,
238           METH_VARARGS | METH_KEYWORDS,
239          "Notify spooler that a document is about to be printed." },
240
241        { "writeprinter", (PyCFunction)spoolss_hnd_writeprinter,
242          METH_VARARGS | METH_KEYWORDS,
243          "Write job data to a printer." },
244
245        { "addjob", (PyCFunction)spoolss_hnd_addjob,
246          METH_VARARGS | METH_KEYWORDS,
247          "Add a job to the list of print jobs." },
248
249        /* Printer data */
250
251        { "getprinterdata", (PyCFunction)spoolss_hnd_getprinterdata,
252           METH_VARARGS | METH_KEYWORDS,
253          "Get printer data." },
254
255        { "setprinterdata", (PyCFunction)spoolss_hnd_setprinterdata,
256           METH_VARARGS | METH_KEYWORDS,
257          "Set printer data." },
258
259        { "enumprinterdata", (PyCFunction)spoolss_hnd_enumprinterdata,
260           METH_VARARGS | METH_KEYWORDS,
261          "Enumerate printer data." },
262
263        { "deleteprinterdata", (PyCFunction)spoolss_hnd_deleteprinterdata,
264           METH_VARARGS | METH_KEYWORDS,
265          "Delete printer data." },
266
267        { "getprinterdataex", (PyCFunction)spoolss_hnd_getprinterdataex,
268           METH_VARARGS | METH_KEYWORDS,
269          "Get printer data." },
270
271        { "setprinterdataex", (PyCFunction)spoolss_hnd_setprinterdataex,
272           METH_VARARGS | METH_KEYWORDS,
273          "Set printer data." },
274
275        { "enumprinterdataex", (PyCFunction)spoolss_hnd_enumprinterdataex,
276           METH_VARARGS | METH_KEYWORDS,
277          "Enumerate printer data." },
278
279        { "deleteprinterdataex", (PyCFunction)spoolss_hnd_deleteprinterdataex,
280           METH_VARARGS | METH_KEYWORDS,
281          "Delete printer data." },
282
283        { "enumprinterkey", (PyCFunction)spoolss_hnd_enumprinterkey,
284           METH_VARARGS | METH_KEYWORDS,
285          "Enumerate printer key." },
286
287#if 0
288        /* Not implemented */
289
290        { "deleteprinterkey", (PyCFunction)spoolss_hnd_deleteprinterkey,
291           METH_VARARGS | METH_KEYWORDS,
292          "Delete printer key." },
293#endif
294
295	{ NULL }
296
297};
298
299static void py_policy_hnd_dealloc(PyObject* self)
300{
301        spoolss_policy_hnd_object *hnd;
302
303        /* Close down policy handle and free talloc context */
304
305        hnd = (spoolss_policy_hnd_object*)self;
306
307        cli_shutdown(hnd->cli);
308        talloc_destroy(hnd->mem_ctx);
309
310	PyObject_Del(self);
311}
312
313static PyObject *py_policy_hnd_getattr(PyObject *self, char *attrname)
314{
315	return Py_FindMethod(spoolss_hnd_methods, self, attrname);
316}
317
318static char spoolss_type_doc[] =
319"Python wrapper for Windows NT SPOOLSS rpc pipe.";
320
321PyTypeObject spoolss_policy_hnd_type = {
322	PyObject_HEAD_INIT(NULL)
323	0,
324	"spoolss.hnd",
325	sizeof(spoolss_policy_hnd_object),
326	0,
327	py_policy_hnd_dealloc,	/* tp_dealloc*/
328	0,			/* tp_print*/
329	py_policy_hnd_getattr,	/* tp_getattr*/
330	0,			/* tp_setattr*/
331	0,			/* tp_compare*/
332	0,			/* tp_repr*/
333	0,			/* tp_as_number*/
334	0,			/* tp_as_sequence*/
335	0,			/* tp_as_mapping*/
336	0,			/* tp_hash */
337	0,			/* tp_call */
338	0,			/* tp_str */
339	0,			/* tp_getattro */
340	0,			/* tp_setattro */
341	0,			/* tp_as_buffer*/
342	Py_TPFLAGS_DEFAULT,	/* tp_flags */
343	spoolss_type_doc,	/* tp_doc */
344};
345
346/* Initialise constants */
347
348static struct const_vals {
349	char *name;
350	uint32 value;
351} module_const_vals[] = {
352
353	/* Access permissions */
354
355	{ "MAXIMUM_ALLOWED_ACCESS", MAXIMUM_ALLOWED_ACCESS },
356	{ "SERVER_ALL_ACCESS", SERVER_ALL_ACCESS },
357	{ "SERVER_READ", SERVER_READ },
358	{ "SERVER_WRITE", SERVER_WRITE },
359	{ "SERVER_EXECUTE", SERVER_EXECUTE },
360	{ "SERVER_ACCESS_ADMINISTER", SERVER_ACCESS_ADMINISTER },
361	{ "SERVER_ACCESS_ENUMERATE", SERVER_ACCESS_ENUMERATE },
362	{ "PRINTER_ALL_ACCESS", PRINTER_ALL_ACCESS },
363	{ "PRINTER_READ", PRINTER_READ },
364	{ "PRINTER_WRITE", PRINTER_WRITE },
365	{ "PRINTER_EXECUTE", PRINTER_EXECUTE },
366	{ "PRINTER_ACCESS_ADMINISTER", PRINTER_ACCESS_ADMINISTER },
367	{ "PRINTER_ACCESS_USE", PRINTER_ACCESS_USE },
368	{ "JOB_ACCESS_ADMINISTER", JOB_ACCESS_ADMINISTER },
369	{ "JOB_ALL_ACCESS", JOB_ALL_ACCESS },
370	{ "JOB_READ", JOB_READ },
371	{ "JOB_WRITE", JOB_WRITE },
372	{ "JOB_EXECUTE", JOB_EXECUTE },
373	{ "STANDARD_RIGHTS_ALL_ACCESS", STANDARD_RIGHTS_ALL_ACCESS },
374	{ "STANDARD_RIGHTS_EXECUTE_ACCESS", STANDARD_RIGHTS_EXECUTE_ACCESS },
375	{ "STANDARD_RIGHTS_READ_ACCESS", STANDARD_RIGHTS_READ_ACCESS },
376	{ "STANDARD_RIGHTS_REQUIRED_ACCESS", STANDARD_RIGHTS_REQUIRED_ACCESS },
377	{ "STANDARD_RIGHTS_WRITE_ACCESS", STANDARD_RIGHTS_WRITE_ACCESS },
378
379	/* Printer enumeration flags */
380
381	{ "PRINTER_ENUM_DEFAULT", PRINTER_ENUM_DEFAULT },
382	{ "PRINTER_ENUM_LOCAL", PRINTER_ENUM_LOCAL },
383	{ "PRINTER_ENUM_CONNECTIONS", PRINTER_ENUM_CONNECTIONS },
384	{ "PRINTER_ENUM_FAVORITE", PRINTER_ENUM_FAVORITE },
385	{ "PRINTER_ENUM_NAME", PRINTER_ENUM_NAME },
386	{ "PRINTER_ENUM_REMOTE", PRINTER_ENUM_REMOTE },
387	{ "PRINTER_ENUM_SHARED", PRINTER_ENUM_SHARED },
388	{ "PRINTER_ENUM_NETWORK", PRINTER_ENUM_NETWORK },
389
390	/* Form types */
391
392	{ "FORM_USER", FORM_USER },
393	{ "FORM_BUILTIN", FORM_BUILTIN },
394	{ "FORM_PRINTER", FORM_PRINTER },
395
396	/* WERRORs */
397
398	{ "WERR_OK", 0 },
399	{ "WERR_BADFILE", 2 },
400	{ "WERR_ACCESS_DENIED", 5 },
401	{ "WERR_BADFID", 6 },
402	{ "WERR_BADFUNC", 1 },
403	{ "WERR_INSUFFICIENT_BUFFER", 122 },
404	{ "WERR_NO_SUCH_SHARE", 67 },
405	{ "WERR_ALREADY_EXISTS", 80 },
406	{ "WERR_INVALID_PARAM", 87 },
407	{ "WERR_NOT_SUPPORTED", 50 },
408	{ "WERR_BAD_PASSWORD", 86 },
409	{ "WERR_NOMEM", 8 },
410	{ "WERR_INVALID_NAME", 123 },
411	{ "WERR_UNKNOWN_LEVEL", 124 },
412	{ "WERR_OBJECT_PATH_INVALID", 161 },
413	{ "WERR_NO_MORE_ITEMS", 259 },
414	{ "WERR_MORE_DATA", 234 },
415	{ "WERR_UNKNOWN_PRINTER_DRIVER", 1797 },
416	{ "WERR_INVALID_PRINTER_NAME", 1801 },
417	{ "WERR_PRINTER_ALREADY_EXISTS", 1802 },
418	{ "WERR_INVALID_DATATYPE", 1804 },
419	{ "WERR_INVALID_ENVIRONMENT", 1805 },
420	{ "WERR_INVALID_FORM_NAME", 1902 },
421	{ "WERR_INVALID_FORM_SIZE", 1903 },
422	{ "WERR_BUF_TOO_SMALL", 2123 },
423	{ "WERR_JOB_NOT_FOUND", 2151 },
424	{ "WERR_DEST_NOT_FOUND", 2152 },
425	{ "WERR_NOT_LOCAL_DOMAIN", 2320 },
426	{ "WERR_PRINTER_DRIVER_IN_USE", 3001 },
427	{ "WERR_STATUS_MORE_ENTRIES  ", 0x0105 },
428
429	/* Job control constants */
430
431	{ "JOB_CONTROL_PAUSE", JOB_CONTROL_PAUSE },
432	{ "JOB_CONTROL_RESUME", JOB_CONTROL_RESUME },
433	{ "JOB_CONTROL_CANCEL", JOB_CONTROL_CANCEL },
434	{ "JOB_CONTROL_RESTART", JOB_CONTROL_RESTART },
435	{ "JOB_CONTROL_DELETE", JOB_CONTROL_DELETE },
436
437	{ NULL },
438};
439
440static void const_init(PyObject *dict)
441{
442	struct const_vals *tmp;
443	PyObject *obj;
444
445	for (tmp = module_const_vals; tmp->name; tmp++) {
446		obj = PyInt_FromLong(tmp->value);
447		PyDict_SetItemString(dict, tmp->name, obj);
448		Py_DECREF(obj);
449	}
450}
451
452/* Module initialisation */
453
454void initspoolss(void)
455{
456	PyObject *module, *dict;
457
458	/* Initialise module */
459
460	module = Py_InitModule("spoolss", spoolss_methods);
461	dict = PyModule_GetDict(module);
462
463	/* Exceptions we can raise */
464
465	spoolss_error = PyErr_NewException("spoolss.error", NULL, NULL);
466	PyDict_SetItemString(dict, "error", spoolss_error);
467
468	spoolss_werror = PyErr_NewException("spoolss.werror", NULL, NULL);
469	PyDict_SetItemString(dict, "werror", spoolss_werror);
470
471	/* Initialise policy handle object */
472
473	spoolss_policy_hnd_type.ob_type = &PyType_Type;
474
475	PyDict_SetItemString(dict, "spoolss.hnd",
476			     (PyObject *)&spoolss_policy_hnd_type);
477
478	/* Initialise constants */
479
480	const_init(dict);
481
482	/* Do samba initialisation */
483
484	py_samba_init();
485}
486