diff options
31 files changed, 266 insertions, 202 deletions
diff --git a/inc/abrtlib.h b/inc/abrtlib.h index 8e3f1f4e..5721c6fa 100644 --- a/inc/abrtlib.h +++ b/inc/abrtlib.h @@ -113,4 +113,6 @@ off_t copyfd_eof(int src_fd, int dst_fd); off_t copyfd_size(int src_fd, int dst_fd, off_t size); void copyfd_exact_size(int src_fd, int dst_fd, off_t size); +std::string get_home_dir(int uid); + #endif diff --git a/lib/CommLayer/CommLayerServerDBus.cpp b/lib/CommLayer/CommLayerServerDBus.cpp index d2b6d4d1..4b6c99b0 100644 --- a/lib/CommLayer/CommLayerServerDBus.cpp +++ b/lib/CommLayer/CommLayerServerDBus.cpp @@ -22,7 +22,7 @@ CCommLayerServerDBus::CCommLayerServerDBus() } catch(DBus::Error err) { - throw CABRTException(EXCEP_FATAL, std::string(__func__) + + throw CABRTException(EXCEP_FATAL, std::string(__func__) + "\nPlease check if:\n" + " * abrt is being run with root permissions\n" + " * you have reloaded the dbus\n"+ @@ -116,9 +116,10 @@ vector_map_string_string_t CCommLayerServerDBus::GetPluginsInfo() return plugins_info; } -map_plugin_settings_t CCommLayerServerDBus::GetPluginSettings(const std::string& pName) +map_plugin_settings_t CCommLayerServerDBus::GetPluginSettings(const std::string& pName, const std::string& pSender) { - return m_pObserver->GetPluginSettings(pName); + unsigned long unix_uid = m_pConn->sender_unix_uid(pSender.c_str()); + return m_pObserver->GetPluginSettings(pName, to_string(unix_uid)); } diff --git a/lib/CommLayer/CommLayerServerDBus.h b/lib/CommLayer/CommLayerServerDBus.h index bec75672..a020e9bc 100644 --- a/lib/CommLayer/CommLayerServerDBus.h +++ b/lib/CommLayer/CommLayerServerDBus.h @@ -27,7 +27,7 @@ class CCommLayerServerDBus virtual bool DeleteDebugDump(const std::string& pUUID, const std::string& pSender); virtual map_crash_report_t GetJobResult(uint64_t pJobID, const std::string& pSender); virtual vector_map_string_string_t GetPluginsInfo(); - virtual map_plugin_settings_t GetPluginSettings(const std::string& pName); + virtual map_plugin_settings_t GetPluginSettings(const std::string& pName, const std::string& pSender); void RegisterPlugin(const std::string& pName); void UnRegisterPlugin(const std::string& pName); diff --git a/lib/CommLayer/DBusServerProxy.cpp b/lib/CommLayer/DBusServerProxy.cpp index 0693c6dd..a246e8ae 100644 --- a/lib/CommLayer/DBusServerProxy.cpp +++ b/lib/CommLayer/DBusServerProxy.cpp @@ -212,9 +212,10 @@ DBus::Message CDBusServer_adaptor::_GetPluginSettings_stub(const DBus::CallMessa { DBus::MessageIter ri = call.reader(); std::string PluginName; + std::string uid; ri >> PluginName; map_plugin_settings_t plugin_settings; - plugin_settings = GetPluginSettings(PluginName); + plugin_settings = GetPluginSettings(PluginName, call.sender()); DBus::ReturnMessage reply(call); DBus::MessageIter wi = reply.writer(); wi << plugin_settings; diff --git a/lib/CommLayer/DBusServerProxy.h b/lib/CommLayer/DBusServerProxy.h index 495309b7..299ab34e 100644 --- a/lib/CommLayer/DBusServerProxy.h +++ b/lib/CommLayer/DBusServerProxy.h @@ -50,7 +50,7 @@ public: virtual bool DeleteDebugDump(const std::string& pUUID, const std::string& pDBusSender) = 0; virtual map_crash_report_t GetJobResult(uint64_t pJobID, const std::string& pDBusSender) = 0; virtual vector_map_string_string_t GetPluginsInfo() = 0; - virtual map_plugin_settings_t GetPluginSettings(const std::string& pName) = 0; + virtual map_plugin_settings_t GetPluginSettings(const std::string& pName, const std::string& pDBusSender) = 0; virtual void RegisterPlugin(const std::string& pName) = 0; virtual void UnRegisterPlugin(const std::string& pName) = 0; diff --git a/lib/CommLayer/Observer.h b/lib/CommLayer/Observer.h index ec7268e8..42688295 100644 --- a/lib/CommLayer/Observer.h +++ b/lib/CommLayer/Observer.h @@ -26,7 +26,7 @@ class CObserver { virtual bool DeleteDebugDump(const std::string& pUUID, const std::string& pSender) = 0; virtual map_crash_report_t GetJobResult(uint64_t pJobID, const std::string &pSender) = 0; virtual vector_map_string_string_t GetPluginsInfo() = 0; - virtual map_plugin_settings_t GetPluginSettings(const std::string& pName) = 0; + virtual map_plugin_settings_t GetPluginSettings(const std::string& pName, const std::string& pUID) = 0; virtual void RegisterPlugin(const std::string& pName) = 0; virtual void UnRegisterPlugin(const std::string& pName) = 0; }; diff --git a/lib/MiddleWare/Plugin.cpp b/lib/MiddleWare/Plugin.cpp index cf2dff61..161ead8a 100644 --- a/lib/MiddleWare/Plugin.cpp +++ b/lib/MiddleWare/Plugin.cpp @@ -18,72 +18,10 @@ */ #include "Plugin.h" -#include <fstream> /* class CPlugin's virtuals */ CPlugin::~CPlugin() {} void CPlugin::Init() {} void CPlugin::DeInit() {} -void CPlugin::LoadSettings(const std::string& pPath) {} void CPlugin::SetSettings(const map_plugin_settings_t& pSettings) {} map_plugin_settings_t CPlugin::GetSettings() {return map_plugin_settings_t();} - -void plugin_load_settings(const std::string& path, map_plugin_settings_t& settings) -{ - std::ifstream fIn; - fIn.open(path.c_str()); - if (fIn.is_open()) - { - std::string line; - while (!fIn.eof()) - { - getline(fIn, line); - - int ii; - bool is_value = false; - bool valid = false; - bool in_quote = false; - std::string key = ""; - std::string value = ""; - for (ii = 0; ii < line.length(); ii++) - { - if (line[ii] == '\"') - { - in_quote = in_quote == true ? false : true; - } - if (isspace(line[ii]) && !in_quote) - { - continue; - } - if (line[ii] == '#' && !in_quote) - { - break; - } - else if (line[ii] == '=' && !in_quote) - { - is_value = true; - } - else if (line[ii] == '=' && is_value && !in_quote) - { - key = ""; - value = ""; - break; - } - else if (!is_value) - { - key += line[ii]; - } - else - { - valid = true; - value += line[ii]; - } - } - if (valid && !in_quote) - { - settings[key] = value; - } - } - fIn.close(); - } -} diff --git a/lib/MiddleWare/Plugin.h b/lib/MiddleWare/Plugin.h index d615fc8d..a0b64aea 100644 --- a/lib/MiddleWare/Plugin.h +++ b/lib/MiddleWare/Plugin.h @@ -26,7 +26,7 @@ #include <string> #include <map> -#define PLUGINS_MAGIC_NUMBER 4 +#define PLUGINS_MAGIC_NUMBER 5 #define PLUGINS_CONF_EXTENSION "conf" #define PLUGINS_LIB_EXTENSION "so" @@ -54,11 +54,6 @@ class CPlugin */ virtual void DeInit(); /** - * A method, which loads a plugin settings from a file. It is not mandatory method. - * @param pPath A path to plugin configuration file. - */ - virtual void LoadSettings(const std::string& pPath); - /** * A method, which takes a settings and apply them. It is not a mandatory method. * @param pSettings Plugin's settings */ @@ -112,6 +107,4 @@ typedef struct SPluginInfo PLUGINS_MAGIC_NUMBER,\ }; -void plugin_load_settings(const std::string& path, map_plugin_settings_t& settings); - #endif /* PLUGIN_H_ */ diff --git a/lib/Plugins/Bugzilla.cpp b/lib/Plugins/Bugzilla.cpp index 6bbb75c6..8a901e39 100644 --- a/lib/Plugins/Bugzilla.cpp +++ b/lib/Plugins/Bugzilla.cpp @@ -94,6 +94,55 @@ void CReporterBugzilla::Logout() } } +void CReporterBugzilla::AddPlusOneComment(const std::string& pBugId) +{ + xmlrpc_c::paramList paramList; + map_xmlrpc_params_t addCommentParams; + map_xmlrpc_params_t ret; + + addCommentParams["id"] = xmlrpc_c::value_int(atoi(pBugId.c_str())); + addCommentParams["comment"] = xmlrpc_c::value_string("+1"); + + paramList.add(xmlrpc_c::value_struct(addCommentParams)); + xmlrpc_c::rpcPtr rpc(new xmlrpc_c::rpc("Bug.add_comment", paramList)); + try + { + rpc->call(m_pXmlrpcClient, m_pCarriageParm); + } + catch (std::exception& e) + { + throw CABRTException(EXCEP_PLUGIN, std::string("CReporterBugzilla::AddPlusOneComment(): ") + e.what()); + } + ret = xmlrpc_c::value_struct(rpc->getResult()); +} + +void CReporterBugzilla::AddPlusOneCC(const std::string& pBugId) +{ + xmlrpc_c::paramList paramList; + map_xmlrpc_params_t addCCParams; + map_xmlrpc_params_t ret; + map_xmlrpc_params_t updates; + + std::vector<xmlrpc_c::value> CCList; + CCList.push_back(xmlrpc_c::value_string(m_sLogin)); + updates["add_cc"] = xmlrpc_c::value_array(CCList); + + addCCParams["ids"] = xmlrpc_c::value_int(atoi(pBugId.c_str())); + addCCParams["updates"] = xmlrpc_c::value_struct(updates); + + paramList.add(xmlrpc_c::value_struct(addCCParams)); + xmlrpc_c::rpcPtr rpc(new xmlrpc_c::rpc("Bug.update", paramList)); + try + { + rpc->call(m_pXmlrpcClient, m_pCarriageParm); + } + catch (std::exception& e) + { + throw CABRTException(EXCEP_PLUGIN, std::string("CReporterBugzilla::AddPlusOneComment(): ") + e.what()); + } + ret = xmlrpc_c::value_struct(rpc->getResult()); +} + bool CReporterBugzilla::CheckUUIDInBugzilla(const std::string& pComponent, const std::string& pUUID) { xmlrpc_c::paramList paramList; @@ -115,8 +164,17 @@ bool CReporterBugzilla::CheckUUIDInBugzilla(const std::string& pComponent, const std::vector<xmlrpc_c::value> bugs = xmlrpc_c::value_array(ret["bugs"]).vectorValueValue(); if (bugs.size() > 0) { - comm_layer_inner_debug("Bug is already reported."); - comm_layer_inner_status("Bug is already reported."); + map_xmlrpc_params_t bug; + std::stringstream ss; + + bug = xmlrpc_c::value_struct(bugs[0]); + ss << xmlrpc_c::value_int(bug["bug_id"]); + + comm_layer_inner_debug("Bug is already reported: " + ss.str()); + comm_layer_inner_status("Bug is already reported: " + ss.str()); + + AddPlusOneComment(ss.str()); + AddPlusOneCC(ss.str()); return true; } return false; @@ -319,14 +377,6 @@ void CReporterBugzilla::Report(const map_crash_report_t& pCrashReport, const std DeleteXMLRPCClient(); } -void CReporterBugzilla::LoadSettings(const std::string& pPath) -{ - map_plugin_settings_t settings; - plugin_load_settings(pPath, settings); - - SetSettings(settings); -} - void CReporterBugzilla::SetSettings(const map_plugin_settings_t& pSettings) { if (pSettings.find("BugzillaURL") != pSettings.end()) diff --git a/lib/Plugins/Bugzilla.h b/lib/Plugins/Bugzilla.h index 84ae4e68..3849f17f 100644 --- a/lib/Plugins/Bugzilla.h +++ b/lib/Plugins/Bugzilla.h @@ -17,6 +17,8 @@ class CReporterBugzilla : public CReporter static PRInt32 Base64Encode_cb(void *arg, const char *obuf, PRInt32 size); void Login(); void Logout(); + void AddPlusOneComment(const std::string& pBugId); + void AddPlusOneCC(const std::string& pBugId); bool CheckUUIDInBugzilla(const std::string& pComponent, const std::string& pUUID); std::string NewBug(const map_crash_report_t& pCrashReport); void AddAttachments(const std::string& pBugId, const map_crash_report_t& pCrashReport); @@ -38,7 +40,6 @@ class CReporterBugzilla : public CReporter public: CReporterBugzilla(); virtual ~CReporterBugzilla(); - virtual void LoadSettings(const std::string& pPath); virtual void SetSettings(const map_plugin_settings_t& pSettings); virtual map_plugin_settings_t GetSettings(); virtual void Report(const map_crash_report_t& pCrashReport, diff --git a/lib/Plugins/CCpp.cpp b/lib/Plugins/CCpp.cpp index 657e372b..80727dd3 100644 --- a/lib/Plugins/CCpp.cpp +++ b/lib/Plugins/CCpp.cpp @@ -552,14 +552,6 @@ void CAnalyzerCCpp::DeInit() } } -void CAnalyzerCCpp::LoadSettings(const std::string& pPath) -{ - map_plugin_settings_t settings; - plugin_load_settings(pPath, settings); - - SetSettings(settings); -} - void CAnalyzerCCpp::SetSettings(const map_plugin_settings_t& pSettings) { if (pSettings.find("MemoryMap") != pSettings.end()) diff --git a/lib/Plugins/CCpp.h b/lib/Plugins/CCpp.h index b14a90fa..b428a8ad 100644 --- a/lib/Plugins/CCpp.h +++ b/lib/Plugins/CCpp.h @@ -40,7 +40,6 @@ class CAnalyzerCCpp : public CAnalyzer virtual void CreateReport(const std::string& pDebugDumpDir); virtual void Init(); virtual void DeInit(); - virtual void LoadSettings(const std::string& pPath); virtual void SetSettings(const map_plugin_settings_t& pSettings); virtual map_plugin_settings_t GetSettings(); }; diff --git a/lib/Plugins/FileTransfer.cpp b/lib/Plugins/FileTransfer.cpp index 1aa724d6..981e574d 100644 --- a/lib/Plugins/FileTransfer.cpp +++ b/lib/Plugins/FileTransfer.cpp @@ -222,14 +222,6 @@ void CFileTransfer::Run(const std::string& pActiveDir, const std::string& pArgs) } } -void CFileTransfer::LoadSettings(const std::string& pPath) -{ - map_plugin_settings_t settings; - plugin_load_settings(pPath, settings); - - SetSettings(settings); -} - void CFileTransfer::SetSettings(const map_plugin_settings_t& pSettings) { if (pSettings.find("URL") != pSettings.end()) diff --git a/lib/Plugins/FileTransfer.h b/lib/Plugins/FileTransfer.h index 3f8be474..943c52f4 100644 --- a/lib/Plugins/FileTransfer.h +++ b/lib/Plugins/FileTransfer.h @@ -49,7 +49,6 @@ class CFileTransfer : public CAction m_nRetryDelay(20) {} - virtual void LoadSettings(const std::string& pPath); virtual void SetSettings(const map_plugin_settings_t& pSettings); virtual map_plugin_settings_t GetSettings(); virtual void Run(const std::string& pActiveDir, diff --git a/lib/Plugins/KerneloopsReporter.cpp b/lib/Plugins/KerneloopsReporter.cpp index d0aedb7f..1860fd8b 100644 --- a/lib/Plugins/KerneloopsReporter.cpp +++ b/lib/Plugins/KerneloopsReporter.cpp @@ -113,14 +113,6 @@ void CKerneloopsReporter::Report(const map_crash_report_t& pCrashReport, const s comm_layer_inner_status("Report has not been sent..."); } -void CKerneloopsReporter::LoadSettings(const std::string& pPath) -{ - map_plugin_settings_t settings; - plugin_load_settings(pPath, settings); - - SetSettings(settings); -} - void CKerneloopsReporter::SetSettings(const map_plugin_settings_t& pSettings) { if (pSettings.find("SubmitURL") != pSettings.end()) diff --git a/lib/Plugins/KerneloopsReporter.h b/lib/Plugins/KerneloopsReporter.h index 7dcd0e0c..c8295a7a 100644 --- a/lib/Plugins/KerneloopsReporter.h +++ b/lib/Plugins/KerneloopsReporter.h @@ -40,7 +40,6 @@ class CKerneloopsReporter : public CReporter public: CKerneloopsReporter(); - virtual void LoadSettings(const std::string& pPath); virtual void SetSettings(const map_plugin_settings_t& pSettings); virtual map_plugin_settings_t GetSettings(); virtual void Report(const map_crash_report_t& pCrashReport, diff --git a/lib/Plugins/KerneloopsScanner.cpp b/lib/Plugins/KerneloopsScanner.cpp index bab9e65b..32289f3b 100644 --- a/lib/Plugins/KerneloopsScanner.cpp +++ b/lib/Plugins/KerneloopsScanner.cpp @@ -169,14 +169,6 @@ int CKerneloopsScanner::ScanSysLogFile(const char *filename) return cnt_FoundOopses; } -void CKerneloopsScanner::LoadSettings(const std::string& pPath) -{ - map_plugin_settings_t settings; - plugin_load_settings(pPath, settings); - - SetSettings(settings); -} - void CKerneloopsScanner::SetSettings(const map_plugin_settings_t& pSettings) { if (pSettings.find("SysLogFile") != pSettings.end()) diff --git a/lib/Plugins/KerneloopsScanner.h b/lib/Plugins/KerneloopsScanner.h index 5ec5fbea..ca19a3a4 100644 --- a/lib/Plugins/KerneloopsScanner.h +++ b/lib/Plugins/KerneloopsScanner.h @@ -51,7 +51,6 @@ class CKerneloopsScanner : public CAction {} virtual void Run(const std::string& pActionDir, const std::string& pArgs); - virtual void LoadSettings(const std::string& pPath); virtual void SetSettings(const map_plugin_settings_t& pSettings); virtual map_plugin_settings_t GetSettings(); }; diff --git a/lib/Plugins/Logger.cpp b/lib/Plugins/Logger.cpp index 1dd5a28d..cb702276 100644 --- a/lib/Plugins/Logger.cpp +++ b/lib/Plugins/Logger.cpp @@ -30,14 +30,6 @@ CLogger::CLogger() : m_bAppendLogs(true) {} -void CLogger::LoadSettings(const std::string& pPath) -{ - map_plugin_settings_t settings; - plugin_load_settings(pPath, settings); - - SetSettings(settings); -} - void CLogger::SetSettings(const map_plugin_settings_t& pSettings) { if (pSettings.find("LogPath") != pSettings.end()) diff --git a/lib/Plugins/Logger.h b/lib/Plugins/Logger.h index 0c31dca9..c838b3cb 100644 --- a/lib/Plugins/Logger.h +++ b/lib/Plugins/Logger.h @@ -34,7 +34,6 @@ class CLogger : public CReporter public: CLogger(); - virtual void LoadSettings(const std::string& pPath); virtual void SetSettings(const map_plugin_settings_t& pSettings); virtual map_plugin_settings_t GetSettings(); virtual void Report(const map_crash_report_t& pCrashReport, diff --git a/lib/Plugins/Mailx.cpp b/lib/Plugins/Mailx.cpp index d017d53f..5ee6b65d 100644 --- a/lib/Plugins/Mailx.cpp +++ b/lib/Plugins/Mailx.cpp @@ -137,14 +137,6 @@ void CMailx::Report(const map_crash_report_t& pCrashReport, const std::string& p } } -void CMailx::LoadSettings(const std::string& pPath) -{ - map_plugin_settings_t settings; - plugin_load_settings(pPath, settings); - - SetSettings(settings); -} - void CMailx::SetSettings(const map_plugin_settings_t& pSettings) { if (pSettings.find("Subject") != pSettings.end()) diff --git a/lib/Plugins/Mailx.h b/lib/Plugins/Mailx.h index 3cd88db4..b5d78364 100644 --- a/lib/Plugins/Mailx.h +++ b/lib/Plugins/Mailx.h @@ -42,7 +42,6 @@ class CMailx : public CReporter public: CMailx(); - virtual void LoadSettings(const std::string& pPath); virtual void SetSettings(const map_plugin_settings_t& pSettings); virtual map_plugin_settings_t GetSettings(); virtual void Report(const map_crash_report_t& pCrashReport, diff --git a/lib/Plugins/SQLite3.cpp b/lib/Plugins/SQLite3.cpp index ecf848e7..7720c409 100644 --- a/lib/Plugins/SQLite3.cpp +++ b/lib/Plugins/SQLite3.cpp @@ -267,14 +267,6 @@ const database_row_t CSQLite3::GetUUIDData(const std::string& pUUID, const std:: return table[0]; } -void CSQLite3::LoadSettings(const std::string& pPath) -{ - map_plugin_settings_t settings; - plugin_load_settings(pPath, settings); - - SetSettings(settings); -} - void CSQLite3::SetSettings(const map_plugin_settings_t& pSettings) { if (pSettings.find("DBPath") != pSettings.end()) diff --git a/lib/Plugins/SQLite3.h b/lib/Plugins/SQLite3.h index 99c3a8f8..987512e7 100644 --- a/lib/Plugins/SQLite3.h +++ b/lib/Plugins/SQLite3.h @@ -57,7 +57,6 @@ class CSQLite3 : public CDatabase virtual const vector_database_rows_t GetUIDData(const std::string& pUID); virtual const database_row_t GetUUIDData(const std::string& pUUID, const std::string& pUID); - virtual void LoadSettings(const std::string& pPath); virtual void SetSettings(const map_plugin_settings_t& pSettings); virtual map_plugin_settings_t GetSettings(); }; diff --git a/lib/Utils/xfuncs.cpp b/lib/Utils/xfuncs.cpp index 60c2eb4f..c8aee376 100644 --- a/lib/Utils/xfuncs.cpp +++ b/lib/Utils/xfuncs.cpp @@ -246,3 +246,9 @@ void xstat(const char *name, struct stat *stat_buf) if (stat(name, stat_buf)) perror_msg_and_die("can't stat '%s'", name); } + +std::string get_home_dir(int uid) +{ + struct passwd* pw = getpwuid(uid); + return pw ? pw->pw_dir : ""; +} diff --git a/src/Daemon/CrashWatcher.cpp b/src/Daemon/CrashWatcher.cpp index 0b98454e..4c0ba64e 100644 --- a/src/Daemon/CrashWatcher.cpp +++ b/src/Daemon/CrashWatcher.cpp @@ -820,16 +820,7 @@ bool CCrashWatcher::Report(map_crash_report_t pReport, const std::string& pUID) //} try { - struct passwd* pw = getpwuid(atoi(pUID.c_str())); - std::string home = pw ? pw->pw_dir : ""; - if (home != "") - { - m_pMW->Report(pReport, home + "/.abrt/"); - } - else - { - m_pMW->Report(pReport); - } + m_pMW->Report(pReport, pUID); } catch (CABRTException& e) { @@ -893,11 +884,11 @@ vector_map_string_string_t CCrashWatcher::GetPluginsInfo() return vector_map_string_string_t(); } -map_plugin_settings_t CCrashWatcher::GetPluginSettings(const std::string& pName) +map_plugin_settings_t CCrashWatcher::GetPluginSettings(const std::string& pName, const std::string& pUID) { try { - return m_pMW->GetPluginSettings(pName); + return m_pMW->GetPluginSettings(pName, pUID); } catch(CABRTException &e) { diff --git a/src/Daemon/CrashWatcher.h b/src/Daemon/CrashWatcher.h index 689d2108..bc8c6f64 100644 --- a/src/Daemon/CrashWatcher.h +++ b/src/Daemon/CrashWatcher.h @@ -132,7 +132,7 @@ class CCrashWatcher virtual map_crash_report_t GetJobResult(uint64_t pJobID, const std::string& pSender); /* plugins related */ virtual vector_map_string_string_t GetPluginsInfo(); - virtual map_plugin_settings_t GetPluginSettings(const std::string& pName); + virtual map_plugin_settings_t GetPluginSettings(const std::string& pName, const std::string& pUID); void RegisterPlugin(const std::string& pName); void UnRegisterPlugin(const std::string& pName); diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp index 6ebeffda..80380555 100644 --- a/src/Daemon/MiddleWare.cpp +++ b/src/Daemon/MiddleWare.cpp @@ -110,14 +110,16 @@ void CMiddleWare::UnRegisterPlugin(const std::string& pName) } void CMiddleWare::SetPluginSettings(const std::string& pName, + const std::string& pUID, const map_plugin_settings_t& pSettings) { - m_pPluginManager->SetPluginSettings(pName, pSettings); + m_pPluginManager->SetPluginSettings(pName, pUID, pSettings); } -map_plugin_settings_t CMiddleWare::GetPluginSettings(const std::string& pName) +map_plugin_settings_t CMiddleWare::GetPluginSettings(const std::string& pName, + const std::string& pUID) { - return m_pPluginManager->GetPluginSettings(pName); + return m_pPluginManager->GetPluginSettings(pName, pUID); } std::string CMiddleWare::GetLocalUUID(const std::string& pAnalyzer, @@ -245,13 +247,8 @@ void CMiddleWare::RunActionsAndReporters(const std::string& pDebugDumpDir) } } -void CMiddleWare::Report(const map_crash_report_t& pCrashReport) -{ - Report(pCrashReport, m_sPluginsConfDir); -} - void CMiddleWare::Report(const map_crash_report_t& pCrashReport, - const std::string& pPluginsConfDir) + const std::string& pUID) { if (pCrashReport.find(CD_MWANALYZER) == pCrashReport.end() || pCrashReport.find(CD_MWUID) == pCrashReport.end() || @@ -275,16 +272,29 @@ void CMiddleWare::Report(const map_crash_report_t& pCrashReport, if (m_pPluginManager->GetPluginType((*it_r).first) == REPORTER) { CReporter* reporter = m_pPluginManager->GetReporter((*it_r).first); + std::string home = ""; + map_plugin_settings_t oldSettings; + map_plugin_settings_t newSettings; - if (pPluginsConfDir == m_sPluginsConfDir) + if (pUID != "") { - reporter->Report(pCrashReport, (*it_r).second); + home = get_home_dir(atoi(pUID.c_str())); + if (home != "") + { + oldSettings = reporter->GetSettings(); + + if (m_pPluginManager->LoadPluginSettings(home + "/.abrt/" + (*it_r).first + "." + PLUGINS_CONF_EXTENSION, newSettings)) + { + reporter->SetSettings(newSettings); + } + } } - else + + reporter->Report(pCrashReport, (*it_r).second); + + if (home != "") { - reporter->LoadSettings(pPluginsConfDir + "/" + (*it_r).first + "." + PLUGINS_CONF_EXTENSION); - reporter->Report(pCrashReport, (*it_r).second); - reporter->LoadSettings(m_sPluginsConfDir + "/" + (*it_r).first + "." + PLUGINS_CONF_EXTENSION); + reporter->SetSettings(oldSettings); } } } diff --git a/src/Daemon/MiddleWare.h b/src/Daemon/MiddleWare.h index c9fc73a9..bb845435 100644 --- a/src/Daemon/MiddleWare.h +++ b/src/Daemon/MiddleWare.h @@ -199,23 +199,28 @@ class CMiddleWare */ void UnRegisterPlugin(const std::string& pName); /** - * A method, which sets up a plugin. + * A method, which sets up a plugin. The settings are also saved in home + * directory of an user. * @param pName A plugin name. + * @param pUID An uid of user. * @param pSettings A plugin's settings. */ void SetPluginSettings(const std::string& pName, + const std::string& pUID, const map_plugin_settings_t& pSettings); /** - * A method, which returns plugin's settings. + * A method, which returns plugin's settings according to user. * @param pName A plugin name. - * @return Plugin's settings + * @param pUID An uid of user. + * @return Plugin's settings accorting to user. */ - map_plugin_settings_t GetPluginSettings(const std::string& pName); + map_plugin_settings_t GetPluginSettings(const std::string& pName, + const std::string& pUID); /** * A method, which gets all plugins info (event those plugins which are * disabled). It can be send via DBus to GUI and displayed to an user. * Then a user can fill all needed informations like URLs etc. - * @return A vector of maps <key, vaule> + * @return A vector of maps <key, vaule>. */ vector_map_string_string_t GetPluginsInfo(); /** @@ -247,19 +252,16 @@ class CMiddleWare */ void RunActionsAndReporters(const std::string& pDebugDumpDir); /** - * A method, which reports a crash report to particular receiver. - * @param pCrashReport A crash report. - */ - void Report(const map_crash_report_t& pCrashReport); - /** * A method, which reports a crash report to particular receiver. It - * takes a path where settings of reporter are stored (e.g. $HOME/.abrt, + * takes an user uid, tries to find user config file and load it. If it + * fails, then default config is used. If pUID is emply string, default + * config is used. * ...). * @param pCrashReport A crash report. - * @param pSettingsPath A path to setting files. + * @param pUID An user uid */ void Report(const map_crash_report_t& pCrashReport, - const std::string& pSettingsPath); + const std::string& pUID); /** * A method, which deletes particular debugdump directory. * @param pDebugDumpDir A debugdump directory. diff --git a/src/Daemon/PluginManager.cpp b/src/Daemon/PluginManager.cpp index b0ba0dba..06db64a7 100644 --- a/src/Daemon/PluginManager.cpp +++ b/src/Daemon/PluginManager.cpp @@ -26,6 +26,9 @@ #include <dirent.h> #include <stdio.h> #include <sys/types.h> +#include <stdlib.h> +#include "abrtlib.h" +#include <fstream> /** * Text representation of plugin types. @@ -130,18 +133,20 @@ void CPluginManager::RegisterPlugin(const std::string& pName) { if (m_mapPlugins.find(pName) == m_mapPlugins.end()) { - std::string path = m_sPluginsConfDir + "/" + pName + "." + PLUGINS_CONF_EXTENSION; CPlugin* plugin = m_mapABRTPlugins[pName]->PluginNew(); + map_plugin_settings_t pluginSettings; + + LoadPluginSettings(m_sPluginsConfDir + "/" + pName + "." + PLUGINS_CONF_EXTENSION, pluginSettings); try { plugin->Init(); - plugin->LoadSettings(path); + plugin->SetSettings(pluginSettings); } - catch (std::string sError) + catch (CABRTException& e) { comm_layer_inner_warning("Can not initialize plugin " + pName + "(" + std::string(plugin_type_str_t[m_mapABRTPlugins[pName]->GetType()]) - + ")"); + + "): " + e.what()); UnLoadPlugin(pName); return; } @@ -262,6 +267,7 @@ vector_map_string_string_t CPluginManager::GetPluginsInfo() } void CPluginManager::SetPluginSettings(const std::string& pName, + const std::string& pUID, const map_plugin_settings_t& pSettings) { if (m_mapABRTPlugins.find(pName) != m_mapABRTPlugins.end()) @@ -269,19 +275,123 @@ void CPluginManager::SetPluginSettings(const std::string& pName, if (m_mapPlugins.find(pName) != m_mapPlugins.end()) { m_mapPlugins[pName]->SetSettings(pSettings); + + if (m_mapABRTPlugins[pName]->GetType() == REPORTER) + { + std::string home = get_home_dir(atoi(pUID.c_str())); + if (home != "") + { + SavePluginSettings(home + "/.abrt/" + pName + "." + PLUGINS_CONF_EXTENSION, pSettings); + } + } } } } -map_plugin_settings_t CPluginManager::GetPluginSettings(const std::string& pName) +map_plugin_settings_t CPluginManager::GetPluginSettings(const std::string& pName, + const std::string& pUID) { map_plugin_settings_t ret; if (m_mapABRTPlugins.find(pName) != m_mapABRTPlugins.end()) { if (m_mapPlugins.find(pName) != m_mapPlugins.end()) { - ret = m_mapPlugins[pName]->GetSettings(); + if (m_mapABRTPlugins[pName]->GetType() == REPORTER) + { + std::string home = get_home_dir(atoi(pUID.c_str())); + if (home != "") + { + comm_layer_inner_debug("home: " + home); + if (LoadPluginSettings(home + "/.abrt/" + pName + "." + PLUGINS_CONF_EXTENSION, ret)) + { + comm_layer_inner_debug("success"); + return ret; + } + } + } + return m_mapPlugins[pName]->GetSettings(); } } return ret; } + +bool CPluginManager::LoadPluginSettings(const std::string& pPath, map_plugin_settings_t& pSettings) +{ + std::ifstream fIn; + fIn.open(pPath.c_str()); + if (fIn.is_open()) + { + std::string line; + while (!fIn.eof()) + { + getline(fIn, line); + + int ii; + bool is_value = false; + bool valid = false; + bool in_quote = false; + std::string key = ""; + std::string value = ""; + for (ii = 0; ii < line.length(); ii++) + { + if (line[ii] == '\"') + { + in_quote = in_quote == true ? false : true; + } + if (isspace(line[ii]) && !in_quote) + { + continue; + } + if (line[ii] == '#' && !in_quote) + { + break; + } + else if (line[ii] == '=' && !in_quote) + { + is_value = true; + } + else if (line[ii] == '=' && is_value && !in_quote) + { + key = ""; + value = ""; + break; + } + else if (!is_value) + { + key += line[ii]; + } + else + { + valid = true; + value += line[ii]; + } + } + if (valid && !in_quote) + { + pSettings[key] = value; + } + } + fIn.close(); + return true; + } + return false; + +} + +bool CPluginManager::SavePluginSettings(const std::string& pPath, const map_plugin_settings_t& pSettings) +{ + std::ofstream fOut; + fOut.open(pPath.c_str()); + if (fOut.is_open()) + { + fOut << "Settings were written by abrt." << std::endl; + map_plugin_settings_t::const_iterator it; + for (it = pSettings.begin(); it != pSettings.end(); it++) + { + fOut << it->first << " = " << it->second << std::endl; + } + fOut.close(); + return true; + } + return false; +} diff --git a/src/Daemon/PluginManager.h b/src/Daemon/PluginManager.h index 53ec77c9..47487d68 100644 --- a/src/Daemon/PluginManager.h +++ b/src/Daemon/PluginManager.h @@ -139,18 +139,40 @@ class CPluginManager */ vector_map_string_string_t GetPluginsInfo(); /** - * A method, which sets up a plugin. + * A method, which sets up a plugin. The settings are also saved in home + * directory of an user. * @param pName A plugin name. + * @param pUID An uid of user. * @param pSettings A plugin's settings. */ void SetPluginSettings(const std::string& pName, + const std::string& pUID, const map_plugin_settings_t& pSettings); /** - * A method, which returns plugin's settings. + * A method, which returns plugin's settings according to user. * @param pName A plugin name. - * @return Plugin's settings + * @param pUID An uid of user. + * @return Plugin's settings accorting to user. */ - map_plugin_settings_t GetPluginSettings(const std::string& pName); + map_plugin_settings_t GetPluginSettings(const std::string& pName, + const std::string& pUID); + /** + * A function. It loads settings and store it in second parameter. On success it + * returns true, otherwise returns false. + * @param path A path of config file. + * @param settings A readed plugin's settings. + * @return if it success it returns true, otherwise it returns false. + */ + bool LoadPluginSettings(const std::string& pPath, + map_plugin_settings_t& pSettings); + /** + * A function. It saves settings. On success it returns true, otherwise returns false. + * @param path A path of config file. + * @param settings Plugin's settings. + * @return if it success it returns true, otherwise it returns false. + */ + bool SavePluginSettings(const std::string& pPath, + const map_plugin_settings_t& pSettings); }; #endif /*PLUGINMANAGER_H_*/ |