summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2010-03-05 17:03:32 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2010-03-05 17:03:32 +0100
commitdbbc2df18f5441d7b298c5d32e4199aa56f08ce0 (patch)
treeadf4bce0a6a02d29da010f91c8264c4dd38ca465
parent9e7602b032c2187887c8164fa23c37d6daf28ac0 (diff)
downloadabrt-dbbc2df18f5441d7b298c5d32e4199aa56f08ce0.tar.gz
abrt-dbbc2df18f5441d7b298c5d32e4199aa56f08ce0.tar.xz
abrt-dbbc2df18f5441d7b298c5d32e4199aa56f08ce0.zip
add ProcessUnpackaged option to abrt.conf
Based on patch by Pekka Pietikainen <pp@ee.oulu.fi> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--inc/CrashTypes.h25
-rw-r--r--lib/Plugins/Bugzilla.cpp9
-rw-r--r--lib/Plugins/KerneloopsScanner.cpp2
-rw-r--r--lib/Utils/DebugDump.cpp34
-rw-r--r--lib/Utils/DebugDump.h2
-rw-r--r--src/Applet/Applet.cpp12
-rw-r--r--src/Daemon/CommLayerServer.h2
-rw-r--r--src/Daemon/CommLayerServerDBus.cpp10
-rw-r--r--src/Daemon/CommLayerServerDBus.h2
-rw-r--r--src/Daemon/MiddleWare.cpp34
-rw-r--r--src/Daemon/Settings.cpp7
-rw-r--r--src/Daemon/Settings.h1
-rw-r--r--src/Daemon/abrt.conf2
-rw-r--r--src/Gui/CCDBusBackend.py1
14 files changed, 90 insertions, 53 deletions
diff --git a/inc/CrashTypes.h b/inc/CrashTypes.h
index 77a2ff27..07155170 100644
--- a/inc/CrashTypes.h
+++ b/inc/CrashTypes.h
@@ -21,25 +21,28 @@
#include "abrt_types.h"
-// Filenames in dump directory
+// Filenames in dump directory:
+// filled by a hook:
+#define FILENAME_ANALYZER "analyzer"
+#define FILENAME_EXECUTABLE "executable"
+#define FILENAME_CMDLINE "cmdline"
+#define FILENAME_REASON "reason"
+#define FILENAME_COREDUMP "coredump"
+#define FILENAME_BACKTRACE "backtrace"
+#define FILENAME_MEMORYMAP "memorymap"
+#define FILENAME_KERNELOOPS "kerneloops"
+// filled by CDebugDump::Create() (which also fills CD_UID):
#define FILENAME_ARCHITECTURE "architecture"
#define FILENAME_KERNEL "kernel"
#define FILENAME_TIME "time"
+#define FILENAME_RELEASE "release" /* from /etc/redhat-release */
+// filled by <what?>
#define FILENAME_PACKAGE "package"
#define FILENAME_COMPONENT "component"
-#define FILENAME_DESCRIPTION "description"
-#define FILENAME_ANALYZER "analyzer"
-#define FILENAME_RELEASE "release"
-#define FILENAME_EXECUTABLE "executable"
-#define FILENAME_REASON "reason"
+#define FILENAME_DESCRIPTION "description" /* package descr (not crash descr) */
#define FILENAME_COMMENT "comment"
#define FILENAME_REPRODUCE "reproduce"
#define FILENAME_RATING "rating"
-#define FILENAME_CMDLINE "cmdline"
-#define FILENAME_COREDUMP "coredump"
-#define FILENAME_BACKTRACE "backtrace"
-#define FILENAME_MEMORYMAP "memorymap"
-#define FILENAME_KERNELOOPS "kerneloops"
// 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
diff --git a/lib/Plugins/Bugzilla.cpp b/lib/Plugins/Bugzilla.cpp
index 6ec1f426..b3066d7c 100644
--- a/lib/Plugins/Bugzilla.cpp
+++ b/lib/Plugins/Bugzilla.cpp
@@ -391,8 +391,8 @@ xmlrpc_int32 ctx::new_bug(const map_crash_data_t& pCrashData)
if (env.fault_occurred)
return -1;
- log("New bug id: %i", bug_id);
- update_client(_("New bug id: %i"), bug_id);
+ log("New bug id: %i", (int)bug_id);
+ update_client(_("New bug id: %i"), (int)bug_id);
return bug_id;
}
@@ -585,6 +585,11 @@ std::string CReporterBugzilla::Report(const map_crash_data_t& pCrashData,
{
update_client(_("Creating new bug..."));
bug_id = bz_server.new_bug(pCrashData);
+ if (bug_id < 0)
+ {
+ throw_if_xml_fault_occurred(&bz_server.env);
+ throw CABRTException(EXCEP_PLUGIN, _("Bugzilla entry creation failed"));
+ }
int ret = bz_server.add_attachments(to_string(bug_id).c_str(), pCrashData);
if (ret == -1)
{
diff --git a/lib/Plugins/KerneloopsScanner.cpp b/lib/Plugins/KerneloopsScanner.cpp
index f30906ac..b0336b0b 100644
--- a/lib/Plugins/KerneloopsScanner.cpp
+++ b/lib/Plugins/KerneloopsScanner.cpp
@@ -121,9 +121,7 @@ void save_oops_to_debug_dump(const vector_string_t& oopsList)
dd.SaveText(FILENAME_ANALYZER, "Kerneloops");
dd.SaveText(FILENAME_EXECUTABLE, "kernel");
dd.SaveText(FILENAME_KERNEL, first_line);
- dd.SaveText(FILENAME_PACKAGE, "not_applicable");
dd.SaveText(FILENAME_CMDLINE, "not_applicable");
- dd.SaveText(FILENAME_COMPONENT, "kernel");
dd.SaveText(FILENAME_KERNELOOPS, second_line);
}
catch (CABRTException& e)
diff --git a/lib/Utils/DebugDump.cpp b/lib/Utils/DebugDump.cpp
index 97c387c5..2d8da1ac 100644
--- a/lib/Utils/DebugDump.cpp
+++ b/lib/Utils/DebugDump.cpp
@@ -320,7 +320,23 @@ void CDebugDump::Create(const char *pDir, uid_t uid)
}
SaveText(CD_UID, to_string(uid).c_str());
- SaveKernelArchitectureRelease();
+
+ {
+ struct utsname buf;
+ if (uname(&buf) != 0)
+ {
+ perror_msg_and_die("uname");
+ }
+ SaveText(FILENAME_KERNEL, buf.release);
+ SaveText(FILENAME_ARCHITECTURE, buf.machine);
+ std::string release;
+ LoadTextFile("/etc/redhat-release", release);
+ const char *release_ptr = release.c_str();
+ unsigned len_1st_str = strchrnul(release_ptr, '\n') - release_ptr;
+ release.erase(len_1st_str); /* usually simply removes trailing '\n' */
+ SaveText(FILENAME_RELEASE, release.c_str());
+ }
+
time_t t = time(NULL);
SaveText(FILENAME_TIME, to_string(t).c_str());
}
@@ -374,22 +390,6 @@ void CDebugDump::Close()
m_bOpened = false;
}
-void CDebugDump::SaveKernelArchitectureRelease()
-{
- struct utsname buf;
- if (uname(&buf) == 0)
- {
- SaveText(FILENAME_KERNEL, buf.release);
- SaveText(FILENAME_ARCHITECTURE, buf.machine);
- }
- std::string release;
- LoadTextFile("/etc/redhat-release", release);
- const char *release_ptr = release.c_str();
- unsigned len_1st_str = strchrnul(release_ptr, '\n') - release_ptr;
- release.erase(len_1st_str); /* usually simply removes trailing '\n' */
- SaveText(FILENAME_RELEASE, release.c_str());
-}
-
static void LoadTextFile(const char *pPath, std::string& pData)
{
FILE *fp = fopen(pPath, "r");
diff --git a/lib/Utils/DebugDump.h b/lib/Utils/DebugDump.h
index a5de743f..f8487a65 100644
--- a/lib/Utils/DebugDump.h
+++ b/lib/Utils/DebugDump.h
@@ -34,8 +34,6 @@ class CDebugDump
uid_t m_uid;
gid_t m_gid;
- void SaveKernelArchitectureRelease();
-
void Lock();
void UnLock();
diff --git a/src/Applet/Applet.cpp b/src/Applet/Applet.cpp
index 9398e4b6..8972dcb5 100644
--- a/src/Applet/Applet.cpp
+++ b/src/Applet/Applet.cpp
@@ -45,8 +45,8 @@ static void Crash(DBusMessage* signal)
int r;
DBusMessageIter in_iter;
dbus_message_iter_init(signal, &in_iter);
- const char* progname;
- r = load_val(&in_iter, progname);
+ const char* package_name;
+ r = load_val(&in_iter, package_name);
/* Optional 2nd param: uid */
const char* uid_str = NULL;
if (r == ABRT_DBUS_MORE_FIELDS)
@@ -75,10 +75,12 @@ static void Crash(DBusMessage* signal)
}
const char* message = _("A crash in package %s has been detected");
- //applet->AddEvent(uid, progname);
- applet->SetIconTooltip(message, progname);
+ if (package_name[0] == '\0')
+ message = _("A crash has been detected");
+ //applet->AddEvent(uid, package_name);
+ applet->SetIconTooltip(message, package_name);
applet->ShowIcon();
- applet->CrashNotify(message, progname);
+ applet->CrashNotify(message, package_name);
}
static void QuotaExceed(DBusMessage* signal)
diff --git a/src/Daemon/CommLayerServer.h b/src/Daemon/CommLayerServer.h
index 6e593d29..2daaf93a 100644
--- a/src/Daemon/CommLayerServer.h
+++ b/src/Daemon/CommLayerServer.h
@@ -30,7 +30,7 @@ class CCommLayerServer {
virtual ~CCommLayerServer();
/* just stubs to be called when not implemented in specific comm layer */
- virtual void Crash(const char *progname, const char *uid_str) {}
+ virtual void Crash(const char *package_name, const char *uid_str) {}
virtual void JobDone(const char* peer) = 0;
virtual void QuotaExceed(const char* str) {}
diff --git a/src/Daemon/CommLayerServerDBus.cpp b/src/Daemon/CommLayerServerDBus.cpp
index 6dcb8e45..517a9e2a 100644
--- a/src/Daemon/CommLayerServerDBus.cpp
+++ b/src/Daemon/CommLayerServerDBus.cpp
@@ -64,23 +64,23 @@ static void send_flush_and_unref(DBusMessage* msg)
}
/* Notify the clients (UI) about a new crash */
-void CCommLayerServerDBus::Crash(const char *progname, const char *uid_str)
+void CCommLayerServerDBus::Crash(const char *package_name, const char *uid_str)
{
DBusMessage* msg = new_signal_msg("Crash");
if (uid_str)
{
dbus_message_append_args(msg,
- DBUS_TYPE_STRING, &progname,
+ DBUS_TYPE_STRING, &package_name,
DBUS_TYPE_STRING, &uid_str,
DBUS_TYPE_INVALID);
- VERB2 log("Sending signal Crash('%s','%s')", progname, uid_str);
+ VERB2 log("Sending signal Crash('%s','%s')", package_name, uid_str);
}
else
{
dbus_message_append_args(msg,
- DBUS_TYPE_STRING, &progname,
+ DBUS_TYPE_STRING, &package_name,
DBUS_TYPE_INVALID);
- VERB2 log("Sending signal Crash('%s')", progname);
+ VERB2 log("Sending signal Crash('%s')", package_name);
}
send_flush_and_unref(msg);
}
diff --git a/src/Daemon/CommLayerServerDBus.h b/src/Daemon/CommLayerServerDBus.h
index 91ec0919..c62d9a9f 100644
--- a/src/Daemon/CommLayerServerDBus.h
+++ b/src/Daemon/CommLayerServerDBus.h
@@ -29,7 +29,7 @@ class CCommLayerServerDBus
virtual ~CCommLayerServerDBus();
/* DBus signal senders */
- virtual void Crash(const char *progname, const char *uid_str);
+ virtual void Crash(const char *package_name, const char *uid_str);
virtual void JobDone(const char* peer);
virtual void QuotaExceed(const char* str);
diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp
index 1ed13e86..770ed927 100644
--- a/src/Daemon/MiddleWare.cpp
+++ b/src/Daemon/MiddleWare.cpp
@@ -654,19 +654,41 @@ static mw_result_t SavePackageDescriptionToDebugDump(
{
std::string package;
std::string packageName;
+ std::string component;
std::string scriptName; /* only if "interpreter /path/to/script" */
if (strcmp(pExecutable, "kernel") == 0)
{
- packageName = package = "kernel";
+ component = packageName = package = "kernel";
}
else
{
char *rpm_pkg = GetPackage(pExecutable);
if (rpm_pkg == NULL)
{
- log("Executable '%s' doesn't belong to any package", pExecutable);
- return MW_PACKAGE_ERROR;
+ if (g_settings_bProcessUnpackaged)
+ {
+ VERB2 log("Crash in unpackaged executable '%s', proceeding without packaging information", pExecutable);
+ try
+ {
+ CDebugDump dd;
+ dd.Open(pDebugDumpDir);
+ dd.SaveText(FILENAME_PACKAGE, "");
+ dd.SaveText(FILENAME_COMPONENT, "");
+ dd.SaveText(FILENAME_DESCRIPTION, "Crashed executable does not belong to any installed package");
+ return MW_OK;
+ }
+ catch (CABRTException& e)
+ {
+ error_msg("%s", e.what());
+ return MW_ERROR;
+ }
+ }
+ else
+ {
+ log("Executable '%s' doesn't belong to any package", pExecutable);
+ return MW_PACKAGE_ERROR;
+ }
}
/* Check well-known interpreter names */
@@ -738,19 +760,17 @@ static mw_result_t SavePackageDescriptionToDebugDump(
}
*/
}
+ component = GetComponent(pExecutable);
}
std::string description = GetDescription(packageName.c_str());
- std::string component = GetComponent(pExecutable);
try
{
CDebugDump dd;
dd.Open(pDebugDumpDir);
dd.SaveText(FILENAME_PACKAGE, package.c_str());
dd.SaveText(FILENAME_DESCRIPTION, description.c_str());
- /* For oopses, pExecutable == "kernel" gives "" here. Don't write it */
- if (component.size() != 0)
- dd.SaveText(FILENAME_COMPONENT, component.c_str());
+ dd.SaveText(FILENAME_COMPONENT, component.c_str());
}
catch (CABRTException& e)
{
diff --git a/src/Daemon/Settings.cpp b/src/Daemon/Settings.cpp
index 5644d370..b8bdc9c6 100644
--- a/src/Daemon/Settings.cpp
+++ b/src/Daemon/Settings.cpp
@@ -56,6 +56,8 @@ set_string_t g_settings_setOpenGPGPublicKeys;
set_string_t g_settings_mapBlackList;
std::string g_settings_sDatabase;
unsigned int g_settings_nMaxCrashReportsSize = 1000;
+bool g_settings_bProcessUnpackaged = false;
+
/* one line: "ActionsAndReporters = aa_first,bb_first(bb_second),cc_first" */
vector_pair_string_string_t g_settings_vectorActionsAndReporters;
/* [ AnalyzerActionsAndReporters ] */
@@ -188,6 +190,11 @@ static void ParseCommon()
{
g_settings_vectorActionsAndReporters = ParseListWithArgs(it->second.c_str());
}
+ it = s_mapSectionCommon.find("ProcessUnpackaged");
+ if (it != end)
+ {
+ g_settings_bProcessUnpackaged = string_to_bool(it->second.c_str());
+ }
}
static void ParseCron()
diff --git a/src/Daemon/Settings.h b/src/Daemon/Settings.h
index cd3179d2..fda1b0d8 100644
--- a/src/Daemon/Settings.h
+++ b/src/Daemon/Settings.h
@@ -29,6 +29,7 @@ extern set_string_t g_settings_setOpenGPGPublicKeys;
extern set_string_t g_settings_mapBlackList;
extern unsigned int g_settings_nMaxCrashReportsSize;
extern bool g_settings_bOpenGPGCheck;
+extern bool g_settings_bProcessUnpackaged;
extern std::string g_settings_sDatabase;
extern map_cron_t g_settings_mapCron;
extern vector_pair_string_string_t g_settings_vectorActionsAndReporters;
diff --git a/src/Daemon/abrt.conf b/src/Daemon/abrt.conf
index 32ba2111..4dc47fb2 100644
--- a/src/Daemon/abrt.conf
+++ b/src/Daemon/abrt.conf
@@ -6,6 +6,8 @@
OpenGPGCheck = yes
# Blacklisted packages
BlackList = nspluginwrapper, valgrind, strace, avant-window-navigator
+# Process crashes in executables which do not belong to any package?
+ProcessUnpackaged = no
# Which database plugin to use
Database = SQLite3
# Max size for crash storage [MiB]
diff --git a/src/Gui/CCDBusBackend.py b/src/Gui/CCDBusBackend.py
index 6c2bb2e4..414879f2 100644
--- a/src/Gui/CCDBusBackend.py
+++ b/src/Gui/CCDBusBackend.py
@@ -170,6 +170,7 @@ class DBusManager(gobject.GObject):
if dump:
self.emit("analyze-complete", dump)
else:
+ # FIXME: BUG: BarWindow remains. (how2reproduce: delete "component" in a dump dir and try to report it)
self.emit("abrt-error", _("Daemon didn't return valid report info\nDebuginfo is missing?"))
def report_done(self, result):