From 839f8f6f00a0a989fa50d45feb17426e114b92da Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Wed, 2 Dec 2009 16:20:56 +0100 Subject: fix rhbz#518422: refuse to start if some required plugins are missing Signed-off-by: Denys Vlasenko --- src/Daemon/Daemon.cpp | 24 ++++++++++++++++++------ src/Daemon/PluginManager.cpp | 28 ++++++++++++++-------------- src/Daemon/PluginManager.h | 2 +- 3 files changed, 33 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/Daemon/Daemon.cpp b/src/Daemon/Daemon.cpp index 3a11a3ad..c2d22656 100644 --- a/src/Daemon/Daemon.cpp +++ b/src/Daemon/Daemon.cpp @@ -161,7 +161,7 @@ static gboolean cron_activation_reshedule_cb(gpointer data) return FALSE; } -static void SetUpMW() +static int SetUpMW() { set_string_t::iterator it_k = g_settings_setOpenGPGPublicKeys.begin(); for (; it_k != g_settings_setOpenGPGPublicKeys.end(); it_k++) @@ -177,7 +177,8 @@ static void SetUpMW() set_string_t::iterator it_p = g_settings_setEnabledPlugins.begin(); for (; it_p != g_settings_setEnabledPlugins.end(); it_p++) { - g_pPluginManager->RegisterPlugin(it_p->c_str()); + if (g_pPluginManager->RegisterPlugin(it_p->c_str()) != 0) + return -1; } VERB1 log("Adding actions or reporters"); vector_pair_string_string_t::iterator it_ar = g_settings_vectorActionsAndReporters.begin(); @@ -195,6 +196,7 @@ static void SetUpMW() AddAnalyzerActionOrReporter(it_aar->first.c_str(), it_ar->first.c_str(), it_ar->second.c_str()); } } + return 0; } static int SetUpCron() @@ -779,9 +781,11 @@ int main(int argc, char** argv) xmlrpc_client_setup_global_const(&env); if (env.fault_occurred) error_msg_and_die("XML-RPC Fault: %s(%d)", env.fault_string, env.fault_code); + VERB1 log("Creating glib main loop"); pMainloop = g_main_loop_new(NULL, FALSE); /* Watching DEBUG_DUMPS_DIR for new files... */ + VERB1 log("Initializing inotify"); sanitize_dump_dir_rights(); errno = 0; @@ -790,14 +794,19 @@ int main(int argc, char** argv) perror_msg_and_die("inotify_init failed"); if (inotify_add_watch(inotify_fd, DEBUG_DUMPS_DIR, IN_CREATE) == -1) perror_msg_and_die("inotify_add_watch failed on '%s'", DEBUG_DUMPS_DIR); - VERB1 log("Loading settings"); - LoadSettings(); - VERB1 log("Loading plugins"); + + VERB1 log("Loading all plugins in "PLUGINS_LIB_DIR); g_pPluginManager = new CPluginManager(); g_pPluginManager->LoadPlugins(); - SetUpMW(); /* logging is inside */ + + VERB1 log("Loading settings"); + LoadSettings(); + + if (SetUpMW() != 0) /* logging is inside */ + throw 1; if (SetUpCron() != 0) throw 1; + #if 1 //def ENABLE_DBUS VERB1 log("Initializing dbus"); g_pCommLayer = new CCommLayerServerDBus(); @@ -806,14 +815,17 @@ int main(int argc, char** argv) #endif if (g_pCommLayer->m_init_error) throw 1; + VERB1 log("Adding inotify watch to glib main loop"); pGiochannel_inotify = g_io_channel_unix_new(inotify_fd); g_io_add_watch(pGiochannel_inotify, G_IO_IN, handle_inotify_cb, NULL); /* Add an event source which waits for INT/TERM signal */ + VERB1 log("Adding signal pipe watch to glib main loop"); pGiochannel_signal = g_io_channel_unix_new(s_signal_pipe[0]); g_io_add_watch(pGiochannel_signal, G_IO_IN, handle_signal_cb, NULL); /* Mark the territory */ + VERB1 log("Creating lock file"); if (Lock() != 0) throw 1; diff --git a/src/Daemon/PluginManager.cpp b/src/Daemon/PluginManager.cpp index 1e26ec2d..58151b29 100644 --- a/src/Daemon/PluginManager.cpp +++ b/src/Daemon/PluginManager.cpp @@ -132,17 +132,13 @@ void CPluginManager::LoadPlugins() struct dirent *dent; while ((dent = readdir(dir)) != NULL) { - if (is_regular_file(dent, PLUGINS_LIB_DIR)) - { - std::string name = dent->d_name; - std::string extension = name.substr(name.length() - sizeof(PLUGINS_LIB_EXTENSION) + 1); - if (extension == PLUGINS_LIB_EXTENSION) - { - name.erase(0, sizeof(PLUGINS_LIB_PREFIX) - 1); - name.erase(name.length() - sizeof(PLUGINS_LIB_EXTENSION)); - LoadPlugin(name.c_str()); - } - } + if (!is_regular_file(dent, PLUGINS_LIB_DIR)) + continue; + char *ext = strrchr(dent->d_name, '.'); + if (!ext || strcmp(ext + 1, PLUGINS_LIB_EXTENSION) != 0) + continue; + *ext = '\0'; + LoadPlugin(dent->d_name + sizeof(PLUGINS_LIB_PREFIX)-1); } closedir(dir); } @@ -195,13 +191,14 @@ void CPluginManager::UnLoadPlugin(const char *pName) } } -void CPluginManager::RegisterPlugin(const char *pName) +int CPluginManager::RegisterPlugin(const char *pName) { map_abrt_plugins_t::iterator abrt_plugin = m_mapABRTPlugins.find(pName); if (abrt_plugin != m_mapABRTPlugins.end()) { if (m_mapPlugins.find(pName) == m_mapPlugins.end()) { + /* Loaded, but not registered yet */ CPlugin* plugin = abrt_plugin->second->PluginNew(); map_plugin_settings_t pluginSettings; @@ -224,18 +221,21 @@ void CPluginManager::RegisterPlugin(const char *pName) } catch (CABRTException& e) { - log("Can't initialize plugin %s(%s): %s", + error_msg("Can't initialize plugin %s(%s): %s", pName, plugin_type_str[abrt_plugin->second->GetType()], e.what() ); UnLoadPlugin(pName); - return; + return -1; /* failure */ } m_mapPlugins[pName] = plugin; log("Registered plugin %s(%s)", pName, plugin_type_str[abrt_plugin->second->GetType()]); } + return 0; /* success */ } + error_msg("Can't initialize plugin %s: no such plugin installed", pName); + return -1; /* failure */ } void CPluginManager::RegisterPluginDBUS(const char *pName, const char *pDBUSSender) diff --git a/src/Daemon/PluginManager.h b/src/Daemon/PluginManager.h index 0d3400b2..301d0910 100644 --- a/src/Daemon/PluginManager.h +++ b/src/Daemon/PluginManager.h @@ -84,7 +84,7 @@ class CPluginManager * A method, which registers particular plugin. * @param pName A plugin name. */ - void RegisterPlugin(const char *pName); + int RegisterPlugin(const char *pName); /** * A method, which unregister particular plugin. * @param pName A plugin name. -- cgit