diff options
| author | Zdenek Prikryl <zdeny@dhcp-lab-218.englab.brq.redhat.com> | 2009-04-01 12:57:06 +0200 |
|---|---|---|
| committer | Zdenek Prikryl <zdeny@dhcp-lab-218.englab.brq.redhat.com> | 2009-04-01 12:57:06 +0200 |
| commit | 99a0819d935bbdfb34226e54ff50ed78b1fc6da0 (patch) | |
| tree | 60106dfbcff10b425793520ae02a60f159f4a71c /lib/MiddleWare | |
| parent | b3adc1a23a16b5d7a7d341d748bd3e618e5d225f (diff) | |
| download | abrt-99a0819d935bbdfb34226e54ff50ed78b1fc6da0.tar.gz abrt-99a0819d935bbdfb34226e54ff50ed78b1fc6da0.tar.xz abrt-99a0819d935bbdfb34226e54ff50ed78b1fc6da0.zip | |
rewritten CDebugDump and CrashTypes
Diffstat (limited to 'lib/MiddleWare')
| -rw-r--r-- | lib/MiddleWare/CrashTypes.h | 80 | ||||
| -rw-r--r-- | lib/MiddleWare/MiddleWare.cpp | 99 | ||||
| -rw-r--r-- | lib/MiddleWare/MiddleWare.h | 10 | ||||
| -rw-r--r-- | lib/MiddleWare/Reporter.h | 2 | ||||
| -rw-r--r-- | lib/MiddleWare/test.cpp | 19 |
5 files changed, 98 insertions, 112 deletions
diff --git a/lib/MiddleWare/CrashTypes.h b/lib/MiddleWare/CrashTypes.h index f9fe625..15338ca 100644 --- a/lib/MiddleWare/CrashTypes.h +++ b/lib/MiddleWare/CrashTypes.h @@ -36,57 +36,45 @@ typedef struct SCrashInfo typedef std::vector<crash_info_t> vector_crash_infos_t; -typedef struct SCrashReport +#define TYPE_TXT "t" +#define TYPE_BIN "b" +#define TYPE_SYS "s" + +typedef struct CCrashFile { - std::string m_sMWID; - std::string m_sUUID; - std::string m_sArchitecture; - std::string m_sKernel; - std::string m_sRelease; - std::string m_sExecutable; - std::string m_sCmdLine; - std::string m_sPackage; - std::string m_sTextData1; - std::string m_sTextData2; - std::string m_sBinaryData1; - std::string m_sBinaryData2; - std::string m_sComment; + std::string m_sType; + std::string m_sContent; +} crash_file_t; - const map_crash_t GetMap() - { - map_crash_t mci; - mci["MWID"] = m_sMWID; - mci["UUID"] = m_sUUID; - mci["Architecture"] = m_sArchitecture; - mci["Kernel"] = m_sKernel; - mci["Release"] = m_sRelease; - mci["Executable"] = m_sExecutable; - mci["CmdLine"] = m_sCmdLine; - mci["Package"] = m_sPackage; - mci["TextData1"] = m_sTextData1; - mci["TextData2"] = m_sTextData2; - mci["BinaryData1"] = m_sBinaryData1; - mci["BinaryData2"] = m_sBinaryData2; - mci["Comment"] = m_sComment; +typedef std::vector<std::string> vector_strings_t; +typedef std::map<std::string, crash_file_t> crash_report_t; - return mci; +inline vector_strings_t crash_report_to_vector_strings(const crash_report_t& pCrashReport) +{ + vector_strings_t vec; + crash_report_t::const_iterator it; + for (it = pCrashReport.begin(); it != pCrashReport.end(); it++) + { + vec.push_back(it->first); + vec.push_back(it->second.m_sType); + vec.push_back(it->second.m_sContent); } - void SetFromMap(const map_crash_t& pMcr) + return vec; +} + +inline crash_report_t vector_strings_to_crash_report(const vector_strings_t& pVectorStrings) +{ + unsigned int ii; + crash_report_t crashReport; + for (ii = 0; ii < pVectorStrings.size(); ii += 3) { - m_sMWID = pMcr.find("MWID")->second; - m_sUUID = pMcr.find("UUID")->second; - m_sArchitecture = pMcr.find("Architecture")->second; - m_sKernel = pMcr.find("Kernel")->second; - m_sRelease = pMcr.find("Release")->second; - m_sExecutable = pMcr.find("Executable")->second; - m_sCmdLine = pMcr.find("CmdLine")->second; - m_sPackage = pMcr.find("Package")->second; - m_sTextData1 = pMcr.find("TextData1")->second; - m_sTextData2 = pMcr.find("TextData2")->second; - m_sBinaryData1 = pMcr.find("BinaryData1")->second; - m_sBinaryData2 = pMcr.find("BinaryData2")->second; - m_sComment = pMcr.find("Comment")->second; + crash_file_t crashFile; + std::string fileName = pVectorStrings[ii]; + crashFile.m_sType = pVectorStrings[ii + 1]; + crashFile.m_sContent = pVectorStrings[ii + 2]; + crashReport[fileName] = crashFile; } -} crash_report_t; + return crashReport; +} #endif /* CRASHTYPES_H_ */ diff --git a/lib/MiddleWare/MiddleWare.cpp b/lib/MiddleWare/MiddleWare.cpp index 66d6f78..00eca79 100644 --- a/lib/MiddleWare/MiddleWare.cpp +++ b/lib/MiddleWare/MiddleWare.cpp @@ -99,39 +99,34 @@ void CMiddleWare::LoadSettings(const std::string& pPath) } } -void CMiddleWare::DebugDump2Report(const std::string& pDebugDumpDir, crash_report_t& pCrashReport) +void CMiddleWare::DebugDumpToCrashReport(const std::string& pDebugDumpDir, crash_report_t& pCrashReport) { CDebugDump dd; dd.Open(pDebugDumpDir); - dd.LoadText(FILENAME_UUID, pCrashReport.m_sUUID); - dd.LoadText(FILENAME_ARCHITECTURE, pCrashReport.m_sArchitecture); - dd.LoadText(FILENAME_KERNEL, pCrashReport.m_sKernel); - dd.LoadText(FILENAME_PACKAGE, pCrashReport.m_sPackage); - dd.LoadText(FILENAME_EXECUTABLE, pCrashReport.m_sExecutable); + std::string fileName, content; + bool isTextFile; - if (dd.Exist(FILENAME_CMDLINE)) + if (!dd.Exist(FILENAME_UUID) || + !dd.Exist(FILENAME_ARCHITECTURE) || + !dd.Exist(FILENAME_KERNEL) || + !dd.Exist(FILENAME_PACKAGE)) { - dd.LoadText(FILENAME_CMDLINE, pCrashReport.m_sCmdLine); - } - if (dd.Exist(FILENAME_RELEASE)) - { - dd.LoadText(FILENAME_RELEASE, pCrashReport.m_sRelease); - } - if (dd.Exist(FILENAME_TEXTDATA1)) - { - dd.LoadText(FILENAME_TEXTDATA1, pCrashReport.m_sTextData1); - } - if (dd.Exist(FILENAME_TEXTDATA2)) - { - dd.LoadText(FILENAME_TEXTDATA2, pCrashReport.m_sTextData2); - } - if (dd.Exist(FILENAME_BINARYDATA1)) - { - pCrashReport.m_sBinaryData1 = pDebugDumpDir + "/" + FILENAME_BINARYDATA1; + dd.Close(); + throw std::string("CMiddleWare::DebugDumpToCrashReport(): One or more of important file(s)'re missing."); } - if (dd.Exist(FILENAME_BINARYDATA2)) + pCrashReport.clear(); + dd.InitGetNextFile(); + while (dd.GetNextFile(fileName, content, isTextFile)) { - pCrashReport.m_sBinaryData2 = pDebugDumpDir + "/" + FILENAME_BINARYDATA2; + crash_file_t crashFile; + crashFile.m_sType = TYPE_TXT; + if (!isTextFile) + { + crashFile.m_sType = TYPE_BIN; + content = pDebugDumpDir + "/" + fileName; + } + crashFile.m_sContent = content; + pCrashReport[fileName] = crashFile; } dd.Close(); } @@ -168,9 +163,9 @@ void CMiddleWare::CreateReport(const std::string& pAnalyzer, return analyzer->CreateReport(pDebugDumpDir); } -void CMiddleWare::CreateReport(const std::string& pUUID, - const std::string& pUID, - crash_report_t& pCrashReport) +void CMiddleWare::CreateCrashReport(const std::string& pUUID, + const std::string& pUID, + crash_report_t& pCrashReport) { CDatabase* database = m_pPluginManager->GetDatabase(m_sDatabase); database_row_t row; @@ -180,7 +175,7 @@ void CMiddleWare::CreateReport(const std::string& pUUID, if (pUUID == "" || row.m_sUUID != pUUID) { - throw std::string("CMiddleWare::CreateReport(): UUID '"+pUUID+"' is not in database."); + throw std::string("CMiddleWare::CreateCrashReport(): UUID '"+pUUID+"' is not in database."); } std::string analyzer; @@ -203,38 +198,46 @@ void CMiddleWare::CreateReport(const std::string& pUUID, dd.SaveText(FILENAME_UUID, UUID); dd.Close(); - DebugDump2Report(row.m_sDebugDumpDir, pCrashReport); + DebugDumpToCrashReport(row.m_sDebugDumpDir, pCrashReport); - pCrashReport.m_sMWID = analyzer + ";" + pUID + ";" + pUUID ; + crash_file_t file; + file.m_sType = TYPE_SYS; + file.m_sContent = analyzer; + pCrashReport["_MWAnalyzer"] = file; + file.m_sContent = pUID; + pCrashReport["_MWUID"] = file; + file.m_sContent = pUUID; + pCrashReport["_MWUUID"] = file; } void CMiddleWare::Report(const crash_report_t& pCrashReport) { - std::string::size_type pos1 = 0; - std::string::size_type pos2 = pCrashReport.m_sMWID.find(";", pos1); - std::string lanAppPlugin = pCrashReport.m_sMWID.substr(pos1, pos2); - pos1 = pos2 + 1; - pos2 = pCrashReport.m_sMWID.find(";", pos1); - std::string UID = pCrashReport.m_sMWID.substr(pos1, pos2 - pos1); - pos1 = pos2 + 1; - std::string UUID = pCrashReport.m_sMWID.substr(pos1);; - - CDatabase* database = m_pPluginManager->GetDatabase(m_sDatabase); - database->Connect(); - database->SetReported(UUID, UID); - database->DisConnect(); + if (pCrashReport.find("_MWAnalyzer") == pCrashReport.end() || + pCrashReport.find("_MWUID") == pCrashReport.end() || + pCrashReport.find("_MWUUID") == pCrashReport.end()) + { + throw std::string("CMiddleWare::Report(): Important data are missing."); + } + std::string analyzer = pCrashReport.find("_MWAnalyzer")->second.m_sContent; + std::string UID = pCrashReport.find("_MWUID")->second.m_sContent; + std::string UUID = pCrashReport.find("_MWUUID")->second.m_sContent;; - if (m_mapPlugin2Reporters.find(lanAppPlugin) != m_mapPlugin2Reporters.end()) + if (m_mapPlugin2Reporters.find(analyzer) != m_mapPlugin2Reporters.end()) { set_reporters_t::iterator it_r; - for (it_r = m_mapPlugin2Reporters[lanAppPlugin].begin(); - it_r != m_mapPlugin2Reporters[lanAppPlugin].end(); + for (it_r = m_mapPlugin2Reporters[analyzer].begin(); + it_r != m_mapPlugin2Reporters[analyzer].end(); it_r++) { CReporter* reporter = m_pPluginManager->GetReporter(*it_r); reporter->Report(pCrashReport); } } + + CDatabase* database = m_pPluginManager->GetDatabase(m_sDatabase); + database->Connect(); + database->SetReported(UUID, UID); + database->DisConnect(); } void CMiddleWare::DeleteCrashInfo(const std::string& pUUID, diff --git a/lib/MiddleWare/MiddleWare.h b/lib/MiddleWare/MiddleWare.h index def29ce..82b734b 100644 --- a/lib/MiddleWare/MiddleWare.h +++ b/lib/MiddleWare/MiddleWare.h @@ -57,8 +57,8 @@ class CMiddleWare void LoadSettings(const std::string& pPath); - void DebugDump2Report(const std::string& pDebugDumpDir, - crash_report_t& pCrashReport); + void DebugDumpToCrashReport(const std::string& pDebugDumpDir, + crash_report_t& pCrashReport); bool IsDebugDumpSaved(const std::string& pDebugDumpDir); int SavePackageDescriptionToDebugDump(const std::string& pDebugDumpDir); @@ -78,9 +78,9 @@ class CMiddleWare void RegisterPlugin(const std::string& pName); void UnRegisterPlugin(const std::string& pName); - void CreateReport(const std::string& pUUID, - const std::string& pUID, - crash_report_t& pCrashReport); + void CreateCrashReport(const std::string& pUUID, + const std::string& pUID, + crash_report_t& pCrashReport); void Report(const crash_report_t& pCrashReport); diff --git a/lib/MiddleWare/Reporter.h b/lib/MiddleWare/Reporter.h index 80fe668..b3d8b8c 100644 --- a/lib/MiddleWare/Reporter.h +++ b/lib/MiddleWare/Reporter.h @@ -31,7 +31,7 @@ class CReporter : public CPlugin public: virtual ~CReporter() {} - virtual void Report(const crash_report_t& pReport) = 0; + virtual void Report(const crash_report_t& pCrashReport) = 0; }; #endif /* REPORTER_H_ */ diff --git a/lib/MiddleWare/test.cpp b/lib/MiddleWare/test.cpp index 633a654..8f5afc9 100644 --- a/lib/MiddleWare/test.cpp +++ b/lib/MiddleWare/test.cpp @@ -25,29 +25,25 @@ #include <iostream> #include <sys/types.h> #include <unistd.h> +#include <iostream> int main(int argc, char** argv) { - + if (argc < 2) + { + std::cerr << "Usage: " << argv[0] << " <DebugDumpDir>" << std::endl; + } try { CMiddleWare middleWare(PLUGINS_CONF_DIR, PLUGINS_LIB_DIR, std::string(CONF_DIR) + "/abrt.conf"); /* Create DebugDump */ - CDebugDump dd; - char pid[100]; - sprintf(pid, "%d", getpid()); - dd.Create(std::string(DEBUG_DUMPS_DIR)+"/"+pid); - dd.SaveProc(pid); - dd.SaveText(FILENAME_ANALYZER, "CCpp"); - dd.SaveBinary(FILENAME_BINARYDATA1, "ass0-9as", sizeof("ass0-9as")); - /* Try to save it into DB */ crash_info_t crashInfo; - if (middleWare.SaveDebugDump(std::string(DEBUG_DUMPS_DIR)+"/"+pid, crashInfo)) + if (middleWare.SaveDebugDump(argv[1], crashInfo)) { std::cout << "Application Crashed! " << "(" << crashInfo.m_sTime << " [" << crashInfo.m_sCount << "]) " << @@ -58,11 +54,10 @@ int main(int argc, char** argv) * If we do not want user interaction, just send data immediately */ crash_report_t crashReport; - middleWare.CreateReport(crashInfo.m_sUUID, crashInfo.m_sUID, crashReport); + middleWare.CreateCrashReport(crashInfo.m_sUUID, crashInfo.m_sUID, crashReport); /* Report crash */ middleWare.Report(crashReport); } - dd.Close(); } catch (std::string sError) { |
