From: Kern S. <ke...@us...> - 2005-04-09 07:21:08
|
Update of /cvsroot/bacula/bacula/src/lib In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26957/src/lib Modified Files: python.c Log Message: - Update of web site to replace old released doc with LaTeX version. - Replace logo in doc with new bat logo. - Make a good number of updates to the manual. - Implement Python scripting using a Python object. This makes interfacing with Bacula cleaner (object oriented). - Add Phil's Status table to the database -- used for getting a text description of the status codes. - Modify FileSet so that an empty Options (no pattern matching) with an exclude will exclude all files. - Modify FileSet so that no top level included File item can be excluded by a matching pattern. - Suppress Created new FileSet record in daemon output. - Implement Python in FD. - Turn off old bfile reader code -- to be replaced by Python. Index: python.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/lib/python.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- python.c 1 Apr 2005 15:21:43 -0000 1.8 +++ python.c 9 Apr 2005 07:20:59 -0000 1.9 @@ -45,6 +45,57 @@ /* Pull in Bacula entry points */ extern PyMethodDef BaculaMethods[]; +typedef struct bJCRObject { + PyObject_HEAD + JCR *jcr; +} bJCRObject; + +static PyTypeObject JCRType = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "bacula.jcr", /*tp_name*/ + sizeof(bJCRObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + 0, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + "JCR objects", /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ +}; + +JCR *get_jcr_from_PyObject(PyObject *self) +{ + return ((bJCRObject *)self)->jcr; +} /* Start the interpreter */ void init_python_interpreter(const char *progname, const char *scripts) @@ -57,6 +108,8 @@ bsnprintf(buf, sizeof(buf), "import sys\n" "sys.path.append('%s')\n", scripts); PyRun_SimpleString(buf); + JCRType.tp_methods = BaculaMethods; + PyType_Ready(&JCRType); PyEval_ReleaseLock(); generate_event = _generate_event; } @@ -72,23 +125,23 @@ * module and running it. * * Returns: 0 if Python not configured or module not found - * -1 on Python error - * 1 OK + * -1 on Python error + * 1 OK */ int _generate_event(JCR *jcr, const char *event) { PyObject *pName, *pModule, *pDict, *pFunc; - PyObject *pArgs, *pValue; + PyObject *pArgs, *pJCR, *pCall; Dmsg1(100, "Generate event %s\n", event); pName = PyString_FromString(event); if (!pName) { Jmsg(jcr, M_ERROR, 0, "Could not convert \"%s\" to Python string.\n", event); - return -1; /* Could not convert string */ + return -1; /* Could not convert string */ } pModule = PyImport_Import(pName); - Py_DECREF(pName); /* release pName */ + Py_DECREF(pName); /* release pName */ if (pModule != NULL) { pDict = PyModule_GetDict(pModule); @@ -98,40 +151,44 @@ /* pFun: Borrowed reference */ if (pFunc && PyCallable_Check(pFunc)) { - /* Create JCR argument to send to function */ - pArgs = PyTuple_New(1); - pValue = PyCObject_FromVoidPtr((void *)jcr, NULL); - if (!pValue) { - Py_DECREF(pArgs); - Py_DECREF(pModule); - Jmsg(jcr, M_ERROR, 0, "Could not convert JCR to Python CObject.\n"); - return -1; /* Could not convert JCR to CObject */ - } - /* pValue reference stolen here: */ - PyTuple_SetItem(pArgs, 0, pValue); + /* Create JCR argument to send to function */ + pArgs = PyTuple_New(1); + pJCR = (PyObject *)PyObject_New(bJCRObject, &JCRType); + ((bJCRObject *)pJCR)->jcr = jcr; +// pValue = PyCObject_FromVoidPtr((void *)jcr, NULL); + if (!pJCR) { + Py_DECREF(pArgs); + Py_DECREF(pModule); + Jmsg(jcr, M_ERROR, 0, "Could not create JCR Python Object.\n"); + return -1; + } + Py_INCREF(pJCR); + /* pJCR reference stolen here: */ + PyTuple_SetItem(pArgs, 0, pJCR); - /* Finally, we call the module here */ - pValue = PyObject_CallObject(pFunc, pArgs); - Py_DECREF(pArgs); - if (pValue != NULL) { - Py_DECREF(pValue); - } else { - Py_DECREF(pModule); - PyErr_Print(); + /* Finally, we call the module here */ + pCall = PyObject_CallObject(pFunc, pArgs); + Py_DECREF(pArgs); + Py_DECREF(pJCR); + if (pCall != NULL) { + Py_DECREF(pCall); + } else { + Py_DECREF(pModule); + PyErr_Print(); Jmsg(jcr, M_ERROR, 0, "Error running Python module: %s\n", event); - return 0; /* error running function */ - } - /* pDict and pFunc are borrowed and must not be Py_DECREF-ed */ + return 0; /* error running function */ + } + /* pDict and pFunc are borrowed and must not be Py_DECREF-ed */ } else { - if (PyErr_Occurred()) { - PyErr_Print(); - } + if (PyErr_Occurred()) { + PyErr_Print(); + } Jmsg(jcr, M_ERROR, 0, "Python function \"%s\" not found in module.\n", event); - return -1; /* function not found */ + return -1; /* function not found */ } Py_DECREF(pModule); } else { - return 0; /* Module not present */ + return 0; /* Module not present */ } Dmsg0(100, "Generate event OK\n"); return 1; |