diff options
| author | Jiri Moskovcak <jmoskovc@redhat.com> | 2009-02-12 12:34:25 +0100 |
|---|---|---|
| committer | Jiri Moskovcak <jmoskovc@redhat.com> | 2009-02-12 12:34:25 +0100 |
| commit | 53821dddf0b6ee66dc5f0684b17c541c157656ec (patch) | |
| tree | 00dcb130b6fd32ef137cd7b139bbebfeb0c060b4 /lib/MiddleWare | |
| parent | 356da89a4e2e6e50ceade12f286d104fe1c17eae (diff) | |
| parent | c93222d1407ede085833d3a91bfeda5f0f910eb4 (diff) | |
| download | abrt-53821dddf0b6ee66dc5f0684b17c541c157656ec.tar.gz abrt-53821dddf0b6ee66dc5f0684b17c541c157656ec.tar.xz abrt-53821dddf0b6ee66dc5f0684b17c541c157656ec.zip | |
Merge branch 'master' of git://git.fedorahosted.org/git/crash-catcher
Diffstat (limited to 'lib/MiddleWare')
| -rw-r--r-- | lib/MiddleWare/Application.h | 3 | ||||
| -rw-r--r-- | lib/MiddleWare/CrashCatcher.conf | 7 | ||||
| -rw-r--r-- | lib/MiddleWare/Database.h | 5 | ||||
| -rw-r--r-- | lib/MiddleWare/DynamicLibrary.cpp | 1 | ||||
| -rw-r--r-- | lib/MiddleWare/DynamicLibrary.h | 1 | ||||
| -rw-r--r-- | lib/MiddleWare/Language.h | 3 | ||||
| -rw-r--r-- | lib/MiddleWare/MiddleWare.cpp | 155 | ||||
| -rw-r--r-- | lib/MiddleWare/MiddleWare.h | 60 | ||||
| -rw-r--r-- | lib/MiddleWare/Reporter.h | 15 | ||||
| -rw-r--r-- | lib/MiddleWare/Settings.cpp | 13 | ||||
| -rw-r--r-- | lib/MiddleWare/Settings.h | 3 | ||||
| -rw-r--r-- | lib/MiddleWare/test.cpp | 28 |
12 files changed, 224 insertions, 70 deletions
diff --git a/lib/MiddleWare/Application.h b/lib/MiddleWare/Application.h index 598fc18..8b1d7ec 100644 --- a/lib/MiddleWare/Application.h +++ b/lib/MiddleWare/Application.h @@ -30,7 +30,8 @@ class CApplication : public CPlugin public: virtual ~CApplication() {} virtual std::string GetLocalUUID(const std::string& pDebugDumpPath) = 0; - virtual std::string GetReport(const std::string& pDebugDumpPath) = 0; + virtual std::string GetGlobalUUID(const std::string& pDebugDumpPath) = 0; + virtual void CreateReport(const std::string& pDebugDumpPath) = 0; }; #endif /*APPLICATION_H_*/ diff --git a/lib/MiddleWare/CrashCatcher.conf b/lib/MiddleWare/CrashCatcher.conf index c4c2c17..e865ebe 100644 --- a/lib/MiddleWare/CrashCatcher.conf +++ b/lib/MiddleWare/CrashCatcher.conf @@ -1,4 +1,9 @@ # test conf file. it will be generated in the future +# blacklisted packages BlackList = bash, bind, apache2 -EnabledPlugins = SQLite3, CCpp +# enabled plugins +EnabledPlugins = SQLite3, CCpp, Mailx +# selected DB plugin Database = SQLite3 +# reporters association +CCpp = Mailx
\ No newline at end of file diff --git a/lib/MiddleWare/Database.h b/lib/MiddleWare/Database.h index 15b20a9..84099af 100644 --- a/lib/MiddleWare/Database.h +++ b/lib/MiddleWare/Database.h @@ -40,6 +40,7 @@ #define DATABASE_COLUMN_DEBUG_DUMP_PATH "DebugDumpPath" #define DATABASE_COLUMN_COUNT "Count" #define DATABASE_COLUMN_REPORTED "Reported" +#define DATABASE_COLUMN_TIME "Time" typedef struct SDatabaseRow { @@ -48,6 +49,7 @@ typedef struct SDatabaseRow std::string m_sDebugDumpPath; std::string m_sCount; std::string m_sReported; + std::string m_sTime; } database_row_t; // <column_name, <array of values in all selected rows> > @@ -62,7 +64,8 @@ class CDatabase : public CPlugin virtual void DisConnect() = 0; virtual void Insert(const std::string& pUUID, const std::string& pUID, - const std::string& pDebugDumpPath) = 0; + const std::string& pDebugDumpPath, + const std::string& pTime) = 0; virtual void Delete(const std::string& pUUID, const std::string& pUID) = 0; diff --git a/lib/MiddleWare/DynamicLibrary.cpp b/lib/MiddleWare/DynamicLibrary.cpp index 35a69c7..3fcc548 100644 --- a/lib/MiddleWare/DynamicLibrary.cpp +++ b/lib/MiddleWare/DynamicLibrary.cpp @@ -21,6 +21,7 @@ #include "DynamicLibrary.h" #include <iostream> +#include <dlfcn.h> CDynamicLibrary::CDynamicLibrary(const std::string& pPath) : m_pHandle(NULL) diff --git a/lib/MiddleWare/DynamicLibrary.h b/lib/MiddleWare/DynamicLibrary.h index 0182fb2..4cf36f6 100644 --- a/lib/MiddleWare/DynamicLibrary.h +++ b/lib/MiddleWare/DynamicLibrary.h @@ -24,7 +24,6 @@ #define DYNAMICLIBRARYH_ #include <string> -#include <dlfcn.h> class CDynamicLibrary { diff --git a/lib/MiddleWare/Language.h b/lib/MiddleWare/Language.h index b83434b..60e8275 100644 --- a/lib/MiddleWare/Language.h +++ b/lib/MiddleWare/Language.h @@ -30,7 +30,8 @@ class CLanguage : public CPlugin public: virtual ~CLanguage() {} virtual std::string GetLocalUUID(const std::string& pDebugDumpPath) = 0; - virtual std::string GetReport(const std::string& pDebugDumpPath) = 0; + virtual std::string GetGlobalUUID(const std::string& pDebugDumpPath) = 0; + virtual void CreateReport(const std::string& pDebugDumpPath) = 0; }; #endif /*LANGUAGE_H_*/ diff --git a/lib/MiddleWare/MiddleWare.cpp b/lib/MiddleWare/MiddleWare.cpp index d52fbda..5a5e39d 100644 --- a/lib/MiddleWare/MiddleWare.cpp +++ b/lib/MiddleWare/MiddleWare.cpp @@ -49,36 +49,17 @@ CMiddleWare::~CMiddleWare() delete m_pPluginManager; } - void CMiddleWare::LoadSettings(const std::string& pPath) { map_settings_t settings; load_settings(pPath, settings); if (settings.find("BlackList") != settings.end()) { - std::string blackList = settings["BlackList"]; - std::string::size_type ii_old = 0, ii_new = 0; - ii_new = blackList.find(","); - while (ii_new != std::string::npos) - { - m_setBlackList.insert(blackList.substr(ii_old, ii_new - ii_old)); - ii_old = ii_new + 1; - ii_new = blackList.find(",",ii_old); - } - m_setBlackList.insert(blackList.substr(ii_old)); + parse_settings(settings["BlackList"], m_setBlackList); } if (settings.find("EnabledPlugins") != settings.end()) { - std::string enabledPlugins = settings["EnabledPlugins"]; - std::string::size_type ii_old = 0, ii_new = 0; - ii_new = enabledPlugins.find(","); - while (ii_new != std::string::npos) - { - m_setEnabledPlugins.insert(enabledPlugins.substr(ii_old, ii_new - ii_old)); - ii_old = ii_new + 1; - ii_new = enabledPlugins.find(",",ii_old); - } - m_setEnabledPlugins.insert(enabledPlugins.substr(ii_old)); + parse_settings(settings["EnabledPlugins"], m_setEnabledPlugins); } if (settings.find("Database") != settings.end()) { @@ -92,6 +73,44 @@ void CMiddleWare::LoadSettings(const std::string& pPath) { throw std::string("No database plugin is selected."); } + set_enabled_plugins_t::iterator it_p; + for (it_p = m_setEnabledPlugins.begin(); it_p != m_setEnabledPlugins.end(); it_p++) + { + if (settings.find(*it_p) != settings.end()) + { + set_reporters_t reporters; + parse_settings(settings[*it_p], reporters); + m_mapPlugin2Reporters[*it_p] = reporters; + } + } +} + +void CMiddleWare::DebugDump2Report(const std::string& pDebugDumpDir, CReporter::report_t& pReport) +{ + CDebugDump dd; + dd.Open(pDebugDumpDir); + dd.LoadText(FILENAME_ARCHITECTURE, pReport.m_sArchitecture); + dd.LoadText(FILENAME_KERNEL, pReport.m_sKernel); + dd.LoadText(FILENAME_PACKAGE, pReport.m_sPackage); + dd.LoadText(FILENAME_EXECUTABLE, pReport.m_sExecutable); + dd.LoadText(FILENAME_CMDLINE, pReport.m_sCmdLine); + + if (dd.Exist(FILENAME_TEXTDATA1)) + { + dd.LoadText(FILENAME_TEXTDATA1, pReport.m_sTextData1); + } + if (dd.Exist(FILENAME_TEXTDATA2)) + { + dd.LoadText(FILENAME_TEXTDATA2, pReport.m_sTextData2); + } + if (dd.Exist(FILENAME_BINARYDATA1)) + { + pReport.m_bBinaryData1 = pDebugDumpDir + "/" + FILENAME_BINARYDATA1; + } + if (dd.Exist(FILENAME_BINARYDATA2)) + { + pReport.m_bBinaryData2 = pDebugDumpDir + "/" + FILENAME_BINARYDATA2; + } } void CMiddleWare::RegisterPlugin(const std::string& pName) @@ -105,20 +124,61 @@ void CMiddleWare::UnRegisterPlugin(const std::string& pName) } -std::string CMiddleWare::GetLocalUUIDLanguage(const std::string& pLanguage, const std::string& pDebugDumpPath) +std::string CMiddleWare::GetLocalUUIDLanguage(const std::string& pLanguage, + const std::string& pDebugDumpDir) +{ + CLanguage* language = m_pPluginManager->GetLanguage(pLanguage); + return language->GetLocalUUID(pDebugDumpDir); +} + +std::string CMiddleWare::GetLocalUUIDApplication(const std::string& pApplication, + const std::string& pDebugDumpDir) +{ + CApplication* application = m_pPluginManager->GetApplication(pApplication); + return application->GetLocalUUID(pDebugDumpDir); +} + + +void CMiddleWare::CreateReportLanguage(const std::string& pLanguage, + const std::string& pDebugDumpDir) { CLanguage* language = m_pPluginManager->GetLanguage(pLanguage); - return language->GetLocalUUID(pDebugDumpPath); + return language->CreateReport(pDebugDumpDir); } -std::string CMiddleWare::GetLocalUUIDApplication(const std::string& pApplication, const std::string& pDebugDumpPath) +void CMiddleWare::CreateReportApplication(const std::string& pApplication, + const std::string& pDebugDumpDir) { CApplication* application = m_pPluginManager->GetApplication(pApplication); - return application->GetLocalUUID(pDebugDumpPath); + return application->CreateReport(pDebugDumpDir); } -void CMiddleWare::GetReport(const std::string& pUUID, const std::string& pUID) +void CMiddleWare::CreateReport(const std::string& pDebugDumpDir, + crash_report_t& pCrashReport) +{ + CDebugDump dd; + dd.Open(pDebugDumpDir); + if (dd.Exist(FILENAME_APPLICATION)) + { + std::string application; + dd.LoadText(FILENAME_APPLICATION, application); + pCrashReport.m_sPlugin2ReportersName = application; + CreateReportApplication(application, pDebugDumpDir); + } + if (dd.Exist(FILENAME_LANGUAGE)) + { + std::string language; + dd.LoadText(FILENAME_LANGUAGE, language); + pCrashReport.m_sPlugin2ReportersName = language; + CreateReportLanguage(language, pDebugDumpDir); + } + DebugDump2Report(pDebugDumpDir, pCrashReport.m_Report); +} + +void CMiddleWare::CreateReport(const std::string& pUUID, + const std::string& pUID, + crash_report_t& pCrashReport) { CDatabase* database = m_pPluginManager->GetDatabase(m_sDatabase); database_row_t row; @@ -129,12 +189,30 @@ void CMiddleWare::GetReport(const std::string& pUUID, const std::string& pUID) { throw std::string("CMiddleWare::GetReport(): UUID '"+pUUID+"' is not in database."); } - // TODO: finish this + pCrashReport.m_sUUID = pUUID; + pCrashReport.m_sUID = pUID; + CreateReport(row.m_sDebugDumpPath, pCrashReport); } -int CMiddleWare::Report(const std::string& pReport) +void CMiddleWare::Report(const crash_report_t& pCrashReport) { - // TODO: write this + std::string plugin2ReportersName = pCrashReport.m_sPlugin2ReportersName; + if (m_mapPlugin2Reporters.find(plugin2ReportersName) != m_mapPlugin2Reporters.end()) + { + set_reporters_t::iterator it_r; + for (it_r = m_mapPlugin2Reporters[plugin2ReportersName].begin(); + it_r != m_mapPlugin2Reporters[plugin2ReportersName].end(); + it_r++) + { + CReporter* reporter = m_pPluginManager->GetReporter(*it_r); + reporter->Report(pCrashReport.m_Report); + } + } + + CDatabase* database = m_pPluginManager->GetDatabase(m_sDatabase); + database->Connect(); + database->SetReported(pCrashReport.m_sUUID, pCrashReport.m_sUID); + database->DisConnect(); } int CMiddleWare::SaveDebugDump(const std::string& pDebugDumpPath, crash_info_t& pCrashInfo) @@ -145,11 +223,13 @@ int CMiddleWare::SaveDebugDump(const std::string& pDebugDumpPath, crash_info_t& std::string UID; std::string package; std::string executable; + std::string time; CDebugDump dd; dd.Open(pDebugDumpPath); dd.LoadText(FILENAME_PACKAGE, package); + dd.LoadText(FILENAME_TIME, time); if (package == "" || m_setBlackList.find(package.substr(0, package.find("-"))) != m_setBlackList.end()) @@ -158,20 +238,18 @@ int CMiddleWare::SaveDebugDump(const std::string& pDebugDumpPath, crash_info_t& return 0; } + if (dd.Exist(FILENAME_APPLICATION)) + { + std::string application; + dd.LoadText(FILENAME_APPLICATION, application); + UUID = GetLocalUUIDApplication(application, pDebugDumpPath); + } if (dd.Exist(FILENAME_LANGUAGE)) { std::string language; dd.LoadText(FILENAME_LANGUAGE, language); UUID = GetLocalUUIDLanguage(language, pDebugDumpPath); } - else if (0) - { - // TODO: how to get UUID from app? - } - else - { - throw std::string("CMiddleWare::SaveDebugDumpToDataBase(): Can not get UUID."); - } if (UUID == "") { throw std::string("CMiddleWare::SaveDebugDumpToDataBase(): Wrong UUID."); @@ -182,7 +260,7 @@ int CMiddleWare::SaveDebugDump(const std::string& pDebugDumpPath, crash_info_t& database_row_t row; database->Connect(); - database->Insert(UUID, UID, pDebugDumpPath); + database->Insert(UUID, UID, pDebugDumpPath, time); row = database->GetUUIDData(UUID, UID); database->DisConnect(); @@ -201,6 +279,7 @@ int CMiddleWare::SaveDebugDump(const std::string& pDebugDumpPath, crash_info_t& pCrashInfo.m_sCount = row.m_sCount; pCrashInfo.m_sExecutable = executable; pCrashInfo.m_sPackage = package; + pCrashInfo.m_sTime = row.m_sTime; return 1; } diff --git a/lib/MiddleWare/MiddleWare.h b/lib/MiddleWare/MiddleWare.h index b9cf8b6..71c85ef 100644 --- a/lib/MiddleWare/MiddleWare.h +++ b/lib/MiddleWare/MiddleWare.h @@ -31,33 +31,58 @@ class CMiddleWare { - private: + public: + + typedef struct SCrashInfo + { + std::string m_sUUID; + std::string m_sUID; + std::string m_sCount; + std::string m_sExecutable; + std::string m_sPackage; + std::string m_sTime; + } crash_info_t; + + typedef struct SCrashReport + { + std::string m_sUUID; + std::string m_sUID; + std::string m_sPlugin2ReportersName; + CReporter::report_t m_Report; + } crash_report_t; + + typedef std::vector<crash_info_t> vector_crash_infos_t; - typedef std::set<std::string> set_blacklist_t; - typedef std::set<std::string> set_enabled_plugins_t; + private: + typedef set_settings_t set_blacklist_t; + typedef set_settings_t set_enabled_plugins_t; + typedef set_settings_t set_reporters_t; + typedef std::map<std::string, set_reporters_t> map_plugin2reporters_t; CPluginManager* m_pPluginManager; set_blacklist_t m_setBlackList; set_enabled_plugins_t m_setEnabledPlugins; std::string m_sDatabase; + map_plugin2reporters_t m_mapPlugin2Reporters; + std::string GetLocalUUIDLanguage(const std::string& pLanguage, const std::string& pDebugDumpDir); + void CreateReportLanguage(const std::string& pLanguage, + const std::string& pDebugDumpDir); std::string GetLocalUUIDApplication(const std::string& pApplication, - const std::string& pDebugDumpPath); + const std::string& pDebugDumpDir); + void CreateReportApplication(const std::string& pApplication, + const std::string& pDebugDumpDir); + void LoadSettings(const std::string& pPath); - public: - typedef struct SCrashInfo - { - std::string m_sUUID; - std::string m_sUID; - std::string m_sCount; - std::string m_sExecutable; - std::string m_sPackage; - } crash_info_t; + void DebugDump2Report(const std::string& pDebugDumpDir, + CReporter::report_t& pReport); + void CreateReport(const std::string& pDebugDumpDir, + crash_report_t& pReport); - typedef std::vector<crash_info_t> vector_crash_infos_t; + public: CMiddleWare(const std::string& pPlugisConfDir, const std::string& pPlugisLibDir, @@ -68,11 +93,12 @@ class CMiddleWare void RegisterPlugin(const std::string& pName); void UnRegisterPlugin(const std::string& pName); - void GetReport(const std::string& pUUID, const std::string& pUID); - int Report(const std::string& pReport); + void CreateReport(const std::string& pUUID, + const std::string& pUID, + crash_report_t& pReport); + void Report(const crash_report_t& pReport); int SaveDebugDump(const std::string& pDebugDumpPath, crash_info_t& pCrashInfo); - vector_crash_infos_t GetCrashInfos(const std::string& pUID); }; diff --git a/lib/MiddleWare/Reporter.h b/lib/MiddleWare/Reporter.h index f1493f5..8f23065 100644 --- a/lib/MiddleWare/Reporter.h +++ b/lib/MiddleWare/Reporter.h @@ -28,8 +28,21 @@ class CReporter : public CPlugin { public: + typedef struct SReport + { + std::string m_sArchitecture; + std::string m_sKernel; + std::string m_sExecutable; + std::string m_sCmdLine; + std::string m_sPackage; + std::string m_sTextData1; + std::string m_sTextData2; + std::string m_bBinaryData1; + std::string m_bBinaryData2; + } report_t; + virtual ~CReporter() {} - virtual void Report(const std::string& pDebugDumpPath) = 0; + virtual void Report(const report_t& pReport) = 0; }; #endif /* REPORTER_H_ */ diff --git a/lib/MiddleWare/Settings.cpp b/lib/MiddleWare/Settings.cpp index 413820b..92e22ea 100644 --- a/lib/MiddleWare/Settings.cpp +++ b/lib/MiddleWare/Settings.cpp @@ -97,3 +97,16 @@ void save_settings(const std::string& path, const map_settings_t& settings) throw std::string("save_settings(): Cannot write configuration file '"+path+"'."); } } + +void parse_settings(const std::string& pLine, set_settings_t& settings) +{ + std::string::size_type ii_old = 0, ii_new = 0; + ii_new = pLine.find(","); + while (ii_new != std::string::npos) + { + settings.insert(pLine.substr(ii_old, ii_new - ii_old)); + ii_old = ii_new + 1; + ii_new = pLine.find(",",ii_old); + } + settings.insert(pLine.substr(ii_old)); +} diff --git a/lib/MiddleWare/Settings.h b/lib/MiddleWare/Settings.h index a427f1b..46d50a5 100644 --- a/lib/MiddleWare/Settings.h +++ b/lib/MiddleWare/Settings.h @@ -25,10 +25,13 @@ #include "Settings.h" #include <string> #include <map> +#include <set> typedef std::map<std::string, std::string> map_settings_t; +typedef std::set<std::string> set_settings_t; void load_settings(const std::string& path, map_settings_t& settings); void save_settings(const std::string& path, const map_settings_t& settings); +void parse_settings(const std::string& pLine, set_settings_t& settings); #endif /* SETTINGSFUNC_H_ */ diff --git a/lib/MiddleWare/test.cpp b/lib/MiddleWare/test.cpp index 8424aa9..57c5506 100644 --- a/lib/MiddleWare/test.cpp +++ b/lib/MiddleWare/test.cpp @@ -35,23 +35,33 @@ int main(int argc, char** argv) CMiddleWare middleWare(PLUGINS_CONF_DIR, PLUGINS_LIB_DIR, std::string(CONF_DIR) + "/CrashCatcher.conf"); + /* Create DebugDump */ CDebugDump dd; - char pid[100]; sprintf(pid, "%d", getpid()); - - dd.Create(std::string(DEBUG_DUMPS_DIR)+"/"+pid, pid); + dd.Create(std::string(DEBUG_DUMPS_DIR)+"/"+pid); + dd.SaveProc(pid); + dd.SavePackage(); dd.SaveText(FILENAME_LANGUAGE, "CCpp"); dd.SaveBinary(FILENAME_BINARYDATA1, "ass0-9as", sizeof("ass0-9as")); + /* Try to save it into DB */ CMiddleWare::crash_info_t info; - middleWare.SaveDebugDump(std::string(DEBUG_DUMPS_DIR)+"/"+pid, info); - - std::cout << "Application Crashed! " << - info.m_sPackage << ": " << - info.m_sExecutable << "(" << - info.m_sCount << ")" << std::endl; + if (middleWare.SaveDebugDump(std::string(DEBUG_DUMPS_DIR)+"/"+pid, info)) + { + std::cout << "Application Crashed! " << + "(" << info.m_sTime << " [" << info.m_sCount << "]) " << + info.m_sPackage << ": " << + info.m_sExecutable << std::endl; + /* Get Report, so user can change data (remove private stuff) + * If we do not want user interaction, just send data immediately + */ + CMiddleWare::crash_report_t crashReport; + middleWare.CreateReport(info.m_sUUID, info.m_sUID, crashReport); + /* Report crash */ + middleWare.Report(crashReport); + } } catch (std::string sError) { |
