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