/* * Any plugin options which are passed in are dispatched here to a Python method and it * can parse the plugin options. This function is also called after PyLoadModule() has * loaded the Python module and made sure things are operational. */ static bRC PyParsePluginDefinition(bpContext *ctx, void *value) { bRC retval = bRC_Error; struct plugin_ctx *p_ctx = (struct plugin_ctx *)ctx->pContext; PyObject *pFunc; /* * Lookup the parse_plugin_definition() function in the python module. */ pFunc = PyDict_GetItemString(p_ctx->pDict, "parse_plugin_definition"); /* Borrowed reference */ if (pFunc && PyCallable_Check(pFunc)) { PyObject *pPluginDefinition, *pRetVal; pPluginDefinition = PyString_FromString((char *)value); if (!pPluginDefinition) { goto bail_out; } pRetVal = PyObject_CallFunctionObjArgs(pFunc, p_ctx->bpContext, pPluginDefinition, NULL); Py_DECREF(pPluginDefinition); if (!pRetVal) { goto bail_out; } else { retval = conv_python_retval(pRetVal); Py_DECREF(pRetVal); } return retval; } else { Dmsg(ctx, dbglvl, "Failed to find function named parse_plugin_definition()\n"); return bRC_Error; } bail_out: if (PyErr_Occurred()) { PyErrorHandler(ctx, M_FATAL); } return retval; }
static bRC PyHandlePluginEvent(bpContext *ctx, bDirEvent *event, void *value) { bRC retval = bRC_Error; plugin_ctx *p_ctx = (plugin_ctx *)ctx->pContext; PyObject *pFunc; /* * Lookup the handle_plugin_event() function in the python module. */ pFunc = PyDict_GetItemString(p_ctx->pDict, "handle_plugin_event"); /* Borrowed reference */ if (pFunc && PyCallable_Check(pFunc)) { PyObject *pEventType, *pRetVal; pEventType = PyInt_FromLong(event->eventType); pRetVal = PyObject_CallFunctionObjArgs(pFunc, p_ctx->bpContext, pEventType, NULL); Py_DECREF(pEventType); if (!pRetVal) { goto bail_out; } else { retval = conv_python_retval(pRetVal); Py_DECREF(pRetVal); } } else { Dmsg(ctx, dbglvl, "Failed to find function named handle_plugin_event()\n"); } return retval; bail_out: if (PyErr_Occurred()) { PyErrorHandler(ctx, M_FATAL); } return retval; }
/* * Initial load of the Python module. * * Based on the parsed plugin options we set some prerequisits like the * module path and the module to load. We also load the dictionary used * for looking up the Python methods. */ static bRC PyLoadModule(bpContext *ctx) { char *value; bRC retval = bRC_Error; struct plugin_ctx *p_ctx = (struct plugin_ctx *)ctx->pContext; PyObject *sysPath, *mPath, *pName, *pFunc, *module; /* * Extend the Python search path with the defoned plugin_directory. */ if (bfuncs->getBareosValue(NULL, bDirVarPluginDir, &value) == bRC_OK) { sysPath = PySys_GetObject((char *)"path"); mPath = PyString_FromString(value); PyList_Append(sysPath, mPath); Py_DECREF(mPath); } /* * Make our callback methods available for Python. */ module = Py_InitModule("bareosdir", BareosDIRMethods); Dmsg(ctx, dbglvl, "Trying to load module with name bareos-dir\n"); pName = PyString_FromString("bareos-dir"); p_ctx->pModule = PyImport_Import(pName); Py_DECREF(pName); if (!p_ctx->pModule) { Dmsg(ctx, dbglvl, "Failed to load module with name bareos-dir\n"); goto bail_out; } Dmsg(ctx, dbglvl, "Sucessfully loaded module with name bareos-dir\n"); /* * Get the Python dictionary for lookups in the Python namespace. */ p_ctx->pDict = PyModule_GetDict(p_ctx->pModule); /* Borrowed reference */ /* * Encode the bpContext so a Python method can pass it in on calling back. */ p_ctx->bpContext = PyCreatebpContext(ctx); /* * Lookup the load_bareos_plugin() function in the python module. */ pFunc = PyDict_GetItemString(p_ctx->pDict, "load_bareos_plugin"); /* Borrowed reference */ if (pFunc && PyCallable_Check(pFunc)) { PyObject *pRetVal; pRetVal = PyObject_CallFunctionObjArgs(pFunc, p_ctx->bpContext, NULL); if (!pRetVal) { goto bail_out; } else { retval = conv_python_retval(pRetVal); Py_DECREF(pRetVal); } } else { Dmsg(ctx, dbglvl, "Failed to find function named load_bareos_plugins()\n"); goto bail_out; } return retval; bail_out: if (PyErr_Occurred()) { PyErrorHandler(ctx, M_FATAL); } return retval; }
/* * Initial load of the Python module. * * Based on the parsed plugin options we set some prerequisits like the * module path and the module to load. We also load the dictionary used * for looking up the Python methods. */ static bRC PyLoadModule(bpContext *ctx, void *value) { bRC retval = bRC_Error; struct plugin_ctx *p_ctx = (struct plugin_ctx *)ctx->pContext; PyObject *sysPath, *mPath, *pName, *pFunc; /* * See if we already setup the python search path. */ if (!p_ctx->python_path_set) { /* * Extend the Python search path with the given module_path. */ if (p_ctx->module_path) { sysPath = PySys_GetObject((char *)"path"); mPath = PyString_FromString(p_ctx->module_path); PyList_Append(sysPath, mPath); Py_DECREF(mPath); p_ctx->python_path_set = true; } } /* * See if we already setup the module structure. */ if (!p_ctx->pInstance) { /* * Make our callback methods available for Python. */ p_ctx->pInstance = Py_InitModule("bareossd", BareosSDMethods); } /* * Try to load the Python module by name. */ if (p_ctx->module_name) { Dmsg(ctx, dbglvl, "Trying to load module with name %s\n", p_ctx->module_name); pName = PyString_FromString(p_ctx->module_name); p_ctx->pModule = PyImport_Import(pName); Py_DECREF(pName); if (!p_ctx->pModule) { Dmsg(ctx, dbglvl, "Failed to load module with name %s\n", p_ctx->module_name); goto bail_out; } Dmsg(ctx, dbglvl, "Successfully loaded module with name %s\n", p_ctx->module_name); /* * Get the Python dictionary for lookups in the Python namespace. */ p_ctx->pDict = PyModule_GetDict(p_ctx->pModule); /* Borrowed reference */ /* * Encode the bpContext so a Python method can pass it in on calling back. */ p_ctx->bpContext = PyCreatebpContext(ctx); /* * Lookup the load_bareos_plugin() function in the python module. */ pFunc = PyDict_GetItemString(p_ctx->pDict, "load_bareos_plugin"); /* Borrowed reference */ if (pFunc && PyCallable_Check(pFunc)) { PyObject *pPluginDefinition, *pRetVal; pPluginDefinition = PyString_FromString((char *)value); if (!pPluginDefinition) { goto bail_out; } pRetVal = PyObject_CallFunctionObjArgs(pFunc, p_ctx->bpContext, pPluginDefinition, NULL); Py_DECREF(pPluginDefinition); if (!pRetVal) { goto bail_out; } else { retval = conv_python_retval(pRetVal); Py_DECREF(pRetVal); } } else { Dmsg(ctx, dbglvl, "Failed to find function named load_bareos_plugins()\n"); goto bail_out; } /* * Keep track we successfully loaded. */ p_ctx->python_loaded = true; } return retval; bail_out: if (PyErr_Occurred()) { PyErrorHandler(ctx, M_FATAL); } return retval; }