summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--abrt.spec4
-rw-r--r--configure.ac1
-rw-r--r--po/POTFILES.in1
-rw-r--r--src/cli/CLI.cpp39
-rw-r--r--src/cli/abrt-cli.16
-rw-r--r--src/cli/report.cpp101
-rw-r--r--src/daemon/Daemon.cpp111
-rw-r--r--src/daemon/MiddleWare.cpp524
-rw-r--r--src/daemon/MiddleWare.h24
-rw-r--r--src/daemon/PluginManager.cpp14
-rw-r--r--src/daemon/PluginManager.h7
-rw-r--r--src/daemon/Settings.cpp15
-rw-r--r--src/daemon/Settings.h1
-rw-r--r--src/daemon/abrt-server.c2
-rw-r--r--src/daemon/abrt.conf4
-rw-r--r--src/daemon/abrt.conf.55
-rw-r--r--src/daemon/abrt_event.conf2
-rw-r--r--src/gui/CCDump.py28
-rw-r--r--src/gui/CCDumpList.py3
-rw-r--r--src/gui/CCMainWindow.py15
-rw-r--r--src/gui/CCReporterDialog.py4
-rw-r--r--src/gui/CReporterAssistant.py2
-rw-r--r--src/include/Makefile.am1
-rw-r--r--src/include/crash_types.h24
-rw-r--r--src/include/database.h134
-rw-r--r--src/lib/Makefile.am1
-rw-r--r--src/lib/database.c73
-rw-r--r--src/lib/dump_dir.c2
-rw-r--r--src/lib/make_descr.cpp9
-rw-r--r--src/lib/test.cpp4
-rw-r--r--src/plugins/Makefile.am14
-rw-r--r--src/plugins/SQLite3.conf4
-rw-r--r--src/plugins/SQLite3.cpp742
-rw-r--r--src/plugins/SQLite3.h58
-rw-r--r--src/plugins/abrt-SQLite3.736
-rw-r--r--src/plugins/abrt-action-analyze-c.c4
-rw-r--r--src/plugins/abrt-action-analyze-oops.c2
-rw-r--r--src/plugins/abrt-action-analyze-python.c2
-rw-r--r--src/plugins/abrt-action-generate-backtrace.c2
-rwxr-xr-xsrc/plugins/abrt-action-install-debuginfo7
-rw-r--r--src/plugins/abrt-action-mailx.cpp2
-rw-r--r--src/plugins/abrt-action-rhtsupport.cpp7
-rw-r--r--src/plugins/abrt-action-upload.cpp7
-rw-r--r--src/plugins/abrt-plugins.73
44 files changed, 369 insertions, 1682 deletions
diff --git a/abrt.spec b/abrt.spec
index e1dbdc05..b946cb30 100644
--- a/abrt.spec
+++ b/abrt.spec
@@ -32,7 +32,6 @@ BuildRequires: dbus-devel
BuildRequires: gtk2-devel
BuildRequires: curl-devel
BuildRequires: rpm-devel >= 4.6
-BuildRequires: sqlite-devel > 3.0
BuildRequires: desktop-file-utils
#BuildRequires: nss-devel
BuildRequires: libnotify-devel
@@ -346,9 +345,6 @@ fi
# {_mandir}/man5/pyhook.conf.5.gz
%{_mandir}/man7/%{name}-plugins.7.gz
%{_datadir}/dbus-1/system-services/com.redhat.abrt.service
-%config(noreplace) %{_sysconfdir}/%{name}/plugins/SQLite3.conf
-%{_libdir}/%{name}/libSQLite3.so*
-%{_mandir}/man7/%{name}-SQLite3.7.gz
%files libs
%defattr(-,root,root,-)
diff --git a/configure.ac b/configure.ac
index 8af09066..d3d8a294 100644
--- a/configure.ac
+++ b/configure.ac
@@ -37,7 +37,6 @@ if test -z "$PYTHON"; then
exit 1
fi
-PKG_CHECK_MODULES([SQLITE3], [sqlite3])
PKG_CHECK_MODULES([GTK], [gtk+-2.0])
PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.21])
PKG_CHECK_MODULES([DBUS], [dbus-1])
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 2aff27a5..ae6412f7 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -53,5 +53,4 @@ src/plugins/KerneloopsScanner.cpp
src/plugins/Logger.glade
src/plugins/Mailx.glade
src/plugins/RHTSupport.glade
-src/plugins/SQLite3.cpp
src/plugins/Upload.glade
diff --git a/src/cli/CLI.cpp b/src/cli/CLI.cpp
index d4bb333d..6ef5b1e9 100644
--- a/src/cli/CLI.cpp
+++ b/src/cli/CLI.cpp
@@ -44,18 +44,18 @@ static void print_crash(const map_crash_data_t &crash)
const char *timestr = get_crash_data_item_content(crash, FILENAME_TIME).c_str();
const char *timeloc = localize_crash_time(timestr);
- printf(_("\tUID : %s\n"
- "\tUUID : %s\n"
+ printf(_("\tCrash dump : %s\n"
+ "\tUID : %s\n"
"\tPackage : %s\n"
"\tExecutable : %s\n"
"\tCrash Time : %s\n"
"\tCrash Count: %s\n"),
- get_crash_data_item_content(crash, CD_UID).c_str(),
- get_crash_data_item_content(crash, CD_UUID).c_str(),
+ get_crash_data_item_content(crash, CD_DUMPDIR).c_str(),
+ get_crash_data_item_content(crash, FILENAME_UID).c_str(),
get_crash_data_item_content(crash, FILENAME_PACKAGE).c_str(),
get_crash_data_item_content(crash, FILENAME_EXECUTABLE).c_str(),
timeloc,
- get_crash_data_item_content(crash, CD_COUNT).c_str());
+ get_crash_data_item_content(crash, FILENAME_COUNT).c_str());
free((void *)timeloc);
@@ -75,7 +75,7 @@ static void print_crash_list(const vector_map_crash_data_t& crash_list, bool inc
for (unsigned i = 0; i < crash_list.size(); ++i)
{
const map_crash_data_t& crash = crash_list[i];
- if (get_crash_data_item_content(crash, CD_REPORTED) == "1" && !include_reported)
+ if (get_crash_data_item_content(crash, FILENAME_MESSAGE) != "" && !include_reported)
continue;
printf("%u.\n", i);
@@ -91,7 +91,7 @@ static void print_crash_info(const map_crash_data_t& crash, bool show_backtrace)
const char *timestr = get_crash_data_item_content(crash, FILENAME_TIME).c_str();
const char *timeloc = localize_crash_time(timestr);
- printf(_("Crash ID: %s:%s\n"
+ printf(_("Dump directory: %s\n"
"Last crash: %s\n"
"Analyzer: %s\n"
"Component: %s\n"
@@ -100,8 +100,7 @@ static void print_crash_info(const map_crash_data_t& crash, bool show_backtrace)
"Executable: %s\n"
"System: %s, kernel %s\n"
"Reason: %s\n"),
- get_crash_data_item_content(crash, CD_UID).c_str(),
- get_crash_data_item_content(crash, CD_UUID).c_str(),
+ get_crash_data_item_content(crash, CD_DUMPDIR).c_str(),
timeloc,
get_crash_data_item_content(crash, FILENAME_ANALYZER).c_str(),
get_crash_data_item_content(crash, FILENAME_COMPONENT).c_str(),
@@ -151,8 +150,7 @@ static void print_crash_info(const map_crash_data_t& crash, bool show_backtrace)
}
/**
- * Converts crash reference from user's input to unique crash identification
- * in form UID:UUID.
+ * Converts crash reference from user's input to crash dump dir name.
* The returned string must be released by caller.
*/
static char *guess_crash_id(const char *str)
@@ -165,10 +163,7 @@ static char *guess_crash_id(const char *str)
if (position >= num_crashinfos)
error_msg_and_die("There are only %u crash infos", num_crashinfos);
map_crash_data_t& info = ci[position];
- return xasprintf("%s:%s",
- get_crash_data_item_content(info, CD_UID).c_str(),
- get_crash_data_item_content(info, CD_UUID).c_str()
- );
+ return xstrdup(get_crash_data_item_content(info, CD_DUMPDIR).c_str());
}
unsigned len = strlen(str);
@@ -177,19 +172,16 @@ static char *guess_crash_id(const char *str)
for (ii = 0; ii < num_crashinfos; ii++)
{
map_crash_data_t& info = ci[ii];
- const char *this_uuid = get_crash_data_item_content(info, CD_UUID).c_str();
- if (strncmp(str, this_uuid, len) == 0)
+ const char *this_dir = get_crash_data_item_content(info, CD_DUMPDIR).c_str();
+ if (strncmp(str, this_dir, len) == 0)
{
if (result)
error_msg_and_die("Crash prefix '%s' is not unique", str);
- result = xasprintf("%s:%s",
- get_crash_data_item_content(info, CD_UID).c_str(),
- this_uuid
- );
+ result = xstrdup(this_dir);
}
}
if (!result)
- error_msg_and_die("Crash '%s' not found", str);
+ error_msg_and_die("Crash dump directory '%s' not found", str);
return result;
}
@@ -257,8 +249,7 @@ static void usage(char *argv0)
" -i, --info CRASH_ID print detailed information about a crash\n"
" -b, --backtrace print detailed information about a crash including backtrace\n"
"CRASH_ID can be:\n"
- " UID:UUID pair,\n"
- " unique UUID prefix - the crash with matching UUID will be acted upon\n"
+ " a name of dump directory, or\n"
" @N - N'th crash (as displayed by --list --full) will be acted upon\n"
),
name, name);
diff --git a/src/cli/abrt-cli.1 b/src/cli/abrt-cli.1
index 3ad858b3..1622fb14 100644
--- a/src/cli/abrt-cli.1
+++ b/src/cli/abrt-cli.1
@@ -21,13 +21,13 @@ Print a help message describing all of abrt-cli’s command-line options.
.B Crash action options
.IP "\-l, \-\-list"
Prints list of crashes which are not reported yet.
-.IP "\-r, \-\-report \fIUUID\fR"
+.IP "\-r, \-\-report \fIDUMPDIR\fR"
Creates a crash report and then the text editor is invoked on that
report. When you are done with editing the report just exit the editor
and then you will be asked if you want to send the report.
-.IP "\-d, \-\-delete \fIUUID\fR"
+.IP "\-d, \-\-delete \fIDUMPDIR\fR"
Removes data about particular crash.
-.IP "\-i, \-\-info \fIUUID\fR"
+.IP "\-i, \-\-info \fIDUMPDIR\fR"
Prints detailed information about particular crash.
.PP
diff --git a/src/cli/report.cpp b/src/cli/report.cpp
index 178a6028..1378b6b0 100644
--- a/src/cli/report.cpp
+++ b/src/cli/report.cpp
@@ -455,81 +455,6 @@ static GList *split(const char *s, const char delim)
return elems;
}
-/** Returns a list of enabled Reporter plugins, that are used to report
- * a particular crash.
- * @todo
- * Very similar code is used in the GUI, and also in the Daemon.
- * It should be shared.
- */
-static vector_string_t get_enabled_reporters(map_crash_data_t &crash_data)
-{
- vector_string_t result;
-
- /* Get global daemon settings. Analyzer->Reporters mapping is stored there. */
- map_map_string_t settings = call_GetSettings();
- /* Reporters are separated by comma in the following map. */
- map_string_t &analyzer_to_reporters = settings["AnalyzerActionsAndReporters"];
-
- /* Get the analyzer from the crash. */
- const char *analyzer = get_crash_data_item_content_or_NULL(crash_data, FILENAME_ANALYZER);
- if (!analyzer)
- return result; /* No analyzer found in the crash data. */
-
- /* First try to find package name dependent analyzer.
- * nvr = name-version-release
- * TODO: Similar code is in MiddleWare.cpp. It should not be duplicated.
- */
- const char *package_nvr = get_crash_data_item_content_or_NULL(crash_data, FILENAME_PACKAGE);
- if (!package_nvr)
- return result; /* No package name found in the crash data. */
- char * package_name = get_package_name_from_NVR_or_NULL(package_nvr);
- // analyzer with package name (CCpp:xorg-x11-app) has higher priority
- map_string_t::const_iterator reporters_iter;
- if (package_name != NULL)
- {
- char* package_specific_analyzer = xasprintf("%s:%s", analyzer, package_name);
- reporters_iter = analyzer_to_reporters.find(package_specific_analyzer);
- free(package_specific_analyzer);
- free(package_name);
- }
-
- if (analyzer_to_reporters.end() == reporters_iter)
- {
- reporters_iter = analyzer_to_reporters.find(analyzer);
- if (analyzer_to_reporters.end() == reporters_iter)
- return result; /* No reporters found for the analyzer. */
- }
-
- /* Reporters found, now parse the list. */
- GList *reporter_list = split(reporters_iter->second.c_str(), ',');
-
- // Get informations about all plugins.
- map_map_string_t plugins = call_GetPluginsInfo();
- // Check the configuration of each enabled Reporter plugin.
- map_map_string_t::iterator it, itend = plugins.end();
- for (it = plugins.begin(); it != itend; ++it)
- {
- // Skip disabled plugins.
- if (string_to_bool(it->second["Enabled"].c_str()) != true)
- continue;
- // Skip nonReporter plugins.
- if (0 != strcmp(it->second["Type"].c_str(), "Reporter"))
- continue;
- // Skip plugins not used in this particular crash.
- for (GList *li = reporter_list; li != NULL; li = g_list_next(li))
- {
- if (strcmp((char*)li->data, it->first.c_str()) == 0)
- result.push_back(it->first);
- }
- }
-
- for (GList *li = reporter_list; li != NULL; li = g_list_next(li))
- free((char*)li->data);
- g_list_free(reporter_list);
-
- return result;
-}
-
/**
* Asks a [y/n] question on stdin/stdout.
* Returns true if the answer is yes, false otherwise.
@@ -684,9 +609,27 @@ int report(const char *crash_id, int flags)
return result;
}
- /* Get enabled reporters associated with this particular crash. */
- vector_string_t reporters = get_enabled_reporters(cr);
- map_map_string_t reporters_settings; /* to be filled on the next line */
+ /* Get possible reporters associated with this particular crash. */
+ const char *events = get_crash_data_item_content_or_NULL(cr, CD_EVENTS);
+ vector_string_t reporters;
+ if (events) while (*events)
+ {
+ const char *end = strchrnul(events, '\n');
+ if (strncmp(events, "report", 6) == 0
+ && (events[6] == '\0' || events[6] == '_')
+ ) {
+ char *tmp = xstrndup(events, end - events);
+ reporters.push_back(tmp);
+ free(tmp);
+ }
+ events = end;
+ if (!*events)
+ break;
+ events++;
+ }
+
+ /* Get settings */
+ map_map_string_t reporters_settings;
get_reporter_plugin_settings(reporters, reporters_settings);
int errors = 0;
@@ -759,6 +702,6 @@ int report(const char *crash_id, int flags)
}
}
- printf(_("Crash reported via %d plugins (%d errors)\n"), plugins, errors);
+ printf(_("Crash reported via %d report events (%d errors)\n"), plugins, errors);
return errors != 0;
}
diff --git a/src/daemon/Daemon.cpp b/src/daemon/Daemon.cpp
index b25be6f9..225a7372 100644
--- a/src/daemon/Daemon.cpp
+++ b/src/daemon/Daemon.cpp
@@ -360,86 +360,6 @@ static int SetUpCron()
return 0;
}
-static void FindNewDumps(const char* pPath)
-{
- /* Get all debugdump directories in the pPath directory */
- GList *dirs = NULL;
- DIR *dp = opendir(pPath);
- if (dp == NULL)
- {
- perror_msg("Can't open directory '%s'", pPath);
- return;
- }
- struct dirent *ep;
- while ((ep = readdir(dp)))
- {
- if (dot_or_dotdot(ep->d_name))
- continue; /* skip "." and ".." */
- char *dname = concat_path_file(pPath, ep->d_name);
- struct stat stats;
- if (lstat(dname, &stats) == 0)
- {
- if (S_ISDIR(stats.st_mode))
- {
- VERB1 log("Will check directory '%s'", ep->d_name);
- dirs = g_list_append(dirs, dname);
- continue;
- }
- }
- free(dname);
- }
- closedir(dp);
-
- unsigned size = g_list_length(dirs);
- if (size == 0)
- return;
- log("Checking for unsaved crashes (dirs to check:%u)", size);
-
- /* Get potentially non-processed debugdumps */
- for (GList *li = dirs; li != NULL; li = g_list_next(li))
- {
- try
- {
- const char *dir_name = (char*)dirs->data;
- map_crash_data_t crashinfo;
- mw_result_t res = SaveDebugDump(dir_name, crashinfo);
- switch (res)
- {
- case MW_OK:
- /* Not VERB1: this is new, unprocessed crash dump.
- * Last abrtd somehow missed it - need to inform user */
- log("Non-processed crash in %s, saving into database", dir_name);
- break;
- case MW_IN_DB:
- /* This debugdump was found in DB, nothing else was done
- * by SaveDebugDump or needs to be done by us */
- VERB1 log("%s is already saved in database", dir_name);
- break;
- case MW_REPORTED: /* already reported dup */
- case MW_OCCURRED: /* not-yet-reported dup */
- VERB1 log("Duplicate crash %s, deleting", dir_name);
- delete_debug_dump_dir(dir_name);
- break;
- default:
- log("Corrupted or bad crash %s (res:%d), deleting", dir_name, (int)res);
- delete_debug_dump_dir(dir_name);
- break;
- }
- }
- catch (CABRTException& e)
- {
- error_msg("%s", e.what());
- }
- }
-
- for (GList *li = dirs; li != NULL; li = g_list_next(li))
- free(li->data);
-
- g_list_free(dirs);
-
- log("Done checking for unsaved crashes");
-}
-
static int CreatePidFile()
{
int fd;
@@ -616,7 +536,7 @@ static gboolean handle_inotify_cb(GIOChannel *gio, GIOCondition condition, gpoin
char *d = concat_path_file(DEBUG_DUMPS_DIR, worst_dir);
free(worst_dir);
worst_dir = NULL;
- DeleteDebugDump_by_dir(d);
+ delete_debug_dump_dir(d);
free(d);
}
}
@@ -625,38 +545,36 @@ static gboolean handle_inotify_cb(GIOChannel *gio, GIOCondition condition, gpoin
try
{
fullname = concat_path_file(DEBUG_DUMPS_DIR, name);
- /* Note: SaveDebugDump does not save crashinfo, it _fetches_ crashinfo */
map_crash_data_t crashinfo;
- mw_result_t res = SaveDebugDump(fullname, crashinfo);
+ mw_result_t res = LoadDebugDump(fullname, crashinfo);
switch (res)
{
case MW_OK:
log("New crash %s, processing", fullname);
/* Fall through */
- case MW_REPORTED: /* already reported dup */
- case MW_OCCURRED: /* not-yet-reported dup */
+ case MW_OCCURRED: /* dup */
{
if (res != MW_OK)
{
- const char *first = get_crash_data_item_content(crashinfo, CD_DUMPDIR).c_str();
+ const char *first = get_crash_data_item_content_or_NULL(crashinfo, CD_DUMPDIR);
log("Deleting crash %s (dup of %s), sending dbus signal",
strrchr(fullname, '/') + 1,
strrchr(first, '/') + 1);
delete_debug_dump_dir(fullname);
}
- const char *analyzer = get_crash_data_item_content(crashinfo, FILENAME_ANALYZER).c_str();
- const char *uid_str = get_crash_data_item_content(crashinfo, CD_UID).c_str();
+ const char *uid_str = get_crash_data_item_content_or_NULL(crashinfo, FILENAME_UID);
+ const char *inform_all = get_crash_data_item_content_or_NULL(crashinfo, FILENAME_INFORMALL);
- /* Send dbus signal */
- //if (analyzer_has_InformAllUsers(analyzer))
- // uid_str = NULL;
+ if (inform_all && string_to_bool(inform_all))
+ uid_str = NULL;
char *crash_id = xasprintf("%s:%s",
- get_crash_data_item_content(crashinfo, CD_UID).c_str(),
- get_crash_data_item_content(crashinfo, CD_UUID).c_str()
+ get_crash_data_item_content_or_NULL(crashinfo, FILENAME_UID),
+ get_crash_data_item_content_or_NULL(crashinfo, FILENAME_UUID)
);
- g_pCommLayer->Crash(get_crash_data_item_content(crashinfo, FILENAME_PACKAGE).c_str(),
+ /* Send dbus signal */
+ g_pCommLayer->Crash(get_crash_data_item_content_or_NULL(crashinfo, FILENAME_PACKAGE),
crash_id,
fullname,
uid_str
@@ -664,9 +582,6 @@ static gboolean handle_inotify_cb(GIOChannel *gio, GIOCondition condition, gpoin
free(crash_id);
break;
}
- case MW_IN_DB:
- log("Huh, this crash is already in db?! Nothing to do");
- break;
case MW_CORRUPTED:
case MW_GPG_ERROR:
default:
@@ -984,8 +899,6 @@ int main(int argc, char** argv)
/* Enter the event loop */
try
{
- /* This may take a while, therefore we don't do it in init section */
- FindNewDumps(DEBUG_DUMPS_DIR);
log("Init complete, entering main loop");
run_main_loop(pMainloop);
}
diff --git a/src/daemon/MiddleWare.cpp b/src/daemon/MiddleWare.cpp
index bd0e9689..43844d82 100644
--- a/src/daemon/MiddleWare.cpp
+++ b/src/daemon/MiddleWare.cpp
@@ -43,7 +43,7 @@ CPluginManager* g_pPluginManager;
* @param pCrashData A crash info.
* @return It return results of operation. See mw_result_t.
*/
-static mw_result_t FillCrashInfo(const char *crash_id,
+static mw_result_t FillCrashInfo(const char *dump_dir_name,
map_crash_data_t& pCrashData);
/**
@@ -79,6 +79,8 @@ static bool DebugDumpToCrashReport(const char *dump_dir_name, map_crash_data_t&
add_to_crash_data_ext(pCrashData, CD_EVENTS, CD_SYS, CD_ISNOTEDITABLE, events);
free(events);
+ add_to_crash_data_ext(pCrashData, CD_DUMPDIR, CD_SYS, CD_ISNOTEDITABLE, dump_dir_name);
+
return true;
}
@@ -94,43 +96,44 @@ static char *do_log_and_update_client(char *log_line, void *param)
* (1) by StartJob dbus call -> CreateReportThread(), in the thread
* (2) by CreateReport dbus call
*/
-mw_result_t CreateCrashReport(const char *crash_id,
+mw_result_t CreateCrashReport(const char *dump_dir_name,
long caller_uid,
int force,
map_crash_data_t& pCrashData)
{
- VERB2 log("CreateCrashReport('%s',%ld,result)", crash_id, caller_uid);
+ VERB2 log("CreateCrashReport('%s',%ld,result)", dump_dir_name, caller_uid);
- CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase);
- database->Connect();
- struct db_row *row = database->GetRow(crash_id);
- database->DisConnect();
- if (!row)
- {
- error_msg("crash '%s' is not in database", crash_id);
- return MW_IN_DB_ERROR;
- }
+ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
+ if (!dd)
+ return MW_NOENT_ERROR;
mw_result_t r = MW_OK;
- if (caller_uid != 0 /* not called by root */
- && row->db_inform_all[0] != '1'
- ) {
+ if (caller_uid != 0) /* not called by root */
+ {
char caller_uid_str[sizeof(long) * 3 + 2];
sprintf(caller_uid_str, "%ld", caller_uid);
- if (strcmp(caller_uid_str, row->db_uid) != 0)
+
+ char *uid = dd_load_text(dd, FILENAME_UID);
+ if (strcmp(uid, caller_uid_str) != 0)
{
- error_msg("crash '%s' can't be accessed by user with uid %ld", crash_id, caller_uid);
- r = MW_IN_DB_ERROR;
- goto ret;
+ char *inform_all = dd_load_text(dd, FILENAME_INFORMALL);
+ if (!string_to_bool(inform_all))
+ {
+ dd_close(dd);
+ error_msg("crash '%s' can't be accessed by user with uid %ld", dump_dir_name, caller_uid);
+ r = MW_PERM_ERROR;
+ goto ret;
+ }
}
}
+ dd_close(dd);
try
{
struct run_event_state *run_state = new_run_event_state();
run_state->logging_callback = do_log_and_update_client;
- int res = run_event(run_state, row->db_dump_dir, force ? "reanalyze" : "analyze");
+ int res = run_event(run_state, dump_dir_name, force ? "reanalyze" : "analyze");
free_run_event_state(run_state);
if (res != 0 && res != -1) /* -1 is "nothing was done", here it is ok */
{
@@ -141,7 +144,7 @@ mw_result_t CreateCrashReport(const char *crash_id,
/* Do a load_crash_data_from_debug_dump from (possibly updated)
* crash dump dir
*/
- if (!DebugDumpToCrashReport(row->db_dump_dir, pCrashData))
+ if (!DebugDumpToCrashReport(dump_dir_name, pCrashData))
{
error_msg("Error loading crash data");
r = MW_ERROR;
@@ -159,7 +162,6 @@ mw_result_t CreateCrashReport(const char *crash_id,
}
ret:
- db_row_free(row);
VERB3 log("CreateCrashReport() returns %d", r);
return r;
}
@@ -207,17 +209,16 @@ report_status_t Report(const map_crash_data_t& client_report,
long caller_uid)
{
// Get ID fields
- const char *UID = get_crash_data_item_content_or_NULL(client_report, CD_UID);
- const char *UUID = get_crash_data_item_content_or_NULL(client_report, CD_UUID);
- if (!UID || !UUID)
+ const char *UID = get_crash_data_item_content_or_NULL(client_report, FILENAME_UID);
+ const char *dump_dir_name = get_crash_data_item_content_or_NULL(client_report, CD_DUMPDIR);
+ if (!UID || !dump_dir_name)
{
- throw CABRTException(EXCEP_ERROR, "Report(): UID or UUID is missing in client's report data");
+ throw CABRTException(EXCEP_ERROR, "Report(): UID or DUMPDIR is missing in client's report data");
}
- string crash_id = ssprintf("%s:%s", UID, UUID);
// Retrieve corresponding stored record
map_crash_data_t stored_report;
- mw_result_t r = FillCrashInfo(crash_id.c_str(), stored_report);
+ mw_result_t r = FillCrashInfo(dump_dir_name, stored_report);
if (r != MW_OK)
{
return report_status_t();
@@ -225,15 +226,13 @@ report_status_t Report(const map_crash_data_t& client_report,
// Is it allowed for this user to report?
if (caller_uid != 0 // not called by root
- && get_crash_data_item_content(stored_report, CD_INFORMALL) != "1"
+ && get_crash_data_item_content(stored_report, FILENAME_INFORMALL) != "1"
&& strcmp(to_string(caller_uid).c_str(), UID) != 0
) {
throw CABRTException(EXCEP_ERROR, "Report(): user with uid %ld can't report crash %s",
- caller_uid, crash_id.c_str());
+ caller_uid, dump_dir_name);
}
- const char *dump_dir_name = get_crash_data_item_content_or_NULL(stored_report, CD_DUMPDIR);
-
// Save comment, "how to reproduce", backtrace
//TODO: we should iterate through stored_report and modify all
//modifiable fields which have new data in client_report
@@ -363,136 +362,102 @@ report_status_t Report(const map_crash_data_t& client_report,
}
g_list_free(env_list);
- // Save reporting results to database
+ // Save reporting results
if (at_least_one_reporter_succeeded)
{
- CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase);
- database->Connect();
report_status_t::iterator ret_it = ret.begin();
while (ret_it != ret.end())
{
- const string &event = ret_it->first;
- const vector_string_t &v = ret_it->second;
- if (v[REPORT_STATUS_IDX_FLAG] == "1")
- {
- database->SetReportedPerReporter(crash_id.c_str(), event.c_str(), v[REPORT_STATUS_IDX_MSG].c_str());
- }
+// const string &event = ret_it->first;
+// const vector_string_t &v = ret_it->second;
+// if (v[REPORT_STATUS_IDX_FLAG] == "1")
+// {
+// TODO: append to a log of reports done
+// database->SetReportedPerReporter(dump_dir_name, event.c_str(), v[REPORT_STATUS_IDX_MSG].c_str());
+// }
ret_it++;
}
- database->SetReported(crash_id.c_str(), message.c_str());
- database->DisConnect();
+ /* Was: database->SetReported(dump_dir_name, message.c_str()); */
+ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
+ if (dd)
+ {
+ dd_save_text(dd, FILENAME_MESSAGE, message.c_str());
+ dd_close(dd);
+ }
}
return ret;
#undef client_report
}
-/**
- * Check whether particular debugdump directory is saved in database.
- * @param debug_dump_dir
- * A debugdump dir containing all necessary data.
- * @return
- * It returns true if debugdump dir is already saved, otherwise
- * it returns false.
- */
-static bool is_debug_dump_saved(const char *debug_dump_dir)
-{
- CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase);
- database->Connect();
- struct db_row *row = database->GetRow_by_dir(debug_dump_dir);
- database->DisConnect();
-
- db_row_free(row);
- return row != NULL;
-}
-
-/**
- * Save a debugdump into database. If saving is
- * successful, then crash info is filled. Otherwise the crash info is
- * not changed.
- * @param pUUID A local UUID of a crash.
- * @param pUID An UID of an user.
- * @param pTime Time when a crash occurs.
- * @param pDebugDumpPath A debugdump path.
- * @param pCrashData A filled crash info.
- * @return It return results of operation. See mw_result_t.
- */
-static mw_result_t SaveDebugDumpToDatabase(const char *crash_id,
- bool inform_all_users,
- const char *pTime,
- const char *pDebugDumpDir,
- map_crash_data_t& pCrashData)
-{
- CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase);
- database->Connect();
- /* note: if [UUID,UID] record exists, pDebugDumpDir is not updated in the record */
- database->Insert_or_Update(crash_id, inform_all_users, pDebugDumpDir, pTime);
-
- struct db_row *row = database->GetRow(crash_id);
- database->DisConnect();
-
- 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();
- if (row && row->db_reported[0] == '1')
- {
- log("Crash is in database already (dup of %s) and is reported", first);
- db_row_free(row);
- return MW_REPORTED;
- }
- if (row && xatou(row->db_count) > 1)
- {
- db_row_free(row);
- log("Crash is in database already (dup of %s)", first);
- return MW_OCCURRED;
- }
- }
- db_row_free(row);
- return res;
-}
-
-/* We need to share some data between SaveDebugDump and is_crash_id_in_db: */
+/* We need to share some data between LoadDebugDump and is_crash_a_dup: */
struct cdump_state {
- char *uid; /* filled by SaveDebugDump */
- char *crash_id; /* filled by is_crash_id_in_db */
- int crash_id_is_in_db; /* filled by is_crash_id_in_db */
+ char *uid; /* filled by LoadDebugDump */
+ char *uuid; /* filled by is_crash_a_dup */
+ char *crash_dump_dup_name; /* filled by is_crash_a_dup */
};
-static int is_crash_id_in_db(const char *dump_dir_name, void *param)
+static int is_crash_a_dup(const char *dump_dir_name, void *param)
{
struct cdump_state *state = (struct cdump_state *)param;
- if (state->crash_id)
+ if (state->uuid)
return 0; /* we already checked it, don't do it again */
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
return 0; /* wtf? (error, but will be handled elsewhere later) */
- char *uuid = dd_load_text_ext(dd, CD_UUID,
+ state->uuid = dd_load_text_ext(dd, FILENAME_UUID,
DD_FAIL_QUIETLY + DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE
);
dd_close(dd);
- if (!uuid)
+ if (!state->uuid)
{
return 0; /* no uuid (yet), "run_event, please continue iterating" */
}
- state->crash_id = xasprintf("%s:%s", state->uid, uuid);
- free(uuid);
-
- CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase);
- database->Connect();
- struct db_row *row = database->GetRow(state->crash_id);
- database->DisConnect();
-
- if (!row) /* Crash id is not in db - this crash wasn't seen before */
- return 0; /* "run_event, please continue iterating" */
-
- /* Crash id is in db */
- db_row_free(row);
- state->crash_id_is_in_db = 1;
- /* "run_event, please stop iterating": */
- return 1;
+
+ /* Scan crash dumps looking for a dup */
+//TODO: explain why this is safe wrt concurrent runs
+ DIR *dir = opendir(DEBUG_DUMPS_DIR);
+ if (dir != NULL)
+ {
+ struct dirent *dent;
+ while ((dent = readdir(dir)) != NULL)
+ {
+ if (dot_or_dotdot(dent->d_name))
+ continue; /* skip "." and ".." */
+
+ int different;
+ char *uid, *uuid;
+ char *dump_dir_name2 = concat_path_file(DEBUG_DUMPS_DIR, dent->d_name);
+
+ if (strcmp(dump_dir_name, dump_dir_name2) == 0)
+ goto next; /* we are never a dup of ourself */
+
+ dd = dd_opendir(dump_dir_name2, /*flags:*/ 0);
+ if (!dd)
+ goto next;
+ uid = dd_load_text(dd, FILENAME_UID);
+ uuid = dd_load_text(dd, FILENAME_UUID);
+ dd_close(dd);
+ different = strcmp(state->uid, uid) || strcmp(state->uuid, uuid);
+ free(uid);
+ free(uuid);
+ if (different)
+ goto next;
+
+ state->crash_dump_dup_name = dump_dir_name2;
+ /* "run_event, please stop iterating": */
+ return 1;
+
+ next:
+ free(dump_dir_name2);
+ }
+ closedir(dir);
+ }
+
+ /* No dup found */
+ return 0; /* "run_event, please continue iterating" */
}
static char *do_log(char *log_line, void *param)
@@ -502,92 +467,110 @@ static char *do_log(char *log_line, void *param)
return log_line;
}
-mw_result_t SaveDebugDump(const char *dump_dir_name,
+mw_result_t LoadDebugDump(const char *dump_dir_name,
map_crash_data_t& pCrashData)
{
mw_result_t res;
- if (is_debug_dump_saved(dump_dir_name))
- return MW_IN_DB;
-
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
return MW_ERROR;
- struct cdump_state state = { NULL, NULL, false }; /* uid, crash_id, crash_id_is_in_db */
- state.uid = dd_load_text(dd, CD_UID);
- char *time = dd_load_text(dd, FILENAME_TIME);
+ struct cdump_state state;
+ state.uid = dd_load_text(dd, FILENAME_UID);
+ state.uuid = NULL;
+ state.crash_dump_dup_name = NULL;
char *analyzer = dd_load_text(dd, FILENAME_ANALYZER);
dd_close(dd);
res = MW_ERROR;
+ /* Run post-create event handler(s) */
struct run_event_state *run_state = new_run_event_state();
- run_state->post_run_callback = is_crash_id_in_db;
+ run_state->post_run_callback = is_crash_a_dup;
run_state->post_run_param = &state;
run_state->logging_callback = do_log;
int r = run_event(run_state, dump_dir_name, "post-create");
free_run_event_state(run_state);
- /* Is crash id in db? (In this case, is_crash_id_in_db() should have
+//TODO: consider this case:
+// new dump is created, post-create detects that it is a dup,
+// but then FillCrashInfo(dup_name) *FAILS*.
+// In this case, we later delete damaged dup_name (right?)
+// but new dump never gets its FILENAME_COUNT set!
+
+ /* Is crash a dup? (In this case, is_crash_a_dup() should have
* aborted "post-create" event processing as soon as it saw uuid
- * such that uid:uuid (=crash_id) is in database, and set
- * the state.crash_id_is_in_db flag)
+ * and determined that there is another crash with same uuid.
+ * In this case it sets state.crash_dump_dup_name)
*/
- if (!state.crash_id_is_in_db)
+ if (!state.crash_dump_dup_name)
{
/* No. Was there error on one of processing steps in run_event? */
if (r != 0)
goto ret; /* yes */
- /* Was uuid created after all? (In this case, is_crash_id_in_db()
- * should have fetched it and created state.crash_id)
+ /* Was uuid created after all? (In this case, is_crash_a_dup()
+ * should have fetched it and created state.uuid)
*/
- if (!state.crash_id)
+ if (!state.uuid)
{
/* no */
log("Dump directory '%s' has no UUID element", dump_dir_name);
goto ret;
}
}
+ else
+ {
+ dump_dir_name = state.crash_dump_dup_name;
+ }
/* 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)
* MW_OCCURRED: "crash count is != 1" (iow: it is > 1 - dup)
* MW_OK: "crash count is 1" (iow: this is a new crash, not a dup)
* else: an error code
*/
- res = SaveDebugDumpToDatabase(state.crash_id,
- true, /*analyzer_has_InformAllUsers(analyzer),*/
- time,
- dump_dir_name,
- pCrashData);
+ {
+ dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
+ if (!dd)
+ {
+ res = MW_ERROR;
+ goto ret;
+ }
+ char *count_str = dd_load_text_ext(dd, FILENAME_COUNT, DD_FAIL_QUIETLY);
+ unsigned long count = strtoul(count_str, NULL, 10);
+ count++;
+ char new_count_str[sizeof(long)*3 + 2];
+ sprintf(new_count_str, "%lu", count);
+ dd_save_text(dd, FILENAME_COUNT, new_count_str);
+ dd_close(dd);
+
+ res = FillCrashInfo(dump_dir_name, pCrashData);
+ if (res == MW_OK)
+ {
+ if (count > 1)
+ {
+ log("Crash dump is a duplicate of %s", dump_dir_name);
+ res = MW_OCCURRED;
+ }
+ }
+ }
+
ret:
- free(state.crash_id);
+ free(state.uuid);
free(state.uid);
- free(time);
+ free(state.crash_dump_dup_name);
free(analyzer);
return res;
}
-static mw_result_t FillCrashInfo(const char *crash_id,
+static mw_result_t FillCrashInfo(const char *dump_dir_name,
map_crash_data_t& pCrashData)
{
- CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase);
- database->Connect();
- struct db_row *row = database->GetRow(crash_id);
- database->DisConnect();
-
- if (!row)
- return MW_ERROR;
-
- struct dump_dir *dd = dd_opendir(row->db_dump_dir, /*flags:*/ 0);
+ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
- {
- db_row_free(row);
return MW_ERROR;
- }
load_crash_data_from_debug_dump(dd, pCrashData);
char *events = list_possible_events(dd, NULL, "");
@@ -596,76 +579,85 @@ static mw_result_t FillCrashInfo(const char *crash_id,
add_to_crash_data_ext(pCrashData, CD_EVENTS, CD_SYS, CD_ISNOTEDITABLE, events);
free(events);
-//TODO: we _never_ use CD_SYS, perhaps we should use it here?
- add_to_crash_data(pCrashData, CD_UID , row->db_uid );
- add_to_crash_data(pCrashData, CD_UUID , row->db_uuid );
- add_to_crash_data(pCrashData, CD_INFORMALL , row->db_inform_all );
- add_to_crash_data(pCrashData, CD_COUNT , row->db_count );
- add_to_crash_data(pCrashData, CD_REPORTED , row->db_reported );
- add_to_crash_data(pCrashData, CD_MESSAGE , row->db_message );
- add_to_crash_data(pCrashData, CD_DUMPDIR , row->db_dump_dir );
- add_to_crash_data(pCrashData, FILENAME_TIME , row->db_time );
-
- db_row_free(row);
+ add_to_crash_data_ext(pCrashData, CD_DUMPDIR, CD_SYS, CD_ISNOTEDITABLE, dump_dir_name);
return MW_OK;
}
-static void GetUUIDsOfCrash(long caller_uid, vector_string_t &result)
-{
- CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase);
- database->Connect();
- GList *rows = database->GetUIDData(caller_uid);
- database->DisConnect();
-
- for (GList *li = rows; li != NULL; li = g_list_next(li))
- {
- struct db_row *row = (struct db_row*)li->data;
- string crash_id = ssprintf("%s:%s", row->db_uid, row->db_uuid);
- result.push_back(crash_id);
- }
-
- // TODO: return GList
- db_list_free(rows);
-}
-
vector_map_crash_data_t GetCrashInfos(long caller_uid)
{
vector_map_crash_data_t retval;
log("Getting crash infos...");
- try
+
+ DIR *dir = opendir(DEBUG_DUMPS_DIR);
+ if (dir != NULL)
{
- vector_string_t crash_ids;
-//TODO: it looks strange that we select UUIDs
-//olny in order to find which directories to read!
-//Should we simply retrieve list of *directories*, not *uuids*?
- GetUUIDsOfCrash(caller_uid, crash_ids);
-
- unsigned int ii;
- for (ii = 0; ii < crash_ids.size(); ii++)
+ try
{
- const char *crash_id = crash_ids[ii].c_str();
-
- map_crash_data_t info;
- mw_result_t res = FillCrashInfo(crash_id, info);
- switch (res)
+ struct dirent *dent;
+ while ((dent = readdir(dir)) != NULL)
{
- case MW_OK:
- retval.push_back(info);
- break;
- case MW_ERROR:
- 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(crash_id, /*caller_uid:*/ 0);
- break;
- default:
- break;
+ if (dot_or_dotdot(dent->d_name))
+ continue; /* skip "." and ".." */
+
+ char *dump_dir_name = concat_path_file(DEBUG_DUMPS_DIR, dent->d_name);
+
+ struct stat statbuf;
+ if (stat(dump_dir_name, &statbuf) != 0
+ || !S_ISDIR(statbuf.st_mode)
+ ) {
+ goto next; /* not a dir, skip */
+ }
+
+ /* Skip directories which are not for this uid */
+ if (caller_uid != 0) /* not called by root? */
+ {
+ char *uid;
+ char caller_uid_str[sizeof(long) * 3 + 2];
+
+ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
+ if (!dd)
+ goto next;
+
+ sprintf(caller_uid_str, "%ld", caller_uid);
+ uid = dd_load_text(dd, FILENAME_UID);
+ if (strcmp(uid, caller_uid_str) != 0)
+ {
+ char *inform_all = dd_load_text(dd, FILENAME_INFORMALL);
+ if (!string_to_bool(inform_all))
+ {
+ dd_close(dd);
+ goto next;
+ }
+ }
+ dd_close(dd);
+ }
+
+ {
+ map_crash_data_t info;
+ mw_result_t res = FillCrashInfo(dump_dir_name, info);
+ switch (res)
+ {
+ case MW_OK:
+ retval.push_back(info);
+ break;
+ case MW_ERROR:
+ error_msg("Dump directory %s doesn't exist or misses crucial files, deleting", dump_dir_name);
+ delete_debug_dump_dir(dump_dir_name);
+ break;
+ default:
+ break;
+ }
+ }
+ next:
+ free(dump_dir_name);
}
}
- }
- catch (CABRTException& e)
- {
- error_msg("%s", e.what());
+ catch (CABRTException& e)
+ {
+ error_msg("%s", e.what());
+ }
+ closedir(dir);
}
return retval;
@@ -681,19 +673,18 @@ vector_map_crash_data_t GetCrashInfos(long caller_uid)
*/
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);
- * which is unsafe wrt concurrent updates to g_pPluginManager state.
- */
+ /* FIXME: starting from here, any shared data must be protected with a mutex. */
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 id %s in database", crash_id);
+ case MW_NOENT_ERROR:
+ error_msg("Can't find crash with id '%s'", crash_id);
+ break;
+ case MW_PERM_ERROR:
+ error_msg("Can't find crash with id '%s'", crash_id);
break;
case MW_PLUGIN_ERROR:
error_msg("Particular analyzer plugin isn't loaded or there is an error within plugin(s)");
@@ -770,63 +761,34 @@ int CreateReportThread(const char* crash_id, long caller_uid, int force, const c
}
-/* Remove dump dir and its DB record */
-int DeleteDebugDump(const char *crash_id, long caller_uid)
+/* Remove dump dir */
+int DeleteDebugDump(const char *dump_dir_name, long caller_uid)
{
- try
- {
- CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase);
- database->Connect();
- struct db_row *row = database->GetRow(crash_id);
- if (!row)
- {
- database->DisConnect();
- return ENOENT;
- }
+ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
+ if (!dd)
+ return MW_NOENT_ERROR;
+ if (caller_uid != 0) /* not called by root */
+ {
char caller_uid_str[sizeof(long) * 3 + 2];
- sprintf(caller_uid_str, "%li", caller_uid);
-
- if (caller_uid != 0 /* not called by root */
- && row->db_inform_all[0] != '1'
- && strcmp(caller_uid_str, row->db_uid) != 0
- ) {
- database->DisConnect();
- db_row_free(row);
- return EPERM;
- }
- database->DeleteRow(crash_id);
- database->DisConnect();
- if (row->db_dump_dir[0] != '\0')
+ sprintf(caller_uid_str, "%ld", caller_uid);
+
+ char *uid = dd_load_text(dd, FILENAME_UID);
+ if (strcmp(uid, caller_uid_str) != 0)
{
- delete_debug_dump_dir(row->db_dump_dir);
- db_row_free(row);
- return 0; /* success */
+ char *inform_all = dd_load_text(dd, FILENAME_INFORMALL);
+ if (!string_to_bool(inform_all))
+ {
+ dd_close(dd);
+ error_msg("crash '%s' can't be accessed by user with uid %ld", dump_dir_name, caller_uid);
+ return 1;
+ }
}
- db_row_free(row);
- }
- catch (CABRTException& e)
- {
- error_msg("%s", e.what());
}
- return EIO; /* generic failure code */
-}
-void DeleteDebugDump_by_dir(const char *dump_dir)
-{
- try
- {
- CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase);
- database->Connect();
- database->DeleteRows_by_dir(dump_dir);
- database->DisConnect();
+ dd_delete(dd);
- delete_debug_dump_dir(dump_dir);
- }
- catch (CABRTException& e)
- {
- error_msg("%s", e.what());
- }
+ return 0; /* success */
}
void GetPluginsInfo(map_map_string_t &map_of_plugin_info)
diff --git a/src/daemon/MiddleWare.h b/src/daemon/MiddleWare.h
index 90386c03..808d7be4 100644
--- a/src/daemon/MiddleWare.h
+++ b/src/daemon/MiddleWare.h
@@ -30,13 +30,12 @@
*/
typedef enum {
MW_OK, /**< No error.*/
- MW_OCCURRED, /**< A not-yet-reported dup.*/
- MW_REPORTED, /**< A reported dup.*/
+ MW_OCCURRED, /**< No error, but thus dump is a dup.*/
MW_ERROR, /**< Common error.*/
+ MW_NOENT_ERROR,
+ MW_PERM_ERROR,
MW_CORRUPTED, /**< Debugdump directory is corrupted.*/
MW_GPG_ERROR, /**< Package is not signed properly.*/
- MW_IN_DB, /**< Debugdump directory is already saved in a database.*/
- MW_IN_DB_ERROR, /**< Error while working with a database.*/
MW_PLUGIN_ERROR, /**< plugin wasn't found or error within plugin*/
} mw_result_t;
@@ -56,7 +55,7 @@ typedef enum {
* @param pCrashData A filled crash report.
* @return It return results of operation. See mw_result_t.
*/
-mw_result_t CreateCrashReport(const char *crash_id,
+mw_result_t CreateCrashReport(const char *dump_dir_name,
long caller_uid,
int force,
map_crash_data_t& pCrashData);
@@ -91,23 +90,20 @@ report_status_t Report(const map_crash_data_t& crash_data,
const map_map_string_t& settings,
long caller_uid);
/**
- * Adds package name and description to debugdump dir.
- * Saves debugdump into database.
- * Detects whether it's a duplicate crash.
+ * Detects whether it's a duplicate crash dump.
* Fills crash info.
* Note that if it's a dup, loads _first crash_ info, not this one's.
- * @param pDebugDumpDir A debugdump directory.
+ * @param dump_dir_name A debugdump directory.
* @param pCrashData A crash info.
* @return It return results of operation. See mw_result_t.
*/
-mw_result_t SaveDebugDump(const char *pDebugDumpDir,
+mw_result_t LoadDebugDump(const char *dump_dir_name,
map_crash_data_t& pCrashData);
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);
+int CreateReportThread(const char* dump_dir_name, long caller_uid, int force, const char* pSender);
+void CreateReport(const char* dump_dir_name, long caller_uid, int force, map_crash_data_t&);
+int DeleteDebugDump(const char *dump_dir_name, long caller_uid);
void GetPluginsInfo(map_map_string_t &map_of_plugin_info);
void GetPluginSettings(const char *plugin_name, map_plugin_settings_t &plugin_settings);
diff --git a/src/daemon/PluginManager.cpp b/src/daemon/PluginManager.cpp
index 0f7b983d..665a4625 100644
--- a/src/daemon/PluginManager.cpp
+++ b/src/daemon/PluginManager.cpp
@@ -247,20 +247,6 @@ CAction* CPluginManager::GetAction(const char *pName, bool silent)
return (CAction*)plugin;
}
-CDatabase* CPluginManager::GetDatabase(const char *pName)
-{
- CPlugin *plugin = LoadPlugin(pName);
- if (!plugin)
- {
- throw CABRTException(EXCEP_PLUGIN, "Plugin '%s' is not registered", pName);
- }
- if (m_mapLoadedModules[pName]->GetType() != DATABASE)
- {
- throw CABRTException(EXCEP_PLUGIN, "Plugin '%s' is not a database plugin", pName);
- }
- return (CDatabase*)plugin;
-}
-
plugin_type_t CPluginManager::GetPluginType(const char *pName)
{
CPlugin *plugin = LoadPlugin(pName);
diff --git a/src/daemon/PluginManager.h b/src/daemon/PluginManager.h
index 1d2b4bd3..c5036fbf 100644
--- a/src/daemon/PluginManager.h
+++ b/src/daemon/PluginManager.h
@@ -25,7 +25,6 @@
#include "abrt_types.h"
#include "plugin.h"
#include "analyzer.h"
-#include "database.h"
#include "action.h"
class CLoadedModule; /* opaque */
@@ -90,12 +89,6 @@ class CPluginManager
*/
CAction* GetAction(const char *pName, bool silent = false);
/**
- * A method, which returns instance of particular database plugin.
- * @param pName A plugin name.
- * @return A database plugin.
- */
- CDatabase* GetDatabase(const char *pName);
- /**
* A method, which returns type of particular plugin.
* @param pName A plugin name.
* @return A plugin type.
diff --git a/src/daemon/Settings.cpp b/src/daemon/Settings.cpp
index d0c44c20..5b9972ba 100644
--- a/src/daemon/Settings.cpp
+++ b/src/daemon/Settings.cpp
@@ -50,7 +50,6 @@ bool g_settings_bOpenGPGCheck = false;
GList *g_settings_setOpenGPGPublicKeys = NULL;
GList *g_settings_setBlackListedPkgs = NULL;
GList *g_settings_setBlackListedPaths = NULL;
-char *g_settings_sDatabase = NULL;
char *g_settings_sWatchCrashdumpArchiveDir = NULL;
unsigned int g_settings_nMaxCrashReportsSize = 1000;
bool g_settings_bProcessUnpackaged = false;
@@ -200,17 +199,6 @@ static int ParseCommon()
{
g_settings_setBlackListedPaths = parse_list(it->second.c_str());
}
- it = s_mapSectionCommon.find("Database");
- if (it != end)
- {
- if (it->second.empty())
- error_msg_and_die(_("Database plugin not specified. Please check abrtd settings."));
-
- g_settings_sDatabase = xstrdup(it->second.c_str());
- }
- else
- error_msg_and_die(_("Database plugin not specified. Please check abrtd settings."));
-
it = s_mapSectionCommon.find("WatchCrashdumpArchiveDir");
if (it != end)
{
@@ -466,9 +454,6 @@ void settings_free()
g_list_free(g_settings_setBlackListedPaths);
g_settings_setBlackListedPaths = NULL;
- free(g_settings_sDatabase);
- g_settings_sDatabase = NULL;
-
free(g_settings_sWatchCrashdumpArchiveDir);
g_settings_sWatchCrashdumpArchiveDir = NULL;
}
diff --git a/src/daemon/Settings.h b/src/daemon/Settings.h
index 7fe64fcf..71824c74 100644
--- a/src/daemon/Settings.h
+++ b/src/daemon/Settings.h
@@ -31,7 +31,6 @@ extern GList *g_settings_setBlackListedPaths;
extern unsigned int g_settings_nMaxCrashReportsSize;
extern bool g_settings_bOpenGPGCheck;
extern bool g_settings_bProcessUnpackaged;
-extern char *g_settings_sDatabase;
extern char *g_settings_sWatchCrashdumpArchiveDir;
extern map_cron_t g_settings_mapCron;
diff --git a/src/daemon/abrt-server.c b/src/daemon/abrt-server.c
index 67978561..db07fe94 100644
--- a/src/daemon/abrt-server.c
+++ b/src/daemon/abrt-server.c
@@ -134,7 +134,7 @@ static void create_debug_dump()
/* Store id of the user whose application crashed. */
char uid_str[sizeof(long) * 3 + 2];
sprintf(uid_str, "%lu", (long)client_uid);
- dd_save_text(dd, CD_UID, uid_str);
+ dd_save_text(dd, FILENAME_UID, uid_str);
dd_close(dd);
diff --git a/src/daemon/abrt.conf b/src/daemon/abrt.conf
index cd9a782e..07ea51a0 100644
--- a/src/daemon/abrt.conf
+++ b/src/daemon/abrt.conf
@@ -18,10 +18,6 @@ ProcessUnpackaged = no
#
BlackListedPaths = /usr/share/doc/*, */example*
-# Which database plugin to use
-#
-Database = SQLite3
-
# Enable this if you want abrtd to auto-unpack crashdump tarballs which appear
# in this directory (for example, uploaded via ftp, scp etc).
# Note: you must ensure that whatever directory you specify here exists
diff --git a/src/daemon/abrt.conf.5 b/src/daemon/abrt.conf.5
index 968b5ea8..3f9d8c39 100644
--- a/src/daemon/abrt.conf.5
+++ b/src/daemon/abrt.conf.5
@@ -35,11 +35,6 @@ will ignore packages in this list and will not handle their crashes.
will ignore crashes in executables whose absolute path matches
one of specified patterns.
.TP
-.B Database = \fIdatabasePlugin\fP
-This specifies which database plugin
-.I abrt
-uses to store metadata about the crash.
-.TP
.B MaxCrashReportsSize = \fInumber\fP
The maximum disk space (specified in megabytes) that
.I abrt
diff --git a/src/daemon/abrt_event.conf b/src/daemon/abrt_event.conf
index 6c1ac191..938a1de6 100644
--- a/src/daemon/abrt_event.conf
+++ b/src/daemon/abrt_event.conf
@@ -30,6 +30,8 @@ EVENT=post-create abrt-action-save-package-data
EVENT=post-create analyzer=CCpp abrt-action-analyze-c
EVENT=post-create analyzer=Python abrt-action-analyze-python
EVENT=post-create analyzer=Kerneloops abrt-action-analyze-oops
+# If you want all users (not just root) to be able to see oopses:
+#EVENT=post-create analyzer=Kerneloops echo 1 >inform_all_users
# If you want behavior similar to one provided by kerneloops daemon
# distributed by kerneloops.org - that is, if you want
# oopses to be reported automatically and immediately without
diff --git a/src/gui/CCDump.py b/src/gui/CCDump.py
index a2a69023..380cb996 100644
--- a/src/gui/CCDump.py
+++ b/src/gui/CCDump.py
@@ -35,13 +35,13 @@ FILENAME_RATING = "rating"
FILENAME_HOSTNAME = "hostname"
FILENAME_REMOTE = "remote"
-CD_UID = "uid"
-CD_UUID = "uuid"
-CD_INFORMALL = "InformAll"
+FILENAME_UID = "uid"
+FILENAME_UUID = "uuid"
+FILENAME_INFORMALL = "inform_all_users"
+FILENAME_COUNT = "count"
+FILENAME_MESSAGE = "message"
+
CD_DUMPDIR = "DumpDir"
-CD_COUNT = "Count"
-CD_REPORTED = "Reported"
-CD_MESSAGE = "Message"
CD_EVENTS = "Events"
# FIXME - create method or smth that returns type|editable|content
@@ -52,7 +52,7 @@ REPORT_EVENT_PREFIX = "report_"
class Dump():
"""Class for mapping the debug dump to python object"""
- not_required_fields = ["comment", "Message"]
+ not_required_fields = [FILENAME_COMMENT, FILENAME_MESSAGE]
def __init__(self):
# we set all attrs dynamically, so no need to have it in init
for field in self.not_required_fields:
@@ -79,8 +79,11 @@ class Dump():
def getUID(self):
return self.uid
+ def getDumpDir(self):
+ return self.DumpDir
+
def getCount(self):
- return int(self.Count)
+ return int(self.count)
def getExecutable(self):
try:
@@ -96,14 +99,11 @@ class Dump():
def getPackage(self):
return self.package
- def isReported(self):
- return self.Reported == "1"
-
def getMessage(self):
- if not self.Message:
+ if not self.message:
return "" #[]
- #return self.Message[CD_CONTENT].split('\n')
- return self.Message
+ #return self.message[CD_CONTENT].split('\n')
+ return self.message
def getTime(self, fmt=None):
if self.time:
diff --git a/src/gui/CCDumpList.py b/src/gui/CCDumpList.py
index 3c555d84..ccc87560 100644
--- a/src/gui/CCDumpList.py
+++ b/src/gui/CCDumpList.py
@@ -30,8 +30,7 @@ class DumpList(list):
def getDumpByCrashID(self, crashid):
for dump in self:
- # crashid can be either hash or uid:hash
- if crashid in (dump.getUUID(),dump.getUID()+":"+dump.getUUID()):
+ if crashid == dump.getDumpDir():
return dump
__PFList = None
diff --git a/src/gui/CCMainWindow.py b/src/gui/CCMainWindow.py
index 4ee14768..651c8e54 100644
--- a/src/gui/CCMainWindow.py
+++ b/src/gui/CCMainWindow.py
@@ -184,7 +184,7 @@ class MainWindow():
# so we shouldn't continue..
sys.exit()
for entry in dumplist[::-1]:
- n = self.dumpsListStore.append([["gtk-no","gtk-yes"][entry.isReported()],
+ n = self.dumpsListStore.append([["gtk-no","gtk-yes"][entry.getMessage() != ""],
entry.getExecutable(),
entry.get_hostname(),
entry.getTime("%c"),
@@ -276,7 +276,7 @@ class MainWindow():
#move this to Dump class
hb_reports = self.wTree.get_widget("hb_reports")
lReported = self.wTree.get_widget("l_message")
- if dump.isReported():
+ if dump.getMessage() != "":
hb_reports.show()
report_label_raw = ""
report_label = ""
@@ -296,10 +296,10 @@ class MainWindow():
else:
hb_reports.hide()
- def mark_last_selected_row(self, dump_list_store, path, iter, last_selected_uuid):
+ def mark_last_selected_row(self, dump_list_store, path, iter, last_selected_DumpDir):
# Get dump object from list (in our list it's in last col)
dump = dump_list_store.get_value(iter, dump_list_store.get_n_columns()-1)
- if dump.getUUID() == last_selected_uuid:
+ if dump.getDumpDir() == last_selected_DumpDir:
self.dlist.set_cursor(dump_list_store.get_path(iter)[0])
return True # done, stop iteration
return False
@@ -315,11 +315,11 @@ class MainWindow():
if next_iter:
last_dump = dumpsListStore.get_value(next_iter, dumpsListStore.get_n_columns()-1)
try:
- self.ccdaemon.DeleteDebugDump("%s:%s" % (dump.getUID(), dump.getUUID()))
+ self.ccdaemon.DeleteDebugDump(dump.getDumpDir())
self.hydrate()
if last_dump:
# we deleted the selected line, so we want to select the next one
- dumpsListStore.foreach(self.mark_last_selected_row, last_dump.getUUID())
+ dumpsListStore.foreach(self.mark_last_selected_row, last_dump.getDumpDir())
treeview.emit("cursor-changed")
except Exception, ex:
print ex
@@ -363,8 +363,7 @@ class MainWindow():
self.hydrate()
if last_dump:
# re-select the line that was selected before a new crash happened
- dumpsListStore.foreach(self.mark_last_selected_row, last_dump.getUUID())
-
+ dumpsListStore.foreach(self.mark_last_selected_row, last_dump.getDumpDir())
def on_bReport_clicked(self, button):
dumpsListStore, path = self.dumplist_get_selected()
diff --git a/src/gui/CCReporterDialog.py b/src/gui/CCReporterDialog.py
index 947a2582..b34baf87 100644
--- a/src/gui/CCReporterDialog.py
+++ b/src/gui/CCReporterDialog.py
@@ -543,7 +543,7 @@ class ReporterSelector():
# show the report window with selected report
try:
- self.daemon.start_job("%s:%s" % (report[CD_UID][CD_CONTENT], report[CD_UUID][CD_CONTENT]), force=1)
+ self.daemon.start_job(report[CD_DUMPDIR][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
@@ -564,7 +564,7 @@ class ReporterSelector():
# when getReport is done it emits "analyze-complete" and on_analyze_complete_cb is called
# FIXME: does it make sense to change it to use callback rather then signal emitting?
try:
- self.daemon.start_job("%s:%s" % (self.dump.getUID(), self.dump.getUUID()))
+ self.daemon.start_job(self.dump.getDumpDir())
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
diff --git a/src/gui/CReporterAssistant.py b/src/gui/CReporterAssistant.py
index 5bcd603d..7299b501 100644
--- a/src/gui/CReporterAssistant.py
+++ b/src/gui/CReporterAssistant.py
@@ -1065,7 +1065,7 @@ class ReporterAssistant():
# when getReport is done it emits "analyze-complete" and on_analyze_complete_cb is called
# FIXME: does it make sense to change it to use callback rather then signal emitting?
try:
- self.daemon.start_job("%s:%s" % (self.report.getUID(), self.report.getUUID()), force)
+ self.daemon.start_job(self.report.getDumpDir(), force)
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
diff --git a/src/include/Makefile.am b/src/include/Makefile.am
index 4d2ea810..11f3e461 100644
--- a/src/include/Makefile.am
+++ b/src/include/Makefile.am
@@ -8,7 +8,6 @@ HEADER_FILES = \
dump_dir.h \
observer.h \
plugin.h \
- database.h \
action.h \
analyzer.h \
xfuncs.h
diff --git a/src/include/crash_types.h b/src/include/crash_types.h
index 5c57e09e..28b2eb09 100644
--- a/src/include/crash_types.h
+++ b/src/include/crash_types.h
@@ -37,7 +37,7 @@
// Name of the function where the application crashed.
// Optional.
#define FILENAME_CRASH_FUNCTION "crash_function"
-// filled by CDebugDump::Create() (which also fills CD_UID):
+// filled by CDebugDump::Create() (which also fills FILENAME_UID):
#define FILENAME_ARCHITECTURE "architecture"
#define FILENAME_KERNEL "kernel"
#define FILENAME_TIME "time"
@@ -55,22 +55,16 @@
#define FILENAME_TAINTED "kernel_tainted"
// TODO: TicketUploader also has open-coded "TICKET", "CUSTOMER" files
-// Apart from CD_UID, which is also stored as a file in dump directory,
-// these items only exist in db. (CD_UID is also a file because
-// dump directory is created before its DB entry, and DB has to learn
-// CD_UID from _somewhere_ in order to be able to store it in DB record,
-// right?)
-#define CD_UID "uid"
-// Now uuid also is saved as a file (but is still stored in database too):
-#define CD_UUID "uuid"
-#define CD_INFORMALL "InformAll"
-#define CD_DUMPDIR "DumpDir"
-#define CD_COUNT "Count"
-#define CD_REPORTED "Reported"
-#define CD_MESSAGE "Message"
+#define FILENAME_UID "uid"
+#define FILENAME_UUID "uuid"
+#define FILENAME_INFORMALL "inform_all_users"
+#define FILENAME_COUNT "count"
+#define FILENAME_MESSAGE "message"
+// Not stored as files, added "on the fly":
+#define CD_DUMPDIR "DumpDir"
// "Which events are possible (make sense) on this crash dump?"
// (a string with "\n" terminated event names)
-#define CD_EVENTS "Events"
+#define CD_EVENTS "Events"
// Crash data is a map of 3-element vectors of strings: type, editable, content
diff --git a/src/include/database.h b/src/include/database.h
deleted file mode 100644
index 5eaceed7..00000000
--- a/src/include/database.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- Database.h - header file for database plugin
-
- Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com)
- Copyright (C) 2009 RedHat inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#ifndef DATABASE_H_
-#define DATABASE_H_
-
-#include <glib.h>
-
-/**
- * Table
- * =====
- * UUID | UID| DebugDumpPath | Count | Reported | Time | Message
- *
- * primary key (UUID, UID)
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * A struct contains one database row.
- */
-struct db_row
-{
- char *db_uuid; /**< A local UUID.*/
- char *db_uid; /**< An UID of an user.*/
- char *db_inform_all;
- char *db_dump_dir; /**< A debugdump directory of a crash.*/
- char *db_count; /**< Crash rate.*/
- char *db_reported; /**< Is a row reported?*/
- char *db_message; /**< if a row is reported, then there can be store message abotu that*/
- char *db_time; /**< Time of last occurred crash with same local UUID*/
-};
-
-void db_row_free(struct db_row *row);
-
-void db_list_free(GList *list);
-
-struct db_row *db_rowcpy_from_list(GList* list);
-
-#ifdef __cplusplus
-}
-#endif
-
-#ifdef __cplusplus
-
-#include <string>
-#include <vector>
-
-#include "plugin.h"
-
-/**
- * An abstract class. The class defines a database plugin interface.
- */
-class CDatabase : public CPlugin
-{
- public:
- /**
- * A method, which connects to a database.
- */
- virtual void Connect() = 0;
- /**
- * A method, which disconnects from a database.
- */
- virtual void DisConnect() = 0;
- /**
- * A method, which inserts one row to a database.
- * @param pUUID A local UUID of a crash.
- * @param pUID An UID of an user.
- * @param pDebugDumpPath A debugdump path.
- * @param pTime Time when a crash occurs.
- */
- virtual void Insert_or_Update(const char *crash_id,
- bool inform_all_users,
- const char *pDebugDumpPath,
- const char *pTime) = 0;
- /**
- * A method, which deletes one row in a database.
- * @param pUUID A lodal UUID of a crash.
- * @param pUID An UID of an user.
- */
- 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.
- * @param pUUID A local UUID of a crash.
- * @param pUID An UID of an user.
- * @param pMessage A text explanation of reported problem
- * (where it is stored etc)...
- */
- virtual void SetReported(const char *crash_id,
- const char *pMessage) = 0;
- virtual void SetReportedPerReporter(const char *crash_id,
- const char *reporter,
- const char *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
- * rows, empty vector is returned.
- * @param pUID An UID of an user.
- * @return A vector of matched rows.
- */
- virtual GList *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.
- * @param pUUID A UUID of a crash.
- * @param pUID An UID of an user.
- * @return A matched row.
- */
- virtual struct db_row *GetRow(const char *crash_id) = 0;
- virtual struct db_row *GetRow_by_dir(const char *dir) = 0;
-};
-#endif
-
-#endif
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
index cb42abe7..0561e316 100644
--- a/src/lib/Makefile.am
+++ b/src/lib/Makefile.am
@@ -38,7 +38,6 @@ libABRTUtils_la_SOURCES = \
run_event.c \
abrt_packages.c abrt_packages.h \
hooklib.c hooklib.h \
- database.c \
parse_options.c parse_options.h
libABRTUtils_la_CPPFLAGS = \
-Wall -Werror \
diff --git a/src/lib/database.c b/src/lib/database.c
deleted file mode 100644
index 2b742ebf..00000000
--- a/src/lib/database.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- Copyright (C) 2010 ABRT team
- Copyright (C) 2010 RedHat Inc
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-
-#include "abrtlib.h"
-#include "database.h"
-
-struct db_row *db_rowcpy_from_list(GList* list)
-{
- GList *first = g_list_first(list);
- struct db_row *row = (struct db_row*)xzalloc(sizeof(struct db_row));
- struct db_row *src_row = (struct db_row*)first->data;
- /* All fields are initialized below, copying is not needed
- * memcpy(row, (struct db_row*)first->data, sizeof(struct db_row));
- */
-
- row->db_uuid = xstrdup(src_row->db_uuid);
- row->db_uid = xstrdup(src_row->db_uid);
- row->db_inform_all = xstrdup(src_row->db_inform_all);
- row->db_dump_dir = xstrdup(src_row->db_dump_dir);
- row->db_count = xstrdup(src_row->db_count);
- row->db_reported = xstrdup(src_row->db_reported);
- row->db_message = xstrdup(src_row->db_message);
- row->db_time = xstrdup(src_row->db_time);
-
- return row;
-}
-
-void db_row_free(struct db_row *row)
-{
- if (!row)
- return;
-
- free(row->db_uuid);
- free(row->db_uid);
- free(row->db_inform_all);
- free(row->db_dump_dir);
- free(row->db_count);
- free(row->db_reported);
- free(row->db_message);
- free(row->db_time);
-
- free(row);
-}
-
-void db_list_free(GList *list)
-{
- if (!list)
- return;
-
- for (GList *li = list; li != NULL; li = g_list_next(li))
- {
- struct db_row *row = (struct db_row*)li->data;
- db_row_free(row);
- }
- g_list_free(list);
-}
-
diff --git a/src/lib/dump_dir.c b/src/lib/dump_dir.c
index 19c49ce7..486c7cfe 100644
--- a/src/lib/dump_dir.c
+++ b/src/lib/dump_dir.c
@@ -311,7 +311,7 @@ struct dump_dir *dd_create(const char *dir, uid_t uid)
char long_str[sizeof(long) * 3 + 2];
sprintf(long_str, "%lu", (long)uid);
- dd_save_text(dd, CD_UID, long_str);
+ dd_save_text(dd, FILENAME_UID, long_str);
struct utsname buf;
uname(&buf); /* never fails */
diff --git a/src/lib/make_descr.cpp b/src/lib/make_descr.cpp
index 33f45b9d..90c73667 100644
--- a/src/lib/make_descr.cpp
+++ b/src/lib/make_descr.cpp
@@ -67,12 +67,11 @@ static const char *const blacklisted_items[] = {
FILENAME_DESCRIPTION, /* package description - basically useless */
FILENAME_HOSTNAME ,
FILENAME_DUPHASH ,
- CD_UUID ,
- CD_INFORMALL ,
+ FILENAME_UUID ,
+ FILENAME_INFORMALL,
CD_DUMPDIR ,
- CD_COUNT ,
- CD_REPORTED ,
- CD_MESSAGE ,
+ FILENAME_COUNT ,
+ FILENAME_MESSAGE ,
NULL
};
diff --git a/src/lib/test.cpp b/src/lib/test.cpp
index a548dc21..c8269cd1 100644
--- a/src/lib/test.cpp
+++ b/src/lib/test.cpp
@@ -83,14 +83,14 @@ int main(int argc, char** argv)
std::cout << "Application Crashed! " <<
crashInfo[FILENAME_PACKAGE][CD_CONTENT] << ", " <<
crashInfo[FILENAME_EXECUTABLE][CD_CONTENT] << ", " <<
- crashInfo[CD_COUNT][CD_CONTENT] << ", " << std::endl;
+ crashInfo[FILENAME_COUNT][CD_CONTENT] << ", " << std::endl;
/* Get Report, so user can change data (remove private stuff)
* If we do not want user interaction, just send data immediately
*/
map_crash_data_t crashReport;
middleWare.CreateCrashReport(crashInfo[FILENAME_DUPHASH][CD_CONTENT],
- crashInfo[CD_UID][CD_CONTENT],
+ crashInfo[FILENAME_UID][CD_CONTENT],
crashReport);
/* Report crash */
middleWare.Report(crashReport);
diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am
index 8a8a6f30..c60c06fe 100644
--- a/src/plugins/Makefile.am
+++ b/src/plugins/Makefile.am
@@ -7,8 +7,7 @@ libexec_SCRIPTS = \
pluginslib_LTLIBRARIES = \
libCCpp.la \
- libKerneloopsScanner.la \
- libSQLite3.la
+ libKerneloopsScanner.la
dist_pluginslib_DATA = \
Logger.glade \
@@ -27,8 +26,7 @@ dist_pluginsconf_DATA = \
Kerneloops.conf \
Bugzilla.conf \
RHTSupport.conf \
- Upload.conf \
- SQLite3.conf
+ Upload.conf
man_MANS = \
abrt-Bugzilla.7 \
@@ -37,7 +35,6 @@ man_MANS = \
abrt-Logger.7 \
abrt-Mailx.7 \
abrt-Upload.7 \
- abrt-SQLite3.7 \
abrt-plugins.7
EXTRA_DIST = $(man_MANS) abrt-action-install-debuginfo
@@ -47,7 +44,6 @@ $(DESTDIR)/$(DEBUG_INFO_DIR):
install-data-hook: $(DESTDIR)/$(DEBUG_INFO_DIR)
sed 's: = /var/: = $(localstatedir)/:g' -i \
- $(DESTDIR)$(sysconfdir)/abrt/plugins/SQLite3.conf \
$(DESTDIR)$(sysconfdir)/abrt/plugins/Logger.conf
# CCpp
@@ -66,12 +62,6 @@ libKerneloopsScanner_la_SOURCES = KerneloopsScanner.cpp KerneloopsScanner.h Kern
libKerneloopsScanner_la_LDFLAGS = -avoid-version $(GLIB_LIBS)
libKerneloopsScanner_la_CPPFLAGS = -I$(INC_PATH) -I$(UTILS_PATH) -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" $(GLIB_CFLAGS)
-# SQLite3
-libSQLite3_la_SOURCES = SQLite3.cpp SQLite3.h
-libSQLite3_la_LDFLAGS = -avoid-version
-libSQLite3_la_LIBADD = $(SQLITE3_LIBS) $(GLIB_LIBS)
-libSQLite3_la_CPPFLAGS = -I$(INC_PATH) -I$(UTILS_PATH) $(SQLITE3_CFLAGS) -DLOCALSTATEDIR='"$(localstatedir)"' $(GLIB_CFLAGS)
-
libexec_PROGRAMS = \
abrt-action-analyze-c \
abrt-action-analyze-python \
diff --git a/src/plugins/SQLite3.conf b/src/plugins/SQLite3.conf
deleted file mode 100644
index a7617a90..00000000
--- a/src/plugins/SQLite3.conf
+++ /dev/null
@@ -1,4 +0,0 @@
-# Configuration file for database plugin SQLite3
-
-# DB path
-DBPath = /var/spool/abrt/abrt-db
diff --git a/src/plugins/SQLite3.cpp b/src/plugins/SQLite3.cpp
deleted file mode 100644
index 2ed3f9fd..00000000
--- a/src/plugins/SQLite3.cpp
+++ /dev/null
@@ -1,742 +0,0 @@
-/*
- SQLite3.cpp
-
- Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com)
- Copyright (C) 2009 RedHat inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#include <sqlite3.h>
-#include "abrtlib.h"
-#include "SQLite3.h"
-
-using namespace std;
-
-#define ABRT_TABLE_VERSION 4
-#define ABRT_TABLE_VERSION_STR "4"
-#define ABRT_TABLE "abrt_v"ABRT_TABLE_VERSION_STR
-#define ABRT_REPRESULT_TABLE "abrt_v"ABRT_TABLE_VERSION_STR"_reportresult"
-#define SQLITE3_MASTER_TABLE "sqlite_master"
-
-#define COL_UID "UID"
-#define COL_UUID "UUID"
-#define COL_INFORMALL "InformAll"
-#define COL_DEBUG_DUMP_PATH "DebugDumpPath"
-#define COL_COUNT "Count"
-#define COL_REPORTED "Reported"
-#define COL_TIME "Time"
-#define COL_MESSAGE "Message"
-
-#define COL_REPORTER "Reporter"
-
-#define NUM_COL 8
-
-/* Is this string safe wrt SQL injection?
- * PHP's mysql_real_escape_string() treats \, ', ", \x00, \n, \r, and \x1a as special.
- * We are a bit more paranoid and disallow any control chars.
- */
-static bool is_string_safe(const char *str)
-{
-// Apparently SQLite allows unescaped newlines. More surprisingly,
-// it does not unescape escaped ones - I see lines ending with \ when I do it.
-// I wonder whether this is a bug in SQLite, and whether using unescaped
-// newlines is a danger with other SQL servers.
-// For now, I disabled newline escaping, and also allowed double quote.
- const char *p = str;
- while (*p)
- {
- unsigned char c = *p;
-// if (c == '\\' && p[1] != '\0')
-// {
-// p += 2;
-// continue;
-// }
- if ((c < ' ' && c != '\n')
- || strchr("\\\'", c) //was: "\\\"\'"
- ) {
- error_msg("Probable SQL injection: '%s'", str);
- return false;
- }
- p++;
- }
- return true;
-}
-
-#ifdef UNUSED_FOR_NOW
-/* Escape \n */
-static string sql_escape(const char *str)
-{
- const char *s = str;
- unsigned len = 0;
- do
- {
- if (*s == '\n')
- len++;
- len++;
- } while (*s++);
-
- char buf[len];
- s = str;
- char *d = buf;
- do
- {
- if (*s == '\n')
- *d++ = '\\';
- *d++ = *s;
- } while (*s++);
-
- return buf;
-}
-#endif
-
-/* Note:
- * expects "SELECT * FROM ...", not "SELECT <only some fields> FROM ..."
- */
-static GList *vget_table(sqlite3 *db, const char *fmt, va_list p)
-{
- char *sql = xvasprintf(fmt, p);
-
- char **table;
- int ncol, nrow;
- char *err = NULL;
- int ret = sqlite3_get_table(db, sql, &table, &nrow, &ncol, &err);
- if (ret != SQLITE_OK)
- {
- error_msg("Error in SQL:'%s' error: %s", sql, err);
- free(sql);
- sqlite3_free(err);
- return (GList*)ERR_PTR;
- }
- VERB2 log("%s: %d rows returned by SQL:%s", __func__, nrow, sql);
- free(sql);
-
- if (nrow > 0 && ncol < NUM_COL)
- error_msg_and_die("Unexpected number of columns: %d", ncol);
-
- GList *rows = NULL;
- int ii;
- for (ii = 0; ii < nrow; ii++)
- {
- int jj;
- struct db_row *row = (struct db_row*)xzalloc(sizeof(struct db_row));
- for (jj = 0; jj < ncol; jj++)
- {
- char *val = table[jj + (ncol*ii) + ncol];
- switch (jj)
- {
- case 0: row->db_uuid = xstrdup(val); break;
- case 1: row->db_uid = xstrdup(val); break;
- case 2: row->db_inform_all = xstrdup(val); break;
- case 3: row->db_dump_dir = xstrdup(val); break;
- case 4: row->db_count = xstrdup(val); break;
- case 5: row->db_reported = xstrdup(val); break;
- case 6: row->db_time = xstrdup(val); break;
- case 7: row->db_message = xstrdup(val); break;
- }
- }
-
- VERB3 log("%s: row->db_uuid = '%s'", __func__, row->db_uuid);
- VERB3 log("%s: row->db_uid = '%s'", __func__, row->db_uid);
- VERB3 log("%s: row->db_inform_all = '%s'", __func__, row->db_inform_all);
- VERB3 log("%s: row->db_dump_dir = '%s'", __func__, row->db_dump_dir);
- VERB3 log("%s: row->db_count = '%s'", __func__, row->db_count);
- VERB3 log("%s: row->db_reported = '%s'", __func__, row->db_reported);
- VERB3 log("%s: row->db_time = '%s'", __func__, row->db_time);
- VERB3 log("%s: row->db_message = '%s'", __func__, row->db_message);
- rows = g_list_append(rows, row);
-
- }
- sqlite3_free_table(table);
-
- return rows;
-}
-
-static GList *get_table_or_die(sqlite3 *db, const char *fmt, ...)
-{
- va_list p;
- va_start(p, fmt);
- GList *table = vget_table(db, fmt, p);
- va_end(p);
-
- if (table == (GList*)ERR_PTR)
- xfunc_die();
-
- return table;
-}
-
-static int vexecute_sql(sqlite3 *db, const char *fmt, va_list p)
-{
- char *sql = xvasprintf(fmt, p);
-
- char *err = NULL;
- int ret = sqlite3_exec(db, sql, /*callback:*/ NULL, /*callback param:*/ NULL, &err);
- if (ret != SQLITE_OK)
- {
- error_msg("Error in SQL:'%s' error: %s", sql, err);
- free(sql);
- sqlite3_free(err);
- return -1;
- }
- int affected = sqlite3_changes(db);
- VERB2 log("%d rows affected by SQL:%s", affected, sql);
- free(sql);
-
- return affected;
-}
-
-static int execute_sql_or_die(sqlite3 *db, const char *fmt, ...)
-{
- va_list p;
- va_start(p, fmt);
- int ret = vexecute_sql(db, fmt, p);
- va_end(p);
-
- if (ret < 0)
- xfunc_die();
-
- return ret;
-}
-
-static bool exists_uuid_uid(sqlite3 *db, const char *UUID, const char *UID)
-{
- GList *table = get_table_or_die(db, "SELECT * FROM "ABRT_TABLE
- " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
- UUID, UID
- );
-
- if (!table)
- return false;
-
- db_list_free(table);
-
- return true;
-}
-
-static void update_from_old_ver(sqlite3 *db, int old_version)
-{
- static const char *const update_sql_commands[] = {
- // v0 -> v1
- NULL,
- // v1 -> v2
- "BEGIN TRANSACTION;"
- "CREATE TABLE abrt_v2 ("
- COL_UUID" VARCHAR NOT NULL,"
- COL_UID" VARCHAR NOT NULL,"
- 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_v2 "
- "SELECT "COL_UUID","
- COL_UID","
- COL_DEBUG_DUMP_PATH","
- COL_COUNT","
- COL_REPORTED","
- COL_TIME","
- COL_MESSAGE
- " FROM abrt;"
- "DROP TABLE abrt;"
- "COMMIT;",
- // v2 -> v3
- "BEGIN TRANSACTION;"
- "CREATE TABLE abrt_v3 ("
- COL_UUID" VARCHAR NOT NULL,"
- COL_UID" VARCHAR NOT NULL,"
- 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_v3 "
- "SELECT "COL_UUID","
- COL_UID","
- COL_DEBUG_DUMP_PATH","
- COL_COUNT","
- COL_REPORTED","
- COL_TIME","
- COL_MESSAGE
- " FROM abrt_v2;"
- "DROP TABLE abrt_v2;"
- "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_INFORMALL" 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","
- "0," /* COL_INFORMALL */
- COL_DEBUG_DUMP_PATH","
- COL_COUNT","
- COL_REPORTED","
- COL_TIME","
- COL_MESSAGE
- " FROM abrt_v3;"
- "DROP TABLE abrt_v3;"
- "UPDATE abrt_v4"
- " SET "COL_UID"='0', "COL_INFORMALL"=1"
- " WHERE "COL_UID"='-1';"
- "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;",
- };
-
- while (old_version < ABRT_TABLE_VERSION)
- {
- execute_sql_or_die(db, update_sql_commands[old_version]);
- old_version++;
- }
-}
-
-static bool check_table(sqlite3 *db)
-{
- const char *command = "SELECT NAME FROM "SQLITE3_MASTER_TABLE" "
- "WHERE TYPE='table' AND NAME like 'abrt_v%';";
- char **table;
- int ncol, nrow;
- char *err;
- int ret = sqlite3_get_table(db, command, &table, &nrow, &ncol, &err);
- if (ret != SQLITE_OK)
- {
- /* Should never happen */
- error_msg_and_die("SQLite3 database is corrupted");
- }
- if (!nrow)
- {
- sqlite3_free_table(table);
- return false;
- }
-
- // table format:
- // 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)
- {
- // It can be "abrt_vNN_something", thus using atoi(), not xatoi()
- int tableVersion = atoi(underscore + 2);
- sqlite3_free_table(table);
- if (tableVersion < ABRT_TABLE_VERSION)
- {
- update_from_old_ver(db, tableVersion);
- }
- return true;
- }
- sqlite3_free_table(table);
- update_from_old_ver(db, 1);
- return true;
-}
-
-
-CSQLite3::CSQLite3() :
- m_sDBPath(LOCALSTATEDIR "/spool/abrt/abrt-db"),
- m_pDB(NULL)
-{}
-
-CSQLite3::~CSQLite3()
-{
- /* Paranoia. In C++, destructor will abort() if it was called while unwinding
- * the stack and it throws an exception.
- */
- try
- {
- DisConnect();
- m_sDBPath.clear();
- }
- catch (...)
- {
- error_msg_and_die("Internal error");
- }
-}
-
-void CSQLite3::DisConnect()
-{
- if (m_pDB)
- {
- sqlite3_close(m_pDB);
- m_pDB = NULL;
- }
-}
-
-void CSQLite3::Connect()
-{
- int ret = sqlite3_open_v2(m_sDBPath.c_str(),
- &m_pDB,
- SQLITE_OPEN_READWRITE,
- NULL
- );
-
- if (ret != SQLITE_OK)
- {
- if (ret != SQLITE_CANTOPEN)
- {
- error_msg_and_die("Can't open database '%s': %s", m_sDBPath.c_str(), sqlite3_errmsg(m_pDB));
- }
-
- ret = sqlite3_open_v2(m_sDBPath.c_str(),
- &m_pDB,
- SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
- NULL
- );
- if (ret != SQLITE_OK)
- {
- error_msg_and_die("Can't create database '%s': %s", m_sDBPath.c_str(), sqlite3_errmsg(m_pDB));
- }
- }
-
- if (!check_table(m_pDB))
- {
- execute_sql_or_die(m_pDB,
- "CREATE TABLE "ABRT_TABLE" ("
- COL_UUID" VARCHAR NOT NULL,"
- COL_UID" VARCHAR NOT NULL,"
- COL_INFORMALL" 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"));"
- );
- execute_sql_or_die(m_pDB,
- "CREATE TABLE "ABRT_REPRESULT_TABLE" ("
- 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"));"
- );
- }
-}
-
-void CSQLite3::Insert_or_Update(const char *crash_id,
- bool inform_all_users,
- const char *pDebugDumpPath,
- const char *pTime)
-{
- const char *UUID = strchr(crash_id, ':');
- if (!UUID
- || !is_string_safe(crash_id)
- || !is_string_safe(pDebugDumpPath)
- || !is_string_safe(pTime)
- ) {
- 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';
-
- if (!exists_uuid_uid(m_pDB, UUID, UID))
- {
- execute_sql_or_die(m_pDB,
- "INSERT INTO "ABRT_TABLE" ("
- COL_UUID","
- COL_UID","
- COL_INFORMALL","
- COL_DEBUG_DUMP_PATH","
- COL_TIME
- ")"
- " VALUES ('%s','%s',%u,'%s','%s');",
- UUID, UID, (unsigned)inform_all_users, pDebugDumpPath, pTime
- );
- }
- else
- {
- execute_sql_or_die(m_pDB,
- "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 *crash_id)
-{
- const char *UUID = strchr(crash_id, ':');
- if (!UUID
- || !is_string_safe(crash_id)
- ) {
- 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';
-
- if (exists_uuid_uid(m_pDB, UUID, UID))
- {
- execute_sql_or_die(m_pDB, "DELETE FROM "ABRT_TABLE
- " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
- UUID, UID
- );
- execute_sql_or_die(m_pDB, "DELETE FROM "ABRT_REPRESULT_TABLE
- " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
- UUID, UID
- );
- }
- else
- {
- error_msg("crash_id %s is not found in DB", crash_id);
- }
-}
-
-void CSQLite3::DeleteRows_by_dir(const char *dump_dir)
-{
- if (!is_string_safe(dump_dir))
- {
- return;
- }
-
- /* Get UID:UUID pair(s) to delete */
- GList *table = get_table_or_die(m_pDB, "SELECT * FROM "ABRT_TABLE
- " WHERE "COL_DEBUG_DUMP_PATH"='%s';",
- dump_dir
- );
-
- if (!table)
- {
- return;
- }
-
- struct db_row *row = NULL;
- /* Delete from both tables */
- for (GList *li = table; li != NULL; li = g_list_next(li))
- {
- row = (struct db_row*)li->data;
- execute_sql_or_die(m_pDB,
- "DELETE FROM "ABRT_REPRESULT_TABLE
- " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
- row->db_uuid, row->db_uid
- );
- }
- execute_sql_or_die(m_pDB,
- "DELETE FROM "ABRT_TABLE
- " WHERE "COL_DEBUG_DUMP_PATH"='%s'",
- dump_dir
- );
-}
-
-void CSQLite3::SetReported(const char *crash_id, const char *pMessage)
-{
- const char *UUID = strchr(crash_id, ':');
- if (!UUID
- || !is_string_safe(crash_id)
- || !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';
-
- if (exists_uuid_uid(m_pDB, UUID, UID))
- {
- execute_sql_or_die(m_pDB,
- "UPDATE "ABRT_TABLE
- " SET "COL_REPORTED"=1"
- " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
- UUID, UID
- );
- execute_sql_or_die(m_pDB,
- "UPDATE "ABRT_TABLE
- " SET "COL_MESSAGE"='%s'"
- " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
- pMessage, UUID, UID
- );
- }
- else
- {
- error_msg("crash_id %s is not found in DB", crash_id);
- }
-}
-
-void CSQLite3::SetReportedPerReporter(const char *crash_id,
- const char *reporter,
- const char *pMessage)
-{
- 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_or_die(m_pDB,
- "UPDATE "ABRT_REPRESULT_TABLE
- " SET "COL_MESSAGE"='%s'"
- " WHERE "COL_UUID"='%s' AND "COL_UID"='%s' AND "COL_REPORTER"='%s'",
- pMessage,
- UUID, UID, reporter
- );
- if (!affected_rows)
- {
- execute_sql_or_die(m_pDB,
- "INSERT INTO "ABRT_REPRESULT_TABLE
- " ("COL_UUID","COL_UID","COL_REPORTER","COL_MESSAGE")"
- " VALUES ('%s','%s','%s','%s');",
- UUID, UID, reporter, pMessage
- );
- }
-}
-
-GList *CSQLite3::GetUIDData(long caller_uid)
-{
- GList *table = NULL;
-
- if (caller_uid == 0)
- {
- table = get_table_or_die(m_pDB, "SELECT * FROM "ABRT_TABLE";");
- }
- else
- {
- table = get_table_or_die(m_pDB, "SELECT * FROM "ABRT_TABLE
- " WHERE "COL_UID"='%ld' OR "COL_INFORMALL"=1;",
- caller_uid
- );
- }
- return table;
-}
-
-struct db_row *CSQLite3::GetRow(const char *crash_id)
-{
- const char *UUID = strchr(crash_id, ':');
- if (!UUID
- || !is_string_safe(crash_id)
- ) {
- return NULL;
- }
-
- /* 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';
-
- GList *table = get_table_or_die(m_pDB, "SELECT * FROM "ABRT_TABLE
- " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
- UUID, UID
- );
-
- if (!table)
- {
- return NULL;
- }
-
- GList *first = g_list_first(table);
- struct db_row *row = db_rowcpy_from_list(first);
-
- db_list_free(table);
-
- return row;
-}
-
-struct db_row *CSQLite3::GetRow_by_dir(const char *dir)
-{
- if (!is_string_safe(dir))
- return NULL;
-
- GList *table = get_table_or_die(m_pDB, "SELECT * FROM "ABRT_TABLE
- " WHERE "COL_DEBUG_DUMP_PATH"='%s';",
- dir
- );
-
- if (!table)
- return NULL;
-
- GList *first = g_list_first(table);
- struct db_row *row = db_rowcpy_from_list(first);
-
- db_list_free(table);
-
- return row;
-}
-
-void CSQLite3::SetSettings(const map_plugin_settings_t& pSettings)
-{
- m_pSettings = pSettings;
-
- map_plugin_settings_t::const_iterator end = pSettings.end();
- map_plugin_settings_t::const_iterator it;
- it = pSettings.find("DBPath");
- if (it != end)
- {
- m_sDBPath = it->second;
- }
-}
-
-//ok to delete?
-//const map_plugin_settings_t& CSQLite3::GetSettings()
-//{
-// m_pSettings["DBPath"] = m_sDBPath;
-//
-// return m_pSettings;
-//}
-
-PLUGIN_INFO(DATABASE,
- CSQLite3,
- "SQLite3",
- "0.0.2",
- _("Keeps SQLite3 database about all crashes"),
- "zprikryl@redhat.com,jmoskovc@redhat.com",
- "https://fedorahosted.org/abrt/wiki",
- "");
diff --git a/src/plugins/SQLite3.h b/src/plugins/SQLite3.h
deleted file mode 100644
index 5750d92e..00000000
--- a/src/plugins/SQLite3.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- SQLite3.h
-
- Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com)
- Copyright (C) 2009 RedHat inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#ifndef SQLITE3_H_
-#define SQLITE3_H_
-
-#include "plugin.h"
-#include "database.h"
-
-class CSQLite3 : public CDatabase
-{
- private:
- std::string m_sDBPath;
- sqlite3* m_pDB;
-
- public:
- CSQLite3();
- ~CSQLite3();
-
- virtual void Connect();
- virtual void DisConnect();
-
- virtual void Insert_or_Update(const char *crash_id,
- bool inform_all_users,
- const char *pDebugDumpPath,
- const char *pTime);
- virtual void DeleteRow(const char *crash_id);
- virtual void DeleteRows_by_dir(const char *dump_dir);
- virtual void SetReported(const char *crash_id, const char *pMessage);
- virtual void SetReportedPerReporter(const char *crash_id,
- const char *reporter,
- const char *pMessage);
- virtual GList *GetUIDData(long caller_uid);
- virtual struct db_row *GetRow(const char *crash_id);
- virtual struct db_row *GetRow_by_dir(const char *dir);
-
- virtual void SetSettings(const map_plugin_settings_t& pSettings);
-};
-
-
-#endif
diff --git a/src/plugins/abrt-SQLite3.7 b/src/plugins/abrt-SQLite3.7
deleted file mode 100644
index c2b39d86..00000000
--- a/src/plugins/abrt-SQLite3.7
+++ /dev/null
@@ -1,36 +0,0 @@
-.TH abrt "7" "1 Jun 2009" ""
-.SH NAME
-SQLite3 database plugin for abrt(8)
-.SH DESCRIPTION
-.P
-.I abrt
-is a daemon that watches for application crashes. When a crash occurs,
-it collects the crash data and takes action according to
-its configuration. This manual page describes the \fISQLite3\fP database plugin
-for \fIabrt\fP.
-.P
-This is a database plugin: \fIabrt\fP needs a database in which to store
-its metadata. You can choose one by specifying "Database" in
-the \fIabrt.conf\fP configuration file. Currently SQLite3 is
-the only choice supported.
-.SH INVOCATION
-The plugin is invoked in the \fIabrt.conf\fP configuration file, like
-this:
-.br
-[common]
-.br
-Database = SQLite3
-.SH CONFIGURATION
-The \fISQLite3.conf\fP configuration file contains one entry:
-.SS DBPath
-The path to the database.
-.SH EXAMPLES
-see \fBINVOCATION\fP
-.SH "SEE ALSO"
-.IR abrt (8),
-.IR abrt.conf (5),
-.IR abrt-plugins (7)
-.SH AUTHOR
-Written by Zdenek Prikryl <zprikryl@redhat.com> and Jiri
-Moskovcak <jmoskovc@redhat.com>. Manual
-page by Daniel Novotny <dnovotny@redhat.com>.
diff --git a/src/plugins/abrt-action-analyze-c.c b/src/plugins/abrt-action-analyze-c.c
index 60e08372..6d8ac1b4 100644
--- a/src/plugins/abrt-action-analyze-c.c
+++ b/src/plugins/abrt-action-analyze-c.c
@@ -50,7 +50,7 @@ static char *run_unstrip_n(const char *dump_dir_name, unsigned timeout_sec)
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
return NULL;
- char *uid_str = dd_load_text(dd, CD_UID);
+ char *uid_str = dd_load_text(dd, FILENAME_UID);
dd_close(dd);
unsigned uid = xatoi_u(uid_str);
free(uid_str);
@@ -231,7 +231,7 @@ int main(int argc, char **argv)
create_hash(hash_str, string_to_hash);
/*free(hash_str);*/
- dd_save_text(dd, CD_UUID, hash_str);
+ dd_save_text(dd, FILENAME_UUID, hash_str);
dd_close(dd);
return 0;
diff --git a/src/plugins/abrt-action-analyze-oops.c b/src/plugins/abrt-action-analyze-oops.c
index 354ec6fd..24538641 100644
--- a/src/plugins/abrt-action-analyze-oops.c
+++ b/src/plugins/abrt-action-analyze-oops.c
@@ -167,7 +167,7 @@ int main(int argc, char **argv)
hash &= 0x7FFFFFFF;
char hash_str[sizeof(int)*3 + 2];
sprintf(hash_str, "%u", hash);
- dd_save_text(dd, CD_UUID, hash_str);
+ dd_save_text(dd, FILENAME_UUID, hash_str);
dd_save_text(dd, FILENAME_DUPHASH, hash_str);
dd_close(dd);
diff --git a/src/plugins/abrt-action-analyze-python.c b/src/plugins/abrt-action-analyze-python.c
index bb5722ec..9fe563db 100644
--- a/src/plugins/abrt-action-analyze-python.c
+++ b/src/plugins/abrt-action-analyze-python.c
@@ -111,7 +111,7 @@ int main(int argc, char **argv)
}
*d = '\0';
- dd_save_text(dd, CD_UUID, hash_str);
+ dd_save_text(dd, FILENAME_UUID, hash_str);
dd_save_text(dd, FILENAME_DUPHASH, hash_str);
dd_close(dd);
diff --git a/src/plugins/abrt-action-generate-backtrace.c b/src/plugins/abrt-action-generate-backtrace.c
index 8f1642d7..64ce4082 100644
--- a/src/plugins/abrt-action-generate-backtrace.c
+++ b/src/plugins/abrt-action-generate-backtrace.c
@@ -130,7 +130,7 @@ static char* exec_vp(char **args, uid_t uid, int redirect_stderr, int *status)
static char *get_backtrace(struct dump_dir *dd)
{
- char *uid_str = dd_load_text(dd, CD_UID);
+ char *uid_str = dd_load_text(dd, FILENAME_UID);
uid_t uid = xatoi_u(uid_str);
free(uid_str);
char *executable = dd_load_text(dd, FILENAME_EXECUTABLE);
diff --git a/src/plugins/abrt-action-install-debuginfo b/src/plugins/abrt-action-install-debuginfo
index c1b8fdb9..59bccba9 100755
--- a/src/plugins/abrt-action-install-debuginfo
+++ b/src/plugins/abrt-action-install-debuginfo
@@ -25,7 +25,8 @@
#
# Exitcodes:
# 0 - all debuginfos are installed
-# 1 - not all debuginfos are installed
+# 0 - not all debuginfos are installed
+# (was 1, but this scares event processing)
# 2+ - serious problem
#
# Algorithm:
@@ -413,6 +414,8 @@ done
cleanup_and_report_missing
-test x"$missing_build_ids" != x"" && exit 1
+# Was exiting with 1, but this stops event processing.
+test x"$missing_build_ids" != x"" && exit 0
+
echo "All needed debuginfos are present"
exit 0
diff --git a/src/plugins/abrt-action-mailx.cpp b/src/plugins/abrt-action-mailx.cpp
index 9f33e8c1..d11a0d5f 100644
--- a/src/plugins/abrt-action-mailx.cpp
+++ b/src/plugins/abrt-action-mailx.cpp
@@ -115,7 +115,7 @@ static void create_and_send_email(
args = append_str_to_vector(args, arg_size, email_to);
log(_("Sending an email..."));
- const char *uid_str = get_crash_data_item_content_or_NULL(pCrashData, CD_UID);
+ const char *uid_str = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_UID);
exec_and_feed_input(xatoi_u(uid_str), dsc, args);
free(dsc);
diff --git a/src/plugins/abrt-action-rhtsupport.cpp b/src/plugins/abrt-action-rhtsupport.cpp
index d1854541..aecd30c8 100644
--- a/src/plugins/abrt-action-rhtsupport.cpp
+++ b/src/plugins/abrt-action-rhtsupport.cpp
@@ -130,11 +130,10 @@ static void report_to_rhtsupport(
map_crash_data_t::const_iterator it = pCrashData.begin();
for (; it != pCrashData.end(); it++)
{
- if (it->first == CD_COUNT) continue;
+ if (it->first == FILENAME_COUNT) continue;
if (it->first == CD_DUMPDIR) continue;
- if (it->first == CD_INFORMALL) continue;
- if (it->first == CD_REPORTED) continue;
- if (it->first == CD_MESSAGE) continue; // plugin's status message (if we already reported it yesterday)
+ if (it->first == FILENAME_INFORMALL) continue;
+ if (it->first == FILENAME_MESSAGE) continue; // plugin's status message (if we already reported it yesterday)
if (it->first == FILENAME_DESCRIPTION) continue; // package description
const char *content = it->second[CD_CONTENT].c_str();
diff --git a/src/plugins/abrt-action-upload.cpp b/src/plugins/abrt-action-upload.cpp
index d2acd0f7..0bf54bea 100644
--- a/src/plugins/abrt-action-upload.cpp
+++ b/src/plugins/abrt-action-upload.cpp
@@ -166,11 +166,10 @@ static int create_and_upload_archive(
char *short_name, *full_name;
while (dd_get_next_file(dd, &short_name, &full_name))
{
- if (strcmp(short_name, CD_COUNT) == 0) goto next;
+ if (strcmp(short_name, FILENAME_COUNT) == 0) goto next;
if (strcmp(short_name, CD_DUMPDIR) == 0) goto next;
- if (strcmp(short_name, CD_INFORMALL) == 0) goto next;
- if (strcmp(short_name, CD_REPORTED) == 0) goto next;
- if (strcmp(short_name, CD_MESSAGE) == 0) goto next; // plugin's status message (if we already reported it yesterday)
+ if (strcmp(short_name, FILENAME_INFORMALL) == 0) goto next;
+ if (strcmp(short_name, FILENAME_MESSAGE) == 0) goto next; // plugin's status message (if we already reported it yesterday)
if (strcmp(short_name, FILENAME_DESCRIPTION) == 0) goto next; // package description
// dd_get_next_file guarantees this:
//struct stat stbuf;
diff --git a/src/plugins/abrt-plugins.7 b/src/plugins/abrt-plugins.7
index 6c07e65a..28de8f02 100644
--- a/src/plugins/abrt-plugins.7
+++ b/src/plugins/abrt-plugins.7
@@ -31,12 +31,11 @@ stored in the \fI/etc/abrt/plugins\fP directory.
.IR abrt (8),
.IR abrt.conf (5),
.IR abrt-Bugzilla (7),
-.IR abrt-FileTransfer (7),
+.IR abrt-Upload (7),
.IR abrt-KerneloopsReporter (7),
.IR abrt-KerneloopsScanner (7),
.IR abrt-Logger (7),
.IR abrt-Mailx (7),
-.IR abrt-SQLite3 (7)
.SH AUTHOR
\fIabrt\fP written by Zdeněk Přikryl <zprikryl@redhat.com> and
Jiří Moskovčák <jmoskovc@redhat.com>. Manual page written by Daniel