diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 4d808e2f..685cc7b4 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -24,3 +24,4 @@ Stephen Pierce Mingli Yuan Natanael Copa Roberto Leandrini +Ryan Petrello diff --git a/plugins/python/pyloader.c b/plugins/python/pyloader.c index c2e5f537..7d06efe4 100644 --- a/plugins/python/pyloader.c +++ b/plugins/python/pyloader.c @@ -607,6 +607,52 @@ PyObject *uwsgi_file_loader(void *arg1) { } +PyObject *uwsgi_pecan_loader(void *arg1) { + + char *pecan = (char *) arg1; + PyObject *pecan_module, *pecan_dict, *pecan_deploy; + PyObject *pecan_arg, *pecan_app; + + uwsgi_log( "Loading pecan environment: %s\n", pecan); + + pecan_module = PyImport_ImportModule("pecan.deploy"); + if (!pecan_module) { + PyErr_Print(); + exit(UWSGI_FAILED_APP_CODE); + } + + pecan_dict = PyModule_GetDict(pecan_module); + if (!pecan_dict) { + PyErr_Print(); + exit(UWSGI_FAILED_APP_CODE); + } + + pecan_deploy = PyDict_GetItemString(pecan_dict, "deploy"); + if (!pecan_deploy) { + PyErr_Print(); + exit(UWSGI_FAILED_APP_CODE); + } + + pecan_arg = PyTuple_New(1); + if (!pecan_arg) { + PyErr_Print(); + exit(UWSGI_FAILED_APP_CODE); + } + + if (PyTuple_SetItem(pecan_arg, 0, UWSGI_PYFROMSTRING(pecan))) { + PyErr_Print(); + exit(UWSGI_FAILED_APP_CODE); + } + + pecan_app = PyEval_CallObject(pecan_deploy, pecan_arg); + if (!pecan_app) { + PyErr_Print(); + exit(UWSGI_FAILED_APP_CODE); + } + + return pecan_app; +} + PyObject *uwsgi_paste_loader(void *arg1) { char *paste = (char *) arg1; @@ -668,7 +714,6 @@ PyObject *uwsgi_paste_loader(void *arg1) { exit(UWSGI_FAILED_APP_CODE); } - return paste_app; } diff --git a/plugins/python/python_plugin.c b/plugins/python/python_plugin.c index 98172d05..aeaa9eb6 100644 --- a/plugins/python/python_plugin.c +++ b/plugins/python/python_plugin.c @@ -121,6 +121,9 @@ struct uwsgi_option uwsgi_python_options[] = { {"pyargv", required_argument, 0, "manually set sys.argv", uwsgi_opt_set_str, &up.argv, 0}, {"optimize", required_argument, 'O', "set python optimization level", uwsgi_opt_set_int, &up.optimize, 0}, + + {"pecan", required_argument, 0, "load a pecan config file", uwsgi_opt_set_str, &up.pecan, 0}, + {"paste", required_argument, 0, "load a paste.deploy config file", uwsgi_opt_set_str, &up.paste, 0}, {"paste-logger", no_argument, 0, "enable paste fileConfig logger", uwsgi_opt_true, &up.paste_logger, 0}, @@ -1058,6 +1061,7 @@ void uwsgi_python_init_apps() { up.loaders[LOADER_DYN] = uwsgi_dyn_loader; up.loaders[LOADER_UWSGI] = uwsgi_uwsgi_loader; up.loaders[LOADER_FILE] = uwsgi_file_loader; + up.loaders[LOADER_PECAN] = uwsgi_pecan_loader; up.loaders[LOADER_PASTE] = uwsgi_paste_loader; up.loaders[LOADER_EVAL] = uwsgi_eval_loader; up.loaders[LOADER_MOUNT] = uwsgi_mount_loader; @@ -1123,6 +1127,9 @@ next: if (up.file_config != NULL) { init_uwsgi_app(LOADER_FILE, up.file_config, uwsgi.wsgi_req, up.main_thread, PYTHON_APP_TYPE_WSGI); } + if (up.pecan != NULL) { + init_uwsgi_app(LOADER_PECAN, up.pecan, uwsgi.wsgi_req, up.main_thread, PYTHON_APP_TYPE_WSGI); + } if (up.paste != NULL) { init_uwsgi_app(LOADER_PASTE, up.paste, uwsgi.wsgi_req, up.main_thread, PYTHON_APP_TYPE_WSGI); } diff --git a/plugins/python/uwsgi_python.h b/plugins/python/uwsgi_python.h index 0de1348d..9c97d9e7 100644 --- a/plugins/python/uwsgi_python.h +++ b/plugins/python/uwsgi_python.h @@ -81,8 +81,9 @@ PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromString(char *, Py_ssize_t); #define LOADER_CALLABLE 5 #define LOADER_STRING_CALLABLE 6 #define LOADER_MOUNT 7 +#define LOADER_PECAN 8 -#define LOADER_MAX 8 +#define LOADER_MAX 9 typedef struct uwsgi_Input { PyObject_HEAD @@ -124,6 +125,8 @@ struct uwsgi_python { PyObject *loader_dict; PyObject* (*loaders[LOADER_MAX]) (void *); + char *pecan; + char *wsgi_config; char *file_config; char *paste; @@ -218,6 +221,7 @@ PyObject *uwsgi_uwsgi_loader(void *); PyObject *uwsgi_dyn_loader(void *); PyObject *uwsgi_file_loader(void *); PyObject *uwsgi_eval_loader(void *); +PyObject *uwsgi_pecan_loader(void *); PyObject *uwsgi_paste_loader(void *); PyObject *uwsgi_callable_loader(void *); PyObject *uwsgi_string_callable_loader(void *);