diff options
author | Karel Klic <kklic@redhat.com> | 2010-02-15 10:13:34 +0100 |
---|---|---|
committer | Karel Klic <kklic@redhat.com> | 2010-02-15 10:13:34 +0100 |
commit | f49b4e72dc22d004ada91292fcd7179956de81c4 (patch) | |
tree | 92edd09227bd41e738e004c0e45444d39452c012 | |
parent | e245149118bff4a364fb6fbb0651b1f09e0ce0bc (diff) | |
parent | f97428655a81cea935fd0a8cc93af83e712df299 (diff) | |
download | abrt-f49b4e72dc22d004ada91292fcd7179956de81c4.tar.gz abrt-f49b4e72dc22d004ada91292fcd7179956de81c4.tar.xz abrt-f49b4e72dc22d004ada91292fcd7179956de81c4.zip |
Merge branch 'master' of ssh://git.fedorahosted.org/git/abrt
-rw-r--r-- | Makefile.am | 11 | ||||
-rw-r--r-- | abrt.spec | 33 | ||||
-rw-r--r-- | inc/abrtlib.h | 4 | ||||
-rw-r--r-- | lib/Plugins/Bugzilla.conf | 2 | ||||
-rw-r--r-- | lib/Plugins/Makefile.am | 30 | ||||
-rw-r--r-- | lib/Utils/Plugin.cpp | 69 | ||||
-rw-r--r-- | lib/Utils/Plugin.h | 18 | ||||
-rw-r--r-- | lib/Utils/xfuncs.cpp | 2 | ||||
-rw-r--r-- | po/id.po | 633 | ||||
-rw-r--r-- | src/CLI/report.cpp | 309 | ||||
-rw-r--r-- | src/Daemon/PluginManager.cpp | 54 | ||||
-rw-r--r-- | src/Daemon/PluginManager.h | 9 | ||||
-rw-r--r-- | src/Daemon/Settings.cpp | 12 | ||||
-rwxr-xr-x | src/Daemon/abrt-debuginfo-install | 83 | ||||
-rw-r--r-- | src/Gui/CCMainWindow.py | 3 | ||||
-rw-r--r-- | src/Gui/CC_gui_functions.py | 3 | ||||
-rw-r--r-- | src/Gui/PluginsSettingsDialog.py | 14 | ||||
-rw-r--r-- | src/Gui/report.glade | 3 | ||||
-rw-r--r-- | src/Hooks/abrt-hook-ccpp.cpp | 60 | ||||
-rw-r--r-- | src/Hooks/abrt-hook-python.cpp | 15 | ||||
-rw-r--r-- | src/Hooks/abrt_exception_handler.py.in | 14 |
21 files changed, 1102 insertions, 279 deletions
diff --git a/Makefile.am b/Makefile.am index a934526c..ef369e63 100644 --- a/Makefile.am +++ b/Makefile.am @@ -9,3 +9,14 @@ rpm: dist --define "_builddir `pwd`" \ --define "_srcrpmdir `pwd`" \ -ba abrt.spec + +srpm: dist + rpmbuild --define "_sourcedir `pwd`" \ + --define "_rpmdir `pwd`" \ + --define "_specdir `pwd`" \ + --define "_builddir `pwd`" \ + --define "_srcrpmdir `pwd`" \ + -bs abrt.spec + +scratch-build: srpm + koji build --scratch dist-f12 $(PACKAGE)-$(VERSION)-1.fc12.src.rpm @@ -334,9 +334,9 @@ fi %{_libdir}/%{name}/libKerneloops.so* %{_libdir}/%{name}/libKerneloopsScanner.so* %{_mandir}/man7/%{name}-KerneloopsScanner.7.gz -#%{_libdir}/%{name}/libKerneloopsReporter.so* -#%{_libdir}/%{name}/KerneloopsReporter.GTKBuilder -#%{_mandir}/man7/%{name}-KerneloopsReporter.7.gz +%{_libdir}/%{name}/libKerneloopsReporter.so* +%{_libdir}/%{name}/KerneloopsReporter.GTKBuilder +%{_mandir}/man7/%{name}-KerneloopsReporter.7.gz %files plugin-logger %defattr(-,root,root,-) @@ -408,6 +408,33 @@ fi %defattr(-,root,root,-) %changelog +* Fri Feb 12 2010 Jiri Moskovcak <jmoskovc@redhat.com> 1.0.7-1 +- Load plugin settings also from ~/.abrt/*.conf (kklic@redhat.com) +- fix bz#541088 "abrt should not catch python excp EPIPE" (vda.linux@googlemail.com) +- fix bz#554242 "Cannot tab between input areas in report dialog" (vda.linux@googlemail.com) +- fix bz#563484 "abrt uses unnecessary disk space when getting debug info" (vda.linux@googlemail.com) +- Don't show empty 'Not loaded plugins' section - fix#2 rhbz#560971 (jmoskovc@redhat.com) +- fix big-endian build problem (vda.linux@googlemail.com) +- Fixes, displays package owners (kklic@redhat.com) +- GUI: fixed exception in plugin settings dialog rhbz#560851 (jmoskovc@redhat.com) +- GUI: respect system settings for toolbars rhbz#552161 (jmoskovc@redhat.com) +- python hook: move UUID generation to abrtd; generate REASON, add it to bz title (vda.linux@googlemail.com) +- make "reason" field less verbose; bz reporter: include it in "summary" (vda.linux@googlemail.com) +- added avant-window-navigator to blacklist per maintainer request (jmoskovc@redhat.com) +- CCpp analyzer: fix rhbz#552435 (bt rating misinterpreting # chars) (vda.linux@googlemail.com) +- Ask for login and password if missing from reporter plugin. (kklic@redhat.com) +- abrtd: fix handling of dupes (weren't deleting dup's directory); better logging (vda.linux@googlemail.com) +- abrtd: handle "perl -w /usr/bin/script" too (vda.linux@googlemail.com) +- Component-wise duplicates (kklic@redhat.com) +- abrtd: fix rhbz#560642 - don't die on bad plugin names (vda.linux@googlemail.com) +- Fixed parsing backtrace from rhbz#549293 (kklic@redhat.com) +- GUI: fixed scrolling in reporter dialog rhbz#559687 (jmoskovc@redhat.com) +- fixed button order in plugins windows rhbz#560961 (jmoskovc@redhat.com) +- GUI: fixed windows icons and titles rhbz#537240, rhbz#560964 (jmoskovc@redhat.com) +- Fix to successfully parse a backtrace from rhbz#550642 (kklic@redhat.com) +- cli: fix the problem of not showing oops text in editor (vda.linux@googlemail.com) +- GUI: fix rhbz#560971 "Don't show empty 'Not loaded plugins' section" (vda.linux@googlemail.com) + * Tue Feb 2 2010 Jiri Moskovcak <jmoskovc@redhat.com> 1.0.6-1 - print __glib_assert_msg (rhbz#549735); - SPEC: added some requires to abrt-cli to make it work out-of-the-box (jmoskovc@redhat.com) diff --git a/inc/abrtlib.h b/inc/abrtlib.h index 97aa28b8..7b00fe35 100644 --- a/inc/abrtlib.h +++ b/inc/abrtlib.h @@ -52,6 +52,7 @@ int vdprintf(int d, const char *format, va_list ap); #define NORETURN __attribute__ ((noreturn)) +#undef ARRAY_SIZE #define ARRAY_SIZE(x) ((unsigned)(sizeof(x) / sizeof((x)[0]))) @@ -76,6 +77,7 @@ void log_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))); /* error_msg family will use g_custom_logger. log_msg does not. */ void error_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))); void error_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))); +/* Reports error message with libc's errno error description attached. */ void perror_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))); void perror_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))); void perror_nomsg_and_die(void) NORETURN; @@ -254,7 +256,7 @@ bool string_to_bool(const char *s); /* C++ style stuff */ std::string ssprintf(const char *format, ...); -std::string get_home_dir(int uid); +std::string get_home_dir(uid_t uid); std::string concat_path_file(const char *path, const char *filename); double get_dirsize(const char *pPath); double get_dirsize_find_largest_dir( diff --git a/lib/Plugins/Bugzilla.conf b/lib/Plugins/Bugzilla.conf index 14fc92c1..ff2f8286 100644 --- a/lib/Plugins/Bugzilla.conf +++ b/lib/Plugins/Bugzilla.conf @@ -1,4 +1,4 @@ -Enabled = 1 +Enabled = yes # Bugzilla URL BugzillaURL = https://bugzilla.redhat.com/ # yes means that ssl certificates will not be checked diff --git a/lib/Plugins/Makefile.am b/lib/Plugins/Makefile.am index 4fc0efe5..fe3969f1 100644 --- a/lib/Plugins/Makefile.am +++ b/lib/Plugins/Makefile.am @@ -7,6 +7,7 @@ pluginslib_LTLIBRARIES = \ libLogger.la \ libKerneloopsScanner.la\ libKerneloops.la \ + libKerneloopsReporter.la \ libRunApp.la \ libSOSreport.la \ libBugzilla.la \ @@ -18,8 +19,11 @@ pluginslib_LTLIBRARIES = \ dist_pluginslib_DATA = \ Logger.GTKBuilder \ - Mailx.GTKBuilder Bugzilla.GTKBuilder \ - TicketUploader.GTKBuilder Catcut.GTKBuilder + Mailx.GTKBuilder \ + Bugzilla.GTKBuilder \ + TicketUploader.GTKBuilder \ + Catcut.GTKBuilder \ + KerneloopsReporter.GTKBuilder pluginsconfdir = $(PLUGINS_CONF_DIR) dist_pluginsconf_DATA = \ @@ -35,9 +39,17 @@ dist_pluginsconf_DATA = \ Python.conf \ SOSreport.conf -man_MANS = abrt-FileTransfer.7 abrt-Bugzilla.7 \ - abrt-KerneloopsScanner.7 abrt-Logger.7 abrt-Mailx.7 abrt-plugins.7 \ - abrt-SQLite3.7 abrt-RunApp.7 abrt-TicketUploader.7 +man_MANS = \ + abrt-FileTransfer.7 \ + abrt-Bugzilla.7 \ + abrt-KerneloopsScanner.7 \ + abrt-KerneloopsReporter.7 \ + abrt-Logger.7 abrt-Mailx.7 \ + abrt-plugins.7 \ + abrt-SQLite3.7 \ + abrt-RunApp.7 \ + abrt-TicketUploader.7 + # + abrt-Catcut.7 EXTRA_DIST = $(man_MANS) @@ -78,10 +90,10 @@ libKerneloops_la_LDFLAGS = -avoid-version libKerneloops_la_CPPFLAGS = -I$(srcdir)/../../inc -I$(srcdir)/../Utils # KerneloopsReporter -#libKerneloopsReporter_la_SOURCES = KerneloopsReporter.cpp KerneloopsReporter.h -#libKerneloopsReporter_la_LDFLAGS = -avoid-version -#libKerneloopsReporter_la_LIBADD = $(CURL_LIBS) -#libKerneloopsReporter_la_CPPFLAGS = -I$(srcdir)/../../inc -I$(srcdir)/../Utils $(CURL_CFLAGS) -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" +libKerneloopsReporter_la_SOURCES = KerneloopsReporter.cpp KerneloopsReporter.h +libKerneloopsReporter_la_LDFLAGS = -avoid-version +libKerneloopsReporter_la_LIBADD = $(CURL_LIBS) +libKerneloopsReporter_la_CPPFLAGS = -I$(srcdir)/../../inc -I$(srcdir)/../Utils $(CURL_CFLAGS) -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" # KerneloopsScanner libKerneloopsScanner_la_SOURCES = KerneloopsScanner.cpp KerneloopsScanner.h KerneloopsSysLog.cpp KerneloopsSysLog.h diff --git a/lib/Utils/Plugin.cpp b/lib/Utils/Plugin.cpp index 2865027f..40cd2a02 100644 --- a/lib/Utils/Plugin.cpp +++ b/lib/Utils/Plugin.cpp @@ -17,6 +17,7 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "Plugin.h" +#include "abrtlib.h" CPlugin::CPlugin() {} @@ -33,3 +34,71 @@ const map_plugin_settings_t& CPlugin::GetSettings() { return m_pSettings; } + +bool LoadPluginSettings(const char *pPath, map_plugin_settings_t& pSettings, + bool skipKeysWithoutValue /*= true*/) +{ + FILE *fp = fopen(pPath, "r"); + if (!fp) + return false; + + char line[512]; + while (fgets(line, sizeof(line), fp)) + { + strchrnul(line, '\n')[0] = '\0'; + unsigned ii; + bool is_value = false; + bool valid = false; + bool in_quote = false; + std::string key; + std::string value; + for (ii = 0; line[ii] != '\0'; ii++) + { + if (line[ii] == '"') + { + in_quote = !in_quote; + } + if (isspace(line[ii]) && !in_quote) + { + continue; + } + if (line[ii] == '#' && !in_quote && key == "") + { + break; + } + if (line[ii] == '=' && !in_quote) + { + is_value = true; + valid = true; + continue; + } + if (!is_value) + { + key += line[ii]; + } + else + { + value += line[ii]; + } + } + + /* Skip broken or empty lines. */ + if (!valid) + continue; + + /* Skip lines with empty key. */ + if (key.length() == 0) + continue; + + if (skipKeysWithoutValue && value.length() == 0) + continue; + + /* Skip lines with unclosed quotes. */ + if (in_quote) + continue; + + pSettings[key] = value; + } + fclose(fp); + return true; +} diff --git a/lib/Utils/Plugin.h b/lib/Utils/Plugin.h index c699eb36..edd15615 100644 --- a/lib/Utils/Plugin.h +++ b/lib/Utils/Plugin.h @@ -118,9 +118,25 @@ typedef struct SPluginInfo PLUGINS_MAGIC_NUMBER,\ }; -/* helper finctions */ +/* helper functions */ std::string make_description_bz(const map_crash_data_t& pCrashData); std::string make_description_logger(const map_crash_data_t& pCrashData); std::string make_description_catcut(const map_crash_data_t& pCrashData); +/** + * Loads settings and stores it in second parameter. On success it + * returns true, otherwise returns false. + * + * @param path A path of config file. + * Config file consists of "key=value" lines. + * @param settings A readed plugin's settings. + * @param skipKeysWithoutValue + * If true, lines in format "key=" (without value) are skipped. + * Otherwise empty value "" is inserted into pSettings. + * @return if it success it returns true, otherwise it returns false. + */ +extern bool LoadPluginSettings(const char *pPath, + map_plugin_settings_t& pSettings, + bool skipKeysWithoutValue = true); + #endif diff --git a/lib/Utils/xfuncs.cpp b/lib/Utils/xfuncs.cpp index 16f4cb0e..7301d7f0 100644 --- a/lib/Utils/xfuncs.cpp +++ b/lib/Utils/xfuncs.cpp @@ -252,7 +252,7 @@ void xstat(const char *name, struct stat *stat_buf) perror_msg_and_die("can't stat '%s'", name); } -std::string get_home_dir(int uid) +std::string get_home_dir(uid_t uid) { struct passwd* pw = getpwuid(uid); return pw ? pw->pw_dir : ""; diff --git a/po/id.po b/po/id.po new file mode 100644 index 00000000..61dfb189 --- /dev/null +++ b/po/id.po @@ -0,0 +1,633 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# , 2010. +# Dichi Al Faridi <dichi@alfaridi.info>, 2010. +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: jmoskovc@redhat.com\n" +"POT-Creation-Date: 2010-02-01 11:41+0000\n" +"PO-Revision-Date: 2010-02-10 10:36+0700\n" +"Last-Translator: Dichi Al Faridi <dichi@alfaridi.info>\n" +"Language-Team: Fedora-id\n" +"Language: id\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Virtaal 0.5.1\n" + +#: ../src/Gui/ABRTExceptions.py:6 +#, fuzzy +msgid "Another client is already running, trying to wake it." +msgstr "Client lain sedang berjalan, mencoba untuk membangunkannya." + +#: ../src/Gui/ABRTExceptions.py:13 +msgid "Got unexpected data from daemon (is the database properly updated?)." +msgstr "" +"Mendapatkan data yang tidak diharapkan dari daemon (apakah database " +"terperbaharui dengan benar?)." + +#: ../src/Gui/ABRTPlugin.py:62 +msgid "Not loaded plugins" +msgstr "Tidak mengunggah pengaya." + +#: ../src/Gui/ABRTPlugin.py:63 +msgid "Analyzer plugins" +msgstr "Pengaya penganalis" + +#: ../src/Gui/ABRTPlugin.py:64 +msgid "Action plugins" +msgstr "Pengaya aksi" + +#: ../src/Gui/ABRTPlugin.py:65 +msgid "Reporter plugins" +msgstr "Pengaya laporan" + +#: ../src/Gui/ABRTPlugin.py:66 +msgid "Database plugins" +msgstr "Pengaya database" + +#: ../src/Gui/CCDBusBackend.py:74 ../src/Gui/CCDBusBackend.py:97 +msgid "Can't connect to system dbus" +msgstr "Tidak dapat terhubung dengan sistem dbus" + +#: ../src/Gui/CCDBusBackend.py:120 ../src/Gui/CCDBusBackend.py:123 +msgid "Please check if abrt daemon is running" +msgstr "Harap diperiksa jika abrt daemon sudah berjalan" + +#: ../src/Gui/CCDBusBackend.py:175 +msgid "" +"Daemon didn't return valid report info\n" +"Debuginfo is missing?" +msgstr "" +"Daemon tidak mengembalikan info laporan yang sah\n" +"Debuginfo hilang?" + +#: ../src/Gui/ccgui.glade.h:1 +msgid "(C) 2009 Red Hat, Inc." +msgstr "(C) 2009 Red Hat, Inc." + +#: ../src/Gui/ccgui.glade.h:2 +msgid "About ABRT" +msgstr "Tentang ABRT" + +#: ../src/Gui/ccgui.glade.h:3 ../src/Gui/CCMainWindow.py:8 +#: ../src/Gui/report.glade.h:15 ../src/Gui/abrt.desktop.in.h:1 +msgid "Automatic Bug Reporting Tool" +msgstr "Automatic Bug Reporting Tool" + +#: ../src/Gui/ccgui.glade.h:4 +msgid "Delete" +msgstr "Hapus" + +#: ../src/Gui/ccgui.glade.h:5 +msgid "Details" +msgstr "Rincian" + +#: ../src/Gui/ccgui.glade.h:6 +msgid "Not Reported" +msgstr "Tidak Dilaporkan" + +#: ../src/Gui/ccgui.glade.h:7 +msgid "Please wait.." +msgstr "Harap tunggu.." + +#: ../src/Gui/ccgui.glade.h:8 +msgid "Plugins" +msgstr "Pengaya" + +#: ../src/Gui/ccgui.glade.h:9 +msgid "Report" +msgstr "Laporan" + +#: ../src/Gui/ccgui.glade.h:10 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"You should have received a copy of the GNU General Public License along with " +"this program. If not, see <http://www.gnu.org/licenses/>." +msgstr "" +"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.\n" +"\n" +"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.\n" +"\n" +"You should have received a copy of the GNU General Public License along with " +"this program. If not, see <http://www.gnu.org/licenses/>." + +#: ../src/Gui/ccgui.glade.h:15 +msgid "_Edit" +msgstr "_Sunting" + +#: ../src/Gui/ccgui.glade.h:16 +msgid "_File" +msgstr "_Berkas" + +#: ../src/Gui/ccgui.glade.h:17 +msgid "_Help" +msgstr "_Bantuan" + +#. add pixbuff separatelly +#: ../src/Gui/CCMainWindow.py:74 +msgid "Icon" +msgstr "Ikon" + +#: ../src/Gui/CCMainWindow.py:82 +msgid "Package" +msgstr "Paket" + +#: ../src/Gui/CCMainWindow.py:83 +msgid "Application" +msgstr "Aplikasi" + +#: ../src/Gui/CCMainWindow.py:84 +msgid "Date" +msgstr "Tanggal" + +#: ../src/Gui/CCMainWindow.py:85 +msgid "Crash count" +msgstr "Jumlah crash" + +#: ../src/Gui/CCMainWindow.py:86 +msgid "User" +msgstr "Pengguna" + +#: ../src/Gui/CCMainWindow.py:154 +#, python-format +msgid "" +"Can't show the settings dialog\n" +"%s" +msgstr "" +"Tidak dapat menampilkan dialog setting\n" +"%s" + +#: ../src/Gui/CCMainWindow.py:165 +#, python-format +msgid "" +"Unable to finish current task!\n" +"%s" +msgstr "" +"Tidak dapat mengakhiri tugas saat ini!\n" +"%s" + +#. there is something wrong with the daemon if we cant get the dumplist +#: ../src/Gui/CCMainWindow.py:192 +#, python-format +msgid "" +"Error while loading the dumplist.\n" +"%s" +msgstr "" +"Error ketika memuat dumplist.\n" +"%s" + +#: ../src/Gui/CCMainWindow.py:230 +msgid "This crash has been reported:\n" +msgstr "Crash ini sudah dilaporkan:\n" + +#: ../src/Gui/CCMainWindow.py:231 +msgid "<b>This crash has been reported:</b>\n" +msgstr "<b>Crash ini telah dilaporkan:</b>\n" + +#: ../src/Gui/CCMainWindow.py:250 +msgid "<b>Not reported!</b>" +msgstr "<b>Tidak dilaporkan!</b>" + +#: ../src/Gui/CCMainWindow.py:298 +msgid "" +"Unable to get report!\n" +"Debuginfo is missing?" +msgstr "" +"Tidak dapat memperoleh laporan!\n" +"Debuginfo yang hilang?" + +#: ../src/Gui/CCMainWindow.py:318 +#, python-format +msgid "" +"Reporting failed!\n" +"%s" +msgstr "" +"Pelaporan gagal!\n" +"%s" + +#: ../src/Gui/CCMainWindow.py:337 ../src/Gui/CCMainWindow.py:364 +#, python-format +msgid "Error getting the report: %s" +msgstr "Gagal mendapatkan laporan: %s" + +#. default texts +#: ../src/Gui/CCReporterDialog.py:24 +msgid "Brief description how to reproduce this or what you did..." +msgstr "" +"Deskripsi singkat bagaimana untuk mereproduksi ini atau apa yang Anda " +"lakukan..." + +#: ../src/Gui/CCReporterDialog.py:99 +msgid "You must check backtrace for sensitive data" +msgstr "Anda harus memeriksa backtrace untuk data sensitif" + +#: ../src/Gui/CCReporterDialog.py:110 +#, python-format +msgid "" +"Reporting disabled because the backtrace is unusable.\n" +"Please try to install debuginfo manually using command: <b>debuginfo-install " +"%s</b> \n" +"then use Refresh button to regenerate the backtrace." +msgstr "" +"Pelaporan dinonaktifkan karena backtrace tidak dapat digunakan. \n" +"Silakan mencoba menginstal debuginfo secara manual menggunakan perintah: <b" +">debuginfo-install% s</b> kemudian gunakan tombol Refresh untuk membuat " +"backtrace." + +#: ../src/Gui/CCReporterDialog.py:112 +msgid "The backtrace is unusable, you can't report this!" +msgstr "" +"The backtrace ini tidak dapat digunakan, Anda tidak dapat melaporkan ini!" + +#: ../src/Gui/CCReporterDialog.py:116 +msgid "" +"The backtrace is incomplete, please make sure you provide good steps to " +"reproduce." +msgstr "" +"Backtrace tidak lengkap, pastikan Anda memberikan langkah-langkah yang baik " +"untuk mereproduksi." + +#: ../src/Gui/CCReporterDialog.py:158 +#, python-format +msgid "" +"Can't save plugin settings:\n" +" %s" +msgstr "" +"Tidak dapat menyimpan pengaturan plugin:\n" +"%s" + +#: ../src/Gui/dialogs.glade.h:1 +msgid "Log" +msgstr "Catatan" + +#: ../src/Gui/dialogs.glade.h:2 +msgid "Report done" +msgstr "Laporan selesai" + +#: ../src/Gui/PluginSettingsUI.py:18 +msgid "Can't find PluginDialog widget in UI description!" +msgstr "Tidak dapat menemukan widget PluginDialog di deskripsi UI!" + +#. we shouldn't get here, but just to be safe +#: ../src/Gui/PluginSettingsUI.py:24 +#, python-format +msgid "No UI for plugin %s" +msgstr "Tidak UI untuk plugin %s" + +#: ../src/Gui/PluginSettingsUI.py:55 ../src/Gui/PluginSettingsUI.py:81 +msgid "combo box is not implemented" +msgstr "combo bos tidak diimplementasikan" + +#: ../src/Gui/PluginSettingsUI.py:64 +msgid "Nothing to hydrate!" +msgstr "Tidak ada yang hidrat!" + +#: ../src/Gui/report.glade.h:1 +msgid " " +msgstr "" + +#: ../src/Gui/report.glade.h:2 +msgid "<b>Attachments</b>" +msgstr "" + +#: ../src/Gui/report.glade.h:3 +msgid "<b>Backtrace</b>" +msgstr "<b>Backtrace</b>" + +#: ../src/Gui/report.glade.h:4 +msgid "<b>Comment</b>" +msgstr "<b>Komentar</b>" + +#: ../src/Gui/report.glade.h:5 +msgid "<b>How to reproduce (in a few simple steps)</b>" +msgstr "<b>Bagaimana untuk mereproduksi (dalam beberapa langkah sederhana)</b>" + +#: ../src/Gui/report.glade.h:6 +msgid "<b>Please fix the following problems</b>" +msgstr "<b>Mohon selesai masalah berikut</b>" + +#: ../src/Gui/report.glade.h:7 +msgid "<span fgcolor=\"blue\">Architecture:</span>" +msgstr "<span fgcolor=\"blue\">Arsitektur</span>" + +#: ../src/Gui/report.glade.h:8 +msgid "<span fgcolor=\"blue\">Cmdline:</span>" +msgstr "<span fgcolor=\"blue\">Cmdline:</span>" + +#: ../src/Gui/report.glade.h:9 +msgid "<span fgcolor=\"blue\">Component:</span>" +msgstr "<span fgcolor=\"blue\">Komponen:</span>" + +#: ../src/Gui/report.glade.h:10 +msgid "<span fgcolor=\"blue\">Executable:</span>" +msgstr "<span fgcolor=\"blue\">Executable:</span>" + +#: ../src/Gui/report.glade.h:11 +msgid "<span fgcolor=\"blue\">Kernel:</span>" +msgstr "<span fgcolor=\"blue\">Kernel:</span>" + +#: ../src/Gui/report.glade.h:12 +msgid "<span fgcolor=\"blue\">Package:</span>" +msgstr "<span fgcolor=\"blue\">Paket:</span>" + +#: ../src/Gui/report.glade.h:13 +msgid "<span fgcolor=\"blue\">Reason:</span>" +msgstr "<span fgcolor=\"blue\">Alasan:</span>" + +#: ../src/Gui/report.glade.h:14 +msgid "<span fgcolor=\"blue\">Release:</span>" +msgstr "<span fgcolor=\"blue\">Rilis:</span>" + +#: ../src/Gui/report.glade.h:16 +msgid "I checked backtrace and removed sensitive data (passwords, etc)" +msgstr "Aku memeriksa backtrace dan mengeluarkan data sensitif (password, dll)" + +#: ../src/Gui/report.glade.h:17 +msgid "N/A" +msgstr "T/A" + +#: ../src/Gui/report.glade.h:18 +msgid "Send report" +msgstr "Kirim laporan" + +#: ../src/Gui/report.glade.h:19 +msgid "Show log" +msgstr "Tampilkan log" + +#: ../src/Gui/SettingsDialog.py:33 ../src/Gui/SettingsDialog.py:50 +msgid "<b>Select plugin</b>" +msgstr "<b>Pilih plugin</b>" + +#: ../src/Gui/SettingsDialog.py:36 +msgid "<b>Select database backend</b>" +msgstr "<b>Pilih database backend</b>" + +#: ../src/Gui/SettingsDialog.py:169 +msgid "Remove this job" +msgstr "Hapus pekerjaan ini" + +#: ../src/Gui/SettingsDialog.py:213 +msgid "Remove this action" +msgstr "Hapus tindakan ini" + +#: ../src/Gui/settings.glade.h:1 +msgid "<b>Analyzer plugin</b>" +msgstr "<b>Analyzer plugin</b>" + +#: ../src/Gui/settings.glade.h:2 +msgid "<b>Associated action</b>" +msgstr "<b>Tindakan terkait</b>" + +#: ../src/Gui/settings.glade.h:3 +msgid "<b>Plugin details</b>" +msgstr "<b>Plugin details</b>" + +#: ../src/Gui/settings.glade.h:4 +msgid "<b>Plugin</b>" +msgstr "<b>Plugin</b>" + +#: ../src/Gui/settings.glade.h:5 +msgid "<b>Time (or period)</b>" +msgstr "<b>Waktu (atau periode)</b>" + +#: ../src/Gui/settings.glade.h:6 +msgid "Analyzers, Actions, Reporters" +msgstr "Penganalisis, Tindakan, Pelapor" + +#: ../src/Gui/settings.glade.h:7 +msgid "Author:" +msgstr "Penulis:" + +#: ../src/Gui/settings.glade.h:8 +msgid "Blacklisted packages: " +msgstr "Paket yang di-blacklist:" + +#: ../src/Gui/settings.glade.h:9 +msgid "C_onfigure plugin" +msgstr "" + +#: ../src/Gui/settings.glade.h:10 +msgid "Check package GPG signature" +msgstr "Periksa tanda tangan GPG paket" + +#: ../src/Gui/settings.glade.h:11 +msgid "Common" +msgstr "Umum" + +#: ../src/Gui/settings.glade.h:12 +msgid "Cron" +msgstr "Cron" + +#: ../src/Gui/settings.glade.h:13 +msgid "Database backend: " +msgstr "Database backend:" + +#: ../src/Gui/settings.glade.h:14 +msgid "Description:" +msgstr "Keterangan:" + +#: ../src/Gui/settings.glade.h:15 +msgid "GPG Keys" +msgstr "GPG Keys" + +#: ../src/Gui/settings.glade.h:16 +msgid "GPG keys: " +msgstr "GPG keys:" + +#: ../src/Gui/settings.glade.h:17 +msgid "Global Settings" +msgstr "Pengaturan global" + +#: ../src/Gui/settings.glade.h:18 +msgid "Max coredump storage size(MB):" +msgstr "Maks ukuran penyimpanan coredump(MB):" + +#: ../src/Gui/settings.glade.h:19 +msgid "Name:" +msgstr "Nama:" + +#: ../src/Gui/settings.glade.h:20 +msgid "Settings" +msgstr "Pengaturan" + +#: ../src/Gui/settings.glade.h:21 +msgid "Version:" +msgstr "Versi:" + +#: ../src/Gui/settings.glade.h:22 +msgid "Web Site:" +msgstr "Web Site:" + +#: ../src/Gui/settings.glade.h:23 +msgid "gtk-cancel" +msgstr "gtk-cancel" + +#: ../src/Gui/settings.glade.h:24 +msgid "gtk-ok" +msgstr "gtk-ok" + +#: ../src/Gui/abrt.desktop.in.h:2 +msgid "View and report application crashes" +msgstr "Lihat dan laporkan crash applikasi" + +#: ../src/Applet/Applet.cpp:78 +#, c-format +msgid "A crash in package %s has been detected" +msgstr "Sebuah crash di paket %s telah terdeteksi" + +#: ../src/Applet/Applet.cpp:253 +msgid "ABRT service is not running" +msgstr "Layanan ABRT tidak berjalan" + +#: ../src/Applet/CCApplet.cpp:200 +msgid "Warning" +msgstr "Peringatan" + +#: ../src/Daemon/Daemon.cpp:473 +msgid "" +"Report size exceeded the quota. Please check system's MaxCrashReportsSize " +"value in abrt.conf." +msgstr "" +"Laporan ukuran melebihi kuota. Silahkan cek MaxCrashReportsSize nilai sistem " +"abrt.conf." + +#: ../lib/Plugins/Bugzilla.cpp:124 +msgid "Missing member 'reporter'" +msgstr "" + +#: ../lib/Plugins/Bugzilla.cpp:176 +msgid "Missing member 'cc'" +msgstr "" + +#: ../lib/Plugins/Bugzilla.cpp:262 +#, c-format +msgid "Bug is already reported: %i" +msgstr "" + +#: ../lib/Plugins/Bugzilla.cpp:274 +msgid "Missing member 'bug_id'" +msgstr "" + +#: ../lib/Plugins/Bugzilla.cpp:283 +msgid "Missing member 'bugs'" +msgstr "" + +#: ../lib/Plugins/Bugzilla.cpp:346 +#, c-format +msgid "New bug id: %i" +msgstr "" + +#: ../lib/Plugins/Bugzilla.cpp:440 +msgid "Checking for duplicates..." +msgstr "" + +#: ../lib/Plugins/Bugzilla.cpp:446 +msgid "Empty login and password. Please check Bugzilla.conf" +msgstr "" + +#: ../lib/Plugins/Bugzilla.cpp:449 +msgid "Logging into bugzilla..." +msgstr "" + +#: ../lib/Plugins/Bugzilla.cpp:454 +msgid "Checking CC..." +msgstr "" + +#: ../lib/Plugins/Bugzilla.cpp:465 +msgid "Creating new bug..." +msgstr "Membuat bug baru..." + +#: ../lib/Plugins/Bugzilla.cpp:469 +msgid "Logging out..." +msgstr "Keluar..." + +#: ../lib/Plugins/Kerneloops.cpp:35 +msgid "Getting local universal unique identification" +msgstr "Mendapatkan identifikasi unik universal lokal" + +#: ../lib/Plugins/CCpp.cpp:253 +msgid "Generating backtrace" +msgstr "Membangkitkan backtra" + +#: ../lib/Plugins/CCpp.cpp:375 +msgid "Starting debuginfo installation" +msgstr "Memulai instalasi debuginfo" + +#: ../lib/Plugins/CCpp.cpp:524 +msgid "Getting local universal unique identification..." +msgstr "Mendapatkan identifikasi unik universal lokal" + +#: ../lib/Plugins/CCpp.cpp:543 +msgid "Getting global universal unique identification..." +msgstr "Mendapatkan identifikasi unik universal global" + +#: ../lib/Plugins/CCpp.cpp:721 +msgid "Skipping debuginfo installation" +msgstr "Melewatkan instalasi debuginfo" + +#: ../lib/Plugins/KerneloopsReporter.cpp:100 +msgid "Creating and submitting a report..." +msgstr "Membuat dan menyampaikan laporan..." + +#: ../lib/Plugins/Logger.cpp:76 +#, c-format +msgid "Writing report to '%s'" +msgstr "Menulis laporan untuk '%s'" + +#: ../lib/Plugins/FileTransfer.cpp:54 +msgid "FileTransfer: URL not specified" +msgstr "" + +#: ../lib/Plugins/FileTransfer.cpp:58 +#, c-format +msgid "Sending archive %s to %s" +msgstr "Mengirimkan arsip %s ke %s" + +#: ../lib/Plugins/FileTransfer.cpp:289 +msgid "File Transfer: Creating a report..." +msgstr "Transfer Berkas: Membuat sebuah laporan..." + +#: ../lib/Plugins/FileTransfer.cpp:323 +#, c-format +msgid "Can't create and send an archive: %s" +msgstr "Tidak bisa membuat dan mengirimkan sebuah arsip: %s" + +#: ../lib/Plugins/FileTransfer.cpp:352 +#, c-format +msgid "Can't create and send an archive %s" +msgstr "Tidak bisa membuat dan mengirimkan sebuah arsip %s" + +#: ../lib/Plugins/KerneloopsScanner.cpp:79 +msgid "Creating kernel oops crash reports..." +msgstr "Membuat laporan kernel oops crash" + +#: ../lib/Plugins/Mailx.cpp:137 +msgid "Sending an email..." +msgstr "Mengirimkan sebuah email..." + +#: ../lib/Plugins/SOSreport.cpp:103 +#, c-format +msgid "Running sosreport: %s" +msgstr "Menjalankan sosreport: %s" + +#: ../lib/Plugins/SOSreport.cpp:109 +msgid "Done running sosreport" +msgstr "Selesai menjalankan sosreport" diff --git a/src/CLI/report.cpp b/src/CLI/report.cpp index 7ef33acf..ebade16b 100644 --- a/src/CLI/report.cpp +++ b/src/CLI/report.cpp @@ -21,6 +21,7 @@ #include "abrtlib.h" #include "DebugDump.h" #include "CrashTypes.h" // FILENAME_* defines +#include "Plugin.h" // LoadPluginSettings #if HAVE_CONFIG_H # include <config.h> #endif @@ -300,7 +301,12 @@ static int read_crash_report(map_crash_data_t &report, const char *text) return result; } -/* Runs external editor. */ +/** + * Runs external editor. + * Returns: + * 0 if the launch was successful + * 1 if it failed. The error reason is logged using error_msg() + */ static int launch_editor(const char *path) { const char *editor, *terminal; @@ -330,76 +336,216 @@ static int launch_editor(const char *path) return 0; } -/* Reports the crash with corresponding uuid over DBus. */ -int report(const char *uuid, bool always) +/** + * Returns: + * 0 on success, crash data has been updated + * 2 on failure, unable to create, open, or close temporary file + * 3 on failure, cannot launch text editor + */ +static int run_report_editor(map_crash_data_t &cr) { - // Ask for an initial report. - map_crash_data_t cr = call_CreateReport(uuid); -//TODO: error check? - - if (!always) + /* Open a temporary file and write the crash report to it. */ + char filename[] = "/tmp/abrt-report.XXXXXX"; + int fd = mkstemp(filename); + if (fd == -1) /* errno is set */ { - /* Open a temporary file and write the crash report to it. */ - char filename[] = "/tmp/abrt-report.XXXXXX"; - int fd = mkstemp(filename); - if (fd == -1) - { - error_msg("can't generate temporary file name"); - return 1; - } + perror_msg("can't generate temporary file name"); + return 2; + } + + FILE *fp = fdopen(fd, "w"); + if (!fp) /* errno is set */ + { + perror_msg("can't open '%s' to save the crash report", filename); + return 2; + } + + write_crash_report(cr, fp); + + if (fclose(fp)) /* errno is set */ + { + perror_msg("can't close '%s'", filename); + return 2; + } + + // Start a text editor on the temporary file. + if (launch_editor(filename) != 0) + return 3; /* exit with error */ + + // Read the file back and update the report from the file. + fp = fopen(filename, "r"); + if (!fp) /* errno is set */ + { + perror_msg("can't open '%s' to read the crash report", filename); + return 2; + } + + fseek(fp, 0, SEEK_END); + long size = ftell(fp); + fseek(fp, 0, SEEK_SET); + + char *text = (char*)xmalloc(size + 1); + if (fread(text, 1, size, fp) != size) + { + error_msg("can't read '%s'", filename); + return 2; + } + text[size] = '\0'; + if (fclose(fp) != 0) /* errno is set */ + { + perror_msg("can't close '%s'", filename); + return 2; + } + + // Delete the tempfile. + if (unlink(filename) == -1) /* errno is set */ + { + perror_msg("can't unlink %s", filename); + } - FILE *fp = fdopen(fd, "w"); - if (!fp) - { - error_msg("can't open '%s' to save the crash report", filename); - return 1; - } + remove_comments_and_unescape(text); + // Updates the crash report from the file text. + int report_changed = read_crash_report(cr, text); + free(text); + if (report_changed) + puts(_("\nThe report has been updated.")); + else + puts(_("\nNo changes were detected in the report.")); + + return 0; +} - write_crash_report(cr, fp); +/** + * Asks user for a text response. + * @param question + * Question displayed to user. + * @param result + * Output array. + * @param result_size + * Maximum byte count to be written. + */ +static void read_from_stdin(const char *question, char *result, int result_size) +{ + printf(question); + fflush(NULL); + fgets(result, result_size, stdin); + // Remove the newline from the login. + char *newline = strchr(result, '\n'); + if (newline) + *newline = '\0'; +} + +/** + * Gets reporter plugin settings. + * @param ask_user + * If it's set to true and some reporter plugin settings are found to be missing + * (like login name or password), user is asked to provide the missing parts. + * @param settings + * A structure filled with reporter plugin settings. + */ +static void get_reporter_plugin_settings(map_map_string_t &settings, bool ask_user) +{ + /* First of all, load system-wide report plugin settings. */ + // 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 (0 != strcmp(it->second["Enabled"].c_str(), "yes")) + continue; + // Skip nonReporter plugins. + if (0 != strcmp(it->second["Type"].c_str(), "Reporter")) + continue; + map_string_t single_plugin_settings = call_GetPluginSettings(it->first.c_str()); + // Copy the received settings as defaults. + // Plugins won't work without it, if some value is missing + // they use their default values for all fields. + settings[it->first] = single_plugin_settings; + } - if (fclose(fp)) + /* Second, load user-specific settings, which override + the system-wide settings. */ + struct passwd* pw = getpwuid(geteuid()); + const char* homedir = pw ? pw->pw_dir : NULL; + if (homedir) + { + itend = settings.end(); + for (it = settings.begin(); it != itend; ++it) { - error_msg("can't close '%s'", filename); - return 2; + map_string_t single_plugin_settings; + std::string path = std::string(homedir) + "/.abrt/" + + it->first + "."PLUGINS_CONF_EXTENSION; + /* Load plugin config in the home dir. Do not skip lines with empty value (but containing a "key="), + because user may want to override password from /etc/abrt/plugins/*.conf, but he prefers to + enter it every time he reports. */ + bool success = LoadPluginSettings(path.c_str(), single_plugin_settings, false); + if (!success) + continue; + // Merge user's plugin settings into already loaded settings. + map_string_t::const_iterator valit, valitend = single_plugin_settings.end(); + for (valit = single_plugin_settings.begin(); valit != valitend; ++valit) + it->second[valit->first] = valit->second; } + } - // Start a text editor on the temporary file. - launch_editor(filename); + if (!ask_user) + return; - // Read the file back and update the report from the file. - fp = fopen(filename, "r"); - if (!fp) + /* Third, check if a login or password is missing, + and ask for it. */ + itend = settings.end(); + for (it = settings.begin(); it != itend; ++it) + { + map_string_t &single_plugin_settings = it->second; + // Login information is missing. + bool loginMissing = single_plugin_settings.find("Login") != single_plugin_settings.end() + && 0 == strcmp(single_plugin_settings["Login"].c_str(), ""); + bool passwordMissing = single_plugin_settings.find("Password") != single_plugin_settings.end() + && 0 == strcmp(single_plugin_settings["Password"].c_str(), ""); + if (!loginMissing && !passwordMissing) + continue; + + // Read the missing information and push it to plugin settings. + printf(_("Wrong settings were detected for plugin %s.\n"), it->first.c_str()); + char result[64]; + if (loginMissing) { - error_msg("can't open '%s' to read the crash report", filename); - return 1; + read_from_stdin(_("Enter your login: "), result, 64); + single_plugin_settings["Login"] = std::string(result); } - - fseek(fp, 0, SEEK_END); - long size = ftell(fp); - fseek(fp, 0, SEEK_SET); - - char *text = (char*)xmalloc(size + 1); - if (fread(text, 1, size, fp) != size) + if (passwordMissing) { - error_msg("can't read '%s'", filename); - return 1; +// TODO: echo off, see http://fixunix.com/unix/84474-echo-off.html + read_from_stdin(_("Enter your password: "), result, 64); + single_plugin_settings["Password"] = std::string(result); } - text[size] = '\0'; - fclose(fp); + } +} - remove_comments_and_unescape(text); - // Updates the crash report from the file text. - int report_changed = read_crash_report(cr, text); - if (report_changed) - puts(_("\nThe report has been updated.")); - else - puts(_("\nNo changes were detected in the report.")); +/* Reports the crash with corresponding uuid over DBus. */ +int report(const char *uuid, bool always) +{ + // Ask for an initial report. + map_crash_data_t cr = call_CreateReport(uuid); +//TODO: error check? - free(text); + /* Open text editor and give a chance to review the backtrace etc. */ + if (!always) + { + int result = run_report_editor(cr); + if (result != 0) + return result; + } - if (unlink(filename) != 0) // Delete the tempfile. - perror_msg("can't unlink %s", filename); + /* Read the plugin settings. */ + map_map_string_t pluginSettings; + get_reporter_plugin_settings(pluginSettings, !always); + /* Ask if user really want to send the report. */ + if (!always) + { // Report only if the user is sure. printf(_("Do you want to send the report? [y/N]: ")); fflush(NULL); @@ -412,59 +558,6 @@ int report(const char *uuid, bool always) } } - map_map_string_t pluginSettings; - if (!always) - { - // 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 (0 != strcmp(it->second["Enabled"].c_str(), "yes")) - continue; - // Skip nonReporter plugins. - if (0 != strcmp(it->second["Type"].c_str(), "Reporter")) - continue; - - map_string_t settings = call_GetPluginSettings(it->first.c_str()); - // Login information is missing. - bool loginMissing = settings.find("Login") != settings.end() - && 0 == strcmp(settings["Login"].c_str(), ""); - bool passwordMissing = settings.find("Password") != settings.end() - && 0 == strcmp(settings["Password"].c_str(), ""); - if (!loginMissing && !passwordMissing) - continue; - - // Copy the received settings as defaults. - // Plugins won't work without it, if some value is missing - // they use their default values for all fields. - pluginSettings[it->first] = settings; - - printf(_("Wrong settings were detected for plugin %s.\n"), it->second["Name"].c_str()); - if (loginMissing) - { - printf(_("Enter your login: ")); - fflush(NULL); - char answer[64] = ""; - fgets(answer, sizeof(answer), stdin); - if (strlen(answer) > 0) - pluginSettings[it->first]["Login"] = answer; - } - if (passwordMissing) - { -// TODO: echo off, see http://fixunix.com/unix/84474-echo-off.html - printf(_("Enter your password: ")); - fflush(NULL); - char answer[64] = ""; - fgets(answer, sizeof(answer), stdin); - if (strlen(answer) > 0) - pluginSettings[it->first]["Password"] = answer; - } - } - } - int errors = 0; int plugins = 0; puts(_("Reporting...")); @@ -475,7 +568,7 @@ int report(const char *uuid, bool always) vector_string_t &v = it->second; printf("%s: %s\n", it->first.c_str(), v[REPORT_STATUS_IDX_MSG].c_str()); plugins++; - if (v[REPORT_STATUS_IDX_FLAG] != "0") + if (v[REPORT_STATUS_IDX_FLAG] == "0") errors++; it++; } diff --git a/src/Daemon/PluginManager.cpp b/src/Daemon/PluginManager.cpp index e63cb3ac..f01d9435 100644 --- a/src/Daemon/PluginManager.cpp +++ b/src/Daemon/PluginManager.cpp @@ -80,60 +80,6 @@ static const char *const plugin_type_str[] = { }; -bool LoadPluginSettings(const char *pPath, map_plugin_settings_t& pSettings) -{ - FILE *fp = fopen(pPath, "r"); - if (!fp) - return false; - - char line[512]; - while (fgets(line, sizeof(line), fp)) - { - strchrnul(line, '\n')[0] = '\0'; - unsigned ii; - bool is_value = false; - bool valid = false; - bool in_quote = false; - string key; - string value; - for (ii = 0; line[ii] != '\0'; ii++) - { - if (line[ii] == '"') - { - in_quote = !in_quote; - } - if (isspace(line[ii]) && !in_quote) - { - continue; - } - if (line[ii] == '#' && !in_quote && key == "") - { - break; - } - if (line[ii] == '=' && !in_quote) - { - is_value = true; - continue; - } - if (!is_value) - { - key += line[ii]; - } - else - { - valid = true; - value += line[ii]; - } - } - if (valid && !in_quote) - { - pSettings[key] = value; - } - } - fclose(fp); - return true; -} - /** * A function. It saves settings. On success it returns true, otherwise returns false. * @param path A path of config file. diff --git a/src/Daemon/PluginManager.h b/src/Daemon/PluginManager.h index b5dcebc5..bf6952f4 100644 --- a/src/Daemon/PluginManager.h +++ b/src/Daemon/PluginManager.h @@ -154,13 +154,4 @@ class CPluginManager map_plugin_settings_t GetPluginSettings(const char *pName); }; -/** - * Loads settings and stores it in second parameter. On success it - * returns true, otherwise returns false. - * @param path A path of config file. - * @param settings A readed plugin's settings. - * @return if it success it returns true, otherwise it returns false. - */ -bool LoadPluginSettings(const char *pPath, - map_plugin_settings_t& pSettings); #endif /*PLUGINMANAGER_H_*/ diff --git a/src/Daemon/Settings.cpp b/src/Daemon/Settings.cpp index 9b0376b3..5644d370 100644 --- a/src/Daemon/Settings.cpp +++ b/src/Daemon/Settings.cpp @@ -376,8 +376,16 @@ void LoadSettings() ParseCommon(); ParseAnalyzerActionsAndReporters(); ParseCron(); - if(g_settings_bOpenGPGCheck) - LoadGPGKeys(); + + /* + loading gpg keys will invoke LoadOpenGPGPublicKey() from rpm.cpp + pgpReadPkts which makes nss to re-init and thus makes + bugzilla plugin work :-/ + */ + + //FIXME FIXME FIXME FIXME FIXME FIXME!!! + //if(g_settings_bOpenGPGCheck) + LoadGPGKeys(); } /* dbus call to retrieve .conf file data from daemon */ diff --git a/src/Daemon/abrt-debuginfo-install b/src/Daemon/abrt-debuginfo-install index 35f4d6a1..3bb9c415 100755 --- a/src/Daemon/abrt-debuginfo-install +++ b/src/Daemon/abrt-debuginfo-install @@ -145,7 +145,9 @@ print_package_names() { fi # when we look for debuginfo we need only -debuginfo* repos, so we can disable the rest and thus make it faster # also we want only fedora repositories, because abrt won't work for other packages anyway - local cmd="yum $yumopts '--disablerepo=*' '--enablerepo=fedora-debuginfo*' '--enablerepo=updates-debuginfo*' --quiet provides $missing_debuginfo_files" + # --showduplicates: do not just show the latest package + # -R2: wait two minutes max (hopefully this prevents infinite hang on yum lock) + local cmd="yum $yumopts '--disablerepo=*' '--enablerepo=fedora-debuginfo*' '--enablerepo=updates-debuginfo*' --showduplicates -R2 --quiet provides $missing_debuginfo_files" echo "$cmd" >"yum_provides.$1.OUT" # eval is needed to strip away ''s; cant remove them above and just use # $cmd, that would perform globbing on '*' @@ -194,53 +196,56 @@ download_packages() { for pkg in $packages; do echo "Download $i/$num_packages: $pkg" echo "Download $i/$num_packages: $pkg" >>yumdownloader.OUT - # we can't handle packages from non Fedora repos, so we look and download only + # We can't handle packages from non Fedora repos, so we look and download only # from Fedora repos which makes it faster yumdownloader --disablerepo="*" --enablerepo="fedora-debuginfo*" --enablerepo="updates-debuginfo*" --quiet $pkg >>yumdownloader.OUT 2>&1 err=$? echo "exitcode:$err" >>yumdownloader.OUT echo >>yumdownloader.OUT test $err = 0 || { echo "Download of $pkg failed!"; sleep 1; } - : $((i++)) - done - - for file in *.rpm; do - # Happens if no .rpm's were downloaded (yumdownloader problem) - # In this case, $f is the literal "*.rpm" string - test -f "$file" || error_msg_and_die "not a rpm file: '$file'" - echo "Unpacking: $file" - echo "Processing: $file" >>unpack.OUT - rpm2cpio <"$file" 2>>unpack.OUT | cpio -id >>unpack.OUT 2>&1 -#TODO: error check? - done - - # Copy debuginfo files to cachedir - if test x"$cachedir" != x"" && test -d "$cachedir"; then - for build_id in $build_ids; do - build_id1=${build_id:0:2} - build_id2=${build_id:2} - - file="usr/lib/debug/.build-id/$build_id1/$build_id2.debug" - - # Do not copy it if it can be found in any of $debuginfodirs - test -f "/$file" && continue - if test x"$cachedir" != x""; then - for d in $debuginfodirs; do - test -f "$d/$file" && continue 2 + # Process and delete the *.rpm file just downloaded + # We do it right after download: some users have smallish disks... + for file in *.rpm; do + # Happens if no .rpm's were downloaded (yumdownloader problem) + # In this case, $f is the literal "*.rpm" string + test -f "$file" || { echo "No rpm file downloaded"; continue; } + echo "Unpacking: $file" + echo "Processing: $file" >>unpack.OUT + rpm2cpio <"$file" >"unpacked.cpio" 2>>unpack.OUT || error_msg_and_die "Can't convert '$file' to cpio" + rm "$file" + cpio -id <"unpacked.cpio" >>unpack.OUT 2>&1 || error_msg_and_die "Can't unpack '$file' cpio archive" + rm "unpacked.cpio" + # Copy debuginfo files to cachedir + if test x"$cachedir" != x"" && test -d "$cachedir"; then + # For every needed debuginfo, check whether we have it + for build_id in $build_ids; do + build_id1=${build_id:0:2} + build_id2=${build_id:2} + file="usr/lib/debug/.build-id/$build_id1/$build_id2.debug" + # Do not copy it if it can be found in any of $debuginfodirs + test -f "/$file" && continue + if test x"$cachedir" != x""; then + for d in $debuginfodirs; do + test -f "$d/$file" && continue 2 + done + fi + if test -f "$file"; then + # File is one of those we just installed, cache it + mkdir -p "$cachedir/usr/lib/debug/.build-id/$build_id1" + # Note: this does not preserve symlinks. This is intentional + $debug && echo Copying "$file" to "$cachedir/$file" >&2 + echo "Caching debuginfo: $file" + cp --remove-destination "$file" "$cachedir/$file" || error_msg_and_die "Can't copy $file (disk full?)" + continue + fi done fi - - if test -f "$file"; then - # File is one of those we just installed, cache it. - mkdir -p "$cachedir/usr/lib/debug/.build-id/$build_id1" - # Note: this does not preserve symlinks. This is intentional - $debug && echo Copying "$file" to "$cachedir/$file" >&2 - cp --remove-destination "$file" "$cachedir/$file" -#TODO: error check? - continue - fi + # Delete remaining files unpacked from .cpio + # which we didn't need after all + rm -r etc bin sbin usr var opt 2>/dev/null done - fi + : $((i++)) + done } diff --git a/src/Gui/CCMainWindow.py b/src/Gui/CCMainWindow.py index 7967028e..c0666f07 100644 --- a/src/Gui/CCMainWindow.py +++ b/src/Gui/CCMainWindow.py @@ -2,6 +2,7 @@ import sys import pwd import getopt +from glib import markup_escape_text from abrt_utils import _, init_logging, log, log1, log2 import gobject @@ -233,7 +234,7 @@ class MainWindow(): # it is not informative (no URL to the report) for message in dump.getMessage().split(';'): if message: - message_clean = message.strip() + message_clean = markup_escape_text(message.strip()) if "http" in message_clean[0:5] or "file:///" in message_clean[0:8]: report_message = "<a href=\"%s\">%s</a>" % (message_clean, message_clean) else: diff --git a/src/Gui/CC_gui_functions.py b/src/Gui/CC_gui_functions.py index 9378de52..acfd2a53 100644 --- a/src/Gui/CC_gui_functions.py +++ b/src/Gui/CC_gui_functions.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +from glib import markup_escape_text import gtk import pango import subprocess @@ -66,7 +67,7 @@ def gui_report_dialog ( report_status_dict, parent_dialog, # this first one is actually a fallback to set at least # a raw text in case when set_markup() fails status_label.set_text(report_status_dict[plugin][MESSAGE]) - status_label.set_markup("<span foreground='red'>%s</span>" % report_status_dict[plugin][MESSAGE]) + status_label.set_markup("<span foreground='red'>%s</span>" % markup_escape_text(report_status_dict[plugin][MESSAGE])) # if the report was not succesful then this won't pass so this runs only # if report succeds and gets overwriten by the status message if report_status_dict[plugin][STATUS] == '1': diff --git a/src/Gui/PluginsSettingsDialog.py b/src/Gui/PluginsSettingsDialog.py index d6129b1f..787faee6 100644 --- a/src/Gui/PluginsSettingsDialog.py +++ b/src/Gui/PluginsSettingsDialog.py @@ -107,7 +107,7 @@ class PluginsSettingsDialog: # cell_text, toggle_active, toggle_visible, group_name_visible, color, plugin ["<b>%s</b>" % PluginInfo.types[plugin_type], 0, 0, 1, "gray", None]) plugin_rows[plugin_type] = it - group_empty[plugin_type] = 1 + group_empty[plugin_type] = it for entry in pluginlist: if entry.Description: text = "<b>%s</b>\n%s" % (entry.getName(), entry.Description) @@ -118,13 +118,13 @@ class PluginsSettingsDialog: self.pluginsListStore.append(plugin_rows[plugin_type], # cell_text, toggle_active, toggle_visible, group_name_visible, color, plugin [text, entry.Enabled == "yes", 1, 0, "white", entry]) - group_empty[plugin_type] = 0 + if group_empty.has_key(plugin_type): + del group_empty[plugin_type] # rhbz#560971 "Don't show empty 'Not loaded plugins' section" - for plugin_type in group_empty.keys(): - if group_empty[plugin_type]: - self.pluginsListStore.append(plugin_rows[plugin_type], - # cell_text, toggle_active, toggle_visible, group_name_visible, color, plugin - ["(none)", 0, 1, 0, "white", None]) + # don't show any empty groups + for it in group_empty.values(): + self.pluginsListStore.remove(it) + self.pluginlist.expand_all() def dehydrate(self): diff --git a/src/Gui/report.glade b/src/Gui/report.glade index cff0dc8a..7b3aac4a 100644 --- a/src/Gui/report.glade +++ b/src/Gui/report.glade @@ -302,6 +302,7 @@ <property name="height_request">200</property> <property name="visible">True</property> <property name="can_focus">True</property> + <property name="accepts_tab">False</property> </object> </child> </object> @@ -377,6 +378,7 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="wrap_mode">word-char</property> + <property name="accepts_tab">False</property> </object> </child> </object> @@ -414,6 +416,7 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="wrap_mode">word-char</property> + <property name="accepts_tab">False</property> </object> </child> </object> diff --git a/src/Hooks/abrt-hook-ccpp.cpp b/src/Hooks/abrt-hook-ccpp.cpp index 9d1dc19c..d21b8e6b 100644 --- a/src/Hooks/abrt-hook-ccpp.cpp +++ b/src/Hooks/abrt-hook-ccpp.cpp @@ -82,31 +82,52 @@ int main(int argc, char** argv) /* set to max possible >0 value */ ulimit_c = ~((off_t)1 << (sizeof(off_t)*8-1)); } - off_t core_size = 0; - if (errno || pid <= 0) { error_msg_and_die("pid '%s' or limit '%s' is bogus", argv[2], argv[5]); } + char* executable = get_executable(pid); + if (executable == NULL) + { + error_msg_and_die("can't read /proc/%lu/exe link", (long)pid); + } + if (strstr(executable, "/abrt-hook-ccpp")) + { + error_msg_and_die("pid %lu is '%s', not dumping it to avoid recursion", + (long)pid, executable); + } + + char *user_pwd = get_cwd(pid); /* may be NULL on error */ + + /* Parse abrt.conf and plugins/CCpp.conf */ + unsigned setting_MaxCrashReportsSize = 0; + bool setting_MakeCompatCore = false; + parse_conf(CONF_DIR"/plugins/CCpp.conf", &setting_MaxCrashReportsSize, &setting_MakeCompatCore); + + int core_fd = STDIN_FILENO; + off_t core_size = 0; + const char *signame = NULL; /* Tried to use array for this but C++ does not support v[] = { [IDX] = "str" } */ switch (signal_no) { - case SIGQUIT: signame = "QUIT"; break; case SIGILL : signame = "ILL" ; break; - case SIGABRT: signame = "ABRT"; break; case SIGFPE : signame = "FPE" ; break; case SIGSEGV: signame = "SEGV"; break; + case SIGBUS : signame = "BUS" ; break; //Bus error (bad memory access) + case SIGABRT: signame = "ABRT"; break; //usually when abort() was called + //case SIGQUIT: signame = "QUIT"; break; //Quit from keyboard + //case SIGSYS : signame = "SYS" ; break; //Bad argument to routine (SVr4) + //case SIGTRAP: signame = "TRAP"; break; //Trace/breakpoint trap + //case SIGXCPU: signame = "XCPU"; break; //CPU time limit exceeded (4.2BSD) + //case SIGXFSZ: signame = "XFSZ"; break; //File size limit exceeded (4.2BSD) } if (signame == NULL) { - /* not a signal we care about, exit silently */ - return 0; + /* not a signal we care about */ + goto create_user_core; } - char *user_pwd = get_cwd(pid); /* may be NULL on error */ - int core_fd = STDIN_FILENO; - if (!daemon_is_ok()) { /* not an error, exit with exitcode 0 */ @@ -119,22 +140,6 @@ int main(int argc, char** argv) try { - char* executable = get_executable(pid); - if (executable == NULL) - { - error_msg_and_die("can't read /proc/%lu/exe link", (long)pid); - } - if (strstr(executable, "/abrt-hook-ccpp")) - { - error_msg_and_die("pid %lu is '%s', not dumping it to avoid recursion", - (long)pid, executable); - } - - /* Parse abrt.conf and plugins/CCpp.conf */ - unsigned setting_MaxCrashReportsSize = 0; - bool setting_MakeCompatCore = false; - parse_conf(CONF_DIR"/plugins/CCpp.conf", &setting_MaxCrashReportsSize, &setting_MakeCompatCore); - if (setting_MaxCrashReportsSize > 0) { check_free_space(setting_MaxCrashReportsSize); @@ -267,8 +272,6 @@ int main(int argc, char** argv) trim_debug_dumps(setting_MaxCrashReportsSize, path); } - if (!setting_MakeCompatCore) - return 0; /* fall through to creating user core */ } catch (CABRTException& e) @@ -282,6 +285,9 @@ int main(int argc, char** argv) create_user_core: + if (!setting_MakeCompatCore) + return 0; + /* note: core_size may be == 0 ("unknown") */ if (core_size > ulimit_c || ulimit_c == 0) return 0; diff --git a/src/Hooks/abrt-hook-python.cpp b/src/Hooks/abrt-hook-python.cpp index 356174f8..34459540 100644 --- a/src/Hooks/abrt-hook-python.cpp +++ b/src/Hooks/abrt-hook-python.cpp @@ -37,21 +37,6 @@ static char *pid; static char *executable; -// Note: "" will return false -static bool isxdigit_str(const char *str) -{ - do { - if ((*str < '0' || *str > '9') // not a digit - && ((*str | 0x20) < 'a' || (*str | 0x20) > 'f') // not A-F or a-f - ) - { - return false; - } - str++; - } while (*str); - return true; -} - static bool printable_str(const char *str) { do { diff --git a/src/Hooks/abrt_exception_handler.py.in b/src/Hooks/abrt_exception_handler.py.in index 89f30132..b5e15b80 100644 --- a/src/Hooks/abrt_exception_handler.py.in +++ b/src/Hooks/abrt_exception_handler.py.in @@ -59,8 +59,22 @@ def handleMyException((etype, value, tb)): return sys.__excepthook__(etype, value, tb) try: + import os import os.path import traceback + import errno + + # EPIPE is not a crash, it happens all the time + # Testcase: script.py | true, where script.py is: + ## #!/usr/bin/python + ## import os + ## import time + ## time.sleep(1) + ## os.write(1, "Hello\n") # print "Hello" wouldn't be the same + # + if etype == IOError or etype == OSError: + if value.errno == errno.EPIPE: + return sys.__excepthook__(etype, value, tb) # "-c" appears in this case: # $ python -c 'import sys; print "argv0 is:%s" % sys.argv[0]' |