diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2010-03-05 17:03:32 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-03-05 17:03:32 +0100 |
commit | dbbc2df18f5441d7b298c5d32e4199aa56f08ce0 (patch) | |
tree | adf4bce0a6a02d29da010f91c8264c4dd38ca465 | |
parent | 9e7602b032c2187887c8164fa23c37d6daf28ac0 (diff) | |
download | abrt-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.h | 25 | ||||
-rw-r--r-- | lib/Plugins/Bugzilla.cpp | 9 | ||||
-rw-r--r-- | lib/Plugins/KerneloopsScanner.cpp | 2 | ||||
-rw-r--r-- | lib/Utils/DebugDump.cpp | 34 | ||||
-rw-r--r-- | lib/Utils/DebugDump.h | 2 | ||||
-rw-r--r-- | src/Applet/Applet.cpp | 12 | ||||
-rw-r--r-- | src/Daemon/CommLayerServer.h | 2 | ||||
-rw-r--r-- | src/Daemon/CommLayerServerDBus.cpp | 10 | ||||
-rw-r--r-- | src/Daemon/CommLayerServerDBus.h | 2 | ||||
-rw-r--r-- | src/Daemon/MiddleWare.cpp | 34 | ||||
-rw-r--r-- | src/Daemon/Settings.cpp | 7 | ||||
-rw-r--r-- | src/Daemon/Settings.h | 1 | ||||
-rw-r--r-- | src/Daemon/abrt.conf | 2 | ||||
-rw-r--r-- | src/Gui/CCDBusBackend.py | 1 |
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): |