summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarel Klic <kklic@redhat.com>2010-02-15 10:13:34 +0100
committerKarel Klic <kklic@redhat.com>2010-02-15 10:13:34 +0100
commitf49b4e72dc22d004ada91292fcd7179956de81c4 (patch)
tree92edd09227bd41e738e004c0e45444d39452c012
parente245149118bff4a364fb6fbb0651b1f09e0ce0bc (diff)
parentf97428655a81cea935fd0a8cc93af83e712df299 (diff)
downloadabrt-f49b4e72dc22d004ada91292fcd7179956de81c4.tar.gz
abrt-f49b4e72dc22d004ada91292fcd7179956de81c4.tar.xz
abrt-f49b4e72dc22d004ada91292fcd7179956de81c4.zip
Merge branch 'master' of ssh://git.fedorahosted.org/git/abrt
-rw-r--r--Makefile.am11
-rw-r--r--abrt.spec33
-rw-r--r--inc/abrtlib.h4
-rw-r--r--lib/Plugins/Bugzilla.conf2
-rw-r--r--lib/Plugins/Makefile.am30
-rw-r--r--lib/Utils/Plugin.cpp69
-rw-r--r--lib/Utils/Plugin.h18
-rw-r--r--lib/Utils/xfuncs.cpp2
-rw-r--r--po/id.po633
-rw-r--r--src/CLI/report.cpp309
-rw-r--r--src/Daemon/PluginManager.cpp54
-rw-r--r--src/Daemon/PluginManager.h9
-rw-r--r--src/Daemon/Settings.cpp12
-rwxr-xr-xsrc/Daemon/abrt-debuginfo-install83
-rw-r--r--src/Gui/CCMainWindow.py3
-rw-r--r--src/Gui/CC_gui_functions.py3
-rw-r--r--src/Gui/PluginsSettingsDialog.py14
-rw-r--r--src/Gui/report.glade3
-rw-r--r--src/Hooks/abrt-hook-ccpp.cpp60
-rw-r--r--src/Hooks/abrt-hook-python.cpp15
-rw-r--r--src/Hooks/abrt_exception_handler.py.in14
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
diff --git a/abrt.spec b/abrt.spec
index 5e9f636b..f58e0045 100644
--- a/abrt.spec
+++ b/abrt.spec
@@ -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]'