From f3ffaff01544de9bed5de576db8b22a93dd973bb Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Tue, 14 Nov 2006 06:13:04 +0000 Subject: [PATCH] merge mod_python fixes from Johny Kadarisman . mod_python actually works now, please report problems. git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@3366 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- AUTHORS | 1 + scripts/mytest.py | 18 +++++ src/mod/languages/mod_python/Makefile | 8 +- src/mod/languages/mod_python/mod_python.c | 99 +++-------------------- 4 files changed, 33 insertions(+), 93 deletions(-) create mode 100644 scripts/mytest.py diff --git a/AUTHORS b/AUTHORS index 9df1dd89bd..3e82885a7b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -29,6 +29,7 @@ that much better: Paul D. Tinsley - Various patches and support. Ken Rice of Asteria Solutions Group, INC - xmlcdr, sofia improvements, load testing. Neal Horman - conference improvements, switch_ivr menu additions and other tweaks. + Johny Kadarisman - mod_python fixups. A big THANK YOU goes to: diff --git a/scripts/mytest.py b/scripts/mytest.py new file mode 100644 index 0000000000..c5a45e5cf3 --- /dev/null +++ b/scripts/mytest.py @@ -0,0 +1,18 @@ +import sys +from _freeswitch import * + +print "Hello World" +print sys.path +print dir() +print sys.argv + +uuid = sys.argv[0] +fs_consol_log("1","test from my python program\n") +fs_consol_clean("This is fs_consol_clean\n") +fs_consol_clean("My uuid is " + uuid + "\n") + +session = fs_core_session_locate(uuid) + +fs_channel_answer(session) + +fs_switch_ivr_session_transfer(session, "1234", "XML", "default") diff --git a/src/mod/languages/mod_python/Makefile b/src/mod/languages/mod_python/Makefile index 234a02a0dd..d24c2c7ea8 100644 --- a/src/mod/languages/mod_python/Makefile +++ b/src/mod/languages/mod_python/Makefile @@ -1,7 +1,7 @@ LCFLAGS=-fPIC CFLAGS += -fPIC -I$(PREFIX)/include/python2.4/ PYMOD=freeswitch -LDFLAGS=-lpython2.4 -Xlinker -L$(PREFIX)/lib/python2.4/config/ +LDFLAGS=-lpython2.4 -Xlinker -export-dynamic -L$(PREFIX)/lib/python2.4/config/ -lutil SWIGCFILE=../../../switch_swig.c SWIGIFILE=../../../switch_swig.i @@ -32,13 +32,13 @@ $(PYMOD).$(DYNAMIC_LIB_EXTEN): $(MODNAME).$(DYNAMIC_LIB_EXTEN) switch_swig_wrap. $(CC) $(SOLINK) -o py_$(PYMOD).$(DYNAMIC_LIB_EXTEN) switch_swig_wrap.o switch_swig.o $(LDFLAGS) -$(MODNAME).$(DYNAMIC_LIB_EXTEN): $(MODNAME).c $(MODNAME).o $(OBJS) Makefile - $(CC) $(LCFLAGS) $(SOLINK) -o $(MODNAME).$(DYNAMIC_LIB_EXTEN) $(MODNAME).o $(OBJS) $(LDFLAGS) +$(MODNAME).$(DYNAMIC_LIB_EXTEN): $(MODNAME).c $(MODNAME).o $(OBJS) switch_swig_wrap.o switch_swig.o Makefile + $(CC) $(LCFLAGS) $(SOLINK) -o $(MODNAME).$(DYNAMIC_LIB_EXTEN) $(MODNAME).o switch_swig_wrap.o switch_swig.o $(OBJS) $(LDFLAGS) clean: rm -fr *.$(DYNAMIC_LIB_EXTEN) *.o *~ install: - #cp -f py_$(PYMOD).$(DYNAMIC_LIB_EXTEN) $(MDIR) + # cp -f py_$(PYMOD).$(DYNAMIC_LIB_EXTEN) $(PREFIX)/mod cp -f $(MODNAME).$(DYNAMIC_LIB_EXTEN) $(PREFIX)/mod diff --git a/src/mod/languages/mod_python/mod_python.c b/src/mod/languages/mod_python/mod_python.c index 36f9817743..1448c30a9b 100644 --- a/src/mod/languages/mod_python/mod_python.c +++ b/src/mod/languages/mod_python/mod_python.c @@ -24,6 +24,7 @@ * Contributor(s): * * Brian Fertig + * Johny Kadarisman * * mod_python.c -- Python Module * @@ -41,104 +42,24 @@ #include +void init_freeswitch(void); + const char modname[] = "mod_python"; -static int numargs=0; - -static PyObject* emb_numargs(PyObject *self, PyObject *args) -{ - if(!PyArg_ParseTuple(args, ":numargs")) - return NULL; - return Py_BuildValue("i", numargs); -} - -static PyMethodDef EmbMethods[] = { - {"numargs", emb_numargs, METH_VARARGS, - "Return the number of arguments received by the process."}, - {NULL, NULL, 0, NULL} -}; static void python_function(switch_core_session_t *session, char *data) { char *uuid = switch_core_session_get_uuid(session); - uint32_t ulen = strlen(uuid); - uint32_t len = strlen((char *) data) + ulen + 2; - char *mydata = switch_core_session_alloc(session, len); - int argc, i; - char *argv[5]; - char python_code[1024]; -// void*** tsrm_ls = NULL; + char *argv[1]; + FILE* pythonfile; - PyObject *pName, *pModule, *pFunc; - PyObject *pArgs, *pValue; + argv[0] = uuid; + pythonfile = fopen(data, "r"); - - snprintf(mydata, len, "%s %s", uuid, data); - - argc = switch_separate_string(mydata, ' ',argv,(sizeof(argv) / sizeof(argv[0]))); - - sprintf(python_code, "$uuid=\"%s\"; include(\"%s\");\n", argv[0], argv[1]); - //python_embed_init(argc, argv, &tsrm_ls); - //python_EMBED_START_BLOCK(argc, argv); - //zend_eval_string(python_code, NULL, "Embedded code" TSRMLS_CC); - //python_EMBED_END_BLOCK(); - //python_embed_shutdown(tsrm_ls); - - Py_Initialize(); - numargs = argc; - Py_InitModule("emb", EmbMethods); - pName = PyString_FromString(data); - /* Error checking of pName left out */ - - pModule = PyImport_Import(pName); - Py_DECREF(pName); - - if (pModule != NULL) { - pFunc = PyObject_GetAttrString(pModule, "main"); - /* pFunc is a new reference */ - - if (pFunc && PyCallable_Check(pFunc)) { - pArgs = PyTuple_New(argc - 3); - for (i = 0; i < argc - 3; ++i) { - pValue = PyInt_FromLong(atoi(argv[i + 3])); - if (!pValue) { - Py_DECREF(pArgs); - Py_DECREF(pModule); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot convert argument\n"); - - } - /* pValue reference stolen here: */ - PyTuple_SetItem(pArgs, i, pValue); - } - pValue = PyObject_CallObject(pFunc, pArgs); - Py_DECREF(pArgs); - if (pValue != NULL) { - printf("Result of call: %ld\n", PyInt_AsLong(pValue)); - Py_DECREF(pValue); - } - else { - Py_DECREF(pFunc); - Py_DECREF(pModule); - PyErr_Print(); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Call failed\n"); - - } - } - else { - if (PyErr_Occurred()) - PyErr_Print(); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find function \"%s\"\n", argv[2]); - } - Py_XDECREF(pFunc); - Py_DECREF(pModule); - } - else { - PyErr_Print(); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to load \"%s\"\n", argv[1]); - - } + PySys_SetArgv(1, argv); + init_freeswitch(); + PyRun_SimpleFile(pythonfile, ""); Py_Finalize(); - }