summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZdenek Prikryl <zprikryl@redhat.com>2009-08-14 20:59:43 +0200
committerZdenek Prikryl <zprikryl@redhat.com>2009-08-14 20:59:43 +0200
commit3c226c987f5015e8184bfc4293ee9f9b2f7b8f67 (patch)
treeb2ec9e8f5ec3140008a15cccea4030c438dbe72e
parent15e44fefb8e0ce093e91bc0fd96302c6b77bf92a (diff)
downloadabrt-3c226c987f5015e8184bfc4293ee9f9b2f7b8f67.tar.gz
abrt-3c226c987f5015e8184bfc4293ee9f9b2f7b8f67.tar.xz
abrt-3c226c987f5015e8184bfc4293ee9f9b2f7b8f67.zip
added support for storing results from reporters (used from gui)
-rw-r--r--inc/CrashTypes.h1
-rw-r--r--lib/MiddleWare/Database.h7
-rw-r--r--lib/MiddleWare/Plugin.h2
-rw-r--r--lib/MiddleWare/Reporter.h5
-rw-r--r--lib/Plugins/Bugzilla.cpp11
-rw-r--r--lib/Plugins/Bugzilla.h6
-rw-r--r--lib/Plugins/KerneloopsReporter.cpp8
-rw-r--r--lib/Plugins/KerneloopsReporter.h4
-rw-r--r--lib/Plugins/Logger.cpp8
-rw-r--r--lib/Plugins/Logger.h4
-rw-r--r--lib/Plugins/Mailx.cpp3
-rw-r--r--lib/Plugins/Mailx.h4
-rw-r--r--lib/Plugins/SQLite3.cpp12
-rw-r--r--lib/Plugins/SQLite3.h2
-rw-r--r--src/Daemon/CrashWatcher.cpp2
-rw-r--r--src/Daemon/MiddleWare.cpp21
-rw-r--r--src/Daemon/MiddleWare.h11
17 files changed, 79 insertions, 32 deletions
diff --git a/inc/CrashTypes.h b/inc/CrashTypes.h
index 38095b94..61975037 100644
--- a/inc/CrashTypes.h
+++ b/inc/CrashTypes.h
@@ -31,6 +31,7 @@
#define CD_DESCRIPTION "Description"
#define CD_TIME "Time"
#define CD_REPORTED "Reported"
+#define CD_MESSAGE "Message"
#define CD_COMMENT "Comment"
#define CD_REPRODUCE "How to reproduce"
#define CD_MWANALYZER "_MWAnalyzer"
diff --git a/lib/MiddleWare/Database.h b/lib/MiddleWare/Database.h
index 36238469..6566f41b 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_MESSAGE "Message"
#define DATABASE_COLUMN_TIME "Time"
/**
@@ -52,6 +53,7 @@ typedef struct SDatabaseRow
std::string m_sDebugDumpDir; /**< A debugdump directory of a crash.*/
std::string m_sCount; /**< Crash rate.*/
std::string m_sReported; /**< Is a row reported?*/
+ std::string m_sMessage; /**< if a row is reported, then there can be store message abotu that*/
std::string m_sTime; /**< Time of last occurred crash with same local UUID*/
} database_row_t;
@@ -96,9 +98,12 @@ class CDatabase : public CPlugin
* A method, which sets that particular row was reported.
* @param pUUID A local UUID of a crash.
* @param pUID An UID of an user.
+ * @param pMessga A text explanation of reported problem (where
+ * it is stored etc...
*/
virtual void SetReported(const std::string& pUUID,
- const std::string& pUID) = 0;
+ const std::string& pUID,
+ const std::string& pMessage) = 0;
/**
* A method, which gets all rows which belongs to particular user.
* If the user is root, then all rows are returned. If there are no
diff --git a/lib/MiddleWare/Plugin.h b/lib/MiddleWare/Plugin.h
index a0b64aea..638840ff 100644
--- a/lib/MiddleWare/Plugin.h
+++ b/lib/MiddleWare/Plugin.h
@@ -26,7 +26,7 @@
#include <string>
#include <map>
-#define PLUGINS_MAGIC_NUMBER 5
+#define PLUGINS_MAGIC_NUMBER 6
#define PLUGINS_CONF_EXTENSION "conf"
#define PLUGINS_LIB_EXTENSION "so"
diff --git a/lib/MiddleWare/Reporter.h b/lib/MiddleWare/Reporter.h
index 810b3169..c74a10c3 100644
--- a/lib/MiddleWare/Reporter.h
+++ b/lib/MiddleWare/Reporter.h
@@ -38,9 +38,10 @@ class CReporter : public CPlugin
* by itself.
* @param pCrashReport A crash report.
* @param pArgs Plugin's arguments.
+ * @retun A message which can be displayed after a report is created.
*/
- virtual void Report(const map_crash_report_t& pCrashReport,
- const std::string& pArgs) = 0;
+ virtual std::string Report(const map_crash_report_t& pCrashReport,
+ const std::string& pArgs) = 0;
};
#endif /* REPORTER_H_ */
diff --git a/lib/Plugins/Bugzilla.cpp b/lib/Plugins/Bugzilla.cpp
index 2a91b959..5e3602f4 100644
--- a/lib/Plugins/Bugzilla.cpp
+++ b/lib/Plugins/Bugzilla.cpp
@@ -150,7 +150,7 @@ void CReporterBugzilla::AddPlusOneCC(const std::string& pBugId)
ret = xmlrpc_c::value_struct(rpc->getResult());
}
-bool CReporterBugzilla::CheckUUIDInBugzilla(const std::string& pComponent, const std::string& pUUID)
+std::string CReporterBugzilla::CheckUUIDInBugzilla(const std::string& pComponent, const std::string& pUUID)
{
xmlrpc_c::paramList paramList;
map_xmlrpc_params_t searchParams;
@@ -182,9 +182,9 @@ bool CReporterBugzilla::CheckUUIDInBugzilla(const std::string& pComponent, const
AddPlusOneComment(ss.str());
AddPlusOneCC(ss.str());
- return true;
+ return ss.str();
}
- return false;
+ return "";
}
void CReporterBugzilla::CreateNewBugDescription(const map_crash_report_t& pCrashReport, std::string& pDescription)
@@ -358,7 +358,7 @@ void CReporterBugzilla::AddAttachments(const std::string& pBugId, const map_cras
}
}
-void CReporterBugzilla::Report(const map_crash_report_t& pCrashReport, const std::string& pArgs)
+std::string CReporterBugzilla::Report(const map_crash_report_t& pCrashReport, const std::string& pArgs)
{
std::string package = pCrashReport.find(FILENAME_PACKAGE)->second[CD_CONTENT];
std::string component = package.substr(0, package.rfind("-", package.rfind("-")-1));
@@ -371,7 +371,7 @@ void CReporterBugzilla::Report(const map_crash_report_t& pCrashReport, const std
{
Login();
comm_layer_inner_status("Checking for duplicates...");
- if (!CheckUUIDInBugzilla(component, uuid))
+ if ((bugId = CheckUUIDInBugzilla(component, uuid)) == "")
{
comm_layer_inner_status("Creating new bug...");
bugId = NewBug(pCrashReport);
@@ -386,6 +386,7 @@ void CReporterBugzilla::Report(const map_crash_report_t& pCrashReport, const std
throw CABRTException(EXCEP_PLUGIN, std::string("CReporterBugzilla::Report(): ") + e.what());
}
DeleteXMLRPCClient();
+ return "See bug in bugzilla: " + m_sBugzillaURL + ", bug id:" + bugId;
}
void CReporterBugzilla::SetSettings(const map_plugin_settings_t& pSettings)
diff --git a/lib/Plugins/Bugzilla.h b/lib/Plugins/Bugzilla.h
index 3849f17f..575de1f0 100644
--- a/lib/Plugins/Bugzilla.h
+++ b/lib/Plugins/Bugzilla.h
@@ -19,7 +19,7 @@ class CReporterBugzilla : public CReporter
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 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);
void CreateNewBugDescription(const map_crash_report_t& pCrashReport,
@@ -42,8 +42,8 @@ class CReporterBugzilla : public CReporter
virtual ~CReporterBugzilla();
virtual void SetSettings(const map_plugin_settings_t& pSettings);
virtual map_plugin_settings_t GetSettings();
- virtual void Report(const map_crash_report_t& pCrashReport,
- const std::string& pArgs);
+ virtual std::string Report(const map_crash_report_t& pCrashReport,
+ const std::string& pArgs);
};
#endif /* BUGZILLA_H_ */
diff --git a/lib/Plugins/KerneloopsReporter.cpp b/lib/Plugins/KerneloopsReporter.cpp
index 1860fd8b..647ff8f9 100644
--- a/lib/Plugins/KerneloopsReporter.cpp
+++ b/lib/Plugins/KerneloopsReporter.cpp
@@ -28,6 +28,7 @@
#include "KerneloopsReporter.h"
#include "CommLayerInner.h"
#include <curl/curl.h>
+#include "ABRTException.h"
#define FILENAME_KERNELOOPS "kerneloops"
@@ -92,7 +93,7 @@ CKerneloopsReporter::CKerneloopsReporter() :
m_sSubmitURL("http://submit.kerneloops.org/submitoops.php")
{}
-void CKerneloopsReporter::Report(const map_crash_report_t& pCrashReport, const std::string& pArgs)
+std::string CKerneloopsReporter::Report(const map_crash_report_t& pCrashReport, const std::string& pArgs)
{
int ret = -1;
map_crash_report_t::const_iterator it;
@@ -109,8 +110,11 @@ void CKerneloopsReporter::Report(const map_crash_report_t& pCrashReport, const s
}
if (ret)
+ {
/* FIXME: be more informative */
- comm_layer_inner_status("Report has not been sent...");
+ throw CABRTException(EXCEP_PLUGIN, std::string("CKerneloopsReporter::Report(): Report has not been sent..."));
+ }
+ return "Kernel oops report was uploaded to :" + m_sSubmitURL;
}
void CKerneloopsReporter::SetSettings(const map_plugin_settings_t& pSettings)
diff --git a/lib/Plugins/KerneloopsReporter.h b/lib/Plugins/KerneloopsReporter.h
index c8295a7a..f1b427f8 100644
--- a/lib/Plugins/KerneloopsReporter.h
+++ b/lib/Plugins/KerneloopsReporter.h
@@ -42,8 +42,8 @@ class CKerneloopsReporter : public CReporter
virtual void SetSettings(const map_plugin_settings_t& pSettings);
virtual map_plugin_settings_t GetSettings();
- virtual void Report(const map_crash_report_t& pCrashReport,
- const std::string& pArgs);
+ virtual std::string Report(const map_crash_report_t& pCrashReport,
+ const std::string& pArgs);
};
#endif
diff --git a/lib/Plugins/Logger.cpp b/lib/Plugins/Logger.cpp
index cb702276..fc96dcac 100644
--- a/lib/Plugins/Logger.cpp
+++ b/lib/Plugins/Logger.cpp
@@ -24,6 +24,7 @@
#include <sstream>
#include "DebugDump.h"
#include "CommLayerInner.h"
+#include "ABRTException.h"
CLogger::CLogger() :
m_sLogPath("/var/log/abrt-logger"),
@@ -52,7 +53,7 @@ map_plugin_settings_t CLogger::GetSettings()
return ret;
}
-void CLogger::Report(const map_crash_report_t& pCrashReport, const std::string& pArgs)
+std::string CLogger::Report(const map_crash_report_t& pCrashReport, const std::string& pArgs)
{
comm_layer_inner_status("Creating a report...");
@@ -130,6 +131,11 @@ void CLogger::Report(const map_crash_report_t& pCrashReport, const std::string&
fOut << std::endl;
fOut.close();
}
+ else
+ {
+ throw CABRTException(EXCEP_PLUGIN, "CLogger::Report(): Cannot open file: " + m_sLogPath);
+ }
+ return "Report was stored into: " + m_sLogPath;
}
PLUGIN_INFO(REPORTER,
diff --git a/lib/Plugins/Logger.h b/lib/Plugins/Logger.h
index c838b3cb..60c76e4a 100644
--- a/lib/Plugins/Logger.h
+++ b/lib/Plugins/Logger.h
@@ -36,8 +36,8 @@ class CLogger : public CReporter
virtual void SetSettings(const map_plugin_settings_t& pSettings);
virtual map_plugin_settings_t GetSettings();
- virtual void Report(const map_crash_report_t& pCrashReport,
- const std::string& pArgs);
+ virtual std::string Report(const map_crash_report_t& pCrashReport,
+ const std::string& pArgs);
};
#endif /* LOGGER_H_ */
diff --git a/lib/Plugins/Mailx.cpp b/lib/Plugins/Mailx.cpp
index 5ee6b65d..6daf8eb9 100644
--- a/lib/Plugins/Mailx.cpp
+++ b/lib/Plugins/Mailx.cpp
@@ -61,7 +61,7 @@ void CMailx::SendEmail(const std::string& pSubject, const std::string& pText)
}
-void CMailx::Report(const map_crash_report_t& pCrashReport, const std::string& pArgs)
+std::string CMailx::Report(const map_crash_report_t& pCrashReport, const std::string& pArgs)
{
comm_layer_inner_status("Creating a report...");
@@ -135,6 +135,7 @@ void CMailx::Report(const map_crash_report_t& pCrashReport, const std::string& p
{
SendEmail(m_sSubject, emailBody.str());
}
+ return "Email was send to :" + m_sEmailTo;
}
void CMailx::SetSettings(const map_plugin_settings_t& pSettings)
diff --git a/lib/Plugins/Mailx.h b/lib/Plugins/Mailx.h
index b5d78364..ff8685d9 100644
--- a/lib/Plugins/Mailx.h
+++ b/lib/Plugins/Mailx.h
@@ -44,8 +44,8 @@ class CMailx : public CReporter
virtual void SetSettings(const map_plugin_settings_t& pSettings);
virtual map_plugin_settings_t GetSettings();
- virtual void Report(const map_crash_report_t& pCrashReport,
- const std::string& pArgs);
+ virtual std::string Report(const map_crash_report_t& pCrashReport,
+ const std::string& pArgs);
};
#endif /* MAILX_H_ */
diff --git a/lib/Plugins/SQLite3.cpp b/lib/Plugins/SQLite3.cpp
index 7720c409..49f4448a 100644
--- a/lib/Plugins/SQLite3.cpp
+++ b/lib/Plugins/SQLite3.cpp
@@ -87,7 +87,9 @@ void CSQLite3::GetTable(const std::string& pCommand, vector_database_rows_t& pTa
break;
case 4: row.m_sReported = table[jj +(ncol*ii) + ncol];
break;
- case 5: row.m_sTime = table[jj +(ncol*ii) + ncol];
+ case 5: row.m_sMessage = table[jj +(ncol*ii) + ncol];
+ break;
+ case 6: row.m_sTime = table[jj +(ncol*ii) + ncol];
break;
default:
break;
@@ -155,6 +157,7 @@ void CSQLite3::CreateTable()
DATABASE_COLUMN_DEBUG_DUMP_PATH" VARCHAR NOT NULL,"
DATABASE_COLUMN_COUNT" INT NOT NULL DEFAULT 1,"
DATABASE_COLUMN_REPORTED" INT NOT NULL DEFAULT 0,"
+ DATABASE_COLUMN_MESSAGE" VARCHAR NOT NULL DEFAULT '',"
DATABASE_COLUMN_TIME" VARCHAR NOT NULL DEFAULT 0,"
"PRIMARY KEY ("DATABASE_COLUMN_UUID","DATABASE_COLUMN_UID"));");
}
@@ -211,7 +214,7 @@ void CSQLite3::Delete(const std::string& pUUID, const std::string& pUID)
}
}
-void CSQLite3::SetReported(const std::string& pUUID, const std::string& pUID)
+void CSQLite3::SetReported(const std::string& pUUID, const std::string& pUID, const std::string& pMessage)
{
if (Exist(pUUID, pUID))
{
@@ -219,6 +222,11 @@ void CSQLite3::SetReported(const std::string& pUUID, const std::string& pUID)
"SET "DATABASE_COLUMN_REPORTED" = 1 "
"WHERE "DATABASE_COLUMN_UUID" = '"+pUUID+"' "
"AND "DATABASE_COLUMN_UID" = '"+pUID+"';");
+ Exec("UPDATE "ABRT_TABLE" "
+ "SET "DATABASE_COLUMN_MESSAGE" = '" + pMessage + "' "
+ "WHERE "DATABASE_COLUMN_UUID" = '"+pUUID+"' "
+ "AND "DATABASE_COLUMN_UID" = '"+pUID+"';");
+
}
else
{
diff --git a/lib/Plugins/SQLite3.h b/lib/Plugins/SQLite3.h
index 987512e7..0b8e22a5 100644
--- a/lib/Plugins/SQLite3.h
+++ b/lib/Plugins/SQLite3.h
@@ -53,7 +53,7 @@ class CSQLite3 : public CDatabase
const std::string& pTime);
virtual void Delete(const std::string& pUUID, const std::string& pUID);
- virtual void SetReported(const std::string& pUUID, const std::string& pUID);
+ virtual void SetReported(const std::string& pUUID, const std::string& pUID, const std::string& pMessage);
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);
diff --git a/src/Daemon/CrashWatcher.cpp b/src/Daemon/CrashWatcher.cpp
index 44ac253d..5fb4a366 100644
--- a/src/Daemon/CrashWatcher.cpp
+++ b/src/Daemon/CrashWatcher.cpp
@@ -820,7 +820,7 @@ bool CCrashWatcher::Report(map_crash_report_t pReport, const std::string& pUID)
//}
try
{
- m_pMW->Report(pReport, pUID);
+ CMiddleWare::report_status_t rs = m_pMW->Report(pReport, pUID);
}
catch (CABRTException& e)
{
diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp
index 80380555..5591203b 100644
--- a/src/Daemon/MiddleWare.cpp
+++ b/src/Daemon/MiddleWare.cpp
@@ -247,9 +247,11 @@ void CMiddleWare::RunActionsAndReporters(const std::string& pDebugDumpDir)
}
}
-void CMiddleWare::Report(const map_crash_report_t& pCrashReport,
- const std::string& pUID)
+CMiddleWare::report_status_t CMiddleWare::Report(const map_crash_report_t& pCrashReport,
+ const std::string& pUID)
{
+ report_status_t ret;
+ std::string message;
if (pCrashReport.find(CD_MWANALYZER) == pCrashReport.end() ||
pCrashReport.find(CD_MWUID) == pCrashReport.end() ||
pCrashReport.find(CD_MWUUID) == pCrashReport.end())
@@ -269,6 +271,8 @@ void CMiddleWare::Report(const map_crash_report_t& pCrashReport,
{
try
{
+ std::string res;
+
if (m_pPluginManager->GetPluginType((*it_r).first) == REPORTER)
{
CReporter* reporter = m_pPluginManager->GetReporter((*it_r).first);
@@ -290,26 +294,34 @@ void CMiddleWare::Report(const map_crash_report_t& pCrashReport,
}
}
- reporter->Report(pCrashReport, (*it_r).second);
+ res = reporter->Report(pCrashReport, (*it_r).second);
if (home != "")
{
reporter->SetSettings(oldSettings);
}
}
+ ret[(*it_r).first].push_back("1");
+ ret[(*it_r).first].push_back(res);
+ message += res + "\n";
}
catch (CABRTException& e)
{
+ ret[(*it_r).first].push_back("0");
+ ret[(*it_r).first].push_back(e.what());
comm_layer_inner_warning("CMiddleWare::Report(): " + e.what());
comm_layer_inner_status("Reporting via '"+(*it_r).first+"' was not successful: " + e.what());
}
+
}
}
CDatabase* database = m_pPluginManager->GetDatabase(m_sDatabase);
database->Connect();
- database->SetReported(UUID, UID);
+ database->SetReported(UUID, UID, message);
database->DisConnect();
+
+ return ret;
}
void CMiddleWare::DeleteDebugDumpDir(const std::string& pDebugDumpDir)
@@ -564,6 +576,7 @@ CMiddleWare::mw_result_t CMiddleWare::GetCrashInfo(const std::string& pUUID,
add_crash_data_to_crash_info(pCrashInfo, CD_COUNT, row.m_sCount);
add_crash_data_to_crash_info(pCrashInfo, CD_TIME, row.m_sTime);
add_crash_data_to_crash_info(pCrashInfo, CD_REPORTED, row.m_sReported);
+ add_crash_data_to_crash_info(pCrashInfo, CD_MESSAGE, row.m_sMessage);
add_crash_data_to_crash_info(pCrashInfo, CD_MWDDD, row.m_sDebugDumpDir);
return MW_OK;
diff --git a/src/Daemon/MiddleWare.h b/src/Daemon/MiddleWare.h
index bb845435..a996a85b 100644
--- a/src/Daemon/MiddleWare.h
+++ b/src/Daemon/MiddleWare.h
@@ -54,6 +54,12 @@ class CMiddleWare
when trying open file in debug dump directory..*/
} mw_result_t;
+ typedef std::map<std::string, vector_strings_t> report_status_t;
+ typedef enum {
+ RS_CODE,
+ RS_MESSAGE
+ } report_status_items_t;
+
private:
typedef set_strings_t set_blacklist_t;
typedef set_strings_t set_enabled_plugins_t;
@@ -259,9 +265,10 @@ class CMiddleWare
* ...).
* @param pCrashReport A crash report.
* @param pUID An user uid
+ * @return A report status, which reporters ends sucessfuly with messages.
*/
- void Report(const map_crash_report_t& pCrashReport,
- const std::string& pUID);
+ report_status_t Report(const map_crash_report_t& pCrashReport,
+ const std::string& pUID);
/**
* A method, which deletes particular debugdump directory.
* @param pDebugDumpDir A debugdump directory.