summaryrefslogtreecommitdiffstats
path: root/src/Daemon/PluginManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Daemon/PluginManager.cpp')
-rw-r--r--src/Daemon/PluginManager.cpp282
1 files changed, 142 insertions, 140 deletions
diff --git a/src/Daemon/PluginManager.cpp b/src/Daemon/PluginManager.cpp
index 663228b..c552880 100644
--- a/src/Daemon/PluginManager.cpp
+++ b/src/Daemon/PluginManager.cpp
@@ -27,6 +27,8 @@
#include "Polkit.h"
#include "PluginManager.h"
+using namespace std;
+
/**
* Text representation of plugin types.
*/
@@ -40,12 +42,12 @@ static const char *const plugin_type_str[] = {
bool LoadPluginSettings(const char *pPath, map_plugin_settings_t& pSettings)
{
- std::ifstream fIn;
+ ifstream fIn;
fIn.open(pPath);
if (!fIn.is_open())
return false;
- std::string line;
+ string line;
while (!fIn.eof())
{
getline(fIn, line);
@@ -54,8 +56,8 @@ bool LoadPluginSettings(const char *pPath, map_plugin_settings_t& pSettings)
bool is_value = false;
bool valid = false;
bool in_quote = false;
- std::string key;
- std::string value;
+ string key;
+ string value;
for (ii = 0; ii < line.length(); ii++)
{
if (line[ii] == '"')
@@ -138,7 +140,9 @@ void CPluginManager::LoadPlugins()
if (!ext || strcmp(ext + 1, PLUGINS_LIB_EXTENSION) != 0)
continue;
*ext = '\0';
- LoadPlugin(dent->d_name + sizeof(PLUGINS_LIB_PREFIX)-1);
+ if (strncmp(dent->d_name, PLUGINS_LIB_PREFIX, sizeof(PLUGINS_LIB_PREFIX)-1) != 0)
+ continue;
+ LoadPlugin(dent->d_name + sizeof(PLUGINS_LIB_PREFIX)-1, /*enabled_only:*/ true);
}
closedir(dir);
}
@@ -153,16 +157,51 @@ 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_string_t plugin_info;
+
+ plugin_info["Name"] = pName;
+
+ map_plugin_t::iterator it_plugin = m_mapPlugins.find(pName);
+ if (it_plugin != m_mapPlugins.end())
{
- return;
+ return it_plugin->second; /* ok */
}
- std::string libPath = ssprintf(PLUGINS_LIB_DIR"/"PLUGINS_LIB_PREFIX"%s."PLUGINS_LIB_EXTENSION, pName);
- CLoadedModule* module = new CLoadedModule(libPath.c_str());
+ 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;
+ string conf_fullname = ssprintf(PLUGINS_CONF_DIR"/%s."PLUGINS_CONF_EXTENSION, conf_name);
+ LoadPluginSettings(conf_fullname.c_str(), pluginSettings);
+ m_map_plugin_settings[pName] = 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()))
+ {
+ plugin_info["Enabled"] = "no";
+ string empty;
+ plugin_info["Type"] = empty;
+ plugin_info["Version"] = empty;
+ plugin_info["Description"] = empty;
+ plugin_info["Email"] = empty;
+ plugin_info["WWW"] = empty;
+ plugin_info["GTKBuilder"] = empty;
+ m_map_plugin_info[pName] = plugin_info;
+ VERB3 log("Plugin %s: 'Enabled' is not set, not loading it (yet)", pName);
+ return NULL; /* error */
+ }
+ }
+
+ 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 +211,74 @@ void CPluginManager::LoadPlugin(const char *pName)
module->GetMagicNumber(), PLUGINS_MAGIC_NUMBER,
module->GetType(), MAX_PLUGIN_TYPE);
delete module;
- return;
+ return NULL; /* error */
}
+ VERB3 log("Loaded plugin %s v.%s", pName, module->GetVersion());
- 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);
- }
-}
-
-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);
- }
+ plugin_info["Enabled"] = "yes";
+ plugin_info["Type"] = plugin_type_str[module->GetType()];
+ //plugin_info["Name"] = module->GetName();
+ plugin_info["Version"] = module->GetVersion();
+ plugin_info["Description"] = module->GetDescription();
+ plugin_info["Email"] = module->GetEmail();
+ plugin_info["WWW"] = module->GetWWW();
+ plugin_info["GTKBuilder"] = module->GetGTKBuilder();
+
+ m_map_plugin_info[pName] = plugin_info;
+ 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()]);
}
+ log("UnRegistered %s plugin %s", plugin_type_str[it_module->second->GetType()], pName);
+ m_mapLoadedModules.erase(it_module);
+ delete it_module->second;
+ }
+}
+
+#ifdef PLUGIN_DYNAMIC_LOAD_UNLOAD
+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,60 +288,67 @@ 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);
}
}
-
+#endif
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,39 +356,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();
-}
-
-vector_map_string_t CPluginManager::GetPluginsInfo()
-{
- vector_map_string_t ret;
- map_loaded_module_t::iterator it_module = m_mapLoadedModules.begin();
- for (; it_module != m_mapLoadedModules.end(); it_module++)
- {
- map_string_t plugin_info;
-
- plugin_info["Enabled"] = (m_mapPlugins.find(it_module->second->GetName()) != m_mapPlugins.end()) ?
- "yes" : "no";
- plugin_info["Type"] = plugin_type_str[it_module->second->GetType()];
- plugin_info["Name"] = it_module->second->GetName();
- plugin_info["Version"] = it_module->second->GetVersion();
- plugin_info["Description"] = it_module->second->GetDescription();
- plugin_info["Email"] = it_module->second->GetEmail();
- plugin_info["WWW"] = it_module->second->GetWWW();
- plugin_info["GTKBuilder"] = it_module->second->GetGTKBuilder();
- ret.push_back(plugin_info);
- }
- return ret;
+ map_loaded_module_t::iterator it_module = m_mapLoadedModules.find(pName);
+ return it_module->second->GetType();
}
void CPluginManager::SetPluginSettings(const char *pName,
@@ -388,14 +392,14 @@ void CPluginManager::SetPluginSettings(const char *pName,
return;
}
- std::string home = get_home_dir(xatoi_u(pUID.c_str()));
+ string home = get_home_dir(xatoi_u(pUID.c_str()));
if (home == "")
{
return;
}
- std::string confDir = home + "/.abrt";
- std::string confPath = confDir + "/" + pName + "."PLUGINS_CONF_EXTENSION;
+ string confDir = home + "/.abrt";
+ string confPath = confDir + "/" + pName + "."PLUGINS_CONF_EXTENSION;
uid_t uid = xatoi_u(pUID.c_str());
struct passwd* pw = getpwuid(uid);
gid_t gid = pw ? pw->pw_gid : uid;
@@ -415,7 +419,7 @@ void CPluginManager::SetPluginSettings(const char *pName,
}
if (chown(confDir.c_str(), uid, gid) == -1)
{
- perror_msg("Can't change '%s' ownership to %u:%u", confPath.c_str(), (int)uid, (int)gid);
+ perror_msg("Can't change '%s' ownership to %lu:%lu", confPath.c_str(), (long)uid, (long)gid);
return;
}
}
@@ -433,40 +437,38 @@ void CPluginManager::SetPluginSettings(const char *pName,
SavePluginSettings(confPath, pSettings);
if (chown(confPath.c_str(), uid, gid) == -1)
{
- perror_msg("Can't change '%s' ownership to %u:%u", confPath.c_str(), (int)uid, (int)gid);
+ perror_msg("Can't change '%s' ownership to %lu:%lu", confPath.c_str(), (long)uid, (long)gid);
return;
}
*/
#endif
}
-map_plugin_settings_t CPluginManager::GetPluginSettings(const char *pName,
- const char *pUID)
+map_plugin_settings_t CPluginManager::GetPluginSettings(const char *pName)
{
map_plugin_settings_t ret;
+
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())
{
+ VERB3 log("Returning settings for loaded plugin %s", pName);
ret = it_plugin->second->GetSettings();
- /** we don't want to load it from daemon if it's running under root
- but wi might get back to this once we make the daemon to not run
- with root privileges
- */
- /*
- if (it_module->second->GetType() == REPORTER)
- {
- std::string home = get_home_dir(xatoi_u(pUID.c_str()));
- if (home != "")
- {
- LoadPluginSettings(home + "/.abrt/" + pName + "."PLUGINS_CONF_EXTENSION, ret);
- }
- }
- */
return ret;
}
}
+ /* else: module is not loaded */
+ map_map_string_t::iterator it_settings = m_map_plugin_settings.find(pName);
+ if (it_settings != m_map_plugin_settings.end())
+ {
+ /* but it exists, its settings are available nevertheless */
+ VERB3 log("Returning settings for non-loaded plugin %s", pName);
+ ret = it_settings->second;
+ return ret;
+ }
+
+ VERB3 log("Request for settings of unknown plugin %s, returning null result", pName);
return ret;
}