[Crash-catcher] Feature request: Stop notifying about reported crashes
by Göran Wallin
Hi and thank you for abrt!
Is it possible to make the abrt-applet stop turning up in the
notification area when it knows the crash has already been reported?
To give an example, I've had a kernel-oops occurring at every bootup
since I installed Fedora 12. I reported it immediately, abrt seems to
realize it's the same problem recurring but it still keeps reminding me
about it.
It could even be something manual like the "Ignore this alert" button in
the SE troubleshoot browser.
Thank you again, your software is helping me detect crashes I wouldn't
have noticed and I'm loving it =)
Regards,
Göran
14 years, 2 months
[Crash-catcher] [RFC] Add option for storing crashes for unpackaged executables
by Pekka Pietikäinen
Abrt looks like a good start for an instrumentation framework for robustness
testing, but distro-provided packages aren't the only things that
people want to test.
Iteration #1 of a config option to store all crashes. The "add (none) as
package" is evil, but something else seems to require
the package field to exist before crashes end up in the database.
Bugzilla plugin (etc.) probably should be modified to ignore these crashes,
but lets figure out how these crashes should be identified first.
diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp
index 16b86da..09d76b8 100644
--- a/src/Daemon/MiddleWare.cpp
+++ b/src/Daemon/MiddleWare.cpp
@@ -642,8 +642,28 @@ static mw_result_t SavePackageDescriptionToDebugDump(
char *rpm_pkg = GetPackage(pExecutable);
if (rpm_pkg == NULL)
{
- log("Executable '%s' doesn't belong to any package", pExecutable);
- return MW_PACKAGE_ERROR;
+ if(g_settings_bProcessUnpackaged)
+ {
+ VERB2 log("Crash in unpackaged executable '%s', proceeding without packaging information", pExecutable);
+ try
+ {
+ CDebugDump dd;
+ dd.Open(pDebugDumpDir);
+ dd.SaveText(FILENAME_PACKAGE, "(none)");
+ dd.SaveText(FILENAME_DESCRIPTION, "Crash in unpackaged file");
+ return MW_OK;
+ }
+ catch (CABRTException& e)
+ {
+ error_msg("%s", e.what());
+ return MW_ERROR;
+ }
+ }
+ else
+ {
+ log("Executable '%s' doesn't belong to any package", pExecutable);
+ return MW_PACKAGE_ERROR;
+ }
}
/* Check well-known interpreter names */
diff --git a/src/Daemon/Settings.cpp b/src/Daemon/Settings.cpp
index 5644d37..b8bdc9c 100644
--- a/src/Daemon/Settings.cpp
+++ b/src/Daemon/Settings.cpp
@@ -56,6 +56,8 @@ set_string_t g_settings_setOpenGPGPublicKeys;
set_string_t g_settings_mapBlackList;
std::string g_settings_sDatabase;
unsigned int g_settings_nMaxCrashReportsSize = 1000;
+bool g_settings_bProcessUnpackaged = false;
+
/* one line: "ActionsAndReporters = aa_first,bb_first(bb_second),cc_first" */
vector_pair_string_string_t g_settings_vectorActionsAndReporters;
/* [ AnalyzerActionsAndReporters ] */
@@ -188,6 +190,11 @@ static void ParseCommon()
{
g_settings_vectorActionsAndReporters = ParseListWithArgs(it->second.c_str());
}
+ it = s_mapSectionCommon.find("ProcessUnpackaged");
+ if (it != end)
+ {
+ g_settings_bProcessUnpackaged = string_to_bool(it->second.c_str());
+ }
}
static void ParseCron()
diff --git a/src/Daemon/Settings.h b/src/Daemon/Settings.h
index cd3179d..fda1b0d 100644
--- a/src/Daemon/Settings.h
+++ b/src/Daemon/Settings.h
@@ -29,6 +29,7 @@ extern set_string_t g_settings_setOpenGPGPublicKeys;
extern set_string_t g_settings_mapBlackList;
extern unsigned int g_settings_nMaxCrashReportsSize;
extern bool g_settings_bOpenGPGCheck;
+extern bool g_settings_bProcessUnpackaged;
extern std::string g_settings_sDatabase;
extern map_cron_t g_settings_mapCron;
extern vector_pair_string_string_t g_settings_vectorActionsAndReporters;
14 years, 2 months
[Crash-catcher] [PATCH] add arch, package and release in comment
by Nikola Pajkovsky
Should I add more information?
---
>From e236245ad3fd855a9caf2c6ff5f08d864f4d928a Mon Sep 17 00:00:00 2001
From: Nikola Pajkovsky <npajkovs(a)redhat.com>
Date: Thu, 4 Mar 2010 17:17:49 +0100
Subject: [PATCH] add arch, package and release in comment
Signed-off-by: Nikola Pajkovsky <npajkovs(a)redhat.com>
---
lib/Plugins/Bugzilla.cpp | 11 ++++++++++-
1 files changed, 10 insertions(+), 1 deletions(-)
diff --git a/lib/Plugins/Bugzilla.cpp b/lib/Plugins/Bugzilla.cpp
index 6ec1f42..39ccafb 100644
--- a/lib/Plugins/Bugzilla.cpp
+++ b/lib/Plugins/Bugzilla.cpp
@@ -677,7 +677,16 @@ std::string CReporterBugzilla::Report(const
map_crash_data_t& pCrashData,
std::string description =
make_description_reproduce_comment(pCrashData);
if (!description.empty())
{
- VERB3 log("Add new comment into bug(%d)", (int)bug_id);
+ const char* package =
get_crash_data_item_content_or_NULL(pCrashData, FILENAME_PACKAGE);
+ const char* release =
get_crash_data_item_content_or_NULL(pCrashData, FILENAME_RELEASE);
+ const char* arch =
get_crash_data_item_content_or_NULL(pCrashData, FILENAME_ARCHITECTURE);
+
+ description = ssprintf("Package: %s\n"
+ "Architecture: %s\n"
+ "Release: %s\n"
+ "%s", package, arch, release, description.c_str()
+ );
+
update_client(_("Add new comment into bug(%d)"), (int)bug_id);
if (bz_server.add_comment(bug_id, description.c_str()) == -1)
{
--
1.6.6.1
--
Nikola
14 years, 2 months
[Crash-catcher] [PATCH] cli: pass reporters param in call_Report(); handle error returns
by Denys Vlasenko
Example of 2nd fix at work:
# abrt-cli --report @0
...
Do you want to send the report? [y/N]: y
>! string expected in dbus message, but not found ('e')
>! dbus call Report: parameter type mismatch
Dbus call returned error: 'org.freedesktop.DBus.Error.Failed'
#
--
vda
diff -x '*.po' -d -urpN abrt.8/src/CLI/dbus.cpp abrt.9/src/CLI/dbus.cpp
--- abrt.8/src/CLI/dbus.cpp 2010-03-04 15:47:00.298887074 +0100
+++ abrt.9/src/CLI/dbus.cpp 2010-03-04 17:16:55.669121647 +0100
@@ -50,8 +50,16 @@ static DBusMessage* send_get_reply_and_u
continue;
}
+ int tp = dbus_message_get_type(received);
+ const char *error_str = dbus_message_get_error_name(received);
+#if 0
/* Debugging */
- /*
+ printf("type:%u (CALL:%u, RETURN:%u, ERROR:%u, SIGNAL:%u)\n", tp,
+ DBUS_MESSAGE_TYPE_METHOD_CALL,
+ DBUS_MESSAGE_TYPE_METHOD_RETURN,
+ DBUS_MESSAGE_TYPE_ERROR,
+ DBUS_MESSAGE_TYPE_SIGNAL
+ );
const char *sender = dbus_message_get_sender(received);
if (sender)
printf("sender: %s\n", sender);
@@ -67,7 +75,9 @@ static DBusMessage* send_get_reply_and_u
const char *destination = dbus_message_get_destination(received);
if (destination)
printf("destination: %s\n", destination);
- */
+ if (error_str)
+ printf("error: '%s'\n", error_str);
+#endif
DBusError err;
dbus_error_init(&err);
@@ -94,11 +104,18 @@ static DBusMessage* send_get_reply_and_u
}
printf(">! %s\n", warning_msg);
}
- else if (dbus_message_get_type(received) == DBUS_MESSAGE_TYPE_METHOD_RETURN &&
- dbus_message_get_reply_serial(received) == serial)
- {
+ else
+ if (tp == DBUS_MESSAGE_TYPE_METHOD_RETURN
+ && dbus_message_get_reply_serial(received) == serial
+ ) {
return received;
}
+ else
+ if (tp == DBUS_MESSAGE_TYPE_ERROR
+ && dbus_message_get_reply_serial(received) == serial
+ ) {
+ error_msg_and_die("Dbus call returned error: '%s'", error_str);
+ }
dbus_message_unref(received);
}
@@ -148,9 +165,15 @@ report_status_t call_Report(const map_cr
DBusMessage* msg = new_call_msg(__func__ + 5);
DBusMessageIter out_iter;
dbus_message_iter_init_append(msg, &out_iter);
+
+ /* parameter #1: report data */
store_val(&out_iter, report);
+ /* parameter #2: reporters to use */
+ vector_string_t reporters;
+ store_val(&out_iter, reporters); /* unused by daemon so far */
+ /* parameter #3 (opt): plugin config */
if (!plugins.empty())
- store_val(&out_iter, plugins);
+ store_val(&out_iter, plugins);
DBusMessage *reply = send_get_reply_and_unref(msg);
14 years, 2 months
[Crash-catcher] [PATCH] UID:UUID -> crash_id conversion v2
by Denys Vlasenko
This fixes at least three instances where we did not check whether
user is even allowed to report or delete a crash.
Also fixes a few cases when root might inadvertently act on (e.g. delete)
mote than one crash.
Renamed FILENAME_UID to CD_UID - makes more sense this way.
Added COL_INFORMALL and CD_INFORMALL. Nuked UID == -1 hacks.
Renamed getReport() to start_job on Python side.
Dropped a few unused parameters from server -> client dbus signals.
Fixed CLI's way of reverencing crashes (see updated help text).
Run-tested (GUI and CLI).
Please review.
(Compressed to get under ml size limit)
--
vda
14 years, 2 months
[Crash-catcher] [PATCH] UID:UUID -> crash_id conversion
by Denys Vlasenko
Please read through and ping me if you see questionable places.
Only compile-tested as of now, will run-test tomorrow
--
vda
diff -x '*.po' -d -urpN abrt.1/lib/Plugins/SQLite3.cpp abrt.2/lib/Plugins/SQLite3.cpp
--- abrt.1/lib/Plugins/SQLite3.cpp 2010-03-01 15:26:16.373774161 +0100
+++ abrt.2/lib/Plugins/SQLite3.cpp 2010-03-01 21:15:20.095750597 +0100
@@ -33,6 +33,7 @@ using namespace std;
#define COL_UUID "UUID"
#define COL_UID "UID"
+#define COL_FORALL "InformAll"
#define COL_DEBUG_DUMP_PATH "DebugDumpPath"
#define COL_COUNT "Count"
#define COL_REPORTED "Reported"
@@ -99,6 +100,9 @@ static string sql_escape(const char *str
}
#endif
+/* Note:
+ * expects "SELECT * FROM ...", not "SELECT <only some fields> FROM ..."
+ */
static void get_table(vector_database_rows_t& pTable,
sqlite3 *db, const char *fmt, ...)
{
@@ -134,11 +138,12 @@ static void get_table(vector_database_ro
{
case 0: row.m_sUUID = val; break;
case 1: row.m_sUID = val; break;
- case 2: row.m_sDebugDumpDir = val; break;
- case 3: row.m_sCount = val; break;
- case 4: row.m_sReported = val; break;
- case 5: row.m_sTime = val; break;
- case 6: row.m_sMessage = val; break;
+ case 2: row.m_sInformAll = val; break;
+ case 3: row.m_sDebugDumpDir = val; break;
+ case 4: row.m_sCount = val; break;
+ case 5: row.m_sReported = val; break;
+ case 6: row.m_sTime = val; break;
+ case 7: row.m_sMessage = val; break;
}
}
pTable.push_back(row);
@@ -170,14 +175,13 @@ static int execute_sql(sqlite3 *db, cons
return affected;
}
-static bool exists_uuid_uid(sqlite3 *db, const char *pUUID, const char *pUID)
+static bool exists_uuid_uid(sqlite3 *db, const char *UUID, const char *UID)
{
vector_database_rows_t table;
get_table(table, db,
- "SELECT "COL_REPORTED" FROM "ABRT_TABLE" WHERE "
- COL_UUID" = '%s' "
- "AND ("COL_UID" = '%s' OR "COL_UID" = '-1');",
- pUUID, pUID
+ "SELECT * FROM "ABRT_TABLE
+ " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
+ UUID, UID
);
return !table.empty();
}
@@ -230,12 +234,45 @@ static void update_from_old_ver(sqlite3
COL_MESSAGE
" FROM abrt_v2;"
"DROP TABLE abrt_v2;"
- "CREATE TABLE "ABRT_REPRESULT_TABLE" ("
+ "CREATE TABLE abrt_v3_reportresult ("
+ COL_UUID" VARCHAR NOT NULL,"
+ COL_UID" VARCHAR NOT NULL,"
+ COL_REPORTER" VARCHAR NOT NULL,"
+ COL_MESSAGE" VARCHAR NOT NULL DEFAULT '',"
+ "PRIMARY KEY ("COL_UUID","COL_UID","COL_REPORTER"));"
+ "COMMIT;",
+ // v3-> v4
+ "BEGIN TRANSACTION;"
+ "CREATE TABLE abrt_v4("
+ COL_UUID" VARCHAR NOT NULL,"
+ COL_UID" VARCHAR NOT NULL,"
+ COL_FORALL" INT NOT NULL DEFAULT 0,"
+ COL_DEBUG_DUMP_PATH" VARCHAR NOT NULL,"
+ COL_COUNT" INT NOT NULL DEFAULT 1,"
+ COL_REPORTED" INT NOT NULL DEFAULT 0,"
+ COL_TIME" VARCHAR NOT NULL DEFAULT 0,"
+ COL_MESSAGE" VARCHAR NOT NULL DEFAULT '',"
+ "PRIMARY KEY ("COL_UUID","COL_UID"));"
+ "INSERT INTO abrt_v4 "
+ "SELECT "COL_UUID","
+ COL_UID"," //TODO: COL_UID < 0 ? 0 : COL_UID
+ "0," /* COL_FORALL */ //TODO: COL_UID < 0 ? 1 : 0
+ COL_DEBUG_DUMP_PATH","
+ COL_COUNT","
+ COL_REPORTED","
+ COL_TIME","
+ COL_MESSAGE
+ " FROM abrt_v3;"
+ "DROP TABLE abrt_v3;"
+ "CREATE TABLE abrt_v4_reportresult ("
COL_UUID" VARCHAR NOT NULL,"
COL_UID" VARCHAR NOT NULL,"
COL_REPORTER" VARCHAR NOT NULL,"
COL_MESSAGE" VARCHAR NOT NULL DEFAULT '',"
"PRIMARY KEY ("COL_UUID","COL_UID","COL_REPORTER"));"
+ "INSERT INTO abrt_v4_reportresult "
+ "SELECT * FROM abrt_v3_reportresult;"
+ "DROP TABLE abrt_v3_reportresult;"
"COMMIT;",
};
@@ -266,13 +303,13 @@ static bool check_table(sqlite3 *db)
}
// table format:
- // table[0]:"NAME" // table[1]:"SQL" <== field names from SELECT
+ // table[0]:"NAME" // table[1]:"SQL" <== field names from SELECT
// table[2]:"abrt_vNN" // table[3]:"sql"
char *tableName = table[0 + ncol];
char *underscore = strchr(tableName, '_');
if (underscore)
{
- int tableVersion = xatoi_u(underscore + 2);
+ int tableVersion = atoi(underscore + 2);
sqlite3_free_table(table);
if (tableVersion < ABRT_TABLE_VERSION)
{
@@ -366,20 +403,27 @@ void CSQLite3::Connect()
}
}
-void CSQLite3::Insert_or_Update(const char *pUUID,
- const char *pUID,
+void CSQLite3::Insert_or_Update(const char *crash_id,
const char *pDebugDumpPath,
const char *pTime)
{
- if (!is_string_safe(pUUID)
- || !is_string_safe(pUID)
+ const char *UUID = strchr(crash_id, ':');
+ if (!UUID
+ || !is_string_safe(crash_id)
|| !is_string_safe(pDebugDumpPath)
|| !is_string_safe(pTime)
) {
return;
}
- if (!exists_uuid_uid(m_pDB, pUUID, pUID))
+ /* Split crash_id into UID:UUID */
+ unsigned uid_len = UUID - crash_id;
+ UUID++;
+ char UID[uid_len + 1];
+ strncpy(UID, crash_id, uid_len);
+ UID[uid_len] = '\0';
+
+ if (!exists_uuid_uid(m_pDB, UUID, UID))
{
execute_sql(m_pDB,
"INSERT INTO "ABRT_TABLE" ("
@@ -389,59 +433,51 @@ void CSQLite3::Insert_or_Update(const ch
COL_TIME
")"
" VALUES ('%s','%s','%s','%s');",
- pUUID, pUID, pDebugDumpPath, pTime
+ UUID, UID, pDebugDumpPath, pTime
);
}
else
{
execute_sql(m_pDB,
- "UPDATE "ABRT_TABLE" SET "
- COL_COUNT" = "COL_COUNT" + 1, "
- COL_TIME" = '%s'"
- " WHERE "COL_UUID" = '%s'"
- " AND "COL_UID" = '%s';",
- pTime, pUUID, pUID
+ "UPDATE "ABRT_TABLE
+ " SET "COL_COUNT"="COL_COUNT"+1, "COL_TIME"='%s'"
+ " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
+ pTime,
+ UUID, UID
);
}
}
-void CSQLite3::DeleteRow(const char *pUUID, const char *pUID)
+void CSQLite3::DeleteRow(const char *crash_id)
{
- if (!is_string_safe(pUUID)
- || !is_string_safe(pUID)
+ const char *UUID = strchr(crash_id, ':');
+ if (!UUID
+ || !is_string_safe(crash_id)
) {
return;
}
- if (pUID[0] == '0' && !pUID[1])
- {
- execute_sql(m_pDB,
- "DELETE FROM "ABRT_TABLE" "
- "WHERE "COL_UUID" = '%s';",
- pUUID
- );
- execute_sql(m_pDB,
- "DELETE FROM "ABRT_REPRESULT_TABLE" "
- "WHERE "COL_UUID" = '%s';",
- pUUID
- );
- }
- else if (exists_uuid_uid(m_pDB, pUUID, pUID))
+ /* Split crash_id into UID:UUID */
+ unsigned uid_len = UUID - crash_id;
+ UUID++;
+ char UID[uid_len + 1];
+ strncpy(UID, crash_id, uid_len);
+ UID[uid_len] = '\0';
+
+ if (exists_uuid_uid(m_pDB, UUID, UID))
{
- execute_sql(m_pDB, "DELETE FROM "ABRT_TABLE" "
- "WHERE "COL_UUID" = '%s' "
- "AND ("COL_UID" = '%s' OR "COL_UID" = '-1');",
- pUUID, pUID
+ execute_sql(m_pDB, "DELETE FROM "ABRT_TABLE
+ " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
+ UUID, UID
);
- execute_sql(m_pDB, "DELETE FROM "ABRT_REPRESULT_TABLE" "
- "WHERE "COL_UUID" = '%s' "
- "AND ("COL_UID" = '%s' OR "COL_UID" = '-1');",
- pUUID, pUID
+ execute_sql(m_pDB, "DELETE FROM "ABRT_REPRESULT_TABLE
+ " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
+ UUID, UID
);
}
else
{
- error_msg("UUID,UID %s,%s is not found in DB", pUUID, pUID);
+ error_msg("crash_id %s is not found in DB", crash_id);
}
}
@@ -455,8 +491,8 @@ void CSQLite3::DeleteRows_by_dir(const c
/* Get UID:UUID pair(s) to delete */
vector_database_rows_t table;
get_table(table, m_pDB,
- "SELECT * FROM "ABRT_TABLE" "
- "WHERE "COL_DEBUG_DUMP_PATH" = '%s'",
+ "SELECT * FROM "ABRT_TABLE
+ " WHERE "COL_DEBUG_DUMP_PATH"='%s';",
dump_dir
);
if (table.empty())
@@ -469,84 +505,82 @@ void CSQLite3::DeleteRows_by_dir(const c
while (it != table.end())
{
execute_sql(m_pDB,
- "DELETE FROM "ABRT_REPRESULT_TABLE" "
- "WHERE "COL_UUID" = '%s' "
- "AND ("COL_UID" = '%s');",
+ "DELETE FROM "ABRT_REPRESULT_TABLE
+ " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
it->m_sUUID.c_str(), it->m_sUID.c_str()
);
}
execute_sql(m_pDB,
- "DELETE FROM "ABRT_TABLE" "
- "WHERE "COL_DEBUG_DUMP_PATH" = '%s'",
+ "DELETE FROM "ABRT_TABLE
+ " WHERE "COL_DEBUG_DUMP_PATH"='%s'",
dump_dir
);
}
-void CSQLite3::SetReported(const char *pUUID, const char *pUID, const char *pMessage)
+void CSQLite3::SetReported(const char *crash_id, const char *pMessage)
{
- if (!is_string_safe(pUUID)
- || !is_string_safe(pUID)
+ const char *UUID = strchr(crash_id, ':');
+ if (!UUID
+ || !is_string_safe(crash_id)
|| !is_string_safe(pMessage)
) {
return;
}
- if (pUID[0] == '0' && !pUID[1])
- {
- execute_sql(m_pDB,
- "UPDATE "ABRT_TABLE" "
- "SET "COL_REPORTED" = 1 "
- "WHERE "COL_UUID" = '%s';",
- pUUID
- );
- execute_sql(m_pDB, "UPDATE "ABRT_TABLE" "
- "SET "COL_MESSAGE" = '%s' "
- "WHERE "COL_UUID" = '%s';",
- pMessage, pUUID
- );
- }
- else if (exists_uuid_uid(m_pDB, pUUID, pUID))
+ /* Split crash_id into UID:UUID */
+ unsigned uid_len = UUID - crash_id;
+ UUID++;
+ char UID[uid_len + 1];
+ strncpy(UID, crash_id, uid_len);
+ UID[uid_len] = '\0';
+
+ if (exists_uuid_uid(m_pDB, UUID, UID))
{
execute_sql(m_pDB,
- "UPDATE "ABRT_TABLE" "
- "SET "COL_REPORTED" = 1 "
- "WHERE "COL_UUID" = '%s' "
- "AND ("COL_UID" = '%s' OR "COL_UID" = '-1');",
- pUUID, pUID
+ "UPDATE "ABRT_TABLE
+ " SET "COL_REPORTED"=1"
+ " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
+ UUID, UID
);
execute_sql(m_pDB,
- "UPDATE "ABRT_TABLE" "
- "SET "COL_MESSAGE" = '%s' "
- "WHERE "COL_UUID" = '%s' "
- "AND ("COL_UID" = '%s' OR "COL_UID" = '-1');",
- pMessage, pUUID, pUID
+ "UPDATE "ABRT_TABLE
+ " SET "COL_MESSAGE"='%s'"
+ " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
+ pMessage, UUID, UID
);
}
else
{
- error_msg("UUID,UID %s,%s is not found in DB", pUUID, pUID);
+ error_msg("crash_id %s is not found in DB", crash_id);
}
}
-void CSQLite3::SetReportedPerReporter(const char *pUUID,
- const char *pUID,
+void CSQLite3::SetReportedPerReporter(const char *crash_id,
const char *reporter,
const char *pMessage)
{
- if (!is_string_safe(pUUID)
- || !is_string_safe(pUID)
+ const char *UUID = strchr(crash_id, ':');
+ if (!UUID
+ || !is_string_safe(crash_id)
|| !is_string_safe(reporter)
|| !is_string_safe(pMessage)
) {
return;
}
+ /* Split crash_id into UID:UUID */
+ unsigned uid_len = UUID - crash_id;
+ UUID++;
+ char UID[uid_len + 1];
+ strncpy(UID, crash_id, uid_len);
+ UID[uid_len] = '\0';
+
int affected_rows = execute_sql(m_pDB,
"UPDATE "ABRT_REPRESULT_TABLE
" SET "COL_MESSAGE"='%s'"
" WHERE "COL_UUID"='%s' AND "COL_UID"='%s' AND "COL_REPORTER"='%s'",
pMessage,
- pUUID, pUID, reporter
+ UUID, UID, reporter
);
if (!affected_rows)
{
@@ -554,21 +588,16 @@ void CSQLite3::SetReportedPerReporter(co
"INSERT INTO "ABRT_REPRESULT_TABLE
" ("COL_UUID","COL_UID","COL_REPORTER","COL_MESSAGE")"
" VALUES ('%s','%s','%s','%s');",
- pUUID, pUID, reporter, pMessage
+ UUID, UID, reporter, pMessage
);
}
}
-vector_database_rows_t CSQLite3::GetUIDData(const char *pUID)
+vector_database_rows_t CSQLite3::GetUIDData(long caller_uid)
{
vector_database_rows_t table;
- if (!is_string_safe(pUID))
- {
- return table;
- }
-
- if (pUID[0] == '0' && !pUID[1])
+ if (caller_uid == 0)
{
get_table(table, m_pDB, "SELECT * FROM "ABRT_TABLE";");
}
@@ -576,40 +605,35 @@ vector_database_rows_t CSQLite3::GetUIDD
{
get_table(table, m_pDB,
"SELECT * FROM "ABRT_TABLE
- " WHERE "COL_UID" = '%s' OR "COL_UID" = '-1';",
- pUID
+ " WHERE "COL_UID"='%ld' OR "COL_FORALL"=1;",
+ caller_uid
);
}
return table;
}
-database_row_t CSQLite3::GetRow(const char *pUUID, const char *pUID)
+database_row_t CSQLite3::GetRow(const char *crash_id)
{
- if (!is_string_safe(pUUID)
- || !is_string_safe(pUID)
+ const char *UUID = strchr(crash_id, ':');
+ if (!UUID
+ || !is_string_safe(crash_id)
) {
return database_row_t();
}
- vector_database_rows_t table;
+ /* Split crash_id into UID:UUID */
+ unsigned uid_len = UUID - crash_id;
+ UUID++;
+ char UID[uid_len + 1];
+ strncpy(UID, crash_id, uid_len);
+ UID[uid_len] = '\0';
- if (pUID[0] == '0' && !pUID[1])
- {
- get_table(table, m_pDB,
- "SELECT * FROM "ABRT_TABLE" "
- "WHERE "COL_UUID" = '%s';",
- pUUID
- );
- }
- else
- {
- get_table(table, m_pDB,
- "SELECT * FROM "ABRT_TABLE" "
- "WHERE "COL_UUID" = '%s' "
- "AND ("COL_UID" = '%s' OR "COL_UID" = '-1');",
- pUUID, pUID
- );
- }
+ vector_database_rows_t table;
+ get_table(table, m_pDB,
+ "SELECT * FROM "ABRT_TABLE
+ " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
+ UUID, UID
+ );
if (table.size() == 0)
{
diff -x '*.po' -d -urpN abrt.1/lib/Plugins/SQLite3.h abrt.2/lib/Plugins/SQLite3.h
--- abrt.1/lib/Plugins/SQLite3.h 2010-03-01 13:50:33.172774222 +0100
+++ abrt.2/lib/Plugins/SQLite3.h 2010-03-01 20:58:16.845749486 +0100
@@ -37,20 +37,17 @@ class CSQLite3 : public CDatabase
virtual void Connect();
virtual void DisConnect();
- virtual void Insert_or_Update(const char *pUUID,
- const char *pUID,
+ virtual void Insert_or_Update(const char *crash_id,
const char *pDebugDumpPath,
const char *pTime);
-
- virtual void DeleteRow(const char *pUUID, const char *pUID);
+ virtual void DeleteRow(const char *crash_id);
virtual void DeleteRows_by_dir(const char *dump_dir);
- virtual void SetReported(const char *pUUID, const char *pUID, const char *pMessage);
- virtual void SetReportedPerReporter(const char *pUUID,
- const char *pUID,
+ virtual void SetReported(const char *crash_id, const char *pMessage);
+ virtual void SetReportedPerReporter(const char *crash_id,
const char *reporter,
const char *pMessage);
- virtual vector_database_rows_t GetUIDData(const char *pUID);
- virtual database_row_t GetRow(const char *pUUID, const char *pUID);
+ virtual vector_database_rows_t GetUIDData(long caller_uid);
+ virtual database_row_t GetRow(const char *crash_id);
virtual void SetSettings(const map_plugin_settings_t& pSettings);
};
diff -x '*.po' -d -urpN abrt.1/lib/Utils/CommLayerInner.cpp abrt.2/lib/Utils/CommLayerInner.cpp
--- abrt.1/lib/Utils/CommLayerInner.cpp 2010-02-07 23:11:00.000000000 +0100
+++ abrt.2/lib/Utils/CommLayerInner.cpp 2010-03-01 21:36:06.222749360 +0100
@@ -42,7 +42,7 @@ static void warn_client(const char *msg)
pthread_mutex_unlock(&s_map_mutex);
if (peer)
- s_pObs->Warning(msg, peer, key);
+ s_pObs->Warning(msg, peer);
}
void init_daemon_logging(CObserver *pObs)
@@ -89,6 +89,6 @@ void update_client(const char *fmt, ...)
char *msg = xvasprintf(fmt, p);
va_end(p);
- s_pObs->Status(msg, peer, key);
+ s_pObs->Status(msg, peer);
free(msg);
}
diff -x '*.po' -d -urpN abrt.1/lib/Utils/Database.h abrt.2/lib/Utils/Database.h
--- abrt.1/lib/Utils/Database.h 2010-03-01 13:50:23.140777810 +0100
+++ abrt.2/lib/Utils/Database.h 2010-03-01 21:05:37.853749604 +0100
@@ -40,6 +40,7 @@ typedef struct database_row_t
{
std::string m_sUUID; /**< A local UUID.*/
std::string m_sUID; /**< An UID of an user.*/
+ std::string m_sInformAll;
std::string m_sDebugDumpDir; /**< A debugdump directory of a crash.*/
std::string m_sCount; /**< Crash rate.*/
std::string m_sReported; /**< Is a row reported?*/
@@ -73,8 +74,7 @@ class CDatabase : public CPlugin
* @param pDebugDumpPath A debugdump path.
* @param pTime Time when a crash occurs.
*/
- virtual void Insert_or_Update(const char *pUUID,
- const char *pUID,
+ virtual void Insert_or_Update(const char *crash_id,
const char *pDebugDumpPath,
const char *pTime) = 0;
/**
@@ -82,8 +82,7 @@ class CDatabase : public CPlugin
* @param pUUID A lodal UUID of a crash.
* @param pUID An UID of an user.
*/
- virtual void DeleteRow(const char *pUUID,
- const char *pUID) = 0;
+ virtual void DeleteRow(const char *crash_id) = 0;
virtual void DeleteRows_by_dir(const char *dump_dir) = 0;
/**
* A method, which sets that particular row was reported.
@@ -92,11 +91,9 @@ class CDatabase : public CPlugin
* @param pMessage A text explanation of reported problem
* (where it is stored etc)...
*/
- virtual void SetReported(const char *pUUID,
- const char *pUID,
+ virtual void SetReported(const char *crash_id,
const char *pMessage) = 0;
- virtual void SetReportedPerReporter(const char *pUUID,
- const char *pUID,
+ virtual void SetReportedPerReporter(const char *crash_id,
const char *reporter,
const char *pMessage) = 0;
/**
@@ -106,7 +103,7 @@ class CDatabase : public CPlugin
* @param pUID An UID of an user.
* @return A vector of matched rows.
*/
- virtual vector_database_rows_t GetUIDData(const char *pUID) = 0;
+ virtual vector_database_rows_t GetUIDData(long caller_uid) = 0;
/**
* A method, which returns one row accordind to UUID of a crash and
* UID of an user. If there are no row, empty row is returned.
@@ -114,8 +111,7 @@ class CDatabase : public CPlugin
* @param pUID An UID of an user.
* @return A matched row.
*/
- virtual database_row_t GetRow(const char *pUUID,
- const char *pUID) = 0;
+ virtual database_row_t GetRow(const char *crash_id) = 0;
};
#endif
diff -x '*.po' -d -urpN abrt.1/lib/Utils/Observer.h abrt.2/lib/Utils/Observer.h
--- abrt.1/lib/Utils/Observer.h 2010-02-07 23:11:00.000000000 +0100
+++ abrt.2/lib/Utils/Observer.h 2010-03-01 21:32:17.596749581 +0100
@@ -26,8 +26,8 @@
class CObserver {
public:
virtual ~CObserver() {}
- virtual void Status(const char *pMessage, const char* peer, uint64_t pDest) = 0;
- virtual void Warning(const char *pMessage, const char* peer, uint64_t pDest) = 0;
+ virtual void Status(const char *pMessage, const char* peer) = 0;
+ virtual void Warning(const char *pMessage, const char* peer) = 0;
};
#endif
diff -x '*.po' -d -urpN abrt.1/src/Daemon/CommLayerServerDBus.cpp abrt.2/src/Daemon/CommLayerServerDBus.cpp
--- abrt.1/src/Daemon/CommLayerServerDBus.cpp 2010-03-01 13:38:34.000000000 +0100
+++ abrt.2/src/Daemon/CommLayerServerDBus.cpp 2010-03-01 20:34:20.862749644 +0100
@@ -95,33 +95,27 @@ void CCommLayerServerDBus::QuotaExceed(c
send_flush_and_unref(msg);
}
-void CCommLayerServerDBus::JobDone(const char* peer, const char* pUUID)
+void CCommLayerServerDBus::JobDone(const char* peer)
{
DBusMessage* msg = new_signal_msg("JobDone", peer);
- dbus_message_append_args(msg,
- DBUS_TYPE_STRING, &peer, /* TODO: redundant parameter, remove from API */
- DBUS_TYPE_STRING, &pUUID, /* TODO: redundant parameter, remove from API */
- DBUS_TYPE_INVALID);
- VERB2 log("Sending signal JobDone('%s','%s')", peer, pUUID);
+ VERB2 log("Sending signal JobDone() to peer %s", peer);
send_flush_and_unref(msg);
}
-void CCommLayerServerDBus::Update(const char* pMessage, const char* peer, uint64_t job_id)
+void CCommLayerServerDBus::Update(const char* pMessage, const char* peer)
{
DBusMessage* msg = new_signal_msg("Update", peer);
dbus_message_append_args(msg,
DBUS_TYPE_STRING, &pMessage,
- DBUS_TYPE_UINT64, &job_id, /* TODO: redundant parameter, remove from API */
DBUS_TYPE_INVALID);
send_flush_and_unref(msg);
}
-void CCommLayerServerDBus::Warning(const char* pMessage, const char* peer, uint64_t job_id)
+void CCommLayerServerDBus::Warning(const char* pMessage, const char* peer)
{
DBusMessage* msg = new_signal_msg("Warning", peer);
dbus_message_append_args(msg,
DBUS_TYPE_STRING, &pMessage,
- DBUS_TYPE_UINT64, &job_id, /* TODO: redundant parameter, remove from API */
DBUS_TYPE_INVALID);
send_flush_and_unref(msg);
}
@@ -151,7 +145,7 @@ static long get_remote_uid(DBusMessage*
static int handle_GetCrashInfos(DBusMessage* call, DBusMessage* reply)
{
long unix_uid = get_remote_uid(call);
- vector_map_crash_data_t argout1 = GetCrashInfos(to_string(unix_uid).c_str());
+ vector_map_crash_data_t argout1 = GetCrashInfos(unix_uid);
DBusMessageIter out_iter;
dbus_message_iter_init_append(reply, &out_iter);
@@ -166,8 +160,8 @@ static int handle_StartJob(DBusMessage*
int r;
DBusMessageIter in_iter;
dbus_message_iter_init(call, &in_iter);
- const char* pUUID;
- r = load_val(&in_iter, pUUID);
+ const char* crash_id;
+ r = load_val(&in_iter, crash_id);
if (r != ABRT_DBUS_MORE_FIELDS)
{
error_msg("dbus call %s: parameter type mismatch", __func__ + 7);
@@ -183,13 +177,9 @@ static int handle_StartJob(DBusMessage*
const char* sender;
long unix_uid = get_remote_uid(call, &sender);
- if (CreateReportThread(pUUID, to_string(unix_uid).c_str(), force, sender) != 0)
+ if (CreateReportThread(crash_id, unix_uid, force, sender) != 0)
return -1; /* can't create thread (err msg is already logged) */
- dbus_message_append_args(reply,
- DBUS_TYPE_STRING, &pUUID, /* redundant, eliminate from API */
- DBUS_TYPE_INVALID);
-
send_flush_and_unref(reply);
return 0;
}
@@ -199,8 +189,8 @@ static int handle_CreateReport(DBusMessa
int r;
DBusMessageIter in_iter;
dbus_message_iter_init(call, &in_iter);
- const char* pUUID;
- r = load_val(&in_iter, pUUID);
+ const char* crash_id;
+ r = load_val(&in_iter, crash_id);
if (r != ABRT_DBUS_LAST_FIELD)
{
error_msg("dbus call %s: parameter type mismatch", __func__ + 7);
@@ -209,7 +199,7 @@ static int handle_CreateReport(DBusMessa
long unix_uid = get_remote_uid(call);
map_crash_data_t report;
- CreateReport(pUUID, to_string(unix_uid).c_str(), /*force:*/ 0, report);
+ CreateReport(crash_id, unix_uid, /*force:*/ 0, report);
DBusMessageIter out_iter;
dbus_message_iter_init_append(reply, &out_iter);
@@ -300,7 +290,7 @@ static int handle_Report(DBusMessage* ca
report_status_t argout1;
try
{
- argout1 = Report(argin1, user_conf_data, to_string(unix_uid).c_str());
+ argout1 = Report(argin1, user_conf_data, unix_uid);
}
catch (CABRTException &e)
{
@@ -325,8 +315,8 @@ static int handle_DeleteDebugDump(DBusMe
int r;
DBusMessageIter in_iter;
dbus_message_iter_init(call, &in_iter);
- const char* argin1;
- r = load_val(&in_iter, argin1);
+ const char* crash_id;
+ r = load_val(&in_iter, crash_id);
if (r != ABRT_DBUS_LAST_FIELD)
{
error_msg("dbus call %s: parameter type mismatch", __func__ + 7);
@@ -334,7 +324,7 @@ static int handle_DeleteDebugDump(DBusMe
}
long unix_uid = get_remote_uid(call);
- int32_t result = DeleteDebugDump(argin1, to_string(unix_uid).c_str());
+ int32_t result = DeleteDebugDump(crash_id, unix_uid);
DBusMessageIter out_iter;
dbus_message_iter_init_append(reply, &out_iter);
diff -x '*.po' -d -urpN abrt.1/src/Daemon/CommLayerServerDBus.h abrt.2/src/Daemon/CommLayerServerDBus.h
--- abrt.1/src/Daemon/CommLayerServerDBus.h 2010-02-07 23:11:00.000000000 +0100
+++ abrt.2/src/Daemon/CommLayerServerDBus.h 2010-03-01 20:10:27.516749439 +0100
@@ -30,11 +30,11 @@ class CCommLayerServerDBus
/* DBus signal senders */
virtual void Crash(const char *progname, const char *uid_str);
- virtual void JobDone(const char* pDest, const char* pUUID);
+ virtual void JobDone(const char* peer);
virtual void QuotaExceed(const char* str);
- virtual void Update(const char* pMessage, const char* peer, uint64_t pJobID);
- virtual void Warning(const char* pMessage, const char* peer, uint64_t pJobID);
+ virtual void Update(const char* pMessage, const char* peer);
+ virtual void Warning(const char* pMessage, const char* peer);
};
#endif
diff -x '*.po' -d -urpN abrt.1/src/Daemon/CommLayerServer.h abrt.2/src/Daemon/CommLayerServer.h
--- abrt.1/src/Daemon/CommLayerServer.h 2010-02-07 23:11:00.000000000 +0100
+++ abrt.2/src/Daemon/CommLayerServer.h 2010-03-01 20:11:14.604749815 +0100
@@ -31,11 +31,11 @@ class CCommLayerServer {
/* just stubs to be called when not implemented in specific comm layer */
virtual void Crash(const char *progname, const char *uid_str) {}
- virtual void JobDone(const char* pDest, const char* pUUID) = 0;
+ virtual void JobDone(const char* peer) = 0;
virtual void QuotaExceed(const char* str) {}
- virtual void Update(const char* pMessage, const char* peer, uint64_t pJobID) {};
- virtual void Warning(const char* pMessage, const char* peer, uint64_t pJobID) {};
+ virtual void Update(const char* pMessage, const char* peer) {};
+ virtual void Warning(const char* pMessage, const char* peer) {};
};
#endif
diff -x '*.po' -d -urpN abrt.1/src/Daemon/CrashWatcher.cpp abrt.2/src/Daemon/CrashWatcher.cpp
--- abrt.1/src/Daemon/CrashWatcher.cpp 2010-02-07 23:11:00.000000000 +0100
+++ abrt.2/src/Daemon/CrashWatcher.cpp 2010-03-01 21:41:05.615749630 +0100
@@ -22,18 +22,18 @@
#include "DebugDump.h"
#include "CrashWatcher.h"
-void CCrashWatcher::Status(const char *pMessage, const char* peer, uint64_t pJobID)
+void CCrashWatcher::Status(const char *pMessage, const char* peer)
{
VERB1 log("Update('%s'): %s", peer, pMessage);
if (g_pCommLayer != NULL)
- g_pCommLayer->Update(pMessage, peer, pJobID);
+ g_pCommLayer->Update(pMessage, peer);
}
-void CCrashWatcher::Warning(const char *pMessage, const char* peer, uint64_t pJobID)
+void CCrashWatcher::Warning(const char *pMessage, const char* peer)
{
VERB1 log("Warning('%s'): %s", peer, pMessage);
if (g_pCommLayer != NULL)
- g_pCommLayer->Warning(pMessage, peer, pJobID);
+ g_pCommLayer->Warning(pMessage, peer);
}
CCrashWatcher::CCrashWatcher()
@@ -44,32 +44,31 @@ CCrashWatcher::~CCrashWatcher()
{
}
-vector_map_crash_data_t GetCrashInfos(const char *pUID)
+vector_map_crash_data_t GetCrashInfos(long caller_uid)
{
vector_map_crash_data_t retval;
log("Getting crash infos...");
try
{
- vector_pair_string_string_t UUIDsUIDs;
- UUIDsUIDs = GetUUIDsOfCrash(pUID);
+ vector_string_t crash_ids;
+ GetUUIDsOfCrash(caller_uid, crash_ids);
unsigned int ii;
- for (ii = 0; ii < UUIDsUIDs.size(); ii++)
+ for (ii = 0; ii < crash_ids.size(); ii++)
{
- const char *uuid = UUIDsUIDs[ii].first.c_str();
- const char *uid = UUIDsUIDs[ii].second.c_str();
+ const char *crash_id = crash_ids[ii].c_str();
map_crash_data_t info;
- mw_result_t res = FillCrashInfo(uuid, uid, info);
+ mw_result_t res = FillCrashInfo(crash_id, info);
switch (res)
{
case MW_OK:
retval.push_back(info);
break;
case MW_ERROR:
- error_msg("Dump directory for UUID %s doesn't exist or misses crucial files, deleting", uuid);
+ error_msg("Dump directory for crash_id %s doesn't exist or misses crucial files, deleting", crash_id);
/* Deletes both DB record and dump dir */
- DeleteDebugDump(uuid, uid);
+ DeleteDebugDump(crash_id, /*caller_uid:*/ 0);
break;
default:
break;
@@ -81,8 +80,6 @@ vector_map_crash_data_t GetCrashInfos(co
error_msg("%s", e.what());
}
- //retval = GetCrashInfos(pUID);
- //Notify("Sent crash info");
return retval;
}
@@ -94,37 +91,37 @@ vector_map_crash_data_t GetCrashInfos(co
* StartJob dbus call already did all the processing, and we just retrieve
* the result from dump directory, which is fast.
*/
-void CreateReport(const char* pUUID, const char* pUID, int force, map_crash_data_t& crashReport)
+void CreateReport(const char* crash_id, long caller_uid, int force, map_crash_data_t& crashReport)
{
/* FIXME: starting from here, any shared data must be protected with a mutex.
* For example, CreateCrashReport does:
* g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str());
* which is unsafe wrt concurrent updates to g_pPluginManager state.
*/
- mw_result_t res = CreateCrashReport(pUUID, pUID, force, crashReport);
+ mw_result_t res = CreateCrashReport(crash_id, caller_uid, force, crashReport);
switch (res)
{
case MW_OK:
VERB2 log_map_crash_data(crashReport, "crashReport");
break;
case MW_IN_DB_ERROR:
- error_msg("Can't find crash with UUID %s in database", pUUID);
+ error_msg("Can't find crash with id %s in database", crash_id);
break;
case MW_PLUGIN_ERROR:
error_msg("Particular analyzer plugin isn't loaded or there is an error within plugin(s)");
break;
default:
- error_msg("Corrupted crash with UUID %s, deleting", pUUID);
- DeleteDebugDump(pUUID, pUID);
+ error_msg("Corrupted crash with UUID %s, deleting", crash_id);
+ DeleteDebugDump(crash_id, /*caller_uid:*/ 0);
break;
}
}
typedef struct thread_data_t {
pthread_t thread_id;
- char* UUID;
- char* UID;
+ long caller_uid;
int force;
+ char* crash_id;
char* peer;
} thread_data_t;
static void* create_report(void* arg)
@@ -138,8 +135,8 @@ static void* create_report(void* arg)
{
log("Creating report...");
map_crash_data_t crashReport;
- CreateReport(thread_data->UUID, thread_data->UID, thread_data->force, crashReport);
- g_pCommLayer->JobDone(thread_data->peer, thread_data->UUID);
+ CreateReport(thread_data->crash_id, thread_data->caller_uid, thread_data->force, crashReport);
+ g_pCommLayer->JobDone(thread_data->peer);
}
catch (CABRTException& e)
{
@@ -149,19 +146,18 @@ static void* create_report(void* arg)
set_client_name(NULL);
/* free strduped strings */
- free(thread_data->UUID);
- free(thread_data->UID);
+ free(thread_data->crash_id);
free(thread_data->peer);
free(thread_data);
/* Bogus value. pthreads require us to return void* */
return NULL;
}
-int CreateReportThread(const char* pUUID, const char* pUID, int force, const char* pSender)
+int CreateReportThread(const char* crash_id, long caller_uid, int force, const char* pSender)
{
thread_data_t *thread_data = (thread_data_t *)xzalloc(sizeof(thread_data_t));
- thread_data->UUID = xstrdup(pUUID);
- thread_data->UID = xstrdup(pUID);
+ thread_data->crash_id = xstrdup(crash_id);
+ thread_data->caller_uid = caller_uid;
thread_data->force = force;
thread_data->peer = xstrdup(pSender);
@@ -172,8 +168,7 @@ int CreateReportThread(const char* pUUID
pthread_attr_destroy(&attr);
if (r != 0)
{
- free(thread_data->UUID);
- free(thread_data->UID);
+ free(thread_data->crash_id);
free(thread_data->peer);
free(thread_data);
/* The only reason this may happen is system-wide resource starvation,
@@ -188,14 +183,15 @@ int CreateReportThread(const char* pUUID
/* Remove dump dir and its DB record */
-int DeleteDebugDump(const char *pUUID, const char *pUID)
+int DeleteDebugDump(const char *crash_id, long caller_uid)
{
try
{
CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str());
database->Connect();
- database_row_t row = database->GetRow(pUUID, pUID);
- database->DeleteRow(pUUID, pUID);
+ database_row_t row = database->GetRow(crash_id);
+//TODO: check that caller_uid is allowed to do this
+ database->DeleteRow(crash_id);
database->DisConnect();
const char *dump_dir = row.m_sDebugDumpDir.c_str();
diff -x '*.po' -d -urpN abrt.1/src/Daemon/CrashWatcher.h abrt.2/src/Daemon/CrashWatcher.h
--- abrt.1/src/Daemon/CrashWatcher.h 2010-02-07 23:11:00.000000000 +0100
+++ abrt.2/src/Daemon/CrashWatcher.h 2010-03-01 21:47:56.253749600 +0100
@@ -43,14 +43,14 @@ class CCrashWatcher
public:
/* Observer methods */
- virtual void Status(const char *pMessage, const char* peer, uint64_t pJobID);
- virtual void Warning(const char *pMessage, const char* peer, uint64_t pJobID);
+ virtual void Status(const char *pMessage, const char* peer);
+ virtual void Warning(const char *pMessage, const char* peer);
};
-vector_map_crash_data_t GetCrashInfos(const char *pUID);
-int CreateReportThread(const char* pUUID, const char* pUID, int force, const char* pSender);
-void CreateReport(const char* pUUID, const char* pUID, int force, map_crash_data_t&);
-int DeleteDebugDump(const char *pUUID, const char *pUID);
+vector_map_crash_data_t GetCrashInfos(long caller_uid);
+int CreateReportThread(const char* crash_id, long caller_uid, int force, const char* pSender);
+void CreateReport(const char* crash_id, long caller_uid, int force, map_crash_data_t&);
+int DeleteDebugDump(const char *crash_id, long caller_uid);
void DeleteDebugDump_by_dir(const char *dump_dir);
#endif
diff -x '*.po' -d -urpN abrt.1/src/Daemon/Daemon.cpp abrt.2/src/Daemon/Daemon.cpp
--- abrt.1/src/Daemon/Daemon.cpp 2010-02-07 23:11:00.000000000 +0100
+++ abrt.2/src/Daemon/Daemon.cpp 2010-03-01 21:44:37.565749801 +0100
@@ -42,6 +42,8 @@
#include "DebugDump.h"
#include "Daemon.h"
+using namespace std;
+
/* Daemon initializes, then sits in glib main loop, waiting for events.
* Events can be:
@@ -53,16 +55,16 @@
* - GetCrashInfos(): returns a vector_map_crash_data_t (vector_map_vector_string_t)
* of crashes for given uid
* v[N]["executable"/"uid"/"kernel"/"backtrace"][N] = "contents"
- * - StartJob(UUID,force): starts creating a report for /var/cache/abrt/DIR with this UUID.
+ * - StartJob(crash_id,force): starts creating a report for /var/cache/abrt/DIR with this UID:UUID.
* Returns job id (uint64).
* After thread returns, when report creation thread has finished,
- * JobDone(client_dbus_ID,UUID) dbus signal is emitted.
- * - CreateReport(UUID): returns map_crash_data_t (map_vector_string_t)
+ * JobDone() dbus signal is emitted.
+ * - CreateReport(crash_id): returns map_crash_data_t (map_vector_string_t)
* - Report(map_crash_data_t (map_vector_string_t[, map_map_string_t])):
* "Please report this crash": calls Report() of all registered reporter plugins.
* Returns report_status_t (map_vector_string_t) - the status of each call.
* 2nd parameter is the contents of user's abrt.conf.
- * - DeleteDebugDump(UUID): delete it from DB and delete corresponding /var/cache/abrt/DIR
+ * - DeleteDebugDump(crash_id): delete it from DB and delete corresponding /var/cache/abrt/DIR
* - GetPluginsInfo(): returns map_map_string_t
* map["plugin"] = { "Name": "plugin", "Enabled": "yes" ... }
* - GetPluginSettings(PluginName): returns map_plugin_settings_t (map_string_t)
@@ -74,16 +76,12 @@
*
* DBus signals we emit:
* - Crash(progname,uid) - a new crash occurred (new /var/cache/abrt/DIR is found)
- * - JobDone(client_dbus_ID,UUID) - see StartJob above.
+ * - JobDone(client_dbus_ID) - see StartJob above.
* Sent as unicast to the client which did StartJob.
- * - Warning(msg,job_id)
- * - Update(msg,job_id)
+ * - Warning(msg)
+ * - Update(msg)
* Both are sent as unicast to last client set by set_client_name(name).
* If set_client_name(NULL) was done, they are not sent.
- *
- * TODO:
- * - JobDone signal does not need to pass any parameters
- * - our clients never send multiple StartJob's.
*/
@@ -522,9 +520,12 @@ static gboolean handle_inotify_cb(GIOCha
) {
VERB1 log("Reporting the crash automatically");
map_crash_data_t crash_report;
+ string crash_id = ssprintf("%s:%s", uid_str, get_crash_data_item_content(crashinfo, CD_UUID).c_str());
mw_result_t crash_result = CreateCrashReport(
- get_crash_data_item_content(crashinfo, CD_UUID).c_str(),
- uid_str, /*force:*/ 0, crash_report
+ crash_id.c_str(),
+ /*caller_uid:*/ 0,
+ /*force:*/ 0,
+ crash_report
);
if (crash_result == MW_OK)
{
diff -x '*.po' -d -urpN abrt.1/src/Daemon/MiddleWare.cpp abrt.2/src/Daemon/MiddleWare.cpp
--- abrt.1/src/Daemon/MiddleWare.cpp 2010-03-01 15:19:09.591025341 +0100
+++ abrt.2/src/Daemon/MiddleWare.cpp 2010-03-01 21:41:48.335999617 +0100
@@ -235,24 +235,28 @@ static void run_analyser_CreateReport(co
/* else: GetAnalyzer() already complained, no need to handle it here */
}
-mw_result_t CreateCrashReport(const char *pUUID,
- const char *pUID,
+/*
+ * Called in three cases:
+ * (1) by StartJob dbus call -> CreateReportThread(), in the thread
+ * (2) by CreateReport dbus call
+ * (3) by daemon if AutoReportUID is set for this user's crashes
+ */
+mw_result_t CreateCrashReport(const char *crash_id,
+ long caller_uid,
int force,
map_crash_data_t& pCrashData)
{
- VERB2 log("CreateCrashReport('%s','%s',result)", pUUID, pUID);
+ VERB2 log("CreateCrashReport('%s',%ld,result)", crash_id, caller_uid);
database_row_t row;
- if (pUUID[0] != '\0')
- {
- CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str());
- database->Connect();
- row = database->GetRow(pUUID, pUID);
- database->DisConnect();
- }
- if (pUUID[0] == '\0' || row.m_sUUID != pUUID)
+ CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str());
+ database->Connect();
+ row = database->GetRow(crash_id);
+ database->DisConnect();
+//TODO: verify against caller_uid
+ if (row.m_sUUID == "")
{
- error_msg("UUID '%s' is not in database", pUUID);
+ error_msg("crash_id '%s' is not in database", crash_id);
return MW_IN_DB_ERROR;
}
@@ -284,7 +288,6 @@ mw_result_t CreateCrashReport(const char
DebugDumpToCrashReport(row.m_sDebugDumpDir.c_str(), pCrashData);
add_to_crash_data_ext(pCrashData, CD_DUPHASH, CD_TXT, CD_ISNOTEDITABLE, dup_hash.c_str());
- add_to_crash_data_ext(pCrashData, CD_UUID , CD_SYS, CD_ISNOTEDITABLE, pUUID);
}
catch (CABRTException& e)
{
@@ -366,7 +369,7 @@ void RunActionsAndReporters(const char *
// dbus handler passes it from user without checking
report_status_t Report(const map_crash_data_t& client_report,
map_map_string_t& pSettings,
- const char *pUID)
+ long caller_uid)
{
// Get ID fields
const char *UID = get_crash_data_item_content_or_NULL(client_report, FILENAME_UID);
@@ -374,10 +377,13 @@ report_status_t Report(const map_crash_d
if (!UID || !UUID) {
throw CABRTException(EXCEP_ERROR, "Report(): UID or UUID is missing in client's report data");
}
+ string crash_id = ssprintf("%s:%s", UUID, UID);
+
+//TODO: check that caller_uid matches UID or that this dump is InformAll
// Retrieve corresponding stored record
map_crash_data_t stored_report;
- mw_result_t r = FillCrashInfo(UUID, UID, stored_report);
+ mw_result_t r = FillCrashInfo(crash_id.c_str(), stored_report);
if (r != MW_OK)
return report_status_t();
const std::string& pDumpDir = get_crash_data_item_content(stored_report, CD_DUMPDIR);
@@ -536,11 +542,11 @@ report_status_t Report(const map_crash_d
const vector_string_t &v = ret_it->second;
if (v[REPORT_STATUS_IDX_FLAG] == "1")
{
- database->SetReportedPerReporter(UUID, UID, plugin_name.c_str(), v[REPORT_STATUS_IDX_MSG].c_str());
+ database->SetReportedPerReporter(crash_id.c_str(), plugin_name.c_str(), v[REPORT_STATUS_IDX_MSG].c_str());
}
ret_it++;
}
- database->SetReported(UUID, UID, message.c_str());
+ database->SetReported(crash_id.c_str(), message.c_str());
database->DisConnect();
}
@@ -556,14 +562,14 @@ report_status_t Report(const map_crash_d
* @return It returns true if debugdump dir is already saved, otherwise
* it returns false.
*/
-static bool IsDebugDumpSaved(const char *pUID,
+static bool IsDebugDumpSaved(long uid,
const char *pDebugDumpDir)
{
/* TODO: use database query instead of dumping all rows and searching in them */
CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str());
database->Connect();
- vector_database_rows_t rows = database->GetUIDData(pUID);
+ vector_database_rows_t rows = database->GetUIDData(uid);
database->DisConnect();
int ii;
@@ -838,8 +844,7 @@ static void RunAnalyzerActions(const cha
* @param pCrashData A filled crash info.
* @return It return results of operation. See mw_result_t.
*/
-static mw_result_t SaveDebugDumpToDatabase(const char *pUUID,
- const char *pUID,
+static mw_result_t SaveDebugDumpToDatabase(const char *crash_id,
const char *pTime,
const char *pDebugDumpDir,
map_crash_data_t& pCrashData)
@@ -847,11 +852,11 @@ static mw_result_t SaveDebugDumpToDataba
CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str());
database->Connect();
/* note: if [UUID,UID] record exists, pDebugDumpDir is not updated in the record */
- database->Insert_or_Update(pUUID, pUID, pDebugDumpDir, pTime);
- database_row_t row = database->GetRow(pUUID, pUID);
+ database->Insert_or_Update(crash_id, pDebugDumpDir, pTime);
+ database_row_t row = database->GetRow(crash_id);
database->DisConnect();
- mw_result_t res = FillCrashInfo(pUUID, pUID, pCrashData);
+ mw_result_t res = FillCrashInfo(crash_id, pCrashData);
if (res == MW_OK)
{
const char *first = get_crash_data_item_content(pCrashData, CD_DUMPDIR).c_str();
@@ -869,15 +874,6 @@ static mw_result_t SaveDebugDumpToDataba
return res;
}
-std::string getDebugDumpDir(const char *pUUID, const char *pUID)
-{
- CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str());
- database->Connect();
- database_row_t row = database->GetRow(pUUID, pUID);
- database->DisConnect();
- return row.m_sDebugDumpDir;
-}
-
mw_result_t SaveDebugDump(const char *pDebugDumpDir,
map_crash_data_t& pCrashData)
{
@@ -902,7 +898,7 @@ mw_result_t SaveDebugDump(const char *pD
return MW_ERROR;
}
- if (IsDebugDumpSaved(UID.c_str(), pDebugDumpDir))
+ if (IsDebugDumpSaved(xatou(UID.c_str()), pDebugDumpDir))
{
return MW_IN_DB;
}
@@ -913,10 +909,8 @@ mw_result_t SaveDebugDump(const char *pD
return res;
}
- std::string lUUID = GetLocalUUID(analyzer.c_str(), pDebugDumpDir);
- const char *uid_str = analyzer_has_InformAllUsers(analyzer.c_str())
- ? "-1"
- : UID.c_str();
+ std::string UUID = GetLocalUUID(analyzer.c_str(), pDebugDumpDir);
+ std::string crash_id = ssprintf("%s:%s", UID.c_str(), UUID.c_str());
/* Loads pCrashData (from the *first debugdump dir* if this one is a dup)
* Returns:
* MW_REPORTED: "the crash is flagged as reported in DB" (which also means it's a dup)
@@ -924,16 +918,15 @@ mw_result_t SaveDebugDump(const char *pD
* MW_OK: "crash count is 1" (iow: this is a new crash, not a dup)
* else: an error code
*/
- return SaveDebugDumpToDatabase(lUUID.c_str(), uid_str, time.c_str(), pDebugDumpDir, pCrashData);
+ return SaveDebugDumpToDatabase(crash_id.c_str(), time.c_str(), pDebugDumpDir, pCrashData);
}
-mw_result_t FillCrashInfo(const char *pUUID,
- const char *pUID,
+mw_result_t FillCrashInfo(const char *crash_id,
map_crash_data_t& pCrashData)
{
CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str());
database->Connect();
- database_row_t row = database->GetRow(pUUID, pUID);
+ database_row_t row = database->GetRow(crash_id);
database->DisConnect();
std::string package;
@@ -964,22 +957,20 @@ mw_result_t FillCrashInfo(const char *pU
return MW_OK;
}
-vector_pair_string_string_t GetUUIDsOfCrash(const char *pUID)
+void GetUUIDsOfCrash(long caller_uid, vector_string_t &result)
{
CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str());
vector_database_rows_t rows;
database->Connect();
- rows = database->GetUIDData(pUID);
+ rows = database->GetUIDData(caller_uid);
database->DisConnect();
- vector_pair_string_string_t UUIDsUIDs;
unsigned ii;
for (ii = 0; ii < rows.size(); ii++)
{
- UUIDsUIDs.push_back(make_pair(rows[ii].m_sUUID, rows[ii].m_sUID));
+ string crash_id = ssprintf("%s:%s", rows[ii].m_sUUID.c_str(), rows[ii].m_sUID.c_str());
+ result.push_back(crash_id);
}
-
- return UUIDsUIDs;
}
void AddAnalyzerActionOrReporter(const char *pAnalyzer,
diff -x '*.po' -d -urpN abrt.1/src/Daemon/MiddleWare.h abrt.2/src/Daemon/MiddleWare.h
--- abrt.1/src/Daemon/MiddleWare.h 2010-02-07 23:11:00.000000000 +0100
+++ abrt.2/src/Daemon/MiddleWare.h 2010-03-01 21:39:04.238749887 +0100
@@ -62,8 +62,8 @@ void LoadOpenGPGPublicKey(const char* ke
* @param pCrashData A filled crash report.
* @return It return results of operation. See mw_result_t.
*/
-mw_result_t CreateCrashReport(const char *pUUID,
- const char *pUID,
+mw_result_t CreateCrashReport(const char *crash_id,
+ long caller_uid,
int force,
map_crash_data_t& pCrashData);
/**
@@ -93,16 +93,7 @@ void RunActionsAndReporters(const char *
*/
report_status_t Report(const map_crash_data_t& pCrashData,
map_map_string_t& pSettings,
- const char *pUID);
-/**
- * Get debugdump direcotory. If debugdump is not found
- * in database it will return empty string.
- * @param pUUID A local UUID of a crash.
- * @param pUID An UID of an user.
- * @return A debugdump directory.
- */
-std::string getDebugDumpDir( const char *pUUID,
- const char *pUID);
+ long caller_uid);
/**
* Adds package name and description to debugdump dir.
* Saves debugdump into database.
@@ -123,8 +114,7 @@ mw_result_t SaveDebugDump(const char *pD
* @param pCrashData A crash info.
* @return It return results of operation. See mw_result_t.
*/
-mw_result_t FillCrashInfo(const char *pUUID,
- const char *pUID,
+mw_result_t FillCrashInfo(const char *crash_id,
map_crash_data_t& pCrashData);
/**
* Gets all local UUIDs and UIDs of crashes. These crashes
@@ -132,7 +122,7 @@ mw_result_t FillCrashInfo(const char *pU
* @param pUID an UID of an user.
* @return A vector of pairs (local UUID, UID).
*/
-vector_pair_string_string_t GetUUIDsOfCrash(const char *pUID);
+void GetUUIDsOfCrash(long caller_uid, vector_string_t &result);
/**
* Adds one association among alanyzer plugin and its
* action and reporter plugins.
diff -x '*.po' -d -urpN abrt.1/src/Gui/CCDBusBackend.py abrt.2/src/Gui/CCDBusBackend.py
--- abrt.1/src/Gui/CCDBusBackend.py 2010-03-01 13:38:34.000000000 +0100
+++ abrt.2/src/Gui/CCDBusBackend.py 2010-03-01 20:12:45.247750486 +0100
@@ -164,11 +164,9 @@ class DBusManager(gobject.GObject):
else:
self.emit("daemon-state-changed", "down")
- def jobdone_cb(self, dest, uuid):
- # TODO: check that it is indeed OUR job:
- # remember uuid in getReport and compare here
- log1("Our job for UUID %s is done", uuid)
- dump = self.daemon().CreateReport(uuid)
+ def jobdone_cb(self):
+ log1("Our job for UUID %s is done", self.job_crash_id)
+ dump = self.daemon().CreateReport(self.job_crash_id)
if dump:
self.emit("analyze-complete", dump)
else:
@@ -177,9 +175,10 @@ class DBusManager(gobject.GObject):
def report_done(self, result):
self.emit("report-done", result)
- def getReport(self, UUID, force=0):
+ def start_job(self, crash_id, force=0):
# 2nd param is "force recreating of backtrace etc"
- self.daemon().StartJob(UUID, force, timeout=60)
+ self.daemon().StartJob(crash_id, force, timeout=60)
+ self.job_crash_id = crash_id
def Report(self, report, reporters, reporters_settings = None):
# map < Plguin_name vec <status, message> >
@@ -188,8 +187,8 @@ class DBusManager(gobject.GObject):
else:
self.daemon().Report(report, reporters, reply_handler=self.report_done, error_handler=self.error_handler_cb, timeout=60)
- def DeleteDebugDump(self,UUID):
- return self.daemon().DeleteDebugDump(UUID)
+ def DeleteDebugDump(self, crash_id):
+ return self.daemon().DeleteDebugDump(crash_id)
def getDumps(self):
row_dict = None
diff -x '*.po' -d -urpN abrt.1/src/Gui/CCMainWindow.py abrt.2/src/Gui/CCMainWindow.py
--- abrt.1/src/Gui/CCMainWindow.py 2010-03-01 13:38:34.000000000 +0100
+++ abrt.2/src/Gui/CCMainWindow.py 2010-03-01 20:12:15.308753265 +0100
@@ -263,7 +263,7 @@ class MainWindow():
# this should work until we keep the row object in the last position
dump = dumpsListStore.get_value(dumpsListStore.get_iter(path[0]), dumpsListStore.get_n_columns()-1)
try:
- self.ccdaemon.DeleteDebugDump(dump.getUUID())
+ self.ccdaemon.DeleteDebugDump("%s:%s" % (dump.getUID(), dump.getUUID()))
self.hydrate()
treeview.emit("cursor-changed")
except Exception, ex:
@@ -334,7 +334,7 @@ class MainWindow():
# show the report window with selected report
try:
- self.ccdaemon.getReport(report[CD_UUID][CD_CONTENT], force=1)
+ self.ccdaemon.start_job("%s:%s" % (report[FILENAME_UID][CD_CONTENT], report[CD_UUID][CD_CONTENT]), force=1)
except Exception, ex:
# FIXME #3 dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NoReply: Did not receive a reply
# do this async and wait for yum to end with debuginfoinstal
@@ -361,7 +361,7 @@ class MainWindow():
dump = dumpsListStore.get_value(dumpsListStore.get_iter(path[0]), dumpsListStore.get_n_columns()-1)
# show the report window with selected dump
try:
- self.ccdaemon.getReport(dump.getUUID())
+ self.ccdaemon.start_job("%s:%s" % (dump.getUID(), dump.getUUID()))
except Exception, ex:
# FIXME #3 dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NoReply: Did not receive a reply
# do this async and wait for yum to end with debuginfoinstal
14 years, 2 months
[Crash-catcher] reviews signing
by Jiri Moskovcak
When approving review, please add the following line:
Reviewed by: <your_email>
so it can be easily filtered, when needed.
Thanks,
Jirka
14 years, 2 months
[Crash-catcher] [PATCH] icons repackaging
by Jiri Moskovcak
As part of the gui changes I decided to repackage the icons to follow
the official guidelines. Need to apply using $ git apply. After this
change please make sure, applet and gui works and there is no warning
about missing icons.
Jirka
14 years, 2 months