Module: kamailio
Branch: master
Commit: b7bae49f9b522f223932375e8e3087a7d2a893f5
URL:
https://github.com/kamailio/kamailio/commit/b7bae49f9b522f223932375e8e3087a…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: 2022-12-06T10:55:20+01:00
app_python3s: new parameter script_child_init
- specify the name of the function to be executed on child fork and
reload of script
---
Modified: src/modules/app_python3s/app_python3s_mod.c
---
Diff:
https://github.com/kamailio/kamailio/commit/b7bae49f9b522f223932375e8e3087a…
Patch:
https://github.com/kamailio/kamailio/commit/b7bae49f9b522f223932375e8e3087a…
---
diff --git a/src/modules/app_python3s/app_python3s_mod.c
b/src/modules/app_python3s/app_python3s_mod.c
index aa2f1b1460..ba68d019e2 100644
--- a/src/modules/app_python3s/app_python3s_mod.c
+++ b/src/modules/app_python3s/app_python3s_mod.c
@@ -39,6 +39,7 @@ MODULE_VERSION
str _sr_python_load_file = str_init("/usr/local/etc/" NAME "/" NAME
".py");
str _sr_apy3s_script_init = str_init("");
+str _sr_apy3s_script_child_init = str_init("");
static int mod_init(void);
static int child_init(int rank);
@@ -57,10 +58,13 @@ int _apy3s_process_rank = 0;
PyThreadState *myThreadState = NULL;
+int apy3s_script_init_exec(PyObject* pModule, str *fname, int *vparam);
+
/** module parameters */
static param_export_t params[]={
{"load", PARAM_STR, &_sr_python_load_file },
{"script_init", PARAM_STR, &_sr_apy3s_script_init },
+ {"script_child_init", PARAM_STR, &_sr_apy3s_script_child_init },
{0,0,0}
};
@@ -210,7 +214,8 @@ static int child_init(int rank)
if (cfg_child_init()) {
return -1;
}
- return 0;
+ return apy3s_script_init_exec(_sr_apy3s_handler_script,
+ &_sr_apy3s_script_child_init, &rank);
}
/**
@@ -256,9 +261,12 @@ int w_app_python3s_exec2(sip_msg_t *_msg, char *pmethod, char
*pparam)
return apy3s_exec_func(_msg, method.s, param.s, 1);
}
-int apy3s_script_init_exec(PyObject* pModule, str *fname, int *rank)
+/**
+ *
+ */
+int apy3s_script_init_exec(PyObject* pModule, str *fname, int *vparam)
{
- PyObject *pFunc, *pArgs, *pHandler;
+ PyObject *pFunc, *pArgs, *pHandler, *pValue;
PyGILState_STATE gstate;
int rval = -1;
@@ -281,11 +289,30 @@ int apy3s_script_init_exec(PyObject* pModule, str *fname, int
*rank)
goto error;
}
- pArgs = PyTuple_New(0);
- if (pArgs == NULL) {
- apy3s_handle_exception("script_init");
- Py_DECREF(pFunc);
- goto error;
+ if(vparam==NULL) {
+ pArgs = PyTuple_New(0);
+ if (pArgs == NULL) {
+ apy3s_handle_exception("script_init");
+ Py_DECREF(pFunc);
+ goto error;
+ }
+ } else {
+ pArgs = PyTuple_New(1);
+ if (pArgs == NULL) {
+ apy3s_handle_exception("script_init");
+ Py_DECREF(pFunc);
+ goto error;
+ }
+
+ pValue = PyLong_FromLong((long)(*vparam));
+ if (pValue == NULL) {
+ apy3s_handle_exception("script_init");
+ Py_DECREF(pArgs);
+ Py_DECREF(pFunc);
+ goto error;
+ }
+ /* pValue moved to pArgs - no direct dec ref */
+ PyTuple_SetItem(pArgs, 0, pValue);
}
pHandler = PyObject_CallObject(pFunc, pArgs);
@@ -318,6 +345,9 @@ int apy3s_script_init_exec(PyObject* pModule, str *fname, int *rank)
return rval;
}
+/**
+ *
+ */
int apy_reload_script(void)
{
PyGILState_STATE gstate;
@@ -330,24 +360,33 @@ int apy_reload_script(void)
PyErr_Format(PyExc_ImportError, "Reload module '%s'",
_sr_apy3s_bname);
apy3s_handle_exception("reload_script");
Py_DECREF(_sr_apy3s_format_exc_obj);
- goto err;
+ goto error;
}
if (apy3s_script_init_exec(pModule, &_sr_apy3s_script_init, NULL)) {
LM_ERR("Error calling mod_init on reload\n");
Py_DECREF(pModule);
- goto err;
+ goto error;
}
Py_DECREF(_sr_apy3s_handler_script);
_sr_apy3s_handler_script = pModule;
+ if(apy3s_script_init_exec(pModule, &_sr_apy3s_script_child_init,
+ &_apy3s_process_rank)<0) {
+ LM_ERR("Failed to run child init callback\n");
+ goto error;
+ }
rval = 0;
-err:
+
+error:
PyGILState_Release(gstate);
return rval;
}
#define INTERNAL_VERSION "1008\n"
+/**
+ *
+ */
int apy_load_script(void)
{
PyObject *sys_path, *pDir, *pModule;