2
Python wrappers for DCERPC/SMB client routines.
4
Copyright (C) Tim Potter, 2002
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.
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, write to the Free Software
18
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21
#include "python/py_spoolss.h"
25
PyObject *spoolss_openprinter(PyObject *self, PyObject *args, PyObject *kw)
27
char *unc_name, *server, *errstr;
28
TALLOC_CTX *mem_ctx = NULL;
31
PyObject *result = NULL, *creds = NULL;
32
static char *kwlist[] = { "printername", "creds", "access", NULL };
33
uint32 desired_access = MAXIMUM_ALLOWED_ACCESS;
34
struct cli_state *cli;
36
if (!PyArg_ParseTupleAndKeywords(
37
args, kw, "s|Oi", kwlist, &unc_name, &creds,
41
if (unc_name[0] != '\\' || unc_name[1] != '\\') {
42
PyErr_SetString(PyExc_ValueError, "UNC name required");
46
server = SMB_STRDUP(unc_name + 2);
48
if (strchr(server, '\\')) {
49
char *c = strchr(server, '\\');
53
if (creds && creds != Py_None && !PyDict_Check(creds)) {
54
PyErr_SetString(PyExc_TypeError,
55
"credentials must be dictionary or None");
59
if (!(cli = open_pipe_creds(server, creds, PI_SPOOLSS, &errstr))) {
60
PyErr_SetString(spoolss_error, errstr);
65
if (!(mem_ctx = talloc_init("spoolss_openprinter"))) {
66
PyErr_SetString(spoolss_error,
67
"unable to init talloc context\n");
71
werror = rpccli_spoolss_open_printer_ex(
72
cli->pipe_list, mem_ctx, unc_name, "", desired_access, server,
75
if (!W_ERROR_IS_OK(werror)) {
76
PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
80
result = new_spoolss_policy_hnd_object(cli, mem_ctx, &hnd);
88
talloc_destroy(mem_ctx);
98
PyObject *spoolss_closeprinter(PyObject *self, PyObject *args)
101
spoolss_policy_hnd_object *hnd;
104
/* Parse parameters */
106
if (!PyArg_ParseTuple(args, "O!", &spoolss_policy_hnd_type, &po))
109
hnd = (spoolss_policy_hnd_object *)po;
111
/* Call rpc function */
113
result = rpccli_spoolss_close_printer(
114
hnd->cli, hnd->mem_ctx, &hnd->pol);
122
/* Fetch printer information */
124
PyObject *spoolss_hnd_getprinter(PyObject *self, PyObject *args, PyObject *kw)
126
spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
128
PyObject *result = NULL;
129
PRINTER_INFO_CTR ctr;
131
static char *kwlist[] = {"level", NULL};
133
/* Parse parameters */
135
if (!PyArg_ParseTupleAndKeywords(args, kw, "|i", kwlist, &level))
140
/* Call rpc function */
142
werror = rpccli_spoolss_getprinter(
143
hnd->cli, hnd->mem_ctx, &hnd->pol, level, &ctr);
147
if (!W_ERROR_IS_OK(werror)) {
148
PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
157
py_from_PRINTER_INFO_0(&result, ctr.printers_0);
161
py_from_PRINTER_INFO_1(&result, ctr.printers_1);
165
py_from_PRINTER_INFO_2(&result, ctr.printers_2);
169
py_from_PRINTER_INFO_3(&result, ctr.printers_3);
177
/* Set printer information */
179
PyObject *spoolss_hnd_setprinter(PyObject *self, PyObject *args, PyObject *kw)
181
spoolss_policy_hnd_object *hnd = (spoolss_policy_hnd_object *)self;
184
PRINTER_INFO_CTR ctr;
186
static char *kwlist[] = {"dict", NULL};
188
PRINTER_INFO_1 printers_1;
189
PRINTER_INFO_2 printers_2;
190
PRINTER_INFO_3 printers_3;
193
/* Parse parameters */
195
if (!PyArg_ParseTupleAndKeywords(
196
args, kw, "O!", kwlist, &PyDict_Type, &info))
199
if (!get_level_value(info, &level)) {
200
PyErr_SetString(spoolss_error, "invalid info level");
204
if (level < 1 && level > 3) {
205
PyErr_SetString(spoolss_error, "unsupported info level");
209
/* Fill in printer info */
215
ctr.printers_1 = &pinfo.printers_1;
217
if (!py_to_PRINTER_INFO_1(ctr.printers_1, info)){
218
PyErr_SetString(spoolss_error,
219
"error converting printer to info 1");
225
ctr.printers_2 = &pinfo.printers_2;
227
if (!py_to_PRINTER_INFO_2(ctr.printers_2, info,
229
PyErr_SetString(spoolss_error,
230
"error converting printer to info 2");
236
ctr.printers_3 = &pinfo.printers_3;
238
if (!py_to_PRINTER_INFO_3(ctr.printers_3, info,
240
PyErr_SetString(spoolss_error,
241
"error converting to printer info 3");
247
PyErr_SetString(spoolss_error, "unsupported info level");
251
/* Call rpc function */
253
werror = rpccli_spoolss_setprinter(
254
hnd->cli, hnd->mem_ctx, &hnd->pol, level, &ctr, 0);
258
if (!W_ERROR_IS_OK(werror)) {
259
PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
267
/* Enumerate printers */
269
PyObject *spoolss_enumprinters(PyObject *self, PyObject *args, PyObject *kw)
272
PyObject *result = NULL, *creds = NULL;
273
PRINTER_INFO_CTR ctr;
274
int level = 1, flags = PRINTER_ENUM_LOCAL, i;
276
static char *kwlist[] = {"server", "name", "level", "flags",
278
TALLOC_CTX *mem_ctx = NULL;
279
struct cli_state *cli = NULL;
280
char *server, *errstr, *name = NULL;
282
/* Parse parameters */
284
if (!PyArg_ParseTupleAndKeywords(
285
args, kw, "s|siiO", kwlist, &server, &name, &level,
289
if (server[0] != '\\' || server[1] != '\\') {
290
PyErr_SetString(PyExc_ValueError, "UNC name required");
296
if (creds && creds != Py_None && !PyDict_Check(creds)) {
297
PyErr_SetString(PyExc_TypeError,
298
"credentials must be dictionary or None");
302
if (!(cli = open_pipe_creds(server, creds, PI_SPOOLSS, &errstr))) {
303
PyErr_SetString(spoolss_error, errstr);
308
if (!(mem_ctx = talloc_init("spoolss_enumprinters"))) {
310
spoolss_error, "unable to init talloc context\n");
314
/* This RPC is weird. By setting the server name to different
315
values we can get different behaviour. If however the server
316
name is not specified, we default it to being the full server
317
name as this is probably what the caller intended. To pass a
318
NULL name, pass a value of "" */
327
/* Call rpc function */
329
werror = rpccli_spoolss_enum_printers(
330
cli->pipe_list, mem_ctx, name, flags, level, &num_printers, &ctr);
332
if (!W_ERROR_IS_OK(werror)) {
333
PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
341
result = PyDict_New();
343
for (i = 0; i < num_printers; i++) {
347
rpcstr_pull(s, ctr.printers_0[i].printername.buffer,
348
sizeof(fstring), -1, STR_TERMINATE);
350
py_from_PRINTER_INFO_0(&value, &ctr.printers_0[i]);
352
PyDict_SetItemString(
353
value, "level", PyInt_FromLong(0));
355
PyDict_SetItemString(result, s, value);
360
result = PyDict_New();
362
for(i = 0; i < num_printers; i++) {
366
rpcstr_pull(s, ctr.printers_1[i].name.buffer,
367
sizeof(fstring), -1, STR_TERMINATE);
369
py_from_PRINTER_INFO_1(&value, &ctr.printers_1[i]);
371
PyDict_SetItemString(
372
value, "level", PyInt_FromLong(1));
374
PyDict_SetItemString(result, s, value);
379
result = PyDict_New();
381
for(i = 0; i < num_printers; i++) {
385
rpcstr_pull(s, ctr.printers_2[i].printername.buffer,
386
sizeof(fstring), -1, STR_TERMINATE);
388
py_from_PRINTER_INFO_2(&value, &ctr.printers_2[i]);
390
PyDict_SetItemString(
391
value, "level", PyInt_FromLong(2));
393
PyDict_SetItemString(result, s, value);
398
PyErr_SetString(spoolss_error, "unknown info level");
407
talloc_destroy(mem_ctx);
414
PyObject *spoolss_addprinterex(PyObject *self, PyObject *args, PyObject *kw)
416
static char *kwlist[] = { "server", "printername", "info", "creds",
418
char *printername, *server, *errstr;
419
PyObject *info, *result = NULL, *creds = NULL;
420
struct cli_state *cli = NULL;
421
TALLOC_CTX *mem_ctx = NULL;
422
PRINTER_INFO_CTR ctr;
423
PRINTER_INFO_2 info2;
426
if (!PyArg_ParseTupleAndKeywords(
427
args, kw, "ssO!|O!", kwlist, &server, &printername,
428
&PyDict_Type, &info, &PyDict_Type, &creds))
431
if (!(cli = open_pipe_creds(server, creds, PI_SPOOLSS, &errstr))) {
432
PyErr_SetString(spoolss_error, errstr);
437
if (!(mem_ctx = talloc_init("spoolss_addprinterex"))) {
439
spoolss_error, "unable to init talloc context\n");
443
if (!py_to_PRINTER_INFO_2(&info2, info, mem_ctx)) {
444
PyErr_SetString(spoolss_error,
445
"error converting to printer info 2");
449
ctr.printers_2 = &info2;
451
werror = rpccli_spoolss_addprinterex(cli->pipe_list, mem_ctx, 2, &ctr);
461
talloc_destroy(mem_ctx);