From 6e754a10358db8c044b418d441b765b0c1c728b0 Mon Sep 17 00:00:00 2001 From: "alexey.stratulat" <alexey.stratulat@demlabs.net> Date: Thu, 23 Apr 2020 17:42:03 +0700 Subject: [PATCH] [*] Fix initialization submodule and added function reload plugin --- include/dap_chain_plugins.h | 1 + src/dap_chain_plugins.c | 42 ++++++++++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/include/dap_chain_plugins.h b/include/dap_chain_plugins.h index 54837f3..4f0ce12 100644 --- a/include/dap_chain_plugins.h +++ b/include/dap_chain_plugins.h @@ -23,6 +23,7 @@ int dap_chain_plugins_init(); void dap_chain_plugins_deinit(); void dap_chain_plugins_loading(); void dap_chain_plugins_load_plugin(const char *dir_path, const char *name); +int dap_chain_plugins_reload_plugin(const char * name_plugin); #ifdef __cplusplus } diff --git a/src/dap_chain_plugins.c b/src/dap_chain_plugins.c index e3ed1e3..6c31635 100644 --- a/src/dap_chain_plugins.c +++ b/src/dap_chain_plugins.c @@ -2,8 +2,9 @@ int dap_chain_plugins_init(dap_config_t *config){ if(dap_config_get_item_bool_default(config, "plugins", "py_load", false)){ - plugins_root_path = dap_config_get_item_str_default(config, "plugins", "py_path", + const char *l_plugins_root_path = dap_config_get_item_str_default(config, "plugins", "py_path", "/opt/cellframe-node/var/plugins/"); + plugins_root_path = dap_strjoin(NULL, l_plugins_root_path, "/", NULL); log_it(L_INFO, "Start initialize python plugins. Path plugins %s", plugins_root_path); if (!dap_dir_test(plugins_root_path)){ log_it(L_ERROR, "The directory %s was not found.", plugins_root_path); @@ -137,6 +138,45 @@ void dap_chain_plugins_deinit(){ Py_XDECREF(plugin->obj_module); LL_DELETE(plugins, plugin); } + dap_chain_plugins_manifest_list_delete_all(); Py_Finalize(); } +int dap_chain_plugins_reload_plugin(const char * name_plugin){ + log_it(L_NOTICE, "Reload plugin %s", name_plugin); + dap_chain_plugin_list_module_t *plugins = dap_chain_plugins_list_get(); + dap_chain_plugin_list_module_t *plugin = NULL; + LL_SEARCH(plugins, plugin, name_plugin, dap_chain_plugins_list_name_cmp); + if (plugin == NULL) + return -1; + PyObject *func_deinit = PyObject_GetAttrString(plugin->obj_module, "deinit"); +// PyObject *res_int = NULL; + if (func_deinit != NULL || PyCallable_Check(func_deinit)){ + PyEval_CallObject(func_deinit, NULL); + } else { + log_it(L_WARNING, "For plugin %s can't callable function deinit", plugin->name); + } + DAP_FREE(plugin->name); + Py_XDECREF(plugin->obj_module); + LL_DELETE(plugins, plugin); + dap_chain_plugins_manifest_list_delete_name(name_plugin); + //Loading plugin + char *path_plugin = dap_strjoin(NULL, plugins_root_path, name_plugin, NULL); + char *name_file_manifest = dap_strjoin("",plugins_root_path, name_plugin, "/manifest.json", NULL); + if (!dap_chain_plugins_manifest_list_add_from_file(name_file_manifest)){ + log_it(L_ERROR, "Registration %s manifest fail", path_plugin); + } + DAP_FREE(name_file_manifest); + dap_chain_plugins_list_manifest_t *manifest = dap_chain_plugins_manifest_list_get_name(name_plugin); + if (manifest->dependencys != NULL){ + if (!dap_chain_plugins_list_check_load_plugins(manifest->dependencys)){ + log_it(L_NOTICE, "%s plugin has unresolved dependencys, restart all plagins", manifest->name); + }else{ + dap_chain_plugins_load_plugin(dap_strjoin("", plugins_root_path, manifest->name, "/", NULL), manifest->name); + } + }else{ + dap_chain_plugins_load_plugin(dap_strjoin("", plugins_root_path, manifest->name, "/", NULL), manifest->name); + } + + return -1; +} -- GitLab