summaryrefslogtreecommitdiffstats
path: root/src/Daemon/PluginManager.cpp
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2010-01-10 18:05:54 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2010-01-10 18:05:54 +0100
commitb94e437131d1f396e1a700e2a5664199af008cfd (patch)
tree2c2f4127c87ab5e76fac0499203d3809cf314084 /src/Daemon/PluginManager.cpp
parent2fc32bfb8bb35e3841405691c65eb04547eba8cc (diff)
downloadabrt-b94e437131d1f396e1a700e2a5664199af008cfd.tar.gz
abrt-b94e437131d1f396e1a700e2a5664199af008cfd.tar.xz
abrt-b94e437131d1f396e1a700e2a5664199af008cfd.zip
replace plugin enabling via EnabledPlugins by par-plugin Enabled = yes/no
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'src/Daemon/PluginManager.cpp')
-rw-r--r--src/Daemon/PluginManager.cpp179
1 files changed, 88 insertions, 91 deletions
diff --git a/src/Daemon/PluginManager.cpp b/src/Daemon/PluginManager.cpp
index 663228b..4aef630 100644
--- a/src/Daemon/PluginManager.cpp
+++ b/src/Daemon/PluginManager.cpp
@@ -138,7 +138,7 @@ void CPluginManager::LoadPlugins()
if (!ext || strcmp(ext + 1, PLUGINS_LIB_EXTENSION) != 0)
continue;
*ext = '\0';
- LoadPlugin(dent->d_name + sizeof(PLUGINS_LIB_PREFIX)-1);
+ LoadPlugin(dent->d_name + sizeof(PLUGINS_LIB_PREFIX)-1, /*enabled_only:*/ true);
}
closedir(dir);
}
@@ -153,16 +153,37 @@ void CPluginManager::UnLoadPlugins()
}
}
-void CPluginManager::LoadPlugin(const char *pName)
+CPlugin* CPluginManager::LoadPlugin(const char *pName, bool enabled_only)
{
- if (m_mapLoadedModules.find(pName) != m_mapLoadedModules.end())
+ map_plugin_t::iterator it_plugin = m_mapPlugins.find(pName);
+ if (it_plugin != m_mapPlugins.end())
{
- return;
+ return it_plugin->second; /* ok */
+ }
+
+ const char *conf_name = pName;
+ if (strncmp(pName, "Kerneloops", sizeof("Kerneloops")-1) == 0)
+ {
+ /* Kerneloops{,Scanner,Reporter} share the same .conf file */
+ conf_name = "Kerneloops";
+ }
+ map_plugin_settings_t pluginSettings;
+ std::string conf_fullname = ssprintf(PLUGINS_CONF_DIR"/%s."PLUGINS_CONF_EXTENSION, conf_name);
+ LoadPluginSettings(conf_fullname.c_str(), pluginSettings);
+ VERB3 log("Loaded %s.conf", conf_name);
+
+ if (enabled_only)
+ {
+ map_plugin_settings_t::iterator it = pluginSettings.find("Enabled");
+ if (it == pluginSettings.end() || !string_to_bool(it->second.c_str()))
+ {
+ VERB3 log("Plugin %s: 'Enabled' is not set, not loading it (yet)", pName);
+ return NULL; /* error */
+ }
}
std::string libPath = ssprintf(PLUGINS_LIB_DIR"/"PLUGINS_LIB_PREFIX"%s."PLUGINS_LIB_EXTENSION, pName);
CLoadedModule* module = new CLoadedModule(libPath.c_str());
-
if (module->GetMagicNumber() != PLUGINS_MAGIC_NUMBER
|| module->GetType() < 0
|| module->GetType() > MAX_PLUGIN_TYPE
@@ -172,95 +193,63 @@ void CPluginManager::LoadPlugin(const char *pName)
module->GetMagicNumber(), PLUGINS_MAGIC_NUMBER,
module->GetType(), MAX_PLUGIN_TYPE);
delete module;
- return;
- }
-
- log("Plugin %s (%s) succesfully loaded", pName, module->GetVersion());
- m_mapLoadedModules[pName] = module;
-}
-
-void CPluginManager::UnLoadPlugin(const char *pName)
-{
- map_loaded_module_t::iterator it_module = m_mapLoadedModules.find(pName);
- if (it_module != m_mapLoadedModules.end())
- {
- UnRegisterPlugin(pName);
- delete it_module->second;
- m_mapLoadedModules.erase(it_module);
- log("Plugin %s successfully unloaded", pName);
+ return NULL; /* error */
}
-}
+ VERB3 log("Loaded plugin %s v.%s", pName, module->GetVersion());
-int CPluginManager::RegisterPlugin(const char *pName)
-{
- map_loaded_module_t::iterator it_module = m_mapLoadedModules.find(pName);
- if (it_module == m_mapLoadedModules.end())
- {
- error_msg("Can't initialize plugin %s: no such plugin installed", pName);
- return -1; /* failure */
- }
- if (m_mapPlugins.find(pName) != m_mapPlugins.end())
- {
- return 0; /* already registered, success */
- }
-
- /* Loaded, but not registered yet */
- CPlugin* plugin = it_module->second->PluginNew();
- map_plugin_settings_t pluginSettings;
-
- const char *conf_name = pName;
- if (strncmp(pName, "Kerneloops", sizeof("Kerneloops")-1) == 0) {
- /* Kerneloops{,Scanner,Reporter} share the same .conf file */
- conf_name = "Kerneloops";
- }
- LoadPluginSettings(ssprintf(PLUGINS_CONF_DIR"/%s."PLUGINS_CONF_EXTENSION, conf_name).c_str(), pluginSettings);
- VERB3 log("Loaded %s.conf", conf_name);
+ CPlugin* plugin = NULL;
try
{
+ plugin = module->PluginNew();
plugin->Init();
plugin->SetSettings(pluginSettings);
}
catch (CABRTException& e)
{
- error_msg("Can't initialize plugin %s(%s): %s",
+ error_msg("Can't initialize plugin %s: %s",
pName,
- plugin_type_str[it_module->second->GetType()],
e.what()
);
- UnLoadPlugin(pName);
- return -1; /* failure */
+ delete plugin;
+ delete module;
+ return NULL; /* error */
}
- m_mapPlugins[pName] = plugin;
- log("Registered plugin %s(%s)", pName, plugin_type_str[it_module->second->GetType()]);
- return 0; /* success */
-}
-void CPluginManager::RegisterPluginDBUS(const char *pName, const char *pDBUSSender)
-{
- int polkit_result = polkit_check_authorization(pDBUSSender,
- "org.fedoraproject.abrt.change-daemon-settings");
- if (polkit_result == PolkitYes)
- {
- RegisterPlugin(pName);
- } else
- {
- log("User %s not authorized, returned %d", pDBUSSender, polkit_result);
- }
+ m_mapLoadedModules[pName] = module;
+ m_mapPlugins[pName] = plugin;
+ log("Registered %s plugin '%s'", plugin_type_str[module->GetType()], pName);
+ return plugin; /* ok */
}
-void CPluginManager::UnRegisterPlugin(const char *pName)
+void CPluginManager::UnLoadPlugin(const char *pName)
{
map_loaded_module_t::iterator it_module = m_mapLoadedModules.find(pName);
if (it_module != m_mapLoadedModules.end())
{
map_plugin_t::iterator it_plugin = m_mapPlugins.find(pName);
- if (it_plugin != m_mapPlugins.end())
+ if (it_plugin != m_mapPlugins.end()) /* always true */
{
it_plugin->second->DeInit();
delete it_plugin->second;
m_mapPlugins.erase(it_plugin);
- log("UnRegistered plugin %s(%s)", pName, plugin_type_str[it_module->second->GetType()]);
}
+ delete it_module->second;
+ m_mapLoadedModules.erase(it_module);
+ log("UnRegistered %s plugin %s", plugin_type_str[it_module->second->GetType()], pName);
+ }
+}
+
+void CPluginManager::RegisterPluginDBUS(const char *pName, const char *pDBUSSender)
+{
+ int polkit_result = polkit_check_authorization(pDBUSSender,
+ "org.fedoraproject.abrt.change-daemon-settings");
+ if (polkit_result == PolkitYes)
+ {
+//TODO: report success/failure
+ LoadPlugin(pName);
+ } else
+ {
+ log("User %s not authorized, returned %d", pDBUSSender, polkit_result);
}
}
@@ -270,7 +259,7 @@ void CPluginManager::UnRegisterPluginDBUS(const char *pName, const char *pDBUSSe
"org.fedoraproject.abrt.change-daemon-settings");
if (polkit_result == PolkitYes)
{
- UnRegisterPlugin(pName);
+ UnLoadPlugin(pName);
} else
{
log("user %s not authorized, returned %d", pDBUSSender, polkit_result);
@@ -280,50 +269,57 @@ void CPluginManager::UnRegisterPluginDBUS(const char *pName, const char *pDBUSSe
CAnalyzer* CPluginManager::GetAnalyzer(const char *pName)
{
- map_plugin_t::iterator it_plugin = m_mapPlugins.find(pName);
- if (it_plugin == m_mapPlugins.end())
+ CPlugin* plugin = LoadPlugin(pName);
+ if (!plugin)
{
- throw CABRTException(EXCEP_PLUGIN, "Plugin '%s' is not registered", pName);
+ error_msg("Plugin '%s' is not registered", pName);
+ return NULL;
}
if (m_mapLoadedModules[pName]->GetType() != ANALYZER)
{
- throw CABRTException(EXCEP_PLUGIN, "Plugin '%s' is not an analyzer plugin", pName);
+ error_msg("Plugin '%s' is not an analyzer plugin", pName);
+ return NULL;
}
- return (CAnalyzer*)(it_plugin->second);
+ return (CAnalyzer*)plugin;
}
CReporter* CPluginManager::GetReporter(const char *pName)
{
- map_plugin_t::iterator it_plugin = m_mapPlugins.find(pName);
- if (it_plugin == m_mapPlugins.end())
+ CPlugin* plugin = LoadPlugin(pName);
+ if (!plugin)
{
- throw CABRTException(EXCEP_PLUGIN, "Plugin '%s' is not registered", pName);
+ error_msg("Plugin '%s' is not registered", pName);
+ return NULL;
}
if (m_mapLoadedModules[pName]->GetType() != REPORTER)
{
- throw CABRTException(EXCEP_PLUGIN, "Plugin '%s' is not a reporter plugin", pName);
+ error_msg("Plugin '%s' is not a reporter plugin", pName);
+ return NULL;
}
- return (CReporter*)(it_plugin->second);
+ return (CReporter*)plugin;
}
-CAction* CPluginManager::GetAction(const char *pName)
+CAction* CPluginManager::GetAction(const char *pName, bool silent)
{
- map_plugin_t::iterator it_plugin = m_mapPlugins.find(pName);
- if (it_plugin == m_mapPlugins.end())
+ CPlugin* plugin = LoadPlugin(pName);
+ if (!plugin)
{
- throw CABRTException(EXCEP_PLUGIN, "Plugin '%s' is not registered", pName);
+ error_msg("Plugin '%s' is not registered", pName);
+ return NULL;
}
if (m_mapLoadedModules[pName]->GetType() != ACTION)
{
- throw CABRTException(EXCEP_PLUGIN, "Plugin '%s' is not an action plugin", pName);
+ if (!silent)
+ error_msg("Plugin '%s' is not an action plugin", pName);
+ return NULL;
}
- return (CAction*)(it_plugin->second);
+ return (CAction*)plugin;
}
CDatabase* CPluginManager::GetDatabase(const char *pName)
{
- map_plugin_t::iterator it_plugin = m_mapPlugins.find(pName);
- if (it_plugin == m_mapPlugins.end())
+ CPlugin* plugin = LoadPlugin(pName);
+ if (!plugin)
{
throw CABRTException(EXCEP_PLUGIN, "Plugin '%s' is not registered", pName);
}
@@ -331,17 +327,18 @@ CDatabase* CPluginManager::GetDatabase(const char *pName)
{
throw CABRTException(EXCEP_PLUGIN, "Plugin '%s' is not a database plugin", pName);
}
- return (CDatabase*)(it_plugin->second);
+ return (CDatabase*)plugin;
}
plugin_type_t CPluginManager::GetPluginType(const char *pName)
{
- map_plugin_t::iterator it_plugin = m_mapPlugins.find(pName);
- if (it_plugin == m_mapPlugins.end())
+ CPlugin* plugin = LoadPlugin(pName);
+ if (!plugin)
{
throw CABRTException(EXCEP_PLUGIN, "Plugin '%s' is not registered", pName);
}
- return m_mapLoadedModules[pName]->GetType();
+ map_loaded_module_t::iterator it_module = m_mapLoadedModules.find(pName);
+ return it_module->second->GetType();
}
vector_map_string_t CPluginManager::GetPluginsInfo()