summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarel Klic <kklic@redhat.com>2011-03-01 12:08:36 +0100
committerKarel Klic <kklic@redhat.com>2011-03-01 12:08:36 +0100
commit85f639b7fe277ba327e5013e5b101b4a67f14e1d (patch)
tree7caa3999e8c987e3ddbc26f4bfbbdc73defca73f
parentfb52104af74bbf6eeda394880666df40b4354aba (diff)
parent77468fcdd7cc05db52320c373a24a5490ff32f52 (diff)
downloadabrt-85f639b7fe277ba327e5013e5b101b4a67f14e1d.tar.gz
abrt-85f639b7fe277ba327e5013e5b101b4a67f14e1d.tar.xz
abrt-85f639b7fe277ba327e5013e5b101b4a67f14e1d.zip
merge changes from master
-rw-r--r--.gitignore107
-rw-r--r--abrt-ccpp.init151
-rw-r--r--abrt.init30
-rw-r--r--abrt.spec155
-rw-r--r--configure.ac15
-rw-r--r--doc/TODO_crash_dump_fields131
-rw-r--r--doc/abrt-plugin/abrt-reporter-hello-world.cpp1
-rw-r--r--doc/design100
-rw-r--r--doc/interpreted-languages2
-rw-r--r--examples/cut_here.right2
-rw-r--r--examples/not_oops1.right2
-rw-r--r--examples/not_oops2.right2
-rw-r--r--examples/not_oops2.test1
-rw-r--r--examples/not_oops3.right2
-rw-r--r--examples/oops1.right2
-rw-r--r--examples/oops2.right2
-rw-r--r--examples/oops3.right2
-rwxr-xr-xexamples/test.sh10
-rw-r--r--po/POTFILES.in19
-rw-r--r--po/bn_IN.po477
-rw-r--r--po/cs.po305
-rw-r--r--po/gu.po986
-rw-r--r--po/hi.po952
-rw-r--r--po/ja.po695
-rw-r--r--po/kn.po961
-rw-r--r--po/nds.po1581
-rw-r--r--po/nl.po765
-rw-r--r--po/or.po943
-rw-r--r--po/pa.po936
-rw-r--r--po/pl.po701
-rw-r--r--po/pt_BR.po895
-rw-r--r--po/ta.po757
-rw-r--r--po/te.po481
-rw-r--r--po/uk.po881
-rw-r--r--po/zh_CN.po1046
-rwxr-xr-xscripts/dbg_mkrpm65
-rwxr-xr-xscripts/dbg_mkrpm.old48
-rwxr-xr-xscripts/dbg_rpminst28
-rwxr-xr-xscripts/dbg_rpmuninst11
-rwxr-xr-xscripts/dbg_unpkrpm4
-rw-r--r--src/Makefile.am2
-rw-r--r--src/applet/Makefile.am25
-rw-r--r--src/applet/applet.c (renamed from src/applet/Applet.cpp)35
-rw-r--r--src/applet/test_report.c62
-rw-r--r--src/btparser/Makefile.am2
-rw-r--r--src/btparser/normalize_glibc.c19
-rw-r--r--src/btparser/thread.c71
-rw-r--r--src/btparser/thread.h11
-rw-r--r--src/cli/CLI.cpp358
-rw-r--r--src/cli/Makefile.am14
-rw-r--r--src/cli/dbus.cpp282
-rw-r--r--src/cli/dbus.h68
-rw-r--r--src/cli/report.cpp531
-rw-r--r--src/cli/report.h7
-rw-r--r--src/daemon/CommLayerServer.h45
-rw-r--r--src/daemon/CommLayerServerDBus.cpp153
-rw-r--r--src/daemon/CommLayerServerDBus.h30
-rw-r--r--src/daemon/CrashWatcher.cpp44
-rw-r--r--src/daemon/CrashWatcher.h38
-rw-r--r--src/daemon/Daemon.cpp484
-rw-r--r--src/daemon/Makefile.am35
-rw-r--r--src/daemon/MiddleWare.cpp379
-rw-r--r--src/daemon/MiddleWare.h43
-rw-r--r--src/daemon/PluginManager.cpp259
-rw-r--r--src/daemon/PluginManager.h99
-rw-r--r--src/daemon/Settings.cpp201
-rw-r--r--src/daemon/Settings.h32
-rw-r--r--src/daemon/abrt-action-save-package-data.c (renamed from src/daemon/abrt-action-save-package-data.cpp)81
-rw-r--r--src/daemon/abrt-handle-crashdump.c24
-rw-r--r--src/daemon/abrt-server.c43
-rw-r--r--src/daemon/abrt.conf15
-rw-r--r--src/daemon/abrt.conf.512
-rw-r--r--src/daemon/abrt_event.conf60
-rw-r--r--src/daemon/comm_layer_inner.cpp (renamed from src/lib/CommLayerInner.cpp)20
-rw-r--r--src/daemon/comm_layer_inner.h (renamed from src/include/comm_layer_inner.h)11
-rw-r--r--src/daemon/rpm.c27
-rw-r--r--src/daemon/rpm.h6
-rw-r--r--src/gui-gtk/Makefile.am45
-rw-r--r--src/gui-gtk/abrt-gtk.c307
-rw-r--r--src/gui-gtk/abrt-gtk.h5
-rw-r--r--src/gui-gtk/main.c101
-rw-r--r--src/gui-wizard-gtk/Makefile.am60
-rw-r--r--src/gui-wizard-gtk/main.c80
-rw-r--r--src/gui-wizard-gtk/wizard.c968
-rw-r--r--src/gui-wizard-gtk/wizard.glade746
-rw-r--r--src/gui-wizard-gtk/wizard.h38
-rw-r--r--src/gui/CCDBusBackend.py15
-rw-r--r--src/gui/CCDump.py11
-rw-r--r--src/gui/CCMainWindow.py16
-rw-r--r--src/gui/CCReporterDialog.py578
-rw-r--r--src/gui/CReporterAssistant.py68
-rw-r--r--src/gui/CellRenderers.py66
-rw-r--r--src/gui/Makefile.am4
-rw-r--r--src/gui/SettingsDialog.py53
-rw-r--r--src/gui/ccgui.glade42
-rw-r--r--src/gui/progress_window.glade19
-rw-r--r--src/gui/settings.glade295
-rw-r--r--src/hooks/Makefile.am27
-rw-r--r--src/hooks/abrt-hook-ccpp.c165
-rw-r--r--src/hooks/abrt_exception_handler.py.in7
-rw-r--r--src/hooks/dumpoops.cpp131
-rw-r--r--src/include/Makefile.am22
-rw-r--r--src/include/abrt_crash_data.h (renamed from src/include/abrt_crash_dump.h)65
-rw-r--r--src/include/abrt_exception.h57
-rw-r--r--src/include/abrt_types.h28
-rw-r--r--src/include/abrtlib.h221
-rw-r--r--src/include/action.h44
-rw-r--r--src/include/analyzer.h34
-rw-r--r--src/include/dbus_common.h28
-rw-r--r--src/include/observer.h32
-rw-r--r--src/include/plugin.h113
-rw-r--r--src/include/report/crash_data.h101
-rw-r--r--src/include/report/dump_dir.h (renamed from src/include/dump_dir.h)18
-rw-r--r--src/include/report/run_event.h82
-rw-r--r--src/include/xfuncs.h38
-rw-r--r--src/lib/Makefile.am66
-rw-r--r--src/lib/Plugin.cpp41
-rw-r--r--src/lib/abrt_curl.c15
-rw-r--r--src/lib/abrt_dbus.c438
-rw-r--r--src/lib/abrt_dbus.h59
-rw-r--r--src/lib/abrt_types.c (renamed from src/lib/ABRTException.cpp)30
-rw-r--r--src/lib/abrt_xmlrpc.cpp18
-rw-r--r--src/lib/abrt_xmlrpc.h12
-rw-r--r--src/lib/binhex.c74
-rw-r--r--src/lib/copy_file_recursive.c139
-rw-r--r--src/lib/crash_data.c (renamed from src/lib/crash_dump.cpp)187
-rw-r--r--src/lib/create_dump_dir.c85
-rw-r--r--src/lib/dump_dir.c468
-rw-r--r--src/lib/glib_support.c (renamed from src/daemon/CommLayerServer.cpp)17
-rw-r--r--src/lib/hash_md5.h3
-rw-r--r--src/lib/hash_sha1.h3
-rw-r--r--src/lib/hooklib.c2
-rw-r--r--src/lib/hooklib.h8
-rw-r--r--src/lib/iso_date_string.c (renamed from src/lib/numtoa.cpp)25
-rw-r--r--src/lib/load_plugin_settings.c (renamed from src/lib/load_plugin_settings.cpp)38
-rw-r--r--src/lib/logging.h29
-rw-r--r--src/lib/make_descr.c (renamed from src/lib/make_descr.cpp)136
-rw-r--r--src/lib/parse_options.c45
-rw-r--r--src/lib/parse_options.h32
-rw-r--r--src/lib/parse_release.c (renamed from src/lib/parse_release.cpp)32
-rw-r--r--src/lib/read_write.h6
-rw-r--r--src/lib/run_event.c414
-rw-r--r--src/lib/spawn.c2
-rw-r--r--src/lib/steal_directory.c40
-rw-r--r--src/lib/strbuf.c2
-rw-r--r--src/lib/strbuf.h11
-rw-r--r--src/lib/stringops.cpp57
-rw-r--r--src/lib/xatonum.c4
-rw-r--r--src/lib/xfuncs.c22
-rw-r--r--src/plugins/CCpp.cpp280
-rw-r--r--src/plugins/CCpp.h49
-rw-r--r--src/plugins/Kerneloops.conf6
-rw-r--r--src/plugins/KerneloopsScanner.cpp230
-rw-r--r--src/plugins/KerneloopsScanner.h42
-rw-r--r--src/plugins/KerneloopsSysLog.cpp383
-rw-r--r--src/plugins/KerneloopsSysLog.h35
-rw-r--r--src/plugins/Makefile.am142
-rw-r--r--src/plugins/abrt-KerneloopsScanner.746
-rw-r--r--src/plugins/abrt-action-analyze-c.c16
-rw-r--r--src/plugins/abrt-action-analyze-oops.c8
-rw-r--r--src/plugins/abrt-action-analyze-python.c12
-rw-r--r--src/plugins/abrt-action-bugzilla.cpp221
-rw-r--r--src/plugins/abrt-action-generate-backtrace.c122
-rw-r--r--src/plugins/abrt-action-install-debuginfo.c43
-rwxr-xr-xsrc/plugins/abrt-action-install-debuginfo.py160
-rw-r--r--src/plugins/abrt-action-kerneloops.c (renamed from src/plugins/abrt-action-kerneloops.cpp)97
-rw-r--r--src/plugins/abrt-action-mailx.c (renamed from src/plugins/abrt-action-mailx.cpp)80
-rw-r--r--src/plugins/abrt-action-print.c (renamed from src/plugins/abrt-action-print.cpp)37
-rw-r--r--src/plugins/abrt-action-rhtsupport.c (renamed from src/plugins/abrt-action-rhtsupport.cpp)153
-rw-r--r--src/plugins/abrt-action-upload.c (renamed from src/plugins/abrt-action-upload.cpp)38
-rw-r--r--src/plugins/abrt-dump-oops.c710
-rw-r--r--src/plugins/abrt-plugins.71
-rw-r--r--src/plugins/abrt_rh_support.c95
-rw-r--r--src/plugins/ccpp_events.conf17
-rw-r--r--src/report-python/Makefile.am42
-rw-r--r--src/report-python/__init__.py130
-rw-r--r--src/report-python/accountmanager.py6
-rw-r--r--src/report-python/common.h (renamed from src/daemon/Daemon.h)49
-rw-r--r--src/report-python/crash_data.c137
-rw-r--r--src/report-python/dump_dir.c264
-rw-r--r--src/report-python/io/GTKIO.py11
-rw-r--r--src/report-python/io/NewtIO.py7
-rw-r--r--src/report-python/io/TextIO.py6
-rw-r--r--src/report-python/io/__init__.py1
-rw-r--r--src/report-python/reportmodule.c83
-rw-r--r--src/report-python/run_event.c220
-rwxr-xr-xsrc/report-python/test_crash_data21
-rwxr-xr-xsrc/report-python/test_crash_data210
-rwxr-xr-xsrc/report-python/test_dd_create25
-rwxr-xr-xsrc/report-python/test_full27
-rwxr-xr-xsrc/report-python/test_full217
-rwxr-xr-xsrc/report-python/test_run_event_state13
-rwxr-xr-xsrc/report-python/test_run_event_state127
-rwxr-xr-xsrc/report-python/test_setroubleshoot_example18
-rwxr-xr-xsrc/report-python/test_setroubleshoot_example227
-rw-r--r--tests/btparser/thread.at47
196 files changed, 17321 insertions, 12062 deletions
diff --git a/.gitignore b/.gitignore
index 67b52062..889c71c1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,16 +1,57 @@
-\#*
-cscope.out
+# NOTE! Please use 'git ls-files -i --exclude-standard'
+# command after changing this file, to see if there are
+# any tracked files which get ignored after the change.
+
+# normal rules
*.o
*.lo
*.la
-abrt-*.rpm
-abrt-?.?.*.tar.gz
-abrt-?.?.*/
-i686/
-po/*.gmo
+
+# ignore binaries
+src/plugins/abrt-action-analyze-c
+src/plugins/abrt-action-analyze-oops
+src/plugins/abrt-action-bugzilla
+src/plugins/abrt-action-rhtsupport
+src/plugins/abrt-action-kerneloops
+src/plugins/abrt-action-analyze-python
+src/plugins/abrt-action-generate-backtrace
+src/plugins/abrt-action-upload
+src/plugins/abrt-action-mailx
+src/plugins/abrt-action-print
+src/plugins/abrt-dump-oops
+
+src/daemon/abrt-action-save-package-data
+src/daemon/abrt-handle-crashdump
+src/daemon/abrt-server
+src/daemon/abrtd
+
+src/gui-gtk/abrt-gtk
+
+src/applet/abrt-applet
+
+src/cli/abrt-cli
+
+src/hooks/abrt_exception_handler.py
+src/hooks/abrt-hook-ccpp
+
+src/applet/abrt-applet.desktop
+src/gui/abrt.desktop
+
+src/gui-wizard-gtk/bug-reporting-wizard
+
+# cscope files
+cscope.*
+ncscope.*
+
+# gnu global files
+GPATH
+GRTAGS
+GSYMS
+GTAGS
+
+# autotools
.deps
.libs
-*~
Makefile
Makefile.in
m4
@@ -31,7 +72,12 @@ depcomp
install-sh
libtool
ltmain.sh
-ylwrap
+py-compile
+stamp-h1
+tests/atconfig
+tests/atlocal
+
+# po files
po/Makevars.template
po/notexist
po/POTFILES
@@ -46,28 +92,23 @@ po/remove-potcdate.sed
po/remove-potcdate.sin
po/stamp-po
po/stamp-it
-py-compile
-src/applet/abrt-applet
-src/applet/abrt-applet.desktop
-src/cli/abrt-cli
-src/daemon/abrtd
-src/gui/abrt.desktop
-src/hooks/abrt_exception_handler.py
-src/hooks/dumpoops
-src/hooks/abrt-hook-ccpp
-stamp-h1
-x86_64/
+po/*.gmo
+po/.intltool-merge-cache
+
+# compiled python files
*.pyc
-src/daemon/abrt-action-save-package-data
-src/daemon/abrt-handle-crashdump
-src/daemon/abrt-server
-src/plugins/abrt-action-analyze-c
-src/plugins/abrt-action-analyze-oops
-src/plugins/abrt-action-bugzilla
-src/plugins/abrt-action-rhtsupport
-src/plugins/abrt-action-kerneloops
-src/plugins/abrt-action-analyze-python
-src/plugins/abrt-action-generate-backtrace
-src/plugins/abrt-action-upload
-src/plugins/abrt-action-mailx
-src/plugins/abrt-action-print
+
+# misc
+\#*
+*~
+
+# autogenerated soure file
+src/gui-wizard-gtk/wizard_glade.c
+
+# if you want to enable them, be aware of that 'git clean -df' won't clean them
+# and you have to do it *manually*
+# x86_64/
+# abrt-*.rpm
+# abrt-?.?.*.tar.gz
+# abrt-?.?.*/
+# i686/
diff --git a/abrt-ccpp.init b/abrt-ccpp.init
new file mode 100644
index 00000000..480cb1e8
--- /dev/null
+++ b/abrt-ccpp.init
@@ -0,0 +1,151 @@
+#!/bin/bash
+# Install abrt coredump hook
+#
+# chkconfig: 35 82 16
+# description: Installs coredump handler which saves segfault data
+### BEGIN INIT INFO
+# Provides: abrt-ccpp
+# Required-Start: $abrtd
+# Default-Stop: 0 1 2 6
+# Default-Start: 3 5
+# Short-Description: Installs coredump handler which saves segfault data
+# Description: Installs coredump handler which saves segfault data
+### END INIT INFO
+
+# Source function library.
+. /etc/rc.d/init.d/functions
+
+# For debugging
+dry_run=false
+verbose=false
+
+# We don't have pid files, therefore have to use
+# a flag file in /var/lock/subsys to enable GUI service tools
+# to figure out our status
+LOCK="/var/lock/subsys/abrt-ccpp"
+
+PATTERN_FILE="/proc/sys/kernel/core_pattern"
+SAVED_PATTERN_FILE="/var/run/abrt/saved_core_pattern"
+HOOK_BIN="/usr/libexec/abrt-hook-ccpp"
+PATTERN="|$HOOK_BIN /var/spool/abrt %s %c %p %u %g %t %h %e"
+
+# core_pipe_limit specifies how many dump_helpers can run at the same time
+# 0 - means unlimited, but it's not guaranteed that /proc/<pid> of crashing
+# process will be available for dump_helper.
+# 4 - means that 4 dump_helpers can run at the same time (the rest will also
+# run, but they will fail to read /proc/<pid>).
+#
+# This should be enough for ABRT, we can miss some crashes, but what are
+# the odds that more processes crash at the same time? And moreover,
+# do people want to save EVERY ONE of the crashes when they have
+# a crash storm? I don't think so.
+# The value of 4 has been recommended by nhorman.
+#
+CORE_PIPE_LIMIT_FILE="/proc/sys/kernel/core_pipe_limit"
+CORE_PIPE_LIMIT="4"
+
+RETVAL=0
+
+check() {
+ # Check that we're a privileged user
+ [ "`id -u`" = 0 ] || exit 4
+}
+
+start() {
+ check
+
+ cur=`cat "$PATTERN_FILE"`
+ cur_first=`printf "%s" "$cur" | sed 's/ .*//'`
+
+ $verbose && printf "cur:'%s'\n" "$cur"
+ # Is it already installed?
+ if test x"$cur_first" != x"|$HOOK_BIN"; then # no
+ # It is not installed
+ printf "%s\n" "$cur" >"$SAVED_PATTERN_FILE"
+ OLD_PATTERN=""
+ # Does old pattern start with '|'?
+ if test x"${cur#|}" = x"$cur"; then # no
+ # Encode it as hex string, NUL terminated
+ OLD_PATTERN=`printf "%s" "$cur" | od -tx1 | sed 's/000[^ ]*//' | xargs | sed 's/ //g'`
+ $verbose && printf "OLD_PATTERN:'%s'\n" "$OLD_PATTERN"
+ OLD_PATTERN=" ${OLD_PATTERN}00"
+ fi
+ # Install new handler
+ $verbose && printf "Installing to %s:'%s'\n" "$PATTERN_FILE" "${PATTERN}${OLD_PATTERN}"
+ $dry_run || echo "${PATTERN}${OLD_PATTERN}" >"$PATTERN_FILE"
+ $dry_run || touch -- "$LOCK"
+
+ # Check core_pipe_limit and change it if it's 0,
+ # otherwise the abrt-hook-ccpp won't be able to read /proc/<pid>
+ # of the crashing process
+ if test x"`cat "$CORE_PIPE_LIMIT_FILE"`" = x"0"; then
+ echo "$CORE_PIPE_LIMIT" >"$CORE_PIPE_LIMIT_FILE"
+ fi
+ fi
+ return $RETVAL
+}
+
+stop() {
+ check
+
+ if test -f "$SAVED_PATTERN_FILE"; then
+ $verbose && printf "Restoring to %s:'%s'\n" "$PATTERN_FILE" "`cat "$SAVED_PATTERN_FILE"`"
+ $dry_run || cat "$SAVED_PATTERN_FILE" >"$PATTERN_FILE"
+ fi
+ $dry_run || rm -f -- "$LOCK"
+ return $RETVAL
+}
+
+restart() {
+ stop
+ start
+}
+
+reload() {
+ restart
+}
+
+case "$1" in
+start)
+ start
+ ;;
+stop)
+ stop
+ ;;
+reload)
+ reload
+ ;;
+force-reload)
+ echo "$0: Unimplemented feature."
+ RETVAL=3
+ ;;
+restart)
+ restart
+ ;;
+condrestart)
+ cur=`cat "$PATTERN_FILE"`
+ cur_first=`printf "%s" "$cur" | sed 's/ .*//'`
+ # Is it already installed?
+ if test x"$cur_first" = x"|$HOOK_BIN"; then # yes
+ $verbose && printf "Installed, re-installing\n"
+ restart
+ fi
+ ;;
+status)
+ cur=`cat "$PATTERN_FILE"`
+ cur_first=`printf "%s" "$cur" | sed 's/ .*//'`
+ # Is it already installed?
+ if test x"$cur_first" = x"|$HOOK_BIN"; then # yes
+ $verbose && printf "Installed\n"
+ RETVAL=0
+ else
+ $verbose && printf "Not installed\n"
+ RETVAL=3 # "stopped normally"
+ fi
+ ;;
+*)
+ echo $"Usage: $0 {start|stop|status|restart|condrestart|reload|force-reload}"
+ RETVAL=2
+esac
+
+exit $RETVAL
diff --git a/abrt.init b/abrt.init
index dde5950d..ba1dbba1 100644
--- a/abrt.init
+++ b/abrt.init
@@ -2,16 +2,17 @@
# Starts the abrt daemon
#
# chkconfig: 35 82 16
-# description: Daemon to detect crashing apps
+# description: Saves segfault data, kernel oopses, fatal exceptions
# processname: abrtd
+# pidfile: /var/run/abrtd.pid
### BEGIN INIT INFO
# Provides: abrt
# Required-Start: $syslog $local_fs
# Required-Stop: $syslog $local_fs
# Default-Stop: 0 1 2 6
# Default-Start: 3 5
-# Short-Description: start and stop abrt daemon
-# Description: Listen to and dispatch crash events
+# Short-Description: Saves segfault data, kernel oopses, fatal exceptions
+# Description: Saves segfault data, kernel oopses, fatal exceptions
### END INIT INFO
# Source function library.
@@ -27,26 +28,21 @@ RETVAL=0
#export http_proxy=
#export https_proxy=
-#
-# See how we were called.
-#
-
check() {
# Check that we're a privileged user
[ "`id -u`" = 0 ] || exit 4
# Check if abrt is executable
- test -x $ABRT_BIN || exit 5
+ test -x "$ABRT_BIN" || exit 5
}
start() {
-
check
# Check if it is already running
- if [ ! -f $LOCK ] && [ ! -f $OLD_LOCK ]; then
+ if [ ! -f "$LOCK" ] && [ ! -f "$OLD_LOCK" ]; then
echo -n $"Starting abrt daemon: "
- daemon $ABRT_BIN
+ daemon "$ABRT_BIN"
RETVAL=$?
[ $RETVAL -eq 0 ] && touch $LOCK
echo
@@ -55,19 +51,17 @@ start() {
}
stop() {
-
check
echo -n $"Stopping abrt daemon: "
- killproc $ABRT_BIN
+ killproc "$ABRT_BIN"
RETVAL=$?
- [ $RETVAL -eq 0 ] && rm -f $LOCK
- [ $RETVAL -eq 0 ] && rm -f $OLD_LOCK
+ [ $RETVAL -eq 0 ] && rm -f "$LOCK"
+ [ $RETVAL -eq 0 ] && rm -f "$OLD_LOCK"
echo
return $RETVAL
}
-
restart() {
stop
start
@@ -95,11 +89,11 @@ restart)
restart
;;
condrestart)
- if [ -f $LOCK ]; then
+ if [ -f "$LOCK" ]; then
restart
fi
# update from older version
- if [ -f $OLD_LOCK ]; then
+ if [ -f "$OLD_LOCK" ]; then
restart
fi
;;
diff --git a/abrt.spec b/abrt.spec
index 43578c19..9c5def8d 100644
--- a/abrt.spec
+++ b/abrt.spec
@@ -28,27 +28,27 @@ Group: Applications/System
URL: https://fedorahosted.org/abrt/
Source: https://fedorahosted.org/released/%{name}/%{name}-%{version}.tar.gz
Source1: abrt.init
+Source2: abrt-ccpp.init
BuildRequires: dbus-devel
BuildRequires: gtk2-devel
BuildRequires: curl-devel
BuildRequires: rpm-devel >= 4.6
BuildRequires: desktop-file-utils
-#BuildRequires: nss-devel
BuildRequires: libnotify-devel
BuildRequires: xmlrpc-c-devel
-BuildRequires: xmlrpc-c-client
BuildRequires: file-devel
BuildRequires: python-devel
BuildRequires: gettext
BuildRequires: libxml2-devel
-BuildRequires: libtar-devel, bzip2-devel, zlib-devel
+BuildRequires: libtar-devel
BuildRequires: intltool
-BuildRequires: bison
+BuildRequires: libtool
%if %{?with_systemd}
Requires: systemd-units
%endif
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
Requires: %{name}-libs = %{version}-%{release}
+Requires: libreport
Requires(pre): shadow-utils
Obsoletes: abrt-plugin-sqlite3 > 0.0.1
# required for transition from 1.1.13, can be removed after some time
@@ -61,6 +61,36 @@ Obsoletes: abrt-plugin-sosreport > 0.0.1
to create a bug report with all informations needed by maintainer to fix it.
It uses plugin system to extend its functionality.
+%package -n libreport
+Summary: Libraries for reporting crashes to different targets.
+Group: System Environment/Libraries
+
+%description -n libreport
+Libraries providing API for reporting different problems in applications
+to different bug targets like bugzilla, ftp, trac, etc...
+
+%package -n libreport-devel
+Summary: Development libraries and headers for libreport.
+Group: Development/Libraries
+
+%description -n libreport-devel
+Development libraries and headers for libreport.
+
+%package -n libreport-python
+Summary: Python bindings for report-libs.
+# Is group correct here? -
+Group: System Environment/Libraries
+
+%description -n libreport-python
+Python bindings for report-libs.
+
+%package -n libreport-gtk
+Summary: GTK frontend for libreport
+Group: User Interface/Desktops
+
+%description -n libreport-gtk
+Applications for reporting bugs using libreport backend.
+
%package libs
Summary: Libraries for %{name}
Group: System Environment/Libraries
@@ -95,7 +125,7 @@ GTK+ wizard for convenient bug reporting.
%package addon-ccpp
Summary: %{name}'s C/C++ addon
Group: System Environment/Libraries
-Requires: elfutils
+Requires: elfutils, cpio
Requires: %{name} = %{version}-%{release}
%description addon-ccpp
@@ -165,6 +195,7 @@ Plugin to report bugs into anonymous FTP site associated with ticketing system.
%package addon-python
Summary: %{name}'s addon for catching and analyzing Python exceptions
Group: System Environment/Libraries
+Requires: python
Requires: %{name} = %{version}-%{release}
Obsoletes: gnome-python2-bugbuddy > 0.0.1
Provides: gnome-python2-bugbuddy
@@ -237,8 +268,7 @@ make install DESTDIR=$RPM_BUILD_ROOT mandir=%{_mandir}
find $RPM_BUILD_ROOT -name '*.la' -or -name '*.a' | xargs rm -f
mkdir -p ${RPM_BUILD_ROOT}/%{_initrddir}
install -m 755 %SOURCE1 ${RPM_BUILD_ROOT}/%{_initrddir}/abrtd
-# /var/cache/abrt is to be removed in 1.3.x timeframe
-mkdir -p $RPM_BUILD_ROOT/var/cache/abrt
+install -m 755 %SOURCE2 ${RPM_BUILD_ROOT}/%{_initrddir}/abrt-ccpp
mkdir -p $RPM_BUILD_ROOT/var/cache/abrt-di
mkdir -p $RPM_BUILD_ROOT/var/run/abrt
mkdir -p $RPM_BUILD_ROOT/var/spool/abrt
@@ -258,35 +288,50 @@ desktop-file-install \
rm -rf $RPM_BUILD_ROOT
%pre
-getent group abrt >/dev/null || groupadd -f --system abrt
-getent passwd abrt >/dev/null || useradd --system -g abrt -d /etc/abrt -s /sbin/nologin abrt
+#uidgid pair 173:173 reserved in setup rhbz#670231
+%define abrt_gid_uid 173
+getent group abrt >/dev/null || groupadd -f -g %{abrt_gid_uid} --system abrt
+getent passwd abrt >/dev/null || useradd --system -g abrt -u %{abrt_gid_uid} -d /etc/abrt -s /sbin/nologin abrt
exit 0
%post
if [ $1 -eq 1 ]; then
-/sbin/chkconfig --add %{name}d
+/sbin/chkconfig --add abrtd
fi
#systemd
%if %{?with_systemd}
#if [ $1 -eq 1 ]; then
# Enable (but don't start) the units by default
- /bin/systemctl enable %{name}d.service >/dev/null 2>&1 || :
+ /bin/systemctl enable abrtd.service >/dev/null 2>&1 || :
#fi
%endif
+%post addon-ccpp
+if [ $1 -eq 1 ]; then
+/sbin/chkconfig --add abrt-ccpp
+fi
+#systemd: TODO
+
%preun
if [ "$1" -eq "0" ] ; then
- service %{name}d stop >/dev/null 2>&1
- /sbin/chkconfig --del %{name}d
+ service abrtd stop >/dev/null 2>&1
+ /sbin/chkconfig --del abrtd
fi
#systemd
%if %{?with_systemd}
if [ "$1" -eq "0" ] ; then
- /bin/systemctl stop %{name}d.service >/dev/null 2>&1 || :
- /bin/systemctl disable %{name}d.service >/dev/null 2>&1 || :
+ /bin/systemctl stop abrtd.service >/dev/null 2>&1 || :
+ /bin/systemctl disable abrtd.service >/dev/null 2>&1 || :
fi
%endif
+%preun addon-ccpp
+if [ "$1" -eq "0" ] ; then
+ service abrt-ccpp stop >/dev/null 2>&1
+ /sbin/chkconfig --del abrt-ccpp
+fi
+#systemd: TODO
+
%postun
#systemd
%if %{?with_systemd}
@@ -315,15 +360,21 @@ fi
%posttrans
if [ "$1" -eq "0" ]; then
- service %{name}d condrestart >/dev/null 2>&1 || :
+ service abrtd condrestart >/dev/null 2>&1 || :
fi
#systemd
%if %{?with_systemd}
if [ "$1" -eq "0" ]; then
- /bin/systemctl try-restart %{name}d.service >/dev/null 2>&1 || :
+ /bin/systemctl try-restart abrtd.service >/dev/null 2>&1 || :
fi
%endif
+%posttrans addon-ccpp
+if [ "$1" -eq "0" ]; then
+ service abrt-ccpp condrestart >/dev/null 2>&1 || :
+fi
+#systemd: TODO
+
%files -f %{name}.lang
%defattr(-,root,root,-)
@@ -336,20 +387,19 @@ fi
%{_sbindir}/abrt-server
%{_bindir}/abrt-handle-upload
%{_bindir}/abrt-handle-crashdump
-%{_libexecdir}/abrt-action-save-package-data
+%{_bindir}/abrt-action-save-package-data
%{_libexecdir}/abrt-retrace-client
%config(noreplace) %{_sysconfdir}/%{name}/abrt.conf
%config(noreplace) %{_sysconfdir}/%{name}/abrt_event.conf
%config(noreplace) %{_sysconfdir}/%{name}/gpg_keys
%config(noreplace) %{_sysconfdir}/dbus-1/system.d/dbus-abrt.conf
-%{_initrddir}/%{name}d
-# /var/cache/abrt is to be removed in 1.3.x timeframe
-%dir %attr(0755, abrt, abrt) %{_localstatedir}/cache/%{name}
+%{_initrddir}/abrtd
%dir %attr(0755, abrt, abrt) %{_localstatedir}/spool/%{name}
%dir %attr(0700, abrt, abrt) %{_localstatedir}/spool/%{name}-upload
-%dir /var/run/%{name}
+%dir %attr(0775, abrt, abrt) %{_localstatedir}/run/%{name}
%dir %{_sysconfdir}/%{name}
%dir %{_sysconfdir}/%{name}/plugins
+%dir %{_sysconfdir}/%{name}/events.d
%dir %{_libdir}/%{name}
%{_mandir}/man8/abrtd.8.gz
%{_mandir}/man5/%{name}.conf.5.gz
@@ -357,20 +407,42 @@ fi
%{_mandir}/man7/%{name}-plugins.7.gz
%{_datadir}/dbus-1/system-services/com.redhat.abrt.service
+%files -n libreport
+%defattr(-,root,root,-)
+%{_libdir}/libreport.so.*
+
+%files -n libreport-devel
+%defattr(-,root,root,-)
+%{_includedir}/report/*
+%{_libdir}/libreport.so
+
+%files -n libreport-python
+%defattr(-,root,root,-)
+%{python_sitearch}/report/*
+
+%files -n libreport-gtk
+%defattr(-,root,root,-)
+%{_bindir}/bug-reporting-wizard
+# If you want to deploy external glade file:
+#%{_datadir}/%{name}/wizard.glade
+
%files libs
%defattr(-,root,root,-)
-%{_libdir}/lib*.so.*
+%{_libdir}/libabrt*.so.*
+%{_libdir}/libbtparser.so.*
%files devel
%defattr(-,root,root,-)
-%{_includedir}/*
-%{_libdir}/lib*.so
+%{_includedir}/abrt/*
+%{_libdir}/libabrt*.so
+%{_libdir}/libbtparser.so
%{_libdir}/pkgconfig/*
%doc doc/abrt-plugin doc/howto-write-reporter
%files gui
%defattr(-,root,root,-)
%{_bindir}/abrt-gui
+%{_bindir}/abrt-gtk
%dir %{_datadir}/%{name}
# all glade, gtkbuilder and py files for gui
%{_datadir}/%{name}/*.py*
@@ -380,68 +452,69 @@ fi
%{_datadir}/icons/hicolor/*/status/*
%{_datadir}/%{name}/icons/hicolor/*/status/*
%{_bindir}/abrt-applet
+#%{_bindir}/test-report
%{_sysconfdir}/xdg/autostart/abrt-applet.desktop
%files addon-ccpp
%defattr(-,root,root,-)
%config(noreplace) %{_sysconfdir}/%{name}/plugins/CCpp.conf
-%dir %{_localstatedir}/cache/abrt-di
-%{_libdir}/%{name}/libCCpp.so*
+%dir %attr(0775, abrt, abrt) %{_localstatedir}/cache/abrt-di
+%attr(2755, abrt, abrt) %{_bindir}/abrt-action-install-debuginfo
+%{_initrddir}/abrt-ccpp
%{_libexecdir}/abrt-hook-ccpp
-%{_libexecdir}/abrt-action-analyze-c
-%{_libexecdir}/abrt-action-install-debuginfo.py*
-%{_libexecdir}/abrt-action-generate-backtrace
+%{_bindir}/abrt-action-analyze-c
+%{_bindir}/abrt-action-install-debuginfo.py*
+%{_bindir}/abrt-action-generate-backtrace
+%{_sysconfdir}/%{name}/events.d/ccpp_events.conf
%files addon-kerneloops
%defattr(-,root,root,-)
%config(noreplace) %{_sysconfdir}/%{name}/plugins/Kerneloops.conf
-%{_bindir}/dumpoops
-%{_libdir}/%{name}/libKerneloopsScanner.so*
-%{_mandir}/man7/abrt-KerneloopsScanner.7.gz
%{_libdir}/%{name}/KerneloopsReporter.glade
%{_mandir}/man7/abrt-KerneloopsReporter.7.gz
-%{_libexecdir}/abrt-action-analyze-oops
-%{_libexecdir}/abrt-action-kerneloops
+%{_bindir}/abrt-dump-oops
+%{_bindir}/abrt-action-analyze-oops
+%{_bindir}/abrt-action-kerneloops
%files plugin-logger
%defattr(-,root,root,-)
%config(noreplace) %{_sysconfdir}/%{name}/plugins/Logger.conf
%{_libdir}/%{name}/Logger.glade
%{_mandir}/man7/abrt-Logger.7.gz
-%{_libexecdir}/abrt-action-print
+%{_bindir}/abrt-action-print
%files plugin-mailx
%defattr(-,root,root,-)
%config(noreplace) %{_sysconfdir}/%{name}/plugins/Mailx.conf
%{_libdir}/%{name}/Mailx.glade
%{_mandir}/man7/abrt-Mailx.7.gz
-%{_libexecdir}/abrt-action-mailx
+%{_bindir}/abrt-action-mailx
%files plugin-bugzilla
%defattr(-,root,root,-)
%config(noreplace) %{_sysconfdir}/%{name}/plugins/Bugzilla.conf
%{_libdir}/%{name}/Bugzilla.glade
%{_mandir}/man7/abrt-Bugzilla.7.gz
-%{_libexecdir}/abrt-action-bugzilla
+%{_bindir}/abrt-action-bugzilla
%files plugin-rhtsupport
%defattr(-,root,root,-)
%config(noreplace) %{_sysconfdir}/%{name}/plugins/RHTSupport.conf
%{_libdir}/%{name}/RHTSupport.glade
# {_mandir}/man7/abrt-RHTSupport.7.gz
-%{_libexecdir}/abrt-action-rhtsupport
+%{_bindir}/abrt-action-rhtsupport
%files plugin-reportuploader
%defattr(-,root,root,-)
%config(noreplace) %{_sysconfdir}/%{name}/plugins/Upload.conf
%{_libdir}/%{name}/Upload.glade
%{_mandir}/man7/abrt-Upload.7.gz
-%{_libexecdir}/abrt-action-upload
+%{_bindir}/abrt-action-upload
%files addon-python
%defattr(-,root,root,-)
%config(noreplace) %{_sysconfdir}/%{name}/plugins/Python.conf
-%{_libexecdir}/abrt-action-analyze-python
+%{_bindir}/abrt-action-analyze-python
%{python_site}/*.py*
%{python_site}/abrt.pth
diff --git a/configure.ac b/configure.ac
index 8436c34e..bf10138d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -47,6 +47,12 @@ PKG_CHECK_MODULES([LIBNOTIFY], [libnotify])
PKG_CHECK_MODULES([NSS], [nss])
PKG_CHECK_MODULES([XMLRPC], [xmlrpc])
PKG_CHECK_MODULES([XMLRPC_CLIENT], [xmlrpc_client])
+# Just PKG_CHECK_MODULES([PYTHON], [python]) works only with python2.7+
+# Below, if python is not found, we set up for python2.6 w/o checking:
+PKG_CHECK_MODULES([PYTHON], [python],,[
+ PYTHON_LIBS='-L/usr/lib64 -lpython2.6'
+ PYTHON_CFLAGS='-I/usr/include/python2.6'
+])
PKG_PROG_PKG_CONFIG
AC_ARG_WITH([systemdsystemunitdir],
@@ -58,15 +64,13 @@ AM_CONDITIONAL(HAVE_SYSTEMD, [test -n "$with_systemdsystemunitdir"])
AC_CHECK_HEADER([libtar.h], [],
[AC_MSG_ERROR([libtar.h is needed to build abrt])])
-AC_CHECK_HEADER([bzlib.h], [],
- [AC_MSG_ERROR([bzlib.h is needed to build abrt])])
-
AC_CHECK_HEADER([sys/inotify.h], [],
[AC_MSG_ERROR([sys/inotify.h is needed to build abrt])])
CONF_DIR='${sysconfdir}/${PACKAGE_NAME}'
VAR_RUN='${localstatedir}/run'
PLUGINS_CONF_DIR='${sysconfdir}/${PACKAGE_NAME}/plugins'
+EVENTS_CONF_DIR='${sysconfdir}/${PACKAGE_NAME}/events.d'
PLUGINS_LIB_DIR='${libdir}/${PACKAGE_NAME}'
ENABLE_SOCKET_OR_DBUS='-DENABLE_DBUS=1'
LIBEXEC_DIR='${libexecdir}'
@@ -99,10 +103,10 @@ AC_SUBST(ENABLE_SOCKET_OR_DBUS)
AC_SUBST(CONF_DIR)
AC_SUBST(VAR_RUN)
AC_SUBST(PLUGINS_CONF_DIR)
+AC_SUBST(EVENTS_CONF_DIR)
AC_SUBST(PLUGINS_LIB_DIR)
AC_SUBST(DEBUG_DUMPS_DIR)
AC_SUBST(DEBUG_INFO_DIR)
-AC_SUBST(DL_LIBS, -ldl)
AC_SUBST(LIBEXEC_DIR)
# Initialize the test suite.
@@ -119,6 +123,7 @@ AC_CONFIG_FILES([
abrt.pc
src/include/Makefile
src/lib/Makefile
+ src/report-python/Makefile
src/plugins/Makefile
src/Makefile
src/btparser/Makefile
@@ -126,6 +131,8 @@ AC_CONFIG_FILES([
src/hooks/Makefile
src/applet/Makefile
src/gui/Makefile
+ src/gui-gtk/Makefile
+ src/gui-wizard-gtk/Makefile
src/cli/Makefile
src/retrace/Makefile
po/Makefile.in
diff --git a/doc/TODO_crash_dump_fields b/doc/TODO_crash_dump_fields
new file mode 100644
index 00000000..39ae3b8c
--- /dev/null
+++ b/doc/TODO_crash_dump_fields
@@ -0,0 +1,131 @@
+ Planned changes to crash_data and dump_dir structures
+
+ Time field(s)
+
+Need to add CD_FLAG_UNIXTIME bit for struct crash_item's flags field.
+It should be set on cd["time"] item when we do
+
+ cd = call create_crash_data_from_dump_dir(dd);
+
+Note that later we may add other elements beside "time" which contain
+unix time.
+
+Need to add a function which formats time elements for printing.
+Something like this:
+
+const char *printable_form_of_crash_item(const char *content, unsigned flags);
+
+For most fields it should return them as-is, for CD_FLAG_UNIXTIME
+fields it should return malloced "YYYY-MM-DD hh:mm:ss" string.
+
+Later, if/when we will get more CD_FLAG_FOO flags, some of them also
+may need special formatting, and this function can deal with them too.
+
+[Implementation note: use the following trick to avoid needing to return
+malloced data (which isn't convenient for caller, it needs to free it):
+
+printable_form_of_crash_item(...)
+{
+ ...
+ if (need to use malloced string)
+ {
+ s = malloc_and_format_string();
+
+ static unsigned malloced_idx = 0;
+ static char *malloced_vec[8];
+
+ malloced_idx = (malloced_idx+1) % 8;
+ free(malloced_vec[malloced_idx]);
+ malloced_vec[malloced_idx] = s;
+ }
+ else
+ s = some_non_malloced_string;
+ ...
+ return s;
+}
+]
+
+dd_load_text_ext(dd, "time", flags) may benefit from a new flag DD_LOAD_TEXT_PRINTABLE,
+which makes it generate printable representation of fields.
+
+
+ Reduce amount of special-casing in the code which works with crash_data
+
+Examples:
+
+Reporters use something like this to exclude "non-interesting" fields:
+
+for (each crash_data element)
+{
+ if (strcmp(short_name, FILENAME_COUNT) == 0) goto next;
+ if (strcmp(short_name, CD_DUMPDIR) == 0) goto next;
+ if (strcmp(short_name, FILENAME_INFORMALL) == 0) goto next;
+ if (strcmp(short_name, FILENAME_MESSAGE) == 0) goto next; // plugin's status message (if we already reported it yesterday)
+ ...
+}
+
+ write_crash_report_field(fp, report, FILENAME_COMMENT,
+ _("# Describe the circumstances of this crash below"));
+ write_crash_report_field(fp, report, FILENAME_REPRODUCE,
+ _("# How to reproduce the crash?"));
+ write_crash_report_field(fp, report, FILENAME_BACKTRACE,
+ _("# Backtrace\n# Check that it does not contain any sensitive data (passwords, etc.)"));
+ write_crash_report_field(fp, report, FILENAME_DUPHASH, "# DUPHASH");
+ write_crash_report_field(fp, report, FILENAME_ARCHITECTURE, _("# Architecture"));
+ write_crash_report_field(fp, report, FILENAME_CMDLINE, _("# Command line"));
+ write_crash_report_field(fp, report, FILENAME_COMPONENT, _("# Component"));
+ write_crash_report_field(fp, report, FILENAME_COREDUMP, _("# Core dump"));
+ write_crash_report_field(fp, report, FILENAME_EXECUTABLE, _("# Executable"));
+ write_crash_report_field(fp, report, FILENAME_KERNEL, _("# Kernel version"));
+ write_crash_report_field(fp, report, FILENAME_PACKAGE, _("# Package"));
+ write_crash_report_field(fp, report, FILENAME_REASON, _("# Reason of crash"));
+ write_crash_report_field(fp, report, FILENAME_OS_RELEASE, _("# Release string of the operating system"));
+
+ printf(_("Dump directory: %s\n"
+ "Last crash: %s\n"
+ "Analyzer: %s\n"
+ "Component: %s\n"
+ "Package: %s\n"
+ "Command: %s\n"
+ "Executable: %s\n"
+ "System: %s, kernel %s\n"
+ "Reason: %s\n"),
+ get_crash_item_content_or_die(crash_data, CD_DUMPDIR),
+ timeloc,
+ get_crash_item_content_or_die(crash_data, FILENAME_ANALYZER),
+ get_crash_item_content_or_die(crash_data, FILENAME_COMPONENT),
+ get_crash_item_content_or_die(crash_data, FILENAME_PACKAGE),
+ get_crash_item_content_or_die(crash_data, FILENAME_CMDLINE),
+ get_crash_item_content_or_die(crash_data, FILENAME_EXECUTABLE),
+ get_crash_item_content_or_die(crash_data, FILENAME_OS_RELEASE),
+ get_crash_item_content_or_die(crash_data, FILENAME_KERNEL),
+ get_crash_item_content_or_die(crash_data, FILENAME_REASON)
+ );
+
+Can it be done better, so that we dont need to rewrite each of these places
+every time we add a new field?
+
+
+ "log" element
+
+Currently, we only save last reporter's message into "message" element.
+
+Is there a value in replacing/extending this functionality with multi-line,
+timestamped log saved in dump dir? Something along the lines of:
+
+YYYY-MM-DD hh:mm:ss <stat> <text>
+
+<text> is output lines of run_event_on_FOO() calls.
+One special case is when reporter exits (or dies from signal like SIGSEGV)
+without producing any output. In this case, we ourself may generate
+a message like "abrt-action-bugzilla: killed byu SIGSEGV".
+
+<stat> is a failure indicator. We already consider last line logged
+from event processing as its success/failure message, but we don't save
+success/failure status per se. <stat> is this place.
+In the most simple case it may be a '+' or '-' char, or space
+for non-final log messages.
+
+In order to not overflow the log, I propose to delete oldest lines
+when we reach, say, 10000 lines (which limits it to ~100k).
+
diff --git a/doc/abrt-plugin/abrt-reporter-hello-world.cpp b/doc/abrt-plugin/abrt-reporter-hello-world.cpp
index 30a55e88..471e5087 100644
--- a/doc/abrt-plugin/abrt-reporter-hello-world.cpp
+++ b/doc/abrt-plugin/abrt-reporter-hello-world.cpp
@@ -18,7 +18,6 @@
*/
#include <abrt/abrtlib.h>
-#include <abrt/abrt_exception.h>
#include "abrt-reporter-hello-world.h"
std::string CHelloWorld::Report(const map_crash_data_t& pCrashData,
diff --git a/doc/design b/doc/design
index 6074457b..5da16cc2 100644
--- a/doc/design
+++ b/doc/design
@@ -40,68 +40,76 @@ to a dedicated server(s) for processing (backtrace, etc).
Abrt design should be flexible enough to accomodate all
of the above usage scenarios.
-The description below is not what abrt does now.
-It is (currently incomplete) design notes on how we want
-it to achieve design goals.
-
Since currently we do not know how to dump oops on demand,
-we can only poll for it. There is a small daemon which polls
-kernel message buffer and dumps oopses when it sees them.
-The dump is written into /var/spool/abrt/DIR.
-After this, daemon spawns "abrt-process -d /var/spool/abrt/DIR"
-which processes it according to configuration in /etc/abrt/*.conf.
+we can only poll for it. There is a small daemon, abrt-dump-oops,
+which polls syslog file and saves oopses when it sees them.
+The oops dump is written into /var/spool/abrt/DIR.
+[TODO? abrt-dump-oops spawns "abrt-handle-crashdump -d /var/spool/abrt/DIR"
+which processes it according to configuration in /etc/abrt/*.conf]
In order to catch binary crashes, we install a handler for it
in /proc/sys/kernel/core_pattern (by setting it to
-"|/usr/libexec/abrt-hook-ccpp /var/spool/abrt %p %s %u").
+"|/usr/libexec/abrt-hook-ccpp /var/spool/abrt ....").
When process dumps core, the dump is written into /var/spool/abrt/DIR.
-After this, abrt-hook-ccpp spawns "abrt-process -d /var/spool/abrt/DIR"
-and terminates.
-
-When python program crashes, it invokes internel python subroutine
-which dumps crash info into ~/abrt/spool/DIR.
-[this is a tentative plan, currently we dump in /var/spool/abrt/DIR]
-After this, it spawns "abrt-process -d ~/abrt/spool/DIR"
-and terminates.
-
-[Problem: dumping to /var/spool/abrt/DIR needs world-writable
-/var/spool/abrt and allows user to go way over his
-disk quota. Dumping to ~/abrt/spool/DIR makes it difficult
-to present a list of all crashes which happened on the machine -
-for example, root-owned processes cannot even access user data
-in ~user/* if /home is on NFS4...
-]
+[TODO? after this, abrt-hook-ccpp spawns "abrt-handle-crashdump
+-d /var/spool/abrt/DIR"]
+Then abrt-hook-ccpp terminates.
+
+When python program crashes, it invokes internal python subroutine
+which connects to abrtd via /var/run/abrt/abrt.socket and sends
+crash data to abrtd. abrtd creates dump dir /var/spool/abrt/DIR.
+
+abrtd daemon watches /var/spool/abrt for new directories.
+When new directory is noticed, abrtd runs "post-create" event
+on it, and emits a dbus signal. This dbus signal is used
+to inform online users about the new crash: if abrt-applet
+is running in X session, it sees the signal and starts blinking.
+
+[The above scheme is somewhat suboptimal. It's stupid that abrtd
+uses inotify to watch for crashes. Instead the programs which create crashes
+can trigger their initial ("post-create") processing themselves]
+
+Crashes conceptually go through "events" in their lives.
+Apart from "post-create" event decribed above, they may have
+"analyze" event, "reanalyze" event, "report[_FOO]" events,
+ans arbitrarily-named other events.
+abrt-handle-crashdump tool can be used to "run" an event on a directory,
+or to query list of possible events for a directory.
+/etc/abrt/abrt_event.conf file describes what should be done on each event.
When user (admin) wants to see the list of dumped crashes and
process them, he runs abrt-gui or abrt-cli. These programs
perform a dbus call to "com.redhat.abrt" on a system dbus.
If there is no program with this name on it, dbus autostart
-will invoke "abrt-process", which registers "com.redhat.abrt"
+will invoke abrtd, which registers "com.redhat.abrt"
and processes the call(s).
-abrt-process will terminate after a timeout (a few minutes)
-if no new dbus calls are arriving to it.
-
-The key dbus calls served by abrt-process are:
+The key dbus calls served by abrtd are:
- GetCrashInfos(): returns a vector_map_crash_data_t (vector_map_vector_string_t)
of crashes for given uid
v[N]["executable"/"uid"/"kernel"/"backtrace"][N] = "contents"
-[see above the problem with producing this list]
-- CreateReport(UUID): starts creating a report for /var/spool/abrt/DIR with this UUID.
+- CreateReport(/var/spool/abrt/DIR): starts creating a report.
Returns job id (uint64).
- After it returns, when report creation thread has finished,
- JobDone(client_dbus_ID,UUID) dbus signal is emitted.
+ Then abrtd run "analyze" event on the DIR.
+ After it completes, when report creation thread has finished,
+ JobDone(client_dbus_ID,/var/spool/abrt/DIR) dbus signal is emitted.
[Problem: how to do privilegged plugin specific actions?]
Solution: if plugin needs an access to some root only accessible dir then
abrt should be run by root anyway
- debuginfo gets installed using pk-debuginfo-install, which cares about
privileges itself, so no problem here
-- GetJobResult(UUID): returns map_crash_data_t (map_vector_string_t)
+- GetJobResult(/var/spool/abrt/DIR): returns map_crash_data_t (map_vector_string_t)
- Report(map_crash_data_t (map_vector_string_t)):
- "Please report this crash": calls Report() of all registered reporter plugins
- Returns report_status_t (map_vector_string_t) - the status of each call
-- DeleteDebugDump(UUID): delete corresponding /var/spool/abrt/DIR. Returns bool
+ "Please report this crash":
+ abrtd run "report[_FOO]" event(s) on the DIR.
+ Returns report_status_t (map_vector_string_t) - the status of each event
+- DeleteDebugDump(/var/spool/abrt/DIR): delete /var/spool/abrt/DIR. Returns bool
+
+[Note: we are in the process of reducing/eliminating
+dbus communication between abrt-gui/abrt-cli and abrtd.
+It seems we will be able to reduce dbus messages to "crash occurred"
+signal and "DeleteDebugDump(DIR)" call]
Development plan
@@ -112,17 +120,17 @@ change the code to "morph" it into the desired shape.
Done:
* Make abrtd dbus startable.
-* Add -t TIMEOUT_SEC option to abrtd. {done}
+* Add -t TIMEOUT_SEC option to abrtd.
* Make abrt-gui start abrtd on demand, so that abrt-gui can be started
- even if abrtd does not run at the moment. (doesn't work in some cases!)
-
-Planned steps:
-
+ even if abrtd does not run at the moment.
* make kerneloops plugin into separate daemon (convert it to a hook
and get rid of "cron plugins" which are wrong idea since the begining)
- - and make it to the service (write an initscript)
* make C/C++ hook to be started by init script
- - init scritp would run ccpp-hook --init whic shoudl just set the core_pattern, which is now done by the C analyzer plugin
+* add "include FILE" feature to abrt_event.conf
+
+Planned steps:
+
+* make kerneloops plugin into separate service?
* hooks will start the daemon on-demand using dbus
- this is something I'm not sure if it's good idea, but dbus is becoming
to be "un-installable" on Fedora, it's probably ok
diff --git a/doc/interpreted-languages b/doc/interpreted-languages
index e79a1321..0853556d 100644
--- a/doc/interpreted-languages
+++ b/doc/interpreted-languages
@@ -66,7 +66,7 @@ archive, a script file, a bytecode file, or the interpreter. It should
be a real file on the filesystem, so ABRT can check the origin of the
file (source package). If the file is not known, the most appropriate
is to shortly describe the reason why it is not known in the field.
-However, exceptions raised from interactive shell (a common reason
+However, exceptions raised from interactive shell (a common reason
for unknown file) are hardly useful and should not be reported.
ANALYZER
diff --git a/examples/cut_here.right b/examples/cut_here.right
index b5970f03..28548d1a 100644
--- a/examples/cut_here.right
+++ b/examples/cut_here.right
@@ -1,4 +1,4 @@
-dumpoops: found oopses: 1
+abrt-dump-oops: Found oopses: 1
Version: 2.6.32-19.el6.x86_64
WARNING: at arch/x86/kernel/cpu/mtrr/generic.c:467
diff --git a/examples/not_oops1.right b/examples/not_oops1.right
index 5f2c00f0..64c3a19a 100644
--- a/examples/not_oops1.right
+++ b/examples/not_oops1.right
@@ -1 +1 @@
-dumpoops: found oopses: 0
+abrt-dump-oops: Found oopses: 0
diff --git a/examples/not_oops2.right b/examples/not_oops2.right
index 5f2c00f0..64c3a19a 100644
--- a/examples/not_oops2.right
+++ b/examples/not_oops2.right
@@ -1 +1 @@
-dumpoops: found oopses: 0
+abrt-dump-oops: Found oopses: 0
diff --git a/examples/not_oops2.test b/examples/not_oops2.test
index da0f35c1..0373079d 100644
--- a/examples/not_oops2.test
+++ b/examples/not_oops2.test
@@ -39,7 +39,6 @@ Jan 12 19:08:41 kids1 kernel: =======================
Jan 12 19:08:41 kids1 kernel: Code: 66 31 d2 09 c2 89 d8 e8 fc e7 ff ff 8b 83 cc 00 00 00 8b 53 34 03 10 8b 86 70 02 00 00 2b 50 44
Jan 12 19:08:41 kids1 kernel: EIP: [<f88dec25>] radeon_cp_init_ring_buffer+0x90/0x302 [radeon] SS:ESP 0068:f0a0cf08
Jan 12 19:08:41 kids1 kernel: ---[ end trace 81e3cf9431f7af0c ]---
-Nov 9 15:43:47 abrtd: Activating plugin: KerneloopsScanner
Nov 9 15:43:47 abrtd: Scanning syslog...
Nov 9 15:43:47 abrtd: Locked '/var/spool/abrt/kerneloops-1257777827-1.lock'
Nov 9 15:43:47 abrtd: UnLocked '/var/spool/abrt/kerneloops-1257777827-1.lock'
diff --git a/examples/not_oops3.right b/examples/not_oops3.right
index 5f2c00f0..64c3a19a 100644
--- a/examples/not_oops3.right
+++ b/examples/not_oops3.right
@@ -1 +1 @@
-dumpoops: found oopses: 0
+abrt-dump-oops: Found oopses: 0
diff --git a/examples/oops1.right b/examples/oops1.right
index 67005199..2e642e72 100644
--- a/examples/oops1.right
+++ b/examples/oops1.right
@@ -1,4 +1,4 @@
-dumpoops: found oopses: 1
+abrt-dump-oops: Found oopses: 1
Version: 2.6.27.9-159.fc10.i686 #1
BUG: unable to handle kernel NULL pointer dereference at 00000000
diff --git a/examples/oops2.right b/examples/oops2.right
index 1a6f7447..4d2f7ba7 100644
--- a/examples/oops2.right
+++ b/examples/oops2.right
@@ -1,4 +1,4 @@
-dumpoops: found oopses: 1
+abrt-dump-oops: Found oopses: 1
Version: 2.6.33.1-19.fc13.x86_64
[ INFO: possible recursive locking detected ]
diff --git a/examples/oops3.right b/examples/oops3.right
index 86c4f431..7f68e690 100644
--- a/examples/oops3.right
+++ b/examples/oops3.right
@@ -1,4 +1,4 @@
-dumpoops: found oopses: 3
+abrt-dump-oops: Found oopses: 3
Version: 2.6.32-0.51.rc7.git2.fc13.x86_64
general protection fault: 0000 [#1] SMP
diff --git a/examples/test.sh b/examples/test.sh
index 6c704faa..8f7566fb 100755
--- a/examples/test.sh
+++ b/examples/test.sh
@@ -1,7 +1,7 @@
for f in *.test; do
- b="${f%%.test}"
- dumpoops -s "$f" >"$b".out 2>&1
- if diff -u "$b".right "$b".out >"$b".diff 2>&1; then
- rm "$b".out "$b".diff
- fi
+ b="${f%%.test}"
+ abrt-dump-oops -o "$f" >"$b".out 2>&1
+ if diff -u "$b".right "$b".out >"$b".diff 2>&1; then
+ rm "$b".out "$b".diff
+ fi
done
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 666d3c69..fc5efee8 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -2,11 +2,13 @@
# List of source files containing translatable strings.
# Please keep this file sorted alphabetically.
src/applet/abrt-applet.desktop.in
-src/applet/Applet.cpp
+src/applet/applet.c
src/applet/applet_gtk.c
src/cli/CLI.cpp
src/cli/report.cpp
+src/daemon/abrt-action-save-package-data.c
src/daemon/abrt-handle-crashdump.c
+src/daemon/abrt-server.c
src/daemon/CommLayerServerDBus.cpp
src/daemon/Daemon.cpp
src/daemon/MiddleWare.cpp
@@ -21,8 +23,6 @@ src/gui/CCDump.py
src/gui/CC_gui_functions.py
src/gui/ccgui.glade
src/gui/CCMainWindow.py
-src/gui/CCReporterDialog.py
-src/gui/CellRenderers.py
src/gui/ConfBackend.py
src/gui/CReporterAssistant.py
src/gui/dialogs.glade
@@ -42,15 +42,14 @@ src/plugins/abrt-action-analyze-python.c
src/plugins/abrt-action-bugzilla.cpp
src/plugins/abrt-action-generate-backtrace.c
src/plugins/abrt-action-install-debuginfo.py
-src/plugins/abrt-action-kerneloops.cpp
-src/plugins/abrt-action-mailx.cpp
-src/plugins/abrt-action-print.cpp
-src/plugins/abrt-action-rhtsupport.cpp
-src/plugins/abrt-action-upload.cpp
+src/plugins/abrt-action-kerneloops.c
+src/plugins/abrt-action-mailx.c
+src/plugins/abrt-action-print.c
+src/plugins/abrt-action-rhtsupport.c
+src/plugins/abrt-action-upload.c
+src/plugins/abrt-dump-oops.c
src/plugins/Bugzilla.glade
-src/plugins/CCpp.cpp
src/plugins/KerneloopsReporter.glade
-src/plugins/KerneloopsScanner.cpp
src/plugins/Logger.glade
src/plugins/Mailx.glade
src/plugins/RHTSupport.glade
diff --git a/po/bn_IN.po b/po/bn_IN.po
index 8ece9ae3..df63927b 100644
--- a/po/bn_IN.po
+++ b/po/bn_IN.po
@@ -2,20 +2,20 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
-# Runa Bhattacharjee <runab@redhat.com>, 2009, 2010.
+# Runa Bhattacharjee <runab@redhat.com>, 2009, 2010, 2011.
msgid ""
msgstr ""
"Project-Id-Version: abrt.master\n"
"Report-Msgid-Bugs-To: jmoskovc@redhat.com\n"
-"POT-Creation-Date: 2010-11-29 13:51+0100\n"
-"PO-Revision-Date: 2010-08-02 14:04+0530\n"
-"Last-Translator: Runa Bhattacharjee <runab@redhat.com>\n"
-"Language-Team: Bengali INDIA <anubad@lists.ankur.org.in>\n"
-"Language: \n"
+"POT-Creation-Date: 2010-12-09 09:15+0000\n"
+"PO-Revision-Date: 2011-01-03 15:32+0530\n"
+"Last-Translator: \n"
+"Language-Team: American English <kde-i18n-doc@kde.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.11.4\n"
+"Language: \n"
+"X-Generator: Lokalize 1.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../src/applet/abrt-applet.desktop.in.h:1
@@ -47,8 +47,7 @@ msgid "Warning"
msgstr "সতরà§à¦•à¦¬à¦¾à¦°à§à¦¤à¦¾"
#: ../src/applet/applet_gtk.c:230
-msgid ""
-"Notification area applet that notifies users about issues detected by ABRT"
+msgid "Notification area applet that notifies users about issues detected by ABRT"
msgstr ""
"ABRT দà§à¦¬à¦¾à¦°à¦¾ সনাকà§à¦¤ করা সমসà§à¦¯à¦¾ সমà§à¦¬à¦¨à§à¦§à§‡ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦°à¦•à§‡ সূচিত করার উদà§à¦¦à§‡à¦¶à§à¦¯à§‡, "
"বিজà§à¦žà¦ªà§à¦¤à¦¿à¦¸à§à¦¥à¦²à§‡ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦¯à§‹à¦—à§à¦¯ অà§à¦¯à¦¾à¦ªà§à¦²à§‡à¦Ÿ"
@@ -69,8 +68,8 @@ msgstr "রিপোরà§à¦Ÿ"
msgid "Open ABRT"
msgstr "ABRT আরমà§à¦­ করà§à¦¨"
-#: ../src/cli/CLI.cpp:47
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:46
+#, c-format
msgid ""
"\tCrash dump : %s\n"
"\tUID : %s\n"
@@ -79,8 +78,8 @@ msgid ""
"\tCrash Time : %s\n"
"\tCrash Count: %s\n"
msgstr ""
-"\tUID : %s\n"
-"\tUUID : %s\n"
+"\tকà§à¦°à§à¦¯à¦¾à¦¶ ডামà§à¦ª : %s\n"
+"\tUID : %s\n"
"\tপà§à¦¯à¦¾à¦•à§‡à¦œ : %s\n"
"\tà¦à¦•à§à¦¸à§‡à¦•à¦¿à¦‰à¦Ÿà§‡à¦¬à¦² : %s\n"
"\tবিপরà§à¦¯à§Ÿà§‡à¦° সময়কাল : %s\n"
@@ -92,7 +91,7 @@ msgid "\tHostname : %s\n"
msgstr "\tহোসà§à¦Ÿ-নেম : %s\n"
#: ../src/cli/CLI.cpp:98
-#, fuzzy, c-format
+#, c-format
msgid ""
"Dump directory: %s\n"
"Last crash: %s\n"
@@ -104,7 +103,7 @@ msgid ""
"System: %s, kernel %s\n"
"Reason: %s\n"
msgstr ""
-"বিপরà§à¦¯à§Ÿà§‡à¦° ID: %s:%s\n"
+"ডামà§à¦ª ডিরেকà§à¦Ÿà¦°à¦¿: %s\n"
"সরà§à¦¬à¦¶à§‡à¦· বিপরà§à¦¯à§Ÿ: %s\n"
"বিশà§à¦²à§‡à¦·à¦£à¦•à¦¾à¦°à§€: %s\n"
"অংশ: %s\n"
@@ -112,31 +111,29 @@ msgstr ""
"কমানà§à¦¡: %s\n"
"à¦à¦•à§à¦¸à§‡à¦•à¦¿à¦‰à¦Ÿà§‡à¦¬à¦²: %s\n"
"সিসà§à¦Ÿà§‡à¦®: %s, kernel %s\n"
-"মাতà§à¦°à¦¾: %s\n"
-"কোর-ডামà§à¦ª ফাইল: %s\n"
"কারণ: %s\n"
-#: ../src/cli/CLI.cpp:125
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:126
+#, c-format
msgid "Coredump file: %s\n"
-msgstr "বিপরà§à¦¯à§Ÿ সংকà§à¦°à¦¾à¦¨à§à¦¤ করà§à¦®: %s\n"
+msgstr "Coredump ফাইল: %s\n"
-#: ../src/cli/CLI.cpp:129
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:130
+#, c-format
msgid "Rating: %s\n"
-msgstr "হোসà§à¦Ÿ-নেম : %s\n"
+msgstr "গà§à¦°à§à¦¤à§à¦¬à§‡à¦° মাতà§à¦°à¦¾: %s\n"
-#: ../src/cli/CLI.cpp:134
+#: ../src/cli/CLI.cpp:135
#, c-format
msgid "Crash function: %s\n"
msgstr "বিপরà§à¦¯à§Ÿ সংকà§à¦°à¦¾à¦¨à§à¦¤ করà§à¦®: %s\n"
-#: ../src/cli/CLI.cpp:138
+#: ../src/cli/CLI.cpp:139
#, c-format
msgid "Hostname: %s\n"
msgstr "হোসà§à¦Ÿ-নেম : %s\n"
-#: ../src/cli/CLI.cpp:142
+#: ../src/cli/CLI.cpp:143
#, c-format
msgid ""
"\n"
@@ -147,7 +144,7 @@ msgstr ""
"পà§à¦¨à¦°à¦¾à§Ÿ সঞà§à¦šà¦¾à¦²à¦¨à¦¾à¦° পদà§à¦§à¦¤à¦¿:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:146
+#: ../src/cli/CLI.cpp:147
#, c-format
msgid ""
"\n"
@@ -158,7 +155,7 @@ msgstr ""
"বিবৃতি:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:152
+#: ../src/cli/CLI.cpp:153
#, c-format
msgid ""
"\n"
@@ -171,13 +168,14 @@ msgstr ""
# Excluding to preserve display in the terminal
#. Message has embedded tabs.
-#: ../src/cli/CLI.cpp:243
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:248
+#, c-format
msgid ""
"Usage: %s [OPTION]\n"
"\n"
"Startup:\n"
"\t-V, --version\t\tdisplay the version of %s and exit\n"
+"\t-v, --verbose\t\tincrease verbosity\n"
"\t-?, --help\t\tprint this help\n"
"\n"
"Actions:\n"
@@ -198,6 +196,7 @@ msgstr ""
"\n"
"Startup:\n"
"\t-V, --version\t\tdisplay the version of %s and exit\n"
+"\t-v, --verbose\t\tincrease verbosity\n"
"\t-?, --help\t\tprint this help\n"
"\n"
"Actions:\n"
@@ -211,11 +210,10 @@ msgstr ""
"\t -b, --backtrace\tprint detailed information about a crash including "
"backtrace\n"
"CRASH_ID can be:\n"
-"\tUID:UUID pair,\n"
-"\tunique UUID prefix - the crash with matching UUID will be acted upon\n"
+"\ta name of dump directory, or\n"
"\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
-#: ../src/cli/CLI.cpp:287
+#: ../src/cli/CLI.cpp:292
msgid "You must specify exactly one operation"
msgstr "শà§à¦§à§à¦®à¦¾à¦¤à§à¦° à¦à¦•à¦Ÿà¦¿ করà§à¦® নিরà§à¦§à¦¾à¦°à¦£ করা যাবে"
@@ -297,104 +295,107 @@ msgstr ""
"রিপোরà§à¦Ÿà§‡à¦° মধà§à¦¯à§‡ কোনো পরিবরà§à¦¤à¦¨ সনাকà§à¦¤ করা যায়নি"
#. The response might take more than 1 char in non-latin scripts.
-#: ../src/cli/report.cpp:464
+#: ../src/cli/report.cpp:445
msgid "y"
-msgstr ""
+msgstr "y"
-#: ../src/cli/report.cpp:465
+#: ../src/cli/report.cpp:446
msgid "N"
-msgstr ""
+msgstr "N"
#. Read the missing information and push it to plugin settings.
-#: ../src/cli/report.cpp:565
+#: ../src/cli/report.cpp:572
#, c-format
msgid "Wrong settings were detected for plugin %s\n"
msgstr "%s পà§à¦²à¦¾à¦—-ইনের জনà§à¦¯ ভà§à¦² বৈশিষà§à¦Ÿà§à¦¯ সনাকà§à¦¤ করা হয়েছে\n"
-#: ../src/cli/report.cpp:569
+#: ../src/cli/report.cpp:576
msgid "Enter your login: "
msgstr "লগ-ইন লিখà§à¦¨: "
-#: ../src/cli/report.cpp:575
+#: ../src/cli/report.cpp:582
msgid "Enter your password: "
msgstr "পাসওয়ারà§à¦¡ লিখà§à¦¨: "
-#: ../src/cli/report.cpp:638
+#: ../src/cli/report.cpp:648
msgid "Reporting..."
msgstr "রিপোরà§à¦Ÿ দায়ের..."
-#: ../src/cli/report.cpp:657
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:667
+#, c-format
msgid "Report using %s?"
-msgstr "%s সহযোগে রিপোরà§à¦Ÿ দায়ের করা হবে কি? [y/N]: "
+msgstr "%s সহযোগে রিপোরà§à¦Ÿ দায়ের করা হবে কি?"
-#: ../src/cli/report.cpp:660
+#: ../src/cli/report.cpp:670
msgid "Skipping..."
msgstr "উপেকà§à¦·à¦¾ করা হচà§à¦›à§‡..."
-#: ../src/cli/report.cpp:672
-#, fuzzy
+#: ../src/cli/report.cpp:682
msgid "Reporting disabled because the backtrace is unusable"
msgstr ""
-"বà§à¦¯à¦¾à¦•-টà§à¦°à§‡à¦¸ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦¯à§‹à¦—à§à¦¯ না হওয়ার ফলে রিপোরà§à¦Ÿ দায়ের করার বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾ নিষà§à¦•à§à¦°à¦¿à§Ÿ করা হয়েছে।"
+"বà§à¦¯à¦¾à¦•-টà§à¦°à§‡à¦¸ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦¯à§‹à¦—à§à¦¯ না হওয়ার ফলে রিপোরà§à¦Ÿ দায়ের করার বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾ নিষà§à¦•à§à¦°à¦¿à§Ÿ করা হয়েছে"
-#: ../src/cli/report.cpp:676
+#: ../src/cli/report.cpp:686
#, c-format
msgid ""
"Please try to install debuginfo manually using the command: \"debuginfo-"
"install %s\" and try again\n"
msgstr ""
+"চিহà§à¦¨à¦¿à¦¤ কমানà§à¦¡ সহযোগে অনà§à¦—à§à¦°à¦¹ করে সà§à¦¬à§Ÿà¦‚ debuginfo ইনসà§à¦Ÿà¦² করার পà§à¦°à§Ÿà¦¾à¦¸ করে পà§à¦¨à¦°à¦¾à§Ÿ "
+"পà§à¦°à¦šà§‡à¦·à§à¦Ÿà¦¾ করà§à¦¨: \"debuginfo-"
+"install %s\"\n"
-#: ../src/cli/report.cpp:685
-#, fuzzy
+#: ../src/cli/report.cpp:695
msgid "Error loading reporter settings"
-msgstr "রিপোরà§à¦Ÿ পà§à¦°à¦¾à¦ªà§à¦¤ করতে বà§à¦¯à¦°à§à¦¥: %s"
+msgstr "রিপোরà§à¦Ÿà¦¾à¦°à§‡à¦° বৈশিষà§à¦Ÿà§à¦¯ লোড করতে তà§à¦°à§à¦Ÿà¦¿"
-#: ../src/cli/report.cpp:704
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:716
+#, c-format
msgid "Crash reported via %d report events (%d errors)\n"
-msgstr "%d পà§à¦²à¦¾à¦—-ইনের মাধà§à¦¯à¦®à§‡ বিপরà§à¦¯à§Ÿà§‡à¦° রিপোরà§à¦Ÿ দায়ের করা হয়েছে (%d-টি তà§à¦°à§à¦Ÿà¦¿)\n"
+msgstr "%d রিপোরà§à¦Ÿ বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦° মাধà§à¦¯à¦®à§‡ বিপরà§à¦¯à§Ÿà§‡à¦° রিপোরà§à¦Ÿ দায়ের করা হয়েছে (%d-টি তà§à¦°à§à¦Ÿà¦¿)\n"
#: ../src/daemon/abrt-handle-crashdump.c:42
msgid ""
" [-vs] -d DIR -e EVENT\n"
" or: "
msgstr ""
+" [-vs] -d DIR -e EVENT\n"
+" অথবা: "
#: ../src/daemon/abrt-handle-crashdump.c:57
#: ../src/plugins/abrt-action-analyze-c.c:167
#: ../src/plugins/abrt-action-analyze-oops.c:144
#: ../src/plugins/abrt-action-analyze-python.c:49
msgid "Log to syslog"
-msgstr ""
+msgstr "syslog-ঠলগ করা হবে"
#: ../src/daemon/abrt-handle-crashdump.c:58
#: ../src/plugins/abrt-action-analyze-c.c:166
#: ../src/plugins/abrt-action-analyze-oops.c:143
#: ../src/plugins/abrt-action-analyze-python.c:48
-#: ../src/plugins/abrt-action-mailx.cpp:150
-#: ../src/plugins/abrt-action-print.cpp:50
-#: ../src/plugins/abrt-action-upload.cpp:266
+#: ../src/plugins/abrt-action-mailx.cpp:147
+#: ../src/plugins/abrt-action-print.cpp:49
+#: ../src/plugins/abrt-action-upload.cpp:261
msgid "Crash dump directory"
-msgstr ""
+msgstr "কà§à¦°à§à¦¯à¦¾à¦¶ ডামà§à¦ª ডিরেকà§à¦Ÿà¦°à¦¿"
#: ../src/daemon/abrt-handle-crashdump.c:59
msgid "Handle EVENT"
-msgstr ""
+msgstr "EVENT পরিচালনা"
#: ../src/daemon/abrt-handle-crashdump.c:60
msgid "List possible events [which start with PFX]"
-msgstr ""
+msgstr "সমà§à¦­à¦¾à¦¬à§à¦¯ ঘটনার [পà§à¦°à¦¾à¦°à¦®à§à¦­à§‡ PFX সহ] তালিকা পà§à¦°à¦¸à§à¦¤à§à¦¤à¦¿ "
-#: ../src/daemon/CommLayerServerDBus.cpp:229
+#: ../src/daemon/CommLayerServerDBus.cpp:238
msgid "Comment is too long"
msgstr "অতà§à¦¯à¦¾à¦§à¦¿à¦• লমà§à¦¬à¦¾ বিবৃতি"
-#: ../src/daemon/CommLayerServerDBus.cpp:233
+#: ../src/daemon/CommLayerServerDBus.cpp:242
msgid "'How to reproduce' is too long"
msgstr "'পà§à¦¨à¦°à¦¾à§Ÿ সঞà§à¦šà¦¾à¦²à¦¨à¦¾' সংকà§à¦°à¦¾à¦¨à§à¦¤ তথà§à¦¯ অতà§à¦¯à¦¾à¦§à¦¿à¦• লমà§à¦¬à¦¾"
-#: ../src/daemon/Daemon.cpp:534
+#: ../src/daemon/Daemon.cpp:533
msgid ""
"The size of the report exceeded the quota. Please check system's "
"MaxCrashReportsSize value in abrt.conf."
@@ -402,21 +403,21 @@ msgstr ""
"রিপোরà§à¦Ÿà§‡à¦° মাপ অনà§à¦®à§‹à¦¦à¦¿à¦¤ মাপের থেকে বড়। অনà§à¦—à§à¦°à¦¹ করে abrt.conf ফাইলের মধà§à¦¯à§‡ "
"MaxCrashReportsSize-র মাপ যাচাই করà§à¦¨à¥¤"
-#: ../src/daemon/Daemon.cpp:699
+#: ../src/daemon/Daemon.cpp:686
msgid "abrtd [options]"
-msgstr ""
+msgstr "abrtd [options]"
-#: ../src/daemon/Daemon.cpp:709
+#: ../src/daemon/Daemon.cpp:696
msgid "Do not daemonize"
-msgstr ""
+msgstr "ডেমন তৈরি করা হবে না"
-#: ../src/daemon/Daemon.cpp:710
+#: ../src/daemon/Daemon.cpp:697
msgid "Log to syslog even with -d"
-msgstr ""
+msgstr "-d সহযোগেও syslog-ঠলগ করা হবে"
-#: ../src/daemon/Daemon.cpp:711
+#: ../src/daemon/Daemon.cpp:698
msgid "Exit after SEC seconds of inactivity"
-msgstr ""
+msgstr "SEC সেকেনà§à¦¡ নিষà§à¦•à§à¦°à¦¿à§Ÿ থাকলে পà§à¦°à¦¸à§à¦¥à¦¾à¦¨ করা হবে"
#: ../src/gui/abrt.desktop.in.h:2
msgid "View and report application crashes"
@@ -427,10 +428,8 @@ msgid "Another client is already running, trying to wake it..."
msgstr "à¦à¦•à¦Ÿà¦¿ ভিনà§à¦¨ কà§à¦²à¦¾à§Ÿà§‡à¦¨à§à¦Ÿ বরà§à¦¤à¦®à¦¾à¦¨à§‡ চলছে, সেটিকে জাগানোর পà§à¦°à¦šà§‡à¦·à§à¦Ÿà¦¾ করা হচà§à¦›à§‡..."
#: ../src/gui/ABRTExceptions.py:14
-msgid ""
-"Got unexpected data from the daemon (is the database properly updated?)."
-msgstr ""
-"ডেমন থেকে অপà§à¦°à¦¤à§à¦¯à¦¾à¦¶à¦¿à¦¤ তথà§à¦¯ পাওয়া গিয়েছে (ডাটাবেস কি সঠিকভাবে আপডেট করা হয়েছে?)।"
+msgid "Got unexpected data from the daemon (is the database properly updated?)."
+msgstr "ডেমন থেকে অপà§à¦°à¦¤à§à¦¯à¦¾à¦¶à¦¿à¦¤ তথà§à¦¯ পাওয়া গিয়েছে (ডাটাবেস কি সঠিকভাবে আপডেট করা হয়েছে?)।"
#: ../src/gui/ABRTPlugin.py:64
msgid "Not loaded plugins"
@@ -539,7 +538,7 @@ msgstr ""
"à¦à¦Ÿà¦¿à¦° সাথে GNU General Public License-র à¦à¦•à¦Ÿà¦¿ পà§à¦°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿ উপলবà§à¦§ হওয়া উচিত; না "
"থাকলে <http://www.gnu.org/licenses/> দেখà§à¦¨à¥¤"
-#: ../src/gui/ccgui.glade.h:19 ../src/gui/CReporterAssistant.py:71
+#: ../src/gui/ccgui.glade.h:19 ../src/gui/CReporterAssistant.py:111
msgid "View log"
msgstr "লগ পà§à¦°à¦¦à¦°à§à¦¶à¦¨"
@@ -641,7 +640,7 @@ msgstr "à¦à¦Ÿà¦¿ পà§à¦¨à¦°à¦¾à§Ÿ সঞà§à¦šà¦¾à¦²à¦¨à§‡à¦° সংকà§à¦·
msgid "You must check the backtrace for sensitive data."
msgstr "সংবেদনশীল তথà§à¦¯à§‡à¦° উপসà§à¦¥à¦¿à¦¤à¦¿ সনাকà§à¦¤ করার জনà§à¦¯ বà§à¦¯à¦¾à¦•-টà§à¦°à§‡à¦¸ পরীকà§à¦·à¦¾ করা আবশà§à¦¯à¦•à¥¤"
-#: ../src/gui/CCReporterDialog.py:118 ../src/gui/CReporterAssistant.py:364
+#: ../src/gui/CCReporterDialog.py:118 ../src/gui/CReporterAssistant.py:392
#, python-format
msgid ""
"Reporting disabled because the backtrace is unusable.\n"
@@ -658,8 +657,8 @@ msgstr ""
msgid "The backtrace is unusable, you cannot report this!"
msgstr "বà§à¦¯à¦¾à¦•-টà§à¦°à§‡à¦¸à¦Ÿà¦¿ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦¯à§‹à¦—à§à¦¯ নয়, à¦à¦Ÿà¦¿ সমà§à¦ªà¦°à§à¦•à§‡ রিপোরà§à¦Ÿ দায়ের করা যাবে না!"
-#: ../src/gui/CCReporterDialog.py:124 ../src/gui/CReporterAssistant.py:342
-#: ../src/gui/CReporterAssistant.py:370
+#: ../src/gui/CCReporterDialog.py:124 ../src/gui/CReporterAssistant.py:370
+#: ../src/gui/CReporterAssistant.py:398
msgid ""
"The backtrace is incomplete, please make sure you provide the steps to "
"reproduce."
@@ -685,7 +684,7 @@ msgstr ""
"à¦à¦‡ ধরনের বিপরà§à¦¯à§Ÿà§‡à¦° জনà§à¦¯, রিপোরà§à¦Ÿ দায়ের করার কোনো পà§à¦²à¦¾à¦—-ইন উপলবà§à¦§ নয়।\n"
"অনà§à¦—à§à¦°à¦¹ করে abrt.conf পরীকà§à¦·à¦¾ করà§à¦¨à¥¤"
-#: ../src/gui/CCReporterDialog.py:418 ../src/gui/CReporterAssistant.py:249
+#: ../src/gui/CCReporterDialog.py:418 ../src/gui/CReporterAssistant.py:277
#: ../src/gui/PluginsSettingsDialog.py:136
#, python-format
msgid ""
@@ -695,12 +694,12 @@ msgstr ""
"পà§à¦²à¦¾à¦—-ইনের বৈশিষà§à¦Ÿà§à¦¯ সংরকà§à¦·à¦£ করা সমà§à¦­à¦¬ নয়:\n"
" %s"
-#: ../src/gui/CCReporterDialog.py:448 ../src/gui/CReporterAssistant.py:279
+#: ../src/gui/CCReporterDialog.py:448 ../src/gui/CReporterAssistant.py:307
#, python-format
msgid "Configure %s options"
msgstr "%s-র বিকলà§à¦ª কনফিগার করà§à¦¨"
-#: ../src/gui/CCReporterDialog.py:498 ../src/gui/CReporterAssistant.py:1074
+#: ../src/gui/CCReporterDialog.py:498 ../src/gui/CReporterAssistant.py:1102
msgid ""
"Unable to get report!\n"
"Is debuginfo missing?"
@@ -708,7 +707,7 @@ msgstr ""
"রিপোরà§à¦Ÿ পà§à¦°à¦¾à¦ªà§à¦¤ করতে বà§à¦¯à¦°à§à¦¥!\n"
"Debuginfo কি অনà§à¦ªà¦¸à§à¦¥à¦¿à¦¤?"
-#: ../src/gui/CCReporterDialog.py:527 ../src/gui/CReporterAssistant.py:455
+#: ../src/gui/CCReporterDialog.py:527 ../src/gui/CReporterAssistant.py:483
#, python-format
msgid ""
"Reporting failed!\n"
@@ -718,7 +717,7 @@ msgstr ""
"%s"
#: ../src/gui/CCReporterDialog.py:553 ../src/gui/CCReporterDialog.py:574
-#: ../src/gui/CReporterAssistant.py:1113
+#: ../src/gui/CReporterAssistant.py:1139
#, python-format
msgid "Error acquiring the report: %s"
msgstr "রিপোরà§à¦Ÿ পà§à¦°à¦¾à¦ªà§à¦¤ করতে বà§à¦¯à¦°à§à¦¥: %s"
@@ -734,8 +733,7 @@ msgid "Cannot get the default keyring."
msgstr "ডিফলà§à¦Ÿ কি-রিং পà§à¦°à¦¾à¦ªà§à¦¤ করতে বà§à¦¯à¦°à§à¦¥à¥¤"
#: ../src/gui/ConfBackend.py:103 ../src/gui/ConfBackend.py:120
-msgid ""
-"Access to gnome-keyring has been denied, plugins settings will not be saved."
+msgid "Access to gnome-keyring has been denied, plugins settings will not be saved."
msgstr ""
"gnome-keyring বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡à¦° অনà§à¦®à¦¤à¦¿ পà§à¦°à¦¤à§à¦¯à¦¾à¦–à§à¦¯à¦¾à¦¨ করা হয়েছে, পà§à¦²à¦¾à¦—-ইনের বৈশিষà§à¦Ÿà§à¦¯ সংরকà§à¦·à¦£ "
"করা হবে না।"
@@ -743,51 +741,49 @@ msgstr ""
#. we tried 2 times, so giving up the authorization
#: ../src/gui/ConfBackend.py:154
#, python-format
-msgid ""
-"Access to gnome-keyring has been denied, cannot load the settings for %s!"
+msgid "Access to gnome-keyring has been denied, cannot load the settings for %s!"
msgstr ""
"gnome-keyring বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡à¦° অনà§à¦®à¦¤à¦¿ পà§à¦°à¦¤à§à¦¯à¦¾à¦–à§à¦¯à¦¾à¦¨ করা হয়েছে, %s-র বৈশিষà§à¦Ÿà§à¦¯ লোড করতে বà§à¦¯à¦°à§à¦¥!"
#: ../src/gui/ConfBackend.py:207
msgid "Access to gnome-keyring has been denied, cannot load settings."
-msgstr ""
-"gnome-keyring বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡à¦° অনà§à¦®à¦¤à¦¿ পà§à¦°à¦¤à§à¦¯à¦¾à¦–à§à¦¯à¦¾à¦¨ করা হয়েছে, বৈশিষà§à¦Ÿà§à¦¯ লোড করতে বà§à¦¯à¦°à§à¦¥à¥¤"
+msgstr "gnome-keyring বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡à¦° অনà§à¦®à¦¤à¦¿ পà§à¦°à¦¤à§à¦¯à¦¾à¦–à§à¦¯à¦¾à¦¨ করা হয়েছে, বৈশিষà§à¦Ÿà§à¦¯ লোড করতে বà§à¦¯à¦°à§à¦¥à¥¤"
#: ../src/gui/CReporterAssistant.py:21
msgid "Crash info doesn't contain a backtrace"
msgstr "বিপরà§à¦¯à§Ÿà§‡à¦° তথà§à¦¯à§‡à¦° মধà§à¦¯à§‡ বà§à¦¯à¦¾à¦•-টà§à¦°à§‡à¦¸ অনà§à¦¤à¦°à§à¦­à§à¦•à§à¦¤ নয়"
-#: ../src/gui/CReporterAssistant.py:334
+#: ../src/gui/CReporterAssistant.py:362
#, python-format
msgid "Rating is %s"
msgstr "মাতà§à¦°à¦¾ হল %s"
-#: ../src/gui/CReporterAssistant.py:337
+#: ../src/gui/CReporterAssistant.py:365
msgid "Crashdump doesn't have rating => we suppose it's not required"
msgstr "Crashdump-র মধà§à¦¯à§‡ কোনো মাতà§à¦°à¦¾ নিরà§à¦§à¦¾à¦°à¦¿à¦¤ হয়নি => সমà§à¦­à¦¬à¦¤ à¦à¦Ÿà¦¿à¦° পà§à¦°à§Ÿà§‹à¦œà¦¨ নেই"
-#: ../src/gui/CReporterAssistant.py:350
+#: ../src/gui/CReporterAssistant.py:378
msgid "You should check the backtrace for sensitive data."
msgstr "সংবেদনশীল তথà§à¦¯à§‡à¦° উপসà§à¦¥à¦¿à¦¤à¦¿ সনাকà§à¦¤ করার জনà§à¦¯ বà§à¦¯à¦¾à¦•-টà§à¦°à§‡à¦¸ পরীকà§à¦·à¦¾ করা আবশà§à¦¯à¦•à¥¤"
-#: ../src/gui/CReporterAssistant.py:351
+#: ../src/gui/CReporterAssistant.py:379
msgid "You must agree with sending the backtrace."
msgstr "বà§à¦¯à¦¾à¦•-টà§à¦°à§‡à¦¸ পাঠানোর সময় সমà§à¦®à¦¤à¦¿ জà§à¦žà¦¾à¦ªà¦¨ করা আবশà§à¦¯à¦•à¥¤"
-#: ../src/gui/CReporterAssistant.py:366
+#: ../src/gui/CReporterAssistant.py:394
msgid "Reporting disabled because the backtrace is unusable."
msgstr ""
"বà§à¦¯à¦¾à¦•-টà§à¦°à§‡à¦¸ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦¯à§‹à¦—à§à¦¯ না হওয়ার ফলে রিপোরà§à¦Ÿ দায়ের করার বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾ নিষà§à¦•à§à¦°à¦¿à§Ÿ করা হয়েছে।"
-#: ../src/gui/CReporterAssistant.py:412
+#: ../src/gui/CReporterAssistant.py:440
msgid "You did not provide any steps to reproduce."
msgstr "পà§à¦¨à¦°à¦¾à§Ÿ সঞà§à¦šà¦¾à¦²à¦¨à¦¾à¦° উদà§à¦¦à§‡à¦¶à§à¦¯à§‡ ধাপগà§à¦²à¦¿ উলà§à¦²à§‡à¦– করা হয়নি।"
-#: ../src/gui/CReporterAssistant.py:426
+#: ../src/gui/CReporterAssistant.py:454
msgid "You did not provide any comments."
msgstr "কোনো বিবৃতি উলà§à¦²à§‡à¦– করা হয়নি।"
-#: ../src/gui/CReporterAssistant.py:507
+#: ../src/gui/CReporterAssistant.py:535
#, python-format
msgid ""
"It looks like an application from the package <b>%s</b> has crashed on your "
@@ -812,15 +808,15 @@ msgstr ""
"\n"
"বাগ রিপোরà§à¦Ÿ দায়ের করার সà§à¦¥à¦¾à¦¨ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨ ও 'à¦à¦—িয়ে চলà§à¦¨' টিপে পরবরà§à¦¤à§€ ধাপে চলà§à¦¨à¥¤"
-#: ../src/gui/CReporterAssistant.py:548
+#: ../src/gui/CReporterAssistant.py:576
msgid "Only one reporter plugin is configured."
msgstr "শà§à¦§à§à¦®à¦¾à¦¤à§à¦° à¦à¦•à¦Ÿà¦¿ রিপোরà§à¦Ÿà¦¾à¦° পà§à¦²à¦¾à¦—-ইন কনফিগার করা হয়েছে"
-#: ../src/gui/CReporterAssistant.py:554
+#: ../src/gui/CReporterAssistant.py:582
msgid "Send a bug report"
msgstr "রিপোরà§à¦Ÿ দায়ের করà§à¦¨"
-#: ../src/gui/CReporterAssistant.py:592
+#: ../src/gui/CReporterAssistant.py:620
msgid ""
"Below is the backtrace associated with your crash. A crash backtrace "
"provides developers with details about how the crash happened, helping them "
@@ -836,52 +832,51 @@ msgstr ""
"অনà§à¦—à§à¦°à¦¹ করে নিমà§à¦¨à¦²à¦¿à¦–িত বà§à¦¯à¦¾à¦•-টà§à¦°à§‡à¦¸ পরà§à¦¯à¦¾à¦²à§‹à¦šà¦¨à¦¾ করà§à¦¨ ও বাগের মধà§à¦¯à§‡ কোনো ধরনের "
"সংবেদনশীল তথà§à¦¯à§‡à¦° উপসà§à¦¥à¦¿à¦¤à¦¿ à¦à§œà¦¾à¦¨à§‹à¦° জনà§à¦¯ বà§à¦¯à¦¾à¦•-টà§à¦°à§‡à¦¸à§‡à¦° মধà§à¦¯à§‡ পà§à¦°à§Ÿà§‹à¦œà¦¨à§€à§Ÿ পরিবরà§à¦¤à¦¨ করà§à¦¨:"
-#: ../src/gui/CReporterAssistant.py:663 ../src/gui/CReporterAssistant.py:676
-#: ../src/gui/CReporterAssistant.py:710
+#: ../src/gui/CReporterAssistant.py:691 ../src/gui/CReporterAssistant.py:704
+#: ../src/gui/CReporterAssistant.py:738
#, python-format
msgid "Found %i occurence(s) [at: %i of %i]"
-msgstr ""
+msgstr "%i-টি উপসà§à¦¥à¦¿à¦¤à¦¿ সনাকà§à¦¤ করা হয়েছে [চিহà§à¦¨à¦¿à¦¤ সà§à¦¥à¦¾à¦¨à§‡: %i, সরà§à¦¬à¦®à§‹à¦Ÿ %i]"
-#: ../src/gui/CReporterAssistant.py:747
+#: ../src/gui/CReporterAssistant.py:775
msgid "Search:"
-msgstr ""
+msgstr "অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨:"
-#: ../src/gui/CReporterAssistant.py:778
+#: ../src/gui/CReporterAssistant.py:806
msgid "Refresh"
msgstr "নতà§à¦¨ করে পà§à¦°à¦¦à¦°à§à¦¶à¦¨"
-#: ../src/gui/CReporterAssistant.py:780
+#: ../src/gui/CReporterAssistant.py:808
msgid "Copy"
msgstr "কপি করà§à¦¨"
-#: ../src/gui/CReporterAssistant.py:786
+#: ../src/gui/CReporterAssistant.py:814
msgid "I agree with submitting the backtrace"
msgstr "বà§à¦¯à¦¾à¦•-টà§à¦°à§‡à¦¸ পাঠাতে আমি সমà§à¦®à¦¤"
-#: ../src/gui/CReporterAssistant.py:791
+#: ../src/gui/CReporterAssistant.py:819
msgid "Approve the backtrace"
msgstr "বà§à¦¯à¦¾à¦•-টà§à¦°à§‡à¦¸ অনà§à¦®à§‹à¦¦à¦¨ করà§à¦¨"
-#: ../src/gui/CReporterAssistant.py:834
+#: ../src/gui/CReporterAssistant.py:862
msgid "You need to fill the how to before you can proceed..."
-msgstr ""
+msgstr "à¦à¦—িয়ে চলার পূরà§à¦¬à§‡ করà§à¦® পà§à¦°à¦£à¦¾à¦²à§€à¦° তথà§à¦¯ পূরà§à¦£ করা আবশà§à¦¯à¦•..."
-#: ../src/gui/CReporterAssistant.py:857
+#: ../src/gui/CReporterAssistant.py:885
msgid "How did this crash happen (step-by-step)? How would you reproduce it?"
msgstr ""
"বিপরà§à¦¯à§Ÿ কীভাবে হয়েছে (পà§à¦°à¦¤à¦¿à¦Ÿà¦¿ ধাপের উলà§à¦²à§‡à¦–)? পà§à¦¨à¦°à¦¾à§Ÿ ঘটানোর জনà§à¦¯ কী পদà§à¦§à¦¤à¦¿ অবলমà§à¦¬à¦¨ "
"করা উচিত?"
-#: ../src/gui/CReporterAssistant.py:877
-msgid ""
-"Are there any comments you would like to share with the software maintainers?"
+#: ../src/gui/CReporterAssistant.py:905
+msgid "Are there any comments you would like to share with the software maintainers?"
msgstr "সফà§à¦Ÿà¦“য়à§à¦¯à¦¾à¦° মেইনà§à¦Ÿà§‡à¦¨à¦¾à¦°à¦¦à§‡à¦° জনà§à¦¯ কোনো বিবৃতি জানাতে ইচà§à¦›à§à¦• কি?"
-#: ../src/gui/CReporterAssistant.py:897
+#: ../src/gui/CReporterAssistant.py:925
msgid "Provide additional details"
msgstr "অতিরিকà§à¦¤ বিবরণ উপলবà§à¦§ করà§à¦¨"
-#: ../src/gui/CReporterAssistant.py:904
+#: ../src/gui/CReporterAssistant.py:932
msgid ""
"<b>Tip:</b> Your comments are not private. Please watch what you say "
"accordingly."
@@ -889,80 +884,79 @@ msgstr ""
"<b>সূতà§à¦°:</b> আপনার মতামতগà§à¦²à¦¿ গোপনীয় থাকবে না, à¦à¦‡ কারণে সà§à¦¬à¦¿à¦¬à§‡à¦šà¦¨à¦¾ করে মতামত লেখা "
"বাঞà§à¦›à¦¨à§€à§Ÿà¥¤"
-#: ../src/gui/CReporterAssistant.py:945
+#: ../src/gui/CReporterAssistant.py:973
msgid "Confirm and send the report"
msgstr "নিশà§à¦šà¦¿à¦¤ করে রিপোরà§à¦Ÿ দায়ের করà§à¦¨"
-#: ../src/gui/CReporterAssistant.py:947
-msgid ""
-"Below is a summary of your bug report. Please click 'Apply' to submit it."
+#: ../src/gui/CReporterAssistant.py:975
+msgid "Below is a summary of your bug report. Please click 'Apply' to submit it."
msgstr ""
"আপনার বাগ রিপোরà§à¦Ÿà§‡à¦° সারসংকà§à¦·à§‡à¦ª নীচে উপসà§à¦¥à¦¿à¦¤ করা হয়েছে। অনà§à¦—à§à¦°à¦¹ করে 'পà§à¦°à§Ÿà§‹à¦— করà§à¦¨' "
"টিপে তা দায়ের করà§à¦¨à¥¤"
-#: ../src/gui/CReporterAssistant.py:952
+#: ../src/gui/CReporterAssistant.py:980
msgid "<b>Basic details</b>"
msgstr "<b>মৈলিক বিবরণ</b>"
#. left table
-#: ../src/gui/CReporterAssistant.py:959
+#: ../src/gui/CReporterAssistant.py:987
msgid "Component"
msgstr "অংশবিশেষ"
-#: ../src/gui/CReporterAssistant.py:960
+#: ../src/gui/CReporterAssistant.py:988
msgid "Package"
msgstr "পà§à¦¯à¦¾à¦•à§‡à¦œ"
-#: ../src/gui/CReporterAssistant.py:961
+#: ../src/gui/CReporterAssistant.py:989
msgid "Executable"
msgstr "à¦à¦•à§à¦¸à§‡à¦•à¦¿à¦‰à¦Ÿà§‡à¦¬à¦²"
-#: ../src/gui/CReporterAssistant.py:962
+#: ../src/gui/CReporterAssistant.py:990
msgid "Cmdline"
msgstr "Cmdline"
#. right table
-#: ../src/gui/CReporterAssistant.py:964
+#: ../src/gui/CReporterAssistant.py:992
msgid "Architecture"
msgstr "আরà§à¦•à¦¿à¦Ÿà§‡à¦•à¦šà¦¾à¦°"
-#: ../src/gui/CReporterAssistant.py:965
+#: ../src/gui/CReporterAssistant.py:993
msgid "Kernel"
msgstr "Kernel"
-#: ../src/gui/CReporterAssistant.py:966
+#: ../src/gui/CReporterAssistant.py:994
msgid "Release"
msgstr "রিলিজ"
-#: ../src/gui/CReporterAssistant.py:967
+#: ../src/gui/CReporterAssistant.py:995
msgid "Reason"
msgstr "কারণ"
-#: ../src/gui/CReporterAssistant.py:978 ../src/gui/report.glade.h:3
+#: ../src/gui/CReporterAssistant.py:1006 ../src/gui/report.glade.h:3
msgid "<b>Backtrace</b>"
msgstr "<b>বà§à¦¯à¦¾à¦•-টà§à¦°à§‡à¦¸</b>"
-#: ../src/gui/CReporterAssistant.py:981
+#: ../src/gui/CReporterAssistant.py:1009
msgid "Click to view..."
msgstr "পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করতে কà§à¦²à¦¿à¦• করà§à¦¨..."
-#: ../src/gui/CReporterAssistant.py:993
+#: ../src/gui/CReporterAssistant.py:1021
msgid "<b>Steps to reproduce:</b>"
msgstr "<b>পà§à¦¨à¦°à¦¾à§Ÿ সঞà§à¦šà¦¾à¦²à¦¨à¦¾à¦° ধাপ:</b>"
-#: ../src/gui/CReporterAssistant.py:1014
+#: ../src/gui/CReporterAssistant.py:1042
msgid "<b>Comments:</b>"
msgstr "<b>বিবৃতি:</b>"
-#: ../src/gui/CReporterAssistant.py:1017
+#: ../src/gui/CReporterAssistant.py:1045
msgid "No comment provided!"
msgstr "কোনো মতামত উপলবà§à¦§ নেই!"
-#: ../src/gui/CReporterAssistant.py:1053
+#: ../src/gui/CReporterAssistant.py:1081
msgid "Finished sending the bug report"
msgstr "রিপোরà§à¦Ÿ দায়ের করা সমাপà§à¦¤"
-#: ../src/gui/CReporterAssistant.py:1057
+#: ../src/gui/CReporterAssistant.py:1085
msgid "<b>Bug reports:</b>"
msgstr "<b>বাগ রিপোরà§à¦Ÿ:</b>"
@@ -1008,11 +1002,10 @@ msgid "Name"
msgstr "নাম"
#: ../src/gui/PluginsSettingsDialog.py:118
-#, fuzzy
msgid "Please select a plugin from the list to edit its options."
msgstr ""
-"পà§à¦²à¦¾à¦—-ইনের বিকলà§à¦ª পরিবরà§à¦¤à¦¨ করার জনà§à¦¯ অনà§à¦—à§à¦°à¦¹ করে তালিকা থেকে সংশà§à¦²à¦¿à¦·à§à¦Ÿ পà§à¦²à¦¾à¦—-ইন "
-"নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨à¥¤"
+"পà§à¦²à¦¾à¦—-ইনের বিকলà§à¦ª পরিবরà§à¦¤à¦¨ করার জনà§à¦¯ অনà§à¦—à§à¦°à¦¹ করে তালিকা থেকে সংশà§à¦²à¦¿à¦·à§à¦Ÿ পà§à¦²à¦¾à¦—-ইন নিরà§à¦¬à¦¾à¦šà¦¨ "
+"করà§à¦¨à¥¤"
#: ../src/gui/PluginsSettingsDialog.py:126
#, python-format
@@ -1095,8 +1088,7 @@ msgstr "à¦à¦° ফলে ABRT-কে à¦à¦•à¦Ÿà¦¿ বà§à¦¯à¦¾à¦•-টà§à¦°à§‡à¦
#: ../src/gui/report.glade.h:19
msgid "I checked the backtrace and removed sensitive data (passwords, etc)"
-msgstr ""
-"বà§à¦¯à¦¾à¦•-টà§à¦°à§‡à¦¸ পরীকà§à¦·à¦¾ করে সংবেদনশীল তথà§à¦¯ (যেমন পাসওয়ারà§à¦¡ ইতà§à¦¯à¦¾à¦¦à¦¿) মà§à¦›à§‡ ফেলা হয়েছে"
+msgstr "বà§à¦¯à¦¾à¦•-টà§à¦°à§‡à¦¸ পরীকà§à¦·à¦¾ করে সংবেদনশীল তথà§à¦¯ (যেমন পাসওয়ারà§à¦¡ ইতà§à¦¯à¦¾à¦¦à¦¿) মà§à¦›à§‡ ফেলা হয়েছে"
#: ../src/gui/report.glade.h:20
msgid "N/A"
@@ -1232,15 +1224,15 @@ msgstr ""
"চলার পূরà§à¦¬à§‡ অনà§à¦—à§à¦°à¦—হ করে নিমà§à¦¨à¦²à¦¿à¦–িত বাটন পà§à¦°à§Ÿà§‹à¦— করে সংশà§à¦²à¦¿à¦·à§à¦Ÿ কনফিগারেশন খà§à¦²à§à¦¨ ও "
"সমসà§à¦¯à¦¾à¦—à§à¦²à¦¿ সংশোধন করà§à¦¨à¥¤ অনà§à¦¯à¦¥à¦¾ রিপোরà§à¦Ÿ বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾ বিফল হতে পারে।\n"
-#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.cpp:47
+#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.cpp:46
#, c-format
msgid "Uploaded: %llu of %llu kbytes"
-msgstr ""
+msgstr "আপলোড করা হয়েছে: %llu কিলোবাইট, সরà§à¦¬à¦®à§‹à¦Ÿ %llu কিলোবাইট"
#: ../src/lib/parse_options.c:11
#, c-format
msgid "Usage: %s\n"
-msgstr ""
+msgstr "বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦ªà§à¦°à¦£à¦¾à¦²à§€: %s\n"
#: ../src/plugins/abrt-action-analyze-c.c:154
msgid ""
@@ -1248,6 +1240,9 @@ msgid ""
"\n"
"Calculates and saves UUID of coredumps"
msgstr ""
+" [-vs] -d DIR\n"
+"\n"
+"কোর-ডামà§à¦ªà§‡à¦° UUID গণনা করে সংরকà§à¦·à¦£ করে"
#: ../src/plugins/abrt-action-analyze-oops.c:131
msgid ""
@@ -1255,6 +1250,9 @@ msgid ""
"\n"
"Calculates and saves UUID and DUPHASH of oops crash dumps"
msgstr ""
+" [-vs] -d DIR\n"
+"\n"
+"oops কà§à¦°à§à¦¯à¦¾à¦¶ ডামà§à¦ªà§‡à¦° UUID à¦à¦¬à¦‚ DUPHASH গণণা করে সংরকà§à¦·à¦£ করে"
#: ../src/plugins/abrt-action-analyze-python.c:36
msgid ""
@@ -1262,73 +1260,69 @@ msgid ""
"\n"
"Calculates and saves UUID and DUPHASH of python crash dumps"
msgstr ""
+" [-vs] -d DIR\n"
+"\n"
+"python কà§à¦°à§à¦¯à¦¾à¦¶ ডামà§à¦ªà§‡à¦° UUID à¦à¦¬à¦‚ DUPHASH গণণা করে সংরকà§à¦·à¦£ করে"
-#: ../src/plugins/abrt-action-bugzilla.cpp:532
+#: ../src/plugins/abrt-action-bugzilla.cpp:531
#, c-format
msgid "New bug id: %i"
msgstr "নতà§à¦¨ বাগ id: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:645
+#: ../src/plugins/abrt-action-bugzilla.cpp:659
#, c-format
-msgid "Can't open '%s'"
-msgstr ""
-
-#: ../src/plugins/abrt-action-bugzilla.cpp:665
-#, fuzzy, c-format
msgid "Empty login or password, please check %s"
-msgstr ""
-"লগ-ইন ও পাসওয়ারà§à¦¡ লেখা হয়নি।\n"
-"অনà§à¦—à§à¦°à¦¹ করে পরীকà§à¦·à¦¾ করà§à¦¨ "
+msgstr "লগ-ইন ও পাসওয়ারà§à¦¡ লেখা হয়নি। অনà§à¦—à§à¦°à¦¹ করে %s পরীকà§à¦·à¦¾ করà§à¦¨"
-#: ../src/plugins/abrt-action-bugzilla.cpp:683
+#: ../src/plugins/abrt-action-bugzilla.cpp:677
msgid "Logging into bugzilla..."
msgstr "bugzilla-তে লগ-ইন করা হচà§à¦›à§‡..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:686
+#: ../src/plugins/abrt-action-bugzilla.cpp:680
msgid "Checking for duplicates..."
msgstr "পà§à¦°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿ পরীকà§à¦·à¦¾ করা হচà§à¦›à§‡..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:707
-#: ../src/plugins/abrt-action-bugzilla.cpp:743
+#: ../src/plugins/abrt-action-bugzilla.cpp:701
+#: ../src/plugins/abrt-action-bugzilla.cpp:737
msgid "Missing mandatory member 'bugs'"
msgstr "আবশà§à¦¯à¦• তথà§à¦¯ 'bugs' অনà§à¦ªà¦¸à§à¦¥à¦¿à¦¤"
-#: ../src/plugins/abrt-action-bugzilla.cpp:726
-#: ../src/plugins/abrt-action-bugzilla.cpp:759
-#: ../src/plugins/abrt-action-bugzilla.cpp:834
+#: ../src/plugins/abrt-action-bugzilla.cpp:720
+#: ../src/plugins/abrt-action-bugzilla.cpp:753
+#: ../src/plugins/abrt-action-bugzilla.cpp:830
msgid "get_bug_info() failed. Could not collect all mandatory information"
msgstr "get_bug_info() বিফল। সকল আবশà§à¦¯à¦• তথà§à¦¯ সংগà§à¦°à¦¹ করা যায়নি"
-#: ../src/plugins/abrt-action-bugzilla.cpp:775
+#: ../src/plugins/abrt-action-bugzilla.cpp:769
msgid "Creating a new bug..."
msgstr "নতà§à¦¨ বাগ তৈরি করা হচà§à¦›à§‡..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:780
+#: ../src/plugins/abrt-action-bugzilla.cpp:774
msgid "Bugzilla entry creation failed"
msgstr "Bugzilla-র à¦à¦¨à¦Ÿà§à¦°à¦¿ নিরà§à¦®à¦¾à¦£ করতে বà§à¦¯à¦°à§à¦¥"
-#: ../src/plugins/abrt-action-bugzilla.cpp:790
-#: ../src/plugins/abrt-action-bugzilla.cpp:887
+#: ../src/plugins/abrt-action-bugzilla.cpp:786
+#: ../src/plugins/abrt-action-bugzilla.cpp:883
msgid "Logging out..."
msgstr "লগ-আউট করা হচà§à¦›à§‡..."
#. decision based on state
-#: ../src/plugins/abrt-action-bugzilla.cpp:808
+#: ../src/plugins/abrt-action-bugzilla.cpp:804
#, c-format
msgid "Bug is already reported: %i"
msgstr "বাগ পূরà§à¦¬à§‡à¦‡ দায়ের করা হয়েছে: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:819
+#: ../src/plugins/abrt-action-bugzilla.cpp:815
#, c-format
msgid "Bugzilla couldn't find parent of bug %d"
msgstr "Bugzilla দà§à¦¬à¦¾à¦°à¦¾ বাগ %d-র ঊরà§à¦§à§à¦¬à¦¤à¦¨ বাগ সনাকà§à¦¤ করা সমà§à¦­à¦¬ হয়নি"
-#: ../src/plugins/abrt-action-bugzilla.cpp:848
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-bugzilla.cpp:844
+#, c-format
msgid "Add %s to CC list"
-msgstr "%s-কে পà§à¦°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿ পà§à¦°à¦¾à¦ªà¦•à¦¦à§‡à¦° (CC) তালিকায় সংযোজন করà§à¦¨"
+msgstr "%s-কে পà§à¦°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿ পà§à¦°à¦¾à¦ªà¦•à¦¦à§‡à¦° (CC) তালিকায় যোগ করà§à¦¨"
-#: ../src/plugins/abrt-action-bugzilla.cpp:872
+#: ../src/plugins/abrt-action-bugzilla.cpp:868
#, c-format
msgid "Adding new comment to bug %d"
msgstr "বাগ(%d)-র মধà§à¦¯à§‡ নতà§à¦¨ বিবৃতি সংযোজন করà§à¦¨"
@@ -1336,162 +1330,162 @@ msgstr "বাগ(%d)-র মধà§à¦¯à§‡ নতà§à¦¨ বিবৃতি সং
#: ../src/plugins/abrt-action-generate-backtrace.c:319
#, c-format
msgid "Backtrace parsing failed for %s"
-msgstr ""
+msgstr "%s-র জনà§à¦¯ বà§à¦¯à¦¾à¦•-টà§à¦°à§‡à¦¸ পারà§à¦¸à¦¿à¦‚ করতে বà§à¦¯à¦°à§à¦¥"
#: ../src/plugins/abrt-action-install-debuginfo.py:72
#, python-format
msgid "Extracting cpio from %s"
-msgstr ""
+msgstr "%s থেকে cpio উদà§à¦§à¦¾à¦° করা হচà§à¦›à§‡"
#: ../src/plugins/abrt-action-install-debuginfo.py:77
msgid "Can't write to:"
-msgstr ""
+msgstr "চিহà§à¦¨à¦¿à¦¤ সà§à¦¥à¦¾à¦¨à§‡ লিখতে বà§à¦¯à¦°à§à¦¥:"
#: ../src/plugins/abrt-action-install-debuginfo.py:87
msgid "Removing the temporary rpm file"
-msgstr ""
+msgstr "অসà§à¦¥à¦¾à§Ÿà§€ rpm ফাইল মà§à¦›à§‡ ফেলতে বà§à¦¯à¦°à§à¦¥"
#: ../src/plugins/abrt-action-install-debuginfo.py:91
#, python-format
msgid "Can't extract package: %s"
-msgstr ""
+msgstr "পà§à¦¯à¦¾à¦•à§‡à¦œ উদà§à¦§à¦¾à¦° করতে বà§à¦¯à¦°à§à¦¥: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:99
#, python-format
msgid "Caching files from %s made from %s"
-msgstr ""
+msgstr "%s-র ফাইলগà§à¦²à¦¿ (%s থেকে পà§à¦°à¦¸à§à¦¤à§à¦¤ করা) কà§à¦¯à¦¾à¦¶à§‡ করা হচà§à¦›à§‡"
#: ../src/plugins/abrt-action-install-debuginfo.py:107
msgid "Removing the temporary cpio file"
-msgstr ""
+msgstr "অসà§à¦¥à¦¾à§Ÿà§€ cpio ফাইল মà§à¦›à§‡ ফেলা হচà§à¦›à§‡"
#: ../src/plugins/abrt-action-install-debuginfo.py:110
#, python-format
msgid "Can't extract files from: %s"
-msgstr ""
+msgstr "চিহà§à¦¨à¦¿à¦¤ সà§à¦¥à¦¾à¦¨ থেকে ফাইল উদà§à¦§à¦¾à¦° করতে বà§à¦¯à¦°à§à¦¥: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:134
#: ../src/plugins/abrt-action-install-debuginfo.py:140
#, python-format
msgid "Downloading (%i of %i) %.30s : %.3s %%"
-msgstr ""
+msgstr "ডাউনলোড করা হচà§à¦›à§‹ (%i, সরà§à¦¬à¦®à§‹à¦Ÿ %i) %.30s : %.3s %%"
#: ../src/plugins/abrt-action-install-debuginfo.py:169
-#, fuzzy
msgid "Searching the missing debuginfo packages"
-msgstr "debuginfo ইনসà§à¦Ÿà¦²à§‡à¦¶à¦¨ আরমà§à¦­ করা হচà§à¦›à§‡"
+msgstr "অনà§à¦ªà¦¸à§à¦¥à¦¿à¦¤ debuginfo পà§à¦¯à¦¾à¦•à§‡à¦œ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করা হচà§à¦›à§‡"
#: ../src/plugins/abrt-action-install-debuginfo.py:224
#, python-format
msgid "To download: (%.2f) M / Installed size: %.2f M"
-msgstr ""
+msgstr "ডাউনলোড করা হবে: (%.2f) M / ইনসà§à¦Ÿà¦²à§‡à¦¶à¦¨à§‡à¦° পরের মাপ: %.2f M"
#: ../src/plugins/abrt-action-install-debuginfo.py:240
msgid "Is this ok? [y/N] "
-msgstr ""
+msgstr "à¦à¦Ÿà¦¿ ঠিক কী? [y/N] "
#: ../src/plugins/abrt-action-install-debuginfo.py:257
#, python-format
msgid "Downloading package %s failed"
-msgstr ""
+msgstr "%s পà§à¦¯à¦¾à¦•à§‡à¦œà¦Ÿà¦¿ ডাউনলোড করতে বà§à¦¯à¦°à§à¦¥"
#. recursively delete the temp dir on failure
#: ../src/plugins/abrt-action-install-debuginfo.py:268
msgid "Unpacking failed, aborting download..."
-msgstr ""
+msgstr "আন-পà§à¦¯à¦¾à¦• করতে বà§à¦¯à¦°à§à¦¥, ডাউনলোড পরিতà§à¦¯à¦¾à¦— করা হচà§à¦›à§‡..."
#: ../src/plugins/abrt-action-install-debuginfo.py:275
#, python-format
msgid "All downloaded packages have been extracted, removing %s"
-msgstr ""
+msgstr "ডাউনলোড করা সকল পà§à¦¯à¦¾à¦•à§‡à¦œ উদà§à¦§à¦¾à¦° করা হয়েছে, %s মà§à¦›à§‡ ফেলা হচà§à¦›à§‡"
#: ../src/plugins/abrt-action-install-debuginfo.py:280
#, python-format
msgid "Can't remove %s, probably contains an error log"
-msgstr ""
+msgstr "%s মà§à¦›à§‡ ফেলা সমà§à¦­à¦¬ নয়, সমà§à¦­à¦¬à¦¤ তà§à¦°à§à¦Ÿà¦¿à¦° লগ উপলবà§à¦§ রয়েছে"
#: ../src/plugins/abrt-action-install-debuginfo.py:305
#, python-format
msgid "Analyzing corefile: %(corefile_path)s"
-msgstr ""
+msgstr "corefile বিশà§à¦²à§‡à¦·à¦£ করা হচà§à¦›à§‡: %(corefile_path)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:384
#, python-format
msgid "Can't remove %(tmpdir_path)s: %(reason)s"
-msgstr ""
+msgstr "%(tmpdir_path)s মà§à¦›à§‡ ফেলা সমà§à¦­à¦¬ নয়: %(reason)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:394
msgid "Exiting on user Command"
-msgstr ""
+msgstr "বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ দà§à¦¬à¦¾à¦°à¦¾ উলà§à¦²à¦¿à¦–িত কমানà§à¦¡à§‡à¦° ফলে পà§à¦°à¦¸à§à¦¥à¦¾à¦¨ করা হচà§à¦›à§‡"
#: ../src/plugins/abrt-action-install-debuginfo.py:413
#, python-format
msgid "Usage: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
-msgstr ""
+msgstr "বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦ªà§à¦°à¦£à¦¾à¦²à§€: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
#: ../src/plugins/abrt-action-install-debuginfo.py:442
-#, fuzzy
msgid "You have to specify the path to coredump."
-msgstr "কপি করার উদà§à¦¦à§‡à¦¶à§à¦¯à§‡ à¦à¦•à¦Ÿà¦¿ বিপরà§à¦¯à§Ÿ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨à¥¤"
+msgstr "coredump-র পাথ নিরà§à¦§à¦¾à¦°à¦£ করা আবশà§à¦¯à¦•à¥¤"
#: ../src/plugins/abrt-action-install-debuginfo.py:446
-#, fuzzy
msgid "You have to specify the path to cachedir."
-msgstr "কপি করার উদà§à¦¦à§‡à¦¶à§à¦¯à§‡ à¦à¦•à¦Ÿà¦¿ বিপরà§à¦¯à§Ÿ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨à¥¤"
+msgstr "cachedir-র পাথ নিরà§à¦§à¦¾à¦°à¦£ করা আবশà§à¦¯à¦•à¥¤"
#: ../src/plugins/abrt-action-install-debuginfo.py:450
-#, fuzzy
msgid "You have to specify the path to tmpdir."
-msgstr "কপি করার উদà§à¦¦à§‡à¦¶à§à¦¯à§‡ à¦à¦•à¦Ÿà¦¿ বিপরà§à¦¯à§Ÿ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨à¥¤"
+msgstr "tmpdir-র পাথ নিরà§à¦§à¦¾à¦°à¦£ করা আবশà§à¦¯à¦•à¥¤"
#: ../src/plugins/abrt-action-install-debuginfo.py:463
msgid "All debuginfo seems to be available"
-msgstr ""
+msgstr "সরà§à¦¬à¦§à¦°à¦¨à§‡à¦° ডিবাগ-ইনফো সমà§à¦­à¦¬à¦¤ উপলবà§à¦§ রয়েছে"
#: ../src/plugins/abrt-action-install-debuginfo.py:470
-#, fuzzy
msgid "Complete!"
-msgstr "অংশবিশেষ"
+msgstr "সমাপà§à¦¤!"
-#: ../src/plugins/abrt-action-kerneloops.cpp:111
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-kerneloops.cpp:105
+#, c-format
msgid "Submitting oops report to %s"
-msgstr "'%s'-ঠরিপোরà§à¦Ÿ লেখা হচà§à¦›à§‡"
+msgstr "%s-ঠoops রিপোরà§à¦Ÿ দায়ের করা হচà§à¦›à§‡"
-#: ../src/plugins/abrt-action-mailx.cpp:114
+#: ../src/plugins/abrt-action-mailx.cpp:109
msgid "Sending an email..."
msgstr "ই-মেইল পাঠানো হচà§à¦›à§‡..."
-#: ../src/plugins/abrt-action-mailx.cpp:138
+#: ../src/plugins/abrt-action-mailx.cpp:135
msgid ""
" [-v] -d DIR [-c CONFFILE]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d DIR [-c CONFFILE]\n"
+"\n"
+"কà§à¦°à§à¦¯à¦¾à¦¶ ডামà§à¦ªà§‡à¦° কমà§à¦ªà§à¦°à§‡à¦¸ করার tarball আপলোড করতে বà§à¦¯à¦¬à¦¹à§ƒà¦¤"
-#: ../src/plugins/abrt-action-mailx.cpp:151
-#: ../src/plugins/abrt-action-upload.cpp:267
-#, fuzzy
+#: ../src/plugins/abrt-action-mailx.cpp:148
+#: ../src/plugins/abrt-action-upload.cpp:262
msgid "Config file"
-msgstr "লগর ফাইল:"
+msgstr "কনফিগ ফাইল"
-#: ../src/plugins/abrt-action-print.cpp:39
+#: ../src/plugins/abrt-action-print.cpp:38
msgid ""
" [-v] [-o FILE] -d DIR\n"
"\n"
"Print information about the crash to standard output"
msgstr ""
+" [-v] [-o FILE] -d DIR\n"
+"\n"
+"বিপরà§à¦¯à§Ÿ সংকà§à¦°à¦¾à¦¨à§à¦¤ তথà§à¦¯ সà§à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¡à¦¾à¦°à§à¦¡ আউটপà§à¦Ÿà§‡à¦° মধà§à¦¯à§‡ লেখা হবে"
-#: ../src/plugins/abrt-action-print.cpp:51
+#: ../src/plugins/abrt-action-print.cpp:50
msgid "Output file"
-msgstr ""
+msgstr "আউটপà§à¦Ÿ ফাইল"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.cpp:91
#, c-format
msgid "The report was appended to %s"
msgstr "%s-র সাথে রিপোরà§à¦Ÿ সংযোজন করা হয়েছে"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.cpp:91
#, c-format
msgid "The report was stored to %s"
msgstr "%s-ঠরিপোরà§à¦Ÿ সংরকà§à¦·à¦£ করা হয়েছে"
@@ -1499,48 +1493,48 @@ msgstr "%s-ঠরিপোরà§à¦Ÿ সংরকà§à¦·à¦£ করা হয়েà¦
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
#. error msg is already logged by dd_opendir
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
-#: ../src/plugins/abrt-action-rhtsupport.cpp:43
-#: ../src/plugins/abrt-action-upload.cpp:121
+#: ../src/plugins/abrt-action-rhtsupport.cpp:41
+#: ../src/plugins/abrt-action-upload.cpp:120
msgid "Compressing data"
-msgstr ""
+msgstr "তথà§à¦¯ সংকà§à¦šà¦¨ করা হচà§à¦›à§‡"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:78
-#, fuzzy
+#: ../src/plugins/abrt-action-rhtsupport.cpp:69
msgid "Empty login or password, please check RHTSupport.conf"
-msgstr ""
-"লগ-ইন ও পাসওয়ারà§à¦¡ লেখা হয়নি।\n"
-"অনà§à¦—à§à¦°à¦¹ করে পরীকà§à¦·à¦¾ করà§à¦¨ "
+msgstr "লগ-ইন ও পাসওয়ারà§à¦¡ লেখা হয়নি, অনà§à¦—à§à¦°à¦¹ করে RHTSupport.conf পরীকà§à¦·à¦¾ করà§à¦¨ "
-#: ../src/plugins/abrt-action-rhtsupport.cpp:194
+#: ../src/plugins/abrt-action-rhtsupport.cpp:188
msgid "Creating a new case..."
msgstr "à¦à¦•à¦Ÿà¦¿ নতà§à¦¨ কেস নিরà§à¦®à¦¾à¦£ করা হচà§à¦›à§‡..."
-#: ../src/plugins/abrt-action-upload.cpp:65
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-upload.cpp:64
+#, c-format
msgid "Sending %s to %s"
-msgstr "%s আরà§à¦•à¦¾à¦‡à¦­à¦Ÿà¦¿ %s-ঠপà§à¦°à§‡à¦°à¦¿à¦¤ হচà§à¦›à§‡"
+msgstr "%s, %s-ঠপà§à¦°à§‡à¦°à¦¿à¦¤ হচà§à¦›à§‡"
#. This ends up a "reporting status message" in abrtd
-#: ../src/plugins/abrt-action-upload.cpp:98
+#: ../src/plugins/abrt-action-upload.cpp:97
#, c-format
msgid "Successfully sent %s to %s"
-msgstr ""
+msgstr "%s-কে সাফলà§à¦¯à§‡à¦° সাথে to %s-ঠপাঠানো হয়েছে"
-#: ../src/plugins/abrt-action-upload.cpp:219
+#: ../src/plugins/abrt-action-upload.cpp:214
#, c-format
msgid "Archive is created: '%s'"
-msgstr ""
+msgstr "আরà§à¦•à¦¾à¦‡à¦­ পà§à¦°à¦¸à§à¦¤à§à¦¤ করা হয়েছে: '%s'"
-#: ../src/plugins/abrt-action-upload.cpp:253
+#: ../src/plugins/abrt-action-upload.cpp:248
msgid ""
" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
+"\n"
+"কà§à¦°à§à¦¯à¦¾à¦¶ ডামà§à¦ªà§‡à¦° কমà§à¦ªà§à¦°à§‡à¦¸ করার tarball আপলোড করতে বà§à¦¯à¦¬à¦¹à§ƒà¦¤"
-#: ../src/plugins/abrt-action-upload.cpp:268
+#: ../src/plugins/abrt-action-upload.cpp:263
msgid "Base URL to upload to"
-msgstr ""
+msgstr "আপলোড করার উদà§à¦¦à§‡à¦¶à§à¦¯à§‡ চিহà§à¦¨à¦¿à¦¤ বেস URL"
#: ../src/plugins/Bugzilla.glade.h:1
msgid "<b>Bugzilla plugin configuration</b>"
@@ -1578,7 +1572,7 @@ msgstr ""
"<a href=\"https://bugzilla.redhat.com/createaccount.cgi\">à¦à¦‡à¦–ানে</a> তৈরি "
"করা যাবে।"
-#: ../src/plugins/CCpp.cpp:277
+#: ../src/plugins/CCpp.cpp:265
msgid "Analyzes crashes in C/C++ programs"
msgstr "C/C++ পà§à¦°à§‹à¦—à§à¦°à¦¾à¦®à§‡à¦° মধà§à¦¯à§‡ বিপরà§à¦¯à§Ÿ বিশà§à¦²à§‡à¦·à¦£ করা হয়"
@@ -1590,7 +1584,7 @@ msgstr "<b>Kerneloops Reporter পà§à¦²à¦¾à¦—-ইন কনফিগারেà¦
msgid "Submit URL:"
msgstr "URL জমা করà§à¦¨:"
-#: ../src/plugins/KerneloopsScanner.cpp:227
+#: ../src/plugins/KerneloopsScanner.cpp:226
msgid "Periodically scans for and saves kernel oopses"
msgstr "কারà§à¦¨à§‡à¦² oops-গà§à¦²à¦¿ নিয়মিতরূপে সà§à¦•à§à¦¯à¦¾à¦¨ করে সংরকà§à¦·à¦£ করা হয়"
@@ -1639,9 +1633,8 @@ msgid "RHTSupport URL:"
msgstr "RHTSupport URL:"
#: ../src/plugins/Upload.glade.h:1
-#, fuzzy
msgid "<b>Upload plugin configuration</b>"
-msgstr "<b>Report Uploader পà§à¦²à¦¾à¦—-ইন কনফিগারেশন</b>"
+msgstr "<b>আপলোড পà§à¦²à¦¾à¦—-ইনের কনফিগারেশন</b>"
#: ../src/plugins/Upload.glade.h:2
msgid "Retry count:"
diff --git a/po/cs.po b/po/cs.po
index dacd2983..60b5ca3a 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -3,6 +3,7 @@
# This file is distributed under the same license as the ABRT package.
# Petr Pisar <ppisar@redhat.com>, 2010.
# Jiří MoskovÄák <jmoskovc@redhat.com>, 2010.
+# Milan Kerslager <milan@kerslager.cz>, 2010.
#
# backtrace → výpis/zásobník volání
# component → komponenta
@@ -16,16 +17,15 @@
# http://www.bugzilla.cz/index.html
# http://bugzilla.abclinuxu.cz/
# bug → (obecně) požadavek, v případě druhu chyba připouštím chybové hlášení.
-# Milan Kerslager <milan@kerslager.cz>, 2010.
+#
msgid ""
msgstr ""
-"Project-Id-Version: abrt 1.1.13\n"
+"Project-Id-Version: abrt master\n"
"Report-Msgid-Bugs-To: jmoskovc@redhat.com\n"
-"POT-Creation-Date: 2010-11-29 13:51+0100\n"
-"PO-Revision-Date: 2010-09-10 10:59+0200\n"
-"Last-Translator: Milan Kerslager <milan@kerslager.cz>\n"
-"Language-Team: Czech <Czech <cs-users@lists.fedoraproject.org>>\n"
-"Language: \n"
+"POT-Creation-Date: 2010-12-06 08:55+0000\n"
+"PO-Revision-Date: 2010-12-06 14:57+0100\n"
+"Last-Translator: Petr Pisar <ppisar@redhat.com>\n"
+"Language-Team: <cs-users@lists.fedoraproject.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -85,7 +85,7 @@ msgstr "Spustit ABRT"
# Align collon to longest string (Hostname)
#: ../src/cli/CLI.cpp:47
-#, fuzzy, c-format
+#, c-format
msgid ""
"\tCrash dump : %s\n"
"\tUID : %s\n"
@@ -94,8 +94,8 @@ msgid ""
"\tCrash Time : %s\n"
"\tCrash Count: %s\n"
msgstr ""
+"\tVýpis pádu : %s\n"
"\tUID : %s\n"
-"\tUUID : %s\n"
"\tBalík : %s\n"
"\tProgram : %s\n"
"\tDoba pádu : %s\n"
@@ -107,7 +107,7 @@ msgid "\tHostname : %s\n"
msgstr "\tNázev stroje: %s\n"
#: ../src/cli/CLI.cpp:98
-#, fuzzy, c-format
+#, c-format
msgid ""
"Dump directory: %s\n"
"Last crash: %s\n"
@@ -119,7 +119,7 @@ msgid ""
"System: %s, kernel %s\n"
"Reason: %s\n"
msgstr ""
-"ID pádu: %s:%s\n"
+"Adresář s výpisy %s\n"
"Poslední pád: %s\n"
"Analyzátor: %s\n"
"Komponenta: %s\n"
@@ -183,13 +183,14 @@ msgstr ""
"%s\n"
#. Message has embedded tabs.
-#: ../src/cli/CLI.cpp:243
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:244
+#, c-format
msgid ""
"Usage: %s [OPTION]\n"
"\n"
"Startup:\n"
"\t-V, --version\t\tdisplay the version of %s and exit\n"
+"\t-v, --verbose\t\tincrease verbosity\n"
"\t-?, --help\t\tprint this help\n"
"\n"
"Actions:\n"
@@ -210,6 +211,7 @@ msgstr ""
"\n"
"Rozjezd:\n"
"\t-V, --version\t\tzobrazí verzi %s a skonÄí\n"
+"\t-v, --verbose\t\tpodrobnější výpisy\n"
"\t-?, --help\t\tzobrazí tuto nápovědu\n"
"\n"
"Akce:\n"
@@ -222,11 +224,10 @@ msgstr ""
"\t -b, --backtrace\tvypíše podrobné údaje o pádu vÄetnÄ› zásobníku "
"volání\n"
"ID_PÃDU může být:\n"
-"\tdvojice UID:UUID,\n"
-"\tjednoznaÄná pÅ™edpona UUID – zpracuje se pád s odpovídajícím UUID\n"
-"\t@N – zpracuje se N-tý pád (poÅ™adí urÄeno výpisem --get-list-full)\n"
+"\tnázev adresáře s výpisy pádu nebo\n"
+"\t@N – zpracuje se N-tý pád (poÅ™adí urÄeno výpisem --list --full)\n"
-#: ../src/cli/CLI.cpp:287
+#: ../src/cli/CLI.cpp:288
msgid "You must specify exactly one operation"
msgstr "Musíte zadat právě jednu operaci"
@@ -309,76 +310,78 @@ msgstr ""
"V hlášení nebyly nalezeny žádné změny"
#. The response might take more than 1 char in non-latin scripts.
-#: ../src/cli/report.cpp:464
+#: ../src/cli/report.cpp:445
msgid "y"
msgstr "a"
-#: ../src/cli/report.cpp:465
+#: ../src/cli/report.cpp:446
msgid "N"
msgstr "N"
#. Read the missing information and push it to plugin settings.
-#: ../src/cli/report.cpp:565
+#: ../src/cli/report.cpp:563
#, c-format
msgid "Wrong settings were detected for plugin %s\n"
msgstr "Zjištěno chybné nastavení modulu %s\n"
-#: ../src/cli/report.cpp:569
+#: ../src/cli/report.cpp:567
msgid "Enter your login: "
msgstr "Zadejte vaše přihlašovací jméno: "
-#: ../src/cli/report.cpp:575
+#: ../src/cli/report.cpp:573
msgid "Enter your password: "
msgstr "Zadejte vaše heslo: "
-#: ../src/cli/report.cpp:638
+#: ../src/cli/report.cpp:635
msgid "Reporting..."
msgstr "Nahlašuje se…"
-#: ../src/cli/report.cpp:657
+#: ../src/cli/report.cpp:654
#, c-format
msgid "Report using %s?"
msgstr "Nahlásit prostřednictvím %s?"
-#: ../src/cli/report.cpp:660
+#: ../src/cli/report.cpp:657
msgid "Skipping..."
msgstr "Vynecháno…"
-#: ../src/cli/report.cpp:672
+#: ../src/cli/report.cpp:669
msgid "Reporting disabled because the backtrace is unusable"
msgstr "Nahlašování zakázáno, protože výpis volání není použitelný"
-#: ../src/cli/report.cpp:676
+#: ../src/cli/report.cpp:673
#, c-format
msgid ""
"Please try to install debuginfo manually using the command: \"debuginfo-"
"install %s\" and try again\n"
msgstr ""
-"Zkuste nainstalovat debuginfo balíÄky ruÄnÄ› pomocí \"debuginfo-install %s\" "
-"a zkuste to znovu\n"
+"Zkuste nainstalovat balíÄky s ladicími údaji ruÄnÄ› pomocí "
+"„debuginfo-install %s“ a zkuste to znovu\n"
-#: ../src/cli/report.cpp:685
+#: ../src/cli/report.cpp:682
msgid "Error loading reporter settings"
msgstr "Chyba při nahrávání údajů ohlašovatele"
# FIXME: Plurals
-#: ../src/cli/report.cpp:704
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:702
+#, c-format
msgid "Crash reported via %d report events (%d errors)\n"
-msgstr "Pád nahlášen prostřednictvím %d modulů (%d chyb)\n"
+msgstr "Pád nahlášen prostřednictvím %d oznamovacích událostí (%d chyb)\n"
#: ../src/daemon/abrt-handle-crashdump.c:42
msgid ""
" [-vs] -d DIR -e EVENT\n"
" or: "
msgstr ""
+" [-vs] -d ADRESÃŘ -e UDÃLOST\n"
+" nebo: "
#: ../src/daemon/abrt-handle-crashdump.c:57
#: ../src/plugins/abrt-action-analyze-c.c:167
#: ../src/plugins/abrt-action-analyze-oops.c:144
#: ../src/plugins/abrt-action-analyze-python.c:49
msgid "Log to syslog"
-msgstr ""
+msgstr "Protokolovat do syslogu"
#: ../src/daemon/abrt-handle-crashdump.c:58
#: ../src/plugins/abrt-action-analyze-c.c:166
@@ -388,15 +391,15 @@ msgstr ""
#: ../src/plugins/abrt-action-print.cpp:50
#: ../src/plugins/abrt-action-upload.cpp:266
msgid "Crash dump directory"
-msgstr ""
+msgstr "Adresář s výpisy pádu"
#: ../src/daemon/abrt-handle-crashdump.c:59
msgid "Handle EVENT"
-msgstr ""
+msgstr "Obstarat UDÃLOST"
#: ../src/daemon/abrt-handle-crashdump.c:60
msgid "List possible events [which start with PFX]"
-msgstr ""
+msgstr "Vypsat možné události [které zaÄínají na PFX]"
#: ../src/daemon/CommLayerServerDBus.cpp:229
msgid "Comment is too long"
@@ -416,19 +419,19 @@ msgstr ""
#: ../src/daemon/Daemon.cpp:699
msgid "abrtd [options]"
-msgstr ""
+msgstr "abrtd [PŘEPÃNAÄŒE]"
#: ../src/daemon/Daemon.cpp:709
msgid "Do not daemonize"
-msgstr ""
+msgstr "Nedémonizuje se"
#: ../src/daemon/Daemon.cpp:710
msgid "Log to syslog even with -d"
-msgstr ""
+msgstr "Protokoluje do syslogu i s -d"
#: ../src/daemon/Daemon.cpp:711
msgid "Exit after SEC seconds of inactivity"
-msgstr ""
+msgstr "SkonÄí po N sekundách neÄinnosti"
#: ../src/gui/abrt.desktop.in.h:2
msgid "View and report application crashes"
@@ -551,7 +554,7 @@ msgstr ""
"Kopii Obecné veřejné licence GNU byste měli dostat spolu s tímto programem. "
"Nestalo-li se tak, vize <http://www.gnu.org/licenses/>."
-#: ../src/gui/ccgui.glade.h:19 ../src/gui/CReporterAssistant.py:71
+#: ../src/gui/ccgui.glade.h:19 ../src/gui/CReporterAssistant.py:111
msgid "View log"
msgstr "Zobrazit log"
@@ -653,7 +656,7 @@ msgstr "Zde struÄnÄ› popiÅ¡te, jak pád vyprovokovat nebo co jste dÄ›lali…"
msgid "You must check the backtrace for sensitive data."
msgstr "Výpis volání je třeba zkontrolovat na citlivá data."
-#: ../src/gui/CCReporterDialog.py:118 ../src/gui/CReporterAssistant.py:364
+#: ../src/gui/CCReporterDialog.py:118 ../src/gui/CReporterAssistant.py:392
#, python-format
msgid ""
"Reporting disabled because the backtrace is unusable.\n"
@@ -670,8 +673,8 @@ msgstr ""
msgid "The backtrace is unusable, you cannot report this!"
msgstr "Výpis volání je nepoužitelný, toto nelze odeslat!"
-#: ../src/gui/CCReporterDialog.py:124 ../src/gui/CReporterAssistant.py:342
-#: ../src/gui/CReporterAssistant.py:370
+#: ../src/gui/CCReporterDialog.py:124 ../src/gui/CReporterAssistant.py:370
+#: ../src/gui/CReporterAssistant.py:398
msgid ""
"The backtrace is incomplete, please make sure you provide the steps to "
"reproduce."
@@ -695,7 +698,7 @@ msgstr ""
"Pro tento druh pádu není přiřazený žádný ohlašovací modul.\n"
"Prosím, zkontrolujte abrt.conf."
-#: ../src/gui/CCReporterDialog.py:418 ../src/gui/CReporterAssistant.py:249
+#: ../src/gui/CCReporterDialog.py:418 ../src/gui/CReporterAssistant.py:277
#: ../src/gui/PluginsSettingsDialog.py:136
#, python-format
msgid ""
@@ -705,12 +708,12 @@ msgstr ""
"Nastavení modulu se nepodařilo uložit:\n"
" %s"
-#: ../src/gui/CCReporterDialog.py:448 ../src/gui/CReporterAssistant.py:279
+#: ../src/gui/CCReporterDialog.py:448 ../src/gui/CReporterAssistant.py:307
#, python-format
msgid "Configure %s options"
msgstr "Nastavit modul %s"
-#: ../src/gui/CCReporterDialog.py:498 ../src/gui/CReporterAssistant.py:1074
+#: ../src/gui/CCReporterDialog.py:498 ../src/gui/CReporterAssistant.py:1102
msgid ""
"Unable to get report!\n"
"Is debuginfo missing?"
@@ -718,7 +721,7 @@ msgstr ""
"Hlášení se nepodařilo se získat!\n"
"Nechybí ladicí informace?"
-#: ../src/gui/CCReporterDialog.py:527 ../src/gui/CReporterAssistant.py:455
+#: ../src/gui/CCReporterDialog.py:527 ../src/gui/CReporterAssistant.py:483
#, python-format
msgid ""
"Reporting failed!\n"
@@ -728,7 +731,7 @@ msgstr ""
"%s"
#: ../src/gui/CCReporterDialog.py:553 ../src/gui/CCReporterDialog.py:574
-#: ../src/gui/CReporterAssistant.py:1113
+#: ../src/gui/CReporterAssistant.py:1139
#, python-format
msgid "Error acquiring the report: %s"
msgstr "Chyba při získávání hlášení: %s"
@@ -765,38 +768,38 @@ msgstr "Přístup ke gnome-keyring byl zamítnut. Nastavení nelze naÄíst."
msgid "Crash info doesn't contain a backtrace"
msgstr "Údaje o pádu neobsahují výpis volání"
-#: ../src/gui/CReporterAssistant.py:334
+#: ../src/gui/CReporterAssistant.py:362
#, python-format
msgid "Rating is %s"
msgstr "Hodnocení je %s"
-#: ../src/gui/CReporterAssistant.py:337
+#: ../src/gui/CReporterAssistant.py:365
msgid "Crashdump doesn't have rating => we suppose it's not required"
msgstr "Výpis pádu neobsahuje hodnocení → předpokládá se, že nebude potřeba"
-#: ../src/gui/CReporterAssistant.py:350
+#: ../src/gui/CReporterAssistant.py:378
msgid "You should check the backtrace for sensitive data."
msgstr "Ve výpisu volání byste měli zkontrolovat citlivá data."
-#: ../src/gui/CReporterAssistant.py:351
+#: ../src/gui/CReporterAssistant.py:379
msgid "You must agree with sending the backtrace."
msgstr "S odesláním výpisu volání musíte souhlasit."
-#: ../src/gui/CReporterAssistant.py:366
+#: ../src/gui/CReporterAssistant.py:394
msgid "Reporting disabled because the backtrace is unusable."
msgstr ""
"Odeslání hlášení není povoleno, protože výpis volání je nepoužitelný."
"Odeslání hlášení není povoleno, protože výpis volání je nepoužitelný."
-#: ../src/gui/CReporterAssistant.py:412
+#: ../src/gui/CReporterAssistant.py:440
msgid "You did not provide any steps to reproduce."
msgstr "Neposkytli jste žádný návod, jak problém vyvolat."
-#: ../src/gui/CReporterAssistant.py:426
+#: ../src/gui/CReporterAssistant.py:454
msgid "You did not provide any comments."
msgstr "Neposkytli jste žádné komentáře."
-#: ../src/gui/CReporterAssistant.py:507
+#: ../src/gui/CReporterAssistant.py:535
#, python-format
msgid ""
"It looks like an application from the package <b>%s</b> has crashed on your "
@@ -821,15 +824,15 @@ msgstr ""
"\n"
"Zvolte, kam si pÅ™ejete chybu nahlásit, pokraÄujte stisknutím „Další“."
-#: ../src/gui/CReporterAssistant.py:548
+#: ../src/gui/CReporterAssistant.py:576
msgid "Only one reporter plugin is configured."
msgstr "Nastavený je pouze jeden ohlašovací modul."
-#: ../src/gui/CReporterAssistant.py:554
+#: ../src/gui/CReporterAssistant.py:582
msgid "Send a bug report"
msgstr "Odeslat chybové hlášení"
-#: ../src/gui/CReporterAssistant.py:592
+#: ../src/gui/CReporterAssistant.py:620
msgid ""
"Below is the backtrace associated with your crash. A crash backtrace "
"provides developers with details about how the crash happened, helping them "
@@ -845,50 +848,51 @@ msgstr ""
"Prosím, prohlédněte si následující výpis a případně je upravte tak, aby "
"neobsahoval citlivé údaje, které si chcete uchovat v soukromí:"
-#: ../src/gui/CReporterAssistant.py:663 ../src/gui/CReporterAssistant.py:676
-#: ../src/gui/CReporterAssistant.py:710
+# FIXME: Plurals
+#: ../src/gui/CReporterAssistant.py:691 ../src/gui/CReporterAssistant.py:704
+#: ../src/gui/CReporterAssistant.py:738
#, python-format
msgid "Found %i occurence(s) [at: %i of %i]"
-msgstr ""
+msgstr "Nalezeno výskytů: %i [v: %i z %i]"
-#: ../src/gui/CReporterAssistant.py:747
+#: ../src/gui/CReporterAssistant.py:775
msgid "Search:"
-msgstr ""
+msgstr "Najít:"
-#: ../src/gui/CReporterAssistant.py:778
+#: ../src/gui/CReporterAssistant.py:806
msgid "Refresh"
msgstr "Obnovit"
-#: ../src/gui/CReporterAssistant.py:780
+#: ../src/gui/CReporterAssistant.py:808
msgid "Copy"
msgstr "Kopírovat"
-#: ../src/gui/CReporterAssistant.py:786
+#: ../src/gui/CReporterAssistant.py:814
msgid "I agree with submitting the backtrace"
msgstr "Souhlasím s odesláním výpisu volání"
-#: ../src/gui/CReporterAssistant.py:791
+#: ../src/gui/CReporterAssistant.py:819
msgid "Approve the backtrace"
msgstr "Schválit výpis volání"
-#: ../src/gui/CReporterAssistant.py:834
+#: ../src/gui/CReporterAssistant.py:862
msgid "You need to fill the how to before you can proceed..."
-msgstr ""
+msgstr "Než budete moci pokraÄovat, je tÅ™eba vyplnit jak pÅ™ivodit pád…"
-#: ../src/gui/CReporterAssistant.py:857
+#: ../src/gui/CReporterAssistant.py:885
msgid "How did this crash happen (step-by-step)? How would you reproduce it?"
msgstr "Jak došlo k pádu (krok za krokem)? Je byste jej vyvolali?"
-#: ../src/gui/CReporterAssistant.py:877
+#: ../src/gui/CReporterAssistant.py:905
msgid ""
"Are there any comments you would like to share with the software maintainers?"
msgstr "Máte nějaké připomínky, které byste rádi předali správcům programu?"
-#: ../src/gui/CReporterAssistant.py:897
+#: ../src/gui/CReporterAssistant.py:925
msgid "Provide additional details"
msgstr "Poskytnout dodateÄné údaje"
-#: ../src/gui/CReporterAssistant.py:904
+#: ../src/gui/CReporterAssistant.py:932
msgid ""
"<b>Tip:</b> Your comments are not private. Please watch what you say "
"accordingly."
@@ -896,80 +900,80 @@ msgstr ""
"<b>Připomínka:</b> Komentář nebude soukromý. Prosím, dejte si pozor na to, "
"co říkáte."
-#: ../src/gui/CReporterAssistant.py:945
+#: ../src/gui/CReporterAssistant.py:973
msgid "Confirm and send the report"
msgstr "Potvrdit a odeslat hlášení"
-#: ../src/gui/CReporterAssistant.py:947
+#: ../src/gui/CReporterAssistant.py:975
msgid ""
"Below is a summary of your bug report. Please click 'Apply' to submit it."
msgstr ""
"Níže je shrnuto vaše chybového hlášení. Prosím, hlášení odešlete klikněte na "
"„Použít“."
-#: ../src/gui/CReporterAssistant.py:952
+#: ../src/gui/CReporterAssistant.py:980
msgid "<b>Basic details</b>"
msgstr "<b>Základní údaje</b>"
#. left table
-#: ../src/gui/CReporterAssistant.py:959
+#: ../src/gui/CReporterAssistant.py:987
msgid "Component"
msgstr "Komponenta"
-#: ../src/gui/CReporterAssistant.py:960
+#: ../src/gui/CReporterAssistant.py:988
msgid "Package"
msgstr "BalíÄek"
-#: ../src/gui/CReporterAssistant.py:961
+#: ../src/gui/CReporterAssistant.py:989
msgid "Executable"
msgstr "Program"
-#: ../src/gui/CReporterAssistant.py:962
+#: ../src/gui/CReporterAssistant.py:990
msgid "Cmdline"
msgstr "Příkaz"
#. right table
-#: ../src/gui/CReporterAssistant.py:964
+#: ../src/gui/CReporterAssistant.py:992
msgid "Architecture"
msgstr "Architektura"
-#: ../src/gui/CReporterAssistant.py:965
+#: ../src/gui/CReporterAssistant.py:993
msgid "Kernel"
msgstr "Jádro"
-#: ../src/gui/CReporterAssistant.py:966
+#: ../src/gui/CReporterAssistant.py:994
msgid "Release"
msgstr "Vydání"
-#: ../src/gui/CReporterAssistant.py:967
+#: ../src/gui/CReporterAssistant.py:995
msgid "Reason"
msgstr "Důvod"
-#: ../src/gui/CReporterAssistant.py:978 ../src/gui/report.glade.h:3
+#: ../src/gui/CReporterAssistant.py:1006 ../src/gui/report.glade.h:3
msgid "<b>Backtrace</b>"
msgstr "<b>Výpis volání</b>"
-#: ../src/gui/CReporterAssistant.py:981
+#: ../src/gui/CReporterAssistant.py:1009
msgid "Click to view..."
msgstr "Zobraz kliknutím…"
-#: ../src/gui/CReporterAssistant.py:993
+#: ../src/gui/CReporterAssistant.py:1021
msgid "<b>Steps to reproduce:</b>"
msgstr "<b>Jak vyvolat:</b>"
-#: ../src/gui/CReporterAssistant.py:1014
+#: ../src/gui/CReporterAssistant.py:1042
msgid "<b>Comments:</b>"
msgstr "<b>Komentáře:</b>"
-#: ../src/gui/CReporterAssistant.py:1017
+#: ../src/gui/CReporterAssistant.py:1045
msgid "No comment provided!"
msgstr "Žádné komentáře nepřipojeny!"
-#: ../src/gui/CReporterAssistant.py:1053
+#: ../src/gui/CReporterAssistant.py:1081
msgid "Finished sending the bug report"
msgstr "Odesílání chybového hlášení dokonÄeno"
-#: ../src/gui/CReporterAssistant.py:1057
+#: ../src/gui/CReporterAssistant.py:1085
msgid "<b>Bug reports:</b>"
msgstr "<b>Chybová hlášení:</b>"
@@ -1015,7 +1019,6 @@ msgid "Name"
msgstr "Název"
#: ../src/gui/PluginsSettingsDialog.py:118
-#, fuzzy
msgid "Please select a plugin from the list to edit its options."
msgstr "Prosím, ze seznamu vyberte modul, jehož nastavení chcete upravit."
@@ -1246,7 +1249,7 @@ msgstr "Nahráno: %'llu z %'llu kilobajtů"
#: ../src/lib/parse_options.c:11
#, c-format
msgid "Usage: %s\n"
-msgstr ""
+msgstr "Použití: %s\n"
#: ../src/plugins/abrt-action-analyze-c.c:154
msgid ""
@@ -1254,6 +1257,9 @@ msgid ""
"\n"
"Calculates and saves UUID of coredumps"
msgstr ""
+" [-vs] -d ADRESÃŘ\n"
+"\n"
+"VypoÄte a uloží UUID obrazů pamÄ›ti"
#: ../src/plugins/abrt-action-analyze-oops.c:131
msgid ""
@@ -1261,6 +1267,9 @@ msgid ""
"\n"
"Calculates and saves UUID and DUPHASH of oops crash dumps"
msgstr ""
+" [-vs] -d ADRESÃŘ\n"
+"\n"
+"VypoÄte a uloží UUID a DUPHASH výpisů pádů oops"
#: ../src/plugins/abrt-action-analyze-python.c:36
msgid ""
@@ -1268,6 +1277,9 @@ msgid ""
"\n"
"Calculates and saves UUID and DUPHASH of python crash dumps"
msgstr ""
+" [-vs] -d ADRESÃŘ\n"
+"\n"
+"VypoÄte a uloží UUID a DUPHASH výpisů pádů pythonu"
#: ../src/plugins/abrt-action-bugzilla.cpp:532
#, c-format
@@ -1277,14 +1289,12 @@ msgstr "Číslo nové chyby: %i"
#: ../src/plugins/abrt-action-bugzilla.cpp:645
#, c-format
msgid "Can't open '%s'"
-msgstr ""
+msgstr "„%s“ nelze otevřít"
#: ../src/plugins/abrt-action-bugzilla.cpp:665
-#, fuzzy, c-format
+#, c-format
msgid "Empty login or password, please check %s"
-msgstr ""
-"Prázdné přihlašovací jméno nebo heslo.\n"
-"Zkontrolujte správnost "
+msgstr "Prázdné přihlašovací jméno nebo heslo, prosím, zkontrolujte %s"
#: ../src/plugins/abrt-action-bugzilla.cpp:683
msgid "Logging into bugzilla..."
@@ -1342,127 +1352,125 @@ msgstr "K chybě %d se přidává nový komentář"
#: ../src/plugins/abrt-action-generate-backtrace.c:319
#, c-format
msgid "Backtrace parsing failed for %s"
-msgstr ""
+msgstr "Rozbor zásobníku volání v %s se nezdařil"
+# extracting = unpacking RPM package
#: ../src/plugins/abrt-action-install-debuginfo.py:72
#, python-format
msgid "Extracting cpio from %s"
-msgstr ""
+msgstr "Z %s se vybaluje cpio"
#: ../src/plugins/abrt-action-install-debuginfo.py:77
msgid "Can't write to:"
-msgstr ""
+msgstr "Nelze zapsat do:"
#: ../src/plugins/abrt-action-install-debuginfo.py:87
msgid "Removing the temporary rpm file"
-msgstr ""
+msgstr "Odstraňuje se doÄasný RPM soubor"
#: ../src/plugins/abrt-action-install-debuginfo.py:91
#, python-format
msgid "Can't extract package: %s"
-msgstr ""
+msgstr "Balík nelze rozbalit: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:99
#, python-format
msgid "Caching files from %s made from %s"
-msgstr ""
+msgstr "Zapamatovávají se soubory z %s vyrobené z %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:107
msgid "Removing the temporary cpio file"
-msgstr ""
+msgstr "Odstraňuje se doÄasný cpio soubor"
#: ../src/plugins/abrt-action-install-debuginfo.py:110
#, python-format
msgid "Can't extract files from: %s"
-msgstr ""
+msgstr "Soubory nelze vybalit z: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:134
#: ../src/plugins/abrt-action-install-debuginfo.py:140
#, python-format
msgid "Downloading (%i of %i) %.30s : %.3s %%"
-msgstr ""
+msgstr "Stahuje se (%i z %i) %.30s : %.3s %%"
#: ../src/plugins/abrt-action-install-debuginfo.py:169
-#, fuzzy
msgid "Searching the missing debuginfo packages"
-msgstr "Vyhledávám debug-info balíÄky..."
+msgstr "Hledají se chybÄ›jící balíÄky s ladicími údaji"
#: ../src/plugins/abrt-action-install-debuginfo.py:224
#, python-format
msgid "To download: (%.2f) M / Installed size: %.2f M"
-msgstr ""
+msgstr "Ke stažení: (%.2f) M / Instalovaná velikost: %.2f M"
+# ask_yes_no() not i18ned.
#: ../src/plugins/abrt-action-install-debuginfo.py:240
msgid "Is this ok? [y/N] "
-msgstr ""
+msgstr "Je to v pořádku [y=ano/N=ne] "
#: ../src/plugins/abrt-action-install-debuginfo.py:257
#, python-format
msgid "Downloading package %s failed"
-msgstr ""
+msgstr "BalíÄek %s se nepodaÅ™ilo stáhnout"
#. recursively delete the temp dir on failure
#: ../src/plugins/abrt-action-install-debuginfo.py:268
msgid "Unpacking failed, aborting download..."
-msgstr ""
+msgstr "Rozbalování selhalo, stahovaní bude ukonÄeno…"
#: ../src/plugins/abrt-action-install-debuginfo.py:275
#, python-format
msgid "All downloaded packages have been extracted, removing %s"
-msgstr ""
+msgstr "VÅ¡echny stažené balíÄky byly rozbaleny, odstraňuje se %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:280
#, python-format
msgid "Can't remove %s, probably contains an error log"
-msgstr ""
+msgstr "%s nelze odstranit, zřejmě obsahuje chybový protokol"
#: ../src/plugins/abrt-action-install-debuginfo.py:305
#, python-format
msgid "Analyzing corefile: %(corefile_path)s"
-msgstr ""
+msgstr "Analyzuje se obraz paměti: %(corefile_path)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:384
#, python-format
msgid "Can't remove %(tmpdir_path)s: %(reason)s"
-msgstr ""
+msgstr "%(tmpdir_path)s nelze odstranit: %(reason)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:394
msgid "Exiting on user Command"
-msgstr ""
+msgstr "UkonÄeno na příkaz uživatele"
#: ../src/plugins/abrt-action-install-debuginfo.py:413
#, python-format
msgid "Usage: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
-msgstr ""
+msgstr "Použití: %s --core=<OBRAZ_PAMÄšTI> --tmpdir=<POMOCNÃ_ADRESÃŘ> "
+"--cachedir=<VYROVNÃVACÃ_ADRESÃŘ>"
#: ../src/plugins/abrt-action-install-debuginfo.py:442
-#, fuzzy
msgid "You have to specify the path to coredump."
-msgstr "Pro kopii je třeba vybrat pád."
+msgstr "Musíte zadat cestu k souboru s obrazem paměti."
#: ../src/plugins/abrt-action-install-debuginfo.py:446
-#, fuzzy
msgid "You have to specify the path to cachedir."
-msgstr "Pro kopii je třeba vybrat pád."
+msgstr "Musíte zadat cestu k vyrovnávacímu adresáři."
#: ../src/plugins/abrt-action-install-debuginfo.py:450
-#, fuzzy
msgid "You have to specify the path to tmpdir."
-msgstr "Pro kopii je třeba vybrat pád."
+msgstr "Musíte zadat cestu k pomocnému adresáři."
#: ../src/plugins/abrt-action-install-debuginfo.py:463
msgid "All debuginfo seems to be available"
-msgstr ""
+msgstr "Všechny ladicí údaje se zdají být dostupné"
#: ../src/plugins/abrt-action-install-debuginfo.py:470
-#, fuzzy
msgid "Complete!"
-msgstr "Komponenta"
+msgstr "Hotovo!"
#: ../src/plugins/abrt-action-kerneloops.cpp:111
-#, fuzzy, c-format
+#, c-format
msgid "Submitting oops report to %s"
-msgstr "Hlášení se zapisuje do „%s“"
+msgstr "Hlášení s oops se odesílá na %s"
#: ../src/plugins/abrt-action-mailx.cpp:114
msgid "Sending an email..."
@@ -1474,12 +1482,14 @@ msgid ""
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d ADRESÃŘ [-c KONFIGURAÄŒNÃ_SOUBOR]\n"
+"\n"
+"Nahraje komprimovaný archiv tar s výpisem pádu."
#: ../src/plugins/abrt-action-mailx.cpp:151
#: ../src/plugins/abrt-action-upload.cpp:267
-#, fuzzy
msgid "Config file"
-msgstr "Log soubor:"
+msgstr "KonfiguraÄní soubor"
#: ../src/plugins/abrt-action-print.cpp:39
msgid ""
@@ -1487,10 +1497,13 @@ msgid ""
"\n"
"Print information about the crash to standard output"
msgstr ""
+" [-v] [-o SOUBOR] -d ADRESÃŘ\n"
+"\n"
+"Vypíše údaje o pádu na standardní výstup."
#: ../src/plugins/abrt-action-print.cpp:51
msgid "Output file"
-msgstr ""
+msgstr "Výstupní soubor"
#: ../src/plugins/abrt-action-print.cpp:100
#, c-format
@@ -1511,31 +1524,29 @@ msgid "Compressing data"
msgstr "Komprimují se data"
#: ../src/plugins/abrt-action-rhtsupport.cpp:78
-#, fuzzy
msgid "Empty login or password, please check RHTSupport.conf"
msgstr ""
-"Prázdné přihlašovací jméno nebo heslo.\n"
-"Zkontrolujte správnost "
+"Prázdné přihlašovací jméno nebo heslo, prosím, zkontrolujte RHTSupport.conf"
#: ../src/plugins/abrt-action-rhtsupport.cpp:194
msgid "Creating a new case..."
msgstr "Vytváří se nový případ…"
#: ../src/plugins/abrt-action-upload.cpp:65
-#, fuzzy, c-format
+#, c-format
msgid "Sending %s to %s"
-msgstr "Soubor %s se odesílá na %s"
+msgstr "%s se odesílá na %s"
#. This ends up a "reporting status message" in abrtd
#: ../src/plugins/abrt-action-upload.cpp:98
#, c-format
msgid "Successfully sent %s to %s"
-msgstr ""
+msgstr "%s úspěšně odesláno na %s"
#: ../src/plugins/abrt-action-upload.cpp:219
#, c-format
msgid "Archive is created: '%s'"
-msgstr ""
+msgstr "Archiv byl vytvořen: „%s“"
#: ../src/plugins/abrt-action-upload.cpp:253
msgid ""
@@ -1543,10 +1554,13 @@ msgid ""
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d DIR [-c KONFIGURAÄŒNÃ_SOUBOR] [-u URL]\n"
+"\n"
+"Nahraje komprimovaný archiv tar s výpisem pádu."
#: ../src/plugins/abrt-action-upload.cpp:268
msgid "Base URL to upload to"
-msgstr ""
+msgstr "Základ URL, kam nahrávat"
#: ../src/plugins/Bugzilla.glade.h:1
msgid "<b>Bugzilla plugin configuration</b>"
@@ -1645,9 +1659,8 @@ msgid "RHTSupport URL:"
msgstr "RHTSupport URL:"
#: ../src/plugins/Upload.glade.h:1
-#, fuzzy
msgid "<b>Upload plugin configuration</b>"
-msgstr "<b>Konfigurace pluginu Report Uploader</b>"
+msgstr "<b>Konfigurace modulu</b>"
#: ../src/plugins/Upload.glade.h:2
msgid "Retry count:"
diff --git a/po/gu.po b/po/gu.po
index 72f76c0b..28f9d1e1 100644
--- a/po/gu.po
+++ b/po/gu.po
@@ -2,20 +2,20 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
-# Sweta Kothari <swkothar@redhat.com>, 2009, 2010.
+# Sweta Kothari <swkothar@redhat.com>, 2009, 2010, 2011.
# Ankit Patel <ankit@redhat.com>, 2010.
msgid ""
msgstr ""
"Project-Id-Version: abrt.master.gu\n"
"Report-Msgid-Bugs-To: jmoskovc@redhat.com\n"
-"POT-Creation-Date: 2010-11-29 13:51+0100\n"
-"PO-Revision-Date: 2010-08-02 13:40+0530\n"
+"POT-Creation-Date: 2011-02-07 02:41+0000\n"
+"PO-Revision-Date: 2011-02-07 14:10+0530\n"
"Last-Translator: Sweta Kothari <swkothar@redhat.com>\n"
"Language-Team: Gujarati\n"
-"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Language: \n"
"X-Generator: KBabel 1.11.4\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
"\n"
@@ -30,16 +30,16 @@ msgstr "ABRT સૂચના àªàªªàª²à«‡àªŸ"
msgid "Automatic Bug Reporting Tool"
msgstr "આપોઆપ ભૂલ અહેવાલીકરણ સાધન"
-#: ../src/applet/Applet.cpp:86
+#: ../src/applet/applet.c:86
#, c-format
msgid "A crash in the %s package has been detected"
msgstr "પેકેજ %s માં ભંગાણ ને શોધી દેવામાં આવà«àª¯à« છે"
-#: ../src/applet/Applet.cpp:88
+#: ../src/applet/applet.c:88
msgid "A crash has been detected"
msgstr "ભંગાણ ને શોધી દેવામાં આવà«àª¯à«‹ છે"
-#: ../src/applet/Applet.cpp:285
+#: ../src/applet/applet.c:285
msgid "ABRT service is not running"
msgstr "ABRT સેવા ચાલી રહી નથી"
@@ -49,11 +49,10 @@ msgid "Warning"
msgstr "ચેતવણી"
#: ../src/applet/applet_gtk.c:230
-msgid ""
-"Notification area applet that notifies users about issues detected by ABRT"
+msgid "Notification area applet that notifies users about issues detected by ABRT"
msgstr "સૂચના વિસà«àª¤àª¾àª° àªàªªàª²à«‡àªŸ કે જે ABRT દà«àª¦àª¾àª°àª¾ શોધેલ મà«àª¦à«àª¦àª¾àª“ વિશે વપરાશકરà«àª¤àª¾àª¨à«‡ સૂચિત કરે છે"
-#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:23
+#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:24
msgid "translator-credits"
msgstr "શà«àª°à«àªµà«‡àª¤àª¾ કોઠારી <swkothar@redhat.com>"
@@ -61,7 +60,7 @@ msgstr "શà«àª°à«àªµà«‡àª¤àª¾ કોઠારી <swkothar@redhat.com>"
msgid "Hide"
msgstr "છà«àªªàª¾àª¡à«‹"
-#: ../src/applet/applet_gtk.c:360 ../src/gui/ccgui.glade.h:13
+#: ../src/applet/applet_gtk.c:360 ../src/gui/ccgui.glade.h:14
msgid "Report"
msgstr "અહેવાલ"
@@ -69,8 +68,8 @@ msgstr "અહેવાલ"
msgid "Open ABRT"
msgstr "ABRT ખોલો"
-#: ../src/cli/CLI.cpp:47
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:91
+#, c-format
msgid ""
"\tCrash dump : %s\n"
"\tUID : %s\n"
@@ -79,20 +78,20 @@ msgid ""
"\tCrash Time : %s\n"
"\tCrash Count: %s\n"
msgstr ""
+"\tભંગાણ ડમà«àªª : %s\n"
"\tUID : %s\n"
-"\tUUID : %s\n"
"\tપેકેજ : %s\n"
"\tàªàª•à«àª¸àª¿àª•à«àª¯à«‚ટેબલ : %s\n"
"\tભંગાણ સમય : %s\n"
"\tભંગાણ ગણતરી: %s\n"
-#: ../src/cli/CLI.cpp:65
+#: ../src/cli/CLI.cpp:110
#, c-format
msgid "\tHostname : %s\n"
msgstr "\tયજમાનનામ : %s\n"
-#: ../src/cli/CLI.cpp:98
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:143
+#, c-format
msgid ""
"Dump directory: %s\n"
"Last crash: %s\n"
@@ -104,39 +103,37 @@ msgid ""
"System: %s, kernel %s\n"
"Reason: %s\n"
msgstr ""
-"ભંગાણ ID: %s:%s\n"
+"ડમà«àªª ડિરેકà«àªŸàª°à«€: %s\n"
"છેલà«àª²à« ભંગાણ: %s\n"
-"Analyzer: %s\n"
+"વિશà«àª²à«‡àª·àª•: %s\n"
"ઘટક: %s\n"
"પેકેજ: %s\n"
"આદેશ: %s\n"
"àªàª•à«àªàª¿àª•à«àª¯à«àªŸà«‡àª¬àª²: %s\n"
"સિસà«àªŸàª®: %s, કરà«àª¨àª² %s\n"
-"રેટિંગ: %s\n"
-"કોરડમà«àªª ફાઇલ: %s\n"
"કારણ: %s\n"
-#: ../src/cli/CLI.cpp:125
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:171
+#, c-format
msgid "Coredump file: %s\n"
-msgstr "ભંગાણ વિધેય: %s\n"
+msgstr "Coredump ફાઇલ: %s\n"
-#: ../src/cli/CLI.cpp:129
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:175
+#, c-format
msgid "Rating: %s\n"
-msgstr "યજમાનનામ: %s\n"
+msgstr "દર: %s\n"
-#: ../src/cli/CLI.cpp:134
+#: ../src/cli/CLI.cpp:180
#, c-format
msgid "Crash function: %s\n"
msgstr "ભંગાણ વિધેય: %s\n"
-#: ../src/cli/CLI.cpp:138
+#: ../src/cli/CLI.cpp:184
#, c-format
msgid "Hostname: %s\n"
msgstr "યજમાનનામ: %s\n"
-#: ../src/cli/CLI.cpp:142
+#: ../src/cli/CLI.cpp:188
#, c-format
msgid ""
"\n"
@@ -147,7 +144,7 @@ msgstr ""
"કેવી રીતે પà«àª¨:ઉતà«àªªàª¨à«àª¨ કરાય:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:146
+#: ../src/cli/CLI.cpp:192
#, c-format
msgid ""
"\n"
@@ -158,7 +155,7 @@ msgstr ""
"ટિપà«àªªàª£à«€:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:152
+#: ../src/cli/CLI.cpp:198
#, c-format
msgid ""
"\n"
@@ -169,69 +166,65 @@ msgstr ""
"બેકટà«àª°à«‡àª¸:\n"
"%s\n"
-#. Message has embedded tabs.
-#: ../src/cli/CLI.cpp:243
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:295
+#, c-format
msgid ""
-"Usage: %s [OPTION]\n"
+"Usage: %s -l[f] [-D BASE_DIR]...]\n"
+" or: %s -r[y] CRASH_DIR\n"
+" or: %s -i[b] CRASH_DIR\n"
+" or: %s -d CRASH_DIR\n"
+"\n"
+"\t-l, --list\t\tList not yet reported crashes\n"
+"\t -f, --full\t\tList all crashes\n"
+"\t-D BASE_DIR\t\tDirectory to list crashes from\n"
+"\t\t\t\t(default: -D $HOME/.abrt/spool -D %s)\n"
"\n"
-"Startup:\n"
-"\t-V, --version\t\tdisplay the version of %s and exit\n"
-"\t-?, --help\t\tprint this help\n"
+"\t-r, --report\t\tSend a report about CRASH_DIR\n"
+"\t -y, --always\t\t...without editing and asking\n"
+"\t-i, --info\t\tPrint detailed information about CRASH_DIR\n"
+"\t -b, --backtrace\t...including backtrace\n"
+"\t-d, --delete\t\tRemove CRASH_DIR\n"
"\n"
-"Actions:\n"
-"\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
-"\t -f, --full\tprint a list of all crashes, including the already "
-"reported ones\n"
-"\t-r, --report CRASH_ID\tcreate and send a report\n"
-"\t -y, --always\tcreate and send a report without asking\n"
-"\t-d, --delete CRASH_ID\tremove a crash\n"
-"\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
-"\t -b, --backtrace\tprint detailed information about a crash including "
-"backtrace\n"
-"CRASH_ID can be:\n"
-"\ta name of dump directory, or\n"
-"\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+"\t-V, --version\t\tDisplay version and exit\n"
+"\t-v, --verbose\t\tBe verbose\n"
msgstr ""
-"વપરાશ: %s [OPTION]\n"
+"વપરાશ: %s -l[f] [-D BASE_DIR]...]\n"
+" અથવા: %s -r[y] CRASH_DIR\n"
+" અથવા: %s -i[b] CRASH_DIR\n"
+" અથવા: %s -d CRASH_DIR\n"
+"\n"
+"\t-l, --list\t\tહજૠઅહેવાલ ન થયેલ ભંગાણોની યાદી લો\n"
+"\t -f, --full\t\tબધા ભંગાણોની યાદી લો\n"
+"\t-D BASE_DIR\t\tતેમાંથી ભંગાણોની યાદી કરવા માટે ડિરેકà«àªŸàª°à«€\n"
+"\t\t\t\t(default: -D $HOME/abrt/spool -D %s)\n"
"\n"
-"શરૂઆત:\n"
-"\t-V, --આવૃતà«àª¤àª¿\t\t%s ની આવૃતà«àª¤àª¿àª¨à«‡ દરà«àª¶àª¾àªµà«‹ અને બહાર નીકળો\n"
-"\t-?, --મદદ\t\tઆ મદદને છાપો\n"
+"\t-r, --report\t\tCRASH_DIR વિશે અહેવાલ મોકલો\n"
+"\t -y, --always\t\t...ફેરફાર અને પૂછà«àª¯àª¾ વગર\n"
+"\t-i, --info\t\tCRASH_DIR વિશે વિગત થયેલ જાણકારીને છાપો\n"
+"\t -b, --backtrace\t...બેકટà«àª°à«‡àª¸àª¨à«‡ સમાવી રહà«àª¯àª¾ છે\n"
+"\t-d, --delete\t\tCRASH_DIR દૂર કરો\n"
"\n"
-"Actions:\n"
-"\t-l, --યાદી\t\tબધા ભંગાણોની યાદીને છાપો કે જે હજૠઅહેવાલ થયેલ નથી\n"
-"\t -f, --સંપૂરà«àª£\tબધા ભંગાણોની યાદીને છાપો, અહેવાલ થયેલ àªàª•àª¨à«‡ પહેલેથી જ સમાવી રહà«àª¯àª¾ "
-"છે\n"
-"\t-r, --CRASH_ID નો અહેવાલ કરો\tઅહેવાલને બનાવો અને મોકલો\n"
-"\t -y, --હંમેશા\tપૂછà«àª¯àª¾ વગર અહેવાલને બનાવો અને મોકલો\n"
-"\t-d, --CRASH_ID ને કાઢી નાંખો\tભંગાણને દૂર કરો\n"
-"\t-i, --CRASH_ID ની જાણકારી\tભંગાણ વિશે વિગત થયેલ જાણકારીને છાપો\n"
-"\t -b, --બેકટà«àª°à«‡àª¸\tબેકટà«àª°à«‡àª¸àª¨à«‡ સમાવી રહà«àª¯àª¾ હોય તે ભંગાણ વિશે વિગત થયેલ જાણકારીને "
-"છાપો\n"
-"CRASH_ID હોઇ શકે છે:\n"
-"\tUID:UUID જોડણી,\n"
-"\tઅનનà«àª¯ UUID ઉપસરà«àª— - ભંગાણ ઠબંધબેસતા UUID સાથે કારà«àª¯ કરશે\n"
-"\t@N - N નà«àª‚ ભંગાણ (--list --full દà«àª¦àª¾àª°àª¾ દરà«àª¶àª¾àªµà«‡àª² પà«àª°àª®àª¾àª£à«‡) કારà«àª¯ કરશે\n"
-
-#: ../src/cli/CLI.cpp:287
+"\t-V, --version\t\tઆવૃતà«àª¤àª¿àª¨à«‡ દરà«àª¶àª¾àªµà«‹ અને બહાર નીકળો\n"
+"\t-v, --verbose\t\tવરà«àª¬à«‹àª¸ બનો\n"
+
+#: ../src/cli/CLI.cpp:343
msgid "You must specify exactly one operation"
msgstr "તમારે àªàª• કà«àª°àª¿àª¯àª¾àª¨à«‡ સà«àªªàª·à«àªŸ કરવી જ પડશે"
-#: ../src/cli/report.cpp:166
+#: ../src/cli/report.cpp:161
#, c-format
msgid "# This field is read only\n"
msgstr "# આ કà«àª·à«‡àª¤à«àª° ફકà«àª¤ વંચાય છે\n"
-#: ../src/cli/report.cpp:186
+#: ../src/cli/report.cpp:181
msgid "# Describe the circumstances of this crash below"
msgstr "# નીચે આ ભંગાણની પરિસà«àª¥àª¿àª¤àª¿àª“ને વરà«àª£àªµà«‹"
-#: ../src/cli/report.cpp:188
+#: ../src/cli/report.cpp:183
msgid "# How to reproduce the crash?"
msgstr "# ભંગાણને કેવી રીતે પà«àª¨:ઉતà«àªªàª¨à«àª¨ કરાય?"
-#: ../src/cli/report.cpp:190
+#: ../src/cli/report.cpp:185
msgid ""
"# Backtrace\n"
"# Check that it does not contain any sensitive data (passwords, etc.)"
@@ -239,47 +232,47 @@ msgstr ""
"# બેકટà«àª°à«‡àª¸\n"
"# મેં બેકટà«àª°à«‡àª¸àª¨à«‡ ચકાસેલ છે કે જે તે કોઇપણ સંવેદનશીલ માહિતીને સમાવતૠનથી (પાસવરà«àª¡à«‹, વગેરે)"
-#: ../src/cli/report.cpp:192
+#: ../src/cli/report.cpp:187
msgid "# Architecture"
msgstr "# આરà«àª•àª¿àªŸà«‡àª•à«àªšàª°"
-#: ../src/cli/report.cpp:193
+#: ../src/cli/report.cpp:188
msgid "# Command line"
msgstr "# આદેશ વાકà«àª¯"
-#: ../src/cli/report.cpp:194
+#: ../src/cli/report.cpp:189
msgid "# Component"
msgstr "# ઘટક"
-#: ../src/cli/report.cpp:195
+#: ../src/cli/report.cpp:190
msgid "# Core dump"
msgstr "# કોર ડમà«àªª"
-#: ../src/cli/report.cpp:196
+#: ../src/cli/report.cpp:191
msgid "# Executable"
msgstr "# àªàª•à«àª¸àª¿àª•à«àª¯à«‚ટેબલ"
-#: ../src/cli/report.cpp:197
+#: ../src/cli/report.cpp:192
msgid "# Kernel version"
msgstr "# કરà«àª¨àª² આવૃતà«àª¤àª¿"
-#: ../src/cli/report.cpp:198
+#: ../src/cli/report.cpp:193
msgid "# Package"
msgstr "# પેકેજ"
-#: ../src/cli/report.cpp:199
+#: ../src/cli/report.cpp:194
msgid "# Reason of crash"
msgstr "# ભંગાણનૠકારણ"
-#: ../src/cli/report.cpp:200
+#: ../src/cli/report.cpp:195
msgid "# Release string of the operating system"
msgstr "# ઓપરેટીંગ સિસà«àªŸàª®àª¨à«€ શબà«àª¦àª®àª¾àª³àª¾àª¨à«‡ પà«àª°àª•àª¾àª¶àª¿àª¤ કરો"
-#: ../src/cli/report.cpp:323
+#: ../src/cli/report.cpp:318
msgid "Cannot run vi: $TERM, $VISUAL and $EDITOR are not set"
msgstr "vi ને ચલાવી શકાતૠનથી: $TERM, $VISUAL અને $EDITOR સà«àª¯à«‹àªœàª¿àª¤ નથી"
-#: ../src/cli/report.cpp:411
+#: ../src/cli/report.cpp:402
msgid ""
"\n"
"The report has been updated"
@@ -287,7 +280,7 @@ msgstr ""
"\n"
"અહેવાલ સà«àª§àª¾àª°à«€ દેવામાં આવà«àª¯à«‹ છે"
-#: ../src/cli/report.cpp:413
+#: ../src/cli/report.cpp:404
msgid ""
"\n"
"No changes were detected in the report"
@@ -296,103 +289,129 @@ msgstr ""
"અહેવાલમાં બદલાવો શોધાયા નથી"
#. The response might take more than 1 char in non-latin scripts.
-#: ../src/cli/report.cpp:464
+#: ../src/cli/report.cpp:436
msgid "y"
-msgstr ""
+msgstr "y"
-#: ../src/cli/report.cpp:465
+#: ../src/cli/report.cpp:437
msgid "N"
-msgstr ""
+msgstr "N"
#. Read the missing information and push it to plugin settings.
-#: ../src/cli/report.cpp:565
+#: ../src/cli/report.cpp:568
#, c-format
msgid "Wrong settings were detected for plugin %s\n"
msgstr "ખોટા સà«àª¯à«‹àªœàª¨à«‹ પà«àª²àª—ઇન %s માટે શોધાયા હતા\n"
-#: ../src/cli/report.cpp:569
+#: ../src/cli/report.cpp:572
msgid "Enter your login: "
msgstr "તમારા લોગિનને દાખલ કરો: "
-#: ../src/cli/report.cpp:575
+#: ../src/cli/report.cpp:578
msgid "Enter your password: "
msgstr "તમારા પાસવરà«àª¡àª¨à«‡ દાખલ કરો: "
-#: ../src/cli/report.cpp:638
+#: ../src/cli/report.cpp:788
msgid "Reporting..."
msgstr "અહેવાલ કરી રહà«àª¯àª¾ છે..."
-#: ../src/cli/report.cpp:657
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:801
+#, c-format
msgid "Report using %s?"
-msgstr "અહેવાલ %s ને વાપરી રહà«àª¯à« છે? [y/N]: "
+msgstr "અહેવાલ %s ને વાપરી રહà«àª¯à« છે?"
-#: ../src/cli/report.cpp:660
+#: ../src/cli/report.cpp:804
msgid "Skipping..."
msgstr "છોડી રહà«àª¯àª¾ છે..."
-#: ../src/cli/report.cpp:672
-#, fuzzy
+#: ../src/cli/report.cpp:820
msgid "Reporting disabled because the backtrace is unusable"
-msgstr "અહેવાલ કરવાનà«àª‚ નિષà«àª•à«àª°àª¿àª¯ થયેલ છે કારણ કે બેકટà«àª°à«‡àª¸ ઉપયોગ કરી શકાય તેવૠનથી."
+msgstr "અહેવાલ કરવાનà«àª‚ નિષà«àª•à«àª°àª¿àª¯ થયેલ છે કારણ કે બેકટà«àª°à«‡àª¸ ઉપયોગ કરી શકાય તેવૠનથી"
-#: ../src/cli/report.cpp:676
+#: ../src/cli/report.cpp:824
#, c-format
msgid ""
"Please try to install debuginfo manually using the command: \"debuginfo-"
"install %s\" and try again\n"
msgstr ""
+"મહેરબાની કરીને આદેશની મદદથી જાતેજ ડિબગ જાણકારીને સà«àª¥àª¾àªªàª¿àª¤ કરવાનો પà«àª°àª¯àª¤à«àª¨ કરો: "
+"\"debuginfo-install %s\" અને ફરીથી પà«àª°àª¯àª¤à«àª¨ કરો\n"
-#: ../src/cli/report.cpp:685
-#, fuzzy
-msgid "Error loading reporter settings"
-msgstr "અહેવાલને મેળવી રહà«àª¯àª¾ હોય તà«àª¯àª¾àª°à«‡ ભૂલ: %s"
-
-#: ../src/cli/report.cpp:704
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:842
+#, c-format
msgid "Crash reported via %d report events (%d errors)\n"
-msgstr "%d પà«àª²àª—ઇન મારફતે અહેવાલ થયેલ ભંગાણ (%d ભૂલો)\n"
+msgstr ""
+"%d અહેવાલ ઘટનાઓ મારફતે અહેવાલ થયેલ ભંગાણ (%d ભૂલો)\n"
+")\n"
-#: ../src/daemon/abrt-handle-crashdump.c:42
+#: ../src/daemon/abrt-action-save-package-data.c:280
msgid ""
-" [-vs] -d DIR -e EVENT\n"
-" or: "
+" [options] -d DIR\n"
+"\n"
+"Query package database and save package name, component, and description"
msgstr ""
+" [વિકલà«àªªà«‹] -d DIR\n"
+"\n"
+"કà«àªµà«‡àª°à«€ પેકેજ ડેટાબેઠઅને પેકેજ નામ, ઘટક અને વરà«àª£àª¨àª¨à«‡ સંગà«àª°àª¹à«‹"
-#: ../src/daemon/abrt-handle-crashdump.c:57
+#: ../src/daemon/abrt-action-save-package-data.c:292
+#: ../src/daemon/abrt-handle-crashdump.c:60
#: ../src/plugins/abrt-action-analyze-c.c:167
#: ../src/plugins/abrt-action-analyze-oops.c:144
#: ../src/plugins/abrt-action-analyze-python.c:49
+#: ../src/plugins/abrt-action-bugzilla.cpp:927
+#: ../src/plugins/abrt-action-generate-backtrace.c:270
+#: ../src/plugins/abrt-action-kerneloops.c:147
+#: ../src/plugins/abrt-action-mailx.c:149
+#: ../src/plugins/abrt-action-print.c:50
+#: ../src/plugins/abrt-action-rhtsupport.c:281
+#: ../src/plugins/abrt-action-upload.c:261
+msgid "Crash dump directory"
+msgstr "ભંગાણ ડમà«àªª ડિરેકà«àªŸàª°à«€"
+
+#: ../src/daemon/abrt-action-save-package-data.c:293
+#: ../src/daemon/abrt-handle-crashdump.c:59 ../src/daemon/abrt-server.c:297
+#: ../src/plugins/abrt-action-bugzilla.cpp:926
+#: ../src/plugins/abrt-action-generate-backtrace.c:273
+#: ../src/plugins/abrt-action-kerneloops.c:146
+#: ../src/plugins/abrt-action-rhtsupport.c:280
+#: ../src/plugins/abrt-dump-oops.c:555
msgid "Log to syslog"
-msgstr ""
+msgstr "syslog માં લૉગ લો"
-#: ../src/daemon/abrt-handle-crashdump.c:58
-#: ../src/plugins/abrt-action-analyze-c.c:166
-#: ../src/plugins/abrt-action-analyze-oops.c:143
-#: ../src/plugins/abrt-action-analyze-python.c:48
-#: ../src/plugins/abrt-action-mailx.cpp:150
-#: ../src/plugins/abrt-action-print.cpp:50
-#: ../src/plugins/abrt-action-upload.cpp:266
-msgid "Crash dump directory"
+#: ../src/daemon/abrt-handle-crashdump.c:43
+msgid ""
+" [-vs] -d DIR -e EVENT\n"
+" or: "
msgstr ""
+" [-vs] -d DIR -e EVENT\n"
+" અથવા: "
-#: ../src/daemon/abrt-handle-crashdump.c:59
+#: ../src/daemon/abrt-handle-crashdump.c:61
msgid "Handle EVENT"
-msgstr ""
+msgstr "EVENT સંભાળો"
-#: ../src/daemon/abrt-handle-crashdump.c:60
+#: ../src/daemon/abrt-handle-crashdump.c:62
msgid "List possible events [which start with PFX]"
-msgstr ""
+msgstr "શકà«àª¯ ઘટનાઓની યાદી કરો [કે જે PFX સાથે શરૂ થાય છે]"
+
+#: ../src/daemon/abrt-server.c:286 ../src/daemon/Daemon.cpp:542
+msgid " [options]"
+msgstr " [વિકલà«àªªà«‹]"
+
+#: ../src/daemon/abrt-server.c:296
+msgid "Use UID as client uid"
+msgstr "કà«àª²àª¾àª¯àª¨à«àªŸ uid તરીકે UID ને વાપરો"
-#: ../src/daemon/CommLayerServerDBus.cpp:229
+#: ../src/daemon/CommLayerServerDBus.cpp:242
msgid "Comment is too long"
msgstr "ટિપà«àªªàª£à«€ ઘણી લાંબી છે"
-#: ../src/daemon/CommLayerServerDBus.cpp:233
+#: ../src/daemon/CommLayerServerDBus.cpp:246
msgid "'How to reproduce' is too long"
msgstr "'કેવી રીતે પà«àª¨:ઉતà«àªªàª¨à«àª¨ કરાય' ઠઘણૠલાંબૠછે"
-#: ../src/daemon/Daemon.cpp:534
+#: ../src/daemon/Daemon.cpp:371
msgid ""
"The size of the report exceeded the quota. Please check system's "
"MaxCrashReportsSize value in abrt.conf."
@@ -400,21 +419,17 @@ msgstr ""
"માપ વધારેલ કà«àªµà«‹àªŸàª¾àª¨àª¾àª‚ અહેવાલનà«àª‚ માપ. મહેરબાની કરીને સિસà«àªŸàª®àª¨à«€ MaxCrashReportsSize ને "
"abrt.conf માં ચકાસો."
-#: ../src/daemon/Daemon.cpp:699
-msgid "abrtd [options]"
-msgstr ""
-
-#: ../src/daemon/Daemon.cpp:709
+#: ../src/daemon/Daemon.cpp:553
msgid "Do not daemonize"
-msgstr ""
+msgstr "ડિમોનાઇઠકરો નહિં"
-#: ../src/daemon/Daemon.cpp:710
+#: ../src/daemon/Daemon.cpp:554
msgid "Log to syslog even with -d"
-msgstr ""
+msgstr "-d સાથે પણ syslog નો લૉગ લો"
-#: ../src/daemon/Daemon.cpp:711
+#: ../src/daemon/Daemon.cpp:555
msgid "Exit after SEC seconds of inactivity"
-msgstr ""
+msgstr "બિનપà«àª°àªµà«ƒàª¤à«àª¤àª¿àª¨à«€ SEC સેકંડો પછી બહાર નીકળો"
#: ../src/gui/abrt.desktop.in.h:2
msgid "View and report application crashes"
@@ -425,8 +440,7 @@ msgid "Another client is already running, trying to wake it..."
msgstr "બીજો કà«àª²àª¾àª‡àª¨à«àªŸ પહેલેથી જ ચાલી રહà«àª¯à«‹ છે, તેને àªàª—ાડવા માટે પà«àª°àª¯àª¤à«àª¨ કરી રહà«àª¯àª¾ છે..."
#: ../src/gui/ABRTExceptions.py:14
-msgid ""
-"Got unexpected data from the daemon (is the database properly updated?)."
+msgid "Got unexpected data from the daemon (is the database properly updated?)."
msgstr "ડિમન માંથી અનિચà«àª›àª¨à«€àª¯ માહિતી મળી (શà«àª‚ યોગà«àª¯ રીતે ડેટાબેઠસà«àª§àª¾àª°à«‡àª² છે?)."
#: ../src/gui/ABRTPlugin.py:64
@@ -449,22 +463,22 @@ msgstr "Reporter પà«àª²àª—ઇનો"
msgid "Database plugins"
msgstr "Database પà«àª²àª—ઇનો"
-#: ../src/gui/CCDBusBackend.py:74 ../src/gui/CCDBusBackend.py:97
+#: ../src/gui/CCDBusBackend.py:75 ../src/gui/CCDBusBackend.py:98
msgid "Cannot connect to system dbus."
msgstr "સિસà«àªŸàª® dbus નà«àª‚ જોડાણ કરી શકતા નથી."
-#: ../src/gui/CCDBusBackend.py:120 ../src/gui/CCDBusBackend.py:123
+#: ../src/gui/CCDBusBackend.py:121 ../src/gui/CCDBusBackend.py:124
msgid "Please check if the abrt daemon is running."
msgstr "મહેરબાની કરીને ચકાસો જો abrt ડિમન ચાલી રહà«àª¯à« છે."
#. FIXME: BUG: BarWindow remains. (how2reproduce: delete "component" in a dump dir and try to report it)
-#: ../src/gui/CCDBusBackend.py:169
+#: ../src/gui/CCDBusBackend.py:170
msgid ""
"Daemon did not return a valid report info.\n"
"Is debuginfo missing?"
msgstr ""
"ડિમનની યોગà«àª¯ અહેવાલ જાણકારી પાછી મળતી નથી\n"
-"debuginfo ગà«àª® થયેલ છે?"
+"ડિબગ જાણકારી ગà«àª® થયેલ છે?"
#: ../src/gui/ccgui.glade.h:1
msgid "(C) 2009, 2010 Red Hat, Inc."
@@ -506,11 +520,15 @@ msgstr "ABRT વિશે"
msgid "Copy to Clipboard"
msgstr "કà«àª²àª¿àªªàª¬à«‹àª°à«àª¡ માં નકલ કરો"
-#: ../src/gui/ccgui.glade.h:12 ../src/gui/settings.glade.h:19
+#: ../src/gui/ccgui.glade.h:12
+msgid "Online _Help"
+msgstr "ઓનલાઇન મદદ (_H)"
+
+#: ../src/gui/ccgui.glade.h:13 ../src/gui/settings.glade.h:19
msgid "Plugins"
msgstr "પà«àª²àª—ઇનો"
-#: ../src/gui/ccgui.glade.h:14
+#: ../src/gui/ccgui.glade.h:15
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 "
@@ -538,19 +556,19 @@ msgstr ""
"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:19 ../src/gui/CReporterAssistant.py:71
+#: ../src/gui/ccgui.glade.h:20 ../src/gui/CReporterAssistant.py:111
msgid "View log"
msgstr "લૉગને જà«àª“"
-#: ../src/gui/ccgui.glade.h:20
+#: ../src/gui/ccgui.glade.h:21
msgid "_Edit"
msgstr "ફેરફાર (_E)"
-#: ../src/gui/ccgui.glade.h:21
+#: ../src/gui/ccgui.glade.h:22
msgid "_File"
msgstr "ફાઇલ (_F)"
-#: ../src/gui/ccgui.glade.h:22
+#: ../src/gui/ccgui.glade.h:23
msgid "_Help"
msgstr "મદદ (_H)"
@@ -571,7 +589,7 @@ msgstr "યજમાનનામ"
msgid "Latest Crash"
msgstr "તાજેતરનà«àª‚ ભંગાણ"
-#: ../src/gui/CCMainWindow.py:143
+#: ../src/gui/CCMainWindow.py:148
#, python-format
msgid ""
"Cannot show the settings dialog.\n"
@@ -580,7 +598,7 @@ msgstr ""
"સંવાદ સà«àª¯à«‹àªœàª¨à«‹àª¨à«‡ બતાવી શકાતા નથી.\n"
"%s"
-#: ../src/gui/CCMainWindow.py:148
+#: ../src/gui/CCMainWindow.py:153
#, python-format
msgid ""
"Unable to finish the current task!\n"
@@ -590,7 +608,7 @@ msgstr ""
"%s"
#. there is something wrong with the daemon if we cant get the dumplist
-#: ../src/gui/CCMainWindow.py:183
+#: ../src/gui/CCMainWindow.py:188
#, python-format
msgid ""
"Error while loading the dumplist.\n"
@@ -599,7 +617,7 @@ msgstr ""
"જà«àª¯àª¾àª°à«‡ ડમà«àªªàª¯àª¾àª¦à«€àª¨à«‡ લાવી રહà«àª¯àª¾ હોય તà«àª¯àª¾àª°à«‡ ભૂલ.\n"
"%s"
-#: ../src/gui/CCMainWindow.py:241
+#: ../src/gui/CCMainWindow.py:246
#, python-format
msgid ""
"<b>%s Crash</b>\n"
@@ -608,11 +626,11 @@ msgstr ""
"<b>%s ભંગાણ</b>\n"
"%s"
-#: ../src/gui/CCMainWindow.py:337
+#: ../src/gui/CCMainWindow.py:343
msgid "You have to select a crash to copy."
msgstr "તમારે નકલ કરવા માટે ભંગાણને પસંદ કરવૠજ પડશે."
-#: ../src/gui/CCMainWindow.py:421
+#: ../src/gui/CCMainWindow.py:427
msgid ""
"Usage: abrt-gui [OPTIONS]\n"
"\t-v[vv]\t\t\tVerbose\n"
@@ -622,7 +640,7 @@ msgstr ""
"\t-v[vv]\t\t\tVerbose\n"
"\t--report=CRASH_ID\tDirectly report crash with CRASH_ID"
-#: ../src/gui/CCMainWindow.py:444
+#: ../src/gui/CCMainWindow.py:450
#, python-format
msgid ""
"No such crash in the database, probably wrong crashid.\n"
@@ -631,96 +649,6 @@ msgstr ""
"ડેટાબેàªàª®àª¾àª‚ આવૠભંગાણ નથી, કદાચ ખોટૠcrashid છે.\n"
"crashid=%s"
-#. default texts
-#: ../src/gui/CCReporterDialog.py:22 ../src/gui/CReporterAssistant.py:20
-msgid "Brief description of how to reproduce this or what you did..."
-msgstr "કેવી રીતે આનà«àª‚ પà«àª¨:ઉતà«àªªàª¾àª¦àª¨ કરવૠઅથવા તમે શૠકરà«àª¯à« હતૠતે માટે ટૂંકà«àª‚ વરà«àª£àª¨..."
-
-#: ../src/gui/CCReporterDialog.py:107
-msgid "You must check the backtrace for sensitive data."
-msgstr "સંવેદનશીલ માહિતી માટે તમારે બેકટà«àª°à«‡àª¸àª¨à«‡ ચકાસવૠજ જોઇàª."
-
-#: ../src/gui/CCReporterDialog.py:118 ../src/gui/CReporterAssistant.py:364
-#, python-format
-msgid ""
-"Reporting disabled because the backtrace is unusable.\n"
-"Please try to install debuginfo manually using the command: <b>debuginfo-"
-"install %s</b> \n"
-"then use the Refresh button to regenerate the backtrace."
-msgstr ""
-"નિષà«àª•à«àª°àª¿àª¯ થયેલ છે અહેવાલીકરણ કે બેકટà«àª°à«‡àª¸ નો ઉપયોગ કરી શકાય તેવો નથી.\n"
-"મહેરબાની કરીને આદેશની મદદથી જાતે જ debuginfo ને સà«àª¥àª¾àªªàª¿àª¤ કરવા માટે પà«àª°àª¯àª¤à«àª¨ કરો:"
-"<b>debuginfo-install %s</b> \n"
-"\n"
-"પછી બેકટà«àª°à«‡àª¸ નો પà«àª¨:ઉતà«àªªàª¨à«àª¨ કરવા માટે તાજૠકરો ઠબટનને વાપરો."
-
-#: ../src/gui/CCReporterDialog.py:120
-msgid "The backtrace is unusable, you cannot report this!"
-msgstr "બેકટà«àª°à«‡àª¸ નો ઉપયોગ કરી શકાય તેવà«àª‚ નથી, આનો તમે અહેવાલ કરી શકતા નથી!"
-
-#: ../src/gui/CCReporterDialog.py:124 ../src/gui/CReporterAssistant.py:342
-#: ../src/gui/CReporterAssistant.py:370
-msgid ""
-"The backtrace is incomplete, please make sure you provide the steps to "
-"reproduce."
-msgstr ""
-"બેકટà«àª°à«‡àª¸ ઠઅપૂરતૠછે, મહેરબાની કરીને ખાતરી કરો કે પà«àª¨:ઉતà«àªªàª¨à«àª¨ કરવા માટે સારાં પગલાઓ પૂરા "
-"પાડો છો."
-
-#: ../src/gui/CCReporterDialog.py:130
-msgid "Reporting disabled, please fix the problems shown above."
-msgstr "અહેવાલ કરવાનà«àª‚ નિષà«àª•à«àª°àª¿àª¯ થયેલ, ઉપર બતાવેલ સમસà«àª¯àª¾àª“ને સà«àª§àª¾àª°à«‹."
-
-#: ../src/gui/CCReporterDialog.py:132
-msgid "Sends the report using the selected plugin."
-msgstr "પસંદ થયેલ પà«àª²àª—ઇનની મદદથી અહેવાલને મોકલે છે."
-
-#: ../src/gui/CCReporterDialog.py:398
-msgid ""
-"No reporter plugin available for this type of crash.\n"
-"Please check abrt.conf."
-msgstr ""
-"ભંગાણનાં આ પà«àª°àª•àª¾àª° માટે અહેવાલ કરવાર પà«àª²àª—ઇન ઉપલà«àª¬àª§ નથી.\n"
-"મહેરબાની કરીને abrt.conf ને ચકાસો."
-
-#: ../src/gui/CCReporterDialog.py:418 ../src/gui/CReporterAssistant.py:249
-#: ../src/gui/PluginsSettingsDialog.py:136
-#, python-format
-msgid ""
-"Cannot save plugin settings:\n"
-" %s"
-msgstr ""
-"પà«àª²àª—ઇન સà«àª¯à«‹àªœàª¨à«‹ સંગà«àª°àª¹ કરી શકાતો નથી:\n"
-" %s"
-
-#: ../src/gui/CCReporterDialog.py:448 ../src/gui/CReporterAssistant.py:279
-#, python-format
-msgid "Configure %s options"
-msgstr "%s વિકલà«àªªà«‹àª¨à«‡ રૂપરેખાંકિત કરો"
-
-#: ../src/gui/CCReporterDialog.py:498 ../src/gui/CReporterAssistant.py:1074
-msgid ""
-"Unable to get report!\n"
-"Is debuginfo missing?"
-msgstr ""
-"અહેવાલ મેળવવામાં અસમરà«àª¥!\n"
-"Debuginfo ગà«àª® થયેલ છે?"
-
-#: ../src/gui/CCReporterDialog.py:527 ../src/gui/CReporterAssistant.py:455
-#, python-format
-msgid ""
-"Reporting failed!\n"
-"%s"
-msgstr ""
-"અહેવાલ કરવાનà«àª‚ નિષà«àª«àª³!\n"
-"%s"
-
-#: ../src/gui/CCReporterDialog.py:553 ../src/gui/CCReporterDialog.py:574
-#: ../src/gui/CReporterAssistant.py:1113
-#, python-format
-msgid "Error acquiring the report: %s"
-msgstr "અહેવાલને મેળવી રહà«àª¯àª¾ હોય તà«àª¯àª¾àª°à«‡ ભૂલ: %s"
-
#: ../src/gui/ConfBackend.py:78
msgid "Cannot connect to the Gnome Keyring daemon."
msgstr "Gnome કિરીંગ ડિમનને જોડી શકાતૠનથી."
@@ -732,57 +660,103 @@ msgid "Cannot get the default keyring."
msgstr "મૂળભૂત કિરીંગને મેળવી શકાતૠનથી."
#: ../src/gui/ConfBackend.py:103 ../src/gui/ConfBackend.py:120
-msgid ""
-"Access to gnome-keyring has been denied, plugins settings will not be saved."
-msgstr ""
-"gnome-keyring નાં વપરાશને નામંજૂર કરી દેવામાં આવà«àª¯à« છે, પà«àª²àª—ઇન સà«àª¯à«‹àªœàª¨à«‹ સંગà«àª°àª¹ થયેલ હશે નહિં."
+msgid "Access to gnome-keyring has been denied, plugins settings will not be saved."
+msgstr "gnome-keyring નાં વપરાશને નામંજૂર કરી દેવામાં આવà«àª¯à« છે, પà«àª²àª—ઇન સà«àª¯à«‹àªœàª¨à«‹ સંગà«àª°àª¹ થયેલ હશે નહિં."
#. we tried 2 times, so giving up the authorization
#: ../src/gui/ConfBackend.py:154
#, python-format
-msgid ""
-"Access to gnome-keyring has been denied, cannot load the settings for %s!"
-msgstr ""
-"gnome-keyring નાં વપરાશને નામંજૂર કરી દેવામાં આવà«àª¯à« છે, %s માટે સà«àª¯à«‹àªœàª¨à«‹àª¨à«‡ લાવી શકાતૠનથી!"
+msgid "Access to gnome-keyring has been denied, cannot load the settings for %s!"
+msgstr "gnome-keyring નાં વપરાશને નામંજૂર કરી દેવામાં આવà«àª¯à« છે, %s માટે સà«àª¯à«‹àªœàª¨à«‹àª¨à«‡ લાવી શકાતૠનથી!"
#: ../src/gui/ConfBackend.py:207
msgid "Access to gnome-keyring has been denied, cannot load settings."
msgstr "gnome-keyring નાં વપરાશને નામંજૂર કરી દેવામાં આવà«àª¯à« છે, સà«àª¯à«‹àªœàª¨à«‹àª¨à«‡ લાવી શકાતૠનથી."
+#: ../src/gui/CReporterAssistant.py:20
+msgid "Brief description of how to reproduce this or what you did..."
+msgstr "કેવી રીતે આનà«àª‚ પà«àª¨:ઉતà«àªªàª¾àª¦àª¨ કરવૠઅથવા તમે શૠકરà«àª¯à« હતૠતે માટે ટૂંકà«àª‚ વરà«àª£àª¨..."
+
#: ../src/gui/CReporterAssistant.py:21
msgid "Crash info doesn't contain a backtrace"
msgstr "ભંગાણ જાણકારી બેકટà«àª°à«‡àª¸àª¨à«‡ સમાવતૠનથી"
-#: ../src/gui/CReporterAssistant.py:334
+#: ../src/gui/CReporterAssistant.py:277
+#: ../src/gui/PluginsSettingsDialog.py:136
+#, python-format
+msgid ""
+"Cannot save plugin settings:\n"
+" %s"
+msgstr ""
+"પà«àª²àª—ઇન સà«àª¯à«‹àªœàª¨à«‹ સંગà«àª°àª¹ કરી શકાતો નથી:\n"
+" %s"
+
+#: ../src/gui/CReporterAssistant.py:307
+#, python-format
+msgid "Configure %s options"
+msgstr "%s વિકલà«àªªà«‹àª¨à«‡ રૂપરેખાંકિત કરો"
+
+#: ../src/gui/CReporterAssistant.py:362
#, python-format
msgid "Rating is %s"
msgstr "રેટિંગ %s છે"
-#: ../src/gui/CReporterAssistant.py:337
+#: ../src/gui/CReporterAssistant.py:365
msgid "Crashdump doesn't have rating => we suppose it's not required"
msgstr "Crashdump પાસે રેટિંગ નથી => અમે ધારીઠછીઠતે જરૂરી નથી"
-#: ../src/gui/CReporterAssistant.py:350
+#: ../src/gui/CReporterAssistant.py:370 ../src/gui/CReporterAssistant.py:398
+msgid ""
+"The backtrace is incomplete, please make sure you provide the steps to "
+"reproduce."
+msgstr ""
+"બેકટà«àª°à«‡àª¸ ઠઅપૂરતૠછે, મહેરબાની કરીને ખાતરી કરો કે પà«àª¨:ઉતà«àªªàª¨à«àª¨ કરવા માટે સારાં પગલાઓ પૂરા "
+"પાડો છો."
+
+#: ../src/gui/CReporterAssistant.py:378
msgid "You should check the backtrace for sensitive data."
msgstr "સંવેદનશીલ માહિતી માટે તમારે બેકટà«àª°à«‡àª¸àª¨à«‡ ચકાસવૠજ જોઇàª."
-#: ../src/gui/CReporterAssistant.py:351
+#: ../src/gui/CReporterAssistant.py:379
msgid "You must agree with sending the backtrace."
msgstr "તમારે બેકટà«àª°à«‡àª¸àª¨à«‡ મોકલવા સાથે સંમત થવૠજ જોઇàª."
-#: ../src/gui/CReporterAssistant.py:366
+#: ../src/gui/CReporterAssistant.py:392
+#, python-format
+msgid ""
+"Reporting disabled because the backtrace is unusable.\n"
+"Please try to install debuginfo manually using the command: <b>debuginfo-"
+"install %s</b> \n"
+"then use the Refresh button to regenerate the backtrace."
+msgstr ""
+"નિષà«àª•à«àª°àª¿àª¯ થયેલ છે અહેવાલીકરણ કે બેકટà«àª°à«‡àª¸ નો ઉપયોગ કરી શકાય તેવો નથી.\n"
+"મહેરબાની કરીને આદેશની મદદથી જાતે જ ડિબગ જાણકારી ને સà«àª¥àª¾àªªàª¿àª¤ કરવા માટે પà«àª°àª¯àª¤à«àª¨ કરો:"
+"<b>ડિબગ જાણકારી-install %s</b> \n"
+"\n"
+"પછી બેકટà«àª°à«‡àª¸ નો પà«àª¨:ઉતà«àªªàª¨à«àª¨ કરવા માટે તાજૠકરો ઠબટનને વાપરો."
+
+#: ../src/gui/CReporterAssistant.py:394
msgid "Reporting disabled because the backtrace is unusable."
msgstr "અહેવાલ કરવાનà«àª‚ નિષà«àª•à«àª°àª¿àª¯ થયેલ છે કારણ કે બેકટà«àª°à«‡àª¸ ઉપયોગ કરી શકાય તેવૠનથી."
-#: ../src/gui/CReporterAssistant.py:412
+#: ../src/gui/CReporterAssistant.py:440
msgid "You did not provide any steps to reproduce."
msgstr "તમે પà«àª¨:ઉતà«àªªàª¨à«àª¨ કરવા માટે કોઇપણ પગલાંઓને પૂરા પાડà«àª¯àª¾ નથી."
-#: ../src/gui/CReporterAssistant.py:426
+#: ../src/gui/CReporterAssistant.py:454
msgid "You did not provide any comments."
msgstr "તમને કોઇપણ ટિપà«àªªàª£à«€àª“ પૂરી પાડી નથી."
-#: ../src/gui/CReporterAssistant.py:507
+#: ../src/gui/CReporterAssistant.py:483
+#, python-format
+msgid ""
+"Reporting failed!\n"
+"%s"
+msgstr ""
+"અહેવાલ કરવાનà«àª‚ નિષà«àª«àª³!\n"
+"%s"
+
+#: ../src/gui/CReporterAssistant.py:535
#, python-format
msgid ""
"It looks like an application from the package <b>%s</b> has crashed on your "
@@ -807,15 +781,15 @@ msgstr ""
"કà«àª¯àª¾àª‚ તમારે ભૂલનો અહેવાલ કરવાનà«àª‚ ગમે છે તે પસંદ કરો, અને ચાલૠરાખવા માટે 'આગળ ધપાવો' બટનને "
"દબાવો."
-#: ../src/gui/CReporterAssistant.py:548
+#: ../src/gui/CReporterAssistant.py:576
msgid "Only one reporter plugin is configured."
msgstr "ફકà«àª¤ àªàª• રિપોરà«àªŸàª° પà«àª²àª—ઇન રૂપરેખાંકિત થયેલ છે."
-#: ../src/gui/CReporterAssistant.py:554
+#: ../src/gui/CReporterAssistant.py:582
msgid "Send a bug report"
msgstr "ભૂલ અહેવાલને મોકલો"
-#: ../src/gui/CReporterAssistant.py:592
+#: ../src/gui/CReporterAssistant.py:620
msgid ""
"Below is the backtrace associated with your crash. A crash backtrace "
"provides developers with details about how the crash happened, helping them "
@@ -830,132 +804,143 @@ msgstr ""
"મહેરબાની કરીને નીચે બેકટà«àª°à«‡àª¸àª¾àª°à«€àª¨à«àª‚ રિવà«àª¯à«‚ કરો કે જે તમારો ભૂલ અહેવાલ કોઇ સંવેદનશીલ માહિતીને "
"સમાવતૠનથી અને તમે વહેંચવા માગતા નથી તે ખાતરી કરવા માટે જરૂરિયાત પà«àª°àª®àª¾àª£à«‡ બદલો અને અનૂસરો:"
-#: ../src/gui/CReporterAssistant.py:663 ../src/gui/CReporterAssistant.py:676
-#: ../src/gui/CReporterAssistant.py:710
+#: ../src/gui/CReporterAssistant.py:691 ../src/gui/CReporterAssistant.py:704
+#: ../src/gui/CReporterAssistant.py:738
#, python-format
msgid "Found %i occurence(s) [at: %i of %i]"
-msgstr ""
+msgstr "%i ઘટના (ઓ) મળી [at: %i of %i]"
-#: ../src/gui/CReporterAssistant.py:747
+#: ../src/gui/CReporterAssistant.py:775
msgid "Search:"
-msgstr ""
+msgstr "શોધો:"
-#: ../src/gui/CReporterAssistant.py:778
+#: ../src/gui/CReporterAssistant.py:806
msgid "Refresh"
msgstr "તાજૠકરો"
-#: ../src/gui/CReporterAssistant.py:780
+#: ../src/gui/CReporterAssistant.py:808
msgid "Copy"
msgstr "નકલ કરો"
-#: ../src/gui/CReporterAssistant.py:786
+#: ../src/gui/CReporterAssistant.py:814
msgid "I agree with submitting the backtrace"
msgstr "બેકટà«àª°à«‡àª¸ ને જમા કરવા સાથે હà«àª‚ સમંત છà«"
-#: ../src/gui/CReporterAssistant.py:791
+#: ../src/gui/CReporterAssistant.py:819
msgid "Approve the backtrace"
msgstr "બેકટà«àª°à«‡àª¸àª¨à«‡ મંજૂર કરો"
-#: ../src/gui/CReporterAssistant.py:834
+#: ../src/gui/CReporterAssistant.py:862
msgid "You need to fill the how to before you can proceed..."
-msgstr ""
+msgstr "તમારે ભરવાની જરૂર છે તમે કેવી રીતે આગળ વધી શકો છો..."
-#: ../src/gui/CReporterAssistant.py:857
+#: ../src/gui/CReporterAssistant.py:885
msgid "How did this crash happen (step-by-step)? How would you reproduce it?"
msgstr "કેવી રીતે આ ભંગાણ થયૠ(àªàª• પછી àªàª• પગલાં)? કેવી રીતે તેને પà«àª¨:ઉતà«àªªàª¨à«àª¨ કરà«àª¯à«?"
-#: ../src/gui/CReporterAssistant.py:877
-msgid ""
-"Are there any comments you would like to share with the software maintainers?"
+#: ../src/gui/CReporterAssistant.py:905
+msgid "Are there any comments you would like to share with the software maintainers?"
msgstr "શà«àª‚ તમે તà«àª¯àª¾àª‚ કોઇપણ ટિપà«àªªàª£à«€àª“ને સોફà«àªŸàªµà«‡àª° સંચાલક સાથે વહેંચવા માંગો છો?"
-#: ../src/gui/CReporterAssistant.py:897
+#: ../src/gui/CReporterAssistant.py:925
msgid "Provide additional details"
msgstr "વધારાની વિગતોને પૂરી પાડો"
-#: ../src/gui/CReporterAssistant.py:904
+#: ../src/gui/CReporterAssistant.py:932
msgid ""
"<b>Tip:</b> Your comments are not private. Please watch what you say "
"accordingly."
msgstr "<b>મદદ:</b> તમારી ટિપà«àªªàª£à«€àª“ ખાનગી નથી. મહેરબાની કરીને જà«àª“ તે અનà«àª¸àª¾àª° તમે કહો."
-#: ../src/gui/CReporterAssistant.py:945
+#: ../src/gui/CReporterAssistant.py:973
msgid "Confirm and send the report"
msgstr "ખાતરી કરો અને અહેવાલને મોકલો"
-#: ../src/gui/CReporterAssistant.py:947
-msgid ""
-"Below is a summary of your bug report. Please click 'Apply' to submit it."
+#: ../src/gui/CReporterAssistant.py:975
+msgid "Below is a summary of your bug report. Please click 'Apply' to submit it."
msgstr ""
"નીચે તમારા ભૂલ અહેવાલનà«àª‚ સારાંશ છે. મહેરબાની કરીને તેને જમા કરવા માટે 'લાગૠકરો' પર કà«àª²àª¿àª• "
"કરો."
-#: ../src/gui/CReporterAssistant.py:952
+#: ../src/gui/CReporterAssistant.py:980
msgid "<b>Basic details</b>"
msgstr "<b>મૂળભૂત વિગતો</b>"
#. left table
-#: ../src/gui/CReporterAssistant.py:959
+#: ../src/gui/CReporterAssistant.py:987
msgid "Component"
msgstr "ઘટક"
-#: ../src/gui/CReporterAssistant.py:960
+#: ../src/gui/CReporterAssistant.py:988
msgid "Package"
msgstr "પેકેજ"
-#: ../src/gui/CReporterAssistant.py:961
+#: ../src/gui/CReporterAssistant.py:989
msgid "Executable"
msgstr "àªàª•à«àª¸àª¿àª•à«àª¯à«‚ટેબલ"
-#: ../src/gui/CReporterAssistant.py:962
+#: ../src/gui/CReporterAssistant.py:990
msgid "Cmdline"
msgstr "આદેશવાકà«àª¯"
#. right table
-#: ../src/gui/CReporterAssistant.py:964
+#: ../src/gui/CReporterAssistant.py:992
msgid "Architecture"
msgstr "આરà«àª•àª¿àªŸà«‡àª•à«àªšàª°"
-#: ../src/gui/CReporterAssistant.py:965
+#: ../src/gui/CReporterAssistant.py:993
msgid "Kernel"
msgstr "કરà«àª¨àª²"
-#: ../src/gui/CReporterAssistant.py:966
+#: ../src/gui/CReporterAssistant.py:994
msgid "Release"
msgstr "પà«àª°àª•àª¾àª¶àª¨"
-#: ../src/gui/CReporterAssistant.py:967
+#: ../src/gui/CReporterAssistant.py:995
msgid "Reason"
msgstr "કારણ"
-#: ../src/gui/CReporterAssistant.py:978 ../src/gui/report.glade.h:3
+#: ../src/gui/CReporterAssistant.py:1006 ../src/gui/report.glade.h:3
msgid "<b>Backtrace</b>"
msgstr "<b>બેકટà«àª°à«‡àª¸à«àªŸà«àª°à«‡àª¸</b>"
-#: ../src/gui/CReporterAssistant.py:981
+#: ../src/gui/CReporterAssistant.py:1009
msgid "Click to view..."
msgstr "જોવા માટે કà«àª²àª¿àª• કરો..."
-#: ../src/gui/CReporterAssistant.py:993
+#: ../src/gui/CReporterAssistant.py:1021
msgid "<b>Steps to reproduce:</b>"
msgstr "<b>પà«àª¨:ઉતà«àªªàª¨à«àª¨ કરવા માટે પગલાંઓ:</b>"
-#: ../src/gui/CReporterAssistant.py:1014
+#: ../src/gui/CReporterAssistant.py:1042
msgid "<b>Comments:</b>"
msgstr "<b>ટિપà«àªªàª£à«€àª“:</b>"
-#: ../src/gui/CReporterAssistant.py:1017
+#: ../src/gui/CReporterAssistant.py:1045
msgid "No comment provided!"
msgstr "ટિપà«àªªàª£à«€ પૂરી પાડેલ નથી!"
-#: ../src/gui/CReporterAssistant.py:1053
+#: ../src/gui/CReporterAssistant.py:1081
msgid "Finished sending the bug report"
msgstr "ભૂલ અહેવાલને મોકલવાનà«àª‚ સમાપà«àª¤ થયેલ છે"
-#: ../src/gui/CReporterAssistant.py:1057
+#: ../src/gui/CReporterAssistant.py:1085
msgid "<b>Bug reports:</b>"
msgstr "<b>ભà«àª² અહેવાલ:</b>"
+#: ../src/gui/CReporterAssistant.py:1102
+msgid ""
+"Unable to get report!\n"
+"Is debuginfo missing?"
+msgstr ""
+"અહેવાલ મેળવવામાં અસમરà«àª¥!\n"
+"ડિબગ જાણકારી ગà«àª® થયેલ છે?"
+
+#: ../src/gui/CReporterAssistant.py:1139
+#, python-format
+msgid "Error acquiring the report: %s"
+msgstr "અહેવાલને મેળવી રહà«àª¯àª¾ હોય તà«àª¯àª¾àª°à«‡ ભૂલ: %s"
+
#: ../src/gui/dialogs.glade.h:1
msgid "Log"
msgstr "લોગ"
@@ -998,7 +983,6 @@ msgid "Name"
msgstr "નામ"
#: ../src/gui/PluginsSettingsDialog.py:118
-#, fuzzy
msgid "Please select a plugin from the list to edit its options."
msgstr "મહેરબાની કરીને તેનાં વિકલà«àªªà«‹àª®àª¾àª‚ ફેરફાર કરવા માટે યાદીમાંથી પà«àª²àª—ઇનને પસંદ કરો."
@@ -1219,266 +1203,306 @@ msgstr ""
"રૂપરેખાંકનને ખોલવા માટે નીચે બટનોને વાપરો અને તમે આગળ વધો તે પહેલાં તેને સà«àª§àª¾àª°à«‹, નહિં તો, "
"અહેવાલીકરણ પà«àª°àª•à«àª°àª¿àª¯àª¾ નિષà«àª«àª³ જઇ શકે છે.\n"
-#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.cpp:47
+#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.c:45
#, c-format
msgid "Uploaded: %llu of %llu kbytes"
-msgstr ""
+msgstr "અપલોડ થયેલ: %llu kbytes નાં %llu"
-#: ../src/lib/parse_options.c:11
+#: ../src/lib/parse_options.c:29
#, c-format
msgid "Usage: %s\n"
-msgstr ""
+msgstr "વપરાશ: %s\n"
-#: ../src/plugins/abrt-action-analyze-c.c:154
+#: ../src/plugins/abrt-action-analyze-c.c:156
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID of coredumps"
msgstr ""
+" [-v] -d DIR\n"
+"\n"
+"કોરડમà«àªªàª¨à«€ UUID નો સંગà«àª°àª¹ અને ગણતરી કરે છે"
-#: ../src/plugins/abrt-action-analyze-oops.c:131
+#: ../src/plugins/abrt-action-analyze-oops.c:133
msgid ""
" [-vs] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of oops crash dumps"
msgstr ""
+" [-vs] -d DIR\n"
+"\n"
+"oops ભંગાણ ડમà«àªªà«‹àª¨àª¾àª‚ UUID અને DUPHASH નો સંગà«àª°àª¹ કરે છે અને ગણતરી કરે છે"
-#: ../src/plugins/abrt-action-analyze-python.c:36
+#: ../src/plugins/abrt-action-analyze-python.c:38
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of python crash dumps"
msgstr ""
+" [-v] -d DIR\n"
+"\n"
+"python ભંગાણ ડમà«àªªà«‹àª¨àª¾àª‚ UUID અને DUPHASH નો સંગà«àª°àª¹ કરે છે અને ગણતરી કરે છે"
-#: ../src/plugins/abrt-action-bugzilla.cpp:532
+#: ../src/plugins/abrt-action-bugzilla.cpp:534
#, c-format
msgid "New bug id: %i"
msgstr "નવી ભૂલ id: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:645
+#: ../src/plugins/abrt-action-bugzilla.cpp:662
#, c-format
-msgid "Can't open '%s'"
-msgstr ""
-
-#: ../src/plugins/abrt-action-bugzilla.cpp:665
-#, fuzzy, c-format
msgid "Empty login or password, please check %s"
-msgstr ""
-"ખાલી લોગીન અથવા પાસવરà«àª¡.\n"
-"મહેરબાની કરીને ચકાસો"
+msgstr "ખાલી લૉગિન અથવા પાસવરà«àª¡, મહેરબાની કરીને %s ચકાસો"
-#: ../src/plugins/abrt-action-bugzilla.cpp:683
+#: ../src/plugins/abrt-action-bugzilla.cpp:680
msgid "Logging into bugzilla..."
msgstr "બગàªà«€àª²àª¾àª®àª¾àª‚ લોગ કરી રહà«àª¯àª¾ છે..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:686
+#: ../src/plugins/abrt-action-bugzilla.cpp:683
msgid "Checking for duplicates..."
msgstr "નકલો માટે ચકાસી રહà«àª¯àª¾ છે..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:707
-#: ../src/plugins/abrt-action-bugzilla.cpp:743
+#: ../src/plugins/abrt-action-bugzilla.cpp:705
+#: ../src/plugins/abrt-action-bugzilla.cpp:741
msgid "Missing mandatory member 'bugs'"
msgstr "ગà«àª® થયેલ ફરજિયાત સભà«àª¯ 'ભૂલો'"
-#: ../src/plugins/abrt-action-bugzilla.cpp:726
-#: ../src/plugins/abrt-action-bugzilla.cpp:759
-#: ../src/plugins/abrt-action-bugzilla.cpp:834
+#: ../src/plugins/abrt-action-bugzilla.cpp:724
+#: ../src/plugins/abrt-action-bugzilla.cpp:757
+#: ../src/plugins/abrt-action-bugzilla.cpp:833
msgid "get_bug_info() failed. Could not collect all mandatory information"
msgstr "get_bug_info() નિષà«àª«àª³. બધી ફરજિયાત જાણકારીને મેળવી શકà«àª¯àª¾ નહિં"
-#: ../src/plugins/abrt-action-bugzilla.cpp:775
+#: ../src/plugins/abrt-action-bugzilla.cpp:772
msgid "Creating a new bug..."
msgstr "નવી ભૂલને બનાવી રહà«àª¯àª¾ છે..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:780
+#: ../src/plugins/abrt-action-bugzilla.cpp:777
msgid "Bugzilla entry creation failed"
msgstr "બગàªà«€àª²àª¾ નોંધણી બનાવવાનà«àª‚ નિષà«àª«àª³"
-#: ../src/plugins/abrt-action-bugzilla.cpp:790
-#: ../src/plugins/abrt-action-bugzilla.cpp:887
+#: ../src/plugins/abrt-action-bugzilla.cpp:789
+#: ../src/plugins/abrt-action-bugzilla.cpp:886
msgid "Logging out..."
msgstr "બહાર નીકળી રહà«àª¯àª¾ છે..."
#. decision based on state
-#: ../src/plugins/abrt-action-bugzilla.cpp:808
+#: ../src/plugins/abrt-action-bugzilla.cpp:807
#, c-format
msgid "Bug is already reported: %i"
msgstr "ભૂલ પહેલેથી જ અહેવાલ થયેલ છે: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:819
+#: ../src/plugins/abrt-action-bugzilla.cpp:818
#, c-format
msgid "Bugzilla couldn't find parent of bug %d"
-msgstr "Bugzilla ઠભૂલ %d નાં મà«àª–à«àª¯àª¨à«‡ શોધી શકà«àª¯àª¾ નથી"
+msgstr "બગàªà«€àª²àª¾ ઠભૂલ %d નાં મà«àª–à«àª¯àª¨à«‡ શોધી શકà«àª¯àª¾ નથી"
-#: ../src/plugins/abrt-action-bugzilla.cpp:848
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-bugzilla.cpp:847
+#, c-format
msgid "Add %s to CC list"
msgstr "CC યાદીમાં %s ને ઉમેરો"
-#: ../src/plugins/abrt-action-bugzilla.cpp:872
+#: ../src/plugins/abrt-action-bugzilla.cpp:871
#, c-format
msgid "Adding new comment to bug %d"
msgstr "ભૂલ(%d) માં નવી ટિપà«àªªàª£à«€àª¨à«‡ ઉમેરો"
-#: ../src/plugins/abrt-action-generate-backtrace.c:319
+#: ../src/plugins/abrt-action-bugzilla.cpp:913
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to Bugzilla"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"બગàªà«€àª²àª¾ માં ભંગાણનો અહેવાલ કરો"
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:928
+#: ../src/plugins/abrt-action-kerneloops.c:148
+#: ../src/plugins/abrt-action-rhtsupport.c:282
+msgid "Configuration file (may be given many times)"
+msgstr "રૂપરેખાંકન ફાઇલ (ઘણી વખત આપેલ છે)"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:258
+msgid " [options] -d DIR"
+msgstr " [વિકલà«àªªà«‹] -d DIR"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:271
+msgid "Additional debuginfo directories"
+msgstr "વધારાની debuginfo ડિરેકà«àªŸàª°à«€àª“"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:272
+msgid "Kill gdb if it runs for more than N seconds"
+msgstr "gdb ને મારો જો તે N સેકંડો કરતા વધારે ચાલતૠહોય તો"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:320
#, c-format
msgid "Backtrace parsing failed for %s"
-msgstr ""
+msgstr "%s બેકટà«àª°à«‡àª¸ પારà«àª¸àª¿àª‚ગ નિષà«àª«àª³"
#: ../src/plugins/abrt-action-install-debuginfo.py:72
#, python-format
msgid "Extracting cpio from %s"
-msgstr ""
+msgstr "%s માંથી cpio ને બહાર કાઢી રહà«àª¯àª¾ છે"
#: ../src/plugins/abrt-action-install-debuginfo.py:77
msgid "Can't write to:"
-msgstr ""
+msgstr "તેમાં લખી શકાતૠનથી:"
#: ../src/plugins/abrt-action-install-debuginfo.py:87
msgid "Removing the temporary rpm file"
-msgstr ""
+msgstr "કામચલાઉ rpm ફાઇલને દૂર કરી રહà«àª¯àª¾ છે"
#: ../src/plugins/abrt-action-install-debuginfo.py:91
#, python-format
msgid "Can't extract package: %s"
-msgstr ""
+msgstr "પેકેજને બહાર કાઢી શકાતૠનથી: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:99
#, python-format
msgid "Caching files from %s made from %s"
-msgstr ""
+msgstr "%s માંથી ફાઇલો કેશ કરી રહà«àª¯àª¾ છીઠકે જે %s માંથી બનાવવામાં આવેલ છે"
#: ../src/plugins/abrt-action-install-debuginfo.py:107
msgid "Removing the temporary cpio file"
-msgstr ""
+msgstr "કામચલાઉ cpio ફાઇલને દૂર કરી રહà«àª¯àª¾ છે"
#: ../src/plugins/abrt-action-install-debuginfo.py:110
#, python-format
msgid "Can't extract files from: %s"
-msgstr ""
+msgstr "તેમાંથી ફાઇલોને બહાર કાઢી શકાતી નથી: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:134
#: ../src/plugins/abrt-action-install-debuginfo.py:140
#, python-format
msgid "Downloading (%i of %i) %.30s : %.3s %%"
-msgstr ""
+msgstr "(%i of %i) %.30s : %.3s %% ડાઉનલોડ કરી રહà«àª¯àª¾ છે"
#: ../src/plugins/abrt-action-install-debuginfo.py:169
-#, fuzzy
msgid "Searching the missing debuginfo packages"
-msgstr "ડિબગ જાણકારી સà«àª¥àª¾àªªàª¨ ને શરૂ કરી રહà«àª¯àª¾ છે"
+msgstr "ગેરહાજર ડિબગ જાણકારી પેકેજોને શોધી રહà«àª¯àª¾ છે"
#: ../src/plugins/abrt-action-install-debuginfo.py:224
#, python-format
msgid "To download: (%.2f) M / Installed size: %.2f M"
-msgstr ""
+msgstr "ડાઉનલોડ કરવા માટે: (%.2f) M / સà«àª¥àª¾àªªàª¿àª¤ થયેલ માપ: %.2f M"
#: ../src/plugins/abrt-action-install-debuginfo.py:240
msgid "Is this ok? [y/N] "
-msgstr ""
+msgstr "શà«àª‚ આ બરાબર છે? [y/N] "
#: ../src/plugins/abrt-action-install-debuginfo.py:257
#, python-format
msgid "Downloading package %s failed"
-msgstr ""
+msgstr "પેકેજ %s ને ડાઉનલોડ કરતી વખતે નિષà«àª«àª³"
#. recursively delete the temp dir on failure
#: ../src/plugins/abrt-action-install-debuginfo.py:268
msgid "Unpacking failed, aborting download..."
-msgstr ""
+msgstr "અનપેકિંગ નિષà«àª«àª³, ડાઉનલોડને કાઢી રહà«àª¯àª¾ છે..."
#: ../src/plugins/abrt-action-install-debuginfo.py:275
#, python-format
msgid "All downloaded packages have been extracted, removing %s"
-msgstr ""
+msgstr "બધા ડાઉનલોડ થયેલ પેકેજોને બહાર કાઢી દીધેલ છે, %s ને દૂર કરી રહà«àª¯àª¾ છે"
#: ../src/plugins/abrt-action-install-debuginfo.py:280
#, python-format
msgid "Can't remove %s, probably contains an error log"
-msgstr ""
+msgstr "%s ને દૂર કરી શકાતૠનથી, કદાચ ભૂલ લૉગને સમાવે છે"
#: ../src/plugins/abrt-action-install-debuginfo.py:305
#, python-format
msgid "Analyzing corefile: %(corefile_path)s"
-msgstr ""
+msgstr "કોરફાઇલનà«àª‚ વિશà«àª²à«‡àª·àª£ કરી રહà«àª¯àª¾ છે: %(corefile_path)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:384
#, python-format
msgid "Can't remove %(tmpdir_path)s: %(reason)s"
-msgstr ""
+msgstr "%(tmpdir_path)s દૂર કરી શકાતી નથી: %(reason)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:394
msgid "Exiting on user Command"
-msgstr ""
+msgstr "વપરાશકરà«àª¤àª¾ આદેશ પર બહાર નીકળી રહà«àª¯àª¾ છે"
#: ../src/plugins/abrt-action-install-debuginfo.py:413
#, python-format
msgid "Usage: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
-msgstr ""
+msgstr "વપરાશ: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
#: ../src/plugins/abrt-action-install-debuginfo.py:442
-#, fuzzy
msgid "You have to specify the path to coredump."
-msgstr "તમારે નકલ કરવા માટે ભંગાણને પસંદ કરવૠજ પડશે."
+msgstr "તમારે coredump માં પાથને સà«àªªàª·à«àªŸ કરવૠજ પડશે."
#: ../src/plugins/abrt-action-install-debuginfo.py:446
-#, fuzzy
msgid "You have to specify the path to cachedir."
-msgstr "તમારે નકલ કરવા માટે ભંગાણને પસંદ કરવૠજ પડશે."
+msgstr "તમારે cachedir માં પાથને સà«àªªàª·à«àªŸ કરવૠજ પડશે."
#: ../src/plugins/abrt-action-install-debuginfo.py:450
-#, fuzzy
msgid "You have to specify the path to tmpdir."
-msgstr "તમારે નકલ કરવા માટે ભંગાણને પસંદ કરવૠજ પડશે."
+msgstr "તમારે tmpdir માં પાથને સà«àªªàª·à«àªŸ કરવો જ પડશે."
#: ../src/plugins/abrt-action-install-debuginfo.py:463
msgid "All debuginfo seems to be available"
-msgstr ""
+msgstr "બધી ડિબગ જાણકારી ઉપલબà«àª§ હોય àªàªµà« લાગે છે"
#: ../src/plugins/abrt-action-install-debuginfo.py:470
-#, fuzzy
msgid "Complete!"
-msgstr "ઘટક"
+msgstr "સમાપà«àª¤!"
-#: ../src/plugins/abrt-action-kerneloops.cpp:111
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-kerneloops.c:105
+#, c-format
msgid "Submitting oops report to %s"
-msgstr "'%s' માં અહેવાલને લખી રહà«àª¯àª¾ છે"
+msgstr "'%s' માં oops અહેવાલને લખી રહà«àª¯àª¾ છે"
-#: ../src/plugins/abrt-action-mailx.cpp:114
+#: ../src/plugins/abrt-action-kerneloops.c:133
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a kernel oops to kerneloops.org (or similar) site"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"kerneloops.org (અથવા àªàª¨àª¾ જેવી) સાઇટમાં કરà«àª¨àª² oops નો અહેવાલ કરો"
+
+#: ../src/plugins/abrt-action-mailx.c:110
msgid "Sending an email..."
msgstr "ઇમેઇલને મોકલી રહà«àª¯àª¾ છે..."
-#: ../src/plugins/abrt-action-mailx.cpp:138
+#: ../src/plugins/abrt-action-mailx.c:137
msgid ""
" [-v] -d DIR [-c CONFFILE]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d DIR [-c CONFFILE]\n"
+"\n"
+"ભંગાણ ડમà«àªªàª¨à«‹ સંકોચાયેલ ટારબોલને અપલોડ કરો"
-#: ../src/plugins/abrt-action-mailx.cpp:151
-#: ../src/plugins/abrt-action-upload.cpp:267
-#, fuzzy
+#: ../src/plugins/abrt-action-mailx.c:150
+#: ../src/plugins/abrt-action-upload.c:262
msgid "Config file"
-msgstr "લોગર ફાઇલ:"
+msgstr "રૂપરેખાંકન ફાઇલ"
-#: ../src/plugins/abrt-action-print.cpp:39
+#: ../src/plugins/abrt-action-print.c:38
msgid ""
" [-v] [-o FILE] -d DIR\n"
"\n"
"Print information about the crash to standard output"
msgstr ""
+" [-v] [-o FILE] -d DIR\n"
+"\n"
+"મૂળભૂત આઉટપà«àªŸàª®àª¾àª‚ ભંગાણ વિશે જાણકારીને છાપો"
-#: ../src/plugins/abrt-action-print.cpp:51
+#: ../src/plugins/abrt-action-print.c:51
msgid "Output file"
-msgstr ""
+msgstr "આઉટપà«àªŸ ફાઇલ"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was appended to %s"
msgstr "અહેવાલ %s સાથે જોડાયેલ હતà«"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was stored to %s"
msgstr "અહેવાલ ઠ%s માં સંગà«àª°àª¹ થયેલ હતો"
@@ -1486,56 +1510,92 @@ msgstr "અહેવાલ ઠ%s માં સંગà«àª°àª¹ થયેલ હà
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
#. error msg is already logged by dd_opendir
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
-#: ../src/plugins/abrt-action-rhtsupport.cpp:43
-#: ../src/plugins/abrt-action-upload.cpp:121
+#: ../src/plugins/abrt-action-rhtsupport.c:41
+#: ../src/plugins/abrt-action-upload.c:119
msgid "Compressing data"
-msgstr ""
+msgstr "માહિતીને સંકોચી રહà«àª¯àª¾ છે"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:78
-#, fuzzy
+#: ../src/plugins/abrt-action-rhtsupport.c:73
msgid "Empty login or password, please check RHTSupport.conf"
-msgstr ""
-"ખાલી લોગીન અથવા પાસવરà«àª¡.\n"
-"મહેરબાની કરીને ચકાસો"
+msgstr "ખાલી લૉગિન અથવા પાસવરà«àª¡, મહેરબાની કરીને RHTSupport.conf ચકાસો"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:194
+#: ../src/plugins/abrt-action-rhtsupport.c:192
msgid "Creating a new case..."
msgstr "નવી જોડણીને બનાવી રહà«àª¯àª¾ છે..."
-#: ../src/plugins/abrt-action-upload.cpp:65
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-rhtsupport.c:267
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to RHTSupport"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"RHTSupport માં ભંગાણનો અહેવાલ કરો"
+
+#: ../src/plugins/abrt-action-upload.c:63
+#, c-format
msgid "Sending %s to %s"
-msgstr "%s માં પેટી %s ને મોકલી રહà«àª¯àª¾ છે"
+msgstr "%s માં %s ને મોકલી રહà«àª¯àª¾ છે"
#. This ends up a "reporting status message" in abrtd
-#: ../src/plugins/abrt-action-upload.cpp:98
+#: ../src/plugins/abrt-action-upload.c:96
#, c-format
msgid "Successfully sent %s to %s"
-msgstr ""
+msgstr "%s માં %s ને સફળતાપૂરà«àªµàª• મોકલી"
-#: ../src/plugins/abrt-action-upload.cpp:219
+#: ../src/plugins/abrt-action-upload.c:213
#, c-format
msgid "Archive is created: '%s'"
-msgstr ""
+msgstr "પેટી બનાવેલ છે: '%s'"
-#: ../src/plugins/abrt-action-upload.cpp:253
+#: ../src/plugins/abrt-action-upload.c:248
msgid ""
" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
+"\n"
+"ભંગાણ ડમà«àªªàª¨àª¾àª‚ સંકોચાયેલ ટારબોલને અપલોડ કરો"
-#: ../src/plugins/abrt-action-upload.cpp:268
+#: ../src/plugins/abrt-action-upload.c:263
msgid "Base URL to upload to"
+msgstr "તેમાં અપલોડ કરવા માટે મૂળ URL"
+
+#: ../src/plugins/abrt-dump-oops.c:540
+msgid ""
+" [-vsrdow] FILE\n"
+"\n"
+"Extract oops from syslog/dmesg file"
msgstr ""
+" [-vsrdow] FILE\n"
+"\n"
+"syslog/dmesg ફાઇલમાંથી oops ને બહાર કાઢો"
+
+#: ../src/plugins/abrt-dump-oops.c:556
+msgid "Parse kernel's message buffer before parsing FILE"
+msgstr "FILE નà«àª‚ પદચà«àª›à«‡àª¦àª¨ કરતા પહેલાં કરà«àª¨àª²àª¨àª¾àª‚ સંદેશા બફરનà«àª‚ પદચà«àª›à«‡àª¦àª¨ કરો"
+
+#: ../src/plugins/abrt-dump-oops.c:557
+msgid "Create ABRT dump for every oops found"
+msgstr "મળેલ દરેક oops માટે ABRT ડમà«àªªàª¨à«‡ બનાવો"
+
+#: ../src/plugins/abrt-dump-oops.c:558
+msgid "Print found oopses on standard output"
+msgstr "મૂળભૂત આઉટપà«àªŸ પર મળેલ oopses ને છાપો"
+
+#: ../src/plugins/abrt-dump-oops.c:559
+msgid "Do not exit, watch the file for new oopses"
+msgstr "અસà«àª¤àª¿àª¤à«àªµ ધરાવતૠનથી, નવાં oopses માટે ફાઇલને જà«àª“"
#: ../src/plugins/Bugzilla.glade.h:1
msgid "<b>Bugzilla plugin configuration</b>"
-msgstr "<b>Bugzilla પà«àª²àª—ઇન રૂપરેખાંકન</b>"
+msgstr "<b>બગàªà«€àª²àª¾ પà«àª²àª—ઇન રૂપરેખાંકન</b>"
#: ../src/plugins/Bugzilla.glade.h:2
msgid "Bugzilla URL:"
-msgstr "Bugzilla URL:"
+msgstr "બગàªà«€àª²àª¾ URL:"
#: ../src/plugins/Bugzilla.glade.h:3
msgid "Don't have an account yet?"
@@ -1565,10 +1625,6 @@ msgstr ""
"તમે તેને <a href=\"https://bugzilla.redhat.com/createaccount.cgi\">અહિંયા</a> "
"બનાવી શકો છો"
-#: ../src/plugins/CCpp.cpp:277
-msgid "Analyzes crashes in C/C++ programs"
-msgstr "C/C++ કારà«àª¯àª•à«àª°àª®à«‹àª®àª¾àª‚ ભંગાણોનà«àª‚ પૃથà«àª¥àª•àª°àª£ થાય છે"
-
#: ../src/plugins/KerneloopsReporter.glade.h:1
msgid "<b>Kerneloops Reporter plugin configuration</b>"
msgstr "<b>Kerneloops રિપોરà«àªŸàª° પà«àª²àª—ઇન રૂપરેખાંકન</b>"
@@ -1577,10 +1633,6 @@ msgstr "<b>Kerneloops રિપોરà«àªŸàª° પà«àª²àª—ઇન રૂપરà«
msgid "Submit URL:"
msgstr "URL ને સમાવો:"
-#: ../src/plugins/KerneloopsScanner.cpp:227
-msgid "Periodically scans for and saves kernel oopses"
-msgstr "તેની માટે નિયત સમયે સà«àª•à«‡àª¨ કરે છે અને કરà«àª¨àª² oopses નો સંગà«àª°àª¹ કરે છે"
-
#: ../src/plugins/Logger.glade.h:1
msgid "<b>Logger plugin configuration</b>"
msgstr "<b>લોગર પà«àª²àª—ઇન રૂપરેખાંકન</b>"
@@ -1626,9 +1678,8 @@ msgid "RHTSupport URL:"
msgstr "RHTSupport URL:"
#: ../src/plugins/Upload.glade.h:1
-#, fuzzy
msgid "<b>Upload plugin configuration</b>"
-msgstr "<b>ટિકીટ અપલોડર પà«àª²àª—ઇન રૂપરેખાંકન</b>"
+msgstr "<b>પà«àª²àª—ઇન રૂપરેખાંકનને અપલોડ કરો</b>"
#: ../src/plugins/Upload.glade.h:2
msgid "Retry count:"
@@ -1646,100 +1697,3 @@ msgstr "URL:"
msgid "Use encryption"
msgstr "àªàª¨àª•à«àª°àª¿àªªà«àª¶àª¨àª¨à«‡ વાપરો"
-#~ msgid "Database plugin not specified. Please check abrtd settings."
-#~ msgstr "ડેટાબેઠપà«àª²àª—ઇન સà«àªªàª·à«àªŸ થયેલ નથી. મહેરબાની કરીને abrtd સà«àª¯à«‹àªœàª¨à«‹àª¨à«‡ ચકાસો."
-
-#~ msgid "Keeps SQLite3 database about all crashes"
-#~ msgstr "બધા ભંગાણો વિશે SQLite3 ડેટાબેàªàª¨à«‡ રાખે છે"
-
-#~ msgid "Reports bugs to bugzilla"
-#~ msgstr "bugzilla માં ભૂલોનો અહેવાલ થાય છે"
-
-#~ msgid "Generating backtrace"
-#~ msgstr "બેકટà«àª°à«‡àª¸àª¨à«‡ ઉતà«àªªàª¨à«àª¨ કરી રહà«àª¯àª¾ છે"
-
-#~ msgid "Getting global universal unique identification..."
-#~ msgstr "વૈશà«àª°à«àªµàª¿àª• વિશà«àª°à«àªµàªµà«àª¯àª¾àªªàª• અનનà«àª¯ ઓળખાણને મેળવી રહà«àª¯àª¾ છે..."
-
-#~ msgid "Skipping the debuginfo installation"
-#~ msgstr "ડિબગ જાણકારી સà«àª¥àª¾àªªàª¨ ને છોડી રહà«àª¯àª¾ છે"
-
-#~ msgid "FileTransfer: URL not specified"
-#~ msgstr "FileTransfer: URL સà«àªªàª·à«àªŸ થયેલ નથી"
-
-#~ msgid "FileTransfer: Creating a report..."
-#~ msgstr "ફાઇલ પરિવહન: અહેવાલને બનાવી રહà«àª¯àª¾ છે..."
-
-#~ msgid "Cannot create and send an archive: %s"
-#~ msgstr "બનાવી શકાતો નથી અને પેટીને મોકલો: %s"
-
-#~ msgid "Sends a report via FTP or SCTP"
-#~ msgstr "FTP અથવા SCTP મારફતે અહેવાલને મોકલે છે"
-
-#~ msgid "Analyzes kernel oopses"
-#~ msgstr "કરà«àª¨àª² oopses નà«àª‚ પૃથà«àª¥àª•àª°àª£ થાય છે"
-
-#~ msgid "Creating and submitting a report..."
-#~ msgstr "અહેવાલને બનાવી અને સોંપી રહà«àª¯àª¾ છે..."
-
-#~ msgid "Sends kernel oops information to kerneloops.org"
-#~ msgstr "kerneloops.org માં કરà«àª¨àª² oops જાણકારીને મોકલે છે"
-
-#~ msgid "Writes report to a file"
-#~ msgstr "ફઇલમાં અહેવાલને લખે છે"
-
-#~ msgid "Sends an email with a report (via mailx command)"
-#~ msgstr "અહેવાલ સાથે ઇમેલને મોકલે છે (mailx આદેશ મારફતે)"
-
-#~ msgid "Analyzes crashes in Python programs"
-#~ msgstr "Python કારà«àª¯àª•à«àª°àª®à«‹àª®àª¾àª‚ ભંગાણોનૠપૃથà«àª¥àª•àª°àª£ થાય છે"
-
-#~ msgid "Sending failed, trying again. %s"
-#~ msgstr "મોકલવાનà«àª‚ નિષà«àª«àª³, ફરીથી પà«àª°àª¯àª¤à«àª¨ કરો. %s"
-
-#~ msgid "Creating a ReportUploader report..."
-#~ msgstr "ReportUploader અહેવાલને બનાવી રહà«àª¯àª¾ છે..."
-
-#~ msgid ""
-#~ "Packs crash data into .tar.gz file, optionally uploads it via FTP/SCP/etc"
-#~ msgstr ""
-#~ ".tar.gz ફાઇલમાં પેકેજોની ભંગાણ માહિતી, વૈકલà«àªªàª¿àª• રીતે FTP/SCP/etc મારફતે તેને અપલોડ "
-#~ "કરાય છે"
-
-#, fuzzy
-#~ msgid "Reports bugs to Red Hat support"
-#~ msgstr "bugzilla માં ભૂલોનો અહેવાલ થાય છે"
-
-#~ msgid "Runs a command, saves its output"
-#~ msgstr "આદેશને ચલાવે છે, તેનાં આઉટપà«àªŸàª¨à«‡ સંગà«àª°àª¹à«‡ છે"
-
-#~ msgid "Running sosreport: %s"
-#~ msgstr "sosreport ચાલી રહà«àª¯à« છે: %s"
-
-#~ msgid "Finished running sosreport"
-#~ msgstr "sosreport ચાલી રહà«àª¯à« છે તે સમાપà«àª¤ થયà«"
-
-#~ msgid "Runs sosreport, saves the output"
-#~ msgstr "sosreport ને ચલાવે છે, આઉટપà«àªŸàª¨à«‡ સંગà«àª°àª¹à«‡ છે"
-
-#~ msgid "Customer:"
-#~ msgstr "કસà«àªŸàª®àª°:"
-
-#~ msgid "Ticket:"
-#~ msgstr "ટિકીટ:"
-
-#~ msgid "Upload"
-#~ msgstr "અપલોડ"
-
-#~ msgid "Rating is required by the %s plugin"
-#~ msgstr "રેટિંગ %s પà«àª²àª—ઇન દà«àª¦àª¾àª°àª¾ જરૂરી છે"
-
-#~ msgid "Rating is not required by any plugin, skipping the check..."
-#~ msgstr "રેટિંગ કોઇપણ પà«àª²àª—ઇન દà«àª¦àª¾àª°àª¾ જરૂરી નથી, ચકાસવાનà«àª‚ છોડી રહà«àª¯àª¾ છે..."
-
-#~ msgid ""
-#~ "Cannot login. Check Edit->Plugins->Bugzilla and /etc/abrt/plugins/"
-#~ "Bugzilla.conf. Server said: %s"
-#~ msgstr ""
-#~ "લોગિન કરી શકાતૠનથી. ફેરફાર કરો->પà«àª²àª—ઇન->Bugzilla અને etc/abrt/plugins/"
-#~ "Bugzilla.conf ને ચકાસો. સરà«àªµàª° કહે છે: %s"
diff --git a/po/hi.po b/po/hi.po
index a00401d7..a6188e38 100644
--- a/po/hi.po
+++ b/po/hi.po
@@ -3,20 +3,20 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Rajesh Ranjan <rajesh672@gmail.com>, 2009.
-# Rajesh Ranjan <rranjan@redhat.com>, 2010.
+# Rajesh Ranjan <rranjan@redhat.com>, 2010, 2011.
msgid ""
msgstr ""
"Project-Id-Version: abrt.master\n"
"Report-Msgid-Bugs-To: jmoskovc@redhat.com\n"
-"POT-Creation-Date: 2010-11-29 13:51+0100\n"
-"PO-Revision-Date: 2010-07-30 16:33+0530\n"
-"Last-Translator: Rajesh Ranjan <rranjan@redhat.com>\n"
+"POT-Creation-Date: 2011-02-16 02:52+0000\n"
+"PO-Revision-Date: 2011-02-16 14:03+0530\n"
+"Last-Translator: \n"
"Language-Team: Hindi <fedora-trans-hi@redhat.com>\n"
"Language: hi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.11.4\n"
+"X-Generator: Lokalize 1.1\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
"\n"
"\n"
@@ -44,16 +44,16 @@ msgstr "ABRT अधिसूचना à¤à¤ªà¥à¤²à¥‡à¤Ÿ"
msgid "Automatic Bug Reporting Tool"
msgstr "सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ बग रिपोरà¥à¤Ÿà¤¿à¤‚ग औजार"
-#: ../src/applet/Applet.cpp:86
+#: ../src/applet/applet.c:85
#, c-format
msgid "A crash in the %s package has been detected"
msgstr "%s संकà¥à¤² में कà¥à¤°à¥ˆà¤¶ को जाà¤à¤šà¤¾ गया था"
-#: ../src/applet/Applet.cpp:88
+#: ../src/applet/applet.c:87
msgid "A crash has been detected"
msgstr "कà¥à¤°à¥ˆà¤¶ पता किया गया है"
-#: ../src/applet/Applet.cpp:285
+#: ../src/applet/applet.c:284
msgid "ABRT service is not running"
msgstr "ABRT सेवा नहीं चल रहा है"
@@ -63,12 +63,10 @@ msgid "Warning"
msgstr "चेतावनी"
#: ../src/applet/applet_gtk.c:230
-msgid ""
-"Notification area applet that notifies users about issues detected by ABRT"
-msgstr ""
-"अधिसूचना कà¥à¤·à¥‡à¤¤à¥à¤° à¤à¤ªà¥à¤²à¥‡à¤Ÿ जो ABRT के दà¥à¤µà¤¾à¤°à¤¾ पता किठमà¥à¤¦à¥à¤¦à¥‹à¤‚ के बारे में उपयोकà¥à¤¤à¤¾ को सूचित करता है"
+msgid "Notification area applet that notifies users about issues detected by ABRT"
+msgstr "अधिसूचना कà¥à¤·à¥‡à¤¤à¥à¤° à¤à¤ªà¥à¤²à¥‡à¤Ÿ जो ABRT के दà¥à¤µà¤¾à¤°à¤¾ पता किठमà¥à¤¦à¥à¤¦à¥‹à¤‚ के बारे में उपयोकà¥à¤¤à¤¾ को सूचित करता है"
-#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:23
+#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:24
msgid "translator-credits"
msgstr "राजेश रंजन (rranjan@redhat.com, rajeshkajha@yahoo.com)"
@@ -76,7 +74,7 @@ msgstr "राजेश रंजन (rranjan@redhat.com, rajeshkajha@yahoo.com)
msgid "Hide"
msgstr "छिपाà¤à¤"
-#: ../src/applet/applet_gtk.c:360 ../src/gui/ccgui.glade.h:13
+#: ../src/applet/applet_gtk.c:360 ../src/gui/ccgui.glade.h:14
msgid "Report"
msgstr "रिपोरà¥à¤Ÿ"
@@ -84,8 +82,8 @@ msgstr "रिपोरà¥à¤Ÿ"
msgid "Open ABRT"
msgstr "ABRT खोलें"
-#: ../src/cli/CLI.cpp:47
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:93
+#, c-format
msgid ""
"\tCrash dump : %s\n"
"\tUID : %s\n"
@@ -94,20 +92,20 @@ msgid ""
"\tCrash Time : %s\n"
"\tCrash Count: %s\n"
msgstr ""
+"\tCrash dump : %s\n"
"\tUID : %s\n"
-"\tUUID : %s\n"
"\tPackage : %s\n"
"\tExecutable : %s\n"
"\tCrash Time : %s\n"
"\tCrash Count: %s\n"
-#: ../src/cli/CLI.cpp:65
+#: ../src/cli/CLI.cpp:112
#, c-format
msgid "\tHostname : %s\n"
msgstr "\tHostname : %s\n"
-#: ../src/cli/CLI.cpp:98
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:145
+#, c-format
msgid ""
"Dump directory: %s\n"
"Last crash: %s\n"
@@ -119,7 +117,7 @@ msgid ""
"System: %s, kernel %s\n"
"Reason: %s\n"
msgstr ""
-"Crash ID: %s:%s\n"
+"Dump directory: %s\n"
"Last crash: %s\n"
"Analyzer: %s\n"
"Component: %s\n"
@@ -127,31 +125,29 @@ msgstr ""
"Command: %s\n"
"Executable: %s\n"
"System: %s, kernel %s\n"
-"Rating: %s\n"
-"Coredump file: %s\n"
"Reason: %s\n"
-#: ../src/cli/CLI.cpp:125
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:173
+#, c-format
msgid "Coredump file: %s\n"
-msgstr "कà¥à¤°à¥ˆà¤¶ फंकà¥à¤¶à¤¨: %s\n"
+msgstr "कोरडंप फ़ाइल: %s\n"
-#: ../src/cli/CLI.cpp:129
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:177
+#, c-format
msgid "Rating: %s\n"
-msgstr "Hostname: %s\n"
+msgstr "दर: %s\n"
-#: ../src/cli/CLI.cpp:134
+#: ../src/cli/CLI.cpp:182
#, c-format
msgid "Crash function: %s\n"
msgstr "कà¥à¤°à¥ˆà¤¶ फंकà¥à¤¶à¤¨: %s\n"
-#: ../src/cli/CLI.cpp:138
+#: ../src/cli/CLI.cpp:186
#, c-format
msgid "Hostname: %s\n"
msgstr "Hostname: %s\n"
-#: ../src/cli/CLI.cpp:142
+#: ../src/cli/CLI.cpp:190
#, c-format
msgid ""
"\n"
@@ -162,7 +158,7 @@ msgstr ""
"How to reproduce:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:146
+#: ../src/cli/CLI.cpp:194
#, c-format
msgid ""
"\n"
@@ -173,7 +169,7 @@ msgstr ""
"टिपà¥à¤ªà¤£à¥€:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:152
+#: ../src/cli/CLI.cpp:200
#, c-format
msgid ""
"\n"
@@ -184,69 +180,65 @@ msgstr ""
"बैकटà¥à¤°à¥‡à¤¸:\n"
"%s\n"
-#. Message has embedded tabs.
-#: ../src/cli/CLI.cpp:243
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:298
+#, c-format
msgid ""
-"Usage: %s [OPTION]\n"
-"\n"
-"Startup:\n"
-"\t-V, --version\t\tdisplay the version of %s and exit\n"
-"\t-?, --help\t\tprint this help\n"
-"\n"
-"Actions:\n"
-"\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
-"\t -f, --full\tprint a list of all crashes, including the already "
-"reported ones\n"
-"\t-r, --report CRASH_ID\tcreate and send a report\n"
-"\t -y, --always\tcreate and send a report without asking\n"
-"\t-d, --delete CRASH_ID\tremove a crash\n"
-"\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
-"\t -b, --backtrace\tprint detailed information about a crash including "
-"backtrace\n"
-"CRASH_ID can be:\n"
-"\ta name of dump directory, or\n"
-"\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+"Usage: %s -l[f] [-D BASE_DIR]...]\n"
+" or: %s -r[y] CRASH_DIR\n"
+" or: %s -i[b] CRASH_DIR\n"
+" or: %s -d CRASH_DIR\n"
+"\n"
+"\t-l, --list\t\tList not yet reported crashes\n"
+"\t -f, --full\t\tList all crashes\n"
+"\t-D BASE_DIR\t\tDirectory to list crashes from\n"
+"\t\t\t\t(default: -D $HOME/.abrt/spool -D %s)\n"
+"\n"
+"\t-r, --report\t\tSend a report about CRASH_DIR\n"
+"\t -y, --always\t\t...without editing and asking\n"
+"\t-i, --info\t\tPrint detailed information about CRASH_DIR\n"
+"\t -b, --backtrace\t...including backtrace\n"
+"\t-d, --delete\t\tRemove CRASH_DIR\n"
+"\n"
+"\t-V, --version\t\tDisplay version and exit\n"
+"\t-v, --verbose\t\tBe verbose\n"
msgstr ""
-"Usage: %s [OPTION]\n"
-"\n"
-"Startup:\n"
-"\t-V, --version\t\tdisplay the version of %s and exit\n"
-"\t-?, --help\t\tprint this help\n"
-"\n"
-"Actions:\n"
-"\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
-"\t -f, --full\tprint a list of all crashes, including the already "
-"reported ones\n"
-"\t-r, --report CRASH_ID\tcreate and send a report\n"
-"\t -y, --always\tcreate and send a report without asking\n"
-"\t-d, --delete CRASH_ID\tremove a crash\n"
-"\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
-"\t -b, --backtrace\tprint detailed information about a crash including "
-"backtrace\n"
-"CRASH_ID can be:\n"
-"\tUID:UUID pair,\n"
-"\tunique UUID prefix - the crash with matching UUID will be acted upon\n"
-"\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
-
-#: ../src/cli/CLI.cpp:287
+"Usage: %s -l[f] [-D BASE_DIR]...]\n"
+" or: %s -r[y] CRASH_DIR\n"
+" or: %s -i[b] CRASH_DIR\n"
+" or: %s -d CRASH_DIR\n"
+"\n"
+"\t-l, --list\t\tList not yet reported crashes\n"
+"\t -f, --full\t\tList all crashes\n"
+"\t-D BASE_DIR\t\tDirectory to list crashes from\n"
+"\t\t\t\t(default: -D $HOME/.abrt/spool -D %s)\n"
+"\n"
+"\t-r, --report\t\tSend a report about CRASH_DIR\n"
+"\t -y, --always\t\t...without editing and asking\n"
+"\t-i, --info\t\tPrint detailed information about CRASH_DIR\n"
+"\t -b, --backtrace\t...including backtrace\n"
+"\t-d, --delete\t\tRemove CRASH_DIR\n"
+"\n"
+"\t-V, --version\t\tDisplay version and exit\n"
+"\t-v, --verbose\t\tBe verbose\n"
+
+#: ../src/cli/CLI.cpp:346
msgid "You must specify exactly one operation"
msgstr "आपको निशà¥à¤šà¤¿à¤¤ रूप से à¤à¤• संकà¥à¤°à¤¿à¤¯à¤¾ निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ करनी चाहिà¤"
-#: ../src/cli/report.cpp:166
+#: ../src/cli/report.cpp:160
#, c-format
msgid "# This field is read only\n"
msgstr "# यह कà¥à¤·à¥‡à¤¤à¥à¤° केवल पठनीय है\n"
-#: ../src/cli/report.cpp:186
+#: ../src/cli/report.cpp:180
msgid "# Describe the circumstances of this crash below"
msgstr "# नीचे कà¥à¤°à¥ˆà¤¶ की परिसà¥à¤¥à¤¿à¤¤à¤¿à¤¯à¥‹à¤‚ को वरà¥à¤£à¤¿à¤¤ करें"
-#: ../src/cli/report.cpp:188
+#: ../src/cli/report.cpp:182
msgid "# How to reproduce the crash?"
msgstr "# कà¥à¤°à¥ˆà¤¶ कैसे फिर उतà¥à¤ªà¤¨à¥à¤¨ करें?"
-#: ../src/cli/report.cpp:190
+#: ../src/cli/report.cpp:184
msgid ""
"# Backtrace\n"
"# Check that it does not contain any sensitive data (passwords, etc.)"
@@ -254,47 +246,47 @@ msgstr ""
"# Backtrace\n"
"# जाà¤à¤šà¥‡à¤‚ कि यह किसी संवेदनशील आà¤à¤•à¤¡à¤¼à¥‡ को समाहित नहीं किया है (कूटशबà¥à¤¦ आदि)"
-#: ../src/cli/report.cpp:192
+#: ../src/cli/report.cpp:186
msgid "# Architecture"
msgstr "# आरà¥à¤•à¤¿à¤Ÿà¥‡à¤•à¥à¤šà¤°"
-#: ../src/cli/report.cpp:193
+#: ../src/cli/report.cpp:187
msgid "# Command line"
msgstr "# कमांड लाइन"
-#: ../src/cli/report.cpp:194
+#: ../src/cli/report.cpp:188
msgid "# Component"
msgstr "# घटक"
-#: ../src/cli/report.cpp:195
+#: ../src/cli/report.cpp:189
msgid "# Core dump"
msgstr "# कोर डंप"
-#: ../src/cli/report.cpp:196
+#: ../src/cli/report.cpp:190
msgid "# Executable"
msgstr "# निषà¥à¤ªà¤¾à¤¦à¤¨à¥€à¤¯"
-#: ../src/cli/report.cpp:197
+#: ../src/cli/report.cpp:191
msgid "# Kernel version"
msgstr "# करà¥à¤¨à¥‡à¤² संसà¥à¤•à¤°à¤£"
-#: ../src/cli/report.cpp:198
+#: ../src/cli/report.cpp:192
msgid "# Package"
msgstr "# संकà¥à¤²"
-#: ../src/cli/report.cpp:199
+#: ../src/cli/report.cpp:193
msgid "# Reason of crash"
msgstr "# कà¥à¤°à¥ˆà¤¶ के कारण"
-#: ../src/cli/report.cpp:200
+#: ../src/cli/report.cpp:194
msgid "# Release string of the operating system"
msgstr "# ऑपरेटिंग सिसà¥à¤Ÿà¤® का रिलीज सà¥à¤Ÿà¥à¤°à¤¿à¤‚ग"
-#: ../src/cli/report.cpp:323
+#: ../src/cli/report.cpp:317
msgid "Cannot run vi: $TERM, $VISUAL and $EDITOR are not set"
msgstr "vi नहीं चला सकता है: $TERM, $VISUAL और $EDITOR सेट नहीं है"
-#: ../src/cli/report.cpp:411
+#: ../src/cli/report.cpp:401
msgid ""
"\n"
"The report has been updated"
@@ -302,7 +294,7 @@ msgstr ""
"\n"
"रिपोरà¥à¤Ÿ अदà¥à¤¯à¤¤à¤¨ किया गया है"
-#: ../src/cli/report.cpp:413
+#: ../src/cli/report.cpp:403
msgid ""
"\n"
"No changes were detected in the report"
@@ -311,103 +303,127 @@ msgstr ""
"रिपोरà¥à¤Ÿ में कोई परिवरà¥à¤¤à¤¨ पता नहीं किया गया"
#. The response might take more than 1 char in non-latin scripts.
-#: ../src/cli/report.cpp:464
+#: ../src/cli/report.cpp:435
msgid "y"
-msgstr ""
+msgstr "y"
-#: ../src/cli/report.cpp:465
+#: ../src/cli/report.cpp:436
msgid "N"
-msgstr ""
+msgstr "N"
#. Read the missing information and push it to plugin settings.
-#: ../src/cli/report.cpp:565
+#: ../src/cli/report.cpp:567
#, c-format
msgid "Wrong settings were detected for plugin %s\n"
msgstr "पà¥à¤²à¤—िन %s के लिठगलत सेटिंग पता किया गया था\n"
-#: ../src/cli/report.cpp:569
+#: ../src/cli/report.cpp:571
msgid "Enter your login: "
msgstr "अपना लॉगिन दरà¥à¤œ करें: "
-#: ../src/cli/report.cpp:575
+#: ../src/cli/report.cpp:577
msgid "Enter your password: "
msgstr "अपना कूटशबà¥à¤¦ दरà¥à¤œ करें: "
-#: ../src/cli/report.cpp:638
+#: ../src/cli/report.cpp:787
msgid "Reporting..."
msgstr "रिपोरà¥à¤Ÿ कर रहा है..."
-#: ../src/cli/report.cpp:657
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:800
+#, c-format
msgid "Report using %s?"
-msgstr "%s के उपयोग से रिपोरà¥à¤Ÿ करें? [y/N]: "
+msgstr "%s के उपयोग से रिपोरà¥à¤Ÿ करें?"
-#: ../src/cli/report.cpp:660
+#: ../src/cli/report.cpp:803
msgid "Skipping..."
msgstr "छोड़ रहा है..."
-#: ../src/cli/report.cpp:672
-#, fuzzy
+#: ../src/cli/report.cpp:819
msgid "Reporting disabled because the backtrace is unusable"
msgstr "रिपोरà¥à¤Ÿà¤¿à¤‚ग निषà¥à¤•à¥à¤°à¤¿à¤¯ कà¥à¤¯à¥‹à¤‚कि बैकटà¥à¤°à¥‡à¤¸ अपà¥à¤°à¤¯à¥‹à¤œà¥à¤¯ है."
-#: ../src/cli/report.cpp:676
+#: ../src/cli/report.cpp:823
#, c-format
msgid ""
"Please try to install debuginfo manually using the command: \"debuginfo-"
"install %s\" and try again\n"
msgstr ""
+"इस कमांड से डिबगिइंफो को संसà¥à¤¥à¤¾à¤ªà¤¿à¤¤ करने की कोशिश करें: \"debuginfo-"
+"install %s\" और फिर कोशिश करें\n"
-#: ../src/cli/report.cpp:685
-#, fuzzy
-msgid "Error loading reporter settings"
-msgstr "रिपोरà¥à¤Ÿ पाने में तà¥à¤°à¥à¤Ÿà¤¿: %s"
-
-#: ../src/cli/report.cpp:704
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:841
+#, c-format
msgid "Crash reported via %d report events (%d errors)\n"
-msgstr "%d पà¥à¤²à¤—िन के दà¥à¤µà¤¾à¤°à¤¾ कà¥à¤°à¥ˆà¤¶ रिपोरà¥à¤Ÿ किया गया (%d तà¥à¤°à¥à¤Ÿà¤¿)\n"
+msgstr "%d रिपोरà¥à¤Ÿ घटना के दà¥à¤µà¤¾à¤°à¤¾ कà¥à¤°à¥ˆà¤¶ रिपोरà¥à¤Ÿ किया गया (%d तà¥à¤°à¥à¤Ÿà¤¿)\n"
-#: ../src/daemon/abrt-handle-crashdump.c:42
+#: ../src/daemon/abrt-action-save-package-data.c:271
msgid ""
-" [-vs] -d DIR -e EVENT\n"
-" or: "
+" [options] -d DIR\n"
+"\n"
+"Query package database and save package name, component, and description"
msgstr ""
+" [options] -d DIR\n"
+"\n"
+"संकà¥à¤² डाटाबेस को पà¥à¤°à¤¶à¥à¤¨ करें और संकà¥à¤² नाम, घटक और विवरण सहेजें"
-#: ../src/daemon/abrt-handle-crashdump.c:57
+#: ../src/daemon/abrt-action-save-package-data.c:283
+#: ../src/daemon/abrt-handle-crashdump.c:60
#: ../src/plugins/abrt-action-analyze-c.c:167
#: ../src/plugins/abrt-action-analyze-oops.c:144
#: ../src/plugins/abrt-action-analyze-python.c:49
+#: ../src/plugins/abrt-action-bugzilla.cpp:927
+#: ../src/plugins/abrt-action-generate-backtrace.c:270
+#: ../src/plugins/abrt-action-kerneloops.c:147
+#: ../src/plugins/abrt-action-mailx.c:149
+#: ../src/plugins/abrt-action-print.c:50
+#: ../src/plugins/abrt-action-rhtsupport.c:280
+#: ../src/plugins/abrt-action-upload.c:260
+msgid "Crash dump directory"
+msgstr "कà¥à¤°à¥ˆà¤¶ डंप निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾à¤•à¥à¤°à¥ˆà¤¶ डंप निरà¥à¤œà¤¦"
+
+#: ../src/daemon/abrt-action-save-package-data.c:284
+#: ../src/daemon/abrt-handle-crashdump.c:59 ../src/daemon/abrt-server.c:297
+#: ../src/plugins/abrt-action-bugzilla.cpp:926
+#: ../src/plugins/abrt-action-generate-backtrace.c:273
+#: ../src/plugins/abrt-action-kerneloops.c:146
+#: ../src/plugins/abrt-action-rhtsupport.c:279
+#: ../src/plugins/abrt-dump-oops.c:555
msgid "Log to syslog"
-msgstr ""
+msgstr "सिसलॉग में लॉग करेंसिसà¥à¤Ÿà¤²"
-#: ../src/daemon/abrt-handle-crashdump.c:58
-#: ../src/plugins/abrt-action-analyze-c.c:166
-#: ../src/plugins/abrt-action-analyze-oops.c:143
-#: ../src/plugins/abrt-action-analyze-python.c:48
-#: ../src/plugins/abrt-action-mailx.cpp:150
-#: ../src/plugins/abrt-action-print.cpp:50
-#: ../src/plugins/abrt-action-upload.cpp:266
-msgid "Crash dump directory"
+#: ../src/daemon/abrt-handle-crashdump.c:43
+msgid ""
+" [-vs] -d DIR -e EVENT\n"
+" or: "
msgstr ""
+" [-vs] -d DIR -e EVENT\n"
+" or: "
-#: ../src/daemon/abrt-handle-crashdump.c:59
+#: ../src/daemon/abrt-handle-crashdump.c:61
msgid "Handle EVENT"
-msgstr ""
+msgstr "घटना नियंतà¥à¤°à¤¿à¤¤ करेंघटना नियंतà¥à¤°à¤£à¤¤"
-#: ../src/daemon/abrt-handle-crashdump.c:60
+#: ../src/daemon/abrt-handle-crashdump.c:62
msgid "List possible events [which start with PFX]"
-msgstr ""
+msgstr "संभावित घटना की सूची दें [which start with PFX]"
+
+#: ../src/daemon/abrt-server.c:286 ../src/daemon/Daemon.cpp:542
+msgid " [options]"
+msgstr " [options]"
+
+#: ../src/daemon/abrt-server.c:296
+msgid "Use UID as client uid"
+msgstr "UID को बतौर कà¥à¤²à¤¾à¤‡à¤‚ट uid उपयोग करें"
-#: ../src/daemon/CommLayerServerDBus.cpp:229
+#: ../src/daemon/CommLayerServerDBus.cpp:241
msgid "Comment is too long"
msgstr "टिपà¥à¤ªà¤£à¥€ बहà¥à¤¤ लंबी है"
-#: ../src/daemon/CommLayerServerDBus.cpp:233
+#: ../src/daemon/CommLayerServerDBus.cpp:245
msgid "'How to reproduce' is too long"
msgstr "'कैसे फिर लाà¤à¤' काफी लंबा है"
-#: ../src/daemon/Daemon.cpp:534
+#: ../src/daemon/Daemon.cpp:371
msgid ""
"The size of the report exceeded the quota. Please check system's "
"MaxCrashReportsSize value in abrt.conf."
@@ -415,21 +431,17 @@ msgstr ""
"रिपोरà¥à¤Ÿ का आकार कोटा से अधिक है. कृपया सिसà¥à¤Ÿà¤® के MaxCrashReportsSize मान को abrt."
"conf में जाà¤à¤šà¥‡à¤‚."
-#: ../src/daemon/Daemon.cpp:699
-msgid "abrtd [options]"
-msgstr ""
-
-#: ../src/daemon/Daemon.cpp:709
+#: ../src/daemon/Daemon.cpp:553
msgid "Do not daemonize"
-msgstr ""
+msgstr "डेमॉनाइज मत करें"
-#: ../src/daemon/Daemon.cpp:710
+#: ../src/daemon/Daemon.cpp:554
msgid "Log to syslog even with -d"
-msgstr ""
+msgstr "-d के साथ सिसलॉग घटना में लॉग-d के साथ सिसà¥"
-#: ../src/daemon/Daemon.cpp:711
+#: ../src/daemon/Daemon.cpp:555
msgid "Exit after SEC seconds of inactivity"
-msgstr ""
+msgstr "SEC सेकेंड निषà¥à¤•à¥à¤°à¤¿à¤¯à¤¤à¤¾ के बाद बाहर निकलें"
#: ../src/gui/abrt.desktop.in.h:2
msgid "View and report application crashes"
@@ -440,8 +452,7 @@ msgid "Another client is already running, trying to wake it..."
msgstr "अनà¥à¤¯ कà¥à¤²à¤¾à¤‡à¤‚ट पहले चल रहा है, इसे फिर से लाने की कोशिश कर रहा है..."
#: ../src/gui/ABRTExceptions.py:14
-msgid ""
-"Got unexpected data from the daemon (is the database properly updated?)."
+msgid "Got unexpected data from the daemon (is the database properly updated?)."
msgstr "डेमॉन से अपà¥à¤°à¤¤à¥à¤¯à¤¾à¤¶à¤¿à¤¤ आà¤à¤•à¤¡à¤¼à¤¾ पाया (कà¥à¤¯à¤¾ डेटाबेस ठीक से अदà¥à¤¯à¤¤à¤¨ है?)."
#: ../src/gui/ABRTPlugin.py:64
@@ -464,16 +475,16 @@ msgstr "रिपोरà¥à¤Ÿà¤° पà¥à¤²à¤—िन"
msgid "Database plugins"
msgstr "डेटाबेस पà¥à¤²à¤—िन"
-#: ../src/gui/CCDBusBackend.py:74 ../src/gui/CCDBusBackend.py:97
+#: ../src/gui/CCDBusBackend.py:75 ../src/gui/CCDBusBackend.py:98
msgid "Cannot connect to system dbus."
msgstr "तंतà¥à¤° dbus में कनेकà¥à¤Ÿ नहीं कर सकता है"
-#: ../src/gui/CCDBusBackend.py:120 ../src/gui/CCDBusBackend.py:123
+#: ../src/gui/CCDBusBackend.py:121 ../src/gui/CCDBusBackend.py:124
msgid "Please check if the abrt daemon is running."
msgstr "कृपया जाà¤à¤šà¥‡à¤‚ यदि abrt डेमॉन चल रहा है."
#. FIXME: BUG: BarWindow remains. (how2reproduce: delete "component" in a dump dir and try to report it)
-#: ../src/gui/CCDBusBackend.py:169
+#: ../src/gui/CCDBusBackend.py:170
msgid ""
"Daemon did not return a valid report info.\n"
"Is debuginfo missing?"
@@ -521,11 +532,15 @@ msgstr "ABRT का परिचय"
msgid "Copy to Clipboard"
msgstr "कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ में नक़ल लें"
-#: ../src/gui/ccgui.glade.h:12 ../src/gui/settings.glade.h:19
+#: ../src/gui/ccgui.glade.h:12
+msgid "Online _Help"
+msgstr "ऑनलाइन मदद (_H)"
+
+#: ../src/gui/ccgui.glade.h:13 ../src/gui/settings.glade.h:19
msgid "Plugins"
msgstr "पà¥à¤²à¤—िन"
-#: ../src/gui/ccgui.glade.h:14
+#: ../src/gui/ccgui.glade.h:15
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 "
@@ -553,19 +568,19 @@ msgstr ""
"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:19 ../src/gui/CReporterAssistant.py:71
+#: ../src/gui/ccgui.glade.h:20 ../src/gui/CReporterAssistant.py:111
msgid "View log"
msgstr "लॉग देखें"
-#: ../src/gui/ccgui.glade.h:20
+#: ../src/gui/ccgui.glade.h:21
msgid "_Edit"
msgstr "संपादन करें (_E)"
-#: ../src/gui/ccgui.glade.h:21
+#: ../src/gui/ccgui.glade.h:22
msgid "_File"
msgstr "फ़ाइल (_F)"
-#: ../src/gui/ccgui.glade.h:22
+#: ../src/gui/ccgui.glade.h:23
msgid "_Help"
msgstr "मदद (_H)"
@@ -586,7 +601,7 @@ msgstr "मेजबाननाम"
msgid "Latest Crash"
msgstr "नवीनतम कà¥à¤°à¥ˆà¤¶"
-#: ../src/gui/CCMainWindow.py:143
+#: ../src/gui/CCMainWindow.py:148
#, python-format
msgid ""
"Cannot show the settings dialog.\n"
@@ -595,7 +610,7 @@ msgstr ""
"सेटिंग संवाद नहीं दिखा सकता है.\n"
"%s"
-#: ../src/gui/CCMainWindow.py:148
+#: ../src/gui/CCMainWindow.py:153
#, python-format
msgid ""
"Unable to finish the current task!\n"
@@ -605,7 +620,7 @@ msgstr ""
"%s"
#. there is something wrong with the daemon if we cant get the dumplist
-#: ../src/gui/CCMainWindow.py:183
+#: ../src/gui/CCMainWindow.py:188
#, python-format
msgid ""
"Error while loading the dumplist.\n"
@@ -614,7 +629,7 @@ msgstr ""
"डंपलिसà¥à¤Ÿ लोड करने के दौरान तà¥à¤°à¥à¤Ÿà¤¿.\n"
"%s"
-#: ../src/gui/CCMainWindow.py:241
+#: ../src/gui/CCMainWindow.py:246
#, python-format
msgid ""
"<b>%s Crash</b>\n"
@@ -623,11 +638,11 @@ msgstr ""
"<b>%s कà¥à¤°à¥ˆà¤¶</b>\n"
"%s"
-#: ../src/gui/CCMainWindow.py:337
+#: ../src/gui/CCMainWindow.py:343
msgid "You have to select a crash to copy."
msgstr "आपको कॉपी करने के लिठकोई कà¥à¤°à¥ˆà¤¶ चà¥à¤¨à¤¨à¤¾ है."
-#: ../src/gui/CCMainWindow.py:421
+#: ../src/gui/CCMainWindow.py:427
msgid ""
"Usage: abrt-gui [OPTIONS]\n"
"\t-v[vv]\t\t\tVerbose\n"
@@ -637,7 +652,7 @@ msgstr ""
"\t-v[vv]\t\t\tVerbose\n"
"\t--report=CRASH_ID\tDirectly report crash with CRASH_ID"
-#: ../src/gui/CCMainWindow.py:444
+#: ../src/gui/CCMainWindow.py:450
#, python-format
msgid ""
"No such crash in the database, probably wrong crashid.\n"
@@ -646,93 +661,6 @@ msgstr ""
"डेटाबेस में कोई वैसा कà¥à¤°à¥ˆà¤¶ नहीं, संभवतः crashid गलत.\n"
"crashid=%s"
-#. default texts
-#: ../src/gui/CCReporterDialog.py:22 ../src/gui/CReporterAssistant.py:20
-msgid "Brief description of how to reproduce this or what you did..."
-msgstr "संकà¥à¤·à¤¿à¤ªà¥à¤¤ विवरण कि कैसे इसे फिर लाà¤à¤ और आपने कà¥à¤¯à¤¾ किया..."
-
-#: ../src/gui/CCReporterDialog.py:107
-msgid "You must check the backtrace for sensitive data."
-msgstr "आप संवेदनशील आà¤à¤•à¤¡à¤¼à¤¾ के लिठबैकटà¥à¤°à¥‡à¤¸ जरूर जाà¤à¤šà¥‡à¤‚."
-
-#: ../src/gui/CCReporterDialog.py:118 ../src/gui/CReporterAssistant.py:364
-#, python-format
-msgid ""
-"Reporting disabled because the backtrace is unusable.\n"
-"Please try to install debuginfo manually using the command: <b>debuginfo-"
-"install %s</b> \n"
-"then use the Refresh button to regenerate the backtrace."
-msgstr ""
-"रिपोरà¥à¤Ÿà¤¿à¤‚ग निषà¥à¤•à¥à¤°à¤¿à¤¯ किया गया कà¥à¤¯à¥‹à¤‚कि बैकटà¥à¤°à¥ˆà¤¸ अपà¥à¤°à¤¯à¥‹à¤œà¥à¤¯ है.\n"
-"कृपया डिबगइंफो को कमांड के पà¥à¤°à¤¯à¥‹à¤— से दसà¥à¤¤à¥€ रूप से संसà¥à¤¥à¤¾à¤ªà¤¿à¤¤ करने की कोशिश करें:"
-"<b>debuginfo-install %s</b> \n"
-"फिर बैकटà¥à¤°à¥ˆà¤¸ को फिर बनाने के लिठताज़ा बटन का पà¥à¤°à¤¯à¥‹à¤— करें."
-
-#: ../src/gui/CCReporterDialog.py:120
-msgid "The backtrace is unusable, you cannot report this!"
-msgstr "bactrace अपà¥à¤°à¤¯à¥‹à¤œà¥à¤¯ है, आप इसे रिपोरà¥à¤Ÿ नहीं कर सकते हैं!"
-
-#: ../src/gui/CCReporterDialog.py:124 ../src/gui/CReporterAssistant.py:342
-#: ../src/gui/CReporterAssistant.py:370
-msgid ""
-"The backtrace is incomplete, please make sure you provide the steps to "
-"reproduce."
-msgstr "बैकटà¥à¤°à¥‡à¤¸ अपूरà¥à¤£ है, कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि आप फिर बनाने के लिठबेहतर चरण देते हैं."
-
-#: ../src/gui/CCReporterDialog.py:130
-msgid "Reporting disabled, please fix the problems shown above."
-msgstr "रिपोरà¥à¤Ÿà¤¿à¤‚ग निषà¥à¤•à¥à¤°à¤¿à¤¯, ऊपर दिखाठसमसà¥à¤¯à¤¾ को ठीक करें."
-
-#: ../src/gui/CCReporterDialog.py:132
-msgid "Sends the report using the selected plugin."
-msgstr "चà¥à¤¨à¥‡ पà¥à¤²à¤—िन के उपयोग से रिपोरà¥à¤Ÿ भेजता है."
-
-#: ../src/gui/CCReporterDialog.py:398
-msgid ""
-"No reporter plugin available for this type of crash.\n"
-"Please check abrt.conf."
-msgstr ""
-"इस पà¥à¤°à¤•à¤¾à¤° के कà¥à¤°à¥ˆà¤¶ के लिठकोई रिपोरà¥à¤Ÿà¤° पà¥à¤²à¤—िन उपलबà¥à¤§ नहीं.\n"
-"कृपया abrt.conf जाà¤à¤šà¥‡à¤‚."
-
-#: ../src/gui/CCReporterDialog.py:418 ../src/gui/CReporterAssistant.py:249
-#: ../src/gui/PluginsSettingsDialog.py:136
-#, python-format
-msgid ""
-"Cannot save plugin settings:\n"
-" %s"
-msgstr ""
-"पà¥à¤²à¤—-इन सेटिंग सहेज नहीं सकता है:\n"
-" %s"
-
-#: ../src/gui/CCReporterDialog.py:448 ../src/gui/CReporterAssistant.py:279
-#, python-format
-msgid "Configure %s options"
-msgstr "%s विकलà¥à¤ª विनà¥à¤¯à¤¸à¥à¤¤ करें"
-
-#: ../src/gui/CCReporterDialog.py:498 ../src/gui/CReporterAssistant.py:1074
-msgid ""
-"Unable to get report!\n"
-"Is debuginfo missing?"
-msgstr ""
-"रिपोरà¥à¤Ÿ पाने में असमरà¥à¤¥!\n"
-"डिबगइंफो अनà¥à¤ªà¤¸à¥à¤¥à¤¿à¤¤ है?"
-
-#: ../src/gui/CCReporterDialog.py:527 ../src/gui/CReporterAssistant.py:455
-#, python-format
-msgid ""
-"Reporting failed!\n"
-"%s"
-msgstr ""
-"रिपोरà¥à¤Ÿà¤¿à¤‚ग विफल!\n"
-"%s"
-
-#: ../src/gui/CCReporterDialog.py:553 ../src/gui/CCReporterDialog.py:574
-#: ../src/gui/CReporterAssistant.py:1113
-#, python-format
-msgid "Error acquiring the report: %s"
-msgstr "रिपोरà¥à¤Ÿ पाने में तà¥à¤°à¥à¤Ÿà¤¿: %s"
-
#: ../src/gui/ConfBackend.py:78
msgid "Cannot connect to the Gnome Keyring daemon."
msgstr "गनोम कीरिंग डेमॉन में कनेकà¥à¤Ÿ नहीं कर सकता है."
@@ -744,55 +672,100 @@ msgid "Cannot get the default keyring."
msgstr "तयशà¥à¤¦à¤¾ कीरिंग पा नहीं सकता है."
#: ../src/gui/ConfBackend.py:103 ../src/gui/ConfBackend.py:120
-msgid ""
-"Access to gnome-keyring has been denied, plugins settings will not be saved."
+msgid "Access to gnome-keyring has been denied, plugins settings will not be saved."
msgstr "गनोम कीरिंग में पहà¥à¤à¤š मना किया गया, पà¥à¤²à¤—िन सेटिंग सहेजा नहीं जा सका."
#. we tried 2 times, so giving up the authorization
#: ../src/gui/ConfBackend.py:154
#, python-format
-msgid ""
-"Access to gnome-keyring has been denied, cannot load the settings for %s!"
+msgid "Access to gnome-keyring has been denied, cannot load the settings for %s!"
msgstr "गनोम कीरिंग में पहà¥à¤à¤š मना किया गया, %s के लिठसेटिंग लोड नहीं कर सकता है!"
#: ../src/gui/ConfBackend.py:207
msgid "Access to gnome-keyring has been denied, cannot load settings."
msgstr "गनोम कीरिंग में पहà¥à¤à¤š मना किया गया, सेटिंग लोड नहीं कर सकता है."
+#: ../src/gui/CReporterAssistant.py:20
+msgid "Brief description of how to reproduce this or what you did..."
+msgstr "संकà¥à¤·à¤¿à¤ªà¥à¤¤ विवरण कि कैसे इसे फिर लाà¤à¤ और आपने कà¥à¤¯à¤¾ किया..."
+
#: ../src/gui/CReporterAssistant.py:21
msgid "Crash info doesn't contain a backtrace"
msgstr "कà¥à¤°à¥ˆà¤¶ इंफो में बैकटà¥à¤°à¥‡à¤¸ नहीं समाहित है."
-#: ../src/gui/CReporterAssistant.py:334
+#: ../src/gui/CReporterAssistant.py:277
+#: ../src/gui/PluginsSettingsDialog.py:136
+#, python-format
+msgid ""
+"Cannot save plugin settings:\n"
+" %s"
+msgstr ""
+"पà¥à¤²à¤—-इन सेटिंग सहेज नहीं सकता है:\n"
+" %s"
+
+#: ../src/gui/CReporterAssistant.py:307
+#, python-format
+msgid "Configure %s options"
+msgstr "%s विकलà¥à¤ª विनà¥à¤¯à¤¸à¥à¤¤ करें"
+
+#: ../src/gui/CReporterAssistant.py:362
#, python-format
msgid "Rating is %s"
msgstr "रेटिंग है %s"
-#: ../src/gui/CReporterAssistant.py:337
+#: ../src/gui/CReporterAssistant.py:365
msgid "Crashdump doesn't have rating => we suppose it's not required"
msgstr "Crashdump के पास रेटिंग नहीं है => हम मानते हैं कि इसकी जरूरत नहीं है"
-#: ../src/gui/CReporterAssistant.py:350
+#: ../src/gui/CReporterAssistant.py:370 ../src/gui/CReporterAssistant.py:398
+msgid ""
+"The backtrace is incomplete, please make sure you provide the steps to "
+"reproduce."
+msgstr "बैकटà¥à¤°à¥‡à¤¸ अपूरà¥à¤£ है, कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि आप फिर बनाने के लिठबेहतर चरण देते हैं."
+
+#: ../src/gui/CReporterAssistant.py:378
msgid "You should check the backtrace for sensitive data."
msgstr "आपको संवेदनशील आà¤à¤•à¤¡à¤¼à¤¾ के लिठबैकटà¥à¤°à¥‡à¤¸ जाà¤à¤šà¤¨à¤¾ चाहिà¤."
-#: ../src/gui/CReporterAssistant.py:351
+#: ../src/gui/CReporterAssistant.py:379
msgid "You must agree with sending the backtrace."
msgstr "आपको बैकटà¥à¤°à¥‡à¤¸ भेजने के लिठजरूर सहमत होता चाहिà¤."
-#: ../src/gui/CReporterAssistant.py:366
+#: ../src/gui/CReporterAssistant.py:392
+#, python-format
+msgid ""
+"Reporting disabled because the backtrace is unusable.\n"
+"Please try to install debuginfo manually using the command: <b>debuginfo-"
+"install %s</b> \n"
+"then use the Refresh button to regenerate the backtrace."
+msgstr ""
+"रिपोरà¥à¤Ÿà¤¿à¤‚ग निषà¥à¤•à¥à¤°à¤¿à¤¯ किया गया कà¥à¤¯à¥‹à¤‚कि बैकटà¥à¤°à¥ˆà¤¸ अपà¥à¤°à¤¯à¥‹à¤œà¥à¤¯ है.\n"
+"कृपया डिबगइंफो को कमांड के पà¥à¤°à¤¯à¥‹à¤— से दसà¥à¤¤à¥€ रूप से संसà¥à¤¥à¤¾à¤ªà¤¿à¤¤ करने की कोशिश करें:"
+"<b>debuginfo-install %s</b> \n"
+"फिर बैकटà¥à¤°à¥ˆà¤¸ को फिर बनाने के लिठताज़ा बटन का पà¥à¤°à¤¯à¥‹à¤— करें."
+
+#: ../src/gui/CReporterAssistant.py:394
msgid "Reporting disabled because the backtrace is unusable."
msgstr "रिपोरà¥à¤Ÿà¤¿à¤‚ग निषà¥à¤•à¥à¤°à¤¿à¤¯ कà¥à¤¯à¥‹à¤‚कि बैकटà¥à¤°à¥‡à¤¸ अपà¥à¤°à¤¯à¥‹à¤œà¥à¤¯ है."
-#: ../src/gui/CReporterAssistant.py:412
+#: ../src/gui/CReporterAssistant.py:440
msgid "You did not provide any steps to reproduce."
msgstr "आपने फिर लाने के लिठकोई चरण नहीं दिया."
-#: ../src/gui/CReporterAssistant.py:426
+#: ../src/gui/CReporterAssistant.py:454
msgid "You did not provide any comments."
msgstr "आपने कोई टिपà¥à¤ªà¤£à¥€ नहीं की है."
-#: ../src/gui/CReporterAssistant.py:507
+#: ../src/gui/CReporterAssistant.py:483
+#, python-format
+msgid ""
+"Reporting failed!\n"
+"%s"
+msgstr ""
+"रिपोरà¥à¤Ÿà¤¿à¤‚ग विफल!\n"
+"%s"
+
+#: ../src/gui/CReporterAssistant.py:535
#, python-format
msgid ""
"It looks like an application from the package <b>%s</b> has crashed on your "
@@ -816,15 +789,15 @@ msgstr ""
"\n"
"चà¥à¤¨à¥‡à¤‚ कि कहाठआप इस बग को रिपोरà¥à¤Ÿ करना चाहेंगे, और 'आगे' को जारी रखने के लिठदबाà¤à¤."
-#: ../src/gui/CReporterAssistant.py:548
+#: ../src/gui/CReporterAssistant.py:576
msgid "Only one reporter plugin is configured."
msgstr "केवल à¤à¤• रिपोरà¥à¤Ÿà¤° पà¥à¤²à¤—िन विनà¥à¤¯à¤¸à¥à¤¤ है."
-#: ../src/gui/CReporterAssistant.py:554
+#: ../src/gui/CReporterAssistant.py:582
msgid "Send a bug report"
msgstr "बग रिपोरà¥à¤Ÿ भेजें"
-#: ../src/gui/CReporterAssistant.py:592
+#: ../src/gui/CReporterAssistant.py:620
msgid ""
"Below is the backtrace associated with your crash. A crash backtrace "
"provides developers with details about how the crash happened, helping them "
@@ -839,130 +812,141 @@ msgstr ""
"कृपया नीचे बैकटà¥à¤°à¥‡à¤¸ की समीकà¥à¤·à¤¾ करें और इसके बदलें यह पकà¥à¤•à¤¾ करने के लिठबग रिपोरà¥à¤Ÿ में कोई "
"संवेदनशील आà¤à¤•à¤¡à¤¼à¤¾ नहीं है जिसे आप संभवतः साà¤à¤¾ करना नहीं चाहेंगे:"
-#: ../src/gui/CReporterAssistant.py:663 ../src/gui/CReporterAssistant.py:676
-#: ../src/gui/CReporterAssistant.py:710
+#: ../src/gui/CReporterAssistant.py:691 ../src/gui/CReporterAssistant.py:704
+#: ../src/gui/CReporterAssistant.py:738
#, python-format
msgid "Found %i occurence(s) [at: %i of %i]"
-msgstr ""
+msgstr "%i घटना पाया [at: %i of %i]"
-#: ../src/gui/CReporterAssistant.py:747
+#: ../src/gui/CReporterAssistant.py:775
msgid "Search:"
-msgstr ""
+msgstr "खोजें:"
-#: ../src/gui/CReporterAssistant.py:778
+#: ../src/gui/CReporterAssistant.py:806
msgid "Refresh"
msgstr "ताजा करें"
-#: ../src/gui/CReporterAssistant.py:780
+#: ../src/gui/CReporterAssistant.py:808
msgid "Copy"
msgstr "नक़ल लें"
-#: ../src/gui/CReporterAssistant.py:786
+#: ../src/gui/CReporterAssistant.py:814
msgid "I agree with submitting the backtrace"
msgstr "मैं बैकटà¥à¤°à¥‡à¤¸ के सौंपे जाने से सहमत हूà¤"
-#: ../src/gui/CReporterAssistant.py:791
+#: ../src/gui/CReporterAssistant.py:819
msgid "Approve the backtrace"
msgstr "बैकटà¥à¤°à¥‡à¤¸ को सà¥à¤µà¥€à¤•à¥ƒà¤¤ करें"
-#: ../src/gui/CReporterAssistant.py:834
+#: ../src/gui/CReporterAssistant.py:862
msgid "You need to fill the how to before you can proceed..."
-msgstr ""
+msgstr "आपके आगे बढ़ने के पहले आपको कैसे करें को भरना होगा...आपके आगे बढ़ने के पहले आपको कैसे करें को फ"
-#: ../src/gui/CReporterAssistant.py:857
+#: ../src/gui/CReporterAssistant.py:885
msgid "How did this crash happen (step-by-step)? How would you reproduce it?"
msgstr "कैसे यह बैकटà¥à¤°à¥‡à¤¸ होता है (चरण दर चरण)? कैसे मैं इसे फिर ला सकता हूà¤?"
-#: ../src/gui/CReporterAssistant.py:877
-msgid ""
-"Are there any comments you would like to share with the software maintainers?"
+#: ../src/gui/CReporterAssistant.py:905
+msgid "Are there any comments you would like to share with the software maintainers?"
msgstr "कà¥à¤¯à¤¾ कोई टिपà¥à¤ªà¤£à¥€ है जिसे आप सॉफà¥à¤Ÿà¤µà¥‡à¤¯à¤° मैनटेनर से साà¤à¤¾ करना चाहते हैं?"
-#: ../src/gui/CReporterAssistant.py:897
+#: ../src/gui/CReporterAssistant.py:925
msgid "Provide additional details"
msgstr "अतिरिकà¥à¤¤ विवरण दें"
-#: ../src/gui/CReporterAssistant.py:904
+#: ../src/gui/CReporterAssistant.py:932
msgid ""
"<b>Tip:</b> Your comments are not private. Please watch what you say "
"accordingly."
msgstr "<b>संकेत:</b> आपकी टिपà¥à¤ªà¤£à¥€ निजी नहीं है. कृपया देखें जो आप कहते हैं."
-#: ../src/gui/CReporterAssistant.py:945
+#: ../src/gui/CReporterAssistant.py:973
msgid "Confirm and send the report"
msgstr "पà¥à¤·à¥à¤Ÿà¤¿ करें और रिपोरà¥à¤Ÿ भेजें"
-#: ../src/gui/CReporterAssistant.py:947
-msgid ""
-"Below is a summary of your bug report. Please click 'Apply' to submit it."
+#: ../src/gui/CReporterAssistant.py:975
+msgid "Below is a summary of your bug report. Please click 'Apply' to submit it."
msgstr "नीचे आपके बग रिपोरà¥à¤Ÿ का सारांश है. कृपया इसे सौंपने के लिठ'लागू करें' कà¥à¤²à¤¿à¤• करें."
-#: ../src/gui/CReporterAssistant.py:952
+#: ../src/gui/CReporterAssistant.py:980
msgid "<b>Basic details</b>"
msgstr "<b>मौलिक विवरण</b>"
#. left table
-#: ../src/gui/CReporterAssistant.py:959
+#: ../src/gui/CReporterAssistant.py:987
msgid "Component"
msgstr "घटक"
-#: ../src/gui/CReporterAssistant.py:960
+#: ../src/gui/CReporterAssistant.py:988
msgid "Package"
msgstr "संकà¥à¤²"
-#: ../src/gui/CReporterAssistant.py:961
+#: ../src/gui/CReporterAssistant.py:989
msgid "Executable"
msgstr "निषà¥à¤ªà¤¾à¤¦à¤¨à¥€à¤¯"
-#: ../src/gui/CReporterAssistant.py:962
+#: ../src/gui/CReporterAssistant.py:990
msgid "Cmdline"
msgstr "Cmdline"
#. right table
-#: ../src/gui/CReporterAssistant.py:964
+#: ../src/gui/CReporterAssistant.py:992
msgid "Architecture"
msgstr "आरà¥à¤•à¤¿à¤Ÿà¥‡à¤•à¥à¤šà¤°"
-#: ../src/gui/CReporterAssistant.py:965
+#: ../src/gui/CReporterAssistant.py:993
msgid "Kernel"
msgstr "करà¥à¤¨à¥‡à¤²"
-#: ../src/gui/CReporterAssistant.py:966
+#: ../src/gui/CReporterAssistant.py:994
msgid "Release"
msgstr "रिलीज"
-#: ../src/gui/CReporterAssistant.py:967
+#: ../src/gui/CReporterAssistant.py:995
msgid "Reason"
msgstr "कारण"
-#: ../src/gui/CReporterAssistant.py:978 ../src/gui/report.glade.h:3
+#: ../src/gui/CReporterAssistant.py:1006 ../src/gui/report.glade.h:3
msgid "<b>Backtrace</b>"
msgstr "<b>बैकटà¥à¤°à¥‡à¤¸</b>"
-#: ../src/gui/CReporterAssistant.py:981
+#: ../src/gui/CReporterAssistant.py:1009
msgid "Click to view..."
msgstr "देखने के लिठकà¥à¤²à¤¿à¤• करें..."
-#: ../src/gui/CReporterAssistant.py:993
+#: ../src/gui/CReporterAssistant.py:1021
msgid "<b>Steps to reproduce:</b>"
msgstr "<b>फिर लाने के लिठचरण:</b>"
-#: ../src/gui/CReporterAssistant.py:1014
+#: ../src/gui/CReporterAssistant.py:1042
msgid "<b>Comments:</b>"
msgstr "<b>टिपà¥à¤ªà¤£à¥€:</b>"
-#: ../src/gui/CReporterAssistant.py:1017
+#: ../src/gui/CReporterAssistant.py:1045
msgid "No comment provided!"
msgstr "कोई टिपà¥à¤ªà¤£à¥€ नहीं दी गई!"
-#: ../src/gui/CReporterAssistant.py:1053
+#: ../src/gui/CReporterAssistant.py:1081
msgid "Finished sending the bug report"
msgstr "बग रिपोरà¥à¤Ÿ भेजना संपनà¥à¤¨ करें"
-#: ../src/gui/CReporterAssistant.py:1057
+#: ../src/gui/CReporterAssistant.py:1085
msgid "<b>Bug reports:</b>"
msgstr "<b>बग रिपोरà¥à¤Ÿ:</b>"
+#: ../src/gui/CReporterAssistant.py:1102
+msgid ""
+"Unable to get report!\n"
+"Is debuginfo missing?"
+msgstr ""
+"रिपोरà¥à¤Ÿ पाने में असमरà¥à¤¥!\n"
+"डिबगइंफो अनà¥à¤ªà¤¸à¥à¤¥à¤¿à¤¤ है?"
+
+#: ../src/gui/CReporterAssistant.py:1139
+#, python-format
+msgid "Error acquiring the report: %s"
+msgstr "रिपोरà¥à¤Ÿ पाने में तà¥à¤°à¥à¤Ÿà¤¿: %s"
+
#: ../src/gui/dialogs.glade.h:1
msgid "Log"
msgstr "लॉग"
@@ -1005,7 +989,6 @@ msgid "Name"
msgstr "नाम"
#: ../src/gui/PluginsSettingsDialog.py:118
-#, fuzzy
msgid "Please select a plugin from the list to edit its options."
msgstr "इसके विकलà¥à¤ª को संपादित करने के लिठकृपया à¤à¤• पà¥à¤²à¤—िन चà¥à¤¨à¥‡à¤‚"
@@ -1226,266 +1209,309 @@ msgstr ""
"करें तदनà¥à¤°à¥‚प विनà¥à¤¯à¤¾à¤¸ को खोलने के लिठऔर आगे बढ़ने के पहले इसे फिकà¥à¤¸ करें, अनà¥à¤¯à¤¥à¤¾ रिपोरà¥à¤Ÿà¤¿à¤‚ग "
"पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ विफल हो सकती है.\n"
-#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.cpp:47
+#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.c:45
#, c-format
msgid "Uploaded: %llu of %llu kbytes"
-msgstr ""
+msgstr "अदà¥à¤¯à¤¤à¤¨à¥€à¤•à¥ƒ: %llu, %llu किलोबाइटà¥à¤¸ का"
-#: ../src/lib/parse_options.c:11
+#: ../src/lib/parse_options.c:29
#, c-format
msgid "Usage: %s\n"
-msgstr ""
+msgstr "पà¥à¤°à¤¯à¥‹à¤—: %s\n"
-#: ../src/plugins/abrt-action-analyze-c.c:154
+#: ../src/plugins/abrt-action-analyze-c.c:156
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID of coredumps"
msgstr ""
+" [-v] -d DIR\n"
+"\n"
+"कोरडंप के UUID की गणना करें और सहेजें"
-#: ../src/plugins/abrt-action-analyze-oops.c:131
+#: ../src/plugins/abrt-action-analyze-oops.c:133
msgid ""
" [-vs] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of oops crash dumps"
msgstr ""
+" [-vs] -d DIR\n"
+"\n"
+"वूपà¥à¤¸ कà¥à¤°à¥ˆà¤¶ डंप के UUID और DUPHASH की गणना करता और सहेजता हैवूपà¥à¤¸ कà¥à¤°à¥ˆà¤¶ डंप के UUID और DUPHASH की "
+"गणना करता और सहेवूपà¥à¤¸ कà¥à¤°à¥ˆà¤¶ डंप के UUID और DUPHASH की गणना करता "
-#: ../src/plugins/abrt-action-analyze-python.c:36
+#: ../src/plugins/abrt-action-analyze-python.c:38
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of python crash dumps"
msgstr ""
+" [-v] -d DIR\n"
+"\n"
+"पाइथन कà¥à¤°à¥ˆà¤¶ डंप के UUID और DUPHASH की गणना करता और सहेजता है"
-#: ../src/plugins/abrt-action-bugzilla.cpp:532
+#: ../src/plugins/abrt-action-bugzilla.cpp:534
#, c-format
msgid "New bug id: %i"
msgstr "नया बग id: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:645
+#: ../src/plugins/abrt-action-bugzilla.cpp:662
#, c-format
-msgid "Can't open '%s'"
-msgstr ""
-
-#: ../src/plugins/abrt-action-bugzilla.cpp:665
-#, fuzzy, c-format
msgid "Empty login or password, please check %s"
-msgstr ""
-"रिकà¥à¤¤ लॉगिन और कूटशबà¥à¤¦. \n"
-"कृपया जाà¤à¤šà¥‡à¤‚"
+msgstr "रिकà¥à¤¤ लॉगिन और कूटशबà¥à¤¦ कृपया जाà¤à¤šà¥‡à¤‚ %s. "
-#: ../src/plugins/abrt-action-bugzilla.cpp:683
+#: ../src/plugins/abrt-action-bugzilla.cpp:680
msgid "Logging into bugzilla..."
msgstr "बगजिला में लॉगिंग करें..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:686
+#: ../src/plugins/abrt-action-bugzilla.cpp:683
msgid "Checking for duplicates..."
msgstr "अनà¥à¤•à¥ƒà¤¤à¤¿ के लिठजाà¤à¤š रहा है..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:707
-#: ../src/plugins/abrt-action-bugzilla.cpp:743
+#: ../src/plugins/abrt-action-bugzilla.cpp:705
+#: ../src/plugins/abrt-action-bugzilla.cpp:741
msgid "Missing mandatory member 'bugs'"
msgstr "अनिवारà¥à¤¯ सदसà¥à¤¯ 'bugs' अनà¥à¤ªà¤¸à¥à¤¥à¤¿à¤¤"
-#: ../src/plugins/abrt-action-bugzilla.cpp:726
-#: ../src/plugins/abrt-action-bugzilla.cpp:759
-#: ../src/plugins/abrt-action-bugzilla.cpp:834
+#: ../src/plugins/abrt-action-bugzilla.cpp:724
+#: ../src/plugins/abrt-action-bugzilla.cpp:757
+#: ../src/plugins/abrt-action-bugzilla.cpp:833
msgid "get_bug_info() failed. Could not collect all mandatory information"
msgstr "get_bug_info() विफल. सभी अनिवारà¥à¤¯ सूचना को जमा नहीं करता है"
-#: ../src/plugins/abrt-action-bugzilla.cpp:775
+#: ../src/plugins/abrt-action-bugzilla.cpp:772
msgid "Creating a new bug..."
msgstr "नया बग बना रहा है..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:780
+#: ../src/plugins/abrt-action-bugzilla.cpp:777
msgid "Bugzilla entry creation failed"
msgstr "बगजिला पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ निरà¥à¤®à¤¾à¤£ विफल"
-#: ../src/plugins/abrt-action-bugzilla.cpp:790
-#: ../src/plugins/abrt-action-bugzilla.cpp:887
+#: ../src/plugins/abrt-action-bugzilla.cpp:789
+#: ../src/plugins/abrt-action-bugzilla.cpp:886
msgid "Logging out..."
msgstr "लॉगिंग आउट..."
#. decision based on state
-#: ../src/plugins/abrt-action-bugzilla.cpp:808
+#: ../src/plugins/abrt-action-bugzilla.cpp:807
#, c-format
msgid "Bug is already reported: %i"
msgstr "बग पहले से रिपोरà¥à¤Ÿ किया हà¥à¤† है: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:819
+#: ../src/plugins/abrt-action-bugzilla.cpp:818
#, c-format
msgid "Bugzilla couldn't find parent of bug %d"
msgstr "बगजिला bug %d का जनक नहीं ढूà¤à¤¢ सका"
-#: ../src/plugins/abrt-action-bugzilla.cpp:848
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-bugzilla.cpp:847
+#, c-format
msgid "Add %s to CC list"
msgstr "सीसी सूची में %s जोड़ें"
-#: ../src/plugins/abrt-action-bugzilla.cpp:872
+#: ../src/plugins/abrt-action-bugzilla.cpp:871
#, c-format
msgid "Adding new comment to bug %d"
msgstr "नई टिपà¥à¤ªà¤£à¥€ को bug(%d) में जोड़ें"
-#: ../src/plugins/abrt-action-generate-backtrace.c:319
+#: ../src/plugins/abrt-action-bugzilla.cpp:913
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to Bugzilla"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"बगजिला में कà¥à¤°à¥ˆà¤¶ रिपोरà¥à¤Ÿ करें "
+" बगजिला नमें"
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:928
+#: ../src/plugins/abrt-action-kerneloops.c:148
+#: ../src/plugins/abrt-action-rhtsupport.c:281
+msgid "Configuration file (may be given many times)"
+msgstr "विनà¥à¤¯à¤¾à¤¸ फाइल (कई बार दिया जा सकता है)"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:258
+msgid " [options] -d DIR"
+msgstr " [options] -d DIR"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:271
+msgid "Additional debuginfo directories"
+msgstr "अतिरिकà¥à¤¤ डिबगइंफो निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾à¤…तिरिकà¥à¤¤ डिबगइंफो निरà¥à¤¦à¥‡à¤…तिरिकà¥à¤¤ डिबग"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:272
+msgid "Kill gdb if it runs for more than N seconds"
+msgstr "gdb को खतà¥à¤® करें यदि यह N सेकेंड से अधिक चलता है"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:320
#, c-format
msgid "Backtrace parsing failed for %s"
-msgstr ""
+msgstr "%s के लिठबैकटà¥à¤°à¥ˆà¤¸ विशà¥à¤²à¥‡à¤·à¤£ विफल"
#: ../src/plugins/abrt-action-install-debuginfo.py:72
#, python-format
msgid "Extracting cpio from %s"
-msgstr ""
+msgstr "cpio को %s से निषà¥à¤•à¤°à¥à¤·à¤¿à¤¤ कर रहा है"
#: ../src/plugins/abrt-action-install-debuginfo.py:77
msgid "Can't write to:"
-msgstr ""
+msgstr "इसमें नहीं लिख सका:"
#: ../src/plugins/abrt-action-install-debuginfo.py:87
msgid "Removing the temporary rpm file"
-msgstr ""
+msgstr "असà¥à¤¥à¤¾à¤¯à¥€ आरपीà¤à¤® फाइल हटा रहा हैअसà¥à¤¥à¤¾à¤¯à¥€ आरपीà¤à¤® फाइल हटचाअसà¥à¤¥à¤¾à¤¯à¥€ आ"
#: ../src/plugins/abrt-action-install-debuginfo.py:91
#, python-format
msgid "Can't extract package: %s"
-msgstr ""
+msgstr "संकà¥à¤² नहीं निकाल सका: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:99
#, python-format
msgid "Caching files from %s made from %s"
-msgstr ""
+msgstr "%s से फाइल %s से बनी को कैश कर रहा है"
#: ../src/plugins/abrt-action-install-debuginfo.py:107
msgid "Removing the temporary cpio file"
-msgstr ""
+msgstr "असà¥à¤¥à¤¾à¤¯à¥€ cpio फ़ाइल हटा रहा हैअसà¥à¤¥à¤¾à¤¯à¥€ cpio फड"
#: ../src/plugins/abrt-action-install-debuginfo.py:110
#, python-format
msgid "Can't extract files from: %s"
-msgstr ""
+msgstr "इससे फ़ाइल निकाल नही सकता है: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:134
#: ../src/plugins/abrt-action-install-debuginfo.py:140
#, python-format
msgid "Downloading (%i of %i) %.30s : %.3s %%"
-msgstr ""
+msgstr "(%i of %i) %.30s डाउनलोड कर रहा है: %.3s %%"
#: ../src/plugins/abrt-action-install-debuginfo.py:169
-#, fuzzy
msgid "Searching the missing debuginfo packages"
-msgstr "डिबगइंफो संसà¥à¤¥à¤¾à¤ªà¤¨ आरंभ कर रहा है"
+msgstr "गम डिबगइंफो संकà¥à¤² खोज रहा है"
#: ../src/plugins/abrt-action-install-debuginfo.py:224
#, python-format
msgid "To download: (%.2f) M / Installed size: %.2f M"
-msgstr ""
+msgstr "डाउनलोड करने के लिà¤: (%.2f) M / संसà¥à¤¥à¤¾à¤ªà¤¿à¤¤ आकार: %.2f M"
#: ../src/plugins/abrt-action-install-debuginfo.py:240
msgid "Is this ok? [y/N] "
-msgstr ""
+msgstr "कà¥à¤¯à¤¾ यह ठीक है? [y/N] "
#: ../src/plugins/abrt-action-install-debuginfo.py:257
#, python-format
msgid "Downloading package %s failed"
-msgstr ""
+msgstr "संकà¥à¤² %s का डाउनलोडिंग विफल रहा "
#. recursively delete the temp dir on failure
#: ../src/plugins/abrt-action-install-debuginfo.py:268
msgid "Unpacking failed, aborting download..."
-msgstr ""
+msgstr "संकà¥à¤² खोलना विफल, डाउनलोड छोड़ रहा है..."
#: ../src/plugins/abrt-action-install-debuginfo.py:275
#, python-format
msgid "All downloaded packages have been extracted, removing %s"
-msgstr ""
+msgstr "सभी डाउनलोड किठसंकà¥à¤² को निकाला गया है, %s को हटा रहा है"
#: ../src/plugins/abrt-action-install-debuginfo.py:280
#, python-format
msgid "Can't remove %s, probably contains an error log"
-msgstr ""
+msgstr "%s को हटा नहीं सकता है, शायद कोई तà¥à¤°à¥à¤Ÿà¤¿ लॉग समाहित करता है"
#: ../src/plugins/abrt-action-install-debuginfo.py:305
#, python-format
msgid "Analyzing corefile: %(corefile_path)s"
-msgstr ""
+msgstr "कोरफ़ाइल का विशà¥à¤²à¥‡à¤·à¤£ कर रहा है: %(corefile_path)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:384
#, python-format
msgid "Can't remove %(tmpdir_path)s: %(reason)s"
-msgstr ""
+msgstr "%(tmpdir_path)s हटा नहीं सकता है: %(reason)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:394
msgid "Exiting on user Command"
-msgstr ""
+msgstr "उपयोकà¥à¤¤à¤¾ कमांड पर बाहर निकल रहा हैे"
#: ../src/plugins/abrt-action-install-debuginfo.py:413
#, python-format
msgid "Usage: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
-msgstr ""
+msgstr "पà¥à¤°à¤¯à¥‹à¤—: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
#: ../src/plugins/abrt-action-install-debuginfo.py:442
-#, fuzzy
msgid "You have to specify the path to coredump."
-msgstr "आपको कॉपी करने के लिठकोई कà¥à¤°à¥ˆà¤¶ चà¥à¤¨à¤¨à¤¾ है."
+msgstr "आपको कोरडंप में पथ निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ करना है"
#: ../src/plugins/abrt-action-install-debuginfo.py:446
-#, fuzzy
msgid "You have to specify the path to cachedir."
-msgstr "आपको कॉपी करने के लिठकोई कà¥à¤°à¥ˆà¤¶ चà¥à¤¨à¤¨à¤¾ है."
+msgstr "आपको कैशनिरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ में पथ निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ करना है"
#: ../src/plugins/abrt-action-install-debuginfo.py:450
-#, fuzzy
msgid "You have to specify the path to tmpdir."
-msgstr "आपको कॉपी करने के लिठकोई कà¥à¤°à¥ˆà¤¶ चà¥à¤¨à¤¨à¤¾ है."
+msgstr "आपको tmpdir में पथ निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ करना है"
#: ../src/plugins/abrt-action-install-debuginfo.py:463
msgid "All debuginfo seems to be available"
-msgstr ""
+msgstr "सभी डिबगइंफो उपलबà¥à¤§ पà¥à¤°à¤¤à¥€à¤¤ होता हैसभी डिबगइंफो उपलबà¥à¤§ पà¥à¤°à¤¤à¥€à¤¤ ोहत"
#: ../src/plugins/abrt-action-install-debuginfo.py:470
-#, fuzzy
msgid "Complete!"
-msgstr "घटक"
+msgstr "संपनà¥à¤¨!"
-#: ../src/plugins/abrt-action-kerneloops.cpp:111
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-kerneloops.c:105
+#, c-format
msgid "Submitting oops report to %s"
-msgstr "'%s' में रिपोरà¥à¤Ÿ लिख रहा है"
+msgstr "%s में कà¥à¤°à¥ˆà¤¶ रिपोरà¥à¤Ÿ लिख रहा है"
-#: ../src/plugins/abrt-action-mailx.cpp:114
+#: ../src/plugins/abrt-action-kerneloops.c:133
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a kernel oops to kerneloops.org (or similar) site"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"करà¥à¤¨à¥‡à¤² वूपà¥à¤¸ को kerneloops.org (या समान) साइट पर रिपोरà¥à¤Ÿ करेंकरà¥à¤¨à¥‡à¤² वूपà¥à¤¸ को kerneloops.org (या समान) "
+","
+
+#: ../src/plugins/abrt-action-mailx.c:110
msgid "Sending an email..."
msgstr "कोई ईमेल भेज रहा है..."
-#: ../src/plugins/abrt-action-mailx.cpp:138
+#: ../src/plugins/abrt-action-mailx.c:137
msgid ""
" [-v] -d DIR [-c CONFFILE]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d DIR [-c CONFFILE]\n"
+"\n"
+"कà¥à¤°à¥ˆà¤¶ डंप के संकà¥à¤šà¤¿à¤¤ टारबॉल को अपलोड करें"
-#: ../src/plugins/abrt-action-mailx.cpp:151
-#: ../src/plugins/abrt-action-upload.cpp:267
-#, fuzzy
+#: ../src/plugins/abrt-action-mailx.c:150
+#: ../src/plugins/abrt-action-upload.c:261
msgid "Config file"
-msgstr "लॉगर फाइल:"
+msgstr "कॉनà¥à¤«à¤¿à¤— फाइल"
-#: ../src/plugins/abrt-action-print.cpp:39
+#: ../src/plugins/abrt-action-print.c:38
msgid ""
" [-v] [-o FILE] -d DIR\n"
"\n"
"Print information about the crash to standard output"
msgstr ""
+" [-v] [-o FILE] -d DIR\n"
+"\n"
+"मानक आउटपà¥à¤Ÿ में कà¥à¤°à¥ˆà¤¶ के बारे में सूचना छापें"
-#: ../src/plugins/abrt-action-print.cpp:51
+#: ../src/plugins/abrt-action-print.c:51
msgid "Output file"
-msgstr ""
+msgstr "आउटपà¥à¤Ÿ फाइल"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was appended to %s"
msgstr "रिपोरà¥à¤Ÿ को %s में जोड़ा गया था"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was stored to %s"
msgstr "रिपोरà¥à¤Ÿ %s में जमा किया गया था"
@@ -1493,48 +1519,87 @@ msgstr "रिपोरà¥à¤Ÿ %s में जमा किया गया थà
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
#. error msg is already logged by dd_opendir
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
-#: ../src/plugins/abrt-action-rhtsupport.cpp:43
-#: ../src/plugins/abrt-action-upload.cpp:121
+#: ../src/plugins/abrt-action-rhtsupport.c:41
+#: ../src/plugins/abrt-action-upload.c:119
msgid "Compressing data"
-msgstr ""
+msgstr "संकà¥à¤šà¤¿à¤¤ आà¤à¤•à¤¡à¤¼à¤¾"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:78
-#, fuzzy
+#: ../src/plugins/abrt-action-rhtsupport.c:73
msgid "Empty login or password, please check RHTSupport.conf"
msgstr ""
-"रिकà¥à¤¤ लॉगिन और कूटशबà¥à¤¦. \n"
-"कृपया जाà¤à¤šà¥‡à¤‚"
+"रिकà¥à¤¤ लॉगिन और कूटशबà¥à¤¦ कृपया RHTSupport.conf जाà¤à¤šà¥‡à¤‚रिकà¥à¤¤ लॉगिन और कूटशबà¥à¤¦ कृपया RHTSupport.conf जाà¤à¤šà¤Ÿà¥‡"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:194
+#: ../src/plugins/abrt-action-rhtsupport.c:191
msgid "Creating a new case..."
msgstr "नया केस बना रहा है..."
-#: ../src/plugins/abrt-action-upload.cpp:65
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-rhtsupport.c:266
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to RHTSupport"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"RHTSupport में कोई कà¥à¤°à¥ˆà¤¶ रिपोरà¥à¤Ÿ करें"
+
+#: ../src/plugins/abrt-action-upload.c:63
+#, c-format
msgid "Sending %s to %s"
-msgstr "अभिलेख %s को %s में भेज रहा है"
+msgstr "%s को %s में भेज रहा है"
#. This ends up a "reporting status message" in abrtd
-#: ../src/plugins/abrt-action-upload.cpp:98
+#: ../src/plugins/abrt-action-upload.c:96
#, c-format
msgid "Successfully sent %s to %s"
-msgstr ""
+msgstr "सफलतापूरà¥à¤µà¤• %s को %s में भेजा"
-#: ../src/plugins/abrt-action-upload.cpp:219
+#: ../src/plugins/abrt-action-upload.c:212
#, c-format
msgid "Archive is created: '%s'"
-msgstr ""
+msgstr "अभिलेख बनाया गया: '%s'"
-#: ../src/plugins/abrt-action-upload.cpp:253
+#: ../src/plugins/abrt-action-upload.c:247
msgid ""
" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
+"\n"
+"कà¥à¤°à¥ˆà¤¶ डंप के संकà¥à¤šà¤¿à¤¤ टारबॉल को अपलोड करें"
-#: ../src/plugins/abrt-action-upload.cpp:268
+#: ../src/plugins/abrt-action-upload.c:262
msgid "Base URL to upload to"
+msgstr "बेस URL जिसमें अपलोड किया जाना है"
+
+#: ../src/plugins/abrt-dump-oops.c:540
+msgid ""
+" [-vsrdow] FILE\n"
+"\n"
+"Extract oops from syslog/dmesg file"
msgstr ""
+" [-vsrdow] FILE\n"
+"\n"
+"syslog/dmesg फाइल से वूपà¥à¤¸ निकालेंsyslog/dmesg फाइल से वूपà¥à¤¸ नि"
+
+#: ../src/plugins/abrt-dump-oops.c:556
+msgid "Parse kernel's message buffer before parsing FILE"
+msgstr ""
+"FILE के विशà¥à¤²à¥‡à¤·à¤£ के पहले करà¥à¤¨à¥‡à¤² के संदेश का विशà¥à¤²à¥‡à¤·à¤£ करेंFILE के विशà¥à¤²à¥‡à¤·à¤£ के पहले करà¥à¤¨à¥‡à¤² के संदेश का "
+"विशेFILE के विशà¥"
+
+#: ../src/plugins/abrt-dump-oops.c:557
+msgid "Create ABRT dump for every oops found"
+msgstr "ABRT डंप को पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• मिले वूपà¥à¤¸ के लिठबनाà¤à¤"
+
+#: ../src/plugins/abrt-dump-oops.c:558
+msgid "Print found oopses on standard output"
+msgstr "मानक आउटपà¥à¤Ÿ पर मिले वूपà¥à¤¸ छापें"
+
+#: ../src/plugins/abrt-dump-oops.c:559
+msgid "Do not exit, watch the file for new oopses"
+msgstr "बाहर मत निकलें, नठवूपà¥à¤¸ के लिठफ़ाइल देखेंबाहर मत निकलें, नठवूपà¥à¤¸ के लिठफ़ा"
#: ../src/plugins/Bugzilla.glade.h:1
msgid "<b>Bugzilla plugin configuration</b>"
@@ -1572,10 +1637,6 @@ msgstr ""
"आप इसे <a href=\"https://bugzilla.redhat.com/createaccount.cgi\">यहाà¤</a> बना "
"सकते हैं"
-#: ../src/plugins/CCpp.cpp:277
-msgid "Analyzes crashes in C/C++ programs"
-msgstr "C/C++ पà¥à¤°à¥‹à¤—à¥à¤°à¤¾à¤® में कà¥à¤°à¥ˆà¤¶ का विशà¥à¤²à¥‡à¤·à¤£ करें"
-
#: ../src/plugins/KerneloopsReporter.glade.h:1
msgid "<b>Kerneloops Reporter plugin configuration</b>"
msgstr "<b>करà¥à¤¨à¥‡à¤²à¤µà¥‚पà¥à¤¸ रिपोरà¥à¤Ÿà¤° पà¥à¤²à¤—िन विनà¥à¤¯à¤¾à¤¸</b>"
@@ -1584,10 +1645,6 @@ msgstr "<b>करà¥à¤¨à¥‡à¤²à¤µà¥‚पà¥à¤¸ रिपोरà¥à¤Ÿà¤° पà¥à¤²à
msgid "Submit URL:"
msgstr "URL सौंपें:"
-#: ../src/plugins/KerneloopsScanner.cpp:227
-msgid "Periodically scans for and saves kernel oopses"
-msgstr "आवधिक रूप से खराबी सूचना सà¥à¤•à¥ˆà¤¨ और सहेजता है"
-
#: ../src/plugins/Logger.glade.h:1
msgid "<b>Logger plugin configuration</b>"
msgstr "<b>लॉगर पà¥à¤²à¤—िन विनà¥à¤¯à¤¾à¤¸</b>"
@@ -1633,9 +1690,8 @@ msgid "RHTSupport URL:"
msgstr "RHTSupport URL:"
#: ../src/plugins/Upload.glade.h:1
-#, fuzzy
msgid "<b>Upload plugin configuration</b>"
-msgstr "<b>टिकट अपलोडर पà¥à¤²à¤—िन विनà¥à¤¯à¤¾à¤¸</b>"
+msgstr "<b>पà¥à¤²à¤—िन विनà¥à¤¯à¤¾à¤¸ अपलोड करें</b>"
#: ../src/plugins/Upload.glade.h:2
msgid "Retry count:"
@@ -1653,6 +1709,78 @@ msgstr "URL:"
msgid "Use encryption"
msgstr "गोपन का उपयोग करें"
+#, fuzzy
+#~ msgid ""
+#~ "Usage: %s [OPTION]\n"
+#~ "\n"
+#~ "Startup:\n"
+#~ "\t-V, --version\t\tdisplay the version of %s and exit\n"
+#~ "\t-?, --help\t\tprint this help\n"
+#~ "\n"
+#~ "Actions:\n"
+#~ "\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
+#~ "\t -f, --full\tprint a list of all crashes, including the already "
+#~ "reported ones\n"
+#~ "\t-r, --report CRASH_ID\tcreate and send a report\n"
+#~ "\t -y, --always\tcreate and send a report without asking\n"
+#~ "\t-d, --delete CRASH_ID\tremove a crash\n"
+#~ "\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
+#~ "\t -b, --backtrace\tprint detailed information about a crash "
+#~ "including backtrace\n"
+#~ "CRASH_ID can be:\n"
+#~ "\ta name of dump directory, or\n"
+#~ "\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+#~ msgstr ""
+#~ "Usage: %s [OPTION]\n"
+#~ "\n"
+#~ "Startup:\n"
+#~ "\t-V, --version\t\tdisplay the version of %s and exit\n"
+#~ "\t-?, --help\t\tprint this help\n"
+#~ "\n"
+#~ "Actions:\n"
+#~ "\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
+#~ "\t -f, --full\tprint a list of all crashes, including the already "
+#~ "reported ones\n"
+#~ "\t-r, --report CRASH_ID\tcreate and send a report\n"
+#~ "\t -y, --always\tcreate and send a report without asking\n"
+#~ "\t-d, --delete CRASH_ID\tremove a crash\n"
+#~ "\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
+#~ "\t -b, --backtrace\tprint detailed information about a crash "
+#~ "including backtrace\n"
+#~ "CRASH_ID can be:\n"
+#~ "\tUID:UUID pair,\n"
+#~ "\tunique UUID prefix - the crash with matching UUID will be acted upon\n"
+#~ "\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+
+#, fuzzy
+#~ msgid "Error loading reporter settings"
+#~ msgstr "रिपोरà¥à¤Ÿ पाने में तà¥à¤°à¥à¤Ÿà¤¿: %s"
+
+#~ msgid "You must check the backtrace for sensitive data."
+#~ msgstr "आप संवेदनशील आà¤à¤•à¤¡à¤¼à¤¾ के लिठबैकटà¥à¤°à¥‡à¤¸ जरूर जाà¤à¤šà¥‡à¤‚."
+
+#~ msgid "The backtrace is unusable, you cannot report this!"
+#~ msgstr "bactrace अपà¥à¤°à¤¯à¥‹à¤œà¥à¤¯ है, आप इसे रिपोरà¥à¤Ÿ नहीं कर सकते हैं!"
+
+#~ msgid "Reporting disabled, please fix the problems shown above."
+#~ msgstr "रिपोरà¥à¤Ÿà¤¿à¤‚ग निषà¥à¤•à¥à¤°à¤¿à¤¯, ऊपर दिखाठसमसà¥à¤¯à¤¾ को ठीक करें."
+
+#~ msgid "Sends the report using the selected plugin."
+#~ msgstr "चà¥à¤¨à¥‡ पà¥à¤²à¤—िन के उपयोग से रिपोरà¥à¤Ÿ भेजता है."
+
+#~ msgid ""
+#~ "No reporter plugin available for this type of crash.\n"
+#~ "Please check abrt.conf."
+#~ msgstr ""
+#~ "इस पà¥à¤°à¤•à¤¾à¤° के कà¥à¤°à¥ˆà¤¶ के लिठकोई रिपोरà¥à¤Ÿà¤° पà¥à¤²à¤—िन उपलबà¥à¤§ नहीं.\n"
+#~ "कृपया abrt.conf जाà¤à¤šà¥‡à¤‚."
+
+#~ msgid "Analyzes crashes in C/C++ programs"
+#~ msgstr "C/C++ पà¥à¤°à¥‹à¤—à¥à¤°à¤¾à¤® में कà¥à¤°à¥ˆà¤¶ का विशà¥à¤²à¥‡à¤·à¤£ करें"
+
+#~ msgid "Periodically scans for and saves kernel oopses"
+#~ msgstr "आवधिक रूप से खराबी सूचना सà¥à¤•à¥ˆà¤¨ और सहेजता है"
+
#~ msgid "Database plugin not specified. Please check abrtd settings."
#~ msgstr "डेटाबेस पà¥à¤²à¤—िन निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ नहीं. कृपया abrtd सेटिंग जाà¤à¤šà¥‡à¤‚."
diff --git a/po/ja.po b/po/ja.po
index 47abb8c6..97e60dc1 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -1,26 +1,27 @@
-# translation of ja.po to Japanese
+# translation of abrt_ja.po to Japanese
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
-# Kiyoto Hashida <khashida@redhat.com>, 2009, 2010.
+# Kiyoto Hashida <khashida@redhat.com>, 2009, 2010, 2011.
# Hyu_gabaru Ryu_ichi <hyu_gabaru@yahoo.co.jp>, 2009.
# Noriko Mizumoto <noriko@fedoraproject.org>, 2010.
# Makoto Mizukami <makoto@fedoraporject.org>, 2010, 2010.
-# Hajime Taira <htaira@redhat.com>, 2010
+# Hajime Taira <htaira@redhat.com>, 2010.
msgid ""
msgstr ""
-"Project-Id-Version: ja\n"
+"Project-Id-Version: abrt_ja\n"
"Report-Msgid-Bugs-To: jmoskovc@redhat.com\n"
-"POT-Creation-Date: 2010-11-29 13:51+0100\n"
-"PO-Revision-Date: 2010-09-14 18:37+0900\n"
-"Last-Translator: Hajime Taira <htaira@redhat.com>\n"
+"POT-Creation-Date: 2011-01-24 21:06+0000\n"
+"PO-Revision-Date: 2011-02-01 18:23+0900\n"
+"Last-Translator: Kiyoto Hashida <khashida@redhat.com>\n"
"Language-Team: Japanese <jp@li.org>\n"
-"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Language: ja\n"
"X-Generator: KBabel 1.11.4\n"
-"Plural-Forms: Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"Plural-Forms: Plural-Forms: nplurals=2; plural=(n!=1);\n\n"
+"\n"
#: ../src/applet/abrt-applet.desktop.in.h:1
msgid "ABRT notification applet"
@@ -32,16 +33,16 @@ msgstr "ABRT 通知アプレット"
msgid "Automatic Bug Reporting Tool"
msgstr "自動ãƒã‚°å ±å‘Šãƒ„ール(ABRT)"
-#: ../src/applet/Applet.cpp:86
+#: ../src/applet/applet.c:86
#, c-format
msgid "A crash in the %s package has been detected"
msgstr "パッケージ %s ã®ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸ"
-#: ../src/applet/Applet.cpp:88
+#: ../src/applet/applet.c:88
msgid "A crash has been detected"
msgstr "クラッシュãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸ"
-#: ../src/applet/Applet.cpp:285
+#: ../src/applet/applet.c:285
msgid "ABRT service is not running"
msgstr "ABRT サービスãŒç¨¼åƒã—ã¦ã„ã¾ã›ã‚“。"
@@ -51,10 +52,8 @@ msgid "Warning"
msgstr "警告"
#: ../src/applet/applet_gtk.c:230
-msgid ""
-"Notification area applet that notifies users about issues detected by ABRT"
-msgstr ""
-"ABRT ã«ã‚ˆã£ã¦æ¤œå‡ºã•ã‚ŒãŸå•é¡Œã‚’ユーザーã«é€šçŸ¥ã™ã‚‹ãŸã‚ã®é€šçŸ¥ã‚¨ãƒªã‚¢ã‚¢ãƒ—レット"
+msgid "Notification area applet that notifies users about issues detected by ABRT"
+msgstr "ABRT ã«ã‚ˆã£ã¦æ¤œå‡ºã•ã‚ŒãŸå•é¡Œã‚’ユーザーã«é€šçŸ¥ã™ã‚‹ãŸã‚ã®é€šçŸ¥ã‚¨ãƒªã‚¢ã‚¢ãƒ—レット"
#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:23
msgid "translator-credits"
@@ -72,8 +71,8 @@ msgstr "報告"
msgid "Open ABRT"
msgstr "ABRT ã‚’é–‹ã"
-#: ../src/cli/CLI.cpp:47
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:46
+#, c-format
msgid ""
"\tCrash dump : %s\n"
"\tUID : %s\n"
@@ -82,8 +81,8 @@ msgid ""
"\tCrash Time : %s\n"
"\tCrash Count: %s\n"
msgstr ""
+"\tクラッシュダンプ : %s\n"
"\tUID : %s\n"
-"\tUUID : %s\n"
"\tパッケージ : %s\n"
"\t実行ファイル : %s\n"
"\tクラッシュã®æ™‚刻 : %s\n"
@@ -95,7 +94,7 @@ msgid "\tHostname : %s\n"
msgstr "\tホストå : %s\n"
#: ../src/cli/CLI.cpp:98
-#, fuzzy, c-format
+#, c-format
msgid ""
"Dump directory: %s\n"
"Last crash: %s\n"
@@ -107,7 +106,7 @@ msgid ""
"System: %s, kernel %s\n"
"Reason: %s\n"
msgstr ""
-"クラッシュ ID: %s:%s\n"
+"ダンプディレクトリ: %s\n"
"最後ã®ã‚¯ãƒ©ãƒƒã‚·ãƒ¥: %s\n"
"解æžè€…: %s\n"
"コンãƒãƒ¼ãƒãƒ³ãƒˆ: %s\n"
@@ -117,27 +116,27 @@ msgstr ""
"システム: %s, カーãƒãƒ« %s\n"
"ç†ç”±: %s\n"
-#: ../src/cli/CLI.cpp:125
+#: ../src/cli/CLI.cpp:126
#, c-format
msgid "Coredump file: %s\n"
msgstr "コアダンプファイル: %s\n"
-#: ../src/cli/CLI.cpp:129
+#: ../src/cli/CLI.cpp:130
#, c-format
msgid "Rating: %s\n"
msgstr "評価: %s\n"
-#: ../src/cli/CLI.cpp:134
+#: ../src/cli/CLI.cpp:135
#, c-format
msgid "Crash function: %s\n"
msgstr "クラッシュ関数: %s\n"
-#: ../src/cli/CLI.cpp:138
+#: ../src/cli/CLI.cpp:139
#, c-format
msgid "Hostname: %s\n"
msgstr "ホストå: %s\n"
-#: ../src/cli/CLI.cpp:142
+#: ../src/cli/CLI.cpp:143
#, c-format
msgid ""
"\n"
@@ -148,7 +147,7 @@ msgstr ""
"å†ç¾æ–¹æ³•:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:146
+#: ../src/cli/CLI.cpp:147
#, c-format
msgid ""
"\n"
@@ -159,7 +158,7 @@ msgstr ""
"コメント:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:152
+#: ../src/cli/CLI.cpp:153
#, c-format
msgid ""
"\n"
@@ -171,13 +170,14 @@ msgstr ""
"%s\n"
#. Message has embedded tabs.
-#: ../src/cli/CLI.cpp:243
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:248
+#, c-format
msgid ""
"Usage: %s [OPTION]\n"
"\n"
"Startup:\n"
"\t-V, --version\t\tdisplay the version of %s and exit\n"
+"\t-v, --verbose\t\tincrease verbosity\n"
"\t-?, --help\t\tprint this help\n"
"\n"
"Actions:\n"
@@ -198,9 +198,10 @@ msgstr ""
"\n"
"èµ·å‹•:\n"
"\t-V, --version\t\t%s ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’表示ã—ã¦çµ‚了\n"
+"\t-v, --verbose\t\t冗長性を増加\n"
"\t-?, --help\t\tã“ã®ãƒ˜ãƒ«ãƒ—を表示\n"
"\n"
-"Actions:\n"
+"アクション:\n"
"\t-l, --list\t\t未報告ã®ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã‚’ã™ã¹ã¦è¡¨ç¤º\n"
"\t -f, --full\t報告済ã¿ã®ã‚‚ã®ã‚‚å«ã‚ã™ã¹ã¦ã®ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã‚’表示\n"
"\t-r, --report CRASH_ID\tレãƒãƒ¼ãƒˆã‚’作æˆã—ã¦é€ä¿¡\n"
@@ -209,28 +210,27 @@ msgstr ""
"\t-i, --info CRASH_ID\tクラッシュã«ã¤ã„ã¦ã®è©³ç´°æƒ…報を表示\n"
"\t -b, --backtrace\tãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹ã‚’å«ã‚ãŸã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã®è©³ç´°æƒ…報を表示\n"
"CRASH_ID ã¯:\n"
-"\tUID:UUID ã®çµ„ã¿åˆã‚ã›,\n"
-"\t一æ„㪠UUID 接頭辞 - UUID ãŒä¸€è‡´ã™ã‚‹ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã«ã¤ã„ã¦ä½œæ¥­\n"
+"\tダンプディレクトリã®åå‰ã€åˆã¯\n"
"\t@N - (--list --full ã§è¡¨ç¤ºã•ã‚Œã‚‹é †ã§) N 番目ã®ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã«ã¤ã„ã¦ä½œæ¥­\n"
-#: ../src/cli/CLI.cpp:287
+#: ../src/cli/CLI.cpp:292
msgid "You must specify exactly one operation"
msgstr "æ“作を1ã¤ã ã‘指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
-#: ../src/cli/report.cpp:166
+#: ../src/cli/report.cpp:164
#, c-format
msgid "# This field is read only\n"
msgstr "# ã“ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã¯èª­ã¿è¾¼ã¿å°‚用ã§ã™\n"
-#: ../src/cli/report.cpp:186
+#: ../src/cli/report.cpp:184
msgid "# Describe the circumstances of this crash below"
msgstr "# ã“ã®ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã®çŠ¶æ³ã‚’以下ã§èª¬æ˜Žã—ã¦ä¸‹ã•ã„。"
-#: ../src/cli/report.cpp:188
+#: ../src/cli/report.cpp:186
msgid "# How to reproduce the crash?"
msgstr "# ã“ã®ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã‚’å†ç¾ã™ã‚‹æ–¹æ³•ã¯?"
-#: ../src/cli/report.cpp:190
+#: ../src/cli/report.cpp:188
msgid ""
"# Backtrace\n"
"# Check that it does not contain any sensitive data (passwords, etc.)"
@@ -238,47 +238,47 @@ msgstr ""
"# ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹\n"
"# パスワードãªã©ã®æ©Ÿå¯†æƒ…å ±ãŒå…¥ã£ã¦ã„ãªã„ã“ã¨ã‚’確èªã—ã¦ä¸‹ã•ã„。"
-#: ../src/cli/report.cpp:192
+#: ../src/cli/report.cpp:190
msgid "# Architecture"
msgstr "# アーキテクãƒãƒ£ãƒ¼"
-#: ../src/cli/report.cpp:193
+#: ../src/cli/report.cpp:191
msgid "# Command line"
msgstr "# コマンドライン"
-#: ../src/cli/report.cpp:194
+#: ../src/cli/report.cpp:192
msgid "# Component"
msgstr "# コンãƒãƒ¼ãƒãƒ³ãƒˆ"
-#: ../src/cli/report.cpp:195
+#: ../src/cli/report.cpp:193
msgid "# Core dump"
msgstr "# コアダンプ"
-#: ../src/cli/report.cpp:196
+#: ../src/cli/report.cpp:194
msgid "# Executable"
msgstr "# 実行å¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«"
-#: ../src/cli/report.cpp:197
+#: ../src/cli/report.cpp:195
msgid "# Kernel version"
msgstr "# カーãƒãƒ«ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
-#: ../src/cli/report.cpp:198
+#: ../src/cli/report.cpp:196
msgid "# Package"
msgstr "# パッケージ"
-#: ../src/cli/report.cpp:199
+#: ../src/cli/report.cpp:197
msgid "# Reason of crash"
msgstr "# クラッシュã®ç†ç”±"
-#: ../src/cli/report.cpp:200
+#: ../src/cli/report.cpp:198
msgid "# Release string of the operating system"
msgstr "# オペレーティングシステムã®ãƒªãƒªãƒ¼ã‚¹æ–‡å­—列"
-#: ../src/cli/report.cpp:323
+#: ../src/cli/report.cpp:321
msgid "Cannot run vi: $TERM, $VISUAL and $EDITOR are not set"
msgstr "vi を実行ã§ãã¾ã›ã‚“: $TERM, $VISUAL, åŠã³ $EDITOR ãŒå®šç¾©ã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: ../src/cli/report.cpp:411
+#: ../src/cli/report.cpp:405
msgid ""
"\n"
"The report has been updated"
@@ -286,7 +286,7 @@ msgstr ""
"\n"
"ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆã‚’æ›´æ–°ã—ã¾ã—ãŸ"
-#: ../src/cli/report.cpp:413
+#: ../src/cli/report.cpp:407
msgid ""
"\n"
"No changes were detected in the report"
@@ -295,46 +295,46 @@ msgstr ""
"報告ã®ä¸­ã«å¤‰æ›´ã¯æ¤œå‡ºã•ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚"
#. The response might take more than 1 char in non-latin scripts.
-#: ../src/cli/report.cpp:464
+#: ../src/cli/report.cpp:439
msgid "y"
msgstr "y"
-#: ../src/cli/report.cpp:465
+#: ../src/cli/report.cpp:440
msgid "N"
msgstr "N"
#. Read the missing information and push it to plugin settings.
-#: ../src/cli/report.cpp:565
+#: ../src/cli/report.cpp:567
#, c-format
msgid "Wrong settings were detected for plugin %s\n"
msgstr "プラグイン %s ã«ä¸é©åˆ‡ãªè¨­å®šãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸã€‚\n"
-#: ../src/cli/report.cpp:569
+#: ../src/cli/report.cpp:571
msgid "Enter your login: "
msgstr "ログインを入力:"
-#: ../src/cli/report.cpp:575
+#: ../src/cli/report.cpp:577
msgid "Enter your password: "
msgstr "パスワードを入力:"
-#: ../src/cli/report.cpp:638
+#: ../src/cli/report.cpp:643
msgid "Reporting..."
msgstr "報告中..."
-#: ../src/cli/report.cpp:657
+#: ../src/cli/report.cpp:662
#, c-format
msgid "Report using %s?"
msgstr "%s を使用ã—ã¦å ±å‘Šã—ã¾ã™ã‹?"
-#: ../src/cli/report.cpp:660
+#: ../src/cli/report.cpp:665
msgid "Skipping..."
msgstr "スキップ中..."
-#: ../src/cli/report.cpp:672
+#: ../src/cli/report.cpp:677
msgid "Reporting disabled because the backtrace is unusable"
msgstr "ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹ãŒåˆ©ç”¨ã§ããªã„ãŸã‚ã€ãƒ¬ãƒãƒ¼ãƒˆæ©Ÿèƒ½ãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚"
-#: ../src/cli/report.cpp:676
+#: ../src/cli/report.cpp:681
#, c-format
msgid ""
"Please try to install debuginfo manually using the command: \"debuginfo-"
@@ -343,55 +343,63 @@ msgstr ""
"debuginfo ã‚’ \"debuginfo-install %s\" コマンドã«ã¦æ‰‹å‹•ã§ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ã‚‚ã†"
"一度試ã—ã¦ãã ã•ã„。\n"
-#: ../src/cli/report.cpp:685
+#: ../src/cli/report.cpp:690
msgid "Error loading reporter settings"
msgstr "報告設定å–得中ã®ã‚¨ãƒ©ãƒ¼"
-#: ../src/cli/report.cpp:704
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:711
+#, c-format
msgid "Crash reported via %d report events (%d errors)\n"
-msgstr "クラッシュ㯠%d 個ã®ãƒ—ラグインを介ã—ã¦å ±å‘Šæ¸ˆã¿ (%d 個ã®ã‚¨ãƒ©ãƒ¼)\n"
+msgstr "クラッシュ㯠%d 個ã®å ±å‘Šã‚¤ãƒ™ãƒ³ãƒˆã‚’介ã—ã¦å ±å‘Šæ¸ˆã¿ (%d 個ã®ã‚¨ãƒ©ãƒ¼)\n"
-#: ../src/daemon/abrt-handle-crashdump.c:42
+#: ../src/daemon/abrt-handle-crashdump.c:43
msgid ""
" [-vs] -d DIR -e EVENT\n"
" or: "
msgstr ""
+" [-vs] -d DIR -e EVENT\n"
+" ã‚ã‚‹ã„ã¯: "
-#: ../src/daemon/abrt-handle-crashdump.c:57
+#: ../src/daemon/abrt-handle-crashdump.c:59
+#: ../src/plugins/abrt-action-bugzilla.cpp:926
+#: ../src/plugins/abrt-action-generate-backtrace.c:272
+#: ../src/plugins/abrt-action-kerneloops.c:146
+#: ../src/plugins/abrt-action-rhtsupport.c:276
+#: ../src/plugins/abrt-dump-oops.c:554
+msgid "Log to syslog"
+msgstr "syslog ã¸ã®ãƒ­ã‚°"
+
+#: ../src/daemon/abrt-handle-crashdump.c:60
#: ../src/plugins/abrt-action-analyze-c.c:167
#: ../src/plugins/abrt-action-analyze-oops.c:144
#: ../src/plugins/abrt-action-analyze-python.c:49
-msgid "Log to syslog"
-msgstr ""
-
-#: ../src/daemon/abrt-handle-crashdump.c:58
-#: ../src/plugins/abrt-action-analyze-c.c:166
-#: ../src/plugins/abrt-action-analyze-oops.c:143
-#: ../src/plugins/abrt-action-analyze-python.c:48
-#: ../src/plugins/abrt-action-mailx.cpp:150
-#: ../src/plugins/abrt-action-print.cpp:50
-#: ../src/plugins/abrt-action-upload.cpp:266
+#: ../src/plugins/abrt-action-bugzilla.cpp:927
+#: ../src/plugins/abrt-action-generate-backtrace.c:269
+#: ../src/plugins/abrt-action-kerneloops.c:147
+#: ../src/plugins/abrt-action-mailx.c:149
+#: ../src/plugins/abrt-action-print.c:50
+#: ../src/plugins/abrt-action-rhtsupport.c:277
+#: ../src/plugins/abrt-action-upload.c:261
msgid "Crash dump directory"
-msgstr ""
+msgstr "クラッシュダンプディレクトリ"
-#: ../src/daemon/abrt-handle-crashdump.c:59
+#: ../src/daemon/abrt-handle-crashdump.c:61
msgid "Handle EVENT"
-msgstr ""
+msgstr "EVENT を処ç†ã™ã‚‹"
-#: ../src/daemon/abrt-handle-crashdump.c:60
+#: ../src/daemon/abrt-handle-crashdump.c:62
msgid "List possible events [which start with PFX]"
-msgstr ""
+msgstr "å¯èƒ½ãªã‚¤ãƒ™ãƒ³ãƒˆã‚’一覧ã«ã™ã‚‹ [PFX ã§é–‹å§‹]"
-#: ../src/daemon/CommLayerServerDBus.cpp:229
+#: ../src/daemon/CommLayerServerDBus.cpp:242
msgid "Comment is too long"
msgstr "コメントãŒé•·ã™ãŽã¾ã™"
-#: ../src/daemon/CommLayerServerDBus.cpp:233
+#: ../src/daemon/CommLayerServerDBus.cpp:246
msgid "'How to reproduce' is too long"
msgstr "「å†ç¾ã®æ–¹æ³•ã€ãŒé•·ã™ãŽã¾ã™"
-#: ../src/daemon/Daemon.cpp:534
+#: ../src/daemon/Daemon.cpp:371
msgid ""
"The size of the report exceeded the quota. Please check system's "
"MaxCrashReportsSize value in abrt.conf."
@@ -399,21 +407,21 @@ msgstr ""
"報告ã®ã‚µã‚¤ã‚ºãŒå‰²ã‚Šå½“ã¦ã‚’超éŽã—ã¾ã—ãŸã€‚ abrt.conf ã®ä¸­ã§ MaxCrashReportsSize "
"ã®å€¤ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ä¸‹ã•ã„。"
-#: ../src/daemon/Daemon.cpp:699
-msgid "abrtd [options]"
-msgstr ""
+#: ../src/daemon/Daemon.cpp:542
+msgid " [options]"
+msgstr " [オプション]"
-#: ../src/daemon/Daemon.cpp:709
+#: ../src/daemon/Daemon.cpp:553
msgid "Do not daemonize"
-msgstr ""
+msgstr "デーモン化ã—ã¾ã›ã‚“"
-#: ../src/daemon/Daemon.cpp:710
+#: ../src/daemon/Daemon.cpp:554
msgid "Log to syslog even with -d"
-msgstr ""
+msgstr "-d を使用ã—ã¦ã‚‚ syslog ã¸ãƒ­ã‚°"
-#: ../src/daemon/Daemon.cpp:711
+#: ../src/daemon/Daemon.cpp:555
msgid "Exit after SEC seconds of inactivity"
-msgstr ""
+msgstr "åœæ­¢ã‹ã‚‰ SEC 秒後ã«çµ‚了"
#: ../src/gui/abrt.desktop.in.h:2
msgid "View and report application crashes"
@@ -424,8 +432,7 @@ msgid "Another client is already running, trying to wake it..."
msgstr "別ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒç¨¼åƒã—ã¦ã„ã¾ã™ã®ã§ã€ãれを呼ã³å‡ºã—ã¦ã„ã¾ã™..."
#: ../src/gui/ABRTExceptions.py:14
-msgid ""
-"Got unexpected data from the daemon (is the database properly updated?)."
+msgid "Got unexpected data from the daemon (is the database properly updated?)."
msgstr ""
"デーモンã‹ã‚‰äºˆæƒ³å¤–ã®ãƒ‡ãƒ¼ã‚¿ã‚’å—ã‘å–ã‚Šã¾ã—ãŸ(データベースã¯æ­£å¸¸ã«æ›´æ–°ã•ã‚Œã¦ã„ã¾"
"ã™ã‹?)。"
@@ -539,7 +546,7 @@ msgstr ""
"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:19 ../src/gui/CReporterAssistant.py:71
+#: ../src/gui/ccgui.glade.h:19 ../src/gui/CReporterAssistant.py:111
msgid "View log"
msgstr "ログを表示"
@@ -642,7 +649,7 @@ msgstr "ã“ã®å•é¡Œã®å†ç¾æ‰‹é †ã¾ãŸã¯å®Ÿè¡Œã—ãŸã“ã¨ã«ã¤ã„ã¦ã®ç°¡
msgid "You must check the backtrace for sensitive data."
msgstr "機密データãŒãªã„ã‹ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
-#: ../src/gui/CCReporterDialog.py:118 ../src/gui/CReporterAssistant.py:364
+#: ../src/gui/CCReporterDialog.py:118 ../src/gui/CReporterAssistant.py:392
#, python-format
msgid ""
"Reporting disabled because the backtrace is unusable.\n"
@@ -659,13 +666,12 @@ msgstr ""
msgid "The backtrace is unusable, you cannot report this!"
msgstr "ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹ã‚’使用ã§ãã¾ã›ã‚“。ã“ã®å•é¡Œã‚’報告ã§ãã¾ã›ã‚“!"
-#: ../src/gui/CCReporterDialog.py:124 ../src/gui/CReporterAssistant.py:342
-#: ../src/gui/CReporterAssistant.py:370
+#: ../src/gui/CCReporterDialog.py:124 ../src/gui/CReporterAssistant.py:370
+#: ../src/gui/CReporterAssistant.py:398
msgid ""
"The backtrace is incomplete, please make sure you provide the steps to "
"reproduce."
-msgstr ""
-"ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹ãŒä¸å®Œå…¨ã§ã™ã€‚å†ç¾æ‰‹é †ãŒæ›¸ã‹ã‚Œã¦ã„ã‚‹ã‹ã©ã†ã‹ç¢ºèªã—ã¦ãã ã•ã„。"
+msgstr "ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹ãŒä¸å®Œå…¨ã§ã™ã€‚å†ç¾æ‰‹é †ãŒæ›¸ã‹ã‚Œã¦ã„ã‚‹ã‹ã©ã†ã‹ç¢ºèªã—ã¦ãã ã•ã„。"
#: ../src/gui/CCReporterDialog.py:130
msgid "Reporting disabled, please fix the problems shown above."
@@ -683,7 +689,7 @@ msgstr ""
"ã“ã®ã‚¿ã‚¤ãƒ—ã®ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã«ä½¿ç”¨ã§ãるレãƒãƒ¼ã‚¿ãƒ¼ãƒ—ラグインãŒã‚ã‚Šã¾ã›ã‚“。\n"
"abrt.conf を確èªã—ã¦ä¸‹ã•ã„。"
-#: ../src/gui/CCReporterDialog.py:418 ../src/gui/CReporterAssistant.py:249
+#: ../src/gui/CCReporterDialog.py:418 ../src/gui/CReporterAssistant.py:277
#: ../src/gui/PluginsSettingsDialog.py:136
#, python-format
msgid ""
@@ -693,12 +699,12 @@ msgstr ""
"プラグインã®è¨­å®šã‚’ä¿å­˜ã§ãã¾ã›ã‚“:\n"
"%s"
-#: ../src/gui/CCReporterDialog.py:448 ../src/gui/CReporterAssistant.py:279
+#: ../src/gui/CCReporterDialog.py:448 ../src/gui/CReporterAssistant.py:307
#, python-format
msgid "Configure %s options"
msgstr "%s オプションを設定"
-#: ../src/gui/CCReporterDialog.py:498 ../src/gui/CReporterAssistant.py:1074
+#: ../src/gui/CCReporterDialog.py:498 ../src/gui/CReporterAssistant.py:1102
msgid ""
"Unable to get report!\n"
"Is debuginfo missing?"
@@ -706,7 +712,7 @@ msgstr ""
"ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆã‚’å–å¾—ã§ãã¾ã›ã‚“!\n"
"Debuginfo ãŒã‚ã‚Šã¾ã›ã‚“ã‹?"
-#: ../src/gui/CCReporterDialog.py:527 ../src/gui/CReporterAssistant.py:455
+#: ../src/gui/CCReporterDialog.py:527 ../src/gui/CReporterAssistant.py:483
#, python-format
msgid ""
"Reporting failed!\n"
@@ -716,7 +722,7 @@ msgstr ""
"%s"
#: ../src/gui/CCReporterDialog.py:553 ../src/gui/CCReporterDialog.py:574
-#: ../src/gui/CReporterAssistant.py:1113
+#: ../src/gui/CReporterAssistant.py:1139
#, python-format
msgid "Error acquiring the report: %s"
msgstr "ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆã®å–得中ã®ã‚¨ãƒ©ãƒ¼: %s"
@@ -732,8 +738,7 @@ msgid "Cannot get the default keyring."
msgstr "デフォルトキーリングをå–å¾—ã§ãã¾ã›ã‚“。"
#: ../src/gui/ConfBackend.py:103 ../src/gui/ConfBackend.py:120
-msgid ""
-"Access to gnome-keyring has been denied, plugins settings will not be saved."
+msgid "Access to gnome-keyring has been denied, plugins settings will not be saved."
msgstr ""
"gnome-keyring ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸã€‚プラグインã®è¨­å®šã¯ä¿å­˜ã•ã‚Œã¾ã›"
"ん。"
@@ -741,8 +746,7 @@ msgstr ""
#. we tried 2 times, so giving up the authorization
#: ../src/gui/ConfBackend.py:154
#, python-format
-msgid ""
-"Access to gnome-keyring has been denied, cannot load the settings for %s!"
+msgid "Access to gnome-keyring has been denied, cannot load the settings for %s!"
msgstr "gnome-keyring ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸã€‚%s ã®è¨­å®šã‚’読ã¿è¾¼ã‚ã¾ã›ã‚“!"
#: ../src/gui/ConfBackend.py:207
@@ -753,36 +757,36 @@ msgstr "gnome-keyring ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸã€‚設定を読ã
msgid "Crash info doesn't contain a backtrace"
msgstr "クラッシュ情報ã¯ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“"
-#: ../src/gui/CReporterAssistant.py:334
+#: ../src/gui/CReporterAssistant.py:362
#, python-format
msgid "Rating is %s"
msgstr "評価㯠%s ã§ã™"
-#: ../src/gui/CReporterAssistant.py:337
+#: ../src/gui/CReporterAssistant.py:365
msgid "Crashdump doesn't have rating => we suppose it's not required"
msgstr "クラッシュダンプãŒè©•ä¾¡ã•ã‚Œã¦ã„ã¾ã›ã‚“ => å¿…è¦ãªã„ã¨æ€ã‚ã‚Œã¾ã™"
-#: ../src/gui/CReporterAssistant.py:350
+#: ../src/gui/CReporterAssistant.py:378
msgid "You should check the backtrace for sensitive data."
msgstr "機密データãŒãªã„ã‹ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹ã‚’確èªã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
-#: ../src/gui/CReporterAssistant.py:351
+#: ../src/gui/CReporterAssistant.py:379
msgid "You must agree with sending the backtrace."
msgstr "ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹ã®é€ä¿¡ã«åŒæ„ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
-#: ../src/gui/CReporterAssistant.py:366
+#: ../src/gui/CReporterAssistant.py:394
msgid "Reporting disabled because the backtrace is unusable."
msgstr "ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹ãŒåˆ©ç”¨ã§ããªã„ãŸã‚ã€ãƒ¬ãƒãƒ¼ãƒˆæ©Ÿèƒ½ãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚"
-#: ../src/gui/CReporterAssistant.py:412
+#: ../src/gui/CReporterAssistant.py:440
msgid "You did not provide any steps to reproduce."
msgstr "å†ç¾ã™ã‚‹æ‰‹é †ãŒã¾ã æä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
-#: ../src/gui/CReporterAssistant.py:426
+#: ../src/gui/CReporterAssistant.py:454
msgid "You did not provide any comments."
msgstr "コメントãŒã‚ã‚Šã¾ã›ã‚“。"
-#: ../src/gui/CReporterAssistant.py:507
+#: ../src/gui/CReporterAssistant.py:535
#, python-format
msgid ""
"It looks like an application from the package <b>%s</b> has crashed on your "
@@ -807,15 +811,15 @@ msgstr ""
"\n"
"ã“ã®ãƒã‚°ã®å ±å‘Šå…ˆã‚’é¸æŠžã—ã¦ã‹ã‚‰ã€ã€Œé€²ã‚€ã€ã‚’押ã—ã¦ç¶šã‘ã¦ä¸‹ã•ã„。"
-#: ../src/gui/CReporterAssistant.py:548
+#: ../src/gui/CReporterAssistant.py:576
msgid "Only one reporter plugin is configured."
msgstr "レãƒãƒ¼ã‚¿ãƒ¼ãƒ—ラグインãŒä¸€ã¤ã ã‘設定ã•ã‚Œã¦ã„ã¾ã™"
-#: ../src/gui/CReporterAssistant.py:554
+#: ../src/gui/CReporterAssistant.py:582
msgid "Send a bug report"
msgstr "ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ä¿¡"
-#: ../src/gui/CReporterAssistant.py:592
+#: ../src/gui/CReporterAssistant.py:620
msgid ""
"Below is the backtrace associated with your crash. A crash backtrace "
"provides developers with details about how the crash happened, helping them "
@@ -831,132 +835,129 @@ msgstr ""
"以下ã®ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹ã‚’å†ç¢ºèªã—ã€å¿…è¦ã§ã‚ã‚Œã°ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆã‚’修正ã—ã€ä»–人ã¨å…±æœ‰"
"ã™ã¹ãã§ãªã„機密データãŒåŽç´ã•ã‚Œãªã„よã†ã«ã—ã¦ä¸‹ã•ã„:"
-#: ../src/gui/CReporterAssistant.py:663 ../src/gui/CReporterAssistant.py:676
-#: ../src/gui/CReporterAssistant.py:710
+#: ../src/gui/CReporterAssistant.py:691 ../src/gui/CReporterAssistant.py:704
+#: ../src/gui/CReporterAssistant.py:738
#, python-format
msgid "Found %i occurence(s) [at: %i of %i]"
-msgstr ""
+msgstr "%i ã®ç™ºç”Ÿã‚’発見ã—ã¾ã—㟠[: %i ã®å†… %i]"
-#: ../src/gui/CReporterAssistant.py:747
+#: ../src/gui/CReporterAssistant.py:775
msgid "Search:"
-msgstr ""
+msgstr "検索:"
-#: ../src/gui/CReporterAssistant.py:778
+#: ../src/gui/CReporterAssistant.py:806
msgid "Refresh"
msgstr "リフレッシュ"
-#: ../src/gui/CReporterAssistant.py:780
+#: ../src/gui/CReporterAssistant.py:808
msgid "Copy"
msgstr "コピー"
-#: ../src/gui/CReporterAssistant.py:786
+#: ../src/gui/CReporterAssistant.py:814
msgid "I agree with submitting the backtrace"
msgstr "ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹ã®æ出ã«åŒæ„ã—ã¾ã™"
-#: ../src/gui/CReporterAssistant.py:791
+#: ../src/gui/CReporterAssistant.py:819
msgid "Approve the backtrace"
msgstr "ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹ã‚’承èªã™ã‚‹"
-#: ../src/gui/CReporterAssistant.py:834
+#: ../src/gui/CReporterAssistant.py:862
msgid "You need to fill the how to before you can proceed..."
-msgstr ""
+msgstr "次ã«é€²ã‚€å‰ã«ãã®æ–¹æ³•ã‚’書ã込む必è¦ãŒã‚ã‚Šã¾ã™..."
-#: ../src/gui/CReporterAssistant.py:857
+#: ../src/gui/CReporterAssistant.py:885
msgid "How did this crash happen (step-by-step)? How would you reproduce it?"
msgstr ""
"ã©ã®ã‚ˆã†ã«ã—ãŸã¨ã“ã‚ã“ã®ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ãŒç™ºç”Ÿã—ã¾ã—ãŸã‹(段階的ã«)? ã©ã®ã‚ˆã†ã«å†ç¾"
"ã§ãã¾ã™ã‹?"
-#: ../src/gui/CReporterAssistant.py:877
-msgid ""
-"Are there any comments you would like to share with the software maintainers?"
+#: ../src/gui/CReporterAssistant.py:905
+msgid "Are there any comments you would like to share with the software maintainers?"
msgstr "ソフトウェア管ç†è€…ã¨å…±æœ‰ã—ãŸã„コメントãŒã‚ã‚Šã¾ã™ã‹?"
-#: ../src/gui/CReporterAssistant.py:897
+#: ../src/gui/CReporterAssistant.py:925
msgid "Provide additional details"
msgstr "ãã®ä»–ã®æƒ…報をæä¾›ã™ã‚‹"
-#: ../src/gui/CReporterAssistant.py:904
+#: ../src/gui/CReporterAssistant.py:932
msgid ""
"<b>Tip:</b> Your comments are not private. Please watch what you say "
"accordingly."
-msgstr ""
-"<b>ヒント:</b> コメントã¯å…¬é–‹ã•ã‚Œã¾ã™ã€‚ãã®ã¤ã‚‚ã‚Šã§ç™ºè¨€ã«ã¯æ³¨æ„ã—ã¦ä¸‹ã•ã„。"
+msgstr "<b>ヒント:</b> コメントã¯å…¬é–‹ã•ã‚Œã¾ã™ã€‚ãã®ã¤ã‚‚ã‚Šã§ç™ºè¨€ã«ã¯æ³¨æ„ã—ã¦ä¸‹ã•ã„。"
-#: ../src/gui/CReporterAssistant.py:945
+#: ../src/gui/CReporterAssistant.py:973
msgid "Confirm and send the report"
msgstr "レãƒãƒ¼ãƒˆã‚’確èªã—ã¦é€ä¿¡ã™ã‚‹"
-#: ../src/gui/CReporterAssistant.py:947
-msgid ""
-"Below is a summary of your bug report. Please click 'Apply' to submit it."
+#: ../src/gui/CReporterAssistant.py:975
+msgid "Below is a summary of your bug report. Please click 'Apply' to submit it."
msgstr ""
"ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆã®è¦ç´„を以下ã«ç¤ºã—ã¾ã™ã€‚æ出ã™ã‚‹ã«ã¯ã€Œé©ç”¨ã€ã‚’クリックã—ã¦ä¸‹ã•"
"ã„。"
-#: ../src/gui/CReporterAssistant.py:952
+#: ../src/gui/CReporterAssistant.py:980
msgid "<b>Basic details</b>"
msgstr "<b>基本的詳細</b>"
#. left table
-#: ../src/gui/CReporterAssistant.py:959
+#: ../src/gui/CReporterAssistant.py:987
msgid "Component"
msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆ"
-#: ../src/gui/CReporterAssistant.py:960
+#: ../src/gui/CReporterAssistant.py:988
msgid "Package"
msgstr "パッケージ"
-#: ../src/gui/CReporterAssistant.py:961
+#: ../src/gui/CReporterAssistant.py:989
msgid "Executable"
msgstr "実行å¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«"
-#: ../src/gui/CReporterAssistant.py:962
+#: ../src/gui/CReporterAssistant.py:990
msgid "Cmdline"
msgstr "コマンドライン"
#. right table
-#: ../src/gui/CReporterAssistant.py:964
+#: ../src/gui/CReporterAssistant.py:992
msgid "Architecture"
msgstr "アーキテクãƒãƒ£ãƒ¼"
-#: ../src/gui/CReporterAssistant.py:965
+#: ../src/gui/CReporterAssistant.py:993
msgid "Kernel"
msgstr "カーãƒãƒ«"
-#: ../src/gui/CReporterAssistant.py:966
+#: ../src/gui/CReporterAssistant.py:994
msgid "Release"
msgstr "リリース"
-#: ../src/gui/CReporterAssistant.py:967
+#: ../src/gui/CReporterAssistant.py:995
msgid "Reason"
msgstr "ç†ç”±"
-#: ../src/gui/CReporterAssistant.py:978 ../src/gui/report.glade.h:3
+#: ../src/gui/CReporterAssistant.py:1006 ../src/gui/report.glade.h:3
msgid "<b>Backtrace</b>"
msgstr "<b>ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹</b>"
-#: ../src/gui/CReporterAssistant.py:981
+#: ../src/gui/CReporterAssistant.py:1009
msgid "Click to view..."
msgstr "クリックã—ã¦è¡¨ç¤º..."
-#: ../src/gui/CReporterAssistant.py:993
+#: ../src/gui/CReporterAssistant.py:1021
msgid "<b>Steps to reproduce:</b>"
msgstr "<b>å†ç¾ã™ã‚‹ãŸã‚ã®æ‰‹é †:</b>"
-#: ../src/gui/CReporterAssistant.py:1014
+#: ../src/gui/CReporterAssistant.py:1042
msgid "<b>Comments:</b>"
msgstr "<b>コメント:</b>"
-#: ../src/gui/CReporterAssistant.py:1017
+#: ../src/gui/CReporterAssistant.py:1045
msgid "No comment provided!"
msgstr "コメントãŒã‚ã‚Šã¾ã›ã‚“!"
-#: ../src/gui/CReporterAssistant.py:1053
+#: ../src/gui/CReporterAssistant.py:1081
msgid "Finished sending the bug report"
msgstr "ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆé€ä¿¡ã‚’終了ã—ã¾ã—ãŸ"
-#: ../src/gui/CReporterAssistant.py:1057
+#: ../src/gui/CReporterAssistant.py:1085
msgid "<b>Bug reports:</b>"
msgstr "<b>ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆ:</b>"
@@ -1002,7 +1003,6 @@ msgid "Name"
msgstr "åå‰"
#: ../src/gui/PluginsSettingsDialog.py:118
-#, fuzzy
msgid "Please select a plugin from the list to edit its options."
msgstr "一覧ã‹ã‚‰ãƒ—ラグインをé¸æŠžã—ã¦ãã®ã‚ªãƒ—ションを編集ã—ã¦ä¸‹ã•ã„。"
@@ -1223,267 +1223,306 @@ msgstr ""
"下ã®ãƒœã‚¿ãƒ³ã‚’使用ã—ã¦å„設定を開ãã€ãれらを修正ã—ã¦ã‹ã‚‰é€²ã‚“ã§ä¸‹ã•ã„。ã“ã®ã¾ã¾"
"ã§ã¯ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆã®ãƒ—ロセスã¯å¤±æ•—ã™ã‚‹ã§ã—ょã†ã€‚\n"
-#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.cpp:47
+#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.c:45
#, c-format
msgid "Uploaded: %llu of %llu kbytes"
msgstr "アップロード済ã¿: %llu キロãƒã‚¤ãƒˆã®å†… %llu"
-#: ../src/lib/parse_options.c:11
+#: ../src/lib/parse_options.c:29
#, c-format
msgid "Usage: %s\n"
-msgstr ""
+msgstr "使用法: %s\n"
-#: ../src/plugins/abrt-action-analyze-c.c:154
+#: ../src/plugins/abrt-action-analyze-c.c:156
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID of coredumps"
msgstr ""
+" [-v] -d DIR\n"
+"\n"
+"coredumps ã® UUID を算出ã—ã¦ä¿å­˜ã—ã¾ã™"
-#: ../src/plugins/abrt-action-analyze-oops.c:131
+#: ../src/plugins/abrt-action-analyze-oops.c:133
msgid ""
" [-vs] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of oops crash dumps"
msgstr ""
+" [-vs] -d DIR\n"
+"\n"
+"oops クラッシュダンプ㮠UUID 㨠DUPHASH を算出ã—ã¦ä¿å­˜ã—ã¾ã™"
-#: ../src/plugins/abrt-action-analyze-python.c:36
+#: ../src/plugins/abrt-action-analyze-python.c:38
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of python crash dumps"
msgstr ""
+" [-v] -d DIR\n"
+"\n"
+"python クラッシュダンプ㮠UUID 㨠DUPHASH を算出ã—ã¦ä¿å­˜ã—ã¾ã™"
-#: ../src/plugins/abrt-action-bugzilla.cpp:532
+#: ../src/plugins/abrt-action-bugzilla.cpp:534
#, c-format
msgid "New bug id: %i"
msgstr "æ–°ã—ã„ãƒã‚°ID: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:645
+#: ../src/plugins/abrt-action-bugzilla.cpp:662
#, c-format
-msgid "Can't open '%s'"
-msgstr ""
-
-#: ../src/plugins/abrt-action-bugzilla.cpp:665
-#, fuzzy, c-format
msgid "Empty login or password, please check %s"
-msgstr ""
-"ログインã‹ãƒ‘スワードãŒç©ºã§ã™ã€‚\n"
-"確èªã—ã¦ä¸‹ã•ã„。"
+msgstr "ログインã‹ãƒ‘スワードãŒç©ºã§ã™ã€‚%s を確èªã—ã¦ä¸‹ã•ã„。"
-#: ../src/plugins/abrt-action-bugzilla.cpp:683
+#: ../src/plugins/abrt-action-bugzilla.cpp:680
msgid "Logging into bugzilla..."
msgstr "Bugzilla ã«ãƒ­ã‚°ã‚¤ãƒ³ä¸­..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:686
+#: ../src/plugins/abrt-action-bugzilla.cpp:683
msgid "Checking for duplicates..."
msgstr "é‡è¤‡ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:707
-#: ../src/plugins/abrt-action-bugzilla.cpp:743
+#: ../src/plugins/abrt-action-bugzilla.cpp:704
+#: ../src/plugins/abrt-action-bugzilla.cpp:740
msgid "Missing mandatory member 'bugs'"
msgstr "å¿…é ˆã®ãƒ¡ãƒ³ãƒãƒ¼ 'bugs' ã®æ¬ å¦‚"
-#: ../src/plugins/abrt-action-bugzilla.cpp:726
-#: ../src/plugins/abrt-action-bugzilla.cpp:759
-#: ../src/plugins/abrt-action-bugzilla.cpp:834
+#: ../src/plugins/abrt-action-bugzilla.cpp:723
+#: ../src/plugins/abrt-action-bugzilla.cpp:756
+#: ../src/plugins/abrt-action-bugzilla.cpp:833
msgid "get_bug_info() failed. Could not collect all mandatory information"
-msgstr ""
-"get_bug_info() ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã™ã¹ã¦ã®å¿…須情報をåŽé›†ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+msgstr "get_bug_info() ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã™ã¹ã¦ã®å¿…須情報をåŽé›†ã§ãã¾ã›ã‚“ã§ã—ãŸ"
-#: ../src/plugins/abrt-action-bugzilla.cpp:775
+#: ../src/plugins/abrt-action-bugzilla.cpp:772
msgid "Creating a new bug..."
msgstr "æ–°ã—ã„ãƒã‚°ã‚¨ãƒ³ãƒˆãƒªãƒ¼ã‚’作æˆä¸­..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:780
+#: ../src/plugins/abrt-action-bugzilla.cpp:777
msgid "Bugzilla entry creation failed"
msgstr "Bugzilla エントリーã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ"
-#: ../src/plugins/abrt-action-bugzilla.cpp:790
-#: ../src/plugins/abrt-action-bugzilla.cpp:887
+#: ../src/plugins/abrt-action-bugzilla.cpp:789
+#: ../src/plugins/abrt-action-bugzilla.cpp:886
msgid "Logging out..."
msgstr "ログアウトã—ã¦ã„ã¾ã™..."
#. decision based on state
-#: ../src/plugins/abrt-action-bugzilla.cpp:808
+#: ../src/plugins/abrt-action-bugzilla.cpp:807
#, c-format
msgid "Bug is already reported: %i"
msgstr "ãƒã‚°ã¯æ—¢ã«å ±å‘Šæ¸ˆã¿ã§ã™: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:819
+#: ../src/plugins/abrt-action-bugzilla.cpp:818
#, c-format
msgid "Bugzilla couldn't find parent of bug %d"
msgstr "Bugzilla ã¯ãƒã‚°ID(%d) ã®è¦ªã‚¨ãƒ³ãƒˆãƒªãƒ¼ã‚’見ã¤ã‘ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã›ã‚“ã§ã—ãŸ"
-#: ../src/plugins/abrt-action-bugzilla.cpp:848
+#: ../src/plugins/abrt-action-bugzilla.cpp:847
#, c-format
msgid "Add %s to CC list"
msgstr "CC list 㫠%s を追加"
-#: ../src/plugins/abrt-action-bugzilla.cpp:872
+#: ../src/plugins/abrt-action-bugzilla.cpp:871
#, c-format
msgid "Adding new comment to bug %d"
msgstr "ãƒã‚°ID(%d) ã«æ–°ã—ã„コメントを追加"
+#: ../src/plugins/abrt-action-bugzilla.cpp:913
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to Bugzilla"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"クラッシュを Bugzilla ã«å ±å‘Šã—ã¾ã™"
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:928
+#: ../src/plugins/abrt-action-kerneloops.c:148
+#: ../src/plugins/abrt-action-rhtsupport.c:278
+msgid "Configuration file (may be given many times)"
+msgstr "設定ファイル (何回ã§ã‚‚授与å¯èƒ½)"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:257
+msgid " [options] -d DIR"
+msgstr " [オプション] -d DIR"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:270
+msgid "Additional debuginfo directories"
+msgstr "追加㮠debuginfo ディレクトリ"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:271
+msgid "Kill gdb if it runs for more than N seconds"
+msgstr "gdb ㌠N 秒以上も稼åƒã—ãŸå ´åˆã¯ã€ã‚­ãƒ«ã—ã¾ã™"
+
#: ../src/plugins/abrt-action-generate-backtrace.c:319
#, c-format
msgid "Backtrace parsing failed for %s"
-msgstr ""
+msgstr "%s 用ã®ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹æ§‹æ–‡è§£æžã¯å¤±æ•—"
#: ../src/plugins/abrt-action-install-debuginfo.py:72
#, python-format
msgid "Extracting cpio from %s"
-msgstr ""
+msgstr "%s ã‹ã‚‰ cpio を抽出ã—ã¦ã„ã¾ã™"
#: ../src/plugins/abrt-action-install-debuginfo.py:77
msgid "Can't write to:"
-msgstr ""
+msgstr "書ãè¾¼ã¿å‡ºæ¥ãªã„場所:"
#: ../src/plugins/abrt-action-install-debuginfo.py:87
msgid "Removing the temporary rpm file"
-msgstr ""
+msgstr "一時的㪠rpm ファイルを削除中"
#: ../src/plugins/abrt-action-install-debuginfo.py:91
#, python-format
msgid "Can't extract package: %s"
-msgstr ""
+msgstr "パッケージを抽出ã§ãã¾ã›ã‚“: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:99
#, python-format
msgid "Caching files from %s made from %s"
-msgstr ""
+msgstr "%s ã§ä½œæˆã•ã‚ŒãŸ %s ã‹ã‚‰ãƒ•ã‚¡ã‚¤ãƒ«ã‚’キャッシュ中"
#: ../src/plugins/abrt-action-install-debuginfo.py:107
msgid "Removing the temporary cpio file"
-msgstr ""
+msgstr "一時的㪠cpio ファイルを削除中"
#: ../src/plugins/abrt-action-install-debuginfo.py:110
#, python-format
msgid "Can't extract files from: %s"
-msgstr ""
+msgstr "ファイルを抽出ã§ããªã„場所: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:134
#: ../src/plugins/abrt-action-install-debuginfo.py:140
#, python-format
msgid "Downloading (%i of %i) %.30s : %.3s %%"
-msgstr ""
+msgstr "ダウンロード中 (%i ã®å†… %i) %.30s : %.3s %%"
#: ../src/plugins/abrt-action-install-debuginfo.py:169
-#, fuzzy
msgid "Searching the missing debuginfo packages"
-msgstr "debuginfo ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’開始中"
+msgstr "紛失ã—㟠debuginfo パッケージを探ã—ã¦ã„ã¾ã™"
#: ../src/plugins/abrt-action-install-debuginfo.py:224
#, python-format
msgid "To download: (%.2f) M / Installed size: %.2f M"
-msgstr ""
+msgstr "ダウンロード: (%.2f) M / インストールサイズ: %.2f M"
#: ../src/plugins/abrt-action-install-debuginfo.py:240
msgid "Is this ok? [y/N] "
-msgstr ""
+msgstr "よã‚ã—ã„ã§ã™ã‹? [y/N] "
#: ../src/plugins/abrt-action-install-debuginfo.py:257
#, python-format
msgid "Downloading package %s failed"
-msgstr ""
+msgstr "パッケージ %s ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸ"
#. recursively delete the temp dir on failure
#: ../src/plugins/abrt-action-install-debuginfo.py:268
msgid "Unpacking failed, aborting download..."
-msgstr ""
+msgstr "解å‡ãŒå¤±æ•—ã—ã¾ã—ãŸã€ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã‚’中止ã—ã¾ã™..."
#: ../src/plugins/abrt-action-install-debuginfo.py:275
#, python-format
msgid "All downloaded packages have been extracted, removing %s"
-msgstr ""
+msgstr "å…¨ã¦ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ãƒ‘ッケージを展開ã—ã¾ã—ãŸã€‚%s を削除ã—ã¾ã™"
#: ../src/plugins/abrt-action-install-debuginfo.py:280
#, python-format
msgid "Can't remove %s, probably contains an error log"
-msgstr ""
+msgstr "%s を削除ã§ãã¾ã›ã‚“。多分エラーログをå«ã‚“ã§ã„ã¾ã™"
#: ../src/plugins/abrt-action-install-debuginfo.py:305
#, python-format
msgid "Analyzing corefile: %(corefile_path)s"
-msgstr ""
+msgstr "corefile を解æžä¸­: %(corefile_path)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:384
#, python-format
msgid "Can't remove %(tmpdir_path)s: %(reason)s"
-msgstr ""
+msgstr "%(tmpdir_path)s を削除ã§ãã¾ã›ã‚“: %(reason)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:394
msgid "Exiting on user Command"
-msgstr ""
+msgstr "ユーザーã®ã‚³ãƒžãƒ³ãƒ‰ã§çµ‚了ã—ã¦ã„ã¾ã™"
#: ../src/plugins/abrt-action-install-debuginfo.py:413
#, python-format
msgid "Usage: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
-msgstr ""
+msgstr "使用法: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
#: ../src/plugins/abrt-action-install-debuginfo.py:442
-#, fuzzy
msgid "You have to specify the path to coredump."
-msgstr "コピーã™ã‚‹ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+msgstr "coredump ã¸ã®ãƒ‘スを指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
#: ../src/plugins/abrt-action-install-debuginfo.py:446
-#, fuzzy
msgid "You have to specify the path to cachedir."
-msgstr "コピーã™ã‚‹ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+msgstr "cachedir ã¸ã®ãƒ‘スを指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
#: ../src/plugins/abrt-action-install-debuginfo.py:450
-#, fuzzy
msgid "You have to specify the path to tmpdir."
-msgstr "コピーã™ã‚‹ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+msgstr "tmpdir ã¸ã®ãƒ‘スを指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
#: ../src/plugins/abrt-action-install-debuginfo.py:463
msgid "All debuginfo seems to be available"
-msgstr ""
+msgstr "å…¨ã¦ã® debuginfo ãŒåˆ©ç”¨ã§ãるよã†ã§ã™"
#: ../src/plugins/abrt-action-install-debuginfo.py:470
-#, fuzzy
msgid "Complete!"
-msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆ"
+msgstr "完了ã—ã¾ã—ãŸã€‚"
-#: ../src/plugins/abrt-action-kerneloops.cpp:111
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-kerneloops.c:105
+#, c-format
msgid "Submitting oops report to %s"
-msgstr "'%s' ã¸ã®ãƒ¬ãƒãƒ¼ãƒˆã‚’書ãè¾¼ã¿ä¸­"
+msgstr "%s ã¸ã® oops レãƒãƒ¼ãƒˆã‚’æ出中"
+
+#: ../src/plugins/abrt-action-kerneloops.c:133
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a kernel oops to kerneloops.org (or similar) site"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"カーãƒãƒ« oops ã‚’ kerneloops.org (åˆã¯åŒæ§˜) サイトã«å ±å‘Šã—ã¾ã™"
-#: ../src/plugins/abrt-action-mailx.cpp:114
+#: ../src/plugins/abrt-action-mailx.c:110
msgid "Sending an email..."
msgstr "é›»å­ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ä¸­..."
-#: ../src/plugins/abrt-action-mailx.cpp:138
+#: ../src/plugins/abrt-action-mailx.c:137
msgid ""
" [-v] -d DIR [-c CONFFILE]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d DIR [-c CONFFILE]\n"
+"\n"
+"クラッシュダンプã®åœ§ç¸® tar ボールをアップロードã—ã¾ã™"
-#: ../src/plugins/abrt-action-mailx.cpp:151
-#: ../src/plugins/abrt-action-upload.cpp:267
-#, fuzzy
+#: ../src/plugins/abrt-action-mailx.c:150
+#: ../src/plugins/abrt-action-upload.c:262
msgid "Config file"
-msgstr "Logger ファイル:"
+msgstr "Config ファイル"
-#: ../src/plugins/abrt-action-print.cpp:39
+#: ../src/plugins/abrt-action-print.c:38
msgid ""
" [-v] [-o FILE] -d DIR\n"
"\n"
"Print information about the crash to standard output"
msgstr ""
+" [-v] [-o FILE] -d DIR\n"
+"\n"
+"クラッシュã«é–¢ã™ã‚‹æƒ…報を標準出力ã«è¡¨ç¤ºã—ã¾ã™"
-#: ../src/plugins/abrt-action-print.cpp:51
+#: ../src/plugins/abrt-action-print.c:51
msgid "Output file"
-msgstr ""
+msgstr "出力ファイル"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was appended to %s"
msgstr "ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆã‚’ %s ã«è¿½åŠ ã—ã¾ã—ãŸ"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was stored to %s"
msgstr "ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆã‚’ %s ã«ä¿å­˜ã—ã¾ã—ãŸ"
@@ -1491,48 +1530,84 @@ msgstr "ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆã‚’ %s ã«ä¿å­˜ã—ã¾ã—ãŸ"
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
#. error msg is already logged by dd_opendir
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
-#: ../src/plugins/abrt-action-rhtsupport.cpp:43
-#: ../src/plugins/abrt-action-upload.cpp:121
+#: ../src/plugins/abrt-action-rhtsupport.c:41
+#: ../src/plugins/abrt-action-upload.c:119
msgid "Compressing data"
msgstr "データを圧縮"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:78
-#, fuzzy
+#: ../src/plugins/abrt-action-rhtsupport.c:69
msgid "Empty login or password, please check RHTSupport.conf"
-msgstr ""
-"ログインã‹ãƒ‘スワードãŒç©ºã§ã™ã€‚\n"
-"確èªã—ã¦ä¸‹ã•ã„。"
+msgstr "ログインã‹ãƒ‘スワードãŒç©ºã§ã™ã€‚RHTSupport.conf を確èªã—ã¦ä¸‹ã•ã„。"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:194
+#: ../src/plugins/abrt-action-rhtsupport.c:188
msgid "Creating a new case..."
msgstr "æ–°ã—ã„ケースを作æˆä¸­..."
-#: ../src/plugins/abrt-action-upload.cpp:65
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-rhtsupport.c:263
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to RHTSupport"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"クラッシュを RHTSupport ã«å ±å‘Šã—ã¦ã„ã¾ã™"
+
+#: ../src/plugins/abrt-action-upload.c:63
+#, c-format
msgid "Sending %s to %s"
-msgstr "アーカイブ %s ã‚’ %s ã«é€ä¿¡ä¸­"
+msgstr " %s ã‚’ %s ã«é€ä¿¡ä¸­"
#. This ends up a "reporting status message" in abrtd
-#: ../src/plugins/abrt-action-upload.cpp:98
+#: ../src/plugins/abrt-action-upload.c:96
#, c-format
msgid "Successfully sent %s to %s"
-msgstr ""
+msgstr "%s を正常㫠%s ã«é€ä¿¡ã—ã¾ã—ãŸ"
-#: ../src/plugins/abrt-action-upload.cpp:219
+#: ../src/plugins/abrt-action-upload.c:213
#, c-format
msgid "Archive is created: '%s'"
-msgstr ""
+msgstr "書庫ãŒä½œæˆã•ã‚Œã¾ã—ãŸ: '%s'"
-#: ../src/plugins/abrt-action-upload.cpp:253
+#: ../src/plugins/abrt-action-upload.c:248
msgid ""
" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
+"\n"
+"クラッシュダンプã®åœ§ç¸® tar ボールをアップロードã—ã¾ã™"
-#: ../src/plugins/abrt-action-upload.cpp:268
+#: ../src/plugins/abrt-action-upload.c:263
msgid "Base URL to upload to"
+msgstr "アップロード先ã®ãƒ™ãƒ¼ã‚¹ URL"
+
+#: ../src/plugins/abrt-dump-oops.c:539
+msgid ""
+" [-vsrdow] FILE\n"
+"\n"
+"Extract oops from syslog/dmesg file"
msgstr ""
+" [-vsrdow] FILE\n"
+"\n"
+"syslog/dmesg ファイルã‹ã‚‰ oops を抽出ã—ã¾ã™"
+
+#: ../src/plugins/abrt-dump-oops.c:555
+msgid "Parse kernel's message buffer before parsing FILE"
+msgstr "FILE をパースã™ã‚‹å‰ã«ã‚«ãƒ¼ãƒãƒ«ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒãƒƒãƒ•ã‚¡ã‚’パースã—ã¾ã™"
+
+#: ../src/plugins/abrt-dump-oops.c:556
+msgid "Create ABRT dump for every oops found"
+msgstr "見ã¤ã‘ãŸå…¨ã¦ã® oops ã« ABRT ダンプを作æˆã—ã¾ã™"
+
+#: ../src/plugins/abrt-dump-oops.c:557
+msgid "Print found oopses on standard output"
+msgstr "見ã¤ã‘㟠oops を標準出力ã«è¡¨ç¤ºã—ã¾ã™"
+
+#: ../src/plugins/abrt-dump-oops.c:558
+msgid "Do not exit, watch the file for new oopses"
+msgstr "終了ã›ãšã«æ–°è¦ oops ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’観察ã—ã¾ã™"
#: ../src/plugins/Bugzilla.glade.h:1
msgid "<b>Bugzilla plugin configuration</b>"
@@ -1570,10 +1645,6 @@ msgstr ""
"ãれ㯠<a href=\"https://bugzilla.redhat.com/createaccount.cgi\">ã“ã“ã§ä½œæˆ</"
"a> ã§ãã¾ã™"
-#: ../src/plugins/CCpp.cpp:277
-msgid "Analyzes crashes in C/C++ programs"
-msgstr "Analyzes 㯠C/C++ プログラムã§ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã—ã¾ã™"
-
#: ../src/plugins/KerneloopsReporter.glade.h:1
msgid "<b>Kerneloops Reporter plugin configuration</b>"
msgstr "<b>Kerneloops レãƒãƒ¼ã‚¿ãƒ¼ãƒ—ラグイン設定</b>"
@@ -1582,10 +1653,6 @@ msgstr "<b>Kerneloops レãƒãƒ¼ã‚¿ãƒ¼ãƒ—ラグイン設定</b>"
msgid "Submit URL:"
msgstr "æ出用 URL:"
-#: ../src/plugins/KerneloopsScanner.cpp:227
-msgid "Periodically scans for and saves kernel oopses"
-msgstr "カーãƒãƒ« oops を定期的ã«ã‚¹ã‚­ãƒ£ãƒ³ã—ã¦ä¿å­˜ã—ã¾ã™"
-
#: ../src/plugins/Logger.glade.h:1
msgid "<b>Logger plugin configuration</b>"
msgstr "<b>Logger プラグインã®è¨­å®š</b>"
@@ -1631,9 +1698,8 @@ msgid "RHTSupport URL:"
msgstr "RHTSupport URL:"
#: ../src/plugins/Upload.glade.h:1
-#, fuzzy
msgid "<b>Upload plugin configuration</b>"
-msgstr "<b>Report Uploader プラグインã®è¨­å®š</b>"
+msgstr "<b>プラグイン設定ã®ã‚¢ãƒƒãƒ—ロード</b>"
#: ../src/plugins/Upload.glade.h:2
msgid "Retry count:"
@@ -1651,98 +1717,3 @@ msgstr "URL:"
msgid "Use encryption"
msgstr "æš—å·åŒ–を使用"
-#~ msgid "Database plugin not specified. Please check abrtd settings."
-#~ msgstr ""
-#~ "データベースプラグインãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。 abrtd ã®è¨­å®šã‚’確èªã—ã¦ãã ã•"
-#~ "ã„。"
-
-#~ msgid "Keeps SQLite3 database about all crashes"
-#~ msgstr "ã™ã¹ã¦ã®ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã«ã¤ã„㦠SQLite3 データベースを維æŒã—ã¾ã™"
-
-#~ msgid "Reports bugs to bugzilla"
-#~ msgstr "Bugzilla ã«ãƒã‚°å ±å‘Šã—ã¾ã™"
-
-#~ msgid "Generating backtrace"
-#~ msgstr "ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹ç”Ÿæˆä¸­"
-
-#~ msgid "Getting global universal unique identification..."
-#~ msgstr "グローãƒãƒ«ã§æ™®éçš„ãªç‹¬è‡ªã®è­˜åˆ¥ã‚’å–å¾—ã—ã¦ã„ã¾ã™..."
-
-#~ msgid "Skipping the debuginfo installation"
-#~ msgstr "debuginfo ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’スキップã—ã¾ã™"
-
-#~ msgid "FileTransfer: URL not specified"
-#~ msgstr "ファイル転é€: URL ãŒç¤ºã•ã‚Œã¦ã„ã¾ã›ã‚“"
-
-#~ msgid "FileTransfer: Creating a report..."
-#~ msgstr "ファイル転é€: ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆã‚’作æˆä¸­..."
-
-#~ msgid "Cannot create and send an archive: %s"
-#~ msgstr "アーカイブã®ä½œæˆã¨é€ä¿¡ãŒã§ãã¾ã›ã‚“: %s"
-
-#~ msgid "Sends a report via FTP or SCTP"
-#~ msgstr "FTP ã‹ SCTP を介ã—ã¦ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ä¿¡ã—ã¾ã™"
-
-#~ msgid "Analyzes kernel oopses"
-#~ msgstr "Analyzes カーãƒãƒ«ã¯ oops を出ã—ã¾ã™"
-
-#~ msgid "Creating and submitting a report..."
-#~ msgstr "報告ã®ä½œæˆã¨æ出をã—ã¦ã„ã¾ã™..."
-
-#~ msgid "Sends kernel oops information to kerneloops.org"
-#~ msgstr "カーãƒãƒ« oops 情報を kerneloops.org ã«é€ä¿¡ã—ã¾ã™"
-
-#~ msgid "Writes report to a file"
-#~ msgstr "レãƒãƒ¼ãƒˆã‚’ファイルã¸æ›¸ãè¾¼ã¿"
-
-#~ msgid "Sends an email with a report (via mailx command)"
-#~ msgstr "レãƒãƒ¼ãƒˆã¨å…±ã«é›»å­ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã™ ( mailx コマンドã§)"
-
-#~ msgid "Analyzes crashes in Python programs"
-#~ msgstr "Analyzes 㯠Python プログラムã§ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã—ã¾ã™"
-
-#~ msgid "Sending failed, trying again. %s"
-#~ msgstr "é€ä¿¡ã«å¤±æ•—。å†è©¦è¡Œã—ã¦ã„ã¾ã™ã€‚ %s"
-
-#~ msgid "Creating a ReportUploader report..."
-#~ msgstr "ReportUploader ã®ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆã‚’作æˆã—ã¦ã„ã¾ã™..."
-
-#~ msgid ""
-#~ "Packs crash data into .tar.gz file, optionally uploads it via FTP/SCP/etc"
-#~ msgstr ""
-#~ "クラッシュデータを .tar.gz ファイルã«åœ§ç¸®ã—ã¾ã™ã€‚オプションã¨ã—㦠FTP/SCP/"
-#~ "etc 経由ã§ã‚¢ãƒƒãƒ—ロードã—ã¾ã™"
-
-#~ msgid "Reports bugs to Red Hat support"
-#~ msgstr "Red Hat サãƒãƒ¼ãƒˆã«ãƒã‚°ã‚’報告ã—ã¾ã™"
-
-#~ msgid "Runs a command, saves its output"
-#~ msgstr "コマンドを実行ã—ã¦ã€ãã®å‡ºåŠ›ã‚’ä¿å­˜ã—ã¾ã™"
-
-#~ msgid "Running sosreport: %s"
-#~ msgstr "sosreport を実行中: %s"
-
-#~ msgid "Finished running sosreport"
-#~ msgstr "sosreport ã®å®Ÿè¡Œçµ‚了"
-
-#~ msgid "Unable to open debug dump '%s'"
-#~ msgstr "デãƒãƒƒã‚°ãƒ€ãƒ³ãƒ— '%s' ã‚’é–‹ã‘ã¾ã›ã‚“"
-
-#~ msgid "Runs sosreport, saves the output"
-#~ msgstr "sosreport を実行ã—ã¦ã€ãã®å‡ºåŠ›ã‚’ä¿å­˜ã—ã¾ã™"
-
-#~ msgid "Customer:"
-#~ msgstr "ãŠå®¢æ§˜:"
-
-#~ msgid "Ticket:"
-#~ msgstr "ãƒã‚±ãƒƒãƒˆ:"
-
-#~ msgid "Upload"
-#~ msgstr "アップロード"
-
-#~ msgid "Rating is required by the %s plugin"
-#~ msgstr "%s プラグインã«ã‚ˆã‚‹è©•ä¾¡ãŒå¿…è¦ã§ã™"
-
-#~ msgid "Rating is not required by any plugin, skipping the check..."
-#~ msgstr ""
-#~ "ã„ãšã‚Œã®ãƒ—ラグインã«ã‚ˆã‚‹è©•ä¾¡ã‚‚å¿…è¦ã‚ã‚Šã¾ã›ã‚“。確èªã‚’çœç•¥ã—ã¦ã„ã¾ã™..."
diff --git a/po/kn.po b/po/kn.po
index 7a48894c..1e031d45 100644
--- a/po/kn.po
+++ b/po/kn.po
@@ -2,20 +2,20 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
-# Shankar Prasad <svenkate@redhat.com>, 2009, 2010.
+# Shankar Prasad <svenkate@redhat.com>, 2009, 2010, 2011.
msgid ""
msgstr ""
"Project-Id-Version: abrt.master.kn\n"
"Report-Msgid-Bugs-To: jmoskovc@redhat.com\n"
-"POT-Creation-Date: 2010-11-29 13:51+0100\n"
-"PO-Revision-Date: 2010-07-30 16:13+0530\n"
+"POT-Creation-Date: 2011-02-07 02:41+0000\n"
+"PO-Revision-Date: 2011-02-07 15:19+0530\n"
"Last-Translator: Shankar Prasad <svenkate@redhat.com>\n"
"Language-Team: kn_IN <kde-i18n-doc@kde.org>\n"
-"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 1.0\n"
+"Language: \n"
+"X-Generator: Lokalize 1.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../src/applet/abrt-applet.desktop.in.h:1
@@ -28,16 +28,16 @@ msgstr "ABRT ಸೂಚನಾ ಆಪà³à²²à³†à²Ÿà³"
msgid "Automatic Bug Reporting Tool"
msgstr "ಸà³à²µà²¯à²‚ಚಾಲಿತ ದೋಷ ವರದಿ ಮಾಡà³à²µ ಉಪಕರಣ"
-#: ../src/applet/Applet.cpp:86
+#: ../src/applet/applet.c:86
#, c-format
msgid "A crash in the %s package has been detected"
msgstr "%s ಎಂಬ ಪà³à²¯à²¾à²•à³‡à²œà³â€Œà²¨à²²à³à²²à²¿ ಒಂದೠಕà³à²¸à²¿à²¤à²µà³ ಕಂಡà³à²¬à²‚ದಿದೆ"
-#: ../src/applet/Applet.cpp:88
+#: ../src/applet/applet.c:88
msgid "A crash has been detected"
msgstr "ಒಂದೠಕà³à²¸à²¿à²¤à²µà²¨à³à²¨à³ ಪತà³à²¤à³† ಮಾಡಲಾಗಿದೆ"
-#: ../src/applet/Applet.cpp:285
+#: ../src/applet/applet.c:285
msgid "ABRT service is not running"
msgstr "ABRT ಸೇವೆಯೠಚಾಲನೆಯಲà³à²²à²¿à²²à³à²²"
@@ -47,11 +47,10 @@ msgid "Warning"
msgstr "ಎಚà³à²šà²°à²¿à²•à³†"
#: ../src/applet/applet_gtk.c:230
-msgid ""
-"Notification area applet that notifies users about issues detected by ABRT"
+msgid "Notification area applet that notifies users about issues detected by ABRT"
msgstr "ABRT ಇಂದ ಪತà³à²¤à³† ಮಾಡಲಾದ ತೊಂದರೆಗಳನà³à²¨à³ ಬಳಕೆದಾರರಿಗೆ ಸೂಚಿಸà³à²µ ಸೂಚನಾ ಸà³à²¥à²³à²¦ ಆಪà³à²²à³†à²Ÿà³"
-#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:23
+#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:24
msgid "translator-credits"
msgstr "ಶಂಕರೠಪà³à²°à²¸à²¾à²¦à³ <svenkate@redhat.com>"
@@ -59,7 +58,7 @@ msgstr "ಶಂಕರೠಪà³à²°à²¸à²¾à²¦à³ <svenkate@redhat.com>"
msgid "Hide"
msgstr "ಅಡಗಿಸà³"
-#: ../src/applet/applet_gtk.c:360 ../src/gui/ccgui.glade.h:13
+#: ../src/applet/applet_gtk.c:360 ../src/gui/ccgui.glade.h:14
msgid "Report"
msgstr "ವರದಿ"
@@ -67,8 +66,8 @@ msgstr "ವರದಿ"
msgid "Open ABRT"
msgstr "ABRT ಅನà³à²¨à³ ತೆರೆ"
-#: ../src/cli/CLI.cpp:47
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:91
+#, c-format
msgid ""
"\tCrash dump : %s\n"
"\tUID : %s\n"
@@ -77,20 +76,20 @@ msgid ""
"\tCrash Time : %s\n"
"\tCrash Count: %s\n"
msgstr ""
-"\tUID : %s\n"
-"\tUUID : %s\n"
+"\tಕà³à²¸à²¿à²¤ ಡಂಪೠ: %s\n"
+"\tUID : %s\n"
"\tಪà³à²¯à²¾à²•à³‡à²œà³ : %s\n"
"\tಎಕà³à²¸à²¿à²—à³à²¯à³‚ಟೆಬಲೠ: %s\n"
"\tಕà³à²¸à²¿à²¤à²¦ ಸಮಯ : %s\n"
"\tಕà³à²¸à²¿à²¤à²¦ ಎಣಿಕೆ: %s\n"
-#: ../src/cli/CLI.cpp:65
+#: ../src/cli/CLI.cpp:110
#, c-format
msgid "\tHostname : %s\n"
msgstr "\tಆತಿಥೇಯದ ಹೆಸರೠ: %s\n"
-#: ../src/cli/CLI.cpp:98
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:143
+#, c-format
msgid ""
"Dump directory: %s\n"
"Last crash: %s\n"
@@ -102,39 +101,37 @@ msgid ""
"System: %s, kernel %s\n"
"Reason: %s\n"
msgstr ""
-"ಕà³à²¸à²¿à²¤à²¦ ID: %s:%s\n"
+"ಕà³à²¸à²¿à²¤à²¦ ಕೋಶ: %s\n"
"ಕೊನೆಯ ಬಾರಿಯ ಕà³à²¸à²¿à²¤: %s\n"
"ವಿಶà³à²²à³‡à²·à²•: %s\n"
"ಘಟಕ: %s\n"
"ಪà³à²¯à²¾à²•à³‡à²œà³: %s\n"
"ಆಜà³à²žà³†: %s\n"
"ಎಕà³à²¸à²¿à²—à³à²¯à³‚ಟೆಬಲà³: %s\n"
-"ವà³à²¯à²µà²¸à³à²¥à³†: %s, kernel %s\n"
-"ಗà³à²£à²¨à²¿à²¶à³à²šà²¯: %s\n"
-"ಕೋರà³-ಡಂಪೠಕಡತ: %s\n"
+"ವà³à²¯à²µà²¸à³à²¥à³†: %s, ಕರà³à²¨à²²à³ %s\n"
"ಕಾರಣ: %s\n"
-#: ../src/cli/CLI.cpp:125
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:171
+#, c-format
msgid "Coredump file: %s\n"
-msgstr "ಕà³à²¸à²¿à²¤à²¦ ಕà³à²°à²¿à²¯à³†: %s\n"
+msgstr "ಕೋರೠಡಂಪೠಕಡತ: %s\n"
-#: ../src/cli/CLI.cpp:129
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:175
+#, c-format
msgid "Rating: %s\n"
-msgstr "ಅತಿಥೇಯದ ಹೆಸರà³: %s\n"
+msgstr "ಗà³à²£ ನಿಶà³à²šà²¯: %s\n"
-#: ../src/cli/CLI.cpp:134
+#: ../src/cli/CLI.cpp:180
#, c-format
msgid "Crash function: %s\n"
msgstr "ಕà³à²¸à²¿à²¤à²¦ ಕà³à²°à²¿à²¯à³†: %s\n"
-#: ../src/cli/CLI.cpp:138
+#: ../src/cli/CLI.cpp:184
#, c-format
msgid "Hostname: %s\n"
msgstr "ಅತಿಥೇಯದ ಹೆಸರà³: %s\n"
-#: ../src/cli/CLI.cpp:142
+#: ../src/cli/CLI.cpp:188
#, c-format
msgid ""
"\n"
@@ -145,7 +142,7 @@ msgstr ""
"ಹೇಗೆ ಮರಳಿ ಉತà³à²ªà²¾à²¦à²¿à²¸à²¬à²¹à³à²¦à³:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:146
+#: ../src/cli/CLI.cpp:192
#, c-format
msgid ""
"\n"
@@ -156,7 +153,7 @@ msgstr ""
"ಟಿಪà³à²ªà²£à²¿:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:152
+#: ../src/cli/CLI.cpp:198
#, c-format
msgid ""
"\n"
@@ -167,69 +164,65 @@ msgstr ""
"ಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³:\n"
"%s\n"
-#. Message has embedded tabs.
-#: ../src/cli/CLI.cpp:243
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:295
+#, c-format
msgid ""
-"Usage: %s [OPTION]\n"
+"Usage: %s -l[f] [-D BASE_DIR]...]\n"
+" or: %s -r[y] CRASH_DIR\n"
+" or: %s -i[b] CRASH_DIR\n"
+" or: %s -d CRASH_DIR\n"
+"\n"
+"\t-l, --list\t\tList not yet reported crashes\n"
+"\t -f, --full\t\tList all crashes\n"
+"\t-D BASE_DIR\t\tDirectory to list crashes from\n"
+"\t\t\t\t(default: -D $HOME/.abrt/spool -D %s)\n"
"\n"
-"Startup:\n"
-"\t-V, --version\t\tdisplay the version of %s and exit\n"
-"\t-?, --help\t\tprint this help\n"
+"\t-r, --report\t\tSend a report about CRASH_DIR\n"
+"\t -y, --always\t\t...without editing and asking\n"
+"\t-i, --info\t\tPrint detailed information about CRASH_DIR\n"
+"\t -b, --backtrace\t...including backtrace\n"
+"\t-d, --delete\t\tRemove CRASH_DIR\n"
"\n"
-"Actions:\n"
-"\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
-"\t -f, --full\tprint a list of all crashes, including the already "
-"reported ones\n"
-"\t-r, --report CRASH_ID\tcreate and send a report\n"
-"\t -y, --always\tcreate and send a report without asking\n"
-"\t-d, --delete CRASH_ID\tremove a crash\n"
-"\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
-"\t -b, --backtrace\tprint detailed information about a crash including "
-"backtrace\n"
-"CRASH_ID can be:\n"
-"\ta name of dump directory, or\n"
-"\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+"\t-V, --version\t\tDisplay version and exit\n"
+"\t-v, --verbose\t\tBe verbose\n"
msgstr ""
-"Usage: %s [OPTION]\n"
+"Usage: %s -l[f] [-D BASE_DIR]...]\n"
+" or: %s -r[y] CRASH_DIR\n"
+" or: %s -i[b] CRASH_DIR\n"
+" or: %s -d CRASH_DIR\n"
+"\n"
+"\t-l, --list\t\tList not yet reported crashes\n"
+"\t -f, --full\t\tList all crashes\n"
+"\t-D BASE_DIR\t\tDirectory to list crashes from\n"
+"\t\t\t\t(default: -D $HOME/.abrt/spool -D %s)\n"
"\n"
-"Startup:\n"
-"\t-V, --version\t\tdisplay the version of %s and exit\n"
-"\t-?, --help\t\tprint this help\n"
+"\t-r, --report\t\tSend a report about CRASH_DIR\n"
+"\t -y, --always\t\t...without editing and asking\n"
+"\t-i, --info\t\tPrint detailed information about CRASH_DIR\n"
+"\t -b, --backtrace\t...including backtrace\n"
+"\t-d, --delete\t\tRemove CRASH_DIR\n"
"\n"
-"Actions:\n"
-"\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
-"\t -f, --full\tprint a list of all crashes, including the already "
-"reported ones\n"
-"\t-r, --report CRASH_ID\tcreate and send a report\n"
-"\t -y, --always\tcreate and send a report without asking\n"
-"\t-d, --delete CRASH_ID\tremove a crash\n"
-"\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
-"\t -b, --backtrace\tprint detailed information about a crash including "
-"backtrace\n"
-"CRASH_ID can be:\n"
-"\tUID:UUID pair,\n"
-"\tunique UUID prefix - the crash with matching UUID will be acted upon\n"
-"\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
-
-#: ../src/cli/CLI.cpp:287
+"\t-V, --version\t\tDisplay version and exit\n"
+"\t-v, --verbose\t\tBe verbose\n"
+
+#: ../src/cli/CLI.cpp:343
msgid "You must specify exactly one operation"
msgstr "ನೀವೠಕನಿಷà³à²Ÿ ಒಂದೠಕಾರà³à²¯à²µà²¨à³à²¨à²¾à²¦à²°à³‚ ಸೂಚಿಸಬೇಕà³"
-#: ../src/cli/report.cpp:166
+#: ../src/cli/report.cpp:161
#, c-format
msgid "# This field is read only\n"
msgstr "# ಕà³à²·à³‡à²¤à³à²°à²µà³ ಓದಲೠಮಾತà³à²°à²µà³† ಆಗಿದೆ\n"
-#: ../src/cli/report.cpp:186
+#: ../src/cli/report.cpp:181
msgid "# Describe the circumstances of this crash below"
msgstr "# ಈ ಕà³à²¸à²¿à²¤à²¦ ಸಂದರà³à²­à²µà²¨à³à²¨à³ ಇಲà³à²²à²¿ ವಿವರಿಸಿ"
-#: ../src/cli/report.cpp:188
+#: ../src/cli/report.cpp:183
msgid "# How to reproduce the crash?"
msgstr "# ಕà³à²¸à²¿à²¤à²µà²¨à³à²¨à³ ಹೇಗೆ ಮರಳಿ ಉತà³à²ªà²¾à²¦à²¿à²¸à²¬à²¹à³à²¦à³?"
-#: ../src/cli/report.cpp:190
+#: ../src/cli/report.cpp:185
msgid ""
"# Backtrace\n"
"# Check that it does not contain any sensitive data (passwords, etc.)"
@@ -237,48 +230,47 @@ msgstr ""
"#ಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³\n"
"# ಅದೠಯಾವà³à²¦à³† ಸಂವೇದಿ ಮಾಹಿತಿಯನà³à²¨à³ (ಗà³à²ªà³à²¤à²ªà²¦à²—ಳà³, ಇತà³à²¯à²¾à²¦à²¿) ಹೊಂದಿದೆಯೆ ಎಂದೠಪರಿಶೀಲಿಸಿ"
-#: ../src/cli/report.cpp:192
+#: ../src/cli/report.cpp:187
msgid "# Architecture"
msgstr "#ಆರà³à²•à²¿à²Ÿà³†à²•à³à²šà²°à³"
-#: ../src/cli/report.cpp:193
+#: ../src/cli/report.cpp:188
msgid "# Command line"
msgstr "# ಆಜà³à²žà²¾ ಸಾಲà³"
-#: ../src/cli/report.cpp:194
+#: ../src/cli/report.cpp:189
msgid "# Component"
msgstr "# ಘಟಕ"
-#: ../src/cli/report.cpp:195
+#: ../src/cli/report.cpp:190
msgid "# Core dump"
msgstr "# ಕೋರೠಡಂಪà³"
-#: ../src/cli/report.cpp:196
+#: ../src/cli/report.cpp:191
msgid "# Executable"
msgstr "# ಎಕà³à²¸à²¿à²—à³à²¯à³‚ಟೆಬಲà³"
-#: ../src/cli/report.cpp:197
+#: ../src/cli/report.cpp:192
msgid "# Kernel version"
msgstr "# ಕರà³à²¨à²²à³ ಆವೃತà³à²¤à²¿"
-#: ../src/cli/report.cpp:198
+#: ../src/cli/report.cpp:193
msgid "# Package"
msgstr "# ಪà³à²¯à²¾à²•à³‡à²œà³"
-#: ../src/cli/report.cpp:199
+#: ../src/cli/report.cpp:194
msgid "# Reason of crash"
msgstr "# ಕà³à²¸à²¿à²¤à²¦ ಕಾರಣ"
-#: ../src/cli/report.cpp:200
+#: ../src/cli/report.cpp:195
msgid "# Release string of the operating system"
msgstr "# ಕಾರà³à²¯ ವà³à²¯à²µà²¸à³à²¥à³†à²¯ ಬಿಡà³à²—ಡೆ ವಾಕà³à²¯à²¾à²‚ಶ"
-#: ../src/cli/report.cpp:323
+#: ../src/cli/report.cpp:318
msgid "Cannot run vi: $TERM, $VISUAL and $EDITOR are not set"
-msgstr ""
-"vi ಅನà³à²¨à³ ಚಲಾಯಿಸಲೠಸಾಧà³à²¯à²µà²¾à²—ಿಲà³à²²: $TERM, $VISUAL ಹಾಗೠ$EDITOR ಅನà³à²¨à³ ಹೊಂದಿಸಲಾಗಿಲà³à²²"
+msgstr "vi ಅನà³à²¨à³ ಚಲಾಯಿಸಲೠಸಾಧà³à²¯à²µà²¾à²—ಿಲà³à²²: $TERM, $VISUAL ಹಾಗೠ$EDITOR ಅನà³à²¨à³ ಹೊಂದಿಸಲಾಗಿಲà³à²²"
-#: ../src/cli/report.cpp:411
+#: ../src/cli/report.cpp:402
msgid ""
"\n"
"The report has been updated"
@@ -286,7 +278,7 @@ msgstr ""
"\n"
"ವರದಿಯನà³à²¨à³ ಅಪà³â€Œà²¡à³‡à²Ÿà³ ಮಾಡಲಾಗಿದೆ"
-#: ../src/cli/report.cpp:413
+#: ../src/cli/report.cpp:404
msgid ""
"\n"
"No changes were detected in the report"
@@ -295,103 +287,127 @@ msgstr ""
"ವರದಿಯಲà³à²²à²¿ ಯಾವà³à²¦à³† ಬದಲಾವಣೆಯೠಕಂಡೠಬಂದಿಲà³à²²"
#. The response might take more than 1 char in non-latin scripts.
-#: ../src/cli/report.cpp:464
+#: ../src/cli/report.cpp:436
msgid "y"
-msgstr ""
+msgstr "y"
-#: ../src/cli/report.cpp:465
+#: ../src/cli/report.cpp:437
msgid "N"
-msgstr ""
+msgstr "N"
#. Read the missing information and push it to plugin settings.
-#: ../src/cli/report.cpp:565
+#: ../src/cli/report.cpp:568
#, c-format
msgid "Wrong settings were detected for plugin %s\n"
msgstr "%s ಎಂಬ ಪà³à²²à²—à³â€Œà²‡à²¨à³â€Œà²—ಾಗಿ ತಪà³à²ªà³ ಸಿದà³à²§à²¤à³†à²—ಳೠಕಂಡೠಬಂದಿದೆ\n"
-#: ../src/cli/report.cpp:569
+#: ../src/cli/report.cpp:572
msgid "Enter your login: "
msgstr "ನಿಮà³à²® ಲಾಗಿನೠಅನà³à²¨à³ ನಮೂದಿಸಿ: "
-#: ../src/cli/report.cpp:575
+#: ../src/cli/report.cpp:578
msgid "Enter your password: "
msgstr "ನಿಮà³à²® ಗà³à²ªà³à²¤à²ªà²¦à²µà²¨à³à²¨à³ ನಮೂದಿಸಿ: "
-#: ../src/cli/report.cpp:638
+#: ../src/cli/report.cpp:788
msgid "Reporting..."
msgstr "ವರದಿ ಮಾಡಲಾಗà³à²¤à³à²¤à²¿à²¦à³†..."
-#: ../src/cli/report.cpp:657
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:801
+#, c-format
msgid "Report using %s?"
-msgstr "%s ಅನà³à²¨à³ ಬಳಸà³à²¤à³à²¤à²¿à²¦à³†à²¯à³†? [y/N]: "
+msgstr "%s ಅನà³à²¨à³ ಬಳಸಿಕೊಂಡೠವರದಿ ಮಾಡಬೇಕೆ? "
-#: ../src/cli/report.cpp:660
+#: ../src/cli/report.cpp:804
msgid "Skipping..."
msgstr "ಕಡೆಗಣಿಸಲಾಗà³à²¤à³à²¤à²¿à²¦à³†..."
-#: ../src/cli/report.cpp:672
-#, fuzzy
+#: ../src/cli/report.cpp:820
msgid "Reporting disabled because the backtrace is unusable"
-msgstr "ಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³ ಬಳಸಲೠಯೋಗà³à²¯à²µà²¾à²—ಿರದೆ ಇರà³à²µà³à²¦à²°à²¿à²‚ದ ವರದಿ ಮಾಡà³à²µà³à²¦à²¨à³à²¨à³ ಅಶಕà³à²¤à²—ೊಳಿಸಲಾಗಿದೆ."
+msgstr "ಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³ ಬಳಸಲೠಯೋಗà³à²¯à²µà²¾à²—ಿರದೆ ಇರà³à²µà³à²¦à²°à²¿à²‚ದ ವರದಿ ಮಾಡà³à²µà³à²¦à²¨à³à²¨à³ ಅಶಕà³à²¤à²—ೊಳಿಸಲಾಗಿದೆ"
-#: ../src/cli/report.cpp:676
+#: ../src/cli/report.cpp:824
#, c-format
msgid ""
"Please try to install debuginfo manually using the command: \"debuginfo-"
"install %s\" and try again\n"
msgstr ""
+"ಈ ಆಜà³à²žà³†à²¯à²¨à³à²¨à³ ಬಳಸಿಕೊಂಡೠದೋಷನಿವಾರಣಾ ಮಾಹಿತಿಯನà³à²¨à³ ಕೈಯಾರೆ ಅನà³à²¸à³à²¥à²¾à²ªà²¿à²¸à²¿: \"debuginfo-"
+"install %s\" ಹಾಗೠನಂತರ ಪà³à²¨à²ƒ ಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à²¿\n"
-#: ../src/cli/report.cpp:685
-#, fuzzy
-msgid "Error loading reporter settings"
-msgstr "ವರದಿಯನà³à²¨à³ ಪಡೆಯà³à²µà²²à³à²²à²¿ ದೋಷ ಉಂಟಾಗಿದೆ: %s"
-
-#: ../src/cli/report.cpp:704
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:842
+#, c-format
msgid "Crash reported via %d report events (%d errors)\n"
-msgstr "ಕà³à²¸à²¿à²¤à²µà²¨à³à²¨à³ %d ಪà³à²²à²—à³â€Œà²‡à²¨à³â€Œà²—ಳ ಮೂಲಕ ವರದಿ ಮಾಡಲಾಗಿದೆ (%d ದೋಷಗಳà³)\n"
+msgstr "ಕà³à²¸à²¿à²¤à²µà²¨à³à²¨à³ %d ವರದಿ ಘಟನೆಗಳ ಮೂಲಕ ವರದಿ ಮಾಡಲಾಗಿದೆ (%d ದೋಷಗಳà³)\n"
-#: ../src/daemon/abrt-handle-crashdump.c:42
+#: ../src/daemon/abrt-action-save-package-data.c:280
msgid ""
-" [-vs] -d DIR -e EVENT\n"
-" or: "
+" [options] -d DIR\n"
+"\n"
+"Query package database and save package name, component, and description"
msgstr ""
+" [ಆಯà³à²•à³†à²—ಳà³] -d DIR\n"
+"\n"
+"ಪà³à²¯à²¾à²•à³‡à²œà³ ದತà³à²¤à²¸à²‚ಚಯಕà³à²•à³† ಮನವಿ ಸಲà³à²²à²¿à²¸à²¿ ಹಾಗೠಪà³à²¯à²¾à²•à³‡à²œà³ ಹೆಸರà³, ಘಟಕ ಹಾಗೠವಿವರಣೆಯನà³à²¨à³ ಉಳಿಸಿ"
-#: ../src/daemon/abrt-handle-crashdump.c:57
+#: ../src/daemon/abrt-action-save-package-data.c:292
+#: ../src/daemon/abrt-handle-crashdump.c:60
#: ../src/plugins/abrt-action-analyze-c.c:167
#: ../src/plugins/abrt-action-analyze-oops.c:144
#: ../src/plugins/abrt-action-analyze-python.c:49
+#: ../src/plugins/abrt-action-bugzilla.cpp:927
+#: ../src/plugins/abrt-action-generate-backtrace.c:270
+#: ../src/plugins/abrt-action-kerneloops.c:147
+#: ../src/plugins/abrt-action-mailx.c:149
+#: ../src/plugins/abrt-action-print.c:50
+#: ../src/plugins/abrt-action-rhtsupport.c:281
+#: ../src/plugins/abrt-action-upload.c:261
+msgid "Crash dump directory"
+msgstr "ಕà³à²¸à²¿à²¤à²¦ ಡಂಪೠಕೋಶ"
+
+#: ../src/daemon/abrt-action-save-package-data.c:293
+#: ../src/daemon/abrt-handle-crashdump.c:59 ../src/daemon/abrt-server.c:297
+#: ../src/plugins/abrt-action-bugzilla.cpp:926
+#: ../src/plugins/abrt-action-generate-backtrace.c:273
+#: ../src/plugins/abrt-action-kerneloops.c:146
+#: ../src/plugins/abrt-action-rhtsupport.c:280
+#: ../src/plugins/abrt-dump-oops.c:555
msgid "Log to syslog"
-msgstr ""
+msgstr "syslog ಗೆ ದಾಖಲಿಸà³"
-#: ../src/daemon/abrt-handle-crashdump.c:58
-#: ../src/plugins/abrt-action-analyze-c.c:166
-#: ../src/plugins/abrt-action-analyze-oops.c:143
-#: ../src/plugins/abrt-action-analyze-python.c:48
-#: ../src/plugins/abrt-action-mailx.cpp:150
-#: ../src/plugins/abrt-action-print.cpp:50
-#: ../src/plugins/abrt-action-upload.cpp:266
-msgid "Crash dump directory"
+#: ../src/daemon/abrt-handle-crashdump.c:43
+msgid ""
+" [-vs] -d DIR -e EVENT\n"
+" or: "
msgstr ""
+" [-vs] -d DIR -e EVENT\n"
+" or: "
-#: ../src/daemon/abrt-handle-crashdump.c:59
+#: ../src/daemon/abrt-handle-crashdump.c:61
msgid "Handle EVENT"
-msgstr ""
+msgstr "ಹà³à²¯à²¾à²‚ಡಲೠEVENT"
-#: ../src/daemon/abrt-handle-crashdump.c:60
+#: ../src/daemon/abrt-handle-crashdump.c:62
msgid "List possible events [which start with PFX]"
-msgstr ""
+msgstr "ಸಾಧà³à²¯à²µà²¿à²°à³à²µ ಘಟನೆಗಳನà³à²¨à³ ಪಟà³à²Ÿà²¿ ಮಾಡಿ [PFX ನೊಂದಿಗೆ ಆರಂಭಗೊಳà³à²³à³à²µà³à²¦à³]"
+
+#: ../src/daemon/abrt-server.c:286 ../src/daemon/Daemon.cpp:542
+msgid " [options]"
+msgstr "[ಆಯà³à²•à³†à²—ಳà³]"
-#: ../src/daemon/CommLayerServerDBus.cpp:229
+#: ../src/daemon/abrt-server.c:296
+msgid "Use UID as client uid"
+msgstr "UID ಅನà³à²¨à³ ಕà³à²²à³ˆà²‚ಟೠuid ಆಗಿ ಬಳಸಿ"
+
+#: ../src/daemon/CommLayerServerDBus.cpp:242
msgid "Comment is too long"
msgstr "ಟಿಪà³à²ªà²£à²¿à²¯à³ ಬಹಳ ಉದà³à²¦à²µà²¾à²—ಿದೆ"
-#: ../src/daemon/CommLayerServerDBus.cpp:233
+#: ../src/daemon/CommLayerServerDBus.cpp:246
msgid "'How to reproduce' is too long"
msgstr "'ಹೇಗೆ ಮರಳಿ ಉತà³à²ªà²¾à²¦à²¿à²¸à²¬à²¹à³à²¦à³' ಎನà³à²¨à³à²µà³à²¦à³ ಬಹಳ ಉದà³à²¦à²µà²¾à²—ಿದೆ"
-#: ../src/daemon/Daemon.cpp:534
+#: ../src/daemon/Daemon.cpp:371
msgid ""
"The size of the report exceeded the quota. Please check system's "
"MaxCrashReportsSize value in abrt.conf."
@@ -399,21 +415,17 @@ msgstr ""
"ವರದಿಯ ಗಾತà³à²°à²µà³ ಕೋಟವನà³à²¨à³ ಮೀರಿದೆ. abrt.conf ನಲà³à²²à²¿ ವà³à²¯à²µà²¸à³à²¥à³†à²¯ MaxCrashReportsSize ಅನà³à²¨à³ "
"ಪರಿಶೀಲಿಸಿ."
-#: ../src/daemon/Daemon.cpp:699
-msgid "abrtd [options]"
-msgstr ""
-
-#: ../src/daemon/Daemon.cpp:709
+#: ../src/daemon/Daemon.cpp:553
msgid "Do not daemonize"
-msgstr ""
+msgstr "ಡೆಮನà³â€Œ ಆಗಿ ಮಾಡಬೇಡ"
-#: ../src/daemon/Daemon.cpp:710
+#: ../src/daemon/Daemon.cpp:554
msgid "Log to syslog even with -d"
-msgstr ""
+msgstr "-d ಯೊಂದಿಗೂ ಸಹ syslog ಗೆ ದಾಖಲಿಸಿ"
-#: ../src/daemon/Daemon.cpp:711
+#: ../src/daemon/Daemon.cpp:555
msgid "Exit after SEC seconds of inactivity"
-msgstr ""
+msgstr "SEC ಸೆಕೆಂಡà³à²—ಳ ನಿಷà³à²•à³à²°à²¿à²¯à²¤à³†à²¯ ನಂತರ ನಿರà³à²—ಮಿಸà³"
#: ../src/gui/abrt.desktop.in.h:2
msgid "View and report application crashes"
@@ -425,8 +437,7 @@ msgstr ""
"ಇನà³à²¨à³Šà²‚ದೠಕà³à²²à³ˆà²‚ಟà³â€Œ ಈಗಾಗಲೆ ಚಾಲನೆಯಲà³à²²à²¿à²¦à³†, ಅದನà³à²¨à³ ಎಚà³à²šà²°à²—ೊಳಿಸಲೠಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à²²à²¾à²—à³à²¤à³à²¤à²¿à²¦à³†..."
#: ../src/gui/ABRTExceptions.py:14
-msgid ""
-"Got unexpected data from the daemon (is the database properly updated?)."
+msgid "Got unexpected data from the daemon (is the database properly updated?)."
msgstr ""
"ಡೆಮನà³â€Œà²¨à²¿à²‚ದ ಅನಿರೀಕà³à²·à²¿à²¤à²µà²¾à²¦ ದತà³à²¤à²¾à²‚ಶವೠಮರಳಿದೆ (ದತà³à²¤à²¸à²‚ಚಯವನà³à²¨à³ ಸಮರà³à²ªà²•à²µà²¾à²—ಿ ಅಪà³â€Œà²¡à³‡à²Ÿà³ "
"ಮಾಡಲಾಗಿದೆಯೆ?)."
@@ -451,16 +462,16 @@ msgstr "ವರದಿಗಾರ ಪà³à²²à²—à³â€Œà²‡à²¨à³â€Œà²—ಳà³"
msgid "Database plugins"
msgstr "ದತà³à²¤à²¸à²‚ಚಯ ಪà³à²²à²—à³â€Œà²‡à²¨à³â€Œà²—ಳà³"
-#: ../src/gui/CCDBusBackend.py:74 ../src/gui/CCDBusBackend.py:97
+#: ../src/gui/CCDBusBackend.py:75 ../src/gui/CCDBusBackend.py:98
msgid "Cannot connect to system dbus."
msgstr "ವà³à²¯à²µà²¸à³à²¥à³†à²¯ dbus ನೊಂದಿಗೆ ಸಂಪರà³à²• ಕಲà³à²ªà²¿à²¸à²²à³ ಸಾಧà³à²¯à²µà²¾à²—ಿಲà³à²²."
-#: ../src/gui/CCDBusBackend.py:120 ../src/gui/CCDBusBackend.py:123
+#: ../src/gui/CCDBusBackend.py:121 ../src/gui/CCDBusBackend.py:124
msgid "Please check if the abrt daemon is running."
msgstr "abrt ಡೆಮನೠಚಾಲನೆಯಲà³à²²à²¿à²¦à³†à²¯à³† ಎಂದೠಪರಿಶೀಲಿಸಿ."
#. FIXME: BUG: BarWindow remains. (how2reproduce: delete "component" in a dump dir and try to report it)
-#: ../src/gui/CCDBusBackend.py:169
+#: ../src/gui/CCDBusBackend.py:170
msgid ""
"Daemon did not return a valid report info.\n"
"Is debuginfo missing?"
@@ -508,11 +519,15 @@ msgstr "ABRT ಬಗೆಗಿನ ಮಾಹಿತಿ"
msgid "Copy to Clipboard"
msgstr "ನಕಲà³à²«à²²à²•à²•à³à²•à³†(ಕà³à²²à²¿à²ªà³â€Œà²¬à³‹à²°à³à²¡à²¿à²—ೆ) ಕಾಪಿ ಮಾಡà³"
-#: ../src/gui/ccgui.glade.h:12 ../src/gui/settings.glade.h:19
+#: ../src/gui/ccgui.glade.h:12
+msgid "Online _Help"
+msgstr "ಆನà³â€Œà²²à³ˆà²¨à³â€Œ ನೆರವೠ(_H)"
+
+#: ../src/gui/ccgui.glade.h:13 ../src/gui/settings.glade.h:19
msgid "Plugins"
msgstr "ಪà³à²²à²—à³â€Œà²‡à²¨à³â€Œà²—ಳà³"
-#: ../src/gui/ccgui.glade.h:14
+#: ../src/gui/ccgui.glade.h:15
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 "
@@ -540,19 +555,19 @@ msgstr ""
"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:19 ../src/gui/CReporterAssistant.py:71
+#: ../src/gui/ccgui.glade.h:20 ../src/gui/CReporterAssistant.py:111
msgid "View log"
msgstr "ದಾಖಲೆಯನà³à²¨à³ ನೋಡà³"
-#: ../src/gui/ccgui.glade.h:20
+#: ../src/gui/ccgui.glade.h:21
msgid "_Edit"
msgstr "ಸಂಪಾದನೆ (_E)"
-#: ../src/gui/ccgui.glade.h:21
+#: ../src/gui/ccgui.glade.h:22
msgid "_File"
msgstr "ಕಡತ(_F)"
-#: ../src/gui/ccgui.glade.h:22
+#: ../src/gui/ccgui.glade.h:23
msgid "_Help"
msgstr "ಸಹಾಯ (_H)"
@@ -573,7 +588,7 @@ msgstr "ಅತಿಥೇಯದ ಹೆಸರà³"
msgid "Latest Crash"
msgstr "ಇತà³à²¤à³€à²šà²¿à²¨ ಕà³à²¸à²¿à²¤"
-#: ../src/gui/CCMainWindow.py:143
+#: ../src/gui/CCMainWindow.py:148
#, python-format
msgid ""
"Cannot show the settings dialog.\n"
@@ -582,7 +597,7 @@ msgstr ""
"ಸಿದà³à²§à²¤à³†à²—ಳ ಸಂವಾದವನà³à²¨à³ ತೋರಿಸಲೠಸಾಧà³à²¯à²µà²¿à²²à³à²²\n"
"%s"
-#: ../src/gui/CCMainWindow.py:148
+#: ../src/gui/CCMainWindow.py:153
#, python-format
msgid ""
"Unable to finish the current task!\n"
@@ -592,7 +607,7 @@ msgstr ""
"%s"
#. there is something wrong with the daemon if we cant get the dumplist
-#: ../src/gui/CCMainWindow.py:183
+#: ../src/gui/CCMainWindow.py:188
#, python-format
msgid ""
"Error while loading the dumplist.\n"
@@ -601,7 +616,7 @@ msgstr ""
"ಬಿಸà³à²¡à³à²ªà²Ÿà³à²Ÿà²¿à²¯à²¨à³à²¨à³(ಡಂಪà³â€Œà²²à²¿à²¸à³à²Ÿà³) ಲೋಡೠಮಾಡà³à²µà²²à³à²²à²¿ ವಿಫಲಗೊಂಡಿದೆ.\n"
" %s"
-#: ../src/gui/CCMainWindow.py:241
+#: ../src/gui/CCMainWindow.py:246
#, python-format
msgid ""
"<b>%s Crash</b>\n"
@@ -610,11 +625,11 @@ msgstr ""
"<b>%s ಕà³à²¸à²¿à²¤</b>\n"
"%s"
-#: ../src/gui/CCMainWindow.py:337
+#: ../src/gui/CCMainWindow.py:343
msgid "You have to select a crash to copy."
msgstr "ನೀವೠಒಂದೠಕà³à²¸à²¿à²¤à²¦ ಪà³à²°à²¤à²¿à²¯à²¨à³à²¨à³ ಆಯà³à²•à³† ಮಾಡಬೇಕà³."
-#: ../src/gui/CCMainWindow.py:421
+#: ../src/gui/CCMainWindow.py:427
msgid ""
"Usage: abrt-gui [OPTIONS]\n"
"\t-v[vv]\t\t\tVerbose\n"
@@ -624,7 +639,7 @@ msgstr ""
"\t-v[vv]\t\t\tVerbose\n"
"\t--report=CRASH_ID\tDirectly report crash with CRASH_ID"
-#: ../src/gui/CCMainWindow.py:444
+#: ../src/gui/CCMainWindow.py:450
#, python-format
msgid ""
"No such crash in the database, probably wrong crashid.\n"
@@ -633,98 +648,6 @@ msgstr ""
"ದತà³à²¤à²¸à²‚ಚಯದಲà³à²²à²¿ ಅಂತಹ ಯಾವà³à²¦à³† ಕà³à²¸à²¿à²¤à²µà²¿à²²à³à²², ಬಹà³à²·à²ƒ crashid ತಪà³à²ªà²¾à²—ಿದೆ.\n"
"crashid=%s"
-#. default texts
-#: ../src/gui/CCReporterDialog.py:22 ../src/gui/CReporterAssistant.py:20
-msgid "Brief description of how to reproduce this or what you did..."
-msgstr ""
-"ಇದನà³à²¨à³ ಪà³à²¨à²ƒ ಮಾಡà³à²µà³à²¦à³ ಹೇಗೆ ಅಥವ ನೀವೠà²à²¨à³ ಮಾಡಿದà³à²¦à³€à²°à²¿ ಎನà³à²¨à³à²µà³à²¦à²° ಬಗೆಗಿನ ಸಂಕà³à²·à²¿à²ªà³à²¤ "
-"ವಿವರಣೆ..."
-
-#: ../src/gui/CCReporterDialog.py:107
-msgid "You must check the backtrace for sensitive data."
-msgstr "ಸಂವೇದಾತà³à²®à²•à²µà²¾à²¦ ದತà³à²¤à²¾à²‚ಶಕà³à²•à²¾à²—ಿ ನೀವೠಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ನೋಡಬೇಕà³"
-
-#: ../src/gui/CCReporterDialog.py:118 ../src/gui/CReporterAssistant.py:364
-#, python-format
-msgid ""
-"Reporting disabled because the backtrace is unusable.\n"
-"Please try to install debuginfo manually using the command: <b>debuginfo-"
-"install %s</b> \n"
-"then use the Refresh button to regenerate the backtrace."
-msgstr ""
-"ಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³ ಬಳಸಲೠಯೋಗà³à²¯à²µà²¾à²—ಿರದೆ ಇರà³à²µà²¦à²°à²¿à²‚ದ ವರದಿ ಮಾಡà³à²µà³à²¦à²¨à³à²¨à³ ಅಶಕà³à²¤à²—ೊಳಿಸಲಾಗಿದೆ.\n"
-"<b>debuginfo-install %s</b> ಆಜà³à²žà³†à²¯à²¨à³à²¨à³ ಬಳಸಿಕೊಂಡೠ\n"
-"ದೋಷನಿವಾರಣಾ ಮಾಹಿತಿಯನà³à²¨à³ ಅನà³à²¸à³à²¥à²¾à²ªà²¿à²¸à²¿ ನಂತರ ಪà³à²¨à²¶à³à²šà³‡à²¤à²¨à²—ೊಳಿಸೠಗà³à²‚ಡಿಯನà³à²¨à³ ಬಳಸಿಕೊಂಡೠ"
-"ಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಮರಳಿ ಉತà³à²ªà²¾à²¦à²¿à²¸à²¿."
-
-#: ../src/gui/CCReporterDialog.py:120
-msgid "The backtrace is unusable, you cannot report this!"
-msgstr "ಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³ ಬಳಸಲೠಯೋಗà³à²¯à²µà²¾à²—ಿಲà³à²². ನೀವೠಇದನà³à²¨à³ ವರದಿ ಮಾಡಲೠಸಾಧà³à²¯à²µà²¿à²²à³à²²!"
-
-#: ../src/gui/CCReporterDialog.py:124 ../src/gui/CReporterAssistant.py:342
-#: ../src/gui/CReporterAssistant.py:370
-msgid ""
-"The backtrace is incomplete, please make sure you provide the steps to "
-"reproduce."
-msgstr ""
-"ಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³ ಅಪೂರà³à²£à²—ೊಂಡಿದೆ, ಇದನà³à²¨à³ ಮರಳಿ ಉತà³à²ªà²¾à²¦à²¿à²¸à²²à³ ವಿವರಣೆಯà³à²•à³à²¤ ಸೂಚನೆಗಳನà³à²¨à³ "
-"ಒದಗಿಸಿದà³à²¦à³€à²°à²¿ ಎಂದೠಖಚಿತಪಡಿಸಿಕೊಳà³à²³à²¿."
-
-#: ../src/gui/CCReporterDialog.py:130
-msgid "Reporting disabled, please fix the problems shown above."
-msgstr ""
-"ವರದಿ ಮಾಡà³à²µà³à²¦à²¨à³à²¨à³ ಅಶಕà³à²¤à²—ೊಳಿಸಲಾಗಿದೆ, ದಯವಿಟà³à²Ÿà³ ಮೇಲೆ ತಿಳಿಸಲಾದ ತೊಂದರೆಗಳನà³à²¨à³ ಸರಿಪಡಿಸಿ."
-
-#: ../src/gui/CCReporterDialog.py:132
-msgid "Sends the report using the selected plugin."
-msgstr "ಆಯà³à²•à³† ಮಾಡಲಾದ ಪà³à²²à²—à³â€Œà²‡à²¨à³ ಅನà³à²¨à³ ಬಳಸಿಕೊಂಡೠವರದಿಯನà³à²¨à³ ಕಳಿಸà³à²¤à³à²¤à²¦à³†."
-
-#: ../src/gui/CCReporterDialog.py:398
-msgid ""
-"No reporter plugin available for this type of crash.\n"
-"Please check abrt.conf."
-msgstr ""
-"ದಯವಿಟà³à²Ÿà³ ಈ ಬಗೆಯ ಕà³à²¸à²¿à²¤à²•à³à²•à²¾à²—ಿ ಒಂದೠವರದಿಗಾರ ಪà³à²²à²—à³â€Œà²‡à²¨à³ ಲಭà³à²¯à²µà²¿à²²à³à²²\n"
-"ದಯವಿಟà³à²Ÿà³ abrt.conf ಅನà³à²¨à³ ಪರೀಕà³à²·à²¿à²¸à²¿."
-
-#: ../src/gui/CCReporterDialog.py:418 ../src/gui/CReporterAssistant.py:249
-#: ../src/gui/PluginsSettingsDialog.py:136
-#, python-format
-msgid ""
-"Cannot save plugin settings:\n"
-" %s"
-msgstr ""
-"ಪà³à²²à²—à³à²‡à²¨à³ ಸಿದà³à²§à²¤à³†à²—ಳನà³à²¨à³ ಉಳಿಸಲೠಸಾಧà³à²¯à²µà²¿à²²à³à²²:\n"
-" %s"
-
-#: ../src/gui/CCReporterDialog.py:448 ../src/gui/CReporterAssistant.py:279
-#, python-format
-msgid "Configure %s options"
-msgstr "%s ಆಯà³à²•à³†à²—ಳನà³à²¨à³ ಸಂರಚಿಸà³"
-
-#: ../src/gui/CCReporterDialog.py:498 ../src/gui/CReporterAssistant.py:1074
-msgid ""
-"Unable to get report!\n"
-"Is debuginfo missing?"
-msgstr ""
-"ವರದಿಯನà³à²¨à³ ಪಡೆಯಲೠಸಾಧà³à²¯à²µà²¾à²—ಿಲà³à²²!\n"
-"ದೋಷನಿವಾರಣಾ ಮಾಹಿತಿಯೠಕಾಣಿಸà³à²¤à³à²¤à²¿à²²à³à²²à²µà³†?"
-
-#: ../src/gui/CCReporterDialog.py:527 ../src/gui/CReporterAssistant.py:455
-#, python-format
-msgid ""
-"Reporting failed!\n"
-"%s"
-msgstr ""
-"ವರದಿ ಮಾಡà³à²µà²²à³à²²à²¿ ವಿಫಲಗೊಂಡಿದೆ!\n"
-"%s"
-
-#: ../src/gui/CCReporterDialog.py:553 ../src/gui/CCReporterDialog.py:574
-#: ../src/gui/CReporterAssistant.py:1113
-#, python-format
-msgid "Error acquiring the report: %s"
-msgstr "ವರದಿಯನà³à²¨à³ ಪಡೆಯà³à²µà²²à³à²²à²¿ ದೋಷ ಉಂಟಾಗಿದೆ: %s"
-
#: ../src/gui/ConfBackend.py:78
msgid "Cannot connect to the Gnome Keyring daemon."
msgstr "Gnome ಕೀರಿಂಗೠಡೆಮನà³â€Œà²¨à³Šà²‚ದಿಗೆ ಸಂಪರà³à²•à²¸à²¾à²§à²¿à²¸à²²à³ ಸಾಧà³à²¯à²µà²¾à²—ಿಲà³à²²."
@@ -736,8 +659,7 @@ msgid "Cannot get the default keyring."
msgstr "ಪೂರà³à²µà²¨à²¿à²¯à³‹à²œà²¿à²¤ ಕೀಲಿಸà³à²°à³à²³à²¿à²¯à²¨à³à²¨à³ ಪಡೆಯಲೠಸಾಧà³à²¯à²µà²¾à²—ಿಲà³à²²."
#: ../src/gui/ConfBackend.py:103 ../src/gui/ConfBackend.py:120
-msgid ""
-"Access to gnome-keyring has been denied, plugins settings will not be saved."
+msgid "Access to gnome-keyring has been denied, plugins settings will not be saved."
msgstr ""
"gnome-ಕೀಲಿಸà³à²°à³à²³à²¿à²¯à²¨à³à²¨à³ ನಿಲà³à²•à²¿à²¸à²¿à²•à³Šà²³à³à²³à³à²µà³à²¦à²¨à³à²¨à³ ನಿರಾಕರಿಸಲಾಗಿದೆ, ಪà³à²²à²—à³â€Œà²‡à²¨à³â€Œà²—ಳ ಸಿದà³à²§à²¤à³†à²—ಳನà³à²¨à³ "
"ಉಳಿಸಲಾಗà³à²µà³à²¦à²¿à²²à³à²²."
@@ -745,8 +667,7 @@ msgstr ""
#. we tried 2 times, so giving up the authorization
#: ../src/gui/ConfBackend.py:154
#, python-format
-msgid ""
-"Access to gnome-keyring has been denied, cannot load the settings for %s!"
+msgid "Access to gnome-keyring has been denied, cannot load the settings for %s!"
msgstr ""
"gnome-ಕೀಲಿಸà³à²°à³à²³à²¿à²¯à²¨à³à²¨à³ ನಿಲà³à²•à²¿à²¸à²¿à²•à³Šà²³à³à²³à³à²µà³à²¦à²¨à³à²¨à³ ನಿರಾಕರಿಸಲಾಗಿದೆ, %s ಗಾಗಿನ "
"ಸಿದà³à²§à²¤à³†à²—ಳನà³à²¨à³ ಲೋಡೠಮಾಡಲೠಸಾಧà³à²¯à²µà²¿à²²à³à²²!"
@@ -757,41 +678,92 @@ msgstr ""
"gnome-ಕೀಲಿಸà³à²°à³à²³à²¿à²¯à²¨à³à²¨à³ ನಿಲà³à²•à²¿à²¸à²¿à²•à³Šà²³à³à²³à³à²µà³à²¦à²¨à³à²¨à³ ನಿರಾಕರಿಸಲಾಗಿದೆ, ಸಿದà³à²§à²¤à³†à²—ಳನà³à²¨à³ ಲೋಡೠ"
"ಮಾಡಲೠಸಾಧà³à²¯à²µà²¿à²²à³à²²."
+#: ../src/gui/CReporterAssistant.py:20
+msgid "Brief description of how to reproduce this or what you did..."
+msgstr ""
+"ಇದನà³à²¨à³ ಪà³à²¨à²ƒ ಮಾಡà³à²µà³à²¦à³ ಹೇಗೆ ಅಥವ ನೀವೠà²à²¨à³ ಮಾಡಿದà³à²¦à³€à²°à²¿ ಎನà³à²¨à³à²µà³à²¦à²° ಬಗೆಗಿನ ಸಂಕà³à²·à²¿à²ªà³à²¤ "
+"ವಿವರಣೆ..."
+
#: ../src/gui/CReporterAssistant.py:21
msgid "Crash info doesn't contain a backtrace"
msgstr "ಕà³à²¸à²¿à²¤à²¦ ಮಾಹಿತಿಯೠಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಹೊಂದಿಲà³à²²"
-#: ../src/gui/CReporterAssistant.py:334
+#: ../src/gui/CReporterAssistant.py:277
+#: ../src/gui/PluginsSettingsDialog.py:136
+#, python-format
+msgid ""
+"Cannot save plugin settings:\n"
+" %s"
+msgstr ""
+"ಪà³à²²à²—à³à²‡à²¨à³ ಸಿದà³à²§à²¤à³†à²—ಳನà³à²¨à³ ಉಳಿಸಲೠಸಾಧà³à²¯à²µà²¿à²²à³à²²:\n"
+" %s"
+
+#: ../src/gui/CReporterAssistant.py:307
+#, python-format
+msgid "Configure %s options"
+msgstr "%s ಆಯà³à²•à³†à²—ಳನà³à²¨à³ ಸಂರಚಿಸà³"
+
+#: ../src/gui/CReporterAssistant.py:362
#, python-format
msgid "Rating is %s"
msgstr "ಗà³à²£à²¨à²¿à²¶à³à²šà²¯à²µà³ %s ಆಗಿದೆ"
-#: ../src/gui/CReporterAssistant.py:337
+#: ../src/gui/CReporterAssistant.py:365
msgid "Crashdump doesn't have rating => we suppose it's not required"
msgstr ""
"ಕà³à²¸à²¿à²¤à²¦ ಬಿಸà³à²¡à³(ಕà³à²°à²¾à²¶à³ ಡಂಪà³) ಒಂದೠಗà³à²£à²¨à²¿à²¶à³à²šà²¯à²µà²¨à³à²¨à³ ಹೊಂದಿಲà³à²² => ನಮà³à²® ಪà³à²°à²•à²¾à²° ಅದರ ಅಗತà³à²¯à²µà²¿à²²à³à²²"
-#: ../src/gui/CReporterAssistant.py:350
+#: ../src/gui/CReporterAssistant.py:370 ../src/gui/CReporterAssistant.py:398
+msgid ""
+"The backtrace is incomplete, please make sure you provide the steps to "
+"reproduce."
+msgstr ""
+"ಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³ ಅಪೂರà³à²£à²—ೊಂಡಿದೆ, ಇದನà³à²¨à³ ಮರಳಿ ಉತà³à²ªà²¾à²¦à²¿à²¸à²²à³ ವಿವರಣೆಯà³à²•à³à²¤ ಸೂಚನೆಗಳನà³à²¨à³ "
+"ಒದಗಿಸಿದà³à²¦à³€à²°à²¿ ಎಂದೠಖಚಿತಪಡಿಸಿಕೊಳà³à²³à²¿."
+
+#: ../src/gui/CReporterAssistant.py:378
msgid "You should check the backtrace for sensitive data."
msgstr "ಸಂವೇದಾತà³à²®à²•à²µà²¾à²¦ ದತà³à²¤à²¾à²‚ಶಕà³à²•à²¾à²—ಿ ನೀವೠಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ನೋಡಲೇ ಬೇಕಾಗà³à²¤à³à²¤à²¦à³†"
-#: ../src/gui/CReporterAssistant.py:351
+#: ../src/gui/CReporterAssistant.py:379
msgid "You must agree with sending the backtrace."
msgstr "ನೀವೠಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಕಳà³à²¹à²¿à²¸à²²à³ ಅಂಗೀಕರಿಸà³à²µà³à²¦à³ ಅಗತà³à²¯à²µà²¾à²—à³à²¤à³à²¤à²¦à³†."
-#: ../src/gui/CReporterAssistant.py:366
+#: ../src/gui/CReporterAssistant.py:392
+#, python-format
+msgid ""
+"Reporting disabled because the backtrace is unusable.\n"
+"Please try to install debuginfo manually using the command: <b>debuginfo-"
+"install %s</b> \n"
+"then use the Refresh button to regenerate the backtrace."
+msgstr ""
+"ಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³ ಬಳಸಲೠಯೋಗà³à²¯à²µà²¾à²—ಿರದೆ ಇರà³à²µà²¦à²°à²¿à²‚ದ ವರದಿ ಮಾಡà³à²µà³à²¦à²¨à³à²¨à³ ಅಶಕà³à²¤à²—ೊಳಿಸಲಾಗಿದೆ.\n"
+"<b>debuginfo-install %s</b> ಆಜà³à²žà³†à²¯à²¨à³à²¨à³ ಬಳಸಿಕೊಂಡೠ\n"
+"ದೋಷನಿವಾರಣಾ ಮಾಹಿತಿಯನà³à²¨à³ ಅನà³à²¸à³à²¥à²¾à²ªà²¿à²¸à²¿ ನಂತರ ಪà³à²¨à²¶à³à²šà³‡à²¤à²¨à²—ೊಳಿಸೠಗà³à²‚ಡಿಯನà³à²¨à³ ಬಳಸಿಕೊಂಡೠ"
+"ಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಮರಳಿ ಉತà³à²ªà²¾à²¦à²¿à²¸à²¿."
+
+#: ../src/gui/CReporterAssistant.py:394
msgid "Reporting disabled because the backtrace is unusable."
msgstr "ಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³ ಬಳಸಲೠಯೋಗà³à²¯à²µà²¾à²—ಿರದೆ ಇರà³à²µà³à²¦à²°à²¿à²‚ದ ವರದಿ ಮಾಡà³à²µà³à²¦à²¨à³à²¨à³ ಅಶಕà³à²¤à²—ೊಳಿಸಲಾಗಿದೆ."
-#: ../src/gui/CReporterAssistant.py:412
+#: ../src/gui/CReporterAssistant.py:440
msgid "You did not provide any steps to reproduce."
msgstr "ಮರಳಿ ಉತà³à²ªà²¾à²¦à²¿à²¸à²²à³ ನೀವೠಯಾವà³à²¦à³† ಕà³à²°à²®à²—ಳನà³à²¨à³ ಸೂಚಿಸಿಲà³à²²."
-#: ../src/gui/CReporterAssistant.py:426
+#: ../src/gui/CReporterAssistant.py:454
msgid "You did not provide any comments."
msgstr "ನೀವೠಯಾವà³à²¦à³† ಟಿಪà³à²ªà²£à²¿à²—ಳನà³à²¨à³ ಒದಗಿಸಿಲà³à²²."
-#: ../src/gui/CReporterAssistant.py:507
+#: ../src/gui/CReporterAssistant.py:483
+#, python-format
+msgid ""
+"Reporting failed!\n"
+"%s"
+msgstr ""
+"ವರದಿ ಮಾಡà³à²µà²²à³à²²à²¿ ವಿಫಲಗೊಂಡಿದೆ!\n"
+"%s"
+
+#: ../src/gui/CReporterAssistant.py:535
#, python-format
msgid ""
"It looks like an application from the package <b>%s</b> has crashed on your "
@@ -817,15 +789,15 @@ msgstr ""
"ದೋಷವನà³à²¨à³ ನೀವೠಎಲà³à²²à²¿ ಸಲà³à²²à²¿à²¸à²¬à³‡à²•à³ ಎಂಬà³à²¦à²¨à³à²¨à³ ಆಯà³à²•à³† ಮಾಡಿ, ಹಾಗೠಮà³à²‚ದà³à²µà²°à³†à²¯à²²à³ 'ಮà³à²‚ದಕà³à²•à³†' "
"ಅನà³à²¨à³ ಕà³à²²à²¿à²•à³ ಮಾಡಿ."
-#: ../src/gui/CReporterAssistant.py:548
+#: ../src/gui/CReporterAssistant.py:576
msgid "Only one reporter plugin is configured."
msgstr "ಕೇವಲ ಒಂದೠವರದಿಗಾರ ಪà³à²²à²—à³â€Œà²‡à²¨à³ ಅನà³à²¨à³ ಮಾತà³à²° ಸಂರಚಿಸಲಾಗಿದೆ."
-#: ../src/gui/CReporterAssistant.py:554
+#: ../src/gui/CReporterAssistant.py:582
msgid "Send a bug report"
msgstr "ಒಂದೠವರದಿಯನà³à²¨à³ ಕಳà³à²¹à²¿à²¸à²¿"
-#: ../src/gui/CReporterAssistant.py:592
+#: ../src/gui/CReporterAssistant.py:620
msgid ""
"Below is the backtrace associated with your crash. A crash backtrace "
"provides developers with details about how the crash happened, helping them "
@@ -841,134 +813,143 @@ msgstr ""
"ದಯವಿಟà³à²Ÿà³ ಈ ವರದಿಯನà³à²¨à³ ಅವಲೋಕಿಸಿ ಹಾಗೠನೀವೠಸಾರà³à²µà²œà²¨à²¿à²•à²µà²¾à²—ಿ ಹಂಚಿಕೊಳà³à²³à²²à³ ಬಯಸದೆ ಇರà³à²µà²‚ತಹ "
"ಸೂಕà³à²·à³à²® ಸಂವೇದನಾ ಮಾಹಿತಿಯನà³à²¨à³ ಇದೠಹೊಂದಿಲà³à²² ಎಂದೠಖಚಿತ ಪಡಿಸಿಕೊಳà³à²³à²¿:"
-#: ../src/gui/CReporterAssistant.py:663 ../src/gui/CReporterAssistant.py:676
-#: ../src/gui/CReporterAssistant.py:710
+#: ../src/gui/CReporterAssistant.py:691 ../src/gui/CReporterAssistant.py:704
+#: ../src/gui/CReporterAssistant.py:738
#, python-format
msgid "Found %i occurence(s) [at: %i of %i]"
-msgstr ""
+msgstr "%i ಘಟನೆ(ಗಳà³) ಕಂಡà³à²¬à²‚ದಿವೆ [ಇಲà³à²²à²¿: %i of %i]"
-#: ../src/gui/CReporterAssistant.py:747
+#: ../src/gui/CReporterAssistant.py:775
msgid "Search:"
-msgstr ""
+msgstr "ಹà³à²¡à³à²•à³:"
-#: ../src/gui/CReporterAssistant.py:778
+#: ../src/gui/CReporterAssistant.py:806
msgid "Refresh"
msgstr "ಪà³à²¨à²¶à³à²šà³‡à²¤à²¨à²—ೊಳಿಸà³"
-#: ../src/gui/CReporterAssistant.py:780
+#: ../src/gui/CReporterAssistant.py:808
msgid "Copy"
msgstr "ಕಾಪಿ ಮಾಡà³"
-#: ../src/gui/CReporterAssistant.py:786
+#: ../src/gui/CReporterAssistant.py:814
msgid "I agree with submitting the backtrace"
msgstr "ಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಕಳà³à²¹à²¿à²¸à²²à³ ನಾನೠಒಪà³à²ªà³à²¤à³à²¤à³‡à²¨à³†"
-#: ../src/gui/CReporterAssistant.py:791
+#: ../src/gui/CReporterAssistant.py:819
msgid "Approve the backtrace"
msgstr "ಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಅನà³à²®à³‹à²¦à²¿à²¸à²¿"
-#: ../src/gui/CReporterAssistant.py:834
+#: ../src/gui/CReporterAssistant.py:862
msgid "You need to fill the how to before you can proceed..."
-msgstr ""
+msgstr "ನೀವೠಮà³à²‚ದà³à²µà²°à³†à²¯à³à²µ ಮೊದಲೠಹೇಗೆ ಎನà³à²¨à³à²µà³à²¦à²¨à³à²¨à³ ತà³à²‚ಬಿಸಬೇಕà³..."
-#: ../src/gui/CReporterAssistant.py:857
+#: ../src/gui/CReporterAssistant.py:885
msgid "How did this crash happen (step-by-step)? How would you reproduce it?"
-msgstr ""
-"ಈ ಕà³à²¸à²¿à²¤à²µà³ ಹೇಗೆ ಸಂಭವಿಸಿತೠ(ಹಂತ ಹಂತವಾಗಿ)? ನೀವದನà³à²¨à³ ಹೇಗೆ ಮರಳಿ ಉತà³à²ªà²¾à²¦à²¿à²¸à²¬à²²à³à²²à²¿à²°à²¿?"
+msgstr "ಈ ಕà³à²¸à²¿à²¤à²µà³ ಹೇಗೆ ಸಂಭವಿಸಿತೠ(ಹಂತ ಹಂತವಾಗಿ)? ನೀವದನà³à²¨à³ ಹೇಗೆ ಮರಳಿ ಉತà³à²ªà²¾à²¦à²¿à²¸à²¬à²²à³à²²à²¿à²°à²¿?"
-#: ../src/gui/CReporterAssistant.py:877
-msgid ""
-"Are there any comments you would like to share with the software maintainers?"
+#: ../src/gui/CReporterAssistant.py:905
+msgid "Are there any comments you would like to share with the software maintainers?"
msgstr "ನೀವೠತಂತà³à²°à²¾à²‚ಶ ಮೇಲà³à²µà²¿à²šà²¾à²°à²•à²°à³Šà²‚ದಿಗೆ ಹಂಚಿಕೊಳà³à²³à²¬à²¹à³à²¦à²¾à²¦ ಯಾವà³à²¦à²¾à²¦à²°à³‚ ವಿಷಯಗಳಿವೆಯೆ?"
-#: ../src/gui/CReporterAssistant.py:897
+#: ../src/gui/CReporterAssistant.py:925
msgid "Provide additional details"
msgstr "ಹೆಚà³à²šà³à²µà²°à²¿ ವಿವರಗಳನà³à²¨à³ ಒದಗಿಸಿ"
-#: ../src/gui/CReporterAssistant.py:904
+#: ../src/gui/CReporterAssistant.py:932
msgid ""
"<b>Tip:</b> Your comments are not private. Please watch what you say "
"accordingly."
-msgstr ""
-"<b>ಸೂಚನೆ:</b> ನಿಮà³à²® ಟಿಪà³à²ªà²£à²¿à²—ಳೠಖಾಸಗಿಯಾಗಿರà³à²µà²¦à²¿à²²à³à²². ಆದà³à²¦à²°à²¿à²‚ದ ಯೋಚಿಸಿ ನಂತರ ಬರೆಯಿರಿ."
+msgstr "<b>ಸೂಚನೆ:</b> ನಿಮà³à²® ಟಿಪà³à²ªà²£à²¿à²—ಳೠಖಾಸಗಿಯಾಗಿರà³à²µà²¦à²¿à²²à³à²². ಆದà³à²¦à²°à²¿à²‚ದ ಯೋಚಿಸಿ ನಂತರ ಬರೆಯಿರಿ."
-#: ../src/gui/CReporterAssistant.py:945
+#: ../src/gui/CReporterAssistant.py:973
msgid "Confirm and send the report"
msgstr "ವರದಿಯನà³à²¨à³ ಖಚಿತಪಡಿಸಿ ಹಾಗೠಕಳà³à²¹à²¿à²¸à²¿"
-#: ../src/gui/CReporterAssistant.py:947
-msgid ""
-"Below is a summary of your bug report. Please click 'Apply' to submit it."
+#: ../src/gui/CReporterAssistant.py:975
+msgid "Below is a summary of your bug report. Please click 'Apply' to submit it."
msgstr ""
"ದೋಷ ವರದಿಯ ಸಾರಾಂಶವನà³à²¨à³ ಈ ಕೆಳಗೆ ನೀಡಲಾಗಿದೆ. ಸಲà³à²²à²¿à²¸à²²à³ ದಯವಿಟà³à²Ÿà³ 'ಅನà³à²µà²¯à²¿à²¸à³' ಅನà³à²¨à³ ಕà³à²²à²¿à²•à³ "
"ಮಾಡಿ."
-#: ../src/gui/CReporterAssistant.py:952
+#: ../src/gui/CReporterAssistant.py:980
msgid "<b>Basic details</b>"
msgstr "<b>ಮೂಲ ವಿವರಗಳà³</b>"
#. left table
-#: ../src/gui/CReporterAssistant.py:959
+#: ../src/gui/CReporterAssistant.py:987
msgid "Component"
msgstr "ಘಟಕ"
-#: ../src/gui/CReporterAssistant.py:960
+#: ../src/gui/CReporterAssistant.py:988
msgid "Package"
msgstr "ಪà³à²¯à²¾à²•à³‡à²œà³"
-#: ../src/gui/CReporterAssistant.py:961
+#: ../src/gui/CReporterAssistant.py:989
msgid "Executable"
msgstr "ಎಕà³à²¸à²¿à²—à³à²¯à³‚ಟೆಬಲà³"
-#: ../src/gui/CReporterAssistant.py:962
+#: ../src/gui/CReporterAssistant.py:990
msgid "Cmdline"
msgstr "Cmdline"
#. right table
-#: ../src/gui/CReporterAssistant.py:964
+#: ../src/gui/CReporterAssistant.py:992
msgid "Architecture"
msgstr "ಆರà³à²•à²¿à²Ÿà³†à²•à³à²šà²°à³"
-#: ../src/gui/CReporterAssistant.py:965
+#: ../src/gui/CReporterAssistant.py:993
msgid "Kernel"
msgstr "ಕರà³à²¨à²²à³"
-#: ../src/gui/CReporterAssistant.py:966
+#: ../src/gui/CReporterAssistant.py:994
msgid "Release"
msgstr "ಬಿಡà³à²—ಡೆ"
-#: ../src/gui/CReporterAssistant.py:967
+#: ../src/gui/CReporterAssistant.py:995
msgid "Reason"
msgstr "ಕಾರಣ"
-#: ../src/gui/CReporterAssistant.py:978 ../src/gui/report.glade.h:3
+#: ../src/gui/CReporterAssistant.py:1006 ../src/gui/report.glade.h:3
msgid "<b>Backtrace</b>"
msgstr "<b>ಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³</b>"
-#: ../src/gui/CReporterAssistant.py:981
+#: ../src/gui/CReporterAssistant.py:1009
msgid "Click to view..."
msgstr "ನೋಡಲೠಕà³à²²à²¿à²•à³ ಮಾಡಿ"
-#: ../src/gui/CReporterAssistant.py:993
+#: ../src/gui/CReporterAssistant.py:1021
msgid "<b>Steps to reproduce:</b>"
msgstr "<b>ಮರಳಿ ಉತà³à²ªà²¾à²¦à²¿à²¸à³à²µ ಹಂತಗಳà³:</b>"
-#: ../src/gui/CReporterAssistant.py:1014
+#: ../src/gui/CReporterAssistant.py:1042
msgid "<b>Comments:</b>"
msgstr "<b>ಟಿಪà³à²ªà²£à²¿à²—ಳà³:</b>"
-#: ../src/gui/CReporterAssistant.py:1017
+#: ../src/gui/CReporterAssistant.py:1045
msgid "No comment provided!"
msgstr "ಯಾವà³à²¦à³† ಟಿಪà³à²ªà²£à²¿à²¯à²¨à³à²¨à³ ಒದಗಿಸಲಾಗಿಲà³à²²!"
-#: ../src/gui/CReporterAssistant.py:1053
+#: ../src/gui/CReporterAssistant.py:1081
msgid "Finished sending the bug report"
msgstr "ದೋಷ ವರದಿಯನà³à²¨à³ ಕಳà³à²¹à²¿à²¸à³à²µà²¿à²•à³†à²¯à³ ಪೂರà³à²£à²—ೊಂಡಿದೆ"
-#: ../src/gui/CReporterAssistant.py:1057
+#: ../src/gui/CReporterAssistant.py:1085
msgid "<b>Bug reports:</b>"
msgstr "<b>ದೋಷ ವರದಿಗಳà³:</b>"
+#: ../src/gui/CReporterAssistant.py:1102
+msgid ""
+"Unable to get report!\n"
+"Is debuginfo missing?"
+msgstr ""
+"ವರದಿಯನà³à²¨à³ ಪಡೆಯಲೠಸಾಧà³à²¯à²µà²¾à²—ಿಲà³à²²!\n"
+"ದೋಷನಿವಾರಣಾ ಮಾಹಿತಿಯೠಕಾಣಿಸà³à²¤à³à²¤à²¿à²²à³à²²à²µà³†?"
+
+#: ../src/gui/CReporterAssistant.py:1139
+#, python-format
+msgid "Error acquiring the report: %s"
+msgstr "ವರದಿಯನà³à²¨à³ ಪಡೆಯà³à²µà²²à³à²²à²¿ ದೋಷ ಉಂಟಾಗಿದೆ: %s"
+
#: ../src/gui/dialogs.glade.h:1
msgid "Log"
msgstr "ದಾಖಲೆ"
@@ -1011,7 +992,6 @@ msgid "Name"
msgstr "ಹೆಸರà³"
#: ../src/gui/PluginsSettingsDialog.py:118
-#, fuzzy
msgid "Please select a plugin from the list to edit its options."
msgstr "ಪಟà³à²Ÿà²¿à²¯à²²à³à²²à²¿à²¨ ಒಂದೠಪà³à²²à²—à³â€Œà²‡à²¨à³â€Œà²¨ ಆಯà³à²•à³†à²—ಳನà³à²¨à³ ಸಂಪಾದಿಸಲೠಅದನà³à²¨à³ ಆಯà³à²•à³† ಮಾಡಿ."
@@ -1234,266 +1214,306 @@ msgstr ""
"ಸಂರಚನೆಯನà³à²¨à³ ತೆರೆಯಲೠಈ ಕೆಳಗಿನ ಗà³à²‚ಡಿಯನà³à²¨à³ ಬಳಸಿ ಹಾಗೠಮà³à²‚ದà³à²µà²°à³†à²¯à³à²µ ಮೊದಲೠಅವನà³à²¨à³ "
"ಸರಿಪಡಿಸಿ, ಇಲà³à²²à²¦à³† ಹೋದಲà³à²²à²¿ ವರದಿ ಮಾಡà³à²µà²¿à²•à³†à²¯à³ ವಿಫಲಗೊಳà³à²³à²¬à²¹à³à²¦à³.\n"
-#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.cpp:47
+#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.c:45
#, c-format
msgid "Uploaded: %llu of %llu kbytes"
-msgstr ""
+msgstr "ಆಪà³â€Œà²²à³‹à²¡à³ ಮಾಡಲಾಗಿದೆ: %llu of %llu kbytes"
-#: ../src/lib/parse_options.c:11
+#: ../src/lib/parse_options.c:29
#, c-format
msgid "Usage: %s\n"
-msgstr ""
+msgstr "ಬಳಕೆ: %s\n"
-#: ../src/plugins/abrt-action-analyze-c.c:154
+#: ../src/plugins/abrt-action-analyze-c.c:156
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID of coredumps"
msgstr ""
+" [-v] -d DIR\n"
+"\n"
+"ಕೋರೠಡಂಪà³â€Œà²—ಳ UUID ಅನà³à²¨à³ ಲೆಕà³à²• ಹಾಕಿ ಶೇಖರಿಸಿಡà³à²¤à³à²¤à²¦à³†"
-#: ../src/plugins/abrt-action-analyze-oops.c:131
+#: ../src/plugins/abrt-action-analyze-oops.c:133
msgid ""
" [-vs] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of oops crash dumps"
msgstr ""
+" [-vs] -d DIR\n"
+"\n"
+"oops ನ ಕà³à²¸à²¿à²¤à²¦ ಡಂಪà³â€Œà²—ಳ UUID ಹಾಗೠDUPHASH ಅನà³à²¨à³ ಲೆಕà³à²• ಹಾಕಿ ಶೇಖರಿಸಿಡà³à²¤à³à²¤à²¦à³†"
-#: ../src/plugins/abrt-action-analyze-python.c:36
+#: ../src/plugins/abrt-action-analyze-python.c:38
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of python crash dumps"
msgstr ""
+" [-v] -d DIR\n"
+"\n"
+"ಪೈತಾನೠಕà³à²¸à²¿à²¤à²¦ ಡಂಪà³â€Œà²—ಳ UUID ಹಾಗೠDUPHASH ಅನà³à²¨à³ ಲೆಕà³à²• ಹಾಕಿ ಶೇಖರಿಸಿಡà³à²¤à³à²¤à²¦à³†"
-#: ../src/plugins/abrt-action-bugzilla.cpp:532
+#: ../src/plugins/abrt-action-bugzilla.cpp:534
#, c-format
msgid "New bug id: %i"
msgstr "ಹೊಸ ದೋಷ ವರದಿಯ à²à²¡à²¿: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:645
+#: ../src/plugins/abrt-action-bugzilla.cpp:662
#, c-format
-msgid "Can't open '%s'"
-msgstr ""
-
-#: ../src/plugins/abrt-action-bugzilla.cpp:665
-#, fuzzy, c-format
msgid "Empty login or password, please check %s"
-msgstr ""
-"ಬಳಕೆದಾರ ಹೆಸರೠಅಥವ ಗà³à²ªà³à²¤à²ªà²¦à²µà³ ಖಾಲಿ ಇದೆ.\n"
-"ದಯವಿಟà³à²Ÿà³ ಇದನà³à²¨à³ ಪರಿಶೀಲಿಸಿ "
+msgstr "ಬಳಕೆದಾರ ಹೆಸರೠಅಥವ ಗà³à²ªà³à²¤à²ªà²¦à²µà³ ಖಾಲಿ ಇದೆ. ದಯವಿಟà³à²Ÿà³ %s ಅನà³à²¨à³ ಪರಿಶೀಲಿಸಿ"
-#: ../src/plugins/abrt-action-bugzilla.cpp:683
+#: ../src/plugins/abrt-action-bugzilla.cpp:680
msgid "Logging into bugzilla..."
msgstr "ಬಗà³â€Œà²à²¿à²²à³à²²à²¾à²—ೆ ಪà³à²°à²µà³‡à²¶à²¿à²¸à²²à²¾à²—à³à²¤à³à²¤à²¿à²¦à³†..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:686
+#: ../src/plugins/abrt-action-bugzilla.cpp:683
msgid "Checking for duplicates..."
msgstr "ದà³à²µà²¿à²ªà³à²°à²¤à²¿à²—ಳಿಗಾಗಿ ಪರಿಶೀಲಿಸಲಾಗà³à²¤à³à²¤à²¿à²¦à³†..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:707
-#: ../src/plugins/abrt-action-bugzilla.cpp:743
+#: ../src/plugins/abrt-action-bugzilla.cpp:705
+#: ../src/plugins/abrt-action-bugzilla.cpp:741
msgid "Missing mandatory member 'bugs'"
msgstr "'ದೋಷಗಳà³' ಎಂಬ ಅಗತà³à²¯ ನಮೂದೠಕಾಣಿಸà³à²¤à³à²¤à²¿à²²à³à²²"
-#: ../src/plugins/abrt-action-bugzilla.cpp:726
-#: ../src/plugins/abrt-action-bugzilla.cpp:759
-#: ../src/plugins/abrt-action-bugzilla.cpp:834
+#: ../src/plugins/abrt-action-bugzilla.cpp:724
+#: ../src/plugins/abrt-action-bugzilla.cpp:757
+#: ../src/plugins/abrt-action-bugzilla.cpp:833
msgid "get_bug_info() failed. Could not collect all mandatory information"
msgstr "get_bug_info() ವಿಫಲಗೊಂಡಿದೆ. ಎಲà³à²²à²¾ ಅಗತà³à²¯ ಮಾಹಿತಿಯನà³à²¨à³ ಸಂಗà³à²°à²¹à²¿à²¸à²²à³ ಸಾಧà³à²¯à²µà²¾à²—ಿಲà³à²²"
-#: ../src/plugins/abrt-action-bugzilla.cpp:775
+#: ../src/plugins/abrt-action-bugzilla.cpp:772
msgid "Creating a new bug..."
msgstr "ಹೊಸ ದೋಷವನà³à²¨à³ ರಚಿಸಲಾಗà³à²¤à³à²¤à²¿à²¦à³†..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:780
+#: ../src/plugins/abrt-action-bugzilla.cpp:777
msgid "Bugzilla entry creation failed"
msgstr "ಬಗà³â€Œà²à²¿à²²à³à²²à²¾ ನಮೂದನà³à²¨à³ ರಚಿಸà³à²µà²¿à²•à³†à²¯à³ ವಿಫಲಗೊಂಡಿದೆ"
-#: ../src/plugins/abrt-action-bugzilla.cpp:790
-#: ../src/plugins/abrt-action-bugzilla.cpp:887
+#: ../src/plugins/abrt-action-bugzilla.cpp:789
+#: ../src/plugins/abrt-action-bugzilla.cpp:886
msgid "Logging out..."
msgstr "ನಿರà³à²—ಮಿಸಲಾಗà³à²¤à³à²¤à²¿à²¦à³†..."
#. decision based on state
-#: ../src/plugins/abrt-action-bugzilla.cpp:808
+#: ../src/plugins/abrt-action-bugzilla.cpp:807
#, c-format
msgid "Bug is already reported: %i"
msgstr "ದೋಷವನà³à²¨à³ ಈಗಾಗಲೆ ವರದಿ ಮಾಡಲಾಗಿದೆ: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:819
+#: ../src/plugins/abrt-action-bugzilla.cpp:818
#, c-format
msgid "Bugzilla couldn't find parent of bug %d"
msgstr "ದೋಷ %d ಮೂಲವನà³à²¨à³ ಪತà³à²¤à³† ಮಾಡಲೠಬಗà³â€Œà²à²¿à²²à³à²²à²¾à²¦à²¿à²‚ದ ಸಾಧà³à²¯à²µà²¾à²—ಿಲà³à²²"
-#: ../src/plugins/abrt-action-bugzilla.cpp:848
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-bugzilla.cpp:847
+#, c-format
msgid "Add %s to CC list"
-msgstr "%s ರವರನà³à²¨à³ CC ಪಟà³à²Ÿà²¿à²—ೆ ಸೇರಿಸà³"
+msgstr "%s ಅನà³à²¨à³ CC ಪಟà³à²Ÿà²¿à²—ೆ ಸೇರಿಸà³"
-#: ../src/plugins/abrt-action-bugzilla.cpp:872
+#: ../src/plugins/abrt-action-bugzilla.cpp:871
#, c-format
msgid "Adding new comment to bug %d"
msgstr "ದೋಷಕà³à²•à³†(%d) ಒಂದೠಹೊಸ ಟಿಪà³à²ªà²£à²¿à²¯à²¨à³à²¨à³ ಸೇರಿಸಿ"
-#: ../src/plugins/abrt-action-generate-backtrace.c:319
+#: ../src/plugins/abrt-action-bugzilla.cpp:913
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to Bugzilla"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"ಕà³à²¸à²¿à²¤à²µà²¨à³à²¨à³ ಬಗà³â€Œà²à²¿à²²à³à²²à²¾à²•à³à²•à³† ವರದಿ ಮಾಡà³à²¤à³à²¤à²¦à³†"
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:928
+#: ../src/plugins/abrt-action-kerneloops.c:148
+#: ../src/plugins/abrt-action-rhtsupport.c:282
+msgid "Configuration file (may be given many times)"
+msgstr "ಸಂರಚನಾ ಕಡತ (ಹಲವೠಬಾರಿ ನೀಡಬಹà³à²¦à²¾à²—ಿರà³à²¤à³à²¤à²¦à³†)"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:258
+msgid " [options] -d DIR"
+msgstr " [ಆಯà³à²•à³†à²—ಳà³] -d DIR"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:271
+msgid "Additional debuginfo directories"
+msgstr "ಹೆಚà³à²šà³à²µà²°à²¿ ದೋಷನಿವಾರಣ ಮಾಹಿತಿ ಕೋಶಗಳà³"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:272
+msgid "Kill gdb if it runs for more than N seconds"
+msgstr "gdb ಯೠN ಸೆಕೆಂಡà³à²—ಳಿಗಿಂತ ಹೆಚà³à²šà³ ಸಮಯ ಚಲಾಯಿತಗೊಂಡಲà³à²²à²¿ ಅದನà³à²¨à³ ಕೊಲà³à²²à³"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:320
#, c-format
msgid "Backtrace parsing failed for %s"
-msgstr ""
+msgstr "%s ಗಾಗಿ ಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³ ಪಾರà³à²¸à²¿à²‚ಗೠವಿಫಲಗೊಂಡಿದೆ"
#: ../src/plugins/abrt-action-install-debuginfo.py:72
#, python-format
msgid "Extracting cpio from %s"
-msgstr ""
+msgstr "%s ಇಂದ cpio ಅನà³à²¨à³ ಹೊರತೆಗೆಯಲಾಗà³à²¤à³à²¤à²¿à²¦à³†"
#: ../src/plugins/abrt-action-install-debuginfo.py:77
msgid "Can't write to:"
-msgstr ""
+msgstr "ಇದಕà³à²•à³† ಬರೆಯಲಾಗಲಿಲà³à²²:"
#: ../src/plugins/abrt-action-install-debuginfo.py:87
msgid "Removing the temporary rpm file"
-msgstr ""
+msgstr "ತಾತà³à²•à²¾à²²à²¿à²• rpm ಕಡತವನà³à²¨à³ ತೆಗೆದೠಹಾಕಲಾಗà³à²¤à³à²¤à²¿à²¦à³†"
#: ../src/plugins/abrt-action-install-debuginfo.py:91
#, python-format
msgid "Can't extract package: %s"
-msgstr ""
+msgstr "ಈ ಪà³à²¯à²¾à²•à³‡à²œà³ ಅನà³à²¨à³ ಹೊರತೆಗೆಯಲಾಗಲಿಲà³à²²: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:99
#, python-format
msgid "Caching files from %s made from %s"
-msgstr ""
+msgstr "%s ಇಂದ %s ಇಂದ ಮಾಡಲಾದ ಕಡತಗಳನà³à²¨à³ ಶೇಖರಿಸಿಡಲಾಗà³à²¤à³à²¤à²¿à²¦à³†"
#: ../src/plugins/abrt-action-install-debuginfo.py:107
msgid "Removing the temporary cpio file"
-msgstr ""
+msgstr "ತಾತà³à²•à²¾à²²à²¿à²• cpio ಕಡತವನà³à²¨à³ ತೆಗೆದೠಹಾಕಲಾಗà³à²¤à³à²¤à²¿à²¦à³†"
#: ../src/plugins/abrt-action-install-debuginfo.py:110
#, python-format
msgid "Can't extract files from: %s"
-msgstr ""
+msgstr "ಇಂದ ಕಡತಗಳನà³à²¨à³ ಹೊರತೆಗೆಯಲಾಗಲಿಲà³à²²: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:134
#: ../src/plugins/abrt-action-install-debuginfo.py:140
#, python-format
msgid "Downloading (%i of %i) %.30s : %.3s %%"
-msgstr ""
+msgstr "(%i, %i ನಲà³à²²à²¿) %.30s ಅನà³à²¨à³ ಡೌನà³â€Œà²²à³‹à²¡à³ ಮಾಡಲಾಗà³à²¤à³à²¤à²¿à²¦à³† : %.3s %%"
#: ../src/plugins/abrt-action-install-debuginfo.py:169
-#, fuzzy
msgid "Searching the missing debuginfo packages"
-msgstr "ದೋಷ ನಿವಾರಣ ಮಾಹಿತಿ ಪà³à²¯à²¾à²•à³‡à²œà³à²—ಳಿಗಾಗಿ ಹà³à²¡à³à²•à²²à²¾à²—à³à²¤à³à²¤à²¿à²¦à³†..."
+msgstr "ಕಾಣೆಯಾದ ದೋಷನಿವಾರಣ ಮಾಹಿತಿ ಪà³à²¯à²¾à²•à³‡à²œà³à²—ಳಿಗಾಗಿ ಹà³à²¡à³à²•à²²à²¾à²—à³à²¤à³à²¤à²¿à²¦à³†"
#: ../src/plugins/abrt-action-install-debuginfo.py:224
#, python-format
msgid "To download: (%.2f) M / Installed size: %.2f M"
-msgstr ""
+msgstr "ಡೌನà³â€Œà²²à³‹à²¡à³ ಮಾಡಲೠಬಾಕಿ ಇರà³à²µà³à²¦à³: (%.2f) M / ಅನà³à²¸à³à²¥à²¾à²ªà²¿à²¸à²²à²¾à²¦ ಗಾತà³à²°: %.2f M"
#: ../src/plugins/abrt-action-install-debuginfo.py:240
msgid "Is this ok? [y/N] "
-msgstr ""
+msgstr "ಇದೠಸರಿಯಾಗಿದೆಯೆ? [y/N] "
#: ../src/plugins/abrt-action-install-debuginfo.py:257
#, python-format
msgid "Downloading package %s failed"
-msgstr ""
+msgstr "%s ಪà³à²¯à²¾à²•à³‡à²œà²¨à³à²¨à³ ಡೌನà³â€Œà²²à³‹à²¡à³ ಮಾಡà³à²µà²¿à²•à³†à²¯à³ ವಿಫಲಗೊಂಡಿದೆ"
#. recursively delete the temp dir on failure
#: ../src/plugins/abrt-action-install-debuginfo.py:268
msgid "Unpacking failed, aborting download..."
-msgstr ""
+msgstr "ಹೊರತೆಗೆಯà³à²µà²²à³à²²à²¿ ವಿಫಲಗೊಂಡಿದೆ, ಡೌನà³â€Œà²²à³‹à²¡à³ ಅನà³à²¨à³ ನಿಲà³à²²à²¿à²¸à²²à²¾à²—à³à²¤à³à²¤à²¿à²¦à³†..."
#: ../src/plugins/abrt-action-install-debuginfo.py:275
#, python-format
msgid "All downloaded packages have been extracted, removing %s"
-msgstr ""
+msgstr "ಡೌನà³â€Œà²²à³‹à²¡à³ ಮಾಡಲಾದ ಎಲà³à²²à²¾ ಪà³à²¯à²¾à²•à³‡à²œà³à²—ಳನà³à²¨à³ ಹೊರತೆಗೆಯಲಾಗಿದೆ, %s ಅನà³à²¨à³ ತೆಗೆಯಲಾಗà³à²¤à³à²¤à²¿à²¦à³†"
#: ../src/plugins/abrt-action-install-debuginfo.py:280
#, python-format
msgid "Can't remove %s, probably contains an error log"
-msgstr ""
+msgstr "%s ಅನà³à²¨à³ ತೆಗೆಯಲಾಗಿಲà³à²², ಬಹà³à²·à²ƒ ದೋಷಯà³à²•à³à²¤ ದಾಖಲೆಯನà³à²¨à³ ಹೊಂದಿರಬಹà³à²¦à³"
#: ../src/plugins/abrt-action-install-debuginfo.py:305
#, python-format
msgid "Analyzing corefile: %(corefile_path)s"
-msgstr ""
+msgstr "corefile ಅನà³à²¨à³ ವಿಶà³à²²à³‡à²·à²¿à²¸à²²à²¾à²—à³à²¤à³à²¤à²¿à²¦à³†: %(corefile_path)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:384
#, python-format
msgid "Can't remove %(tmpdir_path)s: %(reason)s"
-msgstr ""
+msgstr "%(tmpdir_path)s ಅನà³à²¨à³ ತೆಗೆದೠಹಾಕಲಾಗಲಿಲà³à²²: %(reason)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:394
msgid "Exiting on user Command"
-msgstr ""
+msgstr "ಬಳಕೆದಾರರನ ಆಜà³à²žà³†à²¯ ಮೇರೆಗೆ ನಿರà³à²—ಮಿಸಲಾಗà³à²¤à³à²¤à²¿à²¦à³†"
#: ../src/plugins/abrt-action-install-debuginfo.py:413
#, python-format
msgid "Usage: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
-msgstr ""
+msgstr "ಬಳಕೆ: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
#: ../src/plugins/abrt-action-install-debuginfo.py:442
-#, fuzzy
msgid "You have to specify the path to coredump."
-msgstr "ನೀವೠಒಂದೠಕà³à²¸à²¿à²¤à²¦ ಪà³à²°à²¤à²¿à²¯à²¨à³à²¨à³ ಆಯà³à²•à³† ಮಾಡಬೇಕà³."
+msgstr "ನೀವೠಕೋರೠಡಂಪà³â€Œà²—ೆ ಮಾರà³à²—ವನà³à²¨à³ ಸೂಚಿಸಬೇಕà³."
#: ../src/plugins/abrt-action-install-debuginfo.py:446
-#, fuzzy
msgid "You have to specify the path to cachedir."
-msgstr "ನೀವೠಒಂದೠಕà³à²¸à²¿à²¤à²¦ ಪà³à²°à²¤à²¿à²¯à²¨à³à²¨à³ ಆಯà³à²•à³† ಮಾಡಬೇಕà³."
+msgstr "ನೀವೠcachedirಗೆ ಮಾರà³à²—ವನà³à²¨à³ ಸೂಚಿಸಬೇಕà³."
#: ../src/plugins/abrt-action-install-debuginfo.py:450
-#, fuzzy
msgid "You have to specify the path to tmpdir."
-msgstr "ನೀವೠಒಂದೠಕà³à²¸à²¿à²¤à²¦ ಪà³à²°à²¤à²¿à²¯à²¨à³à²¨à³ ಆಯà³à²•à³† ಮಾಡಬೇಕà³."
+msgstr "ನೀವೠtmpdirಗೆ ಮಾರà³à²—ವನà³à²¨à³ ಸೂಚಿಸಬೇಕà³."
#: ../src/plugins/abrt-action-install-debuginfo.py:463
msgid "All debuginfo seems to be available"
-msgstr ""
+msgstr "ಎಲà³à²²à²¾ ದೋಷನಿವಾರಣಾ ಮಾಹಿತಿಯೠಲಭà³à²¯à²µà²¿à²°à³à²µà²‚ತೆ ತೋರà³à²¤à³à²¤à²¿à²¦à³†"
#: ../src/plugins/abrt-action-install-debuginfo.py:470
-#, fuzzy
msgid "Complete!"
-msgstr "ಘಟಕ"
+msgstr "ಪೂರà³à²£à²—ೊಂಡಿದೆ!"
-#: ../src/plugins/abrt-action-kerneloops.cpp:111
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-kerneloops.c:105
+#, c-format
msgid "Submitting oops report to %s"
-msgstr "'%s' ಗೆ ವರದಿಯನà³à²¨à³ ಬರೆಯಲಾಗà³à²¤à³à²¤à²¿à²¦à³†"
+msgstr "'%s' ಗೆ oops ವರದಿಯನà³à²¨à³ ಸಲà³à²²à²¿à²¸à²²à²¾à²—à³à²¤à³à²¤à²¿à²¦à³†"
-#: ../src/plugins/abrt-action-mailx.cpp:114
+#: ../src/plugins/abrt-action-kerneloops.c:133
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a kernel oops to kerneloops.org (or similar) site"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"ಕರà³à²¨à²²à³ oops ಅನà³à²¨à³ kerneloops.org (ಅಥವ ಅದೇ ರೀತಿಯ) ತಾಣಕà³à²•à³† ವರದಿ ಮಾಡಿ"
+
+#: ../src/plugins/abrt-action-mailx.c:110
msgid "Sending an email..."
msgstr "ಒಂದೠಇಮೈಲೠಅನà³à²¨à³ ಕಳà³à²¹à²¿à²¸à²²à²¾à²—à³à²¤à³à²¤à²¿à²¦à³†..."
-#: ../src/plugins/abrt-action-mailx.cpp:138
+#: ../src/plugins/abrt-action-mailx.c:137
msgid ""
" [-v] -d DIR [-c CONFFILE]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d DIR [-c CONFFILE]\n"
+"\n"
+"ಸಂಕà³à²šà²¨à²—ೊಳಿಸಲಾದ ಟಾರà³à²¬à²¾à²²à³ ಅನà³à²¨à³ ಕà³à²°à²¾à²¶à³ ಡಂಪà³â€Œà²—ೆ ಅಪà³â€Œà²²à³‹à²¡à³â€Œ ಮಾಡà³"
-#: ../src/plugins/abrt-action-mailx.cpp:151
-#: ../src/plugins/abrt-action-upload.cpp:267
-#, fuzzy
+#: ../src/plugins/abrt-action-mailx.c:150
+#: ../src/plugins/abrt-action-upload.c:262
msgid "Config file"
-msgstr "ಲಾಗರೠಕಡತ:"
+msgstr "ಸಂಕà³à²šà²¨ ಕಡತ"
-#: ../src/plugins/abrt-action-print.cpp:39
+#: ../src/plugins/abrt-action-print.c:38
msgid ""
" [-v] [-o FILE] -d DIR\n"
"\n"
"Print information about the crash to standard output"
msgstr ""
+" [-v] [-o FILE] -d DIR\n"
+"\n"
+"ಕà³à²¸à²¿à²¤à²¦ ಬಗೆಗಿನ ಮಾಹಿತಿಯನà³à²¨à³ ಶಿಷà³à²Ÿ ಔಟà³â€Œà²ªà³à²Ÿà³â€Œà²—ೆ ಮà³à²¦à³à²°à²¿à²¸à³"
-#: ../src/plugins/abrt-action-print.cpp:51
+#: ../src/plugins/abrt-action-print.c:51
msgid "Output file"
-msgstr ""
+msgstr "ಔಟà³â€Œà²ªà³à²Ÿà³ ಕಡತ"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was appended to %s"
msgstr "ವರದಿಯನà³à²¨à³ %s ಇಂದ ಸೇರಿಸಲಾಗಿದೆ"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was stored to %s"
msgstr "ವರದಿಯನà³à²¨à³ %s ಗೆ ಶೇಖರಿಸಲಾಗಿದೆ"
@@ -1501,48 +1521,84 @@ msgstr "ವರದಿಯನà³à²¨à³ %s ಗೆ ಶೇಖರಿಸಲಾಗಿದà
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
#. error msg is already logged by dd_opendir
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
-#: ../src/plugins/abrt-action-rhtsupport.cpp:43
-#: ../src/plugins/abrt-action-upload.cpp:121
+#: ../src/plugins/abrt-action-rhtsupport.c:41
+#: ../src/plugins/abrt-action-upload.c:119
msgid "Compressing data"
-msgstr ""
+msgstr "ದತà³à²¤à²¾à²‚ಶ ಸಂಕà³à²šà²¨à²—ೊಳಿಸಲಾಗà³à²¤à³à²¤à²¿à²¦à³†"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:78
-#, fuzzy
+#: ../src/plugins/abrt-action-rhtsupport.c:73
msgid "Empty login or password, please check RHTSupport.conf"
-msgstr ""
-"ಬಳಕೆದಾರ ಹೆಸರೠಅಥವ ಗà³à²ªà³à²¤à²ªà²¦à²µà³ ಖಾಲಿ ಇದೆ.\n"
-"ದಯವಿಟà³à²Ÿà³ ಇದನà³à²¨à³ ಪರಿಶೀಲಿಸಿ "
+msgstr "ಬಳಕೆದಾರ ಹೆಸರೠಅಥವ ಗà³à²ªà³à²¤à²ªà²¦à²µà³ ಖಾಲಿ ಇದೆ. ದಯವಿಟà³à²Ÿà³ ಅನà³à²¨à³ RHTSupport.conf ಪರಿಶೀಲಿಸಿ"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:194
+#: ../src/plugins/abrt-action-rhtsupport.c:192
msgid "Creating a new case..."
msgstr "ಹೊಸ ಸನà³à²¨à²¿à²µà³‡à²¶à²µà²¨à³à²¨à³ ರಚಿಸಲಾಗà³à²¤à³à²¤à²¿à²¦à³†..."
-#: ../src/plugins/abrt-action-upload.cpp:65
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-rhtsupport.c:267
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to RHTSupport"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"ಕà³à²¸à²¿à²¤à²µà²¨à³à²¨à³ RHTSupport ಗೆ ಸಲà³à²²à²¿à²¸à³"
+
+#: ../src/plugins/abrt-action-upload.c:63
+#, c-format
msgid "Sending %s to %s"
-msgstr "ಆರà³à²•à³ˆà²µà³ %s ಅನà³à²¨à³ %s ಗೆ ಕಳà³à²¹à²¿à²¸à²²à²¾à²—à³à²¤à³à²¤à²¿à²¦à³†"
+msgstr "%s ಅನà³à²¨à³ %s ಗೆ ಕಳà³à²¹à²¿à²¸à²²à²¾à²—à³à²¤à³à²¤à²¿à²¦à³†"
#. This ends up a "reporting status message" in abrtd
-#: ../src/plugins/abrt-action-upload.cpp:98
+#: ../src/plugins/abrt-action-upload.c:96
#, c-format
msgid "Successfully sent %s to %s"
-msgstr ""
+msgstr "%s ಅನà³à²¨à³ %s ಗೆ ಯಶಸà³à²µà²¿à²¯à²¾à²—ಿ ಕಳà³à²¹à²¿à²¸à²²à²¾à²—ಿದೆ"
-#: ../src/plugins/abrt-action-upload.cpp:219
+#: ../src/plugins/abrt-action-upload.c:213
#, c-format
msgid "Archive is created: '%s'"
-msgstr ""
+msgstr "ಆರà³à²•à³ˆà²µà³ ಅನà³à²¨à³ ನಿರà³à²®à²¿à²¸à²²à²¾à²—ಿದೆ: '%s'"
-#: ../src/plugins/abrt-action-upload.cpp:253
+#: ../src/plugins/abrt-action-upload.c:248
msgid ""
" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d DIR [-c CONFFILE] [-u URL\n"
+"\n"
+"ಸಂಕà³à²šà²¨à²—ೊಳಿಸಲಾದ ಟಾರà³à²¬à²¾à²²à³ ಅನà³à²¨à³ ಕà³à²°à²¾à²¶à³ ಡಂಪà³â€Œà²—ೆ ಅಪà³â€Œà²²à³‹à²¡à³â€Œ ಮಾಡà³"
-#: ../src/plugins/abrt-action-upload.cpp:268
+#: ../src/plugins/abrt-action-upload.c:263
msgid "Base URL to upload to"
+msgstr "ಅಪà³â€Œà²²à³‹à²¡à³ ಮಾಡಲೠಮೂಲ URL"
+
+#: ../src/plugins/abrt-dump-oops.c:540
+msgid ""
+" [-vsrdow] FILE\n"
+"\n"
+"Extract oops from syslog/dmesg file"
msgstr ""
+" [-vsrdow] FILE\n"
+"\n"
+"oops ಅನà³à²¨à³ syslog/dmesg ಕಡತದಿಂದ ಹೊರತೆಗೆ"
+
+#: ../src/plugins/abrt-dump-oops.c:556
+msgid "Parse kernel's message buffer before parsing FILE"
+msgstr "FILE ಅನà³à²¨à³ ಪಾರà³à²¸à³ ಮಾಡà³à²µ ಮೊದಲೆ ಕರà³à²¨à²²à³â€Œà²¨ ಸಂದೇಶ ಬಫರೠಅನà³à²¨à³ ಪಾರà³à²¸à³ ಮಾಡà³"
+
+#: ../src/plugins/abrt-dump-oops.c:557
+msgid "Create ABRT dump for every oops found"
+msgstr "ಕಂಡೠಬಂದ ಪà³à²°à²¤à²¿à²¯à³Šà²‚ದೠoops ಗಾಗಿ ABRT ಡಂಪೠಅನà³à²¨à³ ರಚಿಸಿ"
+
+#: ../src/plugins/abrt-dump-oops.c:558
+msgid "Print found oopses on standard output"
+msgstr "ಕಂಡೠಬಂದ oops ಗಳನà³à²¨à³ ಶಿಷà³à²Ÿà²µà²¾à²¦ ಔಟà³â€Œà²ªà³à²Ÿà³â€Œà²—ೆ ಮà³à²¦à³à²°à²¿à²¸à³"
+
+#: ../src/plugins/abrt-dump-oops.c:559
+msgid "Do not exit, watch the file for new oopses"
+msgstr "ನಿರà³à²—ಮಿಸಬೇಡ, ಹೊಸ oops ಗಳಿಗಾಗಿ ಕಡತವನà³à²¨à³ ನೋಡà³"
#: ../src/plugins/Bugzilla.glade.h:1
msgid "<b>Bugzilla plugin configuration</b>"
@@ -1580,10 +1636,6 @@ msgstr ""
"ಅದನà³à²¨à³ ನೀವೠ<a href=\"https://bugzilla.redhat.com/createaccount.cgi\">ಇಲà³à²²à²¿</"
"a> ರಚಿಸಬಹà³à²¦à³"
-#: ../src/plugins/CCpp.cpp:277
-msgid "Analyzes crashes in C/C++ programs"
-msgstr "C/C++ ಪà³à²°à³Šà²—à³à²°à²¾à²®à³â€Œà²—ಳಲà³à²²à²¿à²¨ ಕà³à²¸à²¿à²¤à²—ಳನà³à²¨à³ ವಿಶà³à²²à³‡à²·à²¿à²¸à³à²¤à³à²¤à²¦à³†"
-
#: ../src/plugins/KerneloopsReporter.glade.h:1
msgid "<b>Kerneloops Reporter plugin configuration</b>"
msgstr "<b>Kerneloops ವರದಿ ಮಾಡà³à²µ ಪà³à²²à²—à³â€Œà²‡à²¨à³ ಸಂರಚನೆ</b>"
@@ -1592,10 +1644,6 @@ msgstr "<b>Kerneloops ವರದಿ ಮಾಡà³à²µ ಪà³à²²à²—à³â€Œà²‡à²¨à³ à
msgid "Submit URL:"
msgstr "ಸಲà³à²²à²¿à²¸à³à²µ URL:"
-#: ../src/plugins/KerneloopsScanner.cpp:227
-msgid "Periodically scans for and saves kernel oopses"
-msgstr "ನಿರà³à²¦à²¿à²·à³à²Ÿ ಕಾಲಾವಧಿಯಲà³à²²à²¿ ಕರà³à²¨à²²à³ oopses ಗಾಗಿ ಹà³à²¡à³à²•à²¾à²¡à³à²¤à³à²¤à²¦à³† ಹಾಗೠಶೇಖರಿಸಿಡà³à²¤à³à²¤à²¦à³†"
-
#: ../src/plugins/Logger.glade.h:1
msgid "<b>Logger plugin configuration</b>"
msgstr "<b>ಲಾಗರೠಪà³à²²à²—à³â€Œà²‡à²¨à³ ಸಂರಚನೆ</b>"
@@ -1641,9 +1689,8 @@ msgid "RHTSupport URL:"
msgstr "RHTSupport URL:"
#: ../src/plugins/Upload.glade.h:1
-#, fuzzy
msgid "<b>Upload plugin configuration</b>"
-msgstr "<b>ಟಿಕೆಟೠಅಪà³â€Œà²²à³‹à²¡à²°à³ ಪà³à²²à²—à³â€Œà²‡à²¨à³ ಸಂರಚನೆ</b>"
+msgstr "<b>ಪà³à²²à²—à³â€Œà²‡à²¨à³ ಸಂರಚನೆಯನà³à²¨à³ ಅಪà³â€Œà²²à³‹à²¡à³ ಮಾಡà³</b>"
#: ../src/plugins/Upload.glade.h:2
msgid "Retry count:"
@@ -1661,6 +1708,76 @@ msgstr "URL:"
msgid "Use encryption"
msgstr "ವಿವರಣೆಯನà³à²¨à³ ಬಳಸಿ:"
+#~ msgid ""
+#~ "Usage: %s [OPTION]\n"
+#~ "\n"
+#~ "Startup:\n"
+#~ "\t-V, --version\t\tdisplay the version and exit\n"
+#~ "\t-v, --verbose\t\tincrease verbosity\n"
+#~ "Actions:\n"
+#~ "\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
+#~ "\t -f, --full\tprint a list of all crashes, including the already "
+#~ "reported ones\n"
+#~ "\t-r, --report CRASH_ID\tcreate and send a report\n"
+#~ "\t -y, --always\tcreate and send a report without asking\n"
+#~ "\t-d, --delete CRASH_ID\tremove a crash\n"
+#~ "\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
+#~ "\t -b, --backtrace\tprint detailed information about a crash "
+#~ "including backtrace\n"
+#~ "CRASH_ID can be:\n"
+#~ "\ta name of dump directory, or\n"
+#~ "\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+#~ msgstr ""
+#~ "Usage: %s [OPTION]\n"
+#~ "\n"
+#~ "Startup:\n"
+#~ "\t-V, --version\t\tdisplay the version and exit\n"
+#~ "\t-v, --verbose\t\tincrease verbosity\n"
+#~ "Actions:\n"
+#~ "\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
+#~ "\t -f, --full\tprint a list of all crashes, including the already "
+#~ "reported ones\n"
+#~ "\t-r, --report CRASH_ID\tcreate and send a report\n"
+#~ "\t -y, --always\tcreate and send a report without asking\n"
+#~ "\t-d, --delete CRASH_ID\tremove a crash\n"
+#~ "\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
+#~ "\t -b, --backtrace\tprint detailed information about a crash "
+#~ "including backtrace\n"
+#~ "CRASH_ID can be:\n"
+#~ "\ta name of dump directory, or\n"
+#~ "\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+
+#~ msgid "Error loading reporter settings"
+#~ msgstr "ವರದಿಗಾರನ ಸಿದà³à²§à²¤à³†à²—ಳನà³à²¨à³ ಲೋಡೠಮಾಡà³à²µà²²à³à²²à²¿ ದೋಷ ಉಂಟಾಗಿದೆ"
+
+#~ msgid "You must check the backtrace for sensitive data."
+#~ msgstr "ಸಂವೇದಾತà³à²®à²•à²µà²¾à²¦ ದತà³à²¤à²¾à²‚ಶಕà³à²•à²¾à²—ಿ ನೀವೠಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ನೋಡಬೇಕà³"
+
+#~ msgid "The backtrace is unusable, you cannot report this!"
+#~ msgstr "ಬà³à²¯à²¾à²•à³â€Œà²Ÿà³à²°à³‡à²¸à³ ಬಳಸಲೠಯೋಗà³à²¯à²µà²¾à²—ಿಲà³à²². ನೀವೠಇದನà³à²¨à³ ವರದಿ ಮಾಡಲೠಸಾಧà³à²¯à²µà²¿à²²à³à²²!"
+
+#~ msgid "Reporting disabled, please fix the problems shown above."
+#~ msgstr ""
+#~ "ವರದಿ ಮಾಡà³à²µà³à²¦à²¨à³à²¨à³ ಅಶಕà³à²¤à²—ೊಳಿಸಲಾಗಿದೆ, ದಯವಿಟà³à²Ÿà³ ಮೇಲೆ ತಿಳಿಸಲಾದ ತೊಂದರೆಗಳನà³à²¨à³ "
+#~ "ಸರಿಪಡಿಸಿ."
+
+#~ msgid "Sends the report using the selected plugin."
+#~ msgstr "ಆಯà³à²•à³† ಮಾಡಲಾದ ಪà³à²²à²—à³â€Œà²‡à²¨à³ ಅನà³à²¨à³ ಬಳಸಿಕೊಂಡೠವರದಿಯನà³à²¨à³ ಕಳಿಸà³à²¤à³à²¤à²¦à³†."
+
+#~ msgid ""
+#~ "No reporter plugin available for this type of crash.\n"
+#~ "Please check abrt.conf."
+#~ msgstr ""
+#~ "ದಯವಿಟà³à²Ÿà³ ಈ ಬಗೆಯ ಕà³à²¸à²¿à²¤à²•à³à²•à²¾à²—ಿ ಒಂದೠವರದಿಗಾರ ಪà³à²²à²—à³â€Œà²‡à²¨à³ ಲಭà³à²¯à²µà²¿à²²à³à²²\n"
+#~ "ದಯವಿಟà³à²Ÿà³ abrt.conf ಅನà³à²¨à³ ಪರೀಕà³à²·à²¿à²¸à²¿."
+
+#~ msgid "Analyzes crashes in C/C++ programs"
+#~ msgstr "C/C++ ಪà³à²°à³Šà²—à³à²°à²¾à²®à³â€Œà²—ಳಲà³à²²à²¿à²¨ ಕà³à²¸à²¿à²¤à²—ಳನà³à²¨à³ ವಿಶà³à²²à³‡à²·à²¿à²¸à³à²¤à³à²¤à²¦à³†"
+
+#~ msgid "Periodically scans for and saves kernel oopses"
+#~ msgstr ""
+#~ "ನಿರà³à²¦à²¿à²·à³à²Ÿ ಕಾಲಾವಧಿಯಲà³à²²à²¿ ಕರà³à²¨à²²à³ oopses ಗಾಗಿ ಹà³à²¡à³à²•à²¾à²¡à³à²¤à³à²¤à²¦à³† ಹಾಗೠಶೇಖರಿಸಿಡà³à²¤à³à²¤à²¦à³†"
+
#~ msgid "Database plugin not specified. Please check abrtd settings."
#~ msgstr ""
#~ "ದತà³à²¤à²¸à²‚ಚಯದ ಪà³à²²à²—à³â€Œà²‡à²¨à³ ಅನà³à²¨à³ ಸೂಚಿಸಲಾಗಿದೆ. ದಯವಿಟà³à²Ÿà³ abrt ಸಿದà³à²§à²¤à³†à²—ಳನà³à²¨à³ ಪರಿಶೀಲಿಸಿ."
diff --git a/po/nds.po b/po/nds.po
new file mode 100644
index 00000000..3f910bd1
--- /dev/null
+++ b/po/nds.po
@@ -0,0 +1,1581 @@
+# translation of abrt.master.nds.po to Low German
+# Nils-Christoph Fiedler <ncfiedler@fedoraproject.org>, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: abrt.master.nds\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-12-02 20:58+0000\n"
+"PO-Revision-Date: 2010-12-03 21:28+0100\n"
+"Last-Translator: Nils-Christoph Fiedler <ncfiedler@gnome.org>\n"
+"Language-Team: Low German <nds-lowgerman@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nds\n"
+"X-Poedit-Language: Low German\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: ../src/applet/abrt-applet.desktop.in.h:1
+msgid "ABRT notification applet"
+msgstr ""
+
+#: ../src/applet/abrt-applet.desktop.in.h:2
+#: ../src/gui/abrt.desktop.in.h:1
+#: ../src/gui/ccgui.glade.h:10
+#: ../src/gui/CCMainWindow.py:8
+#: ../src/gui/report.glade.h:16
+msgid "Automatic Bug Reporting Tool"
+msgstr ""
+
+#: ../src/applet/Applet.cpp:86
+#, c-format
+msgid "A crash in the %s package has been detected"
+msgstr ""
+
+#: ../src/applet/Applet.cpp:88
+msgid "A crash has been detected"
+msgstr ""
+
+#: ../src/applet/Applet.cpp:285
+msgid "ABRT service is not running"
+msgstr ""
+
+#: ../src/applet/applet_gtk.c:176
+#: ../src/applet/applet_gtk.c:178
+#: ../src/applet/applet_gtk.c:367
+#: ../src/applet/applet_gtk.c:394
+msgid "Warning"
+msgstr ""
+
+#: ../src/applet/applet_gtk.c:230
+msgid "Notification area applet that notifies users about issues detected by ABRT"
+msgstr ""
+
+#: ../src/applet/applet_gtk.c:246
+#: ../src/gui/ccgui.glade.h:23
+msgid "translator-credits"
+msgstr ""
+
+#: ../src/applet/applet_gtk.c:256
+msgid "Hide"
+msgstr "Verbargen"
+
+#: ../src/applet/applet_gtk.c:360
+#: ../src/gui/ccgui.glade.h:13
+msgid "Report"
+msgstr "Berichten"
+
+#: ../src/applet/applet_gtk.c:363
+#: ../src/applet/applet_gtk.c:391
+msgid "Open ABRT"
+msgstr "ABRT opmaken"
+
+#: ../src/cli/CLI.cpp:47
+#, c-format
+msgid ""
+"\tCrash dump : %s\n"
+"\tUID : %s\n"
+"\tPackage : %s\n"
+"\tExecutable : %s\n"
+"\tCrash Time : %s\n"
+"\tCrash Count: %s\n"
+msgstr ""
+
+#: ../src/cli/CLI.cpp:65
+#, c-format
+msgid "\tHostname : %s\n"
+msgstr ""
+
+#: ../src/cli/CLI.cpp:98
+#, c-format
+msgid ""
+"Dump directory: %s\n"
+"Last crash: %s\n"
+"Analyzer: %s\n"
+"Component: %s\n"
+"Package: %s\n"
+"Command: %s\n"
+"Executable: %s\n"
+"System: %s, kernel %s\n"
+"Reason: %s\n"
+msgstr ""
+
+#: ../src/cli/CLI.cpp:125
+#, c-format
+msgid "Coredump file: %s\n"
+msgstr ""
+
+#: ../src/cli/CLI.cpp:129
+#, c-format
+msgid "Rating: %s\n"
+msgstr ""
+
+#: ../src/cli/CLI.cpp:134
+#, c-format
+msgid "Crash function: %s\n"
+msgstr ""
+
+#: ../src/cli/CLI.cpp:138
+#, c-format
+msgid "Hostname: %s\n"
+msgstr ""
+
+#: ../src/cli/CLI.cpp:142
+#, c-format
+msgid ""
+"\n"
+"How to reproduce:\n"
+"%s\n"
+msgstr ""
+
+#: ../src/cli/CLI.cpp:146
+#, c-format
+msgid ""
+"\n"
+"Comment:\n"
+"%s\n"
+msgstr ""
+
+#: ../src/cli/CLI.cpp:152
+#, c-format
+msgid ""
+"\n"
+"Backtrace:\n"
+"%s\n"
+msgstr ""
+
+#. Message has embedded tabs.
+#: ../src/cli/CLI.cpp:243
+#, c-format
+msgid ""
+"Usage: %s [OPTION]\n"
+"\n"
+"Startup:\n"
+"\t-V, --version\t\tdisplay the version of %s and exit\n"
+"\t-?, --help\t\tprint this help\n"
+"\n"
+"Actions:\n"
+"\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
+"\t -f, --full\tprint a list of all crashes, including the already reported ones\n"
+"\t-r, --report CRASH_ID\tcreate and send a report\n"
+"\t -y, --always\tcreate and send a report without asking\n"
+"\t-d, --delete CRASH_ID\tremove a crash\n"
+"\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
+"\t -b, --backtrace\tprint detailed information about a crash including backtrace\n"
+"CRASH_ID can be:\n"
+"\ta name of dump directory, or\n"
+"\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+msgstr ""
+
+#: ../src/cli/CLI.cpp:287
+msgid "You must specify exactly one operation"
+msgstr ""
+
+#: ../src/cli/report.cpp:166
+#, c-format
+msgid "# This field is read only\n"
+msgstr ""
+
+#: ../src/cli/report.cpp:186
+msgid "# Describe the circumstances of this crash below"
+msgstr ""
+
+#: ../src/cli/report.cpp:188
+msgid "# How to reproduce the crash?"
+msgstr ""
+
+#: ../src/cli/report.cpp:190
+msgid ""
+"# Backtrace\n"
+"# Check that it does not contain any sensitive data (passwords, etc.)"
+msgstr ""
+
+#: ../src/cli/report.cpp:192
+msgid "# Architecture"
+msgstr ""
+
+#: ../src/cli/report.cpp:193
+msgid "# Command line"
+msgstr ""
+
+#: ../src/cli/report.cpp:194
+msgid "# Component"
+msgstr ""
+
+#: ../src/cli/report.cpp:195
+msgid "# Core dump"
+msgstr ""
+
+#: ../src/cli/report.cpp:196
+msgid "# Executable"
+msgstr ""
+
+#: ../src/cli/report.cpp:197
+msgid "# Kernel version"
+msgstr "# Kernel verschoon"
+
+#: ../src/cli/report.cpp:198
+msgid "# Package"
+msgstr "# Paket"
+
+#: ../src/cli/report.cpp:199
+msgid "# Reason of crash"
+msgstr ""
+
+#: ../src/cli/report.cpp:200
+msgid "# Release string of the operating system"
+msgstr ""
+
+#: ../src/cli/report.cpp:323
+msgid "Cannot run vi: $TERM, $VISUAL and $EDITOR are not set"
+msgstr ""
+
+#: ../src/cli/report.cpp:411
+msgid ""
+"\n"
+"The report has been updated"
+msgstr ""
+
+#: ../src/cli/report.cpp:413
+msgid ""
+"\n"
+"No changes were detected in the report"
+msgstr ""
+
+#. The response might take more than 1 char in non-latin scripts.
+#: ../src/cli/report.cpp:464
+msgid "y"
+msgstr "y"
+
+#: ../src/cli/report.cpp:465
+msgid "N"
+msgstr "N"
+
+#. Read the missing information and push it to plugin settings.
+#: ../src/cli/report.cpp:582
+#, c-format
+msgid "Wrong settings were detected for plugin %s\n"
+msgstr ""
+
+#: ../src/cli/report.cpp:586
+msgid "Enter your login: "
+msgstr "Anmelldaten ingeven:"
+
+#: ../src/cli/report.cpp:592
+msgid "Enter your password: "
+msgstr "Passwoord ingeven:"
+
+#: ../src/cli/report.cpp:654
+msgid "Reporting..."
+msgstr ""
+
+#: ../src/cli/report.cpp:673
+#, c-format
+msgid "Report using %s?"
+msgstr ""
+
+#: ../src/cli/report.cpp:676
+msgid "Skipping..."
+msgstr ""
+
+#: ../src/cli/report.cpp:688
+msgid "Reporting disabled because the backtrace is unusable"
+msgstr ""
+
+#: ../src/cli/report.cpp:692
+#, c-format
+msgid "Please try to install debuginfo manually using the command: \"debuginfo-install %s\" and try again\n"
+msgstr ""
+
+#: ../src/cli/report.cpp:701
+msgid "Error loading reporter settings"
+msgstr ""
+
+#: ../src/cli/report.cpp:721
+#, c-format
+msgid "Crash reported via %d report events (%d errors)\n"
+msgstr ""
+
+#: ../src/daemon/abrt-handle-crashdump.c:42
+msgid ""
+" [-vs] -d DIR -e EVENT\n"
+" or: "
+msgstr ""
+
+#: ../src/daemon/abrt-handle-crashdump.c:57
+#: ../src/plugins/abrt-action-analyze-c.c:167
+#: ../src/plugins/abrt-action-analyze-oops.c:144
+#: ../src/plugins/abrt-action-analyze-python.c:49
+msgid "Log to syslog"
+msgstr ""
+
+#: ../src/daemon/abrt-handle-crashdump.c:58
+#: ../src/plugins/abrt-action-analyze-c.c:166
+#: ../src/plugins/abrt-action-analyze-oops.c:143
+#: ../src/plugins/abrt-action-analyze-python.c:48
+#: ../src/plugins/abrt-action-mailx.cpp:150
+#: ../src/plugins/abrt-action-print.cpp:50
+#: ../src/plugins/abrt-action-upload.cpp:266
+msgid "Crash dump directory"
+msgstr ""
+
+#: ../src/daemon/abrt-handle-crashdump.c:59
+msgid "Handle EVENT"
+msgstr ""
+
+#: ../src/daemon/abrt-handle-crashdump.c:60
+msgid "List possible events [which start with PFX]"
+msgstr ""
+
+#: ../src/daemon/CommLayerServerDBus.cpp:229
+msgid "Comment is too long"
+msgstr ""
+
+#: ../src/daemon/CommLayerServerDBus.cpp:233
+msgid "'How to reproduce' is too long"
+msgstr ""
+
+#: ../src/daemon/Daemon.cpp:534
+msgid "The size of the report exceeded the quota. Please check system's MaxCrashReportsSize value in abrt.conf."
+msgstr ""
+
+#: ../src/daemon/Daemon.cpp:699
+msgid "abrtd [options]"
+msgstr ""
+
+#: ../src/daemon/Daemon.cpp:709
+msgid "Do not daemonize"
+msgstr ""
+
+#: ../src/daemon/Daemon.cpp:710
+msgid "Log to syslog even with -d"
+msgstr ""
+
+#: ../src/daemon/Daemon.cpp:711
+msgid "Exit after SEC seconds of inactivity"
+msgstr ""
+
+#: ../src/gui/abrt.desktop.in.h:2
+msgid "View and report application crashes"
+msgstr ""
+
+#: ../src/gui/ABRTExceptions.py:7
+msgid "Another client is already running, trying to wake it..."
+msgstr ""
+
+#: ../src/gui/ABRTExceptions.py:14
+msgid "Got unexpected data from the daemon (is the database properly updated?)."
+msgstr ""
+
+#: ../src/gui/ABRTPlugin.py:64
+msgid "Not loaded plugins"
+msgstr ""
+
+#: ../src/gui/ABRTPlugin.py:65
+msgid "Analyzer plugins"
+msgstr ""
+
+#: ../src/gui/ABRTPlugin.py:66
+msgid "Action plugins"
+msgstr ""
+
+#: ../src/gui/ABRTPlugin.py:67
+msgid "Reporter plugins"
+msgstr ""
+
+#: ../src/gui/ABRTPlugin.py:68
+msgid "Database plugins"
+msgstr ""
+
+#: ../src/gui/CCDBusBackend.py:74
+#: ../src/gui/CCDBusBackend.py:97
+msgid "Cannot connect to system dbus."
+msgstr ""
+
+#: ../src/gui/CCDBusBackend.py:120
+#: ../src/gui/CCDBusBackend.py:123
+msgid "Please check if the abrt daemon is running."
+msgstr ""
+
+#. FIXME: BUG: BarWindow remains. (how2reproduce: delete "component" in a dump dir and try to report it)
+#: ../src/gui/CCDBusBackend.py:169
+msgid ""
+"Daemon did not return a valid report info.\n"
+"Is debuginfo missing?"
+msgstr ""
+
+#: ../src/gui/ccgui.glade.h:1
+msgid "(C) 2009, 2010 Red Hat, Inc."
+msgstr "(C) 2009, 2010 Red Hat, Inc."
+
+#: ../src/gui/ccgui.glade.h:2
+msgid "<b>Bug Reports:</b>"
+msgstr ""
+
+#: ../src/gui/ccgui.glade.h:3
+msgid "<b>Command:</b>"
+msgstr ""
+
+#: ../src/gui/ccgui.glade.h:4
+msgid "<b>Comment:</b>"
+msgstr ""
+
+#: ../src/gui/ccgui.glade.h:5
+msgid "<b>Crash Count:</b>"
+msgstr ""
+
+#: ../src/gui/ccgui.glade.h:6
+msgid "<b>Latest Crash:</b>"
+msgstr ""
+
+#: ../src/gui/ccgui.glade.h:7
+msgid "<b>Reason:</b>"
+msgstr "<b>Grund:</b>"
+
+#: ../src/gui/ccgui.glade.h:8
+msgid "<b>User:</b>"
+msgstr "<b>Bruker:</b>"
+
+#: ../src/gui/ccgui.glade.h:9
+msgid "About ABRT"
+msgstr "Över ABRT"
+
+#: ../src/gui/ccgui.glade.h:11
+msgid "Copy to Clipboard"
+msgstr ""
+
+#: ../src/gui/ccgui.glade.h:12
+#: ../src/gui/settings.glade.h:19
+msgid "Plugins"
+msgstr ""
+
+#: ../src/gui/ccgui.glade.h:14
+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 ""
+
+#: ../src/gui/ccgui.glade.h:19
+#: ../src/gui/CReporterAssistant.py:111
+msgid "View log"
+msgstr "Log opwiesen"
+
+#: ../src/gui/ccgui.glade.h:20
+msgid "_Edit"
+msgstr "_Bewarken"
+
+#: ../src/gui/ccgui.glade.h:21
+msgid "_File"
+msgstr "_Datei"
+
+#: ../src/gui/ccgui.glade.h:22
+msgid "_Help"
+msgstr "_Hölp"
+
+#. add pixbuff separatelly
+#: ../src/gui/CCMainWindow.py:63
+msgid "Reported"
+msgstr ""
+
+#: ../src/gui/CCMainWindow.py:71
+msgid "Application"
+msgstr "Programm"
+
+#: ../src/gui/CCMainWindow.py:73
+msgid "Hostname"
+msgstr ""
+
+#: ../src/gui/CCMainWindow.py:75
+msgid "Latest Crash"
+msgstr ""
+
+#: ../src/gui/CCMainWindow.py:143
+#, python-format
+msgid ""
+"Cannot show the settings dialog.\n"
+"%s"
+msgstr ""
+
+#: ../src/gui/CCMainWindow.py:148
+#, python-format
+msgid ""
+"Unable to finish the current task!\n"
+"%s"
+msgstr ""
+
+#. there is something wrong with the daemon if we cant get the dumplist
+#: ../src/gui/CCMainWindow.py:183
+#, python-format
+msgid ""
+"Error while loading the dumplist.\n"
+"%s"
+msgstr ""
+
+#: ../src/gui/CCMainWindow.py:241
+#, python-format
+msgid ""
+"<b>%s Crash</b>\n"
+"%s"
+msgstr ""
+
+#: ../src/gui/CCMainWindow.py:337
+msgid "You have to select a crash to copy."
+msgstr ""
+
+#: ../src/gui/CCMainWindow.py:421
+msgid ""
+"Usage: abrt-gui [OPTIONS]\n"
+"\t-v[vv]\t\t\tVerbose\n"
+"\t--report=CRASH_ID\tDirectly report crash with CRASH_ID"
+msgstr ""
+
+#: ../src/gui/CCMainWindow.py:444
+#, python-format
+msgid ""
+"No such crash in the database, probably wrong crashid.\n"
+"crashid=%s"
+msgstr ""
+
+#. default texts
+#: ../src/gui/CCReporterDialog.py:22
+#: ../src/gui/CReporterAssistant.py:20
+msgid "Brief description of how to reproduce this or what you did..."
+msgstr ""
+
+#: ../src/gui/CCReporterDialog.py:107
+msgid "You must check the backtrace for sensitive data."
+msgstr ""
+
+#: ../src/gui/CCReporterDialog.py:118
+#: ../src/gui/CReporterAssistant.py:392
+#, python-format
+msgid ""
+"Reporting disabled because the backtrace is unusable.\n"
+"Please try to install debuginfo manually using the command: <b>debuginfo-install %s</b> \n"
+"then use the Refresh button to regenerate the backtrace."
+msgstr ""
+
+#: ../src/gui/CCReporterDialog.py:120
+msgid "The backtrace is unusable, you cannot report this!"
+msgstr ""
+
+#: ../src/gui/CCReporterDialog.py:124
+#: ../src/gui/CReporterAssistant.py:370
+#: ../src/gui/CReporterAssistant.py:398
+msgid "The backtrace is incomplete, please make sure you provide the steps to reproduce."
+msgstr ""
+
+#: ../src/gui/CCReporterDialog.py:130
+msgid "Reporting disabled, please fix the problems shown above."
+msgstr ""
+
+#: ../src/gui/CCReporterDialog.py:132
+msgid "Sends the report using the selected plugin."
+msgstr ""
+
+#: ../src/gui/CCReporterDialog.py:398
+msgid ""
+"No reporter plugin available for this type of crash.\n"
+"Please check abrt.conf."
+msgstr ""
+
+#: ../src/gui/CCReporterDialog.py:418
+#: ../src/gui/CReporterAssistant.py:277
+#: ../src/gui/PluginsSettingsDialog.py:136
+#, python-format
+msgid ""
+"Cannot save plugin settings:\n"
+" %s"
+msgstr ""
+
+#: ../src/gui/CCReporterDialog.py:448
+#: ../src/gui/CReporterAssistant.py:307
+#, python-format
+msgid "Configure %s options"
+msgstr ""
+
+#: ../src/gui/CCReporterDialog.py:498
+#: ../src/gui/CReporterAssistant.py:1102
+msgid ""
+"Unable to get report!\n"
+"Is debuginfo missing?"
+msgstr ""
+
+#: ../src/gui/CCReporterDialog.py:527
+#: ../src/gui/CReporterAssistant.py:483
+#, python-format
+msgid ""
+"Reporting failed!\n"
+"%s"
+msgstr ""
+
+#: ../src/gui/CCReporterDialog.py:553
+#: ../src/gui/CCReporterDialog.py:574
+#: ../src/gui/CReporterAssistant.py:1139
+#, python-format
+msgid "Error acquiring the report: %s"
+msgstr ""
+
+#: ../src/gui/ConfBackend.py:78
+msgid "Cannot connect to the Gnome Keyring daemon."
+msgstr ""
+
+#. could happen if keyring daemon is running, but we run gui under
+#. user who is not the owner of the running session - using su
+#: ../src/gui/ConfBackend.py:84
+msgid "Cannot get the default keyring."
+msgstr ""
+
+#: ../src/gui/ConfBackend.py:103
+#: ../src/gui/ConfBackend.py:120
+msgid "Access to gnome-keyring has been denied, plugins settings will not be saved."
+msgstr ""
+
+#. we tried 2 times, so giving up the authorization
+#: ../src/gui/ConfBackend.py:154
+#, python-format
+msgid "Access to gnome-keyring has been denied, cannot load the settings for %s!"
+msgstr ""
+
+#: ../src/gui/ConfBackend.py:207
+msgid "Access to gnome-keyring has been denied, cannot load settings."
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:21
+msgid "Crash info doesn't contain a backtrace"
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:362
+#, python-format
+msgid "Rating is %s"
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:365
+msgid "Crashdump doesn't have rating => we suppose it's not required"
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:378
+msgid "You should check the backtrace for sensitive data."
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:379
+msgid "You must agree with sending the backtrace."
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:394
+msgid "Reporting disabled because the backtrace is unusable."
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:440
+msgid "You did not provide any steps to reproduce."
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:454
+msgid "You did not provide any comments."
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:535
+#, python-format
+msgid ""
+"It looks like an application from the package <b>%s</b> has crashed on your system. It is a good idea to send a bug report about this issue. The report will provide software maintainers with information essential in figuring out how to provide a bug fix for you.\n"
+"\n"
+"Please review the information that follows and modify it as needed to ensure your bug report does not contain any sensitive data you would rather not share.\n"
+"\n"
+"Select where you would like to report the bug, and press 'Forward' to continue."
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:576
+msgid "Only one reporter plugin is configured."
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:582
+msgid "Send a bug report"
+msgstr "Fehlerreport sennen"
+
+#: ../src/gui/CReporterAssistant.py:620
+msgid ""
+"Below is the backtrace associated with your crash. A crash backtrace provides developers with details about how the crash happened, helping them track down the source of the problem.\n"
+"\n"
+"Please review the backtrace below and modify it as needed to ensure your bug report does not contain any sensitive data you would rather not share:"
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:691
+#: ../src/gui/CReporterAssistant.py:704
+#: ../src/gui/CReporterAssistant.py:738
+#, python-format
+msgid "Found %i occurence(s) [at: %i of %i]"
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:775
+msgid "Search:"
+msgstr "Sök:"
+
+# NO TRADUCIR, hacen referencia al boton gkt
+#: ../src/gui/CReporterAssistant.py:806
+msgid "Refresh"
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:808
+msgid "Copy"
+msgstr "Koperen"
+
+#: ../src/gui/CReporterAssistant.py:814
+msgid "I agree with submitting the backtrace"
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:819
+msgid "Approve the backtrace"
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:862
+msgid "You need to fill the how to before you can proceed..."
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:885
+msgid "How did this crash happen (step-by-step)? How would you reproduce it?"
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:905
+msgid "Are there any comments you would like to share with the software maintainers?"
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:925
+msgid "Provide additional details"
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:932
+msgid "<b>Tip:</b> Your comments are not private. Please watch what you say accordingly."
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:973
+msgid "Confirm and send the report"
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:975
+msgid "Below is a summary of your bug report. Please click 'Apply' to submit it."
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:980
+msgid "<b>Basic details</b>"
+msgstr ""
+
+#. left table
+#: ../src/gui/CReporterAssistant.py:987
+msgid "Component"
+msgstr "Komponente"
+
+#: ../src/gui/CReporterAssistant.py:988
+msgid "Package"
+msgstr "Paket"
+
+#: ../src/gui/CReporterAssistant.py:989
+msgid "Executable"
+msgstr "Utföhrbar"
+
+#: ../src/gui/CReporterAssistant.py:990
+msgid "Cmdline"
+msgstr ""
+
+#. right table
+#: ../src/gui/CReporterAssistant.py:992
+msgid "Architecture"
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:993
+msgid "Kernel"
+msgstr "Kernel"
+
+#: ../src/gui/CReporterAssistant.py:994
+msgid "Release"
+msgstr "Veröpenlichen"
+
+#: ../src/gui/CReporterAssistant.py:995
+msgid "Reason"
+msgstr "Grund"
+
+#: ../src/gui/CReporterAssistant.py:1006
+#: ../src/gui/report.glade.h:3
+msgid "<b>Backtrace</b>"
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:1009
+msgid "Click to view..."
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:1021
+msgid "<b>Steps to reproduce:</b>"
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:1042
+msgid "<b>Comments:</b>"
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:1045
+msgid "No comment provided!"
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:1081
+msgid "Finished sending the bug report"
+msgstr ""
+
+#: ../src/gui/CReporterAssistant.py:1085
+msgid "<b>Bug reports:</b>"
+msgstr ""
+
+#: ../src/gui/dialogs.glade.h:1
+msgid "Log"
+msgstr "Log"
+
+#: ../src/gui/dialogs.glade.h:2
+msgid "Report done"
+msgstr ""
+
+#: ../src/gui/PluginSettingsUI.py:18
+msgid "Cannot find PluginDialog widget in the UI description!"
+msgstr ""
+
+#: ../src/gui/PluginSettingsUI.py:25
+#, python-format
+msgid ""
+"No UI for the plugin <b>%s</b>, this is probably a bug.\n"
+"Please report it at <a href=\"https://fedorahosted.org/abrt/newticket\">https://fedorahosted.org/abrt/newticket</a>"
+msgstr ""
+
+#: ../src/gui/PluginSettingsUI.py:60
+#: ../src/gui/PluginSettingsUI.py:86
+msgid "Combo box is not implemented"
+msgstr ""
+
+#: ../src/gui/PluginSettingsUI.py:69
+msgid "Nothing to hydrate!"
+msgstr ""
+
+#: ../src/gui/PluginsSettingsDialog.py:25
+msgid "Cannot load the GUI description for SettingsDialog!"
+msgstr ""
+
+#. Create/configure columns and add them to pluginlist
+#. column "name" has two kind of cells:
+#: ../src/gui/PluginsSettingsDialog.py:42
+msgid "Name"
+msgstr "Naam"
+
+#: ../src/gui/PluginsSettingsDialog.py:118
+msgid "Please select a plugin from the list to edit its options."
+msgstr ""
+
+#: ../src/gui/PluginsSettingsDialog.py:126
+#, python-format
+msgid ""
+"Error while opening the plugin settings UI: \n"
+"\n"
+"%s"
+msgstr ""
+
+#: ../src/gui/progress_window.glade.h:1
+#: ../src/gui/report.glade.h:17
+msgid "Details"
+msgstr "Details"
+
+#: ../src/gui/progress_window.glade.h:2
+#: ../src/gui/report.glade.h:21
+msgid "Please wait..."
+msgstr "Bidde töven..."
+
+#: ../src/gui/report.glade.h:1
+msgid " "
+msgstr ""
+
+#: ../src/gui/report.glade.h:2
+msgid "<b>Attachments</b>"
+msgstr ""
+
+#: ../src/gui/report.glade.h:4
+msgid "<b>Comment</b>"
+msgstr ""
+
+#: ../src/gui/report.glade.h:5
+msgid "<b>How to reproduce (in a few simple steps)</b>"
+msgstr ""
+
+#: ../src/gui/report.glade.h:6
+msgid "<b>Please fix the following problems:</b>"
+msgstr ""
+
+#: ../src/gui/report.glade.h:7
+msgid "<b>Where do you want to report this incident?</b>"
+msgstr ""
+
+#: ../src/gui/report.glade.h:8
+msgid "<span fgcolor=\"blue\">Architecture:</span>"
+msgstr ""
+
+#: ../src/gui/report.glade.h:9
+msgid "<span fgcolor=\"blue\">Cmdline:</span>"
+msgstr ""
+
+#: ../src/gui/report.glade.h:10
+msgid "<span fgcolor=\"blue\">Component:</span>"
+msgstr ""
+
+#: ../src/gui/report.glade.h:11
+msgid "<span fgcolor=\"blue\">Executable:</span>"
+msgstr ""
+
+#: ../src/gui/report.glade.h:12
+msgid "<span fgcolor=\"blue\">Kernel:</span>"
+msgstr ""
+
+#: ../src/gui/report.glade.h:13
+msgid "<span fgcolor=\"blue\">Package:</span>"
+msgstr ""
+
+#: ../src/gui/report.glade.h:14
+msgid "<span fgcolor=\"blue\">Reason:</span>"
+msgstr ""
+
+#: ../src/gui/report.glade.h:15
+msgid "<span fgcolor=\"blue\">Release:</span>"
+msgstr ""
+
+#: ../src/gui/report.glade.h:18
+msgid "Forces ABRT to regenerate the backtrace."
+msgstr ""
+
+#: ../src/gui/report.glade.h:19
+msgid "I checked the backtrace and removed sensitive data (passwords, etc)"
+msgstr ""
+
+#: ../src/gui/report.glade.h:20
+msgid "N/A"
+msgstr "N/A"
+
+#: ../src/gui/report.glade.h:22
+msgid "Reporter Selector"
+msgstr ""
+
+#: ../src/gui/report.glade.h:23
+msgid "Send report"
+msgstr ""
+
+#: ../src/gui/report.glade.h:24
+msgid "Show log"
+msgstr "Log opwiesen"
+
+#: ../src/gui/SettingsDialog.py:34
+#: ../src/gui/SettingsDialog.py:51
+msgid "<b>Select plugin</b>"
+msgstr ""
+
+#: ../src/gui/SettingsDialog.py:37
+msgid "<b>Select database backend</b>"
+msgstr ""
+
+#: ../src/gui/SettingsDialog.py:170
+msgid "Remove this job"
+msgstr "Düssen Opdrag löschen"
+
+#: ../src/gui/SettingsDialog.py:214
+msgid "Remove this action"
+msgstr ""
+
+#: ../src/gui/settings.glade.h:1
+msgid "<b>Analyzer plugin</b>"
+msgstr ""
+
+#: ../src/gui/settings.glade.h:2
+msgid "<b>Associated action</b>"
+msgstr ""
+
+#: ../src/gui/settings.glade.h:3
+msgid "<b>Plugin details</b>"
+msgstr ""
+
+#: ../src/gui/settings.glade.h:4
+msgid "<b>Plugin</b>"
+msgstr ""
+
+#: ../src/gui/settings.glade.h:5
+msgid "<b>Time (or period)</b>"
+msgstr ""
+
+#: ../src/gui/settings.glade.h:6
+msgid "Analyzers, Actions, Reporters"
+msgstr ""
+
+#: ../src/gui/settings.glade.h:7
+msgid "Author:"
+msgstr "Schriever:"
+
+#: ../src/gui/settings.glade.h:8
+msgid "Blacklisted packages: "
+msgstr ""
+
+#: ../src/gui/settings.glade.h:9
+msgid "C_onfigure Plugin"
+msgstr ""
+
+#: ../src/gui/settings.glade.h:10
+msgid "Check package GPG signature"
+msgstr ""
+
+#: ../src/gui/settings.glade.h:11
+msgid "Common"
+msgstr "Allgemeen"
+
+#: ../src/gui/settings.glade.h:12
+msgid "Cron"
+msgstr ""
+
+#: ../src/gui/settings.glade.h:13
+msgid "Database backend: "
+msgstr ""
+
+#: ../src/gui/settings.glade.h:14
+msgid "Description:"
+msgstr "Beschrieven:"
+
+#: ../src/gui/settings.glade.h:15
+msgid "GPG Keys"
+msgstr "GPG Slötel"
+
+#: ../src/gui/settings.glade.h:16
+msgid "GPG keys: "
+msgstr "GPG Slötel:"
+
+#: ../src/gui/settings.glade.h:17
+msgid "Max coredump storage size (MB):"
+msgstr ""
+
+#: ../src/gui/settings.glade.h:18
+msgid "Name:"
+msgstr "Naam:"
+
+#: ../src/gui/settings.glade.h:20
+msgid "Preferences"
+msgstr "Eegenschapten"
+
+#: ../src/gui/settings.glade.h:21
+msgid "Version:"
+msgstr "Verschoon:"
+
+#: ../src/gui/settings.glade.h:22
+msgid "Web Site:"
+msgstr "Netsiet:"
+
+#: ../src/gui/settings_wizard.glade.h:1
+msgid "<b>Do you want to continue?</b>"
+msgstr "<b>Wullt je wietermaken?</b>"
+
+#: ../src/gui/settings_wizard.glade.h:2
+msgid "Wrong Settings Detected"
+msgstr ""
+
+#: ../src/gui/settings_wizard.glade.h:3
+msgid "Wrong settings were detected for some of the enabled reporter plugins. Please use the buttons below to open the respective configuration and fix it before you proceed, otherwise, the reporting process may fail.\n"
+msgstr ""
+
+#: ../src/lib/abrt_curl.c:170
+#: ../src/plugins/abrt-action-upload.cpp:47
+#, c-format
+msgid "Uploaded: %llu of %llu kbytes"
+msgstr ""
+
+#: ../src/lib/parse_options.c:11
+#, c-format
+msgid "Usage: %s\n"
+msgstr ""
+
+#: ../src/plugins/abrt-action-analyze-c.c:154
+msgid ""
+" [-vs] -d DIR\n"
+"\n"
+"Calculates and saves UUID of coredumps"
+msgstr ""
+
+#: ../src/plugins/abrt-action-analyze-oops.c:131
+msgid ""
+" [-vs] -d DIR\n"
+"\n"
+"Calculates and saves UUID and DUPHASH of oops crash dumps"
+msgstr ""
+
+#: ../src/plugins/abrt-action-analyze-python.c:36
+msgid ""
+" [-vs] -d DIR\n"
+"\n"
+"Calculates and saves UUID and DUPHASH of python crash dumps"
+msgstr ""
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:532
+#, c-format
+msgid "New bug id: %i"
+msgstr ""
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:645
+#, c-format
+msgid "Can't open '%s'"
+msgstr ""
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:665
+#, c-format
+msgid "Empty login or password, please check %s"
+msgstr ""
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:683
+msgid "Logging into bugzilla..."
+msgstr ""
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:686
+msgid "Checking for duplicates..."
+msgstr ""
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:707
+#: ../src/plugins/abrt-action-bugzilla.cpp:743
+msgid "Missing mandatory member 'bugs'"
+msgstr ""
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:726
+#: ../src/plugins/abrt-action-bugzilla.cpp:759
+#: ../src/plugins/abrt-action-bugzilla.cpp:834
+msgid "get_bug_info() failed. Could not collect all mandatory information"
+msgstr ""
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:775
+msgid "Creating a new bug..."
+msgstr ""
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:780
+msgid "Bugzilla entry creation failed"
+msgstr ""
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:790
+#: ../src/plugins/abrt-action-bugzilla.cpp:887
+msgid "Logging out..."
+msgstr ""
+
+#. decision based on state
+#: ../src/plugins/abrt-action-bugzilla.cpp:808
+#, c-format
+msgid "Bug is already reported: %i"
+msgstr ""
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:819
+#, c-format
+msgid "Bugzilla couldn't find parent of bug %d"
+msgstr ""
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:848
+#, c-format
+msgid "Add %s to CC list"
+msgstr ""
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:872
+#, c-format
+msgid "Adding new comment to bug %d"
+msgstr ""
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:319
+#, c-format
+msgid "Backtrace parsing failed for %s"
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:72
+#, python-format
+msgid "Extracting cpio from %s"
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:77
+msgid "Can't write to:"
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:87
+msgid "Removing the temporary rpm file"
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:91
+#, python-format
+msgid "Can't extract package: %s"
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:99
+#, python-format
+msgid "Caching files from %s made from %s"
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:107
+msgid "Removing the temporary cpio file"
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:110
+#, python-format
+msgid "Can't extract files from: %s"
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:134
+#: ../src/plugins/abrt-action-install-debuginfo.py:140
+#, python-format
+msgid "Downloading (%i of %i) %.30s : %.3s %%"
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:169
+msgid "Searching the missing debuginfo packages"
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:224
+#, python-format
+msgid "To download: (%.2f) M / Installed size: %.2f M"
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:240
+msgid "Is this ok? [y/N] "
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:257
+#, python-format
+msgid "Downloading package %s failed"
+msgstr ""
+
+#. recursively delete the temp dir on failure
+#: ../src/plugins/abrt-action-install-debuginfo.py:268
+msgid "Unpacking failed, aborting download..."
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:275
+#, python-format
+msgid "All downloaded packages have been extracted, removing %s"
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:280
+#, python-format
+msgid "Can't remove %s, probably contains an error log"
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:305
+#, python-format
+msgid "Analyzing corefile: %(corefile_path)s"
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:384
+#, python-format
+msgid "Can't remove %(tmpdir_path)s: %(reason)s"
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:394
+msgid "Exiting on user Command"
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:413
+#, python-format
+msgid "Usage: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:442
+msgid "You have to specify the path to coredump."
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:446
+msgid "You have to specify the path to cachedir."
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:450
+msgid "You have to specify the path to tmpdir."
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:463
+msgid "All debuginfo seems to be available"
+msgstr ""
+
+#: ../src/plugins/abrt-action-install-debuginfo.py:470
+msgid "Complete!"
+msgstr "Fertig!"
+
+#: ../src/plugins/abrt-action-kerneloops.cpp:111
+#, c-format
+msgid "Submitting oops report to %s"
+msgstr ""
+
+#: ../src/plugins/abrt-action-mailx.cpp:114
+msgid "Sending an email..."
+msgstr ""
+
+#: ../src/plugins/abrt-action-mailx.cpp:138
+msgid ""
+" [-v] -d DIR [-c CONFFILE]\n"
+"\n"
+"Upload compressed tarball of crash dump"
+msgstr ""
+
+#: ../src/plugins/abrt-action-mailx.cpp:151
+#: ../src/plugins/abrt-action-upload.cpp:267
+msgid "Config file"
+msgstr ""
+
+#: ../src/plugins/abrt-action-print.cpp:39
+msgid ""
+" [-v] [-o FILE] -d DIR\n"
+"\n"
+"Print information about the crash to standard output"
+msgstr ""
+
+#: ../src/plugins/abrt-action-print.cpp:51
+msgid "Output file"
+msgstr "Utgavdatei"
+
+#: ../src/plugins/abrt-action-print.cpp:100
+#, c-format
+msgid "The report was appended to %s"
+msgstr ""
+
+#: ../src/plugins/abrt-action-print.cpp:100
+#, c-format
+msgid "The report was stored to %s"
+msgstr ""
+
+#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
+#. error msg is already logged by dd_opendir
+#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
+#: ../src/plugins/abrt-action-rhtsupport.cpp:43
+#: ../src/plugins/abrt-action-upload.cpp:121
+msgid "Compressing data"
+msgstr ""
+
+#: ../src/plugins/abrt-action-rhtsupport.cpp:78
+msgid "Empty login or password, please check RHTSupport.conf"
+msgstr ""
+
+#: ../src/plugins/abrt-action-rhtsupport.cpp:194
+msgid "Creating a new case..."
+msgstr ""
+
+#: ../src/plugins/abrt-action-upload.cpp:65
+#, c-format
+msgid "Sending %s to %s"
+msgstr "Senne %s nah %s"
+
+#. This ends up a "reporting status message" in abrtd
+#: ../src/plugins/abrt-action-upload.cpp:98
+#, c-format
+msgid "Successfully sent %s to %s"
+msgstr ""
+
+#: ../src/plugins/abrt-action-upload.cpp:219
+#, c-format
+msgid "Archive is created: '%s'"
+msgstr ""
+
+#: ../src/plugins/abrt-action-upload.cpp:253
+msgid ""
+" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
+"\n"
+"Upload compressed tarball of crash dump"
+msgstr ""
+
+#: ../src/plugins/abrt-action-upload.cpp:268
+msgid "Base URL to upload to"
+msgstr ""
+
+#: ../src/plugins/Bugzilla.glade.h:1
+msgid "<b>Bugzilla plugin configuration</b>"
+msgstr ""
+
+#: ../src/plugins/Bugzilla.glade.h:2
+msgid "Bugzilla URL:"
+msgstr "Bugzilla URL:"
+
+#: ../src/plugins/Bugzilla.glade.h:3
+msgid "Don't have an account yet?"
+msgstr ""
+
+#: ../src/plugins/Bugzilla.glade.h:4
+msgid "Login(email):"
+msgstr ""
+
+#: ../src/plugins/Bugzilla.glade.h:5
+#: ../src/plugins/RHTSupport.glade.h:3
+msgid "Password:"
+msgstr "Passwoord:"
+
+#: ../src/plugins/Bugzilla.glade.h:6
+#: ../src/plugins/RHTSupport.glade.h:5
+msgid "SSL verify"
+msgstr ""
+
+#: ../src/plugins/Bugzilla.glade.h:7
+#: ../src/plugins/RHTSupport.glade.h:6
+msgid "Show password"
+msgstr "Passwoord opwiesen"
+
+#: ../src/plugins/Bugzilla.glade.h:8
+msgid "You can create it <a href=\"https://bugzilla.redhat.com/createaccount.cgi\">here</a>"
+msgstr ""
+
+#: ../src/plugins/CCpp.cpp:277
+msgid "Analyzes crashes in C/C++ programs"
+msgstr ""
+
+#: ../src/plugins/KerneloopsReporter.glade.h:1
+msgid "<b>Kerneloops Reporter plugin configuration</b>"
+msgstr ""
+
+#: ../src/plugins/KerneloopsReporter.glade.h:2
+msgid "Submit URL:"
+msgstr ""
+
+#: ../src/plugins/KerneloopsScanner.cpp:227
+msgid "Periodically scans for and saves kernel oopses"
+msgstr ""
+
+#: ../src/plugins/Logger.glade.h:1
+msgid "<b>Logger plugin configuration</b>"
+msgstr ""
+
+#: ../src/plugins/Logger.glade.h:2
+msgid "Append new logs"
+msgstr ""
+
+#: ../src/plugins/Logger.glade.h:3
+msgid "Logger file:"
+msgstr "Logdatei:"
+
+#: ../src/plugins/Mailx.glade.h:1
+msgid "<b>Mailx plugin configuration</b>"
+msgstr ""
+
+#: ../src/plugins/Mailx.glade.h:2
+msgid "Recipient's Email:"
+msgstr ""
+
+#: ../src/plugins/Mailx.glade.h:3
+msgid "Send Binary Data"
+msgstr ""
+
+#: ../src/plugins/Mailx.glade.h:4
+msgid "Subject:"
+msgstr "Betreff;"
+
+#: ../src/plugins/Mailx.glade.h:5
+msgid "Your Email:"
+msgstr "Diene E-Post:"
+
+#: ../src/plugins/RHTSupport.glade.h:1
+msgid "<b>RHTSupport plugin configuration</b>"
+msgstr ""
+
+#: ../src/plugins/RHTSupport.glade.h:2
+msgid "Login:"
+msgstr "Anmellen:"
+
+#: ../src/plugins/RHTSupport.glade.h:4
+msgid "RHTSupport URL:"
+msgstr ""
+
+#: ../src/plugins/Upload.glade.h:1
+msgid "<b>Upload plugin configuration</b>"
+msgstr ""
+
+#: ../src/plugins/Upload.glade.h:2
+msgid "Retry count:"
+msgstr ""
+
+#: ../src/plugins/Upload.glade.h:3
+msgid "Retry delay:"
+msgstr ""
+
+#: ../src/plugins/Upload.glade.h:4
+msgid "URL:"
+msgstr "URL:"
+
+#: ../src/plugins/Upload.glade.h:5
+msgid "Use encryption"
+msgstr "Verslötel bruken"
+
+#, fuzzy
+#~ msgid "Generating backtrace"
+#~ msgstr "Algamando'l backtrace..."
+
+#, fuzzy
+#~ msgid "Starting the debuginfo installation"
+#~ msgstr "Omite la instalación de la información de depuración"
+
+#~ msgid "Getting global universal unique identification..."
+#~ msgstr "Algamando la identificación única universal global..."
+
+#, fuzzy
+#~ msgid "Skipping the debuginfo installation"
+#~ msgstr "Omite la instalación de la información de depuración"
+
+#~ msgid "FileTransfer: URL not specified"
+#~ msgstr "Tresferencia de ficheru: URL nun especificada"
+
+#, fuzzy
+#~ msgid "Sending archive %s to %s"
+#~ msgstr "Unviando ficheru %s vía %s"
+
+#~ msgid "FileTransfer: Creating a report..."
+#~ msgstr "Tresferencia de ficheru: Criando un informe..."
+
+#, fuzzy
+#~ msgid "Cannot create and send an archive: %s"
+#~ msgstr "CFileTransfer::Run(): nun pudo criase y unviase un ficheru: "
+
+#~ msgid "Creating and submitting a report..."
+#~ msgstr "Criando y unviando un informe..."
+
+#, fuzzy
+#~ msgid "Writes report to a file"
+#~ msgstr "Aniciando la criación del informe..."
+
+#, fuzzy
+#~ msgid "Creating a ReportUploader report..."
+#~ msgstr "Criando un informe..."
+
+#, fuzzy
+#~ msgid "Running sosreport: %s"
+#~ msgstr "llanzando sosreport:"
+
+#, fuzzy
+#~ msgid "Finished running sosreport"
+#~ msgstr "Sosreport executándose"
+
+#, fuzzy
+#~ msgid "Can't create and send an archive %s"
+#~ msgstr "CFileTransfer::Run(): nun pudo criase y unviase un ficheru: "
+
+#, fuzzy
+#~ msgid "send_string: URL not specified"
+#~ msgstr "Tresferencia de ficheru: URL nun especificada"
+
+#, fuzzy
+#~ msgid "Sending failed, try it again: %s"
+#~ msgstr "Unviando ficheru %s vía %s"
+
+#, fuzzy
+#~ msgid "send_file: URL not specified"
+#~ msgstr "Tresferencia de ficheru: URL nun especificada"
+
+#, fuzzy
+#~ msgid "New bug id: %s"
+#~ msgstr "Nuevu id del fallu:"
+
+#, fuzzy
+#~ msgid "Creating a signature..."
+#~ msgstr "Criando un informe..."
+
+#, fuzzy
+#~ msgid "Binary file %s will not be reported"
+#~ msgstr "Nun s'informará del ficheru binariu %s."
+
+#~ msgid "Getting local universal unique identification"
+#~ msgstr "Algamando la identificación única universal llocal"
+
+#, fuzzy
+#~ msgid "Not reported"
+#~ msgstr "Informe"
+
+#~ msgid "Plugin name is not set, can't load it's settings"
+#~ msgstr ""
+#~ "Nun ta puestu'l nome del complementu, nun pudo cargase la configuración"
diff --git a/po/nl.po b/po/nl.po
index a6678b62..6862ceb8 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -2,15 +2,15 @@
# abrt translation to Dutc.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
-# Geert Warrink <geert.warrink@onsnet.nu>, 2009, 2010.
+# Geert Warrink <geert.warrink@onsnet.nu>, 2009, 2010, 2011.
# Richard van der Luit <nippur@fedoraproject.org>, 2009.
-# Geert Warrink <geert.warrink@onsnet.nu>, 2009, 2010.
+# Geert Warrink <geert.warrink@onsnet.nu>, 2009, 2010, 2011.
msgid ""
msgstr ""
"Project-Id-Version: abrt.master\n"
"Report-Msgid-Bugs-To: jmoskovc@redhat.com\n"
-"POT-Creation-Date: 2010-11-29 20:44+0000\n"
-"PO-Revision-Date: 2010-11-30 10:32+0200\n"
+"POT-Creation-Date: 2011-02-07 02:41+0000\n"
+"PO-Revision-Date: 2011-02-07 13:04+0200\n"
"Last-Translator: Geert Warrink <geert.warrink@onsnet.nu>\n"
"Language-Team: Fedora\n"
"Language: nl\n"
@@ -30,16 +30,16 @@ msgstr "ABRT bericht applet "
msgid "Automatic Bug Reporting Tool"
msgstr "Automatisch bug rapporteer gereedschap"
-#: ../src/applet/Applet.cpp:86
+#: ../src/applet/applet.c:86
#, c-format
msgid "A crash in the %s package has been detected"
msgstr "Een crash in het %s pakket is ontdekt"
-#: ../src/applet/Applet.cpp:88
+#: ../src/applet/applet.c:88
msgid "A crash has been detected"
msgstr "Een crash is ontdekt"
-#: ../src/applet/Applet.cpp:285
+#: ../src/applet/applet.c:285
msgid "ABRT service is not running"
msgstr "ABRT service draait niet"
@@ -55,7 +55,7 @@ msgstr ""
"Mededelingen gebied applet om gebruiker te berichten over problemen ontdekt "
"door ABRT"
-#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:23
+#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:24
msgid "translator-credits"
msgstr "Geert Warrink <geert.warrink@onsnet.nu>"
@@ -63,7 +63,7 @@ msgstr "Geert Warrink <geert.warrink@onsnet.nu>"
msgid "Hide"
msgstr "Verbergen"
-#: ../src/applet/applet_gtk.c:360 ../src/gui/ccgui.glade.h:13
+#: ../src/applet/applet_gtk.c:360 ../src/gui/ccgui.glade.h:14
msgid "Report"
msgstr "Rapport"
@@ -71,7 +71,7 @@ msgstr "Rapport"
msgid "Open ABRT"
msgstr "Open ABRT"
-#: ../src/cli/CLI.cpp:47
+#: ../src/cli/CLI.cpp:91
#, c-format
msgid ""
"\tCrash dump : %s\n"
@@ -88,12 +88,12 @@ msgstr ""
"\tCrash tijd : %s\n"
"\tCrash telling : %s\n"
-#: ../src/cli/CLI.cpp:65
+#: ../src/cli/CLI.cpp:110
#, c-format
msgid "\tHostname : %s\n"
msgstr "\tHost naam : %s\n"
-#: ../src/cli/CLI.cpp:98
+#: ../src/cli/CLI.cpp:143
#, c-format
msgid ""
"Dump directory: %s\n"
@@ -116,27 +116,27 @@ msgstr ""
"Systeem: %s, kernel %s\n"
"Reden: %s\n"
-#: ../src/cli/CLI.cpp:125
+#: ../src/cli/CLI.cpp:171
#, c-format
msgid "Coredump file: %s\n"
msgstr "Coredump bestand: %s\n"
-#: ../src/cli/CLI.cpp:129
+#: ../src/cli/CLI.cpp:175
#, c-format
msgid "Rating: %s\n"
msgstr "Beoordeling: %s\n"
-#: ../src/cli/CLI.cpp:134
+#: ../src/cli/CLI.cpp:180
#, c-format
msgid "Crash function: %s\n"
msgstr "Crash functie: %s\n"
-#: ../src/cli/CLI.cpp:138
+#: ../src/cli/CLI.cpp:184
#, c-format
msgid "Hostname: %s\n"
msgstr "Host naam: %s\n"
-#: ../src/cli/CLI.cpp:142
+#: ../src/cli/CLI.cpp:188
#, c-format
msgid ""
"\n"
@@ -147,7 +147,7 @@ msgstr ""
"Hoe te reproduceren:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:146
+#: ../src/cli/CLI.cpp:192
#, c-format
msgid ""
"\n"
@@ -158,7 +158,7 @@ msgstr ""
"Commentaar:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:152
+#: ../src/cli/CLI.cpp:198
#, c-format
msgid ""
"\n"
@@ -169,69 +169,65 @@ msgstr ""
"Backtrace:\n"
"%s\n"
-#. Message has embedded tabs.
-#: ../src/cli/CLI.cpp:243
+#: ../src/cli/CLI.cpp:295
#, c-format
msgid ""
-"Usage: %s [OPTION]\n"
+"Usage: %s -l[f] [-D BASE_DIR]...]\n"
+" or: %s -r[y] CRASH_DIR\n"
+" or: %s -i[b] CRASH_DIR\n"
+" or: %s -d CRASH_DIR\n"
"\n"
-"Startup:\n"
-"\t-V, --version\t\tdisplay the version of %s and exit\n"
-"\t-?, --help\t\tprint this help\n"
+"\t-l, --list\t\tList not yet reported crashes\n"
+"\t -f, --full\t\tList all crashes\n"
+"\t-D BASE_DIR\t\tDirectory to list crashes from\n"
+"\t\t\t\t(default: -D $HOME/.abrt/spool -D %s)\n"
"\n"
-"Actions:\n"
-"\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
-"\t -f, --full\tprint a list of all crashes, including the already "
-"reported ones\n"
-"\t-r, --report CRASH_ID\tcreate and send a report\n"
-"\t -y, --always\tcreate and send a report without asking\n"
-"\t-d, --delete CRASH_ID\tremove a crash\n"
-"\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
-"\t -b, --backtrace\tprint detailed information about a crash including "
-"backtrace\n"
-"CRASH_ID can be:\n"
-"\ta name of dump directory, or\n"
-"\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+"\t-r, --report\t\tSend a report about CRASH_DIR\n"
+"\t -y, --always\t\t...without editing and asking\n"
+"\t-i, --info\t\tPrint detailed information about CRASH_DIR\n"
+"\t -b, --backtrace\t...including backtrace\n"
+"\t-d, --delete\t\tRemove CRASH_DIR\n"
+"\n"
+"\t-V, --version\t\tDisplay version and exit\n"
+"\t-v, --verbose\t\tBe verbose\n"
msgstr ""
-"Gebruik: %s [OPTIE]\n"
+"Gebruik: %s -l[f] [-D BASE_DIR]...]\n"
+" of: %s -r[y] CRASH_DIR\n"
+" of: %s -i[b] CRASH_DIR\n"
+" of: %s -d CRASH_DIR\n"
+"\n"
+"\t-l, --list\t\tToon nog niet gerapporteerde crashes\n"
+"\t -f, --full\t\tToon alle crashes\n"
+"\t-D BASE_DIR\t\tMap waaruit crashes getoond worden\n"
+"\t\t\t\t(standaard: -D $HOME/.abrt/spool -D %s)\n"
"\n"
-"Opstarten:\n"
-"\t-V, --version\t\tlaat de versie van %s zien en sluit af\n"
-"\t-?, --help\t\tlaat deze hulp zien\n"
+"\t-r, --report\t\tStuur een rapport over CRASH_DIR\n"
+"\t -y, --always\t\t...zonder bewerken en vragen\n"
+"\t-i, --info\t\tGeef gedetailleerde informatie over CRASH_DIR\n"
+"\t -b, --backtrace\t...inclusief backtrace\n"
+"\t-d, --delete\t\tVerwijder CRASH_DIR\n"
"\n"
-"Acties:\n"
-"\t-l, --list\t\tlaat lijst van crashes zien die nog niet gerapporteerd zijn\n"
-"\t\t-f, --full\tlaat lijst van alle crashes zien, inclusief de reeds "
-"gerapporteerde\n"
-"\t-r, --report CRASH_ID\tmaak een rapport aan en verstuur deze\n"
-"\t\t-y, --always \tmaak een rapport aan en verstuur deze zonder te vragen\n"
-"\t-d, --delete CRASH_ID\tverwijder een crash\n"
-"\t-i, --info CRASH_ID\tlaat gedetailleerde informatie over crash zien\n"
-"\t\t-b, --backtrace\tlaat gedetailleerde informatie over crash zien "
-"inclusief backtrace\n"
-"CRASH_ID kan zijn:\n"
-"\teen naam van een dump map of\n"
-"\t@N - N-de crash (zoals getoond door --list --full) waarop actie "
-"ondernomen zal worden\n"
-
-#: ../src/cli/CLI.cpp:287
+"\t-V, --version\t\tToon versie en sluit af\n"
+"\t-v, --verbose\t\tGeef uitgebreide informatie\n"
+
+#: ../src/cli/CLI.cpp:343
msgid "You must specify exactly one operation"
msgstr "Je moet exact een bewerking specificeren."
-#: ../src/cli/report.cpp:166
+#: ../src/cli/report.cpp:161
#, c-format
msgid "# This field is read only\n"
msgstr "# Dit veld is alleen-lezen.\n"
-#: ../src/cli/report.cpp:186
+#: ../src/cli/report.cpp:181
msgid "# Describe the circumstances of this crash below"
msgstr "# Beschrijf hieronder de omstandigheden van deze crash."
-#: ../src/cli/report.cpp:188
+#: ../src/cli/report.cpp:183
msgid "# How to reproduce the crash?"
msgstr "# Hoe is deze crash te reproduceren?"
-#: ../src/cli/report.cpp:190
+#: ../src/cli/report.cpp:185
msgid ""
"# Backtrace\n"
"# Check that it does not contain any sensitive data (passwords, etc.)"
@@ -239,47 +235,47 @@ msgstr ""
"# Backtrace\n"
"# Controleer of deze geen gevoelige data bevat (wachtwoorden, enz.)"
-#: ../src/cli/report.cpp:192
+#: ../src/cli/report.cpp:187
msgid "# Architecture"
msgstr "# Architectuur"
-#: ../src/cli/report.cpp:193
+#: ../src/cli/report.cpp:188
msgid "# Command line"
msgstr "# Commando-regel"
-#: ../src/cli/report.cpp:194
+#: ../src/cli/report.cpp:189
msgid "# Component"
msgstr "# Onderdeel"
-#: ../src/cli/report.cpp:195
+#: ../src/cli/report.cpp:190
msgid "# Core dump"
msgstr "# Core dump"
-#: ../src/cli/report.cpp:196
+#: ../src/cli/report.cpp:191
msgid "# Executable"
msgstr "# Uitvoerbaar programma"
-#: ../src/cli/report.cpp:197
+#: ../src/cli/report.cpp:192
msgid "# Kernel version"
msgstr "# Kernel versie"
-#: ../src/cli/report.cpp:198
+#: ../src/cli/report.cpp:193
msgid "# Package"
msgstr "# Pakket"
-#: ../src/cli/report.cpp:199
+#: ../src/cli/report.cpp:194
msgid "# Reason of crash"
msgstr "# Reden van de crash"
-#: ../src/cli/report.cpp:200
+#: ../src/cli/report.cpp:195
msgid "# Release string of the operating system"
msgstr "# Vrijgave boodschap van het besturingssysteem"
-#: ../src/cli/report.cpp:323
+#: ../src/cli/report.cpp:318
msgid "Cannot run vi: $TERM, $VISUAL and $EDITOR are not set"
msgstr "Kan vi niet draaien: $TERM, $VISUAL en $EDITOR zijn niet ingesteld"
-#: ../src/cli/report.cpp:411
+#: ../src/cli/report.cpp:402
msgid ""
"\n"
"The report has been updated"
@@ -287,7 +283,7 @@ msgstr ""
"\n"
"Het rapport is vernieuwd"
-#: ../src/cli/report.cpp:413
+#: ../src/cli/report.cpp:404
msgid ""
"\n"
"No changes were detected in the report"
@@ -296,46 +292,46 @@ msgstr ""
"Er zijn geen veranderingen in het rapport ontdekt"
#. The response might take more than 1 char in non-latin scripts.
-#: ../src/cli/report.cpp:464
+#: ../src/cli/report.cpp:436
msgid "y"
msgstr "j"
-#: ../src/cli/report.cpp:465
+#: ../src/cli/report.cpp:437
msgid "N"
msgstr "N"
#. Read the missing information and push it to plugin settings.
-#: ../src/cli/report.cpp:565
+#: ../src/cli/report.cpp:568
#, c-format
msgid "Wrong settings were detected for plugin %s\n"
msgstr "Voor plug-in %s zijn verkeerde instellingen ontdekt\n"
-#: ../src/cli/report.cpp:569
+#: ../src/cli/report.cpp:572
msgid "Enter your login: "
msgstr "Voer jouw gebruikersnaam in:"
-#: ../src/cli/report.cpp:575
+#: ../src/cli/report.cpp:578
msgid "Enter your password: "
msgstr "Voer jouw wachtwoord in:"
-#: ../src/cli/report.cpp:638
+#: ../src/cli/report.cpp:788
msgid "Reporting..."
msgstr "Rapporteren..."
-#: ../src/cli/report.cpp:657
+#: ../src/cli/report.cpp:801
#, c-format
msgid "Report using %s?"
msgstr "Rapporteren met gebruik van %s? "
-#: ../src/cli/report.cpp:660
+#: ../src/cli/report.cpp:804
msgid "Skipping..."
msgstr "Overslaan..."
-#: ../src/cli/report.cpp:672
+#: ../src/cli/report.cpp:820
msgid "Reporting disabled because the backtrace is unusable"
msgstr "Rapporteren is uitgezet omdat de backtrace onbruikbaar is."
-#: ../src/cli/report.cpp:676
+#: ../src/cli/report.cpp:824
#, c-format
msgid ""
"Please try to install debuginfo manually using the command: \"debuginfo-"
@@ -344,57 +340,79 @@ msgstr ""
"Probeer debuginfo handmatig te installeren met het commando: \"debuginfo-"
"install %s\" en probeer het opnieuw\n"
-#: ../src/cli/report.cpp:685
-msgid "Error loading reporter settings"
-msgstr "Fout tijdens het laden van rapporteer instellingen"
-
-#: ../src/cli/report.cpp:704
+#: ../src/cli/report.cpp:842
#, c-format
msgid "Crash reported via %d report events (%d errors)\n"
msgstr "Crash gerapporteerd via %d rapport gebeurtenissen (%d fouten)\n"
-#: ../src/daemon/abrt-handle-crashdump.c:42
+#: ../src/daemon/abrt-action-save-package-data.c:280
msgid ""
-" [-vs] -d DIR -e EVENT\n"
-" or: "
+" [options] -d DIR\n"
+"\n"
+"Query package database and save package name, component, and description"
msgstr ""
-" [-vs] -d DIR -e EVENT\n"
-" of: "
+" [opties] -d MAP\n"
+"\n"
+"Bevraag pakket database en sla pakket naam, onderdeel en beschrijving op"
-#: ../src/daemon/abrt-handle-crashdump.c:57
+#: ../src/daemon/abrt-action-save-package-data.c:292
+#: ../src/daemon/abrt-handle-crashdump.c:60
#: ../src/plugins/abrt-action-analyze-c.c:167
#: ../src/plugins/abrt-action-analyze-oops.c:144
#: ../src/plugins/abrt-action-analyze-python.c:49
+#: ../src/plugins/abrt-action-bugzilla.cpp:927
+#: ../src/plugins/abrt-action-generate-backtrace.c:270
+#: ../src/plugins/abrt-action-kerneloops.c:147
+#: ../src/plugins/abrt-action-mailx.c:149
+#: ../src/plugins/abrt-action-print.c:50
+#: ../src/plugins/abrt-action-rhtsupport.c:281
+#: ../src/plugins/abrt-action-upload.c:261
+msgid "Crash dump directory"
+msgstr "Crash dump map"
+
+#: ../src/daemon/abrt-action-save-package-data.c:293
+#: ../src/daemon/abrt-handle-crashdump.c:59 ../src/daemon/abrt-server.c:297
+#: ../src/plugins/abrt-action-bugzilla.cpp:926
+#: ../src/plugins/abrt-action-generate-backtrace.c:273
+#: ../src/plugins/abrt-action-kerneloops.c:146
+#: ../src/plugins/abrt-action-rhtsupport.c:280
+#: ../src/plugins/abrt-dump-oops.c:555
msgid "Log to syslog"
msgstr "Loggen naar syslog"
-#: ../src/daemon/abrt-handle-crashdump.c:58
-#: ../src/plugins/abrt-action-analyze-c.c:166
-#: ../src/plugins/abrt-action-analyze-oops.c:143
-#: ../src/plugins/abrt-action-analyze-python.c:48
-#: ../src/plugins/abrt-action-mailx.cpp:150
-#: ../src/plugins/abrt-action-print.cpp:50
-#: ../src/plugins/abrt-action-upload.cpp:266
-msgid "Crash dump directory"
-msgstr "Crash dump map"
+#: ../src/daemon/abrt-handle-crashdump.c:43
+msgid ""
+" [-vs] -d DIR -e EVENT\n"
+" or: "
+msgstr ""
+" [-vs] -d DIR -e EVENT\n"
+" of: "
-#: ../src/daemon/abrt-handle-crashdump.c:59
+#: ../src/daemon/abrt-handle-crashdump.c:61
msgid "Handle EVENT"
msgstr "Handel gebeurtenis af"
-#: ../src/daemon/abrt-handle-crashdump.c:60
+#: ../src/daemon/abrt-handle-crashdump.c:62
msgid "List possible events [which start with PFX]"
msgstr "Laat mogelijke gebeurtenissen zien [die beginnen met PFX]"
-#: ../src/daemon/CommLayerServerDBus.cpp:229
+#: ../src/daemon/abrt-server.c:286 ../src/daemon/Daemon.cpp:542
+msgid " [options]"
+msgstr " [opties]"
+
+#: ../src/daemon/abrt-server.c:296
+msgid "Use UID as client uid"
+msgstr "Gebruik UID als cliënt uid"
+
+#: ../src/daemon/CommLayerServerDBus.cpp:242
msgid "Comment is too long"
msgstr "Commentaar is te lang"
-#: ../src/daemon/CommLayerServerDBus.cpp:233
+#: ../src/daemon/CommLayerServerDBus.cpp:246
msgid "'How to reproduce' is too long"
msgstr "'Hoe te reproduceren' is te lang"
-#: ../src/daemon/Daemon.cpp:534
+#: ../src/daemon/Daemon.cpp:371
msgid ""
"The size of the report exceeded the quota. Please check system's "
"MaxCrashReportsSize value in abrt.conf."
@@ -402,19 +420,15 @@ msgstr ""
"De grootte van het rapport overschreed de quota. Controleer de "
"MaxCrashReportsSize waarde van het systeem in abrt.conf."
-#: ../src/daemon/Daemon.cpp:699
-msgid "abrtd [options]"
-msgstr "abrtd [opties]"
-
-#: ../src/daemon/Daemon.cpp:709
+#: ../src/daemon/Daemon.cpp:553
msgid "Do not daemonize"
msgstr "Niet instellen als daemon"
-#: ../src/daemon/Daemon.cpp:710
+#: ../src/daemon/Daemon.cpp:554
msgid "Log to syslog even with -d"
msgstr "Loggen naar syslog zelfs met -d"
-#: ../src/daemon/Daemon.cpp:711
+#: ../src/daemon/Daemon.cpp:555
msgid "Exit after SEC seconds of inactivity"
msgstr "Afsluiten na SEC seconden van inactiviteit"
@@ -452,16 +466,16 @@ msgstr "Aanmeld plug-ins"
msgid "Database plugins"
msgstr "Database plug-ins"
-#: ../src/gui/CCDBusBackend.py:74 ../src/gui/CCDBusBackend.py:97
+#: ../src/gui/CCDBusBackend.py:75 ../src/gui/CCDBusBackend.py:98
msgid "Cannot connect to system dbus."
msgstr "Kan niet verbinden met systeem dbus."
-#: ../src/gui/CCDBusBackend.py:120 ../src/gui/CCDBusBackend.py:123
+#: ../src/gui/CCDBusBackend.py:121 ../src/gui/CCDBusBackend.py:124
msgid "Please check if the abrt daemon is running."
msgstr "Controleer of de abrt daemon draait."
#. FIXME: BUG: BarWindow remains. (how2reproduce: delete "component" in a dump dir and try to report it)
-#: ../src/gui/CCDBusBackend.py:169
+#: ../src/gui/CCDBusBackend.py:170
msgid ""
"Daemon did not return a valid report info.\n"
"Is debuginfo missing?"
@@ -509,11 +523,15 @@ msgstr "Over ABRT"
msgid "Copy to Clipboard"
msgstr "Kopieer naar klembord"
-#: ../src/gui/ccgui.glade.h:12 ../src/gui/settings.glade.h:19
+#: ../src/gui/ccgui.glade.h:12
+msgid "Online _Help"
+msgstr "Online _Hulp"
+
+#: ../src/gui/ccgui.glade.h:13 ../src/gui/settings.glade.h:19
msgid "Plugins"
msgstr "Plug-ins"
-#: ../src/gui/ccgui.glade.h:14
+#: ../src/gui/ccgui.glade.h:15
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 "
@@ -541,19 +559,19 @@ msgstr ""
"Je moet een kopie van de GNU General Public License tezamen met dit "
"programma ontvangen hebben. Zo niet, zie <http://www.gnu.org/licenses/>."
-#: ../src/gui/ccgui.glade.h:19 ../src/gui/CReporterAssistant.py:71
+#: ../src/gui/ccgui.glade.h:20 ../src/gui/CReporterAssistant.py:111
msgid "View log"
msgstr "Bekijk log"
-#: ../src/gui/ccgui.glade.h:20
+#: ../src/gui/ccgui.glade.h:21
msgid "_Edit"
msgstr "Be_werken"
-#: ../src/gui/ccgui.glade.h:21
+#: ../src/gui/ccgui.glade.h:22
msgid "_File"
msgstr "_Bestand"
-#: ../src/gui/ccgui.glade.h:22
+#: ../src/gui/ccgui.glade.h:23
msgid "_Help"
msgstr "_Hulp"
@@ -574,7 +592,7 @@ msgstr "Host naam"
msgid "Latest Crash"
msgstr "Laatste crash"
-#: ../src/gui/CCMainWindow.py:143
+#: ../src/gui/CCMainWindow.py:148
#, python-format
msgid ""
"Cannot show the settings dialog.\n"
@@ -583,7 +601,7 @@ msgstr ""
"Kan de instellingen dialoog niet tonen.\n"
"%s"
-#: ../src/gui/CCMainWindow.py:148
+#: ../src/gui/CCMainWindow.py:153
#, python-format
msgid ""
"Unable to finish the current task!\n"
@@ -593,7 +611,7 @@ msgstr ""
"%s"
#. there is something wrong with the daemon if we cant get the dumplist
-#: ../src/gui/CCMainWindow.py:183
+#: ../src/gui/CCMainWindow.py:188
#, python-format
msgid ""
"Error while loading the dumplist.\n"
@@ -602,7 +620,7 @@ msgstr ""
"Fout tijdens het laden van de dump lijst.\n"
"%s"
-#: ../src/gui/CCMainWindow.py:241
+#: ../src/gui/CCMainWindow.py:246
#, python-format
msgid ""
"<b>%s Crash</b>\n"
@@ -611,11 +629,11 @@ msgstr ""
"<b>%s crash</b>\n"
"%s"
-#: ../src/gui/CCMainWindow.py:337
+#: ../src/gui/CCMainWindow.py:343
msgid "You have to select a crash to copy."
msgstr "Je moet een crash selecteren om te kopiëren."
-#: ../src/gui/CCMainWindow.py:421
+#: ../src/gui/CCMainWindow.py:427
msgid ""
"Usage: abrt-gui [OPTIONS]\n"
"\t-v[vv]\t\t\tVerbose\n"
@@ -625,7 +643,7 @@ msgstr ""
"\t-v[vv]\t\t\tBreedsprakig\n"
"\t--report=CRASH_ID\tRapporteer crash direct met CRASH_ID"
-#: ../src/gui/CCMainWindow.py:444
+#: ../src/gui/CCMainWindow.py:450
#, python-format
msgid ""
"No such crash in the database, probably wrong crashid.\n"
@@ -634,95 +652,6 @@ msgstr ""
"Zo'n crash is niet in de database, waarschijnlijk verkeerde crashid.\n"
"crashid=%s"
-#. default texts
-#: ../src/gui/CCReporterDialog.py:22 ../src/gui/CReporterAssistant.py:20
-msgid "Brief description of how to reproduce this or what you did..."
-msgstr "Korte beschrijving hoe dit te reproduceren is of wat je hebt gedaan..."
-
-#: ../src/gui/CCReporterDialog.py:107
-msgid "You must check the backtrace for sensitive data."
-msgstr "Je moet de backtrace controleren op gevoelige data."
-
-#: ../src/gui/CCReporterDialog.py:118 ../src/gui/CReporterAssistant.py:364
-#, python-format
-msgid ""
-"Reporting disabled because the backtrace is unusable.\n"
-"Please try to install debuginfo manually using the command: <b>debuginfo-"
-"install %s</b> \n"
-"then use the Refresh button to regenerate the backtrace."
-msgstr ""
-"Rapportage uitgeschakeld omdat de backtrace onbruikbaar is.\n"
-"Probeer debuginfo handmatig te installeren met het commando: <b>debuginfo-"
-"install %s</b> \n"
-"en gebruik dan de Verversen knop om de backtrace opnieuw te genereren."
-
-#: ../src/gui/CCReporterDialog.py:120
-msgid "The backtrace is unusable, you cannot report this!"
-msgstr "De backtrace in onbruikbaar, je kunt dit niet rapporteren!"
-
-#: ../src/gui/CCReporterDialog.py:124 ../src/gui/CReporterAssistant.py:342
-#: ../src/gui/CReporterAssistant.py:370
-msgid ""
-"The backtrace is incomplete, please make sure you provide the steps to "
-"reproduce."
-msgstr ""
-"De backtrace is niet compleet, zorg ervoor om voor het reproduceren de "
-"juiste stappen op te volgen."
-
-#: ../src/gui/CCReporterDialog.py:130
-msgid "Reporting disabled, please fix the problems shown above."
-msgstr "Rapporteren is uitgezet, los de hierboven getoonde problemen op."
-
-#: ../src/gui/CCReporterDialog.py:132
-msgid "Sends the report using the selected plugin."
-msgstr "Verstuur het rapport met de geselecteerde plug-in."
-
-#: ../src/gui/CCReporterDialog.py:398
-msgid ""
-"No reporter plugin available for this type of crash.\n"
-"Please check abrt.conf."
-msgstr ""
-"Er is geen rapportage plug-in beschikbaar voor dit type crash\n"
-"Controleer abrt.conf."
-
-#: ../src/gui/CCReporterDialog.py:418 ../src/gui/CReporterAssistant.py:249
-#: ../src/gui/PluginsSettingsDialog.py:136
-#, python-format
-msgid ""
-"Cannot save plugin settings:\n"
-" %s"
-msgstr ""
-"Kan de plug-in instellingen niet opslaan:\n"
-" %s"
-
-#: ../src/gui/CCReporterDialog.py:448 ../src/gui/CReporterAssistant.py:279
-#, python-format
-msgid "Configure %s options"
-msgstr "Configureer %s opties"
-
-#: ../src/gui/CCReporterDialog.py:498 ../src/gui/CReporterAssistant.py:1074
-msgid ""
-"Unable to get report!\n"
-"Is debuginfo missing?"
-msgstr ""
-"Kan geen rapport krijgen!\n"
-"Mist debuginfo?"
-
-#: ../src/gui/CCReporterDialog.py:527 ../src/gui/CReporterAssistant.py:455
-#, python-format
-msgid ""
-"Reporting failed!\n"
-"%s"
-msgstr ""
-"Rapporteren mislukte!\n"
-"%s"
-
-#: ../src/gui/CCReporterDialog.py:553 ../src/gui/CCReporterDialog.py:574
-#: ../src/gui/CReporterAssistant.py:1113
-#, python-format
-msgid "Error acquiring the report: %s"
-msgstr "Fout tijdens het verkrijgen van het rapport: %s"
-
#: ../src/gui/ConfBackend.py:78
msgid "Cannot connect to the Gnome Keyring daemon."
msgstr "Kan niet verbinden met de Gnome sleutelbos daemon."
@@ -755,42 +684,91 @@ msgstr ""
"Toegang tot gnome-keyring werd niet toegestaan, kan de instellingen niet "
"laden!"
+#: ../src/gui/CReporterAssistant.py:20
+msgid "Brief description of how to reproduce this or what you did..."
+msgstr "Korte beschrijving hoe dit te reproduceren is of wat je hebt gedaan..."
+
#: ../src/gui/CReporterAssistant.py:21
msgid "Crash info doesn't contain a backtrace"
msgstr "Crash info bevat geen backtrace"
-#: ../src/gui/CReporterAssistant.py:334
+#: ../src/gui/CReporterAssistant.py:277
+#: ../src/gui/PluginsSettingsDialog.py:136
+#, python-format
+msgid ""
+"Cannot save plugin settings:\n"
+" %s"
+msgstr ""
+"Kan de plug-in instellingen niet opslaan:\n"
+" %s"
+
+#: ../src/gui/CReporterAssistant.py:307
+#, python-format
+msgid "Configure %s options"
+msgstr "Configureer %s opties"
+
+#: ../src/gui/CReporterAssistant.py:362
#, python-format
msgid "Rating is %s"
msgstr "Kwalificatie is %s"
-#: ../src/gui/CReporterAssistant.py:337
+#: ../src/gui/CReporterAssistant.py:365
msgid "Crashdump doesn't have rating => we suppose it's not required"
msgstr ""
"Crash dump heeft geen kwalificatie => we veronderstellen dat het niet nodig "
"is"
-#: ../src/gui/CReporterAssistant.py:350
+#: ../src/gui/CReporterAssistant.py:370 ../src/gui/CReporterAssistant.py:398
+msgid ""
+"The backtrace is incomplete, please make sure you provide the steps to "
+"reproduce."
+msgstr ""
+"De backtrace is niet compleet, zorg ervoor om voor het reproduceren de "
+"juiste stappen op te volgen."
+
+#: ../src/gui/CReporterAssistant.py:378
msgid "You should check the backtrace for sensitive data."
msgstr "Je moet de backtrace controleren op gevoelige data."
-#: ../src/gui/CReporterAssistant.py:351
+#: ../src/gui/CReporterAssistant.py:379
msgid "You must agree with sending the backtrace."
msgstr "Je moet instemmen met het versturen van de backtrace."
-#: ../src/gui/CReporterAssistant.py:366
+#: ../src/gui/CReporterAssistant.py:392
+#, python-format
+msgid ""
+"Reporting disabled because the backtrace is unusable.\n"
+"Please try to install debuginfo manually using the command: <b>debuginfo-"
+"install %s</b> \n"
+"then use the Refresh button to regenerate the backtrace."
+msgstr ""
+"Rapportage uitgeschakeld omdat de backtrace onbruikbaar is.\n"
+"Probeer debuginfo handmatig te installeren met het commando: <b>debuginfo-"
+"install %s</b> \n"
+"en gebruik dan de Verversen knop om de backtrace opnieuw te genereren."
+
+#: ../src/gui/CReporterAssistant.py:394
msgid "Reporting disabled because the backtrace is unusable."
msgstr "Rapportage is uitgezet omdat de backtrace onbruikbaar is."
-#: ../src/gui/CReporterAssistant.py:412
+#: ../src/gui/CReporterAssistant.py:440
msgid "You did not provide any steps to reproduce."
msgstr "Je hebt geen stappen opgegeven voor reproductie."
-#: ../src/gui/CReporterAssistant.py:426
+#: ../src/gui/CReporterAssistant.py:454
msgid "You did not provide any comments."
msgstr "Je hebt geen commentaar opgegeven."
-#: ../src/gui/CReporterAssistant.py:507
+#: ../src/gui/CReporterAssistant.py:483
+#, python-format
+msgid ""
+"Reporting failed!\n"
+"%s"
+msgstr ""
+"Rapporteren mislukte!\n"
+"%s"
+
+#: ../src/gui/CReporterAssistant.py:535
#, python-format
msgid ""
"It looks like an application from the package <b>%s</b> has crashed on your "
@@ -817,15 +795,15 @@ msgstr ""
"Selecteer waar je deze bug wil rapporteren, en druk op 'Vooruit' om verder "
"te gaan."
-#: ../src/gui/CReporterAssistant.py:548
+#: ../src/gui/CReporterAssistant.py:576
msgid "Only one reporter plugin is configured."
msgstr "Er is slechts een rapporteer plug-in geconfigureerd."
-#: ../src/gui/CReporterAssistant.py:554
+#: ../src/gui/CReporterAssistant.py:582
msgid "Send a bug report"
msgstr "Verstuur een bug rapport"
-#: ../src/gui/CReporterAssistant.py:592
+#: ../src/gui/CReporterAssistant.py:620
msgid ""
"Below is the backtrace associated with your crash. A crash backtrace "
"provides developers with details about how the crash happened, helping them "
@@ -842,132 +820,145 @@ msgstr ""
"zijn dat jouw bug rapport geen gevoelige data bevat die je liever niet wilt "
"delen:"
-#: ../src/gui/CReporterAssistant.py:663 ../src/gui/CReporterAssistant.py:676
-#: ../src/gui/CReporterAssistant.py:710
+#: ../src/gui/CReporterAssistant.py:691 ../src/gui/CReporterAssistant.py:704
+#: ../src/gui/CReporterAssistant.py:738
#, python-format
msgid "Found %i occurence(s) [at: %i of %i]"
msgstr "Vond %i voorval(len) [bij: %i of %i]"
-#: ../src/gui/CReporterAssistant.py:747
+#: ../src/gui/CReporterAssistant.py:775
msgid "Search:"
msgstr "Zoeken:"
-#: ../src/gui/CReporterAssistant.py:778
+#: ../src/gui/CReporterAssistant.py:806
msgid "Refresh"
msgstr "Verversen"
-#: ../src/gui/CReporterAssistant.py:780
+#: ../src/gui/CReporterAssistant.py:808
msgid "Copy"
msgstr "Kopiëren"
-#: ../src/gui/CReporterAssistant.py:786
+#: ../src/gui/CReporterAssistant.py:814
msgid "I agree with submitting the backtrace"
msgstr "Ik stem in met het versturen van de backtrace"
-#: ../src/gui/CReporterAssistant.py:791
+#: ../src/gui/CReporterAssistant.py:819
msgid "Approve the backtrace"
msgstr "De backtrace goedkeuren"
-#: ../src/gui/CReporterAssistant.py:834
+#: ../src/gui/CReporterAssistant.py:862
msgid "You need to fill the how to before you can proceed..."
msgstr "Je moet hoe te reproduceren invullen voor je verder kan gaan..."
-#: ../src/gui/CReporterAssistant.py:857
+#: ../src/gui/CReporterAssistant.py:885
msgid "How did this crash happen (step-by-step)? How would you reproduce it?"
msgstr "Hoe ontstaat deze crash (stap-voor-stap)? Hoe kun je het reproduceren?"
-#: ../src/gui/CReporterAssistant.py:877
+#: ../src/gui/CReporterAssistant.py:905
msgid ""
"Are there any comments you would like to share with the software maintainers?"
msgstr "Heb je commentaar die je wilt delen met de software onderhouders?"
-#: ../src/gui/CReporterAssistant.py:897
+#: ../src/gui/CReporterAssistant.py:925
msgid "Provide additional details"
msgstr "Bied extra details"
-#: ../src/gui/CReporterAssistant.py:904
+#: ../src/gui/CReporterAssistant.py:932
msgid ""
"<b>Tip:</b> Your comments are not private. Please watch what you say "
"accordingly."
msgstr "<b>Tip:</b> Jouw commentaar is niet privé. Let dus op wat je zegt."
-#: ../src/gui/CReporterAssistant.py:945
+#: ../src/gui/CReporterAssistant.py:973
msgid "Confirm and send the report"
msgstr "Bevestig en verstuur het rapport"
-#: ../src/gui/CReporterAssistant.py:947
+#: ../src/gui/CReporterAssistant.py:975
msgid ""
"Below is a summary of your bug report. Please click 'Apply' to submit it."
msgstr ""
"Hieronder is een samenvatting van jouw bug rapport. Klik op 'Toepassen' om "
"het te versturen."
-#: ../src/gui/CReporterAssistant.py:952
+#: ../src/gui/CReporterAssistant.py:980
msgid "<b>Basic details</b>"
msgstr "<b>Bais details</b>"
#. left table
-#: ../src/gui/CReporterAssistant.py:959
+#: ../src/gui/CReporterAssistant.py:987
msgid "Component"
msgstr "Onderdeel"
-#: ../src/gui/CReporterAssistant.py:960
+#: ../src/gui/CReporterAssistant.py:988
msgid "Package"
msgstr "Pakket"
-#: ../src/gui/CReporterAssistant.py:961
+#: ../src/gui/CReporterAssistant.py:989
msgid "Executable"
msgstr "Uitvoerbaar programma"
-#: ../src/gui/CReporterAssistant.py:962
+#: ../src/gui/CReporterAssistant.py:990
msgid "Cmdline"
msgstr "Commando-regel"
#. right table
-#: ../src/gui/CReporterAssistant.py:964
+#: ../src/gui/CReporterAssistant.py:992
msgid "Architecture"
msgstr "Architectuur"
-#: ../src/gui/CReporterAssistant.py:965
+#: ../src/gui/CReporterAssistant.py:993
msgid "Kernel"
msgstr "Kernel"
-#: ../src/gui/CReporterAssistant.py:966
+#: ../src/gui/CReporterAssistant.py:994
msgid "Release"
msgstr "Vrijgave"
-#: ../src/gui/CReporterAssistant.py:967
+#: ../src/gui/CReporterAssistant.py:995
msgid "Reason"
msgstr "Reden"
-#: ../src/gui/CReporterAssistant.py:978 ../src/gui/report.glade.h:3
+#: ../src/gui/CReporterAssistant.py:1006 ../src/gui/report.glade.h:3
msgid "<b>Backtrace</b>"
msgstr "<b>Backtrace</b>"
-#: ../src/gui/CReporterAssistant.py:981
+#: ../src/gui/CReporterAssistant.py:1009
msgid "Click to view..."
msgstr "Klik om te bekijken..."
-#: ../src/gui/CReporterAssistant.py:993
+#: ../src/gui/CReporterAssistant.py:1021
msgid "<b>Steps to reproduce:</b>"
msgstr "<b>Stappen om te reproduceren:</b>"
-#: ../src/gui/CReporterAssistant.py:1014
+#: ../src/gui/CReporterAssistant.py:1042
msgid "<b>Comments:</b>"
msgstr "<b>Commentaar:</b>"
-#: ../src/gui/CReporterAssistant.py:1017
+#: ../src/gui/CReporterAssistant.py:1045
msgid "No comment provided!"
msgstr "Geen commentaar gegeven!"
-#: ../src/gui/CReporterAssistant.py:1053
+#: ../src/gui/CReporterAssistant.py:1081
msgid "Finished sending the bug report"
msgstr "Het versturen van het bug rapport is klaar"
-#: ../src/gui/CReporterAssistant.py:1057
+#: ../src/gui/CReporterAssistant.py:1085
msgid "<b>Bug reports:</b>"
msgstr "<b>Bug rapporten:</b>"
+#: ../src/gui/CReporterAssistant.py:1102
+msgid ""
+"Unable to get report!\n"
+"Is debuginfo missing?"
+msgstr ""
+"Kan geen rapport krijgen!\n"
+"Mist debuginfo?"
+
+#: ../src/gui/CReporterAssistant.py:1139
+#, python-format
+msgid "Error acquiring the report: %s"
+msgstr "Fout tijdens het verkrijgen van het rapport: %s"
+
#: ../src/gui/dialogs.glade.h:1
msgid "Log"
msgstr "Log"
@@ -1233,27 +1224,27 @@ msgstr ""
"configuratie te openen en te repareren voordat je verdergaat, omdat het "
"rapporteer proces anders kan mislukken.\n"
-#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.cpp:47
+#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.c:45
#, c-format
msgid "Uploaded: %llu of %llu kbytes"
msgstr "Upload: %llu van %llu KB"
-#: ../src/lib/parse_options.c:11
+#: ../src/lib/parse_options.c:29
#, c-format
msgid "Usage: %s\n"
msgstr "Gebruik: %s\n"
-#: ../src/plugins/abrt-action-analyze-c.c:154
+#: ../src/plugins/abrt-action-analyze-c.c:156
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID of coredumps"
msgstr ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Berekent en slaat UUID van coredumps op"
-#: ../src/plugins/abrt-action-analyze-oops.c:131
+#: ../src/plugins/abrt-action-analyze-oops.c:133
msgid ""
" [-vs] -d DIR\n"
"\n"
@@ -1263,86 +1254,109 @@ msgstr ""
"\n"
"Berekent en slaat UUID en DUPHASH van oops crash dumps op"
-#: ../src/plugins/abrt-action-analyze-python.c:36
+#: ../src/plugins/abrt-action-analyze-python.c:38
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of python crash dumps"
msgstr ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Berekent en slaat UUID en DUPHASH van python crash dumps op"
-#: ../src/plugins/abrt-action-bugzilla.cpp:532
+#: ../src/plugins/abrt-action-bugzilla.cpp:534
#, c-format
msgid "New bug id: %i"
msgstr "Nieuwe bug id: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:645
-#, c-format
-msgid "Can't open '%s'"
-msgstr "Kan '%s' niet openen"
-
-#: ../src/plugins/abrt-action-bugzilla.cpp:665
+#: ../src/plugins/abrt-action-bugzilla.cpp:662
#, c-format
msgid "Empty login or password, please check %s"
msgstr "Lege inlog of wachtwoord, controleer %s "
-#: ../src/plugins/abrt-action-bugzilla.cpp:683
+#: ../src/plugins/abrt-action-bugzilla.cpp:680
msgid "Logging into bugzilla..."
msgstr "Inloggen bij bugzilla..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:686
+#: ../src/plugins/abrt-action-bugzilla.cpp:683
msgid "Checking for duplicates..."
msgstr "Controleren voor dubbele..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:707
-#: ../src/plugins/abrt-action-bugzilla.cpp:743
+#: ../src/plugins/abrt-action-bugzilla.cpp:705
+#: ../src/plugins/abrt-action-bugzilla.cpp:741
msgid "Missing mandatory member 'bugs'"
msgstr "Verplicht onderdeel 'bugs' ontbreekt"
-#: ../src/plugins/abrt-action-bugzilla.cpp:726
-#: ../src/plugins/abrt-action-bugzilla.cpp:759
-#: ../src/plugins/abrt-action-bugzilla.cpp:834
+#: ../src/plugins/abrt-action-bugzilla.cpp:724
+#: ../src/plugins/abrt-action-bugzilla.cpp:757
+#: ../src/plugins/abrt-action-bugzilla.cpp:833
msgid "get_bug_info() failed. Could not collect all mandatory information"
msgstr ""
"get_bug_info() faalde. Kon alle noodzakelijke informatie niet verzamelen"
-#: ../src/plugins/abrt-action-bugzilla.cpp:775
+#: ../src/plugins/abrt-action-bugzilla.cpp:772
msgid "Creating a new bug..."
msgstr "Nieuwe bug aanmaken..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:780
+#: ../src/plugins/abrt-action-bugzilla.cpp:777
msgid "Bugzilla entry creation failed"
msgstr "Het aanmaken van een Bugzilla ingang mislukte"
-#: ../src/plugins/abrt-action-bugzilla.cpp:790
-#: ../src/plugins/abrt-action-bugzilla.cpp:887
+#: ../src/plugins/abrt-action-bugzilla.cpp:789
+#: ../src/plugins/abrt-action-bugzilla.cpp:886
msgid "Logging out..."
msgstr "Uitloggen..."
#. decision based on state
-#: ../src/plugins/abrt-action-bugzilla.cpp:808
+#: ../src/plugins/abrt-action-bugzilla.cpp:807
#, c-format
msgid "Bug is already reported: %i"
msgstr "Bug is al aangemeld: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:819
+#: ../src/plugins/abrt-action-bugzilla.cpp:818
#, c-format
msgid "Bugzilla couldn't find parent of bug %d"
msgstr "Bugzilla kon de ouder van bug %d niet vinden"
-#: ../src/plugins/abrt-action-bugzilla.cpp:848
+#: ../src/plugins/abrt-action-bugzilla.cpp:847
#, c-format
msgid "Add %s to CC list"
msgstr "Voeg %s toe aan CC lijst"
-#: ../src/plugins/abrt-action-bugzilla.cpp:872
+#: ../src/plugins/abrt-action-bugzilla.cpp:871
#, c-format
msgid "Adding new comment to bug %d"
msgstr "Voeg nieuw commentaar toe aan bug(%d)"
-#: ../src/plugins/abrt-action-generate-backtrace.c:319
+#: ../src/plugins/abrt-action-bugzilla.cpp:913
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to Bugzilla"
+msgstr ""
+" [-vs] -c CONF-BESTAND -d MAP\n"
+"\n"
+"Rapporteert een crash aan Bugzilla"
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:928
+#: ../src/plugins/abrt-action-kerneloops.c:148
+#: ../src/plugins/abrt-action-rhtsupport.c:282
+msgid "Configuration file (may be given many times)"
+msgstr "Configuratiebestand (kan meerdere keren gegeven worden)"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:258
+msgid " [options] -d DIR"
+msgstr " [opties] -d MAP"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:271
+msgid "Additional debuginfo directories"
+msgstr "Extra debuginfo mappen"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:272
+msgid "Kill gdb if it runs for more than N seconds"
+msgstr "Sluit gdb af als het meer dan N secondes draait"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:320
#, c-format
msgid "Backtrace parsing failed for %s"
msgstr "Backtrace ontleden mislukte voor %s"
@@ -1457,16 +1471,26 @@ msgstr "Alle debuginfo schijnt beschikbaar te zijn"
msgid "Complete!"
msgstr "Compleet!"
-#: ../src/plugins/abrt-action-kerneloops.cpp:111
+#: ../src/plugins/abrt-action-kerneloops.c:105
#, c-format
msgid "Submitting oops report to %s"
msgstr "Stuur oops rapport naar %s"
-#: ../src/plugins/abrt-action-mailx.cpp:114
+#: ../src/plugins/abrt-action-kerneloops.c:133
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a kernel oops to kerneloops.org (or similar) site"
+msgstr ""
+" [-vs] -c CONF-BESTAND -d MAP\n"
+"\n"
+"Rapporteer een kernel oops aan kerneloops.org (of vergelijkbare) site"
+
+#: ../src/plugins/abrt-action-mailx.c:110
msgid "Sending an email..."
msgstr "Versturen van een email..."
-#: ../src/plugins/abrt-action-mailx.cpp:138
+#: ../src/plugins/abrt-action-mailx.c:137
msgid ""
" [-v] -d DIR [-c CONFFILE]\n"
"\n"
@@ -1476,12 +1500,12 @@ msgstr ""
"\n"
"Upload gecomprimeerde tarball of crash dump"
-#: ../src/plugins/abrt-action-mailx.cpp:151
-#: ../src/plugins/abrt-action-upload.cpp:267
+#: ../src/plugins/abrt-action-mailx.c:150
+#: ../src/plugins/abrt-action-upload.c:262
msgid "Config file"
msgstr "Config bestand"
-#: ../src/plugins/abrt-action-print.cpp:39
+#: ../src/plugins/abrt-action-print.c:38
msgid ""
" [-v] [-o FILE] -d DIR\n"
"\n"
@@ -1491,16 +1515,16 @@ msgstr ""
"\n"
"Print informatie over de crash naar standaard output"
-#: ../src/plugins/abrt-action-print.cpp:51
+#: ../src/plugins/abrt-action-print.c:51
msgid "Output file"
msgstr "Output bestand"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was appended to %s"
msgstr "Het rapport werd toegevoegd aan %s"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was stored to %s"
msgstr "Het rapport werd opgeslagen in %s"
@@ -1508,36 +1532,46 @@ msgstr "Het rapport werd opgeslagen in %s"
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
#. error msg is already logged by dd_opendir
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
-#: ../src/plugins/abrt-action-rhtsupport.cpp:43
-#: ../src/plugins/abrt-action-upload.cpp:121
+#: ../src/plugins/abrt-action-rhtsupport.c:41
+#: ../src/plugins/abrt-action-upload.c:119
msgid "Compressing data"
msgstr "Data comprimeren"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:78
+#: ../src/plugins/abrt-action-rhtsupport.c:73
msgid "Empty login or password, please check RHTSupport.conf"
msgstr "Lege inlog of wachtwoord, controleer RHTSupport.conf"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:194
+#: ../src/plugins/abrt-action-rhtsupport.c:192
msgid "Creating a new case..."
msgstr "Een nieuwe zaak aanmaken..."
-#: ../src/plugins/abrt-action-upload.cpp:65
+#: ../src/plugins/abrt-action-rhtsupport.c:267
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to RHTSupport"
+msgstr ""
+" [-vs] -c CONF-BESTAND -d MAP\n"
+"\n"
+"Rapporteer een crash aan RHTSupport"
+
+#: ../src/plugins/abrt-action-upload.c:63
#, c-format
msgid "Sending %s to %s"
msgstr "%s versturen naar %s"
#. This ends up a "reporting status message" in abrtd
-#: ../src/plugins/abrt-action-upload.cpp:98
+#: ../src/plugins/abrt-action-upload.c:96
#, c-format
msgid "Successfully sent %s to %s"
msgstr "%s met succes verzonden naar %s"
-#: ../src/plugins/abrt-action-upload.cpp:219
+#: ../src/plugins/abrt-action-upload.c:213
#, c-format
msgid "Archive is created: '%s'"
msgstr "Archief is gemaakt: '%s'"
-#: ../src/plugins/abrt-action-upload.cpp:253
+#: ../src/plugins/abrt-action-upload.c:248
msgid ""
" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
"\n"
@@ -1547,10 +1581,36 @@ msgstr ""
"\n"
"Upload gecomprimeerde tarball of crash dump"
-#: ../src/plugins/abrt-action-upload.cpp:268
+#: ../src/plugins/abrt-action-upload.c:263
msgid "Base URL to upload to"
msgstr "Basis URL om naar te uploaden"
+#: ../src/plugins/abrt-dump-oops.c:540
+msgid ""
+" [-vsrdow] FILE\n"
+"\n"
+"Extract oops from syslog/dmesg file"
+msgstr ""
+" [-vsrdow] BESTAND\n"
+"\n"
+"Extraheer oops uit syslog/dmesg bestand"
+
+#: ../src/plugins/abrt-dump-oops.c:556
+msgid "Parse kernel's message buffer before parsing FILE"
+msgstr "ontleed boodschap buffer van kernel voor het ontleden van BESTAND"
+
+#: ../src/plugins/abrt-dump-oops.c:557
+msgid "Create ABRT dump for every oops found"
+msgstr "Maak ABRT dump aan voor iedere gevonden oops"
+
+#: ../src/plugins/abrt-dump-oops.c:558
+msgid "Print found oopses on standard output"
+msgstr "Print gevonden oops naar standaard output"
+
+#: ../src/plugins/abrt-dump-oops.c:559
+msgid "Do not exit, watch the file for new oopses"
+msgstr "Sluit niet af, bekijk het bestand voor nieuwe oopses"
+
#: ../src/plugins/Bugzilla.glade.h:1
msgid "<b>Bugzilla plugin configuration</b>"
msgstr "<b>Bugzilla plug-in configuratie</b>"
@@ -1587,10 +1647,6 @@ msgstr ""
"Je kunt het <a href=\"https://bugzilla.redhat.com/createaccount.cgi\">hier</"
"a> aanmaken"
-#: ../src/plugins/CCpp.cpp:277
-msgid "Analyzes crashes in C/C++ programs"
-msgstr "Analyseert crashes in C/C++ programma's"
-
#: ../src/plugins/KerneloopsReporter.glade.h:1
msgid "<b>Kerneloops Reporter plugin configuration</b>"
msgstr "<b>Kerneloops reporter plug-in configuratie</b>"
@@ -1599,10 +1655,6 @@ msgstr "<b>Kerneloops reporter plug-in configuratie</b>"
msgid "Submit URL:"
msgstr "Dien URL in:"
-#: ../src/plugins/KerneloopsScanner.cpp:227
-msgid "Periodically scans for and saves kernel oopses"
-msgstr "Regelmatig scannen en opslaan van kernel oopses"
-
#: ../src/plugins/Logger.glade.h:1
msgid "<b>Logger plugin configuration</b>"
msgstr "<b>Logger plug-in configuratie</b>"
@@ -1667,6 +1719,79 @@ msgstr "URL:"
msgid "Use encryption"
msgstr "Gebruik encryptie"
+#~ msgid ""
+#~ "Usage: %s [OPTION]\n"
+#~ "\n"
+#~ "Startup:\n"
+#~ "\t-V, --version\t\tdisplay the version and exit\n"
+#~ "\t-v, --verbose\t\tincrease verbosity\n"
+#~ "Actions:\n"
+#~ "\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
+#~ "\t -f, --full\tprint a list of all crashes, including the already "
+#~ "reported ones\n"
+#~ "\t-r, --report CRASH_ID\tcreate and send a report\n"
+#~ "\t -y, --always\tcreate and send a report without asking\n"
+#~ "\t-d, --delete CRASH_ID\tremove a crash\n"
+#~ "\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
+#~ "\t -b, --backtrace\tprint detailed information about a crash "
+#~ "including backtrace\n"
+#~ "CRASH_ID can be:\n"
+#~ "\ta name of dump directory, or\n"
+#~ "\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+#~ msgstr ""
+#~ "Gebruik: %s [OPTIE]\n"
+#~ "\n"
+#~ "Opstarten:\n"
+#~ "\t-V, --version\t\tlaat de versie zien en sluit af\n"
+#~ "\t-v, --verbose\t\tgeef meer detail\n"
+#~ "Acties:\n"
+#~ "\t-l, --list\t\tlaat lijst van crashes zien die nog niet gerapporteerd "
+#~ "zijn\n"
+#~ "\t\t-f, --full\tlaat lijst van alle crashes zien, inclusief de reeds "
+#~ "gerapporteerde\n"
+#~ "\t-r, --report CRASH_ID\tmaak een rapport aan en verstuur deze\n"
+#~ "\t\t-y, --always \tmaak een rapport aan en verstuur deze zonder te "
+#~ "vragen\n"
+#~ "\t-d, --delete CRASH_ID\tverwijder een crash\n"
+#~ "\t-i, --info CRASH_ID\tlaat gedetailleerde informatie over crash zien\n"
+#~ "\t\t-b, --backtrace\tlaat gedetailleerde informatie over crash zien "
+#~ "inclusief backtrace\n"
+#~ "CRASH_ID kan zijn:\n"
+#~ "\teen naam van een dump map of\n"
+#~ "\t@N - N-de crash (zoals getoond door --list --full) waarop actie "
+#~ "ondernomen zal worden\n"
+
+#~ msgid "Error loading reporter settings"
+#~ msgstr "Fout tijdens het laden van rapporteer instellingen"
+
+#~ msgid "You must check the backtrace for sensitive data."
+#~ msgstr "Je moet de backtrace controleren op gevoelige data."
+
+#~ msgid "The backtrace is unusable, you cannot report this!"
+#~ msgstr "De backtrace in onbruikbaar, je kunt dit niet rapporteren!"
+
+#~ msgid "Reporting disabled, please fix the problems shown above."
+#~ msgstr "Rapporteren is uitgezet, los de hierboven getoonde problemen op."
+
+#~ msgid "Sends the report using the selected plugin."
+#~ msgstr "Verstuur het rapport met de geselecteerde plug-in."
+
+#~ msgid ""
+#~ "No reporter plugin available for this type of crash.\n"
+#~ "Please check abrt.conf."
+#~ msgstr ""
+#~ "Er is geen rapportage plug-in beschikbaar voor dit type crash\n"
+#~ "Controleer abrt.conf."
+
+#~ msgid "Can't open '%s'"
+#~ msgstr "Kan '%s' niet openen"
+
+#~ msgid "Analyzes crashes in C/C++ programs"
+#~ msgstr "Analyseert crashes in C/C++ programma's"
+
+#~ msgid "Periodically scans for and saves kernel oopses"
+#~ msgstr "Regelmatig scannen en opslaan van kernel oopses"
+
#~ msgid "Database plugin not specified. Please check abrtd settings."
#~ msgstr ""
#~ "Database plug-in niet gespecificeerd. Controleer de artd instellingen."
diff --git a/po/or.po b/po/or.po
index e0907593..55d34508 100644
--- a/po/or.po
+++ b/po/or.po
@@ -2,20 +2,20 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
-# Manoj Kumar Giri <mgiri@redhat.com>, 2009, 2010.
+# Manoj Kumar Giri <mgiri@redhat.com>, 2009, 2010, 2011.
msgid ""
msgstr ""
"Project-Id-Version: abrt.master.or\n"
"Report-Msgid-Bugs-To: jmoskovc@redhat.com\n"
-"POT-Creation-Date: 2010-11-29 13:51+0100\n"
-"PO-Revision-Date: 2010-07-30 17:52+0530\n"
+"POT-Creation-Date: 2011-02-04 11:14+0000\n"
+"PO-Revision-Date: 2011-02-04 17:03+0530\n"
"Last-Translator: Manoj Kumar Giri <mgiri@redhat.com>\n"
"Language-Team: Oriya <Translation-team-or@lists.sourceforge.net>\n"
-"Language: or\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.11.4\n"
+"Language: or\n"
+"X-Generator: Lokalize 1.1\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
"\n"
"\n"
@@ -50,16 +50,16 @@ msgstr "ABRT ବିଜà­à¬žà¬ªà­à¬¤à¬¿ ଆପଲେଟ"
msgid "Automatic Bug Reporting Tool"
msgstr "ସà­à­±à­Ÿà¬‚ଚାଳିତ ତà­à¬°à­à¬Ÿà¬¿ ନିବାରଣ ସାଧନ"
-#: ../src/applet/Applet.cpp:86
+#: ../src/applet/applet.c:86
#, c-format
msgid "A crash in the %s package has been detected"
msgstr "ପà­à­Ÿà¬¾à¬•à­‡à¬œ %s ରେ ଗୋଟିଠବିନାଶ ଚିହà­à¬¨à¬¾à¬ªà¬¡à¬¼à¬¿à¬›à¬¿"
-#: ../src/applet/Applet.cpp:88
+#: ../src/applet/applet.c:88
msgid "A crash has been detected"
msgstr "ଗୋଟିଠବିନାଶ ଚିହà­à¬¨à¬¾à¬ªà¬¡à¬¼à¬¿à¬›à¬¿"
-#: ../src/applet/Applet.cpp:285
+#: ../src/applet/applet.c:285
msgid "ABRT service is not running"
msgstr "ABRT ସରà­à¬­à¬¿à¬¸à¬Ÿà¬¿ ଚାଲà­à¬¨à¬¾à¬¹à¬¿à¬"
@@ -69,10 +69,8 @@ msgid "Warning"
msgstr "ଚେତାବନୀ"
#: ../src/applet/applet_gtk.c:230
-msgid ""
-"Notification area applet that notifies users about issues detected by ABRT"
-msgstr ""
-"ABRT ଦà­à­±à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬¾à¬¹à­‹à¬‡à¬¥à¬¿à¬¬à¬¾ ସମସà­à­Ÿà¬¾à¬—à­à¬¡à¬¼à¬¿à¬• ବିଷୟରେ ଚାଳକଙà­à¬•à­ ସୂଚାଇବା ପାଇଠବିଜà­à¬žà¬ªà­à¬¤à¬¿ କà­à¬·à­‡à¬¤à­à¬° ଆପଲେଟ"
+msgid "Notification area applet that notifies users about issues detected by ABRT"
+msgstr "ABRT ଦà­à­±à¬¾à¬°à¬¾ ଚିହà­à¬¨à¬¾à¬¹à­‹à¬‡à¬¥à¬¿à¬¬à¬¾ ସମସà­à­Ÿà¬¾à¬—à­à¬¡à¬¼à¬¿à¬• ବିଷୟରେ ଚାଳକଙà­à¬•à­ ସୂଚାଇବା ପାଇଠବିଜà­à¬žà¬ªà­à¬¤à¬¿ କà­à¬·à­‡à¬¤à­à¬° ଆପଲେଟ"
#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:23
msgid "translator-credits"
@@ -90,8 +88,8 @@ msgstr "ରିପୋରà­à¬Ÿ"
msgid "Open ABRT"
msgstr "ABRT ଖୋଲନà­à¬¤à­"
-#: ../src/cli/CLI.cpp:47
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:91
+#, c-format
msgid ""
"\tCrash dump : %s\n"
"\tUID : %s\n"
@@ -100,20 +98,20 @@ msgid ""
"\tCrash Time : %s\n"
"\tCrash Count: %s\n"
msgstr ""
+"\tCrash dump : %s\n"
"\tUID : %s\n"
-"\tUUID : %s\n"
"\tPackage : %s\n"
"\tExecutable : %s\n"
"\tCrash Time : %s\n"
"\tCrash Count: %s\n"
-#: ../src/cli/CLI.cpp:65
+#: ../src/cli/CLI.cpp:110
#, c-format
msgid "\tHostname : %s\n"
msgstr "\tHostname : %s\n"
-#: ../src/cli/CLI.cpp:98
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:143
+#, c-format
msgid ""
"Dump directory: %s\n"
"Last crash: %s\n"
@@ -125,39 +123,37 @@ msgid ""
"System: %s, kernel %s\n"
"Reason: %s\n"
msgstr ""
-"ବିନାଶ ID: %s:%s\n"
+"ଡମà­à¬ª ଡିରେକà­à¬Ÿà­‹à¬°à­€: %s\n"
"ଅନà­à¬¤à¬¿à¬® ବିନାଶ: %s\n"
"ବିଶà­à¬³à­‡à¬·à¬•: %s\n"
"ଉପାଦାନ: %s\n"
"ପà­à­Ÿà¬¾à¬•à­‡à¬œ: %s\n"
"ନିରà­à¬¦à­à¬¦à­‡à¬¶: %s\n"
"ନିଷà­à¬ªà¬¾à¬¦à¬¨à¬¯à­‹à¬—à­à­Ÿ: %s\n"
-"ତନà­à¬¤à­à¬°: %s, kernel %s\n"
-"ମାନà­à­Ÿà¬¤à¬¾: %s\n"
-"Coredump ଫାଇଲ: %s\n"
+"ତନà­à¬¤à­à¬°: %s, କରà­à¬£à­à¬£à¬² %s\n"
"କାରଣ: %s\n"
-#: ../src/cli/CLI.cpp:125
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:171
+#, c-format
msgid "Coredump file: %s\n"
-msgstr "ବିନାଶ କାରà­à¬¯à­à¬¯: %s\n"
+msgstr "କୋରଡମà­à¬ª ଫାଇଲ: %s\n"
-#: ../src/cli/CLI.cpp:129
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:175
+#, c-format
msgid "Rating: %s\n"
-msgstr "ହୋଷà­à¬Ÿà¬¨à¬¾à¬®: %s\n"
+msgstr "ମାନà­à­Ÿà¬¤à¬¾: %s\n"
-#: ../src/cli/CLI.cpp:134
+#: ../src/cli/CLI.cpp:180
#, c-format
msgid "Crash function: %s\n"
msgstr "ବିନାଶ କାରà­à¬¯à­à¬¯: %s\n"
-#: ../src/cli/CLI.cpp:138
+#: ../src/cli/CLI.cpp:184
#, c-format
msgid "Hostname: %s\n"
msgstr "ହୋଷà­à¬Ÿà¬¨à¬¾à¬®: %s\n"
-#: ../src/cli/CLI.cpp:142
+#: ../src/cli/CLI.cpp:188
#, c-format
msgid ""
"\n"
@@ -168,7 +164,7 @@ msgstr ""
"କିପରି ପà­à¬¨à¬°à­à¬¬à¬¾à¬° ଉତà­à¬ªà¬¾à¬¦à¬¨ କରାଯିବ:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:146
+#: ../src/cli/CLI.cpp:192
#, c-format
msgid ""
"\n"
@@ -179,7 +175,7 @@ msgstr ""
"ଟିପà­à¬ªà¬£à­€:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:152
+#: ../src/cli/CLI.cpp:198
#, c-format
msgid ""
"\n"
@@ -190,70 +186,65 @@ msgstr ""
"ବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à¬¾à¬¸:\n"
"%s\n"
-#. Message has embedded tabs.
-#: ../src/cli/CLI.cpp:243
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:295
+#, c-format
msgid ""
-"Usage: %s [OPTION]\n"
-"\n"
-"Startup:\n"
-"\t-V, --version\t\tdisplay the version of %s and exit\n"
-"\t-?, --help\t\tprint this help\n"
-"\n"
-"Actions:\n"
-"\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
-"\t -f, --full\tprint a list of all crashes, including the already "
-"reported ones\n"
-"\t-r, --report CRASH_ID\tcreate and send a report\n"
-"\t -y, --always\tcreate and send a report without asking\n"
-"\t-d, --delete CRASH_ID\tremove a crash\n"
-"\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
-"\t -b, --backtrace\tprint detailed information about a crash including "
-"backtrace\n"
-"CRASH_ID can be:\n"
-"\ta name of dump directory, or\n"
-"\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+"Usage: %s -l[f] [-D BASE_DIR]...]\n"
+" or: %s -r[y] CRASH_DIR\n"
+" or: %s -i[b] CRASH_DIR\n"
+" or: %s -d CRASH_DIR\n"
+"\n"
+"\t-l, --list\t\tList not yet reported crashes\n"
+"\t -f, --full\t\tList all crashes\n"
+"\t-D BASE_DIR\t\tDirectory to list crashes from\n"
+"\t\t\t\t(default: -D $HOME/.abrt/spool -D %s)\n"
+"\n"
+"\t-r, --report\t\tSend a report about CRASH_DIR\n"
+"\t -y, --always\t\t...without editing and asking\n"
+"\t-i, --info\t\tPrint detailed information about CRASH_DIR\n"
+"\t -b, --backtrace\t...including backtrace\n"
+"\t-d, --delete\t\tRemove CRASH_DIR\n"
+"\n"
+"\t-V, --version\t\tDisplay version and exit\n"
+"\t-v, --verbose\t\tBe verbose\n"
msgstr ""
-"ବà­à­Ÿà¬¬à¬¾à¬¹à¬° ବିଧି: %s [OPTION]\n"
-"\n"
-"ଆରମà­à¬­:\n"
-"\t-V, --version\t\t%s ର ସଂସà­à¬•à¬°à¬£ ଦରà­à¬¶à¬¾à¬¨à­à¬¤à­ à¬à¬¬à¬‚ ପà­à¬°à¬¸à­à¬¥à¬¾à¬¨ କରନà­à¬¤à­\n"
-"\t-?, --help\t\tà¬à¬¹à¬¿ ସହାୟତାକୠମà­à¬¦à­à¬°à¬£ କରନà­à¬¤à­\n"
-"\n"
-"କାରà­à¬¯à­à­Ÿ:\n"
-"\t-l, --list\t\tସମସà­à¬¤ ବିନାଶର ଗୋଟିଠତାଲିକାକୠମà­à¬¦à­à¬°à¬£ କରନà­à¬¤à­ ଯାହାକà­à¬•à¬¿ à¬à¬ªà¬°à­à¬¯à­à­Ÿà¬¨à­à¬¤ ମà­à¬¦à­à¬°à¬£ "
-"କରାଯାଇନାହିà¬\n"
-"\t -f, --full\tସମସà­à¬¤ ବିନାଶର ଗୋଟିଠତାଲିକାକୠମà­à¬¦à­à¬°à¬£ କରନà­à¬¤à­, ପୂରà­à¬¬à¬°à­ ଖବର କରାଯାଇଥିବା "
-"ବିନାଶକୠଅନà­à¬¤à¬°à­à¬­à­à¬•à­à¬¤ କରି\n"
-"\t-r, --report CRASH_ID\tବିବରଣୀ ପà­à¬°à¬¸à­à¬¤à­à¬¤ କରନà­à¬¤à­ à¬à¬¬à¬‚ ପଠାନà­à¬¤à­\n"
-"\t -y, --always\tନପଚାରି ଗୋଟିଠବିବରଣୀ ପà­à¬°à¬¸à­à¬¤à­à¬¤ କରନà­à¬¤à­ à¬à¬¬à¬‚ ପଠାନà­à¬¤à­\n"
-"\t-d, --delete CRASH_ID\tବିନାଶକୠବାହାର କରନà­à¬¤à­\n"
-"\t-i, --info CRASH_ID\tବିବରଣୀ ବିଷୟରେ ଗୋଟିଠବିସà­à¬¤à­ƒà¬¤ ସୂଚନା ମà­à¬¦à­à¬°à¬£ କରନà­à¬¤à­\n"
-"\t -b, --backtrace\tବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à¬¾à¬¸à¬•à­ ଅନà­à¬¤à¬°à­à¬­à­à¬•à­à¬¤ କରି ବିବରଣୀ ବିଷୟରେ ଗୋଟିଠବିସà­à¬¤à­ƒà¬¤ ସୂଚନା "
-"ମà­à¬¦à­à¬°à¬£ କରନà­à¬¤à­\n"
-"CRASH_ID à¬à¬¹à¬¾ ହୋଇପାରେ:\n"
-"\tUID:UUID ଯà­à¬—ଳ,\n"
-"\tunique UUID ଉପସରà­à¬— - ମେଳଖାଉଥିବା UUID ବିଶିଷà­à¬Ÿ ବିନାଶକୠà¬à¬¥à¬¿à¬°à­‡ କାରà­à¬¯à­à­Ÿà¬•à¬¾à¬°à­€ କରାହେବ\n"
-"\t@N - N'th ବିନାଶ (--list --full ରେ ଦରà­à¬¶à¬¾à¬¯à¬¾à¬‡à¬¥à¬¿à¬¬à¬¾ ପରି) à¬à¬¥à¬¿à¬°à­‡ କାରà­à¬¯à­à­Ÿà¬•à¬¾à¬°à­€ କରାହେବ\n"
-
-#: ../src/cli/CLI.cpp:287
+"Usage: %s -l[f] [-D BASE_DIR]...]\n"
+" or: %s -r[y] CRASH_DIR\n"
+" or: %s -i[b] CRASH_DIR\n"
+" or: %s -d CRASH_DIR\n"
+"\n"
+"\t-l, --list\t\tList not yet reported crashes\n"
+"\t -f, --full\t\tList all crashes\n"
+"\t-D BASE_DIR\t\tDirectory to list crashes from\n"
+"\t\t\t\t(default: -D $HOME/.abrt/spool -D %s)\n"
+"\n"
+"\t-r, --report\t\tSend a report about CRASH_DIR\n"
+"\t -y, --always\t\t...without editing and asking\n"
+"\t-i, --info\t\tPrint detailed information about CRASH_DIR\n"
+"\t -b, --backtrace\t...including backtrace\n"
+"\t-d, --delete\t\tRemove CRASH_DIR\n"
+"\n"
+"\t-V, --version\t\tDisplay version and exit\n"
+"\t-v, --verbose\t\tBe verbose\n"
+
+#: ../src/cli/CLI.cpp:343
msgid "You must specify exactly one operation"
msgstr "ଆପଣଙà­à¬•à­ ପà­à¬°à¬•à­ƒà¬¤à¬°à­‡ ଗୋଟିଠପà­à¬°à­Ÿà­‹à¬—କୠଉଲà­à¬²à­‡à¬– କରିବାକୠହେବ"
-#: ../src/cli/report.cpp:166
+#: ../src/cli/report.cpp:161
#, c-format
msgid "# This field is read only\n"
msgstr "# à¬à¬¹à¬¿ କà­à¬·à­‡à¬¤à­à¬°à¬Ÿà¬¿ କେବଳ ପଠନୀୟ\n"
-#: ../src/cli/report.cpp:186
+#: ../src/cli/report.cpp:181
msgid "# Describe the circumstances of this crash below"
msgstr "# ନିମà­à¬¨à¬°à­‡ ଥିବା ବିନାଶର ପରିସà­à¬¥à¬¿à¬¤à¬¿à¬•à­ ବରà­à¬£à­à¬£à¬¨à¬¾ କରନà­à¬¤à­"
-#: ../src/cli/report.cpp:188
+#: ../src/cli/report.cpp:183
msgid "# How to reproduce the crash?"
msgstr "# ସେହି ବିନାଶକୠପà­à¬£à¬¿à¬¥à¬°à­‡ କିପରି ଉତà­à¬ªà¬¨à­à¬¨ କରିହେବ?"
-#: ../src/cli/report.cpp:190
+#: ../src/cli/report.cpp:185
msgid ""
"# Backtrace\n"
"# Check that it does not contain any sensitive data (passwords, etc.)"
@@ -261,47 +252,47 @@ msgstr ""
"# ବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à­‡à¬¸\n"
"# à¬à¬¥à¬¿à¬°à­‡ କୌଣସି ସà­à¬ªà¬°à­à¬¶à¬•à¬¾à¬¤à¬° ତଥà­à­Ÿ ଅଛି କି ନାହିଠତାହା ଯାଞà­à¬š କରନà­à¬¤à­ (ପà­à¬°à¬¬à­‡à¬¶ ସଂକେତ, ଇତà­à­Ÿà¬¾à¬¦à¬¿)"
-#: ../src/cli/report.cpp:192
+#: ../src/cli/report.cpp:187
msgid "# Architecture"
msgstr "# ସଂରଚନା"
-#: ../src/cli/report.cpp:193
+#: ../src/cli/report.cpp:188
msgid "# Command line"
msgstr "# ନିରà­à¬¦à­à¬¦à­‡à¬¶ ଧାଡ଼ି"
-#: ../src/cli/report.cpp:194
+#: ../src/cli/report.cpp:189
msgid "# Component"
msgstr "# ଉପାଦାନ"
-#: ../src/cli/report.cpp:195
+#: ../src/cli/report.cpp:190
msgid "# Core dump"
msgstr "# କୋର ଡମà­à¬ª"
-#: ../src/cli/report.cpp:196
+#: ../src/cli/report.cpp:191
msgid "# Executable"
msgstr "# ନିଷà­à¬ªà¬¾à¬¦à¬¨ ଯୋଗà­à­Ÿ"
-#: ../src/cli/report.cpp:197
+#: ../src/cli/report.cpp:192
msgid "# Kernel version"
msgstr "# କରà­à¬£à­à¬£à¬² ସଂସà­à¬•à¬°à¬£"
-#: ../src/cli/report.cpp:198
+#: ../src/cli/report.cpp:193
msgid "# Package"
msgstr "# ପà­à­Ÿà¬¾à¬•à­‡à¬œ"
-#: ../src/cli/report.cpp:199
+#: ../src/cli/report.cpp:194
msgid "# Reason of crash"
msgstr "# ବିନାଶର କାରଣ"
-#: ../src/cli/report.cpp:200
+#: ../src/cli/report.cpp:195
msgid "# Release string of the operating system"
msgstr "# ପà­à¬°à¬šà¬¾à¬³à¬¨ ତନà­à¬¤à­à¬°à¬° ବାକà­à­Ÿà¬–ଣà­à¬¡à¬•à­ ପà­à¬°à¬•à¬¾à¬¶ କରନà­à¬¤à­"
-#: ../src/cli/report.cpp:323
+#: ../src/cli/report.cpp:318
msgid "Cannot run vi: $TERM, $VISUAL and $EDITOR are not set"
msgstr "vi କୠଚଲାଇପାରିବେ ନାହିà¬: $TERM, $VISUAL à¬à¬¬à¬‚ $EDITOR କୠସେଟକରାଯାଇନାହିà¬"
-#: ../src/cli/report.cpp:411
+#: ../src/cli/report.cpp:402
msgid ""
"\n"
"The report has been updated"
@@ -309,7 +300,7 @@ msgstr ""
"\n"
"ବିବରଣୀକୠଅଦà­à­Ÿà¬¤à¬¨ କରାଯାଇଛି"
-#: ../src/cli/report.cpp:413
+#: ../src/cli/report.cpp:404
msgid ""
"\n"
"No changes were detected in the report"
@@ -318,104 +309,127 @@ msgstr ""
"ବିବରଣୀରେ କୌଣସି ପରିବରà­à¬¤à­à¬¤à¬¨ ଚିହà­à¬¨à¬¾à¬ªà¬¡à¬¼à¬¿ ନାହିà¬"
#. The response might take more than 1 char in non-latin scripts.
-#: ../src/cli/report.cpp:464
+#: ../src/cli/report.cpp:436
msgid "y"
-msgstr ""
+msgstr "y"
-#: ../src/cli/report.cpp:465
+#: ../src/cli/report.cpp:437
msgid "N"
-msgstr ""
+msgstr "N"
#. Read the missing information and push it to plugin settings.
-#: ../src/cli/report.cpp:565
+#: ../src/cli/report.cpp:568
#, c-format
msgid "Wrong settings were detected for plugin %s\n"
msgstr "ପà­à¬²à¬—ଇନ %s ପାଇଠଭà­à¬² ବିନà­à­Ÿà¬¾à¬¸ ଚିହà­à¬¨à¬¾à¬¹à­‹à¬‡à¬›à¬¿\n"
-#: ../src/cli/report.cpp:569
+#: ../src/cli/report.cpp:572
msgid "Enter your login: "
msgstr "ଆପଣଙà­à¬•à¬° ଲଗଇନକୠଭରଣ କରନà­à¬¤à­: "
-#: ../src/cli/report.cpp:575
+#: ../src/cli/report.cpp:578
msgid "Enter your password: "
msgstr "ଆପଣଙà­à¬•à¬° ପà­à¬°à¬¬à­‡à¬¶ ସଂକେତକୠଭରଣ କରନà­à¬¤à­: "
-#: ../src/cli/report.cpp:638
+#: ../src/cli/report.cpp:788
msgid "Reporting..."
msgstr "ଖବର କରà­à¬…ଛି..."
-#: ../src/cli/report.cpp:657
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:801
+#, c-format
msgid "Report using %s?"
-msgstr "%s କୠବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରି ଖବର କରନà­à¬¤à­? [y/N]: "
+msgstr "%s କୠବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରି ଖବର କରିବେ କି?"
-#: ../src/cli/report.cpp:660
+#: ../src/cli/report.cpp:804
msgid "Skipping..."
msgstr "à¬à¬¡à¬¼à¬¾à¬‡à¬¦à­‡à¬‰à¬›à¬¿..."
-#: ../src/cli/report.cpp:672
-#, fuzzy
+#: ../src/cli/report.cpp:820
msgid "Reporting disabled because the backtrace is unusable"
-msgstr ""
-"ଖବର କରିବା ପଦà­à¬§à¬¤à¬¿à¬•à­ ନିଷà­à¬•à­à¬°à¬¿à­Ÿ କରାଯାଇଛି, ଉପରେ ଦରà­à¬¶à¬¾à¬¯à¬¾à¬‡à¬¥à¬¿à¬¬à¬¾ ସମସà­à­Ÿà¬¾à¬—à­à¬¡à¬¼à¬¿à¬•à­ ଦୟାକରି ସମାଧାନ କରନà­à¬¤à­à¥¤"
+msgstr "ଖବର କରିବା ପଦà­à¬§à¬¤à¬¿à¬•à­ ନିଷà­à¬•à­à¬°à¬¿à­Ÿ କରାଯାଇଛି, ଉପରେ ଦରà­à¬¶à¬¾à¬¯à¬¾à¬‡à¬¥à¬¿à¬¬à¬¾ ସମସà­à­Ÿà¬¾à¬—à­à¬¡à¬¼à¬¿à¬•à­ ଦୟାକରି ସମାଧାନ କରନà­à¬¤à­"
-#: ../src/cli/report.cpp:676
+#: ../src/cli/report.cpp:824
#, c-format
msgid ""
"Please try to install debuginfo manually using the command: \"debuginfo-"
"install %s\" and try again\n"
msgstr ""
+"ଦୟାକରି ତà­à¬°à­à¬Ÿà¬¿ ନିବାରଣ ସୂଚନାକୠà¬à¬¹à¬¿ ନିରà­à¬¦à­à¬¦à­‡à¬¶à¬•à­ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରି ହସà­à¬¤à¬•à­ƒà¬¤ ଭାବରେ ସà­à¬¥à¬¾à¬ªà¬¨ କରନà­à¬¤à­: "
+"\"debuginfo-install %s\" à¬à¬¬à¬‚ ପà­à¬£à¬¿à¬¥à¬°à­‡ ଚେଷà­à¬Ÿà¬¾à¬•à¬°à¬¨à­à¬¤à­\n"
-#: ../src/cli/report.cpp:685
-#, fuzzy
-msgid "Error loading reporter settings"
-msgstr "ବିବରଣୀ ପାଇବାରେ ତà­à¬°à­à¬Ÿà¬¿: %s"
-
-#: ../src/cli/report.cpp:704
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:842
+#, c-format
msgid "Crash reported via %d report events (%d errors)\n"
-msgstr "%d ପà­à¬²à¬—ଇନଗà­à¬¡à¬¼à¬¿à¬• ମାଧà­à¬¯à¬®à¬°à­‡ ବିନାଶକୠଖବର କରାଯାଇଥିଲା (%d ତà­à¬°à­à¬Ÿà¬¿)\n"
+msgstr "%d ବିବରଣୀ ଘଟଣାଗà­à¬¡à¬¼à¬¿à¬• ମାଧà­à¬¯à¬®à¬°à­‡ ବିନାଶକୠଖବର କରାଯାଇଥିଲା (%d ତà­à¬°à­à¬Ÿà¬¿)\n"
-#: ../src/daemon/abrt-handle-crashdump.c:42
+#: ../src/daemon/abrt-action-save-package-data.c:280
msgid ""
-" [-vs] -d DIR -e EVENT\n"
-" or: "
+" [options] -d DIR\n"
+"\n"
+"Query package database and save package name, component, and description"
msgstr ""
+" [options] -d DIR\n"
+"\n"
+"ପà­à­Ÿà¬¾à¬•à­‡à¬œ ତଥà­à­Ÿà¬¾à¬§à¬¾à¬°à¬•à­ ପଚାରନà­à¬¤à­ à¬à¬¬à¬‚ ପà­à­Ÿà¬¾à¬•à­‡à¬œ ନାମ, ଉପାଦାନ, à¬à¬¬à¬‚ ବରà­à¬£à­à¬£à¬¨à¬¾à¬•à­ ସଂରକà­à¬·à¬£ କରନà­à¬¤à­"
-#: ../src/daemon/abrt-handle-crashdump.c:57
+#: ../src/daemon/abrt-action-save-package-data.c:292
+#: ../src/daemon/abrt-handle-crashdump.c:60
#: ../src/plugins/abrt-action-analyze-c.c:167
#: ../src/plugins/abrt-action-analyze-oops.c:144
#: ../src/plugins/abrt-action-analyze-python.c:49
+#: ../src/plugins/abrt-action-bugzilla.cpp:927
+#: ../src/plugins/abrt-action-generate-backtrace.c:270
+#: ../src/plugins/abrt-action-kerneloops.c:147
+#: ../src/plugins/abrt-action-mailx.c:149
+#: ../src/plugins/abrt-action-print.c:50
+#: ../src/plugins/abrt-action-rhtsupport.c:281
+#: ../src/plugins/abrt-action-upload.c:261
+msgid "Crash dump directory"
+msgstr "ନଷà­à¬Ÿ ଡମà­à¬ª ଡିରେକà­à¬Ÿà­‹à¬°à¬¿"
+
+#: ../src/daemon/abrt-action-save-package-data.c:293
+#: ../src/daemon/abrt-handle-crashdump.c:59 ../src/daemon/abrt-server.c:297
+#: ../src/plugins/abrt-action-bugzilla.cpp:926
+#: ../src/plugins/abrt-action-generate-backtrace.c:273
+#: ../src/plugins/abrt-action-kerneloops.c:146
+#: ../src/plugins/abrt-action-rhtsupport.c:280
+#: ../src/plugins/abrt-dump-oops.c:555
msgid "Log to syslog"
-msgstr ""
+msgstr "syslog ପାଇଠଲଗ"
-#: ../src/daemon/abrt-handle-crashdump.c:58
-#: ../src/plugins/abrt-action-analyze-c.c:166
-#: ../src/plugins/abrt-action-analyze-oops.c:143
-#: ../src/plugins/abrt-action-analyze-python.c:48
-#: ../src/plugins/abrt-action-mailx.cpp:150
-#: ../src/plugins/abrt-action-print.cpp:50
-#: ../src/plugins/abrt-action-upload.cpp:266
-msgid "Crash dump directory"
+#: ../src/daemon/abrt-handle-crashdump.c:43
+msgid ""
+" [-vs] -d DIR -e EVENT\n"
+" or: "
msgstr ""
+" [-vs] -d DIR -e EVENT\n"
+" or: "
-#: ../src/daemon/abrt-handle-crashdump.c:59
+#: ../src/daemon/abrt-handle-crashdump.c:61
msgid "Handle EVENT"
-msgstr ""
+msgstr "EVENT କୠନିୟନà­à¬¤à­à¬°à¬£ କରନà­à¬¤à­"
-#: ../src/daemon/abrt-handle-crashdump.c:60
+#: ../src/daemon/abrt-handle-crashdump.c:62
msgid "List possible events [which start with PFX]"
-msgstr ""
+msgstr "ସମà­à¬­à¬¾à¬¬à­à­Ÿ ଘଟଣାଗà­à¬¡à¬¼à¬¿à¬•à­ ତାଲିକାଭà­à¬•à­à¬¤ କରନà­à¬¤à­ [ଯାହାକି PFX ସହିତ ଆରମà­à¬­ ହୋଇଥାà¬]"
-#: ../src/daemon/CommLayerServerDBus.cpp:229
+#: ../src/daemon/abrt-server.c:286 ../src/daemon/Daemon.cpp:542
+msgid " [options]"
+msgstr " [ବିକଳà­à¬ªà¬—à­à¬¡à¬¼à¬¿à¬•]"
+
+#: ../src/daemon/abrt-server.c:296
+msgid "Use UID as client uid"
+msgstr "UID କୠକà­à¬²à¬¾à¬à¬£à­à¬Ÿ uid ଭାବରେ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରନà­à¬¤à­"
+
+#: ../src/daemon/CommLayerServerDBus.cpp:242
msgid "Comment is too long"
msgstr "ଟିପà­à¬ªà¬£à­€à¬Ÿà¬¿ ଅତà­à­Ÿà¬§à¬¿à¬• ବଡ଼ ଅଟେ"
-#: ../src/daemon/CommLayerServerDBus.cpp:233
+#: ../src/daemon/CommLayerServerDBus.cpp:246
msgid "'How to reproduce' is too long"
msgstr "'କିପରି ପà­à¬¨à¬ƒ ଉତà­à¬ªà¬¨à­à¬¨ କରାଯିବ' ଟି ଅତà­à­Ÿà¬§à¬¿à¬• ବଡ଼ ଅଟେ"
-#: ../src/daemon/Daemon.cpp:534
+#: ../src/daemon/Daemon.cpp:371
msgid ""
"The size of the report exceeded the quota. Please check system's "
"MaxCrashReportsSize value in abrt.conf."
@@ -423,21 +437,17 @@ msgstr ""
"ବିବରଣୀ ଆକାର ସଂରକà­à¬·à¬£à¬•à­ ଅତିକà­à¬°à¬® କରିଛି। ଦୟାକରି ତନà­à¬¤à­à¬°à¬° MaxCrashReportsSize ମୂଲà­à­Ÿà¬•à­ abrt.conf "
"ରେ ଯାଞà­à¬š କରନà­à¬¤à­à¥¤"
-#: ../src/daemon/Daemon.cpp:699
-msgid "abrtd [options]"
-msgstr ""
-
-#: ../src/daemon/Daemon.cpp:709
+#: ../src/daemon/Daemon.cpp:553
msgid "Do not daemonize"
-msgstr ""
+msgstr "daemonize କରନà­à¬¤à­ ନାହିà¬"
-#: ../src/daemon/Daemon.cpp:710
+#: ../src/daemon/Daemon.cpp:554
msgid "Log to syslog even with -d"
-msgstr ""
+msgstr "-d ସହିତ ମଧà­à¬¯ syslog ଘଟଣାକୠଲଗ କରନà­à¬¤à­"
-#: ../src/daemon/Daemon.cpp:711
+#: ../src/daemon/Daemon.cpp:555
msgid "Exit after SEC seconds of inactivity"
-msgstr ""
+msgstr "SEC ସେକଣà­à¬¡ ନିଷà­à¬•à­à¬°à¬¿à­Ÿ ହେବା ପରେ ପà­à¬°à¬¸à­à¬¥à¬¾à¬¨ କରନà­à¬¤à­"
#: ../src/gui/abrt.desktop.in.h:2
msgid "View and report application crashes"
@@ -448,8 +458,7 @@ msgid "Another client is already running, trying to wake it..."
msgstr "ଅନà­à­Ÿ à¬à¬• କà­à¬²à¬¾à¬à¬£à­à¬Ÿ ପୂରà­à¬¬à¬°à­ ଚାଲà­à¬…ଛି, à¬à¬¹à¬¾à¬•à­ ଜାଗà­à¬°à¬¤ କରିବା ପାଇଠଚେଷà­à¬Ÿà¬¾ କରà­à¬…ଛି..."
#: ../src/gui/ABRTExceptions.py:14
-msgid ""
-"Got unexpected data from the daemon (is the database properly updated?)."
+msgid "Got unexpected data from the daemon (is the database properly updated?)."
msgstr "ଡେମନରୠଅପà­à¬°à¬¤à­à­Ÿà¬¾à¬¶à¬¿à¬¤ ତଥà­à­Ÿ ଗà­à¬°à¬¹à¬£ କରà­à¬…ଛି (ତଥà­à­Ÿà¬¾à¬§à¬¾à¬°à¬Ÿà¬¿ ସଠିକ ଭାବରେ ଅଦà­à­Ÿà¬¤à¬¿à¬¤ ହୋଇଛି କି?)."
#: ../src/gui/ABRTPlugin.py:64
@@ -472,16 +481,16 @@ msgstr "ଖବରକାରୀ ପà­à¬²à¬—ଇନଗà­à¬¡à¬¼à¬¿à¬•"
msgid "Database plugins"
msgstr "ତଥà­à­Ÿà¬¾à¬§à¬¾à¬° ପà­à¬²à¬—ଇନଗà­à¬¡à¬¼à¬¿à¬•"
-#: ../src/gui/CCDBusBackend.py:74 ../src/gui/CCDBusBackend.py:97
+#: ../src/gui/CCDBusBackend.py:75 ../src/gui/CCDBusBackend.py:98
msgid "Cannot connect to system dbus."
msgstr "ତନà­à¬¤à­à¬° dbus ସହିତ ସଂଯୋଗ କରିପାରିବେ ନାହିà¬à¥¤"
-#: ../src/gui/CCDBusBackend.py:120 ../src/gui/CCDBusBackend.py:123
+#: ../src/gui/CCDBusBackend.py:121 ../src/gui/CCDBusBackend.py:124
msgid "Please check if the abrt daemon is running."
msgstr "abrt ଡେମନ ଚାଲà­à¬…ଛି କି ନାହିଠଦୟାକରି ଯାଞà­à¬šà¬•à¬°à¬¨à­à¬¤à­à¥¤"
#. FIXME: BUG: BarWindow remains. (how2reproduce: delete "component" in a dump dir and try to report it)
-#: ../src/gui/CCDBusBackend.py:169
+#: ../src/gui/CCDBusBackend.py:170
msgid ""
"Daemon did not return a valid report info.\n"
"Is debuginfo missing?"
@@ -559,7 +568,7 @@ msgstr ""
" ଆପଣ à¬à¬¹à¬¿ ପà­à¬°à­‹à¬—à­à¬°à¬¾à¬® ସହିତ ଗà­à¬¨à­ ସାଧାରଣ ସାରà­à¬¬à¬œà¬¨à­€à¬¨ ଅନà­à¬®à¬¤à¬¿ ପତà­à¬° ପାଈଥିବେ. ଯଦି ପାଇନାହାନà­à¬¤à¬¿ ତେବେ "
"à¬à¬¹à¬¾à¬•à­ ଦେଖନà­à¬¤à­ <http://www.gnu.org/licenses/>."
-#: ../src/gui/ccgui.glade.h:19 ../src/gui/CReporterAssistant.py:71
+#: ../src/gui/ccgui.glade.h:19 ../src/gui/CReporterAssistant.py:111
msgid "View log"
msgstr "ଲଗ ଦେଖନà­à¬¤à­"
@@ -652,97 +661,6 @@ msgstr ""
"ତଥà­à­Ÿà¬¾à¬§à¬¾à¬°à¬°à­‡ à¬à¬ªà¬°à¬¿ କୌଣସି ନଷà­à¬Ÿ ନାହିà¬, ସମà­à¬­à¬¬à¬¤à¬ƒ ଭà­à¬² crashid.\n"
"crashid=%s"
-#. default texts
-#: ../src/gui/CCReporterDialog.py:22 ../src/gui/CReporterAssistant.py:20
-msgid "Brief description of how to reproduce this or what you did..."
-msgstr ""
-"à¬à¬¹à¬¾à¬•à­ କିପରି ପà­à¬¨à¬ƒà¬ªà­à¬°à¬¾à¬ªà­à¬¤à¬¿ କରାଯିବ à¬à¬¬à¬‚ ଆପଣ କଣ କରିଥିଲେ ତାହା ବିଷୟରେ ବିସà­à¬¤à­ƒà¬¤ ବିବରଣୀ ପà­à¬°à¬¦à¬¾à¬¨ କରନà­à¬¤à­..."
-
-#: ../src/gui/CCReporterDialog.py:107
-msgid "You must check the backtrace for sensitive data."
-msgstr "ସà­à¬ªà¬°à­à¬¶à¬•à¬¾à¬¤à¬° ତଥà­à­Ÿ ପାଇଠଆପଣଙà­à¬•à­ ବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à­‡à¬¸à¬•à­ ଯାଞà­à¬š କରିବା ଆବଶà­à­Ÿà¬•à¥¤"
-
-#: ../src/gui/CCReporterDialog.py:118 ../src/gui/CReporterAssistant.py:364
-#, python-format
-msgid ""
-"Reporting disabled because the backtrace is unusable.\n"
-"Please try to install debuginfo manually using the command: <b>debuginfo-"
-"install %s</b> \n"
-"then use the Refresh button to regenerate the backtrace."
-msgstr ""
-"ଖବର କରିବା ପà­à¬°à¬•à­à¬°à¬¿à­Ÿà¬¾à¬•à­ ନିଷà­à¬•à­à¬°à¬¿à­Ÿ କରାଯାଇଛି କାରଣ ବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à­‡à¬¸à¬Ÿà¬¿ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° ଉପଯୋଗୀ ନà­à¬¹à¬à¥¤\n"
-"ଦୟାକରି ତà­à¬°à­à¬Ÿà¬¿ ନିବାରଣ ସୂଚନାକୠà¬à¬¹à¬¿ ନିରà­à¬¦à­à¬¦à­‡à¬¶à¬•à­ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରି ହସà­à¬¤à¬•à­ƒà¬¤ ଭାବରେ ସà­à¬¥à¬¾à¬ªà¬¨ କରନà­à¬¤à­: "
-"<b>debuginfo-install %s</b> \n"
-"ତାପରେ ବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à­‡à¬¸à¬•à­ ପà­à¬¨à¬ƒà¬¨à¬¿à¬°à­à¬®à¬¾à¬£ କରିବା ପାଇଠସତେଜନ କରିବା ବଟନକୠବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରନà­à¬¤à­à¥¤"
-
-#: ../src/gui/CCReporterDialog.py:120
-msgid "The backtrace is unusable, you cannot report this!"
-msgstr "ବà­à­Ÿà¬¾à¬• ଟà­à¬°à­‡à¬¶à¬Ÿà¬¿ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° ଉପଯୋଗୀ ନà­à¬¹à¬, ଆପଣ à¬à¬¹à¬¾à¬•à­ ଖବର କରି ପାରିବେ ନାହିà¬!"
-
-#: ../src/gui/CCReporterDialog.py:124 ../src/gui/CReporterAssistant.py:342
-#: ../src/gui/CReporterAssistant.py:370
-msgid ""
-"The backtrace is incomplete, please make sure you provide the steps to "
-"reproduce."
-msgstr ""
-"ବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à­‡à¬¸à¬Ÿà¬¿ ସମà­à¬ªà­‚ରà­à¬£à­à¬£ ହୋଇନାହିà¬, ଦୟାକରି ନିଶà­à¬šà¬¿à¬¤ କରନà­à¬¤à­ ଯେ ଆପଣ ପà­à¬¨à¬ƒ ଉତà­à¬ªà¬¾à¬¦à¬¨ କରିବା ପାଇଠଉତà­à¬¤à¬® "
-"ପଦକà­à¬·à­‡à¬ª ପà­à¬°à¬¦à¬¾à¬¨ କରିଛନà­à¬¤à¬¿à¥¤"
-
-#: ../src/gui/CCReporterDialog.py:130
-msgid "Reporting disabled, please fix the problems shown above."
-msgstr ""
-"ଖବର କରିବା ପଦà­à¬§à¬¤à¬¿à¬•à­ ନିଷà­à¬•à­à¬°à¬¿à­Ÿ କରାଯାଇଛି, ଉପରେ ଦରà­à¬¶à¬¾à¬¯à¬¾à¬‡à¬¥à¬¿à¬¬à¬¾ ସମସà­à­Ÿà¬¾à¬—à­à¬¡à¬¼à¬¿à¬•à­ ଦୟାକରି ସମାଧାନ କରନà­à¬¤à­à¥¤"
-
-#: ../src/gui/CCReporterDialog.py:132
-msgid "Sends the report using the selected plugin."
-msgstr "ବଚà­à¬›à¬¿à¬¤ ପà­à¬²à¬—ଇନକୠବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରି ଖବରକୠପଠାଇଥାà¬à¥¤"
-
-#: ../src/gui/CCReporterDialog.py:398
-msgid ""
-"No reporter plugin available for this type of crash.\n"
-"Please check abrt.conf."
-msgstr ""
-"à¬à¬ªà¬°à¬¿ ନଷà­à¬Ÿ ପାଇଠକୌଣସି ଖବର ପà­à¬²à¬—ଇନ ଉପଲବà­à¬§ ନାହିà¬à¥¤\n"
-"ଦୟାକରି abrt.conf କୠଯାଞà­à¬š କରନà­à¬¤à­à¥¤"
-
-#: ../src/gui/CCReporterDialog.py:418 ../src/gui/CReporterAssistant.py:249
-#: ../src/gui/PluginsSettingsDialog.py:136
-#, python-format
-msgid ""
-"Cannot save plugin settings:\n"
-" %s"
-msgstr ""
-"ପà­à¬²à¬—ଇନ ସଂରଚନାକୠସଂରକà­à¬·à¬£ କରାଯାଇପାରିବ ନାହିà¬:\n"
-" %s"
-
-#: ../src/gui/CCReporterDialog.py:448 ../src/gui/CReporterAssistant.py:279
-#, python-format
-msgid "Configure %s options"
-msgstr "%s ବିକଳà­à¬ªà¬—à­à¬¡à¬¼à¬¿à¬•à­ ବିନà­à­Ÿà¬¾à¬¸ କରନà­à¬¤à­"
-
-#: ../src/gui/CCReporterDialog.py:498 ../src/gui/CReporterAssistant.py:1074
-msgid ""
-"Unable to get report!\n"
-"Is debuginfo missing?"
-msgstr ""
-"ବିବରଣୀ ପà­à¬°à¬¾à¬ªà­à¬¤ କରିବାରେ ଅସମରà­à¬¥!\n"
-"ତà­à¬°à­à¬Ÿà¬¿ ନିବରଣୀ ସୂଚନା ଅନà­à¬ªà¬¸à­à¬¥à¬¿à¬¤ ଅଛି କି?"
-
-#: ../src/gui/CCReporterDialog.py:527 ../src/gui/CReporterAssistant.py:455
-#, python-format
-msgid ""
-"Reporting failed!\n"
-"%s"
-msgstr ""
-"ଖବର କରିବାରେ ବିଫଳ!\n"
-"%s"
-
-#: ../src/gui/CCReporterDialog.py:553 ../src/gui/CCReporterDialog.py:574
-#: ../src/gui/CReporterAssistant.py:1113
-#, python-format
-msgid "Error acquiring the report: %s"
-msgstr "ବିବରଣୀ ପାଇବାରେ ତà­à¬°à­à¬Ÿà¬¿: %s"
-
#: ../src/gui/ConfBackend.py:78
msgid "Cannot connect to the Gnome Keyring daemon."
msgstr "Gnome କି ରିଙà­à¬— ଡେମନ ସହିତ ସଂଯୋଗ କରିପାରିବେ ନାହିà¬à¥¤"
@@ -754,58 +672,103 @@ msgid "Cannot get the default keyring."
msgstr "ପୂରà­à¬¬à¬¨à¬¿à¬°à­à¬¦à­à¬§à¬¾à¬°à¬¿à¬¤ କି ରିଙà­à¬—କୠପାଇବେ ନାହିà¬à¥¤"
#: ../src/gui/ConfBackend.py:103 ../src/gui/ConfBackend.py:120
-msgid ""
-"Access to gnome-keyring has been denied, plugins settings will not be saved."
-msgstr ""
-"gnome-keyring ପà­à¬°à¬¤à¬¿ ଅଭିଗମà­à­Ÿà¬¤à¬¾à¬•à­ ବାରଣ କରାଯାଇଛି, ପà­à¬²à¬—ଇନଗà­à¬¡à¬¼à¬¿à¬•à¬° ସଂରଚନାକୠସଂରକà­à¬·à¬£ କରାଯିବ ନାହିà¬à¥¤"
+msgid "Access to gnome-keyring has been denied, plugins settings will not be saved."
+msgstr "gnome-keyring ପà­à¬°à¬¤à¬¿ ଅଭିଗମà­à­Ÿà¬¤à¬¾à¬•à­ ବାରଣ କରାଯାଇଛି, ପà­à¬²à¬—ଇନଗà­à¬¡à¬¼à¬¿à¬•à¬° ସଂରଚନାକୠସଂରକà­à¬·à¬£ କରାଯିବ ନାହିà¬à¥¤"
#. we tried 2 times, so giving up the authorization
#: ../src/gui/ConfBackend.py:154
#, python-format
-msgid ""
-"Access to gnome-keyring has been denied, cannot load the settings for %s!"
-msgstr ""
-"gnome-keyring ପà­à¬°à¬¤à¬¿ ଅଭିଗମà­à­Ÿà¬¤à¬¾à¬•à­ ବାରଣ କରାଯାଇଛି, %s ର ସଂରଚନାକୠସଂରକà­à¬·à¬£ କରାଯିବ ନାହିà¬!"
+msgid "Access to gnome-keyring has been denied, cannot load the settings for %s!"
+msgstr "gnome-keyring ପà­à¬°à¬¤à¬¿ ଅଭିଗମà­à­Ÿà¬¤à¬¾à¬•à­ ବାରଣ କରାଯାଇଛି, %s ର ସଂରଚନାକୠସଂରକà­à¬·à¬£ କରାଯିବ ନାହିà¬!"
#: ../src/gui/ConfBackend.py:207
msgid "Access to gnome-keyring has been denied, cannot load settings."
msgstr "gnome-keyring ପà­à¬°à¬¤à¬¿ ଅଭିଗମà­à­Ÿà¬¤à¬¾à¬•à­ ବାରଣ କରାଯାଇଛି, ସଂରଚନାକୠଧାରଣ କରିପାରିବେ ନାହିà¬à¥¤"
+#: ../src/gui/CReporterAssistant.py:20
+msgid "Brief description of how to reproduce this or what you did..."
+msgstr ""
+"à¬à¬¹à¬¾à¬•à­ କିପରି ପà­à¬¨à¬ƒà¬ªà­à¬°à¬¾à¬ªà­à¬¤à¬¿ କରାଯିବ à¬à¬¬à¬‚ ଆପଣ କଣ କରିଥିଲେ ତାହା ବିଷୟରେ ବିସà­à¬¤à­ƒà¬¤ ବିବରଣୀ ପà­à¬°à¬¦à¬¾à¬¨ କରନà­à¬¤à­..."
+
#: ../src/gui/CReporterAssistant.py:21
msgid "Crash info doesn't contain a backtrace"
msgstr "ବିନାଶ ସୂଚନାରେ ବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à¬¾à¬¸ ନଥାà¬"
-#: ../src/gui/CReporterAssistant.py:334
+#: ../src/gui/CReporterAssistant.py:277
+#: ../src/gui/PluginsSettingsDialog.py:136
+#, python-format
+msgid ""
+"Cannot save plugin settings:\n"
+" %s"
+msgstr ""
+"ପà­à¬²à¬—ଇନ ସଂରଚନାକୠସଂରକà­à¬·à¬£ କରାଯାଇପାରିବ ନାହିà¬:\n"
+" %s"
+
+#: ../src/gui/CReporterAssistant.py:307
+#, python-format
+msgid "Configure %s options"
+msgstr "%s ବିକଳà­à¬ªà¬—à­à¬¡à¬¼à¬¿à¬•à­ ବିନà­à­Ÿà¬¾à¬¸ କରନà­à¬¤à­"
+
+#: ../src/gui/CReporterAssistant.py:362
#, python-format
msgid "Rating is %s"
msgstr "ମାନà­à­Ÿà¬¤à¬¾ ହେଉଛି %s"
-#: ../src/gui/CReporterAssistant.py:337
+#: ../src/gui/CReporterAssistant.py:365
msgid "Crashdump doesn't have rating => we suppose it's not required"
msgstr "କà­à¬°à¬¾à¬¸à¬¡à¬®à­à¬ªà¬°à­‡ ମାନà­à­Ÿà¬¤à¬¾ ନଥାଠ=> ଆମେ ଭାବà­à¬›à­ ତାହା ଆବଶà­à­Ÿà¬• ନà­à¬¹à¬"
-#: ../src/gui/CReporterAssistant.py:350
+#: ../src/gui/CReporterAssistant.py:370 ../src/gui/CReporterAssistant.py:398
+msgid ""
+"The backtrace is incomplete, please make sure you provide the steps to "
+"reproduce."
+msgstr ""
+"ବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à­‡à¬¸à¬Ÿà¬¿ ସମà­à¬ªà­‚ରà­à¬£à­à¬£ ହୋଇନାହିà¬, ଦୟାକରି ନିଶà­à¬šà¬¿à¬¤ କରନà­à¬¤à­ ଯେ ଆପଣ ପà­à¬¨à¬ƒ ଉତà­à¬ªà¬¾à¬¦à¬¨ କରିବା ପାଇଠଉତà­à¬¤à¬® "
+"ପଦକà­à¬·à­‡à¬ª ପà­à¬°à¬¦à¬¾à¬¨ କରିଛନà­à¬¤à¬¿à¥¤"
+
+#: ../src/gui/CReporterAssistant.py:378
msgid "You should check the backtrace for sensitive data."
msgstr "ସà­à¬ªà¬°à­à¬¶à¬•à¬¾à¬¤à¬° ତଥà­à­Ÿ ପାଇଠଆପଣଙà­à¬•à­ ବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à­‡à¬¸à¬•à­ ଯାଞà­à¬š କରିବା ଆବଶà­à­Ÿà¬•à¥¤"
-#: ../src/gui/CReporterAssistant.py:351
+#: ../src/gui/CReporterAssistant.py:379
msgid "You must agree with sending the backtrace."
msgstr "ଆପଣ ବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à¬¾à¬¸à¬•à­ ପଠାଇବା ପାଇଠସରହମତ ହେବା ଆବଶà­à­Ÿà¬•à¥¤"
-#: ../src/gui/CReporterAssistant.py:366
-msgid "Reporting disabled because the backtrace is unusable."
+#: ../src/gui/CReporterAssistant.py:392
+#, python-format
+msgid ""
+"Reporting disabled because the backtrace is unusable.\n"
+"Please try to install debuginfo manually using the command: <b>debuginfo-"
+"install %s</b> \n"
+"then use the Refresh button to regenerate the backtrace."
msgstr ""
-"ଖବର କରିବା ପଦà­à¬§à¬¤à¬¿à¬•à­ ନିଷà­à¬•à­à¬°à¬¿à­Ÿ କରାଯାଇଛି, ଉପରେ ଦରà­à¬¶à¬¾à¬¯à¬¾à¬‡à¬¥à¬¿à¬¬à¬¾ ସମସà­à­Ÿà¬¾à¬—à­à¬¡à¬¼à¬¿à¬•à­ ଦୟାକରି ସମାଧାନ କରନà­à¬¤à­à¥¤"
+"ଖବର କରିବା ପà­à¬°à¬•à­à¬°à¬¿à­Ÿà¬¾à¬•à­ ନିଷà­à¬•à­à¬°à¬¿à­Ÿ କରାଯାଇଛି କାରଣ ବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à­‡à¬¸à¬Ÿà¬¿ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° ଉପଯୋଗୀ ନà­à¬¹à¬à¥¤\n"
+"ଦୟାକରି ତà­à¬°à­à¬Ÿà¬¿ ନିବାରଣ ସୂଚନାକୠà¬à¬¹à¬¿ ନିରà­à¬¦à­à¬¦à­‡à¬¶à¬•à­ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରି ହସà­à¬¤à¬•à­ƒà¬¤ ଭାବରେ ସà­à¬¥à¬¾à¬ªà¬¨ କରନà­à¬¤à­: "
+"<b>debuginfo-install %s</b> \n"
+"ତାପରେ ବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à­‡à¬¸à¬•à­ ପà­à¬¨à¬ƒà¬¨à¬¿à¬°à­à¬®à¬¾à¬£ କରିବା ପାଇଠସତେଜନ କରିବା ବଟନକୠବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରନà­à¬¤à­à¥¤"
-#: ../src/gui/CReporterAssistant.py:412
+#: ../src/gui/CReporterAssistant.py:394
+msgid "Reporting disabled because the backtrace is unusable."
+msgstr "ଖବର କରିବା ପଦà­à¬§à¬¤à¬¿à¬•à­ ନିଷà­à¬•à­à¬°à¬¿à­Ÿ କରାଯାଇଛି, ଉପରେ ଦରà­à¬¶à¬¾à¬¯à¬¾à¬‡à¬¥à¬¿à¬¬à¬¾ ସମସà­à­Ÿà¬¾à¬—à­à¬¡à¬¼à¬¿à¬•à­ ଦୟାକରି ସମାଧାନ କରନà­à¬¤à­à¥¤"
+
+#: ../src/gui/CReporterAssistant.py:440
msgid "You did not provide any steps to reproduce."
msgstr "ପà­à¬¨à¬ƒ ଉତà­à¬ªà¬¨à­à¬¨ କରିବା ପାଇଠଆପଣ କୌଣସି ପଦକà­à¬·à­‡à¬ª ଦେଇନାହାନà­à¬¤à¬¿à¥¤"
-#: ../src/gui/CReporterAssistant.py:426
+#: ../src/gui/CReporterAssistant.py:454
msgid "You did not provide any comments."
msgstr "ଆପଣ କୌଣସି ଟିପà­à¬ªà¬£à­€ ଦେଇନାହାନà­à¬¤à¬¿à¥¤"
-#: ../src/gui/CReporterAssistant.py:507
+#: ../src/gui/CReporterAssistant.py:483
+#, python-format
+msgid ""
+"Reporting failed!\n"
+"%s"
+msgstr ""
+"ଖବର କରିବାରେ ବିଫଳ!\n"
+"%s"
+
+#: ../src/gui/CReporterAssistant.py:535
#, python-format
msgid ""
"It looks like an application from the package <b>%s</b> has crashed on your "
@@ -830,15 +793,15 @@ msgstr ""
"ଆପଣ କେଉà¬à¬ à¬¿ à¬à¬¹à¬¿ ତà­à¬°à­à¬Ÿà¬¿à¬•à­ ଖବର କରିବାକୠଚାହà­à¬à¬›à¬¨à­à¬¤à¬¿ ତାହା ବାଛନà­à¬¤à­, à¬à¬¬à¬‚ ଅଗà­à¬°à¬¸à¬° ହେବା ପାଇଠ'ଅଗà­à¬°à¬¸à¬°' କୠ"
"କà­à¬²à¬¿à¬• କରନà­à¬¤à­à¥¤"
-#: ../src/gui/CReporterAssistant.py:548
+#: ../src/gui/CReporterAssistant.py:576
msgid "Only one reporter plugin is configured."
msgstr "କେବଳ ଗୋଟିଠଖବରକାରୀ ପà­à¬²à¬—ଇନ ବିନà­à­Ÿà¬¾à¬¸ ହୋଇଛି।"
-#: ../src/gui/CReporterAssistant.py:554
+#: ../src/gui/CReporterAssistant.py:582
msgid "Send a bug report"
msgstr "ଗୋଟିଠତà­à¬°à­à¬Ÿà¬¿ ବିବରଣୀ ପଠାନà­à¬¤à­"
-#: ../src/gui/CReporterAssistant.py:592
+#: ../src/gui/CReporterAssistant.py:620
msgid ""
"Below is the backtrace associated with your crash. A crash backtrace "
"provides developers with details about how the crash happened, helping them "
@@ -853,133 +816,143 @@ msgstr ""
"ଦୟାକରି ନିମà­à¬¨à¬°à­‡ ବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à­‡à¬¸à¬•à­ ସମୀକà­à¬·à¬¾ କରନà­à¬¤à­ à¬à¬¬à¬‚ ଆପଣଙà­à¬•à¬° ତà­à¬°à­à¬Ÿà¬¿à¬°à­‡ କୌଣସି ସà­à¬ªà¬°à­à¬¶à¬•à¬¾à¬¤à¬° ତଥà­à­Ÿ ଅଛି କି "
"ନାହିଠନିଶà­à¬šà¬¿à¬¤ କରିବା ପାଇଠଆବଶà­à­Ÿà¬•à¬¤à¬¾ ଅନà­à¬¸à¬¾à¬°à­‡ ତାହାକୠପରିବରà­à¬¤à­à¬¤à¬¨ କରନà­à¬¤à­:"
-#: ../src/gui/CReporterAssistant.py:663 ../src/gui/CReporterAssistant.py:676
-#: ../src/gui/CReporterAssistant.py:710
+#: ../src/gui/CReporterAssistant.py:691 ../src/gui/CReporterAssistant.py:704
+#: ../src/gui/CReporterAssistant.py:738
#, python-format
msgid "Found %i occurence(s) [at: %i of %i]"
-msgstr ""
+msgstr "%i ଟି ଘଟଣା ମିଳିଛି [à¬à¬ à¬¾à¬°à­‡: %i of %i]"
-#: ../src/gui/CReporterAssistant.py:747
+#: ../src/gui/CReporterAssistant.py:775
msgid "Search:"
-msgstr ""
+msgstr "ସନà­à¬§à¬¾à¬¨ କରନà­à¬¤à­:"
-#: ../src/gui/CReporterAssistant.py:778
+#: ../src/gui/CReporterAssistant.py:806
msgid "Refresh"
msgstr "ସତେଜନ କରନà­à¬¤à­"
-#: ../src/gui/CReporterAssistant.py:780
+#: ../src/gui/CReporterAssistant.py:808
msgid "Copy"
msgstr "ନକଲ କରନà­à¬¤à­"
-#: ../src/gui/CReporterAssistant.py:786
+#: ../src/gui/CReporterAssistant.py:814
msgid "I agree with submitting the backtrace"
msgstr "ମà­à¬ ବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à­‡à¬¸à¬•à­ ଦାଖଲ କରିବା ସହିତ ସହମତ ଅଛି"
-#: ../src/gui/CReporterAssistant.py:791
+#: ../src/gui/CReporterAssistant.py:819
msgid "Approve the backtrace"
msgstr "ବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à­‡à¬¸à¬•à­ ଅନà­à¬®à¬¤à¬¿ ଦିଅନà­à¬¤à­"
-#: ../src/gui/CReporterAssistant.py:834
+#: ../src/gui/CReporterAssistant.py:862
msgid "You need to fill the how to before you can proceed..."
-msgstr ""
+msgstr "ଆପଣ ଅଗà­à¬°à¬¸à¬° ହେବା ପୂରà­à¬¬à¬°à­ ପà­à¬°à¬£ କରିବା ଆବଶà­à­Ÿà¬•..."
-#: ../src/gui/CReporterAssistant.py:857
+#: ../src/gui/CReporterAssistant.py:885
msgid "How did this crash happen (step-by-step)? How would you reproduce it?"
-msgstr ""
-"à¬à¬¹à¬¿ ବିନାଶଟି କିପରି ହେଲା (ଗୋଟିଠପରେ ଗୋଟିଠପଦକà­à¬·à­‡à¬ª ଅନà­à¬¸à¬¾à¬°à­‡)? ଆପଣ à¬à¬¹à¬¾à¬•à­ କିପରି ପà­à¬¨à¬ƒ ଉତà­à¬ªà¬¨à­à¬¨ କରିବେ?"
+msgstr "à¬à¬¹à¬¿ ବିନାଶଟି କିପରି ହେଲା (ଗୋଟିଠପରେ ଗୋଟିଠପଦକà­à¬·à­‡à¬ª ଅନà­à¬¸à¬¾à¬°à­‡)? ଆପଣ à¬à¬¹à¬¾à¬•à­ କିପରି ପà­à¬¨à¬ƒ ଉତà­à¬ªà¬¨à­à¬¨ କରିବେ?"
-#: ../src/gui/CReporterAssistant.py:877
-msgid ""
-"Are there any comments you would like to share with the software maintainers?"
+#: ../src/gui/CReporterAssistant.py:905
+msgid "Are there any comments you would like to share with the software maintainers?"
msgstr "ଆପଣ ସହଭାଗ କରିବା ପାଇଠସଫà­à¬Ÿà­±à­‡à¬° ପରିଚାଳକଙà­à¬• ପାଖରେ କୌଣସି ଟିପà­à¬ªà¬£à­€ ଅଛି କି?"
-#: ../src/gui/CReporterAssistant.py:897
+#: ../src/gui/CReporterAssistant.py:925
msgid "Provide additional details"
msgstr "ଅତିରିକà­à¬¤ ବିବରଣୀ ପà­à¬°à¬¦à¬¾à¬¨ କରନà­à¬¤à­"
-#: ../src/gui/CReporterAssistant.py:904
+#: ../src/gui/CReporterAssistant.py:932
msgid ""
"<b>Tip:</b> Your comments are not private. Please watch what you say "
"accordingly."
msgstr "<b>ସୂଚନା:</b> ଆପଣଙà­à¬•à¬° ମନà­à¬¤à¬¬à­à­Ÿà¬—à­à¬¡à¬¼à¬¿à¬• ବà­à­Ÿà¬•à­à¬¤à¬¿à¬—ତ ନà­à¬¹à¬à¥¤ ଆପଣ ଯାହା କହà­à¬›à¬¨à­à¬¤à¬¿ ତାହାକୠଦେଖନà­à¬¤à­à¥¤"
-#: ../src/gui/CReporterAssistant.py:945
+#: ../src/gui/CReporterAssistant.py:973
msgid "Confirm and send the report"
msgstr "ବିବରଣୀକୠନିଶà­à¬šà¬¿à¬¤ କରନà­à¬¤à­ à¬à¬¬à¬‚ ପଠାନà­à¬¤à­"
-#: ../src/gui/CReporterAssistant.py:947
-msgid ""
-"Below is a summary of your bug report. Please click 'Apply' to submit it."
+#: ../src/gui/CReporterAssistant.py:975
+msgid "Below is a summary of your bug report. Please click 'Apply' to submit it."
msgstr ""
"ନିମà­à¬¨à¬°à­‡ ଆପଣଙà­à¬•à¬° ତà­à¬°à­à¬Ÿà¬¿ ବିବରଣୀର ସାରାଂଶ ଅଛି। à¬à¬¹à¬¾à¬•à­ ଦାଖଲ କରିବା ପାଇଠ'ପà­à¬°à­Ÿà­‹à¬— କରନà­à¬¤à­' କୠକà­à¬²à¬¿à¬• "
"କରନà­à¬¤à­à¥¤"
-#: ../src/gui/CReporterAssistant.py:952
+#: ../src/gui/CReporterAssistant.py:980
msgid "<b>Basic details</b>"
msgstr "<b>ମୌଳିକ ବିବରଣୀ</b>"
#. left table
-#: ../src/gui/CReporterAssistant.py:959
+#: ../src/gui/CReporterAssistant.py:987
msgid "Component"
msgstr "ଉପାଦାନ"
-#: ../src/gui/CReporterAssistant.py:960
+#: ../src/gui/CReporterAssistant.py:988
msgid "Package"
msgstr "ପà­à­Ÿà¬¾à¬•à­‡à¬œ"
-#: ../src/gui/CReporterAssistant.py:961
+#: ../src/gui/CReporterAssistant.py:989
msgid "Executable"
msgstr "ନିଷà­à¬ªà¬¾à¬¦à¬¨à¬¯à­‹à¬—à­à­Ÿ"
-#: ../src/gui/CReporterAssistant.py:962
+#: ../src/gui/CReporterAssistant.py:990
msgid "Cmdline"
msgstr "Cmdline"
#. right table
-#: ../src/gui/CReporterAssistant.py:964
+#: ../src/gui/CReporterAssistant.py:992
msgid "Architecture"
msgstr "ସଂରଚନା"
-#: ../src/gui/CReporterAssistant.py:965
+#: ../src/gui/CReporterAssistant.py:993
msgid "Kernel"
msgstr "କରà­à¬£à­à¬£à¬²"
-#: ../src/gui/CReporterAssistant.py:966
+#: ../src/gui/CReporterAssistant.py:994
msgid "Release"
msgstr "ପà­à¬°à¬•à¬¾à¬¶à¬¨"
-#: ../src/gui/CReporterAssistant.py:967
+#: ../src/gui/CReporterAssistant.py:995
msgid "Reason"
msgstr "କାରଣ"
-#: ../src/gui/CReporterAssistant.py:978 ../src/gui/report.glade.h:3
+#: ../src/gui/CReporterAssistant.py:1006 ../src/gui/report.glade.h:3
msgid "<b>Backtrace</b>"
msgstr "<b>ବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à­‡à¬¸</b>"
-#: ../src/gui/CReporterAssistant.py:981
+#: ../src/gui/CReporterAssistant.py:1009
msgid "Click to view..."
msgstr "ଦେଖିବା ପାଇଠକà­à¬²à¬¿à¬• କରନà­à¬¤à­..."
-#: ../src/gui/CReporterAssistant.py:993
+#: ../src/gui/CReporterAssistant.py:1021
msgid "<b>Steps to reproduce:</b>"
msgstr "<b>ପà­à¬¨à¬ƒ ଉତà­à¬ªà¬¨à­à¬¨ କରିବାର ପଦକà­à¬·à­‡à¬ª:</b>"
-#: ../src/gui/CReporterAssistant.py:1014
+#: ../src/gui/CReporterAssistant.py:1042
msgid "<b>Comments:</b>"
msgstr "<b>ଟିପà­à¬ªà¬£à­€:</b>"
-#: ../src/gui/CReporterAssistant.py:1017
+#: ../src/gui/CReporterAssistant.py:1045
msgid "No comment provided!"
msgstr "କୌଣସି ଟିପà­à¬ªà¬£à­€ ପà­à¬°à¬¦à¬¾à¬¨ କରାଯାଇନାହିà¬!"
-#: ../src/gui/CReporterAssistant.py:1053
+#: ../src/gui/CReporterAssistant.py:1081
msgid "Finished sending the bug report"
msgstr "ତà­à¬°à­à¬Ÿà¬¿ ବିବରଣୀ ପଠାଇବା ସମାପà­à¬¤ ହୋଇଛି"
-#: ../src/gui/CReporterAssistant.py:1057
+#: ../src/gui/CReporterAssistant.py:1085
msgid "<b>Bug reports:</b>"
msgstr "<b>ତà­à¬°à­à¬Ÿà¬¿ ବିବରଣୀ:</b>"
+#: ../src/gui/CReporterAssistant.py:1102
+msgid ""
+"Unable to get report!\n"
+"Is debuginfo missing?"
+msgstr ""
+"ବିବରଣୀ ପà­à¬°à¬¾à¬ªà­à¬¤ କରିବାରେ ଅସମରà­à¬¥!\n"
+"ତà­à¬°à­à¬Ÿà¬¿ ନିବରଣୀ ସୂଚନା ଅନà­à¬ªà¬¸à­à¬¥à¬¿à¬¤ ଅଛି କି?"
+
+#: ../src/gui/CReporterAssistant.py:1139
+#, python-format
+msgid "Error acquiring the report: %s"
+msgstr "ବିବରଣୀ ପାଇବାରେ ତà­à¬°à­à¬Ÿà¬¿: %s"
+
#: ../src/gui/dialogs.glade.h:1
msgid "Log"
msgstr "ଲଗ"
@@ -1022,9 +995,8 @@ msgid "Name"
msgstr "ନାମ"
#: ../src/gui/PluginsSettingsDialog.py:118
-#, fuzzy
msgid "Please select a plugin from the list to edit its options."
-msgstr "ତାଲିକାରୠସେଥିରେ ଥିବା ପà­à¬²à¬—ଇନମାନଙà­à¬• ମଧà­à¬¯à¬°à­ ସମà­à¬ªà¬¾à¬¦à¬¨ କରିବାକୠଥିବା ବିକଳà­à¬ªà¬•à­ ବାଛନà­à¬¤à­à¥¤"
+msgstr "à¬à¬¹à¬¾à¬° ବିକଳà­à¬ªà¬—à­à¬¡à¬¼à¬¿à¬•à­ ସମà­à¬ªà¬¾à¬¦à¬¨ କରିବା ପାଇଠତାଲିକାରୠଗୋଟିଠପà­à¬²à¬—ଇନକୠଦୟାକରି ବାଛନà­à¬¤à­à¥¤"
#: ../src/gui/PluginsSettingsDialog.py:126
#, python-format
@@ -1243,266 +1215,306 @@ msgstr ""
"ସଂରଚନାରେ ବà­à­Ÿà¬¬à¬¾à¬¹à¬° କରନà­à¬¤à­ à¬à¬¬à¬‚ ଆପଣ ଅଗà­à¬°à¬¸à¬° ହେବା ପୂରà­à¬¬à¬°à­ à¬à¬¹à¬¾à¬•à­ ଠିକ କରନà­à¬¤à­, ଅନà­à­Ÿà¬¥à¬¾, ଖବର ପà­à¬°à¬•à­à¬°à¬¿à­Ÿà¬¾ "
"ବିଫଳ ହୋଇପାରେ।\n"
-#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.cpp:47
+#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.c:45
#, c-format
msgid "Uploaded: %llu of %llu kbytes"
-msgstr ""
+msgstr "ଆହରଣ କରାଯାଇଛି: %llu ର %llu kbytes"
-#: ../src/lib/parse_options.c:11
+#: ../src/lib/parse_options.c:29
#, c-format
msgid "Usage: %s\n"
-msgstr ""
+msgstr "ବà­à¬¯à¬¬à¬¹à¬¾à¬° ବିଧି: %s\n"
-#: ../src/plugins/abrt-action-analyze-c.c:154
+#: ../src/plugins/abrt-action-analyze-c.c:156
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID of coredumps"
msgstr ""
+" [-v] -d DIR\n"
+"\n"
+"କୋର ଡମà­à¬ªà¬—à­à¬¡à¬¼à¬¿à¬•à¬° UUID କୠଗଣନା କରିଥାଠà¬à¬¬à¬‚ ସଂରକà­à¬·à¬£ କରିଥାà¬"
-#: ../src/plugins/abrt-action-analyze-oops.c:131
+#: ../src/plugins/abrt-action-analyze-oops.c:133
msgid ""
" [-vs] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of oops crash dumps"
msgstr ""
+" [-vs] -d DIR\n"
+"\n"
+"oops ନଷà­à¬Ÿ ଡମà­à¬ªà¬—à­à¬¡à¬¼à¬¿à¬•à¬° UUID à¬à¬¬à¬‚ DUPHASH କୠଗଣନା କରିଥାଠà¬à¬¬à¬‚ ସଂରକà­à¬·à¬£ କରିଥାà¬"
-#: ../src/plugins/abrt-action-analyze-python.c:36
+#: ../src/plugins/abrt-action-analyze-python.c:38
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of python crash dumps"
msgstr ""
+" [-v] -d DIR\n"
+"\n"
+"python ନଷà­à¬Ÿ ଡମà­à¬ªà¬—à­à¬¡à¬¼à¬¿à¬•à¬° UUID à¬à¬¬à¬‚ DUPHASH କୠଗଣନା କରିଥାଠà¬à¬¬à¬‚ ସଂରକà­à¬·à¬£ କରିଥାà¬"
-#: ../src/plugins/abrt-action-bugzilla.cpp:532
+#: ../src/plugins/abrt-action-bugzilla.cpp:534
#, c-format
msgid "New bug id: %i"
msgstr "ନୂତନ ତà­à¬°à­à¬Ÿà¬¿ id: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:645
+#: ../src/plugins/abrt-action-bugzilla.cpp:662
#, c-format
-msgid "Can't open '%s'"
-msgstr ""
-
-#: ../src/plugins/abrt-action-bugzilla.cpp:665
-#, fuzzy, c-format
msgid "Empty login or password, please check %s"
-msgstr ""
-"ଖାଲି ଲଗଇନ କିମà­à¬¬à¬¾ ପà­à¬°à¬¬à­‡à¬¶ ସଂକେତ।\n"
-"ଦୟାକରି ଯାଞà­à¬š କରନà­à¬¤à­"
+msgstr "ଖାଲି ଲଗଇନ କିମà­à¬¬à¬¾ ପà­à¬°à¬¬à­‡à¬¶ ସଂକେତ,ଦୟାକରି %s କୠଯାଞà­à¬š କରନà­à¬¤à­"
-#: ../src/plugins/abrt-action-bugzilla.cpp:683
+#: ../src/plugins/abrt-action-bugzilla.cpp:680
msgid "Logging into bugzilla..."
msgstr "ବଗଜିଲà­à¬²à¬¾à¬°à­‡ ଲଗଇନ କରà­à¬…ଛି..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:686
+#: ../src/plugins/abrt-action-bugzilla.cpp:683
msgid "Checking for duplicates..."
msgstr "ନକଲିଗà­à¬¡à¬¼à¬¿à¬•à­ ଯାଞà­à¬š କରà­à¬…ଛି..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:707
-#: ../src/plugins/abrt-action-bugzilla.cpp:743
+#: ../src/plugins/abrt-action-bugzilla.cpp:705
+#: ../src/plugins/abrt-action-bugzilla.cpp:741
msgid "Missing mandatory member 'bugs'"
msgstr "ଆବଶà­à­Ÿà¬• ସଦସà­à­Ÿ 'bugs' ଅନà­à¬ªà¬¸à­à¬¥à¬¿à¬¤"
-#: ../src/plugins/abrt-action-bugzilla.cpp:726
-#: ../src/plugins/abrt-action-bugzilla.cpp:759
-#: ../src/plugins/abrt-action-bugzilla.cpp:834
+#: ../src/plugins/abrt-action-bugzilla.cpp:724
+#: ../src/plugins/abrt-action-bugzilla.cpp:757
+#: ../src/plugins/abrt-action-bugzilla.cpp:833
msgid "get_bug_info() failed. Could not collect all mandatory information"
msgstr "get_bug_info() ବିଫଳ ହୋଇଛି। ସମସà­à­Ÿ ଆବଶà­à­Ÿà¬•à­€à­Ÿ ସୂଚନାକୠସଂଗà­à¬°à¬¹ କରିପାରିଲା ନାହିà¬"
-#: ../src/plugins/abrt-action-bugzilla.cpp:775
+#: ../src/plugins/abrt-action-bugzilla.cpp:772
msgid "Creating a new bug..."
msgstr "ଗୋଟିଠନୂତନ ତà­à¬°à­à¬Ÿà¬¿ ନିରà­à¬®à¬¾à¬£ କରà­à¬…ଛି..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:780
+#: ../src/plugins/abrt-action-bugzilla.cpp:777
msgid "Bugzilla entry creation failed"
msgstr "Bugzilla ଭରଣ ନିରà­à¬®à¬¾à¬£à¬°à­‡ ବିଫଳ ହୋଇଛି"
-#: ../src/plugins/abrt-action-bugzilla.cpp:790
-#: ../src/plugins/abrt-action-bugzilla.cpp:887
+#: ../src/plugins/abrt-action-bugzilla.cpp:789
+#: ../src/plugins/abrt-action-bugzilla.cpp:886
msgid "Logging out..."
msgstr "ଲଗଆଉଟ କରà­à¬…ଛି..."
#. decision based on state
-#: ../src/plugins/abrt-action-bugzilla.cpp:808
+#: ../src/plugins/abrt-action-bugzilla.cpp:807
#, c-format
msgid "Bug is already reported: %i"
msgstr "ତà­à¬°à­à¬Ÿà¬¿à¬•à­ ପୂରà­à¬¬à¬°à­ ଖବର କରାଯାଇଛି: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:819
+#: ../src/plugins/abrt-action-bugzilla.cpp:818
#, c-format
msgid "Bugzilla couldn't find parent of bug %d"
msgstr "Bugzilla ମୂଖà­à­Ÿ ତà­à¬°à­à¬Ÿà¬¿ %d କୠଖୋଜିପାରିଲା ନାହିà¬"
-#: ../src/plugins/abrt-action-bugzilla.cpp:848
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-bugzilla.cpp:847
+#, c-format
msgid "Add %s to CC list"
msgstr "%s କୠCC ତାଲିକାରେ ଯୋଗ କରନà­à¬¤à­"
-#: ../src/plugins/abrt-action-bugzilla.cpp:872
+#: ../src/plugins/abrt-action-bugzilla.cpp:871
#, c-format
msgid "Adding new comment to bug %d"
msgstr "ତà­à¬°à­à¬Ÿà¬¿(%d) ରେ ନୂତନ ନିରà­à¬¦à­à¬¦à­‡à¬¶ ଯୋଗ କରନà­à¬¤à­"
-#: ../src/plugins/abrt-action-generate-backtrace.c:319
+#: ../src/plugins/abrt-action-bugzilla.cpp:913
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to Bugzilla"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Bugzilla ରେ ତà­à¬°à­à¬Ÿà¬¿à¬•à­ ଖବର କରନà­à¬¤à­"
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:928
+#: ../src/plugins/abrt-action-kerneloops.c:148
+#: ../src/plugins/abrt-action-rhtsupport.c:282
+msgid "Configuration file (may be given many times)"
+msgstr "ବିନà­à­Ÿà¬¾à¬¸ ଫାଇଲ (ହà­à¬à¬¤à¬ƒ ଅନେକ ଥର ଦିଆଯାଇଥାà¬)"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:258
+msgid " [options] -d DIR"
+msgstr " [ବିକଳà­à¬ªà¬—à­à¬¡à¬¼à¬¿à¬•] -d DIR"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:271
+msgid "Additional debuginfo directories"
+msgstr "ଅତିରିକà­à¬¤ ତà­à¬°à­à¬Ÿà¬¿à¬¨à¬¿à¬¬à¬¾à¬°à¬£ ସୂଚନା ଡିରେକà­à¬Ÿà­‹à¬°à­€à¬—à­à¬¡à¬¼à¬¿à¬•"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:272
+msgid "Kill gdb if it runs for more than N seconds"
+msgstr "gdb କୠବନà­à¬¦ କରନà­à¬¤à­ ଯଦି à¬à¬¹à¬¾ N ସେକଣà­à¬¡à¬°à­ ଅଧିକ ଥର ଚାଲିଥାà¬"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:320
#, c-format
msgid "Backtrace parsing failed for %s"
-msgstr ""
+msgstr "%s ପାଇଠବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à¬¾à¬¸ ବିଶà­à¬³à­‡à¬·à¬£ ବିଫଳ ହୋଇଛି"
#: ../src/plugins/abrt-action-install-debuginfo.py:72
#, python-format
msgid "Extracting cpio from %s"
-msgstr ""
+msgstr "%s ରୠcpio କୠବାହାର କରà­à¬…ଛି"
#: ../src/plugins/abrt-action-install-debuginfo.py:77
msgid "Can't write to:"
-msgstr ""
+msgstr "à¬à¬¹à¬¾à¬•à­ ଲେଖିପାରିବେ ନାହିà¬:"
#: ../src/plugins/abrt-action-install-debuginfo.py:87
msgid "Removing the temporary rpm file"
-msgstr ""
+msgstr "ଅସà­à¬¥à¬¾à­Ÿà­€ rpm ଫାଇଲକୠକାଢ଼à­à¬…ଛି"
#: ../src/plugins/abrt-action-install-debuginfo.py:91
#, python-format
msgid "Can't extract package: %s"
-msgstr ""
+msgstr "ପà­à­Ÿà¬¾à¬•à­‡à¬œà¬•à­ ବାହାର କରିପାରିବେ ନାହିà¬: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:99
#, python-format
msgid "Caching files from %s made from %s"
-msgstr ""
+msgstr "%s ରୠନିରà­à¬®à¬¿à¬¤ %s ଫାଇଲଗà­à¬¡à¬¼à¬¿à¬•à­ କà­à­Ÿà¬¾à¬¶à¬°à­‡ ରଖà­à¬…ଛି"
#: ../src/plugins/abrt-action-install-debuginfo.py:107
msgid "Removing the temporary cpio file"
-msgstr ""
+msgstr "ଅସà­à¬¥à¬¾à­Ÿà­€ cpio ଫାଇଲକୠକାଢ଼à­à¬…ଛି"
#: ../src/plugins/abrt-action-install-debuginfo.py:110
#, python-format
msgid "Can't extract files from: %s"
-msgstr ""
+msgstr "à¬à¬¥à¬¿à¬°à­ ଫାଇଲଗà­à¬¡à¬¼à¬¿à¬•à­ ବାହାର କରିପାରିବେ ନାହିà¬: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:134
#: ../src/plugins/abrt-action-install-debuginfo.py:140
#, python-format
msgid "Downloading (%i of %i) %.30s : %.3s %%"
-msgstr ""
+msgstr "(%i ର %i) %.30s : %.3s %% କୠଆହରଣ କରà­à¬…ଛି"
#: ../src/plugins/abrt-action-install-debuginfo.py:169
-#, fuzzy
msgid "Searching the missing debuginfo packages"
-msgstr "ତà­à¬°à­à¬Ÿà¬¿à¬¨à¬¿à¬¬à¬¾à¬°à¬£ ସୂଚନା ସà­à¬¥à¬¾à¬ªà¬¨à¬•à­ ଆରମà­à¬­ କରà­à¬…ଛି"
+msgstr "ଅନà­à¬ªà¬¸à­à¬¥à¬¿à¬¤ ତà­à¬°à­à¬Ÿà¬¿à¬¨à¬¿à¬¬à¬¾à¬°à¬£ ପà­à­Ÿà¬¾à¬•à­‡à¬œà¬—à­à¬¡à¬¼à¬¿à¬•à­ ସନà­à¬§à¬¾à¬¨ କରà­à¬…ଛି"
#: ../src/plugins/abrt-action-install-debuginfo.py:224
#, python-format
msgid "To download: (%.2f) M / Installed size: %.2f M"
-msgstr ""
+msgstr "ଆହରଣ କରିବା ପାଇà¬: (%.2f) M / ସà­à¬¥à¬¾à¬ªà¬¿à¬¤ ଆକାର: %.2f M"
#: ../src/plugins/abrt-action-install-debuginfo.py:240
msgid "Is this ok? [y/N] "
-msgstr ""
+msgstr "à¬à¬¹à¬¾ ଠିକ ଅଛି କି? [y/N] "
#: ../src/plugins/abrt-action-install-debuginfo.py:257
#, python-format
msgid "Downloading package %s failed"
-msgstr ""
+msgstr "%s ପà­à­Ÿà¬¾à¬•à­‡à¬œà¬•à­ ଆହରଣ କରିବା ବିଫଳ ହୋଇଛି"
#. recursively delete the temp dir on failure
#: ../src/plugins/abrt-action-install-debuginfo.py:268
msgid "Unpacking failed, aborting download..."
-msgstr ""
+msgstr "ପà­à­Ÿà¬¾à¬• କରିବା ବିଫଳ ହୋଇଛି, ଆହରଣକୠବନà­à¬¦ କରà­à¬…ଛି..."
#: ../src/plugins/abrt-action-install-debuginfo.py:275
#, python-format
msgid "All downloaded packages have been extracted, removing %s"
-msgstr ""
+msgstr "ସମସà­à¬¤ ଆହରଣ କରାଯାଇଥିବା ପà­à­Ÿà¬¾à¬•à­‡à¬œà¬—à­à¬¡à¬¼à¬¿à¬•à­ ବାହାର କରାଯାଇଛି, %s କୠକାଢ଼à­à¬…ଛି"
#: ../src/plugins/abrt-action-install-debuginfo.py:280
#, python-format
msgid "Can't remove %s, probably contains an error log"
-msgstr ""
+msgstr "%s କୠକାଢ଼à­à¬…ଛି, ସମà­à¬­à¬¬à¬¤à¬ƒ ଗୋଟିଠତà­à¬°à­à¬Ÿà¬¿ ଲଗ ଧାରଣ କରିଥାଇପାରେ"
#: ../src/plugins/abrt-action-install-debuginfo.py:305
#, python-format
msgid "Analyzing corefile: %(corefile_path)s"
-msgstr ""
+msgstr "ମୂଖà­à­Ÿ ଫାଇଲକୠବିଶà­à¬³à­‡à¬·à¬£ କରà­à¬…ଛି : %(corefile_path)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:384
#, python-format
msgid "Can't remove %(tmpdir_path)s: %(reason)s"
-msgstr ""
+msgstr "%(tmpdir_path)s କୠକାଢ଼ିହେବ ନାହିà¬: %(reason)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:394
msgid "Exiting on user Command"
-msgstr ""
+msgstr "ଚାଳକ ନିରà­à¬¦à­à¬¦à­‡à¬¶ ଉପରେ ପà­à¬°à¬¸à­à¬¥à¬¾à¬¨ କରà­à¬…ଛି"
#: ../src/plugins/abrt-action-install-debuginfo.py:413
#, python-format
msgid "Usage: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
-msgstr ""
+msgstr "ବà­à¬¯à¬¬à¬¹à¬¾à¬° ବିଧି: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
#: ../src/plugins/abrt-action-install-debuginfo.py:442
-#, fuzzy
msgid "You have to specify the path to coredump."
-msgstr "ନକଲ କରିବା ପାଇଠଆପଣଙà­à¬•à­ ଗୋଟିଠକà­à¬·à¬¤à¬¿à¬•à­ ବାଛିବାକୠହେବ।"
+msgstr "ଆପଣଙà­à¬•à­ କୋରଡମà­à¬ª ପାଇଠଗୋଟିଠପଥକୠଉଲà­à¬²à­‡à¬– କରିବାକୠହେବ।"
#: ../src/plugins/abrt-action-install-debuginfo.py:446
-#, fuzzy
msgid "You have to specify the path to cachedir."
-msgstr "ନକଲ କରିବା ପାଇଠଆପଣଙà­à¬•à­ ଗୋଟିଠକà­à¬·à¬¤à¬¿à¬•à­ ବାଛିବାକୠହେବ।"
+msgstr "ଆପଣଙà­à¬•à­ cachedir ପାଇଠଗୋଟିଠପଥକୠଉଲà­à¬²à­‡à¬– କରିବାକୠହେବ।"
#: ../src/plugins/abrt-action-install-debuginfo.py:450
-#, fuzzy
msgid "You have to specify the path to tmpdir."
-msgstr "ନକଲ କରିବା ପାଇଠଆପଣଙà­à¬•à­ ଗୋଟିଠକà­à¬·à¬¤à¬¿à¬•à­ ବାଛିବାକୠହେବ।"
+msgstr "ଆପଣଙà­à¬•à­ tmpdir ପାଇଠଗୋଟିଠପଥକୠଉଲà­à¬²à­‡à¬– କରିବାକୠହେବ।"
#: ../src/plugins/abrt-action-install-debuginfo.py:463
msgid "All debuginfo seems to be available"
-msgstr ""
+msgstr "ସମସà­à¬¤ ତà­à¬°à­à¬Ÿà¬¿à¬¨à¬¿à¬¬à¬¾à¬°à¬£ ସୂଚନା ଉପଲବà­à¬§ ଅଛି ପରି ଲାଗà­à¬…ଛି"
#: ../src/plugins/abrt-action-install-debuginfo.py:470
-#, fuzzy
msgid "Complete!"
-msgstr "ଉପାଦାନ"
+msgstr "ସମà­à¬ªà­‚ରà­à¬£à­à¬£ ହୋଇଛି!"
-#: ../src/plugins/abrt-action-kerneloops.cpp:111
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-kerneloops.c:105
+#, c-format
msgid "Submitting oops report to %s"
-msgstr "'%s' କୠବିବରଣୀ ଲେଖà­à¬…ଛି"
+msgstr "%s ରେ oops ବିବରଣୀ ଦାଖଲ କରà­à¬…ଛି"
-#: ../src/plugins/abrt-action-mailx.cpp:114
+#: ../src/plugins/abrt-action-kerneloops.c:133
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a kernel oops to kerneloops.org (or similar) site"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"ଗୋଟିଠକରà­à¬£à­à¬£à¬² oops କୠkerneloops.org (ଅଥବା ସେହି ସାଦୃଶà­à­Ÿ) ସାଇଟରେ ଖବର କରନà­à¬¤à­"
+
+#: ../src/plugins/abrt-action-mailx.c:110
msgid "Sending an email..."
msgstr "ଗୋଟିଠଇମେଲ ପଠାଉଅଛି..."
-#: ../src/plugins/abrt-action-mailx.cpp:138
+#: ../src/plugins/abrt-action-mailx.c:137
msgid ""
" [-v] -d DIR [-c CONFFILE]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d DIR [-c CONFFILE]\n"
+"\n"
+"ନଷà­à¬Ÿ ଡମà­à¬ªà¬° ସଙà­à¬•à­à¬šà¬¿à¬¤ ଟାରବଲକୠଧାରଣ କରନà­à¬¤à­"
-#: ../src/plugins/abrt-action-mailx.cpp:151
-#: ../src/plugins/abrt-action-upload.cpp:267
-#, fuzzy
+#: ../src/plugins/abrt-action-mailx.c:150
+#: ../src/plugins/abrt-action-upload.c:262
msgid "Config file"
-msgstr "ଲଗ ଫାଇଲ:"
+msgstr "ବିନà­à­Ÿà¬¾à¬¸ ଫାଇଲ"
-#: ../src/plugins/abrt-action-print.cpp:39
+#: ../src/plugins/abrt-action-print.c:38
msgid ""
" [-v] [-o FILE] -d DIR\n"
"\n"
"Print information about the crash to standard output"
msgstr ""
+" [-v] [-o FILE] -d DIR\n"
+"\n"
+"ମାନକ ଫଳାଫଳ ପାଇଠନଷà­à¬Ÿ ବିଷୟରେ ସୂଚନାକୠମà­à¬¦à­à¬°à¬£ କରନà­à¬¤à­"
-#: ../src/plugins/abrt-action-print.cpp:51
+#: ../src/plugins/abrt-action-print.c:51
msgid "Output file"
-msgstr ""
+msgstr "ଫଳାଫଳ ଫାଇଲ"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was appended to %s"
msgstr "ବିବରଣୀକୠ%s ରେ ଯୋଡ଼ିଥାà¬"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was stored to %s"
msgstr "ବିବରଣୀକୠ%s ରେ ସଂରକà­à¬·à¬£ କରିଥାà¬"
@@ -1510,48 +1522,84 @@ msgstr "ବିବରଣୀକୠ%s ରେ ସଂରକà­à¬·à¬£ କରିଥା
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
#. error msg is already logged by dd_opendir
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
-#: ../src/plugins/abrt-action-rhtsupport.cpp:43
-#: ../src/plugins/abrt-action-upload.cpp:121
+#: ../src/plugins/abrt-action-rhtsupport.c:41
+#: ../src/plugins/abrt-action-upload.c:119
msgid "Compressing data"
-msgstr ""
+msgstr "ତଥà­à¬¯ ସଙà­à¬•à­‹à¬šà¬¨ କରà­à¬…ଛି"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:78
-#, fuzzy
+#: ../src/plugins/abrt-action-rhtsupport.c:73
msgid "Empty login or password, please check RHTSupport.conf"
-msgstr ""
-"ଖାଲି ଲଗଇନ କିମà­à¬¬à¬¾ ପà­à¬°à¬¬à­‡à¬¶ ସଂକେତ।\n"
-"ଦୟାକରି ଯାଞà­à¬š କରନà­à¬¤à­"
+msgstr "ଖାଲି ଲଗଇନ କିମà­à¬¬à¬¾ ପà­à¬°à¬¬à­‡à¬¶ ସଂକେତ, ଦୟାକରି RHTSupport.conf କୠଯାଞà­à¬š କରନà­à¬¤à­"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:194
+#: ../src/plugins/abrt-action-rhtsupport.c:192
msgid "Creating a new case..."
msgstr "ଗୋଟିଠନୂତନ ପରିସà­à¬¥à¬¿à¬¤à¬¿ ନିରà­à¬®à¬¾à¬£ କରà­à¬…ଛି..."
-#: ../src/plugins/abrt-action-upload.cpp:65
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-rhtsupport.c:267
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to RHTSupport"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"RHTSupport ରେ ତà­à¬°à­à¬Ÿà¬¿à¬•à­ ଖବର କରନà­à¬¤à­"
+
+#: ../src/plugins/abrt-action-upload.c:63
+#, c-format
msgid "Sending %s to %s"
-msgstr "ଅଭିଲେଖ %s କୠ%s ମଧà­à¬¯à¬•à­ ପଠାଉଛି"
+msgstr "%s କୠ%s ମଧà­à¬¯à¬•à­ ପଠାଉଛି"
#. This ends up a "reporting status message" in abrtd
-#: ../src/plugins/abrt-action-upload.cpp:98
+#: ../src/plugins/abrt-action-upload.c:96
#, c-format
msgid "Successfully sent %s to %s"
-msgstr ""
+msgstr "%s କୠ%s ମଧà­à¬¯à¬•à­ ସଫଳଭାବରେ ପଠାହେଲ"
-#: ../src/plugins/abrt-action-upload.cpp:219
+#: ../src/plugins/abrt-action-upload.c:213
#, c-format
msgid "Archive is created: '%s'"
-msgstr ""
+msgstr "ଅଭିଲେଖ ନିରà­à¬®à¬¾à¬£ ହୋଇଛି: '%s'"
-#: ../src/plugins/abrt-action-upload.cpp:253
+#: ../src/plugins/abrt-action-upload.c:248
msgid ""
" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
+"\n"
+"ନଷà­à¬Ÿ ଡମà­à¬ªà¬° ସଙà­à¬•à­à¬šà¬¿à¬¤ ଟାରବଲକୠଧାରଣ କରନà­à¬¤à­"
-#: ../src/plugins/abrt-action-upload.cpp:268
+#: ../src/plugins/abrt-action-upload.c:263
msgid "Base URL to upload to"
+msgstr "ଧାରଣ କରିବା ପାଇଠଆଧାର URL"
+
+#: ../src/plugins/abrt-dump-oops.c:540
+msgid ""
+" [-vsrdow] FILE\n"
+"\n"
+"Extract oops from syslog/dmesg file"
msgstr ""
+" [-vsrdow] FILE\n"
+"\n"
+"oopsକୠsyslog/dmesg ଫାଇଲରୠବାହାର କରନà­à¬¤à­"
+
+#: ../src/plugins/abrt-dump-oops.c:556
+msgid "Parse kernel's message buffer before parsing FILE"
+msgstr "କରà­à¬£à­à¬£à¬² ସନà­à¬¦à­‡à¬¶ ବଫରକୠFILE ବିଶà­à¬³à­‡à¬·à¬£ କରିବା ପୂରà­à¬¬à¬°à­ ବିଶà­à¬³à­‡à¬·à¬£ କରନà­à¬¤à­"
+
+#: ../src/plugins/abrt-dump-oops.c:557
+msgid "Create ABRT dump for every oops found"
+msgstr "ମିଳିଥିବା ପà­à¬°à¬¤à­à­Ÿà­‡à¬• oops ପାଇଠABRT ଡମà­à¬ª ନିରà­à¬®à¬¾à¬£ କରନà­à¬¤à­"
+
+#: ../src/plugins/abrt-dump-oops.c:558
+msgid "Print found oopses on standard output"
+msgstr "ମାନକ ଫଳାଫଳ ଉପରେ ମà­à¬¦à­à¬°à¬£à­€ oopses ପାଇଛି"
+
+#: ../src/plugins/abrt-dump-oops.c:559
+msgid "Do not exit, watch the file for new oopses"
+msgstr "ପà­à¬°à¬¸à­à¬¥à¬¾à¬¨ କରନà­à¬¤à­ ନାହିà¬, ନୂତନ oopses ପାଇଠଫାଇଲକୠଦେଖନà­à¬¤à­"
#: ../src/plugins/Bugzilla.glade.h:1
msgid "<b>Bugzilla plugin configuration</b>"
@@ -1589,10 +1637,6 @@ msgstr ""
"ଆପଣ à¬à¬¹à¬¾à¬•à­ <a href=\"https://bugzilla.redhat.com/createaccount.cgi\">à¬à¬ à¬¾à¬°à­‡</a> "
"ନିରà­à¬®à¬¾à¬£ କରିପାରିବେ"
-#: ../src/plugins/CCpp.cpp:277
-msgid "Analyzes crashes in C/C++ programs"
-msgstr "C/C++ ପà­à¬°à¬—à­à¬°à¬¾à¬®à¬—à­à¬¡à¬¼à¬¿à¬•à¬°à­‡ ନଷà­à¬Ÿ ବିବରଣୀକୠବିଶà­à¬³à­‡à¬·à¬£ କରିଥାà¬"
-
#: ../src/plugins/KerneloopsReporter.glade.h:1
msgid "<b>Kerneloops Reporter plugin configuration</b>"
msgstr "<b>Kerneloops ବିବରଣୀକାରୀ ପà­à¬²à¬—ଇନ ସଂରଚନା</b>"
@@ -1601,10 +1645,6 @@ msgstr "<b>Kerneloops ବିବରଣୀକାରୀ ପà­à¬²à¬—ଇନ ସଂà¬
msgid "Submit URL:"
msgstr "URL ଦାଖଲ କରନà­à¬¤à­:"
-#: ../src/plugins/KerneloopsScanner.cpp:227
-msgid "Periodically scans for and saves kernel oopses"
-msgstr "ନିୟମିତ ଭାବରେ କରà­à¬£à­à¬£à¬² ସମସà­à­Ÿà¬¾à¬—à­à¬¡à¬¼à¬¿à¬•à­ କà­à¬°à¬®à¬¬à­€à¬•à­à¬·à¬£ କରି ସଂରକà­à¬·à¬£ କରିଥାà¬"
-
#: ../src/plugins/Logger.glade.h:1
msgid "<b>Logger plugin configuration</b>"
msgstr "<b>ଲଗ ପà­à¬²à¬—ଇନ ସଂରଚନା</b>"
@@ -1650,9 +1690,8 @@ msgid "RHTSupport URL:"
msgstr "RHTSupport URL:"
#: ../src/plugins/Upload.glade.h:1
-#, fuzzy
msgid "<b>Upload plugin configuration</b>"
-msgstr "<b>ଟିକଟ ଧାରଣକାରୀ ପà­à¬²à¬—ଇନ ସଂରଚନା</b>"
+msgstr "<b>ପà­à¬²à¬—ଇନ ସଂରଚନା ଧାରଣକରନà­à¬¤à­</b>"
#: ../src/plugins/Upload.glade.h:2
msgid "Retry count:"
@@ -1670,6 +1709,78 @@ msgstr "URL:"
msgid "Use encryption"
msgstr "ସଂଗà­à¬ªà­à¬¤à¬•à¬°à¬£à¬•à­ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରନà­à¬¤à­"
+#~ msgid ""
+#~ "Usage: %s [OPTION]\n"
+#~ "\n"
+#~ "Startup:\n"
+#~ "\t-V, --version\t\tdisplay the version and exit\n"
+#~ "\t-v, --verbose\t\tincrease verbosity\n"
+#~ "Actions:\n"
+#~ "\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
+#~ "\t -f, --full\tprint a list of all crashes, including the already "
+#~ "reported ones\n"
+#~ "\t-r, --report CRASH_ID\tcreate and send a report\n"
+#~ "\t -y, --always\tcreate and send a report without asking\n"
+#~ "\t-d, --delete CRASH_ID\tremove a crash\n"
+#~ "\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
+#~ "\t -b, --backtrace\tprint detailed information about a crash "
+#~ "including backtrace\n"
+#~ "CRASH_ID can be:\n"
+#~ "\ta name of dump directory, or\n"
+#~ "\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+#~ msgstr ""
+#~ "ବà­à­Ÿà¬¬à¬¾à¬¹à¬° ବିଧି: %s [OPTION]\n"
+#~ "\n"
+#~ "ଆରମà­à¬­:\n"
+#~ "\t-V, --version\t\tସଂସà­à¬•à¬°à¬£ ଦରà­à¬¶à¬¾à¬¨à­à¬¤à­ à¬à¬¬à¬‚ ପà­à¬°à¬¸à­à¬¥à¬¾à¬¨ କରନà­à¬¤à­\n"
+#~ "\t-v, --verbose\t\tverbosity କାରà­à¬¯à­à¬¯à¬•à­\n"
+#~ " ବୃଦà­à¬§à¬¿à¬•à¬°à¬¨à­à¬¤à­\n"
+#~ "\t-?, --help\t\tà¬à¬¹à¬¿ ସହାୟତାକୠମà­à¬¦à­à¬°à¬£ କରନà­à¬¤à­\n"
+#~ "\n"
+#~ "କାରà­à¬¯à­à­Ÿ:\n"
+#~ "\t-l, --list\t\tସମସà­à¬¤ ବିନାଶର ଗୋଟିଠତାଲିକାକୠମà­à¬¦à­à¬°à¬£ କରନà­à¬¤à­ ଯାହାକà­à¬•à¬¿ à¬à¬ªà¬°à­à¬¯à­à­Ÿà¬¨à­à¬¤ ମà­à¬¦à­à¬°à¬£ "
+#~ "କରାଯାଇନାହିà¬\n"
+#~ "\t -f, --full\tସମସà­à¬¤ ବିନାଶର ଗୋଟିଠତାଲିକାକୠମà­à¬¦à­à¬°à¬£ କରନà­à¬¤à­, ପୂରà­à¬¬à¬°à­ ଖବର କରାଯାଇଥିବା "
+#~ "ବିନାଶକୠଅନà­à¬¤à¬°à­à¬­à­à¬•à­à¬¤ କରି\n"
+#~ "\t-r, --report CRASH_ID\tବିବରଣୀ ପà­à¬°à¬¸à­à¬¤à­à¬¤ କରନà­à¬¤à­ à¬à¬¬à¬‚ ପଠାନà­à¬¤à­\n"
+#~ "\t -y, --always\tନପଚାରି ଗୋଟିଠବିବରଣୀ ପà­à¬°à¬¸à­à¬¤à­à¬¤ କରନà­à¬¤à­ à¬à¬¬à¬‚ ପଠାନà­à¬¤à­\n"
+#~ "\t-d, --delete CRASH_ID\tବିନାଶକୠବାହାର କରନà­à¬¤à­\n"
+#~ "\t-i, --info CRASH_ID\tବିବରଣୀ ବିଷୟରେ ଗୋଟିଠବିସà­à¬¤à­ƒà¬¤ ସୂଚନା ମà­à¬¦à­à¬°à¬£ କରନà­à¬¤à­\n"
+#~ "\t -b, --backtrace\tବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à¬¾à¬¸à¬•à­ ଅନà­à¬¤à¬°à­à¬­à­à¬•à­à¬¤ କରି ବିବରଣୀ ବିଷୟରେ ଗୋଟିଠବିସà­à¬¤à­ƒà¬¤ ସୂଚନା "
+#~ "ମà­à¬¦à­à¬°à¬£ କରନà­à¬¤à­\n"
+#~ "CRASH_ID à¬à¬¹à¬¾ ହୋଇପାରେ:\n"
+#~ "\tUID:UUID ଯà­à¬—ଳ,\n"
+#~ "\t@N - N'th ବିନାଶ (--list --full ରେ ଦରà­à¬¶à¬¾à¬¯à¬¾à¬‡à¬¥à¬¿à¬¬à¬¾ ପରି) à¬à¬¥à¬¿à¬°à­‡ କାରà­à¬¯à­à­Ÿà¬•à¬¾à¬°à­€ କରାହେବ\n"
+
+#~ msgid "Error loading reporter settings"
+#~ msgstr "ବିବରଣୀ ସେଟିଙà­à¬—ଗà­à¬¡à¬¼à¬¿à¬•à­ ଧାରଣ କରିବାରେ ତà­à¬°à­à¬Ÿà¬¿"
+
+#~ msgid "You must check the backtrace for sensitive data."
+#~ msgstr "ସà­à¬ªà¬°à­à¬¶à¬•à¬¾à¬¤à¬° ତଥà­à­Ÿ ପାଇଠଆପଣଙà­à¬•à­ ବà­à­Ÿà¬¾à¬•à¬Ÿà­à¬°à­‡à¬¸à¬•à­ ଯାଞà­à¬š କରିବା ଆବଶà­à­Ÿà¬•à¥¤"
+
+#~ msgid "The backtrace is unusable, you cannot report this!"
+#~ msgstr "ବà­à­Ÿà¬¾à¬• ଟà­à¬°à­‡à¬¶à¬Ÿà¬¿ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° ଉପଯୋଗୀ ନà­à¬¹à¬, ଆପଣ à¬à¬¹à¬¾à¬•à­ ଖବର କରି ପାରିବେ ନାହିà¬!"
+
+#~ msgid "Reporting disabled, please fix the problems shown above."
+#~ msgstr ""
+#~ "ଖବର କରିବା ପଦà­à¬§à¬¤à¬¿à¬•à­ ନିଷà­à¬•à­à¬°à¬¿à­Ÿ କରାଯାଇଛି, ଉପରେ ଦରà­à¬¶à¬¾à¬¯à¬¾à¬‡à¬¥à¬¿à¬¬à¬¾ ସମସà­à­Ÿà¬¾à¬—à­à¬¡à¬¼à¬¿à¬•à­ ଦୟାକରି ସମାଧାନ କରନà­à¬¤à­à¥¤"
+
+#~ msgid "Sends the report using the selected plugin."
+#~ msgstr "ବଚà­à¬›à¬¿à¬¤ ପà­à¬²à¬—ଇନକୠବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରି ଖବରକୠପଠାଇଥାà¬à¥¤"
+
+#~ msgid ""
+#~ "No reporter plugin available for this type of crash.\n"
+#~ "Please check abrt.conf."
+#~ msgstr ""
+#~ "à¬à¬ªà¬°à¬¿ ନଷà­à¬Ÿ ପାଇଠକୌଣସି ଖବର ପà­à¬²à¬—ଇନ ଉପଲବà­à¬§ ନାହିà¬à¥¤\n"
+#~ "ଦୟାକରି abrt.conf କୠଯାଞà­à¬š କରନà­à¬¤à­à¥¤"
+
+#~ msgid "Analyzes crashes in C/C++ programs"
+#~ msgstr "C/C++ ପà­à¬°à¬—à­à¬°à¬¾à¬®à¬—à­à¬¡à¬¼à¬¿à¬•à¬°à­‡ ନଷà­à¬Ÿ ବିବରଣୀକୠବିଶà­à¬³à­‡à¬·à¬£ କରିଥାà¬"
+
+#~ msgid "Periodically scans for and saves kernel oopses"
+#~ msgstr "ନିୟମିତ ଭାବରେ କରà­à¬£à­à¬£à¬² ସମସà­à­Ÿà¬¾à¬—à­à¬¡à¬¼à¬¿à¬•à­ କà­à¬°à¬®à¬¬à­€à¬•à­à¬·à¬£ କରି ସଂରକà­à¬·à¬£ କରିଥାà¬"
+
#~ msgid "Database plugin not specified. Please check abrtd settings."
#~ msgstr "ତଥà­à­Ÿà¬¾à¬§à¬¾à¬° ପà­à¬²à¬—ଇନ ଉଲà­à¬²à­‡à¬– କରାଯାଇନାହିà¬à¥¤ ଦୟାକରି abrtd ସଂରଚନାକୠଯାଞà­à¬š କରନà­à¬¤à­à¥¤"
diff --git a/po/pa.po b/po/pa.po
index 97e59d2f..c47f30d5 100644
--- a/po/pa.po
+++ b/po/pa.po
@@ -1,23 +1,23 @@
# translation of abrt.master.pa.po to Punjabi
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
-#
# Jaswinder Singh <jsingh@redhat.com>, 2009, 2010.
# A S Alam <aalam@users.sf.net>, 2009.
+# Jaswinder Singh <j.phulewala@gmail.com>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: abrt.master.pa\n"
"Report-Msgid-Bugs-To: jmoskovc@redhat.com\n"
-"POT-Creation-Date: 2010-11-29 13:51+0100\n"
-"PO-Revision-Date: 2010-07-30 10:56+0530\n"
-"Last-Translator: Jaswinder Singh <jsingh@redhat.com>\n"
+"POT-Creation-Date: 2011-02-08 03:00+0000\n"
+"PO-Revision-Date: 2011-02-08 10:04+0530\n"
+"Last-Translator: \n"
"Language-Team: Punjabi/Panjabi <kde-i18n-doc@kde.org>\n"
-"Language: pa\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Language: pa\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 1.0\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
#: ../src/applet/abrt-applet.desktop.in.h:1
msgid "ABRT notification applet"
@@ -29,16 +29,16 @@ msgstr "ABRT ਸੂਚਨਾ à¨à¨ªà¨²à¨¿à¨Ÿ"
msgid "Automatic Bug Reporting Tool"
msgstr "ਆਟੋਮੈਟਿਕ ਬੱਗ ਰਿਪੋਰਟਿੰਗ ਟੂਲ"
-#: ../src/applet/Applet.cpp:86
+#: ../src/applet/applet.c:86
#, c-format
msgid "A crash in the %s package has been detected"
msgstr "%s ਪੈਕੇਜ ਵਿੱਚ ਇੱਕ ਕਰੈਸ ਮਿਲਿਆ ਹੈ"
-#: ../src/applet/Applet.cpp:88
+#: ../src/applet/applet.c:88
msgid "A crash has been detected"
msgstr "ਇੱਕ ਕਰੈਸ ਮਿਲਿਆ ਹੈ"
-#: ../src/applet/Applet.cpp:285
+#: ../src/applet/applet.c:285
msgid "ABRT service is not running"
msgstr "ABRT ਸਰਵਿਸ ਨਹੀਂ ਚੱਲ ਰਹੀ ਹੈ"
@@ -48,11 +48,10 @@ msgid "Warning"
msgstr "ਚੇਤਾਵਨੀ"
#: ../src/applet/applet_gtk.c:230
-msgid ""
-"Notification area applet that notifies users about issues detected by ABRT"
+msgid "Notification area applet that notifies users about issues detected by ABRT"
msgstr "ਸੂਚਨਾ ਖੇਤਰ à¨à¨ªà¨²à¨¿à¨Ÿ ਜੋ ਯੂਜ਼ਰ ਨੂੰ ABRT ਦà©à¨†à¨°à¨¾ ਲੱਭੇ ਮà©à©±à¨¦à¨¿à¨†à¨‚ ਬਾਰੇ ਦੱਸਦਾ ਹੈ"
-#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:23
+#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:24
msgid "translator-credits"
msgstr "ਜਸਵਿੰਦਰ ਸਿੰਘ ਫੂਲੇਵਾਲਾ"
@@ -60,7 +59,7 @@ msgstr "ਜਸਵਿੰਦਰ ਸਿੰਘ ਫੂਲੇਵਾਲਾ"
msgid "Hide"
msgstr "ਓਹਲੇ"
-#: ../src/applet/applet_gtk.c:360 ../src/gui/ccgui.glade.h:13
+#: ../src/applet/applet_gtk.c:360 ../src/gui/ccgui.glade.h:14
msgid "Report"
msgstr "ਰਿਪੋਰਟ"
@@ -68,8 +67,8 @@ msgstr "ਰਿਪੋਰਟ"
msgid "Open ABRT"
msgstr "ABRT ਖੋਲੋ"
-#: ../src/cli/CLI.cpp:47
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:95
+#, c-format
msgid ""
"\tCrash dump : %s\n"
"\tUID : %s\n"
@@ -78,20 +77,20 @@ msgid ""
"\tCrash Time : %s\n"
"\tCrash Count: %s\n"
msgstr ""
+"\tCrash dump : %s\n"
"\tUID : %s\n"
-"\tUUID : %s\n"
"\tPackage : %s\n"
"\tExecutable : %s\n"
"\tCrash Time : %s\n"
"\tCrash Count: %s\n"
-#: ../src/cli/CLI.cpp:65
+#: ../src/cli/CLI.cpp:114
#, c-format
msgid "\tHostname : %s\n"
msgstr "\tHostname : %s\n"
-#: ../src/cli/CLI.cpp:98
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:147
+#, c-format
msgid ""
"Dump directory: %s\n"
"Last crash: %s\n"
@@ -103,7 +102,7 @@ msgid ""
"System: %s, kernel %s\n"
"Reason: %s\n"
msgstr ""
-"Crash ID: %s:%s\n"
+"Dump directory: %s\n"
"Last crash: %s\n"
"Analyzer: %s\n"
"Component: %s\n"
@@ -111,31 +110,29 @@ msgstr ""
"Command: %s\n"
"Executable: %s\n"
"System: %s, kernel %s\n"
-"Rating: %s\n"
-"Coredump file: %s\n"
"Reason: %s\n"
-#: ../src/cli/CLI.cpp:125
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:175
+#, c-format
msgid "Coredump file: %s\n"
-msgstr "ਕਰੈਸ਼ ਫੰਕਸ਼ਨ: %s\n"
+msgstr "ਕੋਰਡੰਪ ਫਾਇਲ: %s\n"
-#: ../src/cli/CLI.cpp:129
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:179
+#, c-format
msgid "Rating: %s\n"
-msgstr "Hostname: %s\n"
+msgstr "ਰੇਟਿੰਗ: %s\n"
-#: ../src/cli/CLI.cpp:134
+#: ../src/cli/CLI.cpp:184
#, c-format
msgid "Crash function: %s\n"
msgstr "ਕਰੈਸ਼ ਫੰਕਸ਼ਨ: %s\n"
-#: ../src/cli/CLI.cpp:138
+#: ../src/cli/CLI.cpp:188
#, c-format
msgid "Hostname: %s\n"
msgstr "Hostname: %s\n"
-#: ../src/cli/CLI.cpp:142
+#: ../src/cli/CLI.cpp:192
#, c-format
msgid ""
"\n"
@@ -146,7 +143,7 @@ msgstr ""
"ਦà©à¨¬à¨¾à¨°à¨¾ ਕਿਵੇਂ ਵੇਖਣਾ ਹੈ:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:146
+#: ../src/cli/CLI.cpp:196
#, c-format
msgid ""
"\n"
@@ -157,7 +154,7 @@ msgstr ""
"ਟਿੱਪਣੀ:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:152
+#: ../src/cli/CLI.cpp:202
#, c-format
msgid ""
"\n"
@@ -168,69 +165,65 @@ msgstr ""
"ਬੈਕਟਰੇਸ:\n"
"%s\n"
-#. Message has embedded tabs.
-#: ../src/cli/CLI.cpp:243
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:300
+#, c-format
msgid ""
-"Usage: %s [OPTION]\n"
+"Usage: %s -l[f] [-D BASE_DIR]...]\n"
+" or: %s -r[y] CRASH_DIR\n"
+" or: %s -i[b] CRASH_DIR\n"
+" or: %s -d CRASH_DIR\n"
"\n"
-"Startup:\n"
-"\t-V, --version\t\tdisplay the version of %s and exit\n"
-"\t-?, --help\t\tprint this help\n"
+"\t-l, --list\t\tList not yet reported crashes\n"
+"\t -f, --full\t\tList all crashes\n"
+"\t-D BASE_DIR\t\tDirectory to list crashes from\n"
+"\t\t\t\t(default: -D $HOME/.abrt/spool -D %s)\n"
"\n"
-"Actions:\n"
-"\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
-"\t -f, --full\tprint a list of all crashes, including the already "
-"reported ones\n"
-"\t-r, --report CRASH_ID\tcreate and send a report\n"
-"\t -y, --always\tcreate and send a report without asking\n"
-"\t-d, --delete CRASH_ID\tremove a crash\n"
-"\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
-"\t -b, --backtrace\tprint detailed information about a crash including "
-"backtrace\n"
-"CRASH_ID can be:\n"
-"\ta name of dump directory, or\n"
-"\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+"\t-r, --report\t\tSend a report about CRASH_DIR\n"
+"\t -y, --always\t\t...without editing and asking\n"
+"\t-i, --info\t\tPrint detailed information about CRASH_DIR\n"
+"\t -b, --backtrace\t...including backtrace\n"
+"\t-d, --delete\t\tRemove CRASH_DIR\n"
+"\n"
+"\t-V, --version\t\tDisplay version and exit\n"
+"\t-v, --verbose\t\tBe verbose\n"
msgstr ""
-"Usage: %s [OPTION]\n"
+"Usage: %s -l[f] [-D BASE_DIR]...]\n"
+" or: %s -r[y] CRASH_DIR\n"
+" or: %s -i[b] CRASH_DIR\n"
+" or: %s -d CRASH_DIR\n"
+"\n"
+"\t-l, --list\t\tList not yet reported crashes\n"
+"\t -f, --full\t\tList all crashes\n"
+"\t-D BASE_DIR\t\tDirectory to list crashes from\n"
+"\t\t\t\t(default: -D $HOME/.abrt/spool -D %s)\n"
"\n"
-"Startup:\n"
-"\t-V, --version\t\tdisplay the version of %s and exit\n"
-"\t-?, --help\t\tprint this help\n"
+"\t-r, --report\t\tSend a report about CRASH_DIR\n"
+"\t -y, --always\t\t...without editing and asking\n"
+"\t-i, --info\t\tPrint detailed information about CRASH_DIR\n"
+"\t -b, --backtrace\t...including backtrace\n"
+"\t-d, --delete\t\tRemove CRASH_DIR\n"
"\n"
-"Actions:\n"
-"\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
-"\t -f, --full\tprint a list of all crashes, including the already "
-"reported ones\n"
-"\t-r, --report CRASH_ID\tcreate and send a report\n"
-"\t -y, --always\tcreate and send a report without asking\n"
-"\t-d, --delete CRASH_ID\tremove a crash\n"
-"\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
-"\t -b, --backtrace\tprint detailed information about a crash including "
-"backtrace\n"
-"CRASH_ID can be:\n"
-"\tUID:UUID pair,\n"
-"\tunique UUID prefix - the crash with matching UUID will be acted upon\n"
-"\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
-
-#: ../src/cli/CLI.cpp:287
+"\t-V, --version\t\tDisplay version and exit\n"
+"\t-v, --verbose\t\tBe verbose\n"
+
+#: ../src/cli/CLI.cpp:348
msgid "You must specify exactly one operation"
msgstr "ਤà©à¨¹à¨¾à¨¨à©‚à©° ਇੱਕ ਕਾਰਵਾਈ ਦੇਣੀ ਚਾਹੀਦੀ ਹੈ"
-#: ../src/cli/report.cpp:166
+#: ../src/cli/report.cpp:161
#, c-format
msgid "# This field is read only\n"
msgstr "# ਇਹ ਖੇਤਰ ਸਿਰਫ ਪੜà©à¨¹à¨¨ ਲਈ ਹੈ\n"
-#: ../src/cli/report.cpp:186
+#: ../src/cli/report.cpp:181
msgid "# Describe the circumstances of this crash below"
msgstr "# ਇਸ ਕਰੈਸ਼ ਦੀਆਂ ਹਾਲਤਾਂ ਹੇਠਾਂ ਦਿਓ"
-#: ../src/cli/report.cpp:188
+#: ../src/cli/report.cpp:183
msgid "# How to reproduce the crash?"
msgstr "# ਕਰੈਸ਼ ਦà©à¨¬à¨¾à¨°à¨¾ ਕਿਵੇਂ ਵੇਖਣਾ ਹੈ?"
-#: ../src/cli/report.cpp:190
+#: ../src/cli/report.cpp:185
msgid ""
"# Backtrace\n"
"# Check that it does not contain any sensitive data (passwords, etc.)"
@@ -238,47 +231,47 @@ msgstr ""
"# ਬੈਕਟਰੇਸ\n"
"# ਜਾਂਚ ਕਰੋ ਕਿ ਇਸ ਵਿੱਚ ਕੋਈ ਜਰੂਰੀ ਡਾਟਾ (ਪਾਸਵਰਡ, ਆਦਿ) ਨਹੀਂ ਹੈ"
-#: ../src/cli/report.cpp:192
+#: ../src/cli/report.cpp:187
msgid "# Architecture"
msgstr "# ਹਾਰਡਵੇਅਰ"
-#: ../src/cli/report.cpp:193
+#: ../src/cli/report.cpp:188
msgid "# Command line"
msgstr "# ਕਮਾਂਡ ਲਾਈਨ"
-#: ../src/cli/report.cpp:194
+#: ../src/cli/report.cpp:189
msgid "# Component"
msgstr "# ਹਿੱਸੇ"
-#: ../src/cli/report.cpp:195
+#: ../src/cli/report.cpp:190
msgid "# Core dump"
msgstr "# ਕੋਰ ਡੰਪ"
-#: ../src/cli/report.cpp:196
+#: ../src/cli/report.cpp:191
msgid "# Executable"
msgstr "# à¨à¨—ਜ਼ੀਕਿਊਟੇਬਲ"
-#: ../src/cli/report.cpp:197
+#: ../src/cli/report.cpp:192
msgid "# Kernel version"
msgstr "# ਕਰਨਲ ਵਰਜਨ"
-#: ../src/cli/report.cpp:198
+#: ../src/cli/report.cpp:193
msgid "# Package"
msgstr "# ਪੈਕੇਜ"
-#: ../src/cli/report.cpp:199
+#: ../src/cli/report.cpp:194
msgid "# Reason of crash"
msgstr "# ਕਰੈਸ਼ ਹੋਣ ਦਾ ਕਾਰਨ"
-#: ../src/cli/report.cpp:200
+#: ../src/cli/report.cpp:195
msgid "# Release string of the operating system"
msgstr "# ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਦੀ ਰੀਲਜ਼ ਜਾਣਕਾਰੀ"
-#: ../src/cli/report.cpp:323
+#: ../src/cli/report.cpp:318
msgid "Cannot run vi: $TERM, $VISUAL and $EDITOR are not set"
msgstr "vi ਨਹੀਂ ਚਲਾ ਸਕਿਆ: $TERM, $VISUAL ਅਤੇ $EDITOR ਸੈੱਟ ਨਹੀਂ ਕੀਤੇ"
-#: ../src/cli/report.cpp:411
+#: ../src/cli/report.cpp:402
msgid ""
"\n"
"The report has been updated"
@@ -286,7 +279,7 @@ msgstr ""
"\n"
"ਰਿਪੋਰਟ ਅੱਪਡੇਟ ਕੀਤੀ ਗਈ ਹੈ"
-#: ../src/cli/report.cpp:413
+#: ../src/cli/report.cpp:404
msgid ""
"\n"
"No changes were detected in the report"
@@ -295,103 +288,127 @@ msgstr ""
"ਰਿਪੋਰਟ ਵਿੰਚ ਕੋਈ ਤਬਦੀਲੀ ਨਹੀਂ ਆਈ ਹੈ"
#. The response might take more than 1 char in non-latin scripts.
-#: ../src/cli/report.cpp:464
+#: ../src/cli/report.cpp:436
msgid "y"
-msgstr ""
+msgstr "y"
-#: ../src/cli/report.cpp:465
+#: ../src/cli/report.cpp:437
msgid "N"
-msgstr ""
+msgstr "N"
#. Read the missing information and push it to plugin settings.
-#: ../src/cli/report.cpp:565
+#: ../src/cli/report.cpp:568
#, c-format
msgid "Wrong settings were detected for plugin %s\n"
msgstr "ਪਲੱਗਇਨ %s ਲਈ ਗਲਤ ਸੈਟਿੰਗ ਮਿਲੀ ਹੈ\n"
-#: ../src/cli/report.cpp:569
+#: ../src/cli/report.cpp:572
msgid "Enter your login: "
msgstr "ਆਪਣਾ ਲਾਗਇਨ ਦਿਓ: "
-#: ../src/cli/report.cpp:575
+#: ../src/cli/report.cpp:578
msgid "Enter your password: "
msgstr "ਆਪਣਾ ਪਾਸਵਰਡ ਦਿਓ: "
-#: ../src/cli/report.cpp:638
+#: ../src/cli/report.cpp:788
msgid "Reporting..."
msgstr "ਰਿਪੋਰਟ ਕਰ ਰਿਹਾ ਹੈ..."
-#: ../src/cli/report.cpp:657
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:801
+#, c-format
msgid "Report using %s?"
-msgstr "%s ਵਰਤ ਕੇ ਰਿਪੋਰਟ ਕਰੋ? [y/N]: "
+msgstr "%s ਵਰਤ ਕੇ ਰਿਪੋਰਟ ਕਰੋ?"
-#: ../src/cli/report.cpp:660
+#: ../src/cli/report.cpp:804
msgid "Skipping..."
msgstr "ਛੱਡ ਰਿਹਾ ਹੈ..."
-#: ../src/cli/report.cpp:672
-#, fuzzy
+#: ../src/cli/report.cpp:820
msgid "Reporting disabled because the backtrace is unusable"
-msgstr "ਰਿਪੋਰਟਿੰਗ ਅਯੋਗ ਹੈ, ਕਿਰਪਾ ਕਰਕੇ ਉੱਪਰ ਦਿੱਤੀ ਸਮੱਸਿਆ ਹੱਲ ਕਰੋ।"
+msgstr "ਰਿਪੋਰਟਿੰਗ ਅਯੋਗ ਹੋਈ ਕਿਉਂਕਿ ਬੈਕਟਰੇਸ ਵਰਤੋਂ ਯੋਗ ਨਹੀਂ ਹੈ"
-#: ../src/cli/report.cpp:676
+#: ../src/cli/report.cpp:824
#, c-format
msgid ""
"Please try to install debuginfo manually using the command: \"debuginfo-"
"install %s\" and try again\n"
msgstr ""
+"ਕਿਰਪਾ ਕਰਕੇ debuginfo ਨੂੰ ਦਸਤੀ ਇੰਸਟਾਲ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ, ਇਹ ਕਮਾਂਡ ਵਰਤ ਕੇ: \"debuginfo-"
+"install %s\" ਅਤੇ ਫਿਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ\n"
-#: ../src/cli/report.cpp:685
-#, fuzzy
-msgid "Error loading reporter settings"
-msgstr "ਰਿਪੋਰਟ ਲੈਣ ਵੇਲੇ ਗਲਤੀ: %s"
-
-#: ../src/cli/report.cpp:704
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:842
+#, c-format
msgid "Crash reported via %d report events (%d errors)\n"
-msgstr "%d ਪਲੱਗਇਨ ਰਾਹੀਂ ਕਰੈਸ਼ ਰਿਪੋਰਟ (%d ਗਲਤੀਆਂ)\n"
+msgstr "ਕਰੈਸ਼ ਨੂੰ %d ਰਿਪੋਰਟ ਈਵੈਂਟ ਦà©à¨†à¨°à¨¾ ਰਿਪੋਰਟ ਕੀਤਾ ਗਿਆ ਹੈ (%d ਗਲਤੀਆਂ)\n"
-#: ../src/daemon/abrt-handle-crashdump.c:42
+#: ../src/daemon/abrt-action-save-package-data.c:280
msgid ""
-" [-vs] -d DIR -e EVENT\n"
-" or: "
+" [options] -d DIR\n"
+"\n"
+"Query package database and save package name, component, and description"
msgstr ""
+" [options] -d DIR\n"
+"\n"
+"ਪੈਕੇਜ ਡਾਟਾਬੇਸ ਵਿੱਚ ਕਿਊਰੀ ਕਰੋ ਅਤੇ ਪੈਕੇਜ ਨਾਂ ਸੰਭਾਲੋ, ਕੰਪੋਨੈਂਟ, ਅਤੇ ਵਰਣਨ"
-#: ../src/daemon/abrt-handle-crashdump.c:57
+#: ../src/daemon/abrt-action-save-package-data.c:292
+#: ../src/daemon/abrt-handle-crashdump.c:60
#: ../src/plugins/abrt-action-analyze-c.c:167
#: ../src/plugins/abrt-action-analyze-oops.c:144
#: ../src/plugins/abrt-action-analyze-python.c:49
+#: ../src/plugins/abrt-action-bugzilla.cpp:927
+#: ../src/plugins/abrt-action-generate-backtrace.c:270
+#: ../src/plugins/abrt-action-kerneloops.c:147
+#: ../src/plugins/abrt-action-mailx.c:149
+#: ../src/plugins/abrt-action-print.c:50
+#: ../src/plugins/abrt-action-rhtsupport.c:281
+#: ../src/plugins/abrt-action-upload.c:261
+msgid "Crash dump directory"
+msgstr "ਕਰੈਸ਼ ਡੰਪ ਡਾਇਰੈਕਟਰੀ"
+
+#: ../src/daemon/abrt-action-save-package-data.c:293
+#: ../src/daemon/abrt-handle-crashdump.c:59 ../src/daemon/abrt-server.c:297
+#: ../src/plugins/abrt-action-bugzilla.cpp:926
+#: ../src/plugins/abrt-action-generate-backtrace.c:273
+#: ../src/plugins/abrt-action-kerneloops.c:146
+#: ../src/plugins/abrt-action-rhtsupport.c:280
+#: ../src/plugins/abrt-dump-oops.c:555
msgid "Log to syslog"
-msgstr ""
+msgstr "syslog ਵਿੱਚ ਲਾਗ ਕਰੋ"
-#: ../src/daemon/abrt-handle-crashdump.c:58
-#: ../src/plugins/abrt-action-analyze-c.c:166
-#: ../src/plugins/abrt-action-analyze-oops.c:143
-#: ../src/plugins/abrt-action-analyze-python.c:48
-#: ../src/plugins/abrt-action-mailx.cpp:150
-#: ../src/plugins/abrt-action-print.cpp:50
-#: ../src/plugins/abrt-action-upload.cpp:266
-msgid "Crash dump directory"
+#: ../src/daemon/abrt-handle-crashdump.c:43
+msgid ""
+" [-vs] -d DIR -e EVENT\n"
+" or: "
msgstr ""
+" [-vs] -d DIR -e EVENT\n"
+" or: "
-#: ../src/daemon/abrt-handle-crashdump.c:59
+#: ../src/daemon/abrt-handle-crashdump.c:61
msgid "Handle EVENT"
-msgstr ""
+msgstr "EVENT ਦਾ ਪਰਬੰਧਨ ਕਰੋ"
-#: ../src/daemon/abrt-handle-crashdump.c:60
+#: ../src/daemon/abrt-handle-crashdump.c:62
msgid "List possible events [which start with PFX]"
-msgstr ""
+msgstr "ਸੰਭਵ ਈਵੈਂਟ ਵੇਖਾਓ [ਜੇ PFX ਨਾਲ ਚਾਲੂ ਹà©à©°à¨¦à©‡ ਹਨ]"
+
+#: ../src/daemon/abrt-server.c:286 ../src/daemon/Daemon.cpp:542
+msgid " [options]"
+msgstr " [options]"
+
+#: ../src/daemon/abrt-server.c:296
+msgid "Use UID as client uid"
+msgstr "UID ਨੂੰ ਕਲਾਂਈਟ uid ਤੌਰ ਤੇ ਵਰਤੋ"
-#: ../src/daemon/CommLayerServerDBus.cpp:229
+#: ../src/daemon/CommLayerServerDBus.cpp:242
msgid "Comment is too long"
msgstr "ਟਿੱਪਣੀ ਬਹà©à¨¤ ਲੰਬੀ ਹੈ"
-#: ../src/daemon/CommLayerServerDBus.cpp:233
+#: ../src/daemon/CommLayerServerDBus.cpp:246
msgid "'How to reproduce' is too long"
msgstr "'How to reproduce' ਬਹà©à¨¤ ਲੰਬਾ ਹੈ"
-#: ../src/daemon/Daemon.cpp:534
+#: ../src/daemon/Daemon.cpp:371
msgid ""
"The size of the report exceeded the quota. Please check system's "
"MaxCrashReportsSize value in abrt.conf."
@@ -399,21 +416,17 @@ msgstr ""
"ਰਿਪੋਰਟ ਅਕਾਰ ਦਾ ਕੋਟਾ ਖਤਮ ਹੋ ਗਿਆ ਹੈ। abrt.conf ਵਿੱਚ ਸਿਸਟਮ ਦਾ MaxCrashReportsSize ਮà©à©±à¨² "
"ਚੈੱਕ ਕਰੋ ਜੀ।"
-#: ../src/daemon/Daemon.cpp:699
-msgid "abrtd [options]"
-msgstr ""
-
-#: ../src/daemon/Daemon.cpp:709
+#: ../src/daemon/Daemon.cpp:553
msgid "Do not daemonize"
-msgstr ""
+msgstr "ਡੈਮਨਾਈਜ਼ ਨਾ ਕਰੋ"
-#: ../src/daemon/Daemon.cpp:710
+#: ../src/daemon/Daemon.cpp:554
msgid "Log to syslog even with -d"
-msgstr ""
+msgstr "syslog ਵਿੱਚ ਭਾਵੇਂ -d ਚੋਣ ਨਾਲ ਲਾਗ ਕਰੋ"
-#: ../src/daemon/Daemon.cpp:711
+#: ../src/daemon/Daemon.cpp:555
msgid "Exit after SEC seconds of inactivity"
-msgstr ""
+msgstr "ਨਾ-ਸਰਗਰਮੀ ਦੇ SEC ਸਕਿੰਟਾਂ ਤੋਂ ਬਾਅਦ ਬੰਦ ਕਰੋ"
#: ../src/gui/abrt.desktop.in.h:2
msgid "View and report application crashes"
@@ -424,8 +437,7 @@ msgid "Another client is already running, trying to wake it..."
msgstr "ਹੋਰ ਕਲਾਇਟ ਪਹਿਲਾਂ ਹੀ ਚੱਲ ਰਿਹਾ ਹੈ, ਇਸ ਨੂੰ ਸਰਗਰਮ ਕਰ ਰਿਹਾ ਹੈ..."
#: ../src/gui/ABRTExceptions.py:14
-msgid ""
-"Got unexpected data from the daemon (is the database properly updated?)."
+msgid "Got unexpected data from the daemon (is the database properly updated?)."
msgstr "ਡੈਮਨ ਤੋਂ ਅਣਜਾਣ ਡਾਟਾ ਮਿਲਿਆ ਹੈ (ਕੀ ਡਾਟਾਬੇਸ ਠੀਕ ਤਰਾਂ ਅੱਪਡੇਟ ਹੋਇਆ ਹੈ?"
#: ../src/gui/ABRTPlugin.py:64
@@ -448,16 +460,16 @@ msgstr "ਰਿਪੋਰਟਰ ਪਲੱਗਇਨ"
msgid "Database plugins"
msgstr "ਡਾਟਾਬੇਸ ਪਲੱਗਇਨ"
-#: ../src/gui/CCDBusBackend.py:74 ../src/gui/CCDBusBackend.py:97
+#: ../src/gui/CCDBusBackend.py:75 ../src/gui/CCDBusBackend.py:98
msgid "Cannot connect to system dbus."
msgstr "ਸਿਸਟਮ ਡੀਬੱਸ ਨਾਲ ਕà©à¨¨à©ˆà¨•à¨Ÿ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।"
-#: ../src/gui/CCDBusBackend.py:120 ../src/gui/CCDBusBackend.py:123
+#: ../src/gui/CCDBusBackend.py:121 ../src/gui/CCDBusBackend.py:124
msgid "Please check if the abrt daemon is running."
msgstr "ਚੈੱਕ ਕਰੋ ਕਿ ਕੀ abrt ਡੈਮਨ ਚੱਲ ਰਹੀ ਹੈ।"
#. FIXME: BUG: BarWindow remains. (how2reproduce: delete "component" in a dump dir and try to report it)
-#: ../src/gui/CCDBusBackend.py:169
+#: ../src/gui/CCDBusBackend.py:170
msgid ""
"Daemon did not return a valid report info.\n"
"Is debuginfo missing?"
@@ -505,11 +517,15 @@ msgstr "ABRT ਬਾਰੇ"
msgid "Copy to Clipboard"
msgstr "ਕਲਿੱਪਬੋਰਡ ਵਿੱਚ ਨਕਲ ਕਰੋ"
-#: ../src/gui/ccgui.glade.h:12 ../src/gui/settings.glade.h:19
+#: ../src/gui/ccgui.glade.h:12
+msgid "Online _Help"
+msgstr "ਆਨਲਾਈਨ ਮਦਦ(_H)"
+
+#: ../src/gui/ccgui.glade.h:13 ../src/gui/settings.glade.h:19
msgid "Plugins"
msgstr "ਪਲੱਗਇਨ"
-#: ../src/gui/ccgui.glade.h:14
+#: ../src/gui/ccgui.glade.h:15
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 "
@@ -535,19 +551,19 @@ msgstr ""
"ਤà©à¨¹à¨¾à¨¨à©‚à©° ਇਸ ਪਰੋਗਰਾਮ ਨਾਲ GNU ਜਨਰਲ ਪਬਲਿਕ ਲਾਈਸੈਂਸ ਦੀ ਕਾਪੀ ਵੀ ਮਿਲਣੀ ਚਾਹੀਦੀ ਹੈ। ਜੇ ਨਹੀਂ, "
"ਤਾਂ <http://www.gnu.org/licenses/> ਵੇਖੋ।"
-#: ../src/gui/ccgui.glade.h:19 ../src/gui/CReporterAssistant.py:71
+#: ../src/gui/ccgui.glade.h:20 ../src/gui/CReporterAssistant.py:111
msgid "View log"
msgstr "ਲਾਗ ਵੇਖੋ"
-#: ../src/gui/ccgui.glade.h:20
+#: ../src/gui/ccgui.glade.h:21
msgid "_Edit"
msgstr "ਸੋਧ(_E)"
-#: ../src/gui/ccgui.glade.h:21
+#: ../src/gui/ccgui.glade.h:22
msgid "_File"
msgstr "ਫਾਇਲ(_F)"
-#: ../src/gui/ccgui.glade.h:22
+#: ../src/gui/ccgui.glade.h:23
msgid "_Help"
msgstr "ਮੱਦਦ(_H)"
@@ -568,7 +584,7 @@ msgstr "ਹੋਸਟ-ਨਾਂ"
msgid "Latest Crash"
msgstr "ਆਖਰੀ ਕਰੈਸ਼"
-#: ../src/gui/CCMainWindow.py:143
+#: ../src/gui/CCMainWindow.py:148
#, python-format
msgid ""
"Cannot show the settings dialog.\n"
@@ -577,7 +593,7 @@ msgstr ""
"ਸੈਟਿੰਗ ਡਾਈਲਾਗ ਨਹੀਂ ਵੇਖਾਇਆ ਜਾ ਸਕਦਾ।\n"
"%s"
-#: ../src/gui/CCMainWindow.py:148
+#: ../src/gui/CCMainWindow.py:153
#, python-format
msgid ""
"Unable to finish the current task!\n"
@@ -587,7 +603,7 @@ msgstr ""
"%s"
#. there is something wrong with the daemon if we cant get the dumplist
-#: ../src/gui/CCMainWindow.py:183
+#: ../src/gui/CCMainWindow.py:188
#, python-format
msgid ""
"Error while loading the dumplist.\n"
@@ -596,7 +612,7 @@ msgstr ""
"ਡੰਪ-ਲਿਸਟ ਲੋਡ ਕਰਨ ਵੇਲੇ ਗਲਤੀ\n"
" %s"
-#: ../src/gui/CCMainWindow.py:241
+#: ../src/gui/CCMainWindow.py:246
#, python-format
msgid ""
"<b>%s Crash</b>\n"
@@ -605,11 +621,11 @@ msgstr ""
"<b>%s ਕਰੈਸ਼</b>\n"
"%s"
-#: ../src/gui/CCMainWindow.py:337
+#: ../src/gui/CCMainWindow.py:343
msgid "You have to select a crash to copy."
msgstr "ਨਕਲ ਕਰਨ ਲਈ ਤà©à¨¹à¨¾à¨¨à©‚à©° ਇੱਕ ਕਰੈਸ਼ ਚà©à¨£à¨¨à¨¾ ਪਵੇਗਾ।"
-#: ../src/gui/CCMainWindow.py:421
+#: ../src/gui/CCMainWindow.py:427
msgid ""
"Usage: abrt-gui [OPTIONS]\n"
"\t-v[vv]\t\t\tVerbose\n"
@@ -619,7 +635,7 @@ msgstr ""
"\t-v[vv]\t\t\tVerbose\n"
"\t--report=CRASH_ID\tDirectly report crash with CRASH_ID"
-#: ../src/gui/CCMainWindow.py:444
+#: ../src/gui/CCMainWindow.py:450
#, python-format
msgid ""
"No such crash in the database, probably wrong crashid.\n"
@@ -628,93 +644,6 @@ msgstr ""
"ਡਾਟਾਬੇਸ ਵਿੱਚ ਅਜਿਹਾ ਕੋਈ ਕਰੈਸ਼ ਨਹੀਂ ਹੈ, ਸੰਭਵ ਹੈ ਕਿ ਕੋਈ ਗਲਤ crashid ਹੈ।\n"
"crashid=%s"
-#. default texts
-#: ../src/gui/CCReporterDialog.py:22 ../src/gui/CReporterAssistant.py:20
-msgid "Brief description of how to reproduce this or what you did..."
-msgstr "ਇਸ ਨੂੰ ਪੈਦਾ ਕਰਨ ਬਾਰੇ ਸੰਖੇਪ ਜਾਣਕਾਰੀ ਜਾਂ ਤà©à¨¸à©€à¨‚ ਕੀ ਕੀਤਾ ਹੈ..."
-
-#: ../src/gui/CCReporterDialog.py:107
-msgid "You must check the backtrace for sensitive data."
-msgstr "ਤà©à¨¹à¨¾à¨¨à©‚à©° ਜਰੂਰੀ ਡਾਟੇ ਲਈ ਬੈਕਟਰੇਸ ਦੀ ਜਾਂਚ ਕਰਨੀ ਪਵੇਗੀ"
-
-#: ../src/gui/CCReporterDialog.py:118 ../src/gui/CReporterAssistant.py:364
-#, python-format
-msgid ""
-"Reporting disabled because the backtrace is unusable.\n"
-"Please try to install debuginfo manually using the command: <b>debuginfo-"
-"install %s</b> \n"
-"then use the Refresh button to regenerate the backtrace."
-msgstr ""
-"ਰਿਪੋਰਟ ਦੇਣੀ ਆਯੋਗ ਹੈ ਕਿਉਂਕਿ ਬੈਕਟਰੇਸ ਬੇਕਾਰ ਹੈ!\n"
-"ਇਸ ਕਮਾਂਡ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਡੀਬੱਗ-ਜਾਣਕਾਰੀ ਇੰਸਟਾਲ ਕਰਕੇ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ: <b> debuginfo-install "
-"%s </b>\n"
-" ਤਦ ਬੈਕਟਰੇਸ ਮà©à©œ-ਬਣਾਉਣ ਲਈ ਤਾਜ਼ਾ ਕਰੋ ਬਟਨ ਵਰਤੋਂ।"
-
-#: ../src/gui/CCReporterDialog.py:120
-msgid "The backtrace is unusable, you cannot report this!"
-msgstr "ਬੈਕਟਰੇਸ ਬੇਕਾਰ ਹੈ, ਤà©à¨¸à©€à¨‚ ਇਹ ਰਿਪੋਰਟ ਨਹੀਂ ਭੇਜ ਸਕਦੇ ਹੋ!"
-
-#: ../src/gui/CCReporterDialog.py:124 ../src/gui/CReporterAssistant.py:342
-#: ../src/gui/CReporterAssistant.py:370
-msgid ""
-"The backtrace is incomplete, please make sure you provide the steps to "
-"reproduce."
-msgstr "ਬੈਕਟਰੇਸ ਅਧੂਰਾ ਹੈ, ਯਕੀਨੀ ਬਣਾਉ ਕਿ ਤà©à¨¸à©€à¨‚ ਇਹ ਬਣਾਉਣ ਲਈ ਠੀਕ ਕਦਮ ਚà©à©±à¨•à©‡ ਹਨ।"
-
-#: ../src/gui/CCReporterDialog.py:130
-msgid "Reporting disabled, please fix the problems shown above."
-msgstr "ਰਿਪੋਰਟਿੰਗ ਅਯੋਗ ਹੈ, ਕਿਰਪਾ ਕਰਕੇ ਉੱਪਰ ਦਿੱਤੀ ਸਮੱਸਿਆ ਹੱਲ ਕਰੋ।"
-
-#: ../src/gui/CCReporterDialog.py:132
-msgid "Sends the report using the selected plugin."
-msgstr "ਚà©à¨£à©‡ ਪਲੱਗਇਨ ਵਰਤ ਕੇ ਰਿਪੋਰਟ ਭੇਜਦਾ ਹੈ।"
-
-#: ../src/gui/CCReporterDialog.py:398
-msgid ""
-"No reporter plugin available for this type of crash.\n"
-"Please check abrt.conf."
-msgstr ""
-"ਕੋਈ ਰਿਪੋਰਟਰ ਪਲੱਗਇਨ ਇਸ ਕਿਸਮ ਦੇ ਕਰੈਸ਼ ਲਈ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ।\n"
-"abrt.conf ਦੀ ਜਾਂਚ ਕਰੋ ਜੀ।"
-
-#: ../src/gui/CCReporterDialog.py:418 ../src/gui/CReporterAssistant.py:249
-#: ../src/gui/PluginsSettingsDialog.py:136
-#, python-format
-msgid ""
-"Cannot save plugin settings:\n"
-" %s"
-msgstr ""
-"ਪਲੱਗਇਨ ਸੈਟਿੰਗ ਸੰਭਾਲ ਨਹੀਂ ਸਕਦਾ:\n"
-" %s"
-
-#: ../src/gui/CCReporterDialog.py:448 ../src/gui/CReporterAssistant.py:279
-#, python-format
-msgid "Configure %s options"
-msgstr "%s ਚੋਣ ਸੰਰਚਨਾ"
-
-#: ../src/gui/CCReporterDialog.py:498 ../src/gui/CReporterAssistant.py:1074
-msgid ""
-"Unable to get report!\n"
-"Is debuginfo missing?"
-msgstr ""
-"ਰਿਪਰੋਟ ਲੈਣ ਵਿੱਚ ਅਸਮਰੱਥ!\n"
-"ਕੀ ਡੀਬੱਗ-ਜਾਣਕਾਰੀ ਮੌਜੂਦ ਨਹੀਂ ਹੈ?"
-
-#: ../src/gui/CCReporterDialog.py:527 ../src/gui/CReporterAssistant.py:455
-#, python-format
-msgid ""
-"Reporting failed!\n"
-"%s"
-msgstr ""
-"ਰਿਪੋਰਟਿੰਗ ਫੇਲà©à¨¹ ਹੋਈ!\n"
-"%s"
-
-#: ../src/gui/CCReporterDialog.py:553 ../src/gui/CCReporterDialog.py:574
-#: ../src/gui/CReporterAssistant.py:1113
-#, python-format
-msgid "Error acquiring the report: %s"
-msgstr "ਰਿਪੋਰਟ ਲੈਣ ਵੇਲੇ ਗਲਤੀ: %s"
-
#: ../src/gui/ConfBackend.py:78
msgid "Cannot connect to the Gnome Keyring daemon."
msgstr "ਸਿਸਟਮ ਡੀਬੱਸ ਨਾਲ ਕà©à¨¨à©ˆà¨•à¨Ÿ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।"
@@ -726,55 +655,100 @@ msgid "Cannot get the default keyring."
msgstr "ਮੂਲ ਕੀਰਿੰਗ ਨਹੀਂ ਪà©à¨°à¨¾à¨ªà¨¤ ਕਰ ਸਕਿਆ।"
#: ../src/gui/ConfBackend.py:103 ../src/gui/ConfBackend.py:120
-msgid ""
-"Access to gnome-keyring has been denied, plugins settings will not be saved."
+msgid "Access to gnome-keyring has been denied, plugins settings will not be saved."
msgstr "gnome-keyring ਦੀ ਵਰਤੋਂ ਰੋਕੀ ਗਈ ਹੈ, ਪਲੱਗਇਨ ਸੈਟਿੰਗ ਸੰਭਾਲੀ ਨਹੀਂ ਜਾਵੇਗੀ।"
#. we tried 2 times, so giving up the authorization
#: ../src/gui/ConfBackend.py:154
#, python-format
-msgid ""
-"Access to gnome-keyring has been denied, cannot load the settings for %s!"
+msgid "Access to gnome-keyring has been denied, cannot load the settings for %s!"
msgstr "gnome-keyring ਦੀ ਵਰਤੋਂ ਰੋਕੀ ਗਈ ਹੈ, %s ਲਈ ਸੈਟਿੰਗ ਸੰਭਾਲੀ ਨਹੀਂ ਜਾਵੇਗੀ!"
#: ../src/gui/ConfBackend.py:207
msgid "Access to gnome-keyring has been denied, cannot load settings."
msgstr "gnome-keyring ਦੀ ਵਰਤੋਂ ਰੋਕੀ ਗਈ ਹੈ, ਸੈਟਿੰਗ ਲੋਡ ਨਹੀਂ ਕਰ ਸਕਿਆ।"
+#: ../src/gui/CReporterAssistant.py:20
+msgid "Brief description of how to reproduce this or what you did..."
+msgstr "ਇਸ ਨੂੰ ਪੈਦਾ ਕਰਨ ਬਾਰੇ ਸੰਖੇਪ ਜਾਣਕਾਰੀ ਜਾਂ ਤà©à¨¸à©€à¨‚ ਕੀ ਕੀਤਾ ਹੈ..."
+
#: ../src/gui/CReporterAssistant.py:21
msgid "Crash info doesn't contain a backtrace"
msgstr "ਕਰੈਸ਼ ਜਾਣਕਾਰੀ ਵਿੱਚ ਬੈਕਟਰੇਸ ਸ਼ਾਮਿਲ ਨਹੀਂ ਹੈ"
-#: ../src/gui/CReporterAssistant.py:334
+#: ../src/gui/CReporterAssistant.py:277
+#: ../src/gui/PluginsSettingsDialog.py:136
+#, python-format
+msgid ""
+"Cannot save plugin settings:\n"
+" %s"
+msgstr ""
+"ਪਲੱਗਇਨ ਸੈਟਿੰਗ ਸੰਭਾਲ ਨਹੀਂ ਸਕਦਾ:\n"
+" %s"
+
+#: ../src/gui/CReporterAssistant.py:307
+#, python-format
+msgid "Configure %s options"
+msgstr "%s ਚੋਣ ਸੰਰਚਨਾ"
+
+#: ../src/gui/CReporterAssistant.py:362
#, python-format
msgid "Rating is %s"
msgstr "ਰੇਟਿੰਗ ਹੈ %s"
-#: ../src/gui/CReporterAssistant.py:337
+#: ../src/gui/CReporterAssistant.py:365
msgid "Crashdump doesn't have rating => we suppose it's not required"
msgstr "Crashdump ਦੀ ਰੇਟਿੰਗ ਨਹੀਂ ਹੈ => ਅਸੀਂ ਮੰਨਦੇ ਹਾਂ ਕਿ ਇਸ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ।"
-#: ../src/gui/CReporterAssistant.py:350
+#: ../src/gui/CReporterAssistant.py:370 ../src/gui/CReporterAssistant.py:398
+msgid ""
+"The backtrace is incomplete, please make sure you provide the steps to "
+"reproduce."
+msgstr "ਬੈਕਟਰੇਸ ਅਧੂਰਾ ਹੈ, ਯਕੀਨੀ ਬਣਾਉ ਕਿ ਤà©à¨¸à©€à¨‚ ਇਹ ਬਣਾਉਣ ਲਈ ਠੀਕ ਕਦਮ ਚà©à©±à¨•à©‡ ਹਨ।"
+
+#: ../src/gui/CReporterAssistant.py:378
msgid "You should check the backtrace for sensitive data."
msgstr "ਤà©à¨¹à¨¾à¨¨à©‚à©° ਜਰੂਰੀ ਡਾਟੇ ਲਈ ਬੈਕਟਰੇਸ ਦੀ ਜਾਂਚ ਕਰਨੀ ਪਵੇਗੀ।"
-#: ../src/gui/CReporterAssistant.py:351
+#: ../src/gui/CReporterAssistant.py:379
msgid "You must agree with sending the backtrace."
msgstr "ਤà©à¨¹à¨¾à¨¨à©‚à©° ਬੈਕਟਰੇਸ ਪੇਸ਼ ਕਰਨ ਲਈ ਸਹਿਮਤ ਹੋਣਾ ਜਰੂਰੀ ਹੈ।"
-#: ../src/gui/CReporterAssistant.py:366
+#: ../src/gui/CReporterAssistant.py:392
+#, python-format
+msgid ""
+"Reporting disabled because the backtrace is unusable.\n"
+"Please try to install debuginfo manually using the command: <b>debuginfo-"
+"install %s</b> \n"
+"then use the Refresh button to regenerate the backtrace."
+msgstr ""
+"ਰਿਪੋਰਟ ਦੇਣੀ ਆਯੋਗ ਹੈ ਕਿਉਂਕਿ ਬੈਕਟਰੇਸ ਬੇਕਾਰ ਹੈ!\n"
+"ਇਸ ਕਮਾਂਡ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਡੀਬੱਗ-ਜਾਣਕਾਰੀ ਇੰਸਟਾਲ ਕਰਕੇ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ: <b> debuginfo-install %"
+"s </b>\n"
+" ਤਦ ਬੈਕਟਰੇਸ ਮà©à©œ-ਬਣਾਉਣ ਲਈ ਤਾਜ਼ਾ ਕਰੋ ਬਟਨ ਵਰਤੋਂ।"
+
+#: ../src/gui/CReporterAssistant.py:394
msgid "Reporting disabled because the backtrace is unusable."
msgstr "ਰਿਪੋਰਟਿੰਗ ਅਯੋਗ ਹੈ, ਕਿਰਪਾ ਕਰਕੇ ਉੱਪਰ ਦਿੱਤੀ ਸਮੱਸਿਆ ਹੱਲ ਕਰੋ।"
-#: ../src/gui/CReporterAssistant.py:412
+#: ../src/gui/CReporterAssistant.py:440
msgid "You did not provide any steps to reproduce."
msgstr "ਤà©à¨¸à©€à¨‚ ਦà©à¨¬à¨¾à¨°à¨¾ ਵੇਖਣ ਲਈ ਕੋਈ ਪਗ ਨਹੀਂ ਦਿੱਤਾ।"
-#: ../src/gui/CReporterAssistant.py:426
+#: ../src/gui/CReporterAssistant.py:454
msgid "You did not provide any comments."
msgstr "ਤà©à¨¸à©€à¨‚ ਕੋਈ ਟਿੱਪਣੀ ਨਹੀਂ ਦਿੱਤੀ।"
-#: ../src/gui/CReporterAssistant.py:507
+#: ../src/gui/CReporterAssistant.py:483
+#, python-format
+msgid ""
+"Reporting failed!\n"
+"%s"
+msgstr ""
+"ਰਿਪੋਰਟਿੰਗ ਫੇਲà©à¨¹ ਹੋਈ!\n"
+"%s"
+
+#: ../src/gui/CReporterAssistant.py:535
#, python-format
msgid ""
"It looks like an application from the package <b>%s</b> has crashed on your "
@@ -801,15 +775,15 @@ msgstr ""
"Select where you would like to report the bug, and press 'Forward' to "
"continue."
-#: ../src/gui/CReporterAssistant.py:548
+#: ../src/gui/CReporterAssistant.py:576
msgid "Only one reporter plugin is configured."
msgstr "ਸਿਰਫ ਇੱਕ ਰਿਪੋਰਟਰ ਪਲੱਗਇਨ ਸੰਰਚਿਤ ਕੀਤਾ ਹੈ।"
-#: ../src/gui/CReporterAssistant.py:554
+#: ../src/gui/CReporterAssistant.py:582
msgid "Send a bug report"
msgstr "ਇੱਕ ਬੱਗ ਰਿਪੋਰਟ ਭੇਜੋ"
-#: ../src/gui/CReporterAssistant.py:592
+#: ../src/gui/CReporterAssistant.py:620
msgid ""
"Below is the backtrace associated with your crash. A crash backtrace "
"provides developers with details about how the crash happened, helping them "
@@ -825,131 +799,142 @@ msgstr ""
"Please review the backtrace below and modify it as needed to ensure your bug "
"report does not contain any sensitive data you would rather not share:"
-#: ../src/gui/CReporterAssistant.py:663 ../src/gui/CReporterAssistant.py:676
-#: ../src/gui/CReporterAssistant.py:710
+#: ../src/gui/CReporterAssistant.py:691 ../src/gui/CReporterAssistant.py:704
+#: ../src/gui/CReporterAssistant.py:738
#, python-format
msgid "Found %i occurence(s) [at: %i of %i]"
-msgstr ""
+msgstr "%i ਘਟਨਾਵਾਂ ਲੱਭੀਆਂ ਹਨ [at: %i of %i]"
-#: ../src/gui/CReporterAssistant.py:747
+#: ../src/gui/CReporterAssistant.py:775
msgid "Search:"
-msgstr ""
+msgstr "ਖੇਜ:"
-#: ../src/gui/CReporterAssistant.py:778
+#: ../src/gui/CReporterAssistant.py:806
msgid "Refresh"
msgstr "ਮà©à©œ-ਤਾਜ਼ਾ"
-#: ../src/gui/CReporterAssistant.py:780
+#: ../src/gui/CReporterAssistant.py:808
msgid "Copy"
msgstr "ਕਾਪੀ"
-#: ../src/gui/CReporterAssistant.py:786
+#: ../src/gui/CReporterAssistant.py:814
msgid "I agree with submitting the backtrace"
msgstr "ਮੈਂ ਬੈਕਟਰੇਸ ਪੇਸ਼ ਕਰਨ ਲਈ ਸਹਿਮਤ ਹਾਂ"
-#: ../src/gui/CReporterAssistant.py:791
+#: ../src/gui/CReporterAssistant.py:819
msgid "Approve the backtrace"
msgstr "ਬੈਕਟਰੇਸ ਮਨਜੂਰ ਕਰੋ"
-#: ../src/gui/CReporterAssistant.py:834
+#: ../src/gui/CReporterAssistant.py:862
msgid "You need to fill the how to before you can proceed..."
-msgstr ""
+msgstr "ਤà©à¨¹à¨¾à¨¨à©‚à©° ਅੱਗੇ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਸਵਾਲਾਂ ਦੇ ਜਵਾਬ ਦੇਣੇ ਪੈਣਗੇ..."
-#: ../src/gui/CReporterAssistant.py:857
+#: ../src/gui/CReporterAssistant.py:885
msgid "How did this crash happen (step-by-step)? How would you reproduce it?"
msgstr "ਇਹ ਕਰੈਸ਼ ਕਿਵੇਂ ਵਾਪਰਿਆ (ਪਗ-ਦਰ-ਪਗ)? ਤà©à¨¸à©€à¨‚ ਇਸਨੂੰ ਦà©à¨¬à¨¾à¨°à¨¾ ਕਿਵੇਂ ਵੇਖ ਸਕਦੇ ਹੋ?"
-#: ../src/gui/CReporterAssistant.py:877
-msgid ""
-"Are there any comments you would like to share with the software maintainers?"
+#: ../src/gui/CReporterAssistant.py:905
+msgid "Are there any comments you would like to share with the software maintainers?"
msgstr "ਕੀ ਤà©à¨¸à©€à¨‚ ਕੋਈ ਟਿੱਪਣੀ ਸਾਫਟਵੇਅਰ ਮੇਨਟੇਨਰਾਂ ਨਾਲ ਸਾਂà¨à©€ ਕਰਨੀ ਚਾਹà©à©°à¨¦à©‡ ਹੋ?"
-#: ../src/gui/CReporterAssistant.py:897
+#: ../src/gui/CReporterAssistant.py:925
msgid "Provide additional details"
msgstr "ਵਾਧੂ ਵੇਰਵਾ ਦਿਓ"
-#: ../src/gui/CReporterAssistant.py:904
+#: ../src/gui/CReporterAssistant.py:932
msgid ""
"<b>Tip:</b> Your comments are not private. Please watch what you say "
"accordingly."
msgstr ""
"<b>ਟਿੱਪਣੀ:</b> ਤà©à¨¹à¨¾à¨¡à©€à¨†à¨‚ ਟਿੱਪਣੀਆਂ ਪਰਾਈਵੇਟ ਨਹੀਂ ਹੈ। ਜੋ ਤà©à¨¸à©€à¨‚ ਕਹਿ ਰਹੇ ਹੋ ਧਿਆਨ ਨਾਲ ਵੇਖੋ ਜੀ।"
-#: ../src/gui/CReporterAssistant.py:945
+#: ../src/gui/CReporterAssistant.py:973
msgid "Confirm and send the report"
msgstr "ਪà©à¨¶à¨Ÿà©€ ਕਰੋ ਅਤੇ ਰਿਪੋਰਟ ਭੇਜੋ"
-#: ../src/gui/CReporterAssistant.py:947
-msgid ""
-"Below is a summary of your bug report. Please click 'Apply' to submit it."
+#: ../src/gui/CReporterAssistant.py:975
+msgid "Below is a summary of your bug report. Please click 'Apply' to submit it."
msgstr "ਹੇਠਾਂ ਤà©à¨¹à¨¾à¨¡à©€ ਬੱਗ ਰਿਪੋਰਟ ਜਾਣਕਾਰੀ ਹੈ। ਇਸਨੂੰ ਪੇਸ਼ ਕਰਨੀ ਲਈ 'ਲਾਗੂ' ਦਬਾਓ।"
-#: ../src/gui/CReporterAssistant.py:952
+#: ../src/gui/CReporterAssistant.py:980
msgid "<b>Basic details</b>"
msgstr "<b>ਮà©à¨¢à¨²à¨¾ ਵੇਰਵਾ</b>"
#. left table
-#: ../src/gui/CReporterAssistant.py:959
+#: ../src/gui/CReporterAssistant.py:987
msgid "Component"
msgstr "ਹਿੱਸੇ"
-#: ../src/gui/CReporterAssistant.py:960
+#: ../src/gui/CReporterAssistant.py:988
msgid "Package"
msgstr "ਪੈਕੇਜ"
-#: ../src/gui/CReporterAssistant.py:961
+#: ../src/gui/CReporterAssistant.py:989
msgid "Executable"
msgstr "à¨à¨—ਜ਼ੀਕਿਊਟੇਬਲ"
-#: ../src/gui/CReporterAssistant.py:962
+#: ../src/gui/CReporterAssistant.py:990
msgid "Cmdline"
msgstr "Cmdline"
#. right table
-#: ../src/gui/CReporterAssistant.py:964
+#: ../src/gui/CReporterAssistant.py:992
msgid "Architecture"
msgstr "ਹਾਰਡਵੇਅਰ"
-#: ../src/gui/CReporterAssistant.py:965
+#: ../src/gui/CReporterAssistant.py:993
msgid "Kernel"
msgstr "ਕਰਨਲ"
-#: ../src/gui/CReporterAssistant.py:966
+#: ../src/gui/CReporterAssistant.py:994
msgid "Release"
msgstr "ਰੀਲੀਜ਼"
-#: ../src/gui/CReporterAssistant.py:967
+#: ../src/gui/CReporterAssistant.py:995
msgid "Reason"
msgstr "ਕਾਰਨ"
-#: ../src/gui/CReporterAssistant.py:978 ../src/gui/report.glade.h:3
+#: ../src/gui/CReporterAssistant.py:1006 ../src/gui/report.glade.h:3
msgid "<b>Backtrace</b>"
msgstr "<b>ਬੈਕਟਰੇਸ</b>"
-#: ../src/gui/CReporterAssistant.py:981
+#: ../src/gui/CReporterAssistant.py:1009
msgid "Click to view..."
msgstr "ਵੇਖਣ ਲਈ ਦਬਾਓ..."
-#: ../src/gui/CReporterAssistant.py:993
+#: ../src/gui/CReporterAssistant.py:1021
msgid "<b>Steps to reproduce:</b>"
msgstr "<b>ਮà©à©œ-ਪੈਦਾ ਕਰਨ ਲਈ ਪਗ:</b>"
-#: ../src/gui/CReporterAssistant.py:1014
+#: ../src/gui/CReporterAssistant.py:1042
msgid "<b>Comments:</b>"
msgstr "<b>ਟਿੱਪਣੀ:</b>"
-#: ../src/gui/CReporterAssistant.py:1017
+#: ../src/gui/CReporterAssistant.py:1045
msgid "No comment provided!"
msgstr "ਕੋਈ ਟਿੱਪਣੀ ਨਹੀਂ ਦਿੱਤੀ!"
-#: ../src/gui/CReporterAssistant.py:1053
+#: ../src/gui/CReporterAssistant.py:1081
msgid "Finished sending the bug report"
msgstr "ਬੱਗ ਰਿਪੋਰਟ ਭੇਜਣਾ ਮà©à¨•à©°à¨®à¨² ਹੋਇਆ"
-#: ../src/gui/CReporterAssistant.py:1057
+#: ../src/gui/CReporterAssistant.py:1085
msgid "<b>Bug reports:</b>"
msgstr "<b>ਬੱਗ ਰਿਪੋਰਟਾਂ:</b>"
+#: ../src/gui/CReporterAssistant.py:1102
+msgid ""
+"Unable to get report!\n"
+"Is debuginfo missing?"
+msgstr ""
+"ਰਿਪਰੋਟ ਲੈਣ ਵਿੱਚ ਅਸਮਰੱਥ!\n"
+"ਕੀ ਡੀਬੱਗ-ਜਾਣਕਾਰੀ ਮੌਜੂਦ ਨਹੀਂ ਹੈ?"
+
+#: ../src/gui/CReporterAssistant.py:1139
+#, python-format
+msgid "Error acquiring the report: %s"
+msgstr "ਰਿਪੋਰਟ ਲੈਣ ਵੇਲੇ ਗਲਤੀ: %s"
+
#: ../src/gui/dialogs.glade.h:1
msgid "Log"
msgstr "ਲਾਗ"
@@ -992,7 +977,6 @@ msgid "Name"
msgstr "ਨਾਂ"
#: ../src/gui/PluginsSettingsDialog.py:118
-#, fuzzy
msgid "Please select a plugin from the list to edit its options."
msgstr "ਕਿਰਪਾ ਕਰਕੇ ਸੂਚੀ ਵਿੱਚ ਪਲੱਗਇਨ ਚà©à¨£à©‹ ਤਾਂ ਜੋ ਇਸ ਦੀਆਂ ਚੋਣਾਂ ਤਬਦੀਲ ਕਰੀਆਂ ਜਾਣ।"
@@ -1213,266 +1197,306 @@ msgstr ""
"Please use the buttons below to open the respective configuration and fix it "
"before you proceed, otherwise, the reporting process may fail.\n"
-#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.cpp:47
+#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.c:45
#, c-format
msgid "Uploaded: %llu of %llu kbytes"
-msgstr ""
+msgstr "ਅੱਪਲੋਡ: %llu of %llu kbytes"
-#: ../src/lib/parse_options.c:11
+#: ../src/lib/parse_options.c:29
#, c-format
msgid "Usage: %s\n"
-msgstr ""
+msgstr "ਵਰਤੋਂ: %s\n"
-#: ../src/plugins/abrt-action-analyze-c.c:154
+#: ../src/plugins/abrt-action-analyze-c.c:156
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID of coredumps"
msgstr ""
+" [-v] -d DIR\n"
+"\n"
+"Calculates and saves UUID of coredumps"
-#: ../src/plugins/abrt-action-analyze-oops.c:131
+#: ../src/plugins/abrt-action-analyze-oops.c:133
msgid ""
" [-vs] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of oops crash dumps"
msgstr ""
+" [-vs] -d DIR\n"
+"\n"
+"Calculates and saves UUID and DUPHASH of oops crash dumps"
-#: ../src/plugins/abrt-action-analyze-python.c:36
+#: ../src/plugins/abrt-action-analyze-python.c:38
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of python crash dumps"
msgstr ""
+" [-v] -d DIR\n"
+"\n"
+"Calculates and saves UUID and DUPHASH of python crash dumps"
-#: ../src/plugins/abrt-action-bugzilla.cpp:532
+#: ../src/plugins/abrt-action-bugzilla.cpp:534
#, c-format
msgid "New bug id: %i"
msgstr "ਨਵਾਂ ਬੱਗ id: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:645
+#: ../src/plugins/abrt-action-bugzilla.cpp:662
#, c-format
-msgid "Can't open '%s'"
-msgstr ""
-
-#: ../src/plugins/abrt-action-bugzilla.cpp:665
-#, fuzzy, c-format
msgid "Empty login or password, please check %s"
-msgstr ""
-"ਖਾਲੀ ਲਾਗਇਨ ਜਾਂ ਪਾਸਵਰਡ। \n"
-"ਜਾਂਚ ਕਰੋ ਜੀ "
+msgstr "ਖਾਲੀ ਲਾਗਇਨ ਜਾਂ ਪਾਸਵਰਡ, ਕਿਰਪਾ ਕਰਕੇ %s ਦੀ ਜਾਂਚ ਕਰੋ"
-#: ../src/plugins/abrt-action-bugzilla.cpp:683
+#: ../src/plugins/abrt-action-bugzilla.cpp:680
msgid "Logging into bugzilla..."
msgstr "ਬੱਗਜ਼ੀਲਾ ਉੱਤੇ ਲਾਗਇਨ ਕੀਤਾ ਜਾਂਦਾ ਹੈ..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:686
+#: ../src/plugins/abrt-action-bugzilla.cpp:683
msgid "Checking for duplicates..."
msgstr "ਡà©à¨ªà¨²à©€à¨•à©‡à¨Ÿ ਲਈ ਜਾਂਚ ਜਾਰੀ..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:707
-#: ../src/plugins/abrt-action-bugzilla.cpp:743
+#: ../src/plugins/abrt-action-bugzilla.cpp:705
+#: ../src/plugins/abrt-action-bugzilla.cpp:741
msgid "Missing mandatory member 'bugs'"
msgstr "ਗੈਰ-ਮੌਜੂਦ ਜਰੂਰੀ ਮੈਂਬਰ 'ਬੱਗ'"
-#: ../src/plugins/abrt-action-bugzilla.cpp:726
-#: ../src/plugins/abrt-action-bugzilla.cpp:759
-#: ../src/plugins/abrt-action-bugzilla.cpp:834
+#: ../src/plugins/abrt-action-bugzilla.cpp:724
+#: ../src/plugins/abrt-action-bugzilla.cpp:757
+#: ../src/plugins/abrt-action-bugzilla.cpp:833
msgid "get_bug_info() failed. Could not collect all mandatory information"
msgstr "get_bug_info() ਫੇਲ ਹੈ। ਸਭ ਜਰੂਰੀ ਜਾਣਕਾਰੀ ਇਕੱਠੀ ਨਹੀਂ ਕਰ ਸਕਿਆ"
-#: ../src/plugins/abrt-action-bugzilla.cpp:775
+#: ../src/plugins/abrt-action-bugzilla.cpp:772
msgid "Creating a new bug..."
msgstr "ਨਵਾਂ ਬੱਗ ਬਣਾ ਰਿਹਾ ਹੈ..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:780
+#: ../src/plugins/abrt-action-bugzilla.cpp:777
msgid "Bugzilla entry creation failed"
msgstr "ਬੱਗਜ਼ੀਲਾ à¨à¨‚ਟਰੀ ਬਣਾਉਣ ਵਿੱਚ ਫੇਲ"
-#: ../src/plugins/abrt-action-bugzilla.cpp:790
-#: ../src/plugins/abrt-action-bugzilla.cpp:887
+#: ../src/plugins/abrt-action-bugzilla.cpp:789
+#: ../src/plugins/abrt-action-bugzilla.cpp:886
msgid "Logging out..."
msgstr "ਲਾਗਆਉਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..."
#. decision based on state
-#: ../src/plugins/abrt-action-bugzilla.cpp:808
+#: ../src/plugins/abrt-action-bugzilla.cpp:807
#, c-format
msgid "Bug is already reported: %i"
msgstr "ਬੱਗ ਪਹਿਲਾਂ ਹੀ ਰਿਪੋਰਟ ਕੀਤਾ ਹੈ: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:819
+#: ../src/plugins/abrt-action-bugzilla.cpp:818
#, c-format
msgid "Bugzilla couldn't find parent of bug %d"
msgstr "ਬੱਗਜ਼ੀਲਾ ਨੂੰ bug %d ਦਾ ਅਧਾਰ ਨਹੀਂ ਲੱਭਿਆ"
-#: ../src/plugins/abrt-action-bugzilla.cpp:848
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-bugzilla.cpp:847
+#, c-format
msgid "Add %s to CC list"
msgstr "%s ਨੂੰ CC ਲਿਸਟ ਵਿੱਚ ਜੋੜੋ"
-#: ../src/plugins/abrt-action-bugzilla.cpp:872
+#: ../src/plugins/abrt-action-bugzilla.cpp:871
#, c-format
msgid "Adding new comment to bug %d"
msgstr "bug(%d) ਵਿੱਚ ਨਵੀਂ ਟਿੱਪਣੀ ਜੋੜੋ"
-#: ../src/plugins/abrt-action-generate-backtrace.c:319
+#: ../src/plugins/abrt-action-bugzilla.cpp:913
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to Bugzilla"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"ਕਰੈਸ਼ ਰਿਪੋਰਟ ਬੱਗਜ਼ੀਲਾ ਤੇ ਦਿਓ"
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:928
+#: ../src/plugins/abrt-action-kerneloops.c:148
+#: ../src/plugins/abrt-action-rhtsupport.c:282
+msgid "Configuration file (may be given many times)"
+msgstr "ਸੰਰਚਨਾ ਫਾਇਲ (ਹੋ ਸਕਦਾ ਕਈ ਵਾਰ ਦਿੱਤੀ ਹੋਵੇ)"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:258
+msgid " [options] -d DIR"
+msgstr " [options] -d DIR"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:271
+msgid "Additional debuginfo directories"
+msgstr "ਵਾਧੂ debuginfo ਡਾਇਰੈਕਟਰੀਆਂ"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:272
+msgid "Kill gdb if it runs for more than N seconds"
+msgstr "gdb ਕਿੱਲ ਕਰੋ ਜੇ ਇਹ N ਸਕਿੰਟਾਂ ਤੋਂ ਜਿਆਦਾ ਦੇਰ ਤੋਂ ਚੱਲ ਰਿਹਾ ਹੋ"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:320
#, c-format
msgid "Backtrace parsing failed for %s"
-msgstr ""
+msgstr "%s ਲਈ ਬੈਕਟਰੇਸ ਪਾਰਸਿੰਗ ਫੇਲ ਹੋਈ ਹੈ"
#: ../src/plugins/abrt-action-install-debuginfo.py:72
#, python-format
msgid "Extracting cpio from %s"
-msgstr ""
+msgstr "cpio ਨੂੰ %s ਤੋਂ ਖੇਲ ਰਿਹਾ ਹੈ"
#: ../src/plugins/abrt-action-install-debuginfo.py:77
msgid "Can't write to:"
-msgstr ""
+msgstr "ਇਸ ਤੇ ਲਿਖ ਨਹੀਂ ਸਕਿਆ:"
#: ../src/plugins/abrt-action-install-debuginfo.py:87
msgid "Removing the temporary rpm file"
-msgstr ""
+msgstr "ਆਰਜੀ rpm ਫਾਇਲ ਹਟਾ ਰਿਹਾ ਹੈ"
#: ../src/plugins/abrt-action-install-debuginfo.py:91
#, python-format
msgid "Can't extract package: %s"
-msgstr ""
+msgstr "ਪੈਕੇਜ ਖੋਲੇ ਨਹੀਂ ਜਾ ਸਕਦੇ: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:99
#, python-format
msgid "Caching files from %s made from %s"
-msgstr ""
+msgstr "%s ਤੋਂ ਫਾਇਲਾਂ ਲੈ ਰਿਹਾ ਹੈ ਜੋ %s ਤੋਂ ਬਣੀਆਂ ਹਨ"
#: ../src/plugins/abrt-action-install-debuginfo.py:107
msgid "Removing the temporary cpio file"
-msgstr ""
+msgstr "ਆਰਜੀ cpio ਫਾਇਲ ਹਟਾ ਰਿਹਾ ਹੈ"
#: ../src/plugins/abrt-action-install-debuginfo.py:110
#, python-format
msgid "Can't extract files from: %s"
-msgstr ""
+msgstr "ਇਸ ਤੋਂ ਫਾਇਲਾਂ ਪà©à¨°à¨¾à¨ªà¨¤ ਨਹੀਂ ਕਰ ਸਕਿਆ: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:134
#: ../src/plugins/abrt-action-install-debuginfo.py:140
#, python-format
msgid "Downloading (%i of %i) %.30s : %.3s %%"
-msgstr ""
+msgstr "(%i of %i) %.30s ਨੂੰ ਡਾਊਨਲੋਡ ਕਰ ਰਿਹਾ ਹੈ : %.3s %%"
#: ../src/plugins/abrt-action-install-debuginfo.py:169
-#, fuzzy
msgid "Searching the missing debuginfo packages"
-msgstr "debuginfo ਇੰਸਟਾਲੇਸ਼ਨ ਚਲਾ ਰਿਹਾ ਹੈ"
+msgstr "ਗੌਰ-ਮੌਜੂਦ debuginfo ਪੈਕੇਜ ਖੋਜ ਰਿਹਾ ਹੈ"
#: ../src/plugins/abrt-action-install-debuginfo.py:224
#, python-format
msgid "To download: (%.2f) M / Installed size: %.2f M"
-msgstr ""
+msgstr "ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ: (%.2f) M / ਇੰਸਟਾਲ ਕੀਤਾ ਅਕਾਰ: %.2f M"
#: ../src/plugins/abrt-action-install-debuginfo.py:240
msgid "Is this ok? [y/N] "
-msgstr ""
+msgstr "ਕੀ ਇਹ ਠੀਕ ਹੈ? [y/N] "
#: ../src/plugins/abrt-action-install-debuginfo.py:257
#, python-format
msgid "Downloading package %s failed"
-msgstr ""
+msgstr "ਪੈਕੇਜ %s ਦਾ ਡਾਊਨਲੋਡ ਫੇਲ ਹੋਇਆ ਹੈ"
#. recursively delete the temp dir on failure
#: ../src/plugins/abrt-action-install-debuginfo.py:268
msgid "Unpacking failed, aborting download..."
-msgstr ""
+msgstr "ਅਨ-ਪੈਕੇਜਿੰਗ ਫੇਲ ਹੋਈ, ਡਾਊਨਲੋਡ ਅਧੂਰਾ ਛੱਡ ਰਿਹਾ ਹੈ..."
#: ../src/plugins/abrt-action-install-debuginfo.py:275
#, python-format
msgid "All downloaded packages have been extracted, removing %s"
-msgstr ""
+msgstr "ਸਭ ਡਾਊਨਲੋਡ ਕੀਤੇ ਪੈਕੇਜ ਖੋਲੇ ਗਠਹਨ, %s ਨੂੰ ਹਟਾ ਰਿਹਾ ਹੈ"
#: ../src/plugins/abrt-action-install-debuginfo.py:280
#, python-format
msgid "Can't remove %s, probably contains an error log"
-msgstr ""
+msgstr "%s ਨੂੰ ਹਟਾ ਨਹੀਂ ਸਕਦਾ, ਸੰਭਵ ਹੈ ਕਿ ਇੱਕ ਗਲਤੀ ਲਾਗ ਇਸ ਵਿੱਚ ਸ਼ਾਮਿਲ ਹੈ"
#: ../src/plugins/abrt-action-install-debuginfo.py:305
#, python-format
msgid "Analyzing corefile: %(corefile_path)s"
-msgstr ""
+msgstr "ਕੋਰ-ਫਾਇਲ ਦੀ ਪੜਚੋਲ ਕਰ ਰਿਹਾ ਹੈ: %(corefile_path)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:384
#, python-format
msgid "Can't remove %(tmpdir_path)s: %(reason)s"
-msgstr ""
+msgstr "%(tmpdir_path)s ਨੂੰ ਹਟਾ ਨਹੀਂ ਸਕਦਾ: %(reason)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:394
msgid "Exiting on user Command"
-msgstr ""
+msgstr "ਯੂਜ਼ਰ ਕਮਾਂਡ ਤੇ ਬੰਦ ਕਰੋ"
#: ../src/plugins/abrt-action-install-debuginfo.py:413
#, python-format
msgid "Usage: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
-msgstr ""
+msgstr "ਵਰਤੋਂ: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
#: ../src/plugins/abrt-action-install-debuginfo.py:442
-#, fuzzy
msgid "You have to specify the path to coredump."
-msgstr "ਨਕਲ ਕਰਨ ਲਈ ਤà©à¨¹à¨¾à¨¨à©‚à©° ਇੱਕ ਕਰੈਸ਼ ਚà©à¨£à¨¨à¨¾ ਪਵੇਗਾ।"
+msgstr "ਤà©à¨¹à¨¾à¨¨à©‚à©° coredump ਦਾ ਮਾਰਗ ਦੇਣਾ ਪਵੇਗਾ।"
#: ../src/plugins/abrt-action-install-debuginfo.py:446
-#, fuzzy
msgid "You have to specify the path to cachedir."
-msgstr "ਨਕਲ ਕਰਨ ਲਈ ਤà©à¨¹à¨¾à¨¨à©‚à©° ਇੱਕ ਕਰੈਸ਼ ਚà©à¨£à¨¨à¨¾ ਪਵੇਗਾ।"
+msgstr "ਤà©à¨¹à¨¾à¨¨à©‚à©° cachedir ਦਾ ਮਾਰਗ ਦੇਣਾ ਪਵੇਗਾ।"
#: ../src/plugins/abrt-action-install-debuginfo.py:450
-#, fuzzy
msgid "You have to specify the path to tmpdir."
-msgstr "ਨਕਲ ਕਰਨ ਲਈ ਤà©à¨¹à¨¾à¨¨à©‚à©° ਇੱਕ ਕਰੈਸ਼ ਚà©à¨£à¨¨à¨¾ ਪਵੇਗਾ।"
+msgstr "ਤà©à¨¹à¨¾à¨¨à©‚à©° tmpdir ਦਾ ਮਾਰਗ ਦੇਣਾ ਪਵੇਗਾ।"
#: ../src/plugins/abrt-action-install-debuginfo.py:463
msgid "All debuginfo seems to be available"
-msgstr ""
+msgstr "ਸਭ debuginfo ਉਪਲੱਬਧ ਜਾਪਦੀ ਹੈ"
#: ../src/plugins/abrt-action-install-debuginfo.py:470
-#, fuzzy
msgid "Complete!"
-msgstr "ਹਿੱਸੇ"
+msgstr "ਮà©à¨•à©°à¨®à¨²!"
-#: ../src/plugins/abrt-action-kerneloops.cpp:111
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-kerneloops.c:105
+#, c-format
msgid "Submitting oops report to %s"
-msgstr "'%s' ਵਿੱਚ ਰਿਪੋਰਟ ਲਿਖ ਰਿਹਾ ਹੈ"
+msgstr "oops ਰਿਪੋਰਟ %s ਨੂੰ ਪੇਸ਼ ਕਰ ਰਿਹਾ ਹੈ"
+
+#: ../src/plugins/abrt-action-kerneloops.c:133
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a kernel oops to kerneloops.org (or similar) site"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a kernel oops to kerneloops.org (or similar) site"
-#: ../src/plugins/abrt-action-mailx.cpp:114
+#: ../src/plugins/abrt-action-mailx.c:110
msgid "Sending an email..."
msgstr "ਈਮੇਲ ਭੇਜੀ ਜਾ ਰਹੀ ਹੈ..."
-#: ../src/plugins/abrt-action-mailx.cpp:138
+#: ../src/plugins/abrt-action-mailx.c:137
msgid ""
" [-v] -d DIR [-c CONFFILE]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d DIR [-c CONFFILE]\n"
+"\n"
+"Upload compressed tarball of crash dump"
-#: ../src/plugins/abrt-action-mailx.cpp:151
-#: ../src/plugins/abrt-action-upload.cpp:267
-#, fuzzy
+#: ../src/plugins/abrt-action-mailx.c:150
+#: ../src/plugins/abrt-action-upload.c:262
msgid "Config file"
-msgstr "ਲਾਗਰ ਫਾਇਲ:"
+msgstr "ਸੰਰਚਨਾ ਫਾਇਲ"
-#: ../src/plugins/abrt-action-print.cpp:39
+#: ../src/plugins/abrt-action-print.c:38
msgid ""
" [-v] [-o FILE] -d DIR\n"
"\n"
"Print information about the crash to standard output"
msgstr ""
+" [-v] [-o FILE] -d DIR\n"
+"\n"
+"Print information about the crash to standard output"
-#: ../src/plugins/abrt-action-print.cpp:51
+#: ../src/plugins/abrt-action-print.c:51
msgid "Output file"
-msgstr ""
+msgstr "ਆਊਟਪà©à©±à¨Ÿ ਫਾਇਲ"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was appended to %s"
msgstr "ਰਿਪੋਰਟ %s ਵਿੱਚ ਸ਼ਾਮਿਲ ਕੀਤੀ ਗਈ ਸੀ"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was stored to %s"
msgstr "ਰਿਪੋਰਟ %s ਵਿੱਚ ਸੰਭਾਲੀ ਗਈ ਸੀ"
@@ -1480,48 +1504,84 @@ msgstr "ਰਿਪੋਰਟ %s ਵਿੱਚ ਸੰਭਾਲੀ ਗਈ ਸੀ"
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
#. error msg is already logged by dd_opendir
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
-#: ../src/plugins/abrt-action-rhtsupport.cpp:43
-#: ../src/plugins/abrt-action-upload.cpp:121
+#: ../src/plugins/abrt-action-rhtsupport.c:41
+#: ../src/plugins/abrt-action-upload.c:119
msgid "Compressing data"
-msgstr ""
+msgstr "ਡਾਟਾ ਘà©à©±à¨Ÿ ਰਿਹਾ ਹੈ"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:78
-#, fuzzy
+#: ../src/plugins/abrt-action-rhtsupport.c:73
msgid "Empty login or password, please check RHTSupport.conf"
-msgstr ""
-"ਖਾਲੀ ਲਾਗਇਨ ਜਾਂ ਪਾਸਵਰਡ। \n"
-"ਜਾਂਚ ਕਰੋ ਜੀ "
+msgstr "ਖਾਲੀ ਲਾਗਇਨ ਜਾਂ ਪਾਸਵਰਡ, ਕਿਰਪਾ ਕਰਕੇ RHTSupport.conf ਦਾ ਜਾਂਚ ਕਰੋ"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:194
+#: ../src/plugins/abrt-action-rhtsupport.c:192
msgid "Creating a new case..."
msgstr "ਨਵਾਂ ਮà©à©±à¨¦à¨¾ ਬਣਾ ਰਿਹਾ ਹੈ..."
-#: ../src/plugins/abrt-action-upload.cpp:65
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-rhtsupport.c:267
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to RHTSupport"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"ਕਰੈਸ਼ ਰਿਪੋਰਟ RHTSupport ਤੇ ਦਿਓ"
+
+#: ../src/plugins/abrt-action-upload.c:63
+#, c-format
msgid "Sending %s to %s"
-msgstr "%s ਫਾਇਲ ਨੂੰ %s ਵੱਲ ਭੇਜਿਆ ਜਾ ਰਿਹਾ ਹੈ"
+msgstr "%s ਨੂੰ %s ਵੱਲ ਭੇਜਿਆ ਜਾ ਰਿਹਾ ਹੈ"
#. This ends up a "reporting status message" in abrtd
-#: ../src/plugins/abrt-action-upload.cpp:98
+#: ../src/plugins/abrt-action-upload.c:96
#, c-format
msgid "Successfully sent %s to %s"
-msgstr ""
+msgstr "%s ਨੂੰ %s ਵੱਲ ਸਫਲਤਾਪੂਰਕ ਭੇਜ ਦਿੱਤਾ ਹੈ"
-#: ../src/plugins/abrt-action-upload.cpp:219
+#: ../src/plugins/abrt-action-upload.c:213
#, c-format
msgid "Archive is created: '%s'"
-msgstr ""
+msgstr "ਆਰਚੀਵ ਬਣਾਈ ਗਈ ਹੈ: '%s'"
-#: ../src/plugins/abrt-action-upload.cpp:253
+#: ../src/plugins/abrt-action-upload.c:248
msgid ""
" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
+"\n"
+"Upload compressed tarball of crash dump"
-#: ../src/plugins/abrt-action-upload.cpp:268
+#: ../src/plugins/abrt-action-upload.c:263
msgid "Base URL to upload to"
+msgstr "ਬੇਸ URL ਜਿੱਥੇ ਅੱਪਲੋਡ ਕਰਨਾ ਹੈ"
+
+#: ../src/plugins/abrt-dump-oops.c:540
+msgid ""
+" [-vsrdow] FILE\n"
+"\n"
+"Extract oops from syslog/dmesg file"
msgstr ""
+" [-vsrdow] FILE\n"
+"\n"
+"oops ਨੂੰ syslog/dmesg ਫਾਇਲ ਤੋਂ ਲਵੋ"
+
+#: ../src/plugins/abrt-dump-oops.c:556
+msgid "Parse kernel's message buffer before parsing FILE"
+msgstr "FILE ਪਾਰਸ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਕਰਨਲ ਦੇ ਮੈਸੇਜ ਬਫਰ ਨੂੰ ਪਾਰਸ ਕਰੋ"
+
+#: ../src/plugins/abrt-dump-oops.c:557
+msgid "Create ABRT dump for every oops found"
+msgstr "ਹਰੇਕ ਲੱਭੇ ਗਠoops ਲਈ ABRT ਡੰਪ ਬਣਾਓ"
+
+#: ../src/plugins/abrt-dump-oops.c:558
+msgid "Print found oopses on standard output"
+msgstr "Print found oopses on standard output"
+
+#: ../src/plugins/abrt-dump-oops.c:559
+msgid "Do not exit, watch the file for new oopses"
+msgstr "ਬੰਦ ਨਾ ਕਰੋ, ਨਵੇਂ oopses ਲਈ ਫਾਇਲ ਵੇਖੋ"
#: ../src/plugins/Bugzilla.glade.h:1
msgid "<b>Bugzilla plugin configuration</b>"
@@ -1559,10 +1619,6 @@ msgstr ""
"ਤà©à¨¸à©€à¨‚ ਇਸਨੂੰ <a href=\"https://bugzilla.redhat.com/createaccount.cgi\">ਇੱਥੇ</a> ਬਣਾ "
"ਸਕਦੇ ਹੋ"
-#: ../src/plugins/CCpp.cpp:277
-msgid "Analyzes crashes in C/C++ programs"
-msgstr "C/C++ ਪਰੋਗਰਾਮਾਂ ਵਿਚਲੇ ਕਰੈਸ਼ਾਂ ਦੀ ਜਾਂਚ ਕਰਦਾ ਹੈ"
-
#: ../src/plugins/KerneloopsReporter.glade.h:1
msgid "<b>Kerneloops Reporter plugin configuration</b>"
msgstr "<b>kerneloops ਰਿਪੋਰਟਰ ਪਲੱਗਇਨ ਸੰਰਚਿਤ</b>"
@@ -1571,10 +1627,6 @@ msgstr "<b>kerneloops ਰਿਪੋਰਟਰ ਪਲੱਗਇਨ ਸੰਰਚਿà¨
msgid "Submit URL:"
msgstr "URL ਦਿਓ:"
-#: ../src/plugins/KerneloopsScanner.cpp:227
-msgid "Periodically scans for and saves kernel oopses"
-msgstr "ਕਰਨਲ oopses ਨੂੰ ਲਗਾਤਾਰ ਸਕੈਨ ਕਰਦਾ ਹੈ ਅਤੇ ਸੰਭਾਲਦਾ ਹੈ"
-
#: ../src/plugins/Logger.glade.h:1
msgid "<b>Logger plugin configuration</b>"
msgstr "<b>ਲਾਗਰ ਪਲੱਗਇਨ ਸੰਰਚਨਾ</b>"
@@ -1620,9 +1672,8 @@ msgid "RHTSupport URL:"
msgstr "RHTSupport URL:"
#: ../src/plugins/Upload.glade.h:1
-#, fuzzy
msgid "<b>Upload plugin configuration</b>"
-msgstr "<b>ਟਿਕਟ ਅੱਪਡੇਟਰ ਪਲੱਗਇਨ ਸੰਰਚਨਾ</b>"
+msgstr "<b>ਪਲੱਗਇਨ ਸੰਰਚਨਾ ਅੱਪਲੋਡ ਕਰੋ</b>"
#: ../src/plugins/Upload.glade.h:2
msgid "Retry count:"
@@ -1640,6 +1691,73 @@ msgstr "URL:"
msgid "Use encryption"
msgstr "ਇਨਕà©à¨°à¨¿à¨ªà¨¶à¨¨ ਵਰਤੋ"
+#~ msgid ""
+#~ "Usage: %s [OPTION]\n"
+#~ "\n"
+#~ "Startup:\n"
+#~ "\t-V, --version\t\tdisplay the version and exit\n"
+#~ "\t-v, --verbose\t\tincrease verbosity\n"
+#~ "Actions:\n"
+#~ "\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
+#~ "\t -f, --full\tprint a list of all crashes, including the already "
+#~ "reported ones\n"
+#~ "\t-r, --report CRASH_ID\tcreate and send a report\n"
+#~ "\t -y, --always\tcreate and send a report without asking\n"
+#~ "\t-d, --delete CRASH_ID\tremove a crash\n"
+#~ "\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
+#~ "\t -b, --backtrace\tprint detailed information about a crash "
+#~ "including backtrace\n"
+#~ "CRASH_ID can be:\n"
+#~ "\ta name of dump directory, or\n"
+#~ "\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+#~ msgstr ""
+#~ "Usage: %s [OPTION]\n"
+#~ "\n"
+#~ "Startup:\n"
+#~ "\t-V, --version\t\tdisplay the version and exit\n"
+#~ "\t-v, --verbose\t\tincrease verbosity\n"
+#~ "Actions:\n"
+#~ "\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
+#~ "\t -f, --full\tprint a list of all crashes, including the already "
+#~ "reported ones\n"
+#~ "\t-r, --report CRASH_ID\tcreate and send a report\n"
+#~ "\t -y, --always\tcreate and send a report without asking\n"
+#~ "\t-d, --delete CRASH_ID\tremove a crash\n"
+#~ "\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
+#~ "\t -b, --backtrace\tprint detailed information about a crash "
+#~ "including backtrace\n"
+#~ "CRASH_ID can be:\n"
+#~ "\ta name of dump directory, or\n"
+#~ "\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+
+#~ msgid "Error loading reporter settings"
+#~ msgstr "ਰਿਪੋਰਟਰ ਸੈਟਿੰਗ ਲੋਡ ਕਰਨ ਵੇਲੇ ਗਲਤੀ"
+
+#~ msgid "You must check the backtrace for sensitive data."
+#~ msgstr "ਤà©à¨¹à¨¾à¨¨à©‚à©° ਜਰੂਰੀ ਡਾਟੇ ਲਈ ਬੈਕਟਰੇਸ ਦੀ ਜਾਂਚ ਕਰਨੀ ਪਵੇਗੀ"
+
+#~ msgid "The backtrace is unusable, you cannot report this!"
+#~ msgstr "ਬੈਕਟਰੇਸ ਬੇਕਾਰ ਹੈ, ਤà©à¨¸à©€à¨‚ ਇਹ ਰਿਪੋਰਟ ਨਹੀਂ ਭੇਜ ਸਕਦੇ ਹੋ!"
+
+#~ msgid "Reporting disabled, please fix the problems shown above."
+#~ msgstr "ਰਿਪੋਰਟਿੰਗ ਅਯੋਗ ਹੈ, ਕਿਰਪਾ ਕਰਕੇ ਉੱਪਰ ਦਿੱਤੀ ਸਮੱਸਿਆ ਹੱਲ ਕਰੋ।"
+
+#~ msgid "Sends the report using the selected plugin."
+#~ msgstr "ਚà©à¨£à©‡ ਪਲੱਗਇਨ ਵਰਤ ਕੇ ਰਿਪੋਰਟ ਭੇਜਦਾ ਹੈ।"
+
+#~ msgid ""
+#~ "No reporter plugin available for this type of crash.\n"
+#~ "Please check abrt.conf."
+#~ msgstr ""
+#~ "ਕੋਈ ਰਿਪੋਰਟਰ ਪਲੱਗਇਨ ਇਸ ਕਿਸਮ ਦੇ ਕਰੈਸ਼ ਲਈ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ।\n"
+#~ "abrt.conf ਦੀ ਜਾਂਚ ਕਰੋ ਜੀ।"
+
+#~ msgid "Analyzes crashes in C/C++ programs"
+#~ msgstr "C/C++ ਪਰੋਗਰਾਮਾਂ ਵਿਚਲੇ ਕਰੈਸ਼ਾਂ ਦੀ ਜਾਂਚ ਕਰਦਾ ਹੈ"
+
+#~ msgid "Periodically scans for and saves kernel oopses"
+#~ msgstr "ਕਰਨਲ oopses ਨੂੰ ਲਗਾਤਾਰ ਸਕੈਨ ਕਰਦਾ ਹੈ ਅਤੇ ਸੰਭਾਲਦਾ ਹੈ"
+
#~ msgid "Database plugin not specified. Please check abrtd settings."
#~ msgstr "ਡਾਟਾਬੇਸ ਪਲੱਗਇਨ ਨਹੀਂ ਦਿੱਤਾ ਹੈ। abrtd ਸੈਟਿੰਗ ਚੈੱਕ ਕਰੋ ਜੀ।"
diff --git a/po/pl.po b/po/pl.po
index c6e50ef6..25040ab7 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -6,14 +6,14 @@ msgid ""
msgstr ""
"Project-Id-Version: pl\n"
"Report-Msgid-Bugs-To: jmoskovc@redhat.com\n"
-"POT-Creation-Date: 2010-11-29 13:51+0100\n"
-"PO-Revision-Date: 2010-11-30 10:57+0100\n"
+"POT-Creation-Date: 2011-02-06 02:46+0000\n"
+"PO-Revision-Date: 2011-02-06 13:42+0100\n"
"Last-Translator: Piotr DrÄ…g <piotrdrag@gmail.com>\n"
"Language-Team: Polish <trans-pl@lists.fedoraproject.org>\n"
-"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Language: pl\n"
#: ../src/applet/abrt-applet.desktop.in.h:1
msgid "ABRT notification applet"
@@ -25,16 +25,16 @@ msgstr "Aplet powiadomień ABRT"
msgid "Automatic Bug Reporting Tool"
msgstr "Narzędzie do automatycznego zgłaszania błędów"
-#: ../src/applet/Applet.cpp:86
+#: ../src/applet/applet.c:86
#, c-format
msgid "A crash in the %s package has been detected"
msgstr "Wykryto awariÄ™ pakietu %s"
-#: ../src/applet/Applet.cpp:88
+#: ../src/applet/applet.c:88
msgid "A crash has been detected"
msgstr "Wykryto awariÄ™"
-#: ../src/applet/Applet.cpp:285
+#: ../src/applet/applet.c:285
msgid "ABRT service is not running"
msgstr "Usługa ABRT nie jest uruchomiona"
@@ -50,7 +50,7 @@ msgstr ""
"Aplet obszaru powiadamiania informujący użytkownika o problemach wykrytych "
"przez program ABRT"
-#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:23
+#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:24
msgid "translator-credits"
msgstr ""
"Piotr DrÄ…g <piotrdrag@gmail.com>, 2009\n"
@@ -60,7 +60,7 @@ msgstr ""
msgid "Hide"
msgstr "Ukryj"
-#: ../src/applet/applet_gtk.c:360 ../src/gui/ccgui.glade.h:13
+#: ../src/applet/applet_gtk.c:360 ../src/gui/ccgui.glade.h:14
msgid "Report"
msgstr "Zgłoś"
@@ -68,7 +68,7 @@ msgstr "Zgłoś"
msgid "Open ABRT"
msgstr "Otwórz ABRT"
-#: ../src/cli/CLI.cpp:47
+#: ../src/cli/CLI.cpp:91
#, c-format
msgid ""
"\tCrash dump : %s\n"
@@ -85,12 +85,12 @@ msgstr ""
"\tCzas awarii : %s\n"
"\tLiczba awarii : %s\n"
-#: ../src/cli/CLI.cpp:65
+#: ../src/cli/CLI.cpp:110
#, c-format
msgid "\tHostname : %s\n"
msgstr "\tNazwa komputera : %s\n"
-#: ../src/cli/CLI.cpp:98
+#: ../src/cli/CLI.cpp:143
#, c-format
msgid ""
"Dump directory: %s\n"
@@ -113,27 +113,27 @@ msgstr ""
"System: %s, jÄ…dro %s\n"
"Przyczyna: %s\n"
-#: ../src/cli/CLI.cpp:125
+#: ../src/cli/CLI.cpp:171
#, c-format
msgid "Coredump file: %s\n"
msgstr "Plik zrzutu core: %s\n"
-#: ../src/cli/CLI.cpp:129
+#: ../src/cli/CLI.cpp:175
#, c-format
msgid "Rating: %s\n"
msgstr "Ocena: %s\n"
-#: ../src/cli/CLI.cpp:134
+#: ../src/cli/CLI.cpp:180
#, c-format
msgid "Crash function: %s\n"
msgstr "Funkcja awarii: %s\n"
-#: ../src/cli/CLI.cpp:138
+#: ../src/cli/CLI.cpp:184
#, c-format
msgid "Hostname: %s\n"
msgstr "Nazwa komputera: %s\n"
-#: ../src/cli/CLI.cpp:142
+#: ../src/cli/CLI.cpp:188
#, c-format
msgid ""
"\n"
@@ -144,7 +144,7 @@ msgstr ""
"Jak powtórzyć awarię (w języku angielskim)?\n"
"%s\n"
-#: ../src/cli/CLI.cpp:146
+#: ../src/cli/CLI.cpp:192
#, c-format
msgid ""
"\n"
@@ -155,7 +155,7 @@ msgstr ""
"Komentarz (w języku angielskim):\n"
"%s\n"
-#: ../src/cli/CLI.cpp:152
+#: ../src/cli/CLI.cpp:198
#, c-format
msgid ""
"\n"
@@ -166,70 +166,65 @@ msgstr ""
"WyjÄ…tek:\n"
"%s\n"
-#. Message has embedded tabs.
-#: ../src/cli/CLI.cpp:243
+#: ../src/cli/CLI.cpp:295
#, c-format
msgid ""
-"Usage: %s [OPTION]\n"
+"Usage: %s -l[f] [-D BASE_DIR]...]\n"
+" or: %s -r[y] CRASH_DIR\n"
+" or: %s -i[b] CRASH_DIR\n"
+" or: %s -d CRASH_DIR\n"
"\n"
-"Startup:\n"
-"\t-V, --version\t\tdisplay the version of %s and exit\n"
-"\t-?, --help\t\tprint this help\n"
+"\t-l, --list\t\tList not yet reported crashes\n"
+"\t -f, --full\t\tList all crashes\n"
+"\t-D BASE_DIR\t\tDirectory to list crashes from\n"
+"\t\t\t\t(default: -D $HOME/.abrt/spool -D %s)\n"
"\n"
-"Actions:\n"
-"\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
-"\t -f, --full\tprint a list of all crashes, including the already "
-"reported ones\n"
-"\t-r, --report CRASH_ID\tcreate and send a report\n"
-"\t -y, --always\tcreate and send a report without asking\n"
-"\t-d, --delete CRASH_ID\tremove a crash\n"
-"\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
-"\t -b, --backtrace\tprint detailed information about a crash including "
-"backtrace\n"
-"CRASH_ID can be:\n"
-"\ta name of dump directory, or\n"
-"\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+"\t-r, --report\t\tSend a report about CRASH_DIR\n"
+"\t -y, --always\t\t...without editing and asking\n"
+"\t-i, --info\t\tPrint detailed information about CRASH_DIR\n"
+"\t -b, --backtrace\t...including backtrace\n"
+"\t-d, --delete\t\tRemove CRASH_DIR\n"
+"\n"
+"\t-V, --version\t\tDisplay version and exit\n"
+"\t-v, --verbose\t\tBe verbose\n"
msgstr ""
-"Użycie: %s [OPCJA]\n"
+"Użycie: %s -l[f] [-D KATALOG_PODSTAWOWY]...]\n"
+" lub: %s -r[y] KATALOG_AWARII\n"
+" lub: %s -i[b] KATALOG_AWARII\n"
+" lub: %s -d KATALOG_AWARII\n"
+"\n"
+"\t-l, --list\t\tWyświetla listę jeszcze nie zgłoszonych awarii\n"
+"\t -f, --full\t\tWyświetla listę wszystkich awarii\n"
+"\t-D KATALOG_PODSTAWOWY\t\tKatalog, z którego wyświetlić listę awarii\n"
+"\t\t\t\t(domyślnie: -D $HOME/.abrt/spool -D %s)\n"
"\n"
-"Uruchamianie:\n"
-"\t-V, --version\t\twyświetla wersję programu %s i kończy działanie\n"
-"\t-?, --help\t\twyświetla tę pomoc\n"
+"\t-r, --report\t\tWysyła zgłoszenie o KATALOGU_AWARII\n"
+"\t -y, --always\t\t...bez modyfikowania i pytań\n"
+"\t-i, --info\t\tWyświetla szczegółowe informacje o KATALOGU_AWARII\n"
+"\t -b, --backtrace\t...w tym wyjÄ…tek\n"
+"\t-d, --delete\t\tUsuwa KATALOG_AWARII\n"
"\n"
-"Czynności:\n"
-"\t-l, --list\t\twyświetla listę jeszcze nie zgłoszonych awarii\n"
-"\t -f, --full\twyświetla listę wszystkich awarii, także tych już "
-"zgłoszonych\n"
-"\t-r, --report IDENTYFIKATOR_AWARII\ttworzy i wysyła zgłoszenie\n"
-"\t -y, --always\ttworzy i wysyła zgłoszenie bez zadawania pytań\n"
-"\t-d, --delete IDENTYFIKATOR_AWARII\tusuwa awariÄ™\n"
-"\t-i, --info IDENTYFIKATOR_AWARII\twyświetla szczegółowe informacje o "
-"awarii\n"
-"\t -b, --backtrace\twyświetla szczegółowe informacje o awarii, w tym "
-"wyjÄ…tek\n"
-"IDENTYFIKATOR_AWARII może wynosić:\n"
-"\tnazwÄ™ katalogu zrzutu lub,\n"
-"\t@N - zostanie użyta n-ta awaria (tak, jak wyświetlane przez --list --"
-"full)\n"
-
-#: ../src/cli/CLI.cpp:287
+"\t-V, --version\t\tWyświetla wersję i kończy działanie\n"
+"\t-v, --verbose\t\tWięcej komunikatów\n"
+
+#: ../src/cli/CLI.cpp:343
msgid "You must specify exactly one operation"
msgstr "Należy podać dokładnie jedne działanie"
-#: ../src/cli/report.cpp:166
+#: ../src/cli/report.cpp:161
#, c-format
msgid "# This field is read only\n"
msgstr "# To pole jest tylko do odczytu\n"
-#: ../src/cli/report.cpp:186
+#: ../src/cli/report.cpp:181
msgid "# Describe the circumstances of this crash below"
msgstr "# Niżej należy opisać okoliczności tej awarii (w języku angielskim)"
-#: ../src/cli/report.cpp:188
+#: ../src/cli/report.cpp:183
msgid "# How to reproduce the crash?"
msgstr "# Jak powtórzyć awarię (w języku angielskim)?"
-#: ../src/cli/report.cpp:190
+#: ../src/cli/report.cpp:185
msgid ""
"# Backtrace\n"
"# Check that it does not contain any sensitive data (passwords, etc.)"
@@ -237,49 +232,49 @@ msgstr ""
"# WyjÄ…tek\n"
"# Proszę sprawdzić, czy nie zawiera żadnych prywatnych danych (hasła itp.)"
-#: ../src/cli/report.cpp:192
+#: ../src/cli/report.cpp:187
msgid "# Architecture"
msgstr "# Architektura"
-#: ../src/cli/report.cpp:193
+#: ../src/cli/report.cpp:188
msgid "# Command line"
msgstr "# Wiersz poleceń"
-#: ../src/cli/report.cpp:194
+#: ../src/cli/report.cpp:189
msgid "# Component"
msgstr "# Składnik"
-#: ../src/cli/report.cpp:195
+#: ../src/cli/report.cpp:190
msgid "# Core dump"
msgstr "# Zrzut pamięci"
-#: ../src/cli/report.cpp:196
+#: ../src/cli/report.cpp:191
msgid "# Executable"
msgstr "# Plik wykonywalny"
-#: ../src/cli/report.cpp:197
+#: ../src/cli/report.cpp:192
msgid "# Kernel version"
msgstr "# Wersja jÄ…dra"
-#: ../src/cli/report.cpp:198
+#: ../src/cli/report.cpp:193
msgid "# Package"
msgstr "# Pakiet"
-#: ../src/cli/report.cpp:199
+#: ../src/cli/report.cpp:194
msgid "# Reason of crash"
msgstr "# Przyczyna awarii (w języku angielskim)"
-#: ../src/cli/report.cpp:200
+#: ../src/cli/report.cpp:195
msgid "# Release string of the operating system"
msgstr "# CiÄ…g wydania systemu operacyjnego"
-#: ../src/cli/report.cpp:323
+#: ../src/cli/report.cpp:318
msgid "Cannot run vi: $TERM, $VISUAL and $EDITOR are not set"
msgstr ""
"Nie można uruchomić programu vi: nie ustawiono zmiennych $TERM, $VISUAL ani "
"$EDITOR"
-#: ../src/cli/report.cpp:411
+#: ../src/cli/report.cpp:402
msgid ""
"\n"
"The report has been updated"
@@ -287,7 +282,7 @@ msgstr ""
"\n"
"Zgłoszenie zostało zaktualizowane"
-#: ../src/cli/report.cpp:413
+#: ../src/cli/report.cpp:404
msgid ""
"\n"
"No changes were detected in the report"
@@ -296,46 +291,46 @@ msgstr ""
"Nie wykryto zmian w zgłoszeniu"
#. The response might take more than 1 char in non-latin scripts.
-#: ../src/cli/report.cpp:464
+#: ../src/cli/report.cpp:436
msgid "y"
msgstr "t"
-#: ../src/cli/report.cpp:465
+#: ../src/cli/report.cpp:437
msgid "N"
msgstr "N"
#. Read the missing information and push it to plugin settings.
-#: ../src/cli/report.cpp:565
+#: ../src/cli/report.cpp:568
#, c-format
msgid "Wrong settings were detected for plugin %s\n"
msgstr "Wykryto błędne ustawienia dla wtyczki %s\n"
-#: ../src/cli/report.cpp:569
+#: ../src/cli/report.cpp:572
msgid "Enter your login: "
msgstr "Proszę podać login: "
-#: ../src/cli/report.cpp:575
+#: ../src/cli/report.cpp:578
msgid "Enter your password: "
msgstr "Proszę podać hasło: "
-#: ../src/cli/report.cpp:638
+#: ../src/cli/report.cpp:788
msgid "Reporting..."
msgstr "Zgłaszanie..."
-#: ../src/cli/report.cpp:657
+#: ../src/cli/report.cpp:801
#, c-format
msgid "Report using %s?"
msgstr "Zgłosić używając %s?"
-#: ../src/cli/report.cpp:660
+#: ../src/cli/report.cpp:804
msgid "Skipping..."
msgstr "Pomijanie..."
-#: ../src/cli/report.cpp:672
+#: ../src/cli/report.cpp:820
msgid "Reporting disabled because the backtrace is unusable"
msgstr "Zgłaszanie jest wyłączone, ponieważ nie można użyć wyjątku"
-#: ../src/cli/report.cpp:676
+#: ../src/cli/report.cpp:824
#, c-format
msgid ""
"Please try to install debuginfo manually using the command: \"debuginfo-"
@@ -344,57 +339,79 @@ msgstr ""
"Proszę spróbować zainstalować pakiet debuginfo ręcznie, używając polecenia: "
"\"debuginfo-install %s\" i spróbować ponownie\n"
-#: ../src/cli/report.cpp:685
-msgid "Error loading reporter settings"
-msgstr "Błąd podczas wczytywania ustawień zgłaszania"
-
-#: ../src/cli/report.cpp:704
+#: ../src/cli/report.cpp:842
#, c-format
msgid "Crash reported via %d report events (%d errors)\n"
msgstr "Zgłoszono awarię przez %d wtyczki zgłaszania (%d błędów)\n"
-#: ../src/daemon/abrt-handle-crashdump.c:42
+#: ../src/daemon/abrt-action-save-package-data.c:280
msgid ""
-" [-vs] -d DIR -e EVENT\n"
-" or: "
+" [options] -d DIR\n"
+"\n"
+"Query package database and save package name, component, and description"
msgstr ""
-" [-vs] -d KAT -e ZDARZENIE\n"
-" lub: "
+" [opcje] -d KATALOG\n"
+"\n"
+"Odpytuje bazę danych pakietów oraz zapisuje nazwę pakietu, składnik i opis"
-#: ../src/daemon/abrt-handle-crashdump.c:57
+#: ../src/daemon/abrt-action-save-package-data.c:292
+#: ../src/daemon/abrt-handle-crashdump.c:60
#: ../src/plugins/abrt-action-analyze-c.c:167
#: ../src/plugins/abrt-action-analyze-oops.c:144
#: ../src/plugins/abrt-action-analyze-python.c:49
+#: ../src/plugins/abrt-action-bugzilla.cpp:927
+#: ../src/plugins/abrt-action-generate-backtrace.c:270
+#: ../src/plugins/abrt-action-kerneloops.c:147
+#: ../src/plugins/abrt-action-mailx.c:149
+#: ../src/plugins/abrt-action-print.c:50
+#: ../src/plugins/abrt-action-rhtsupport.c:281
+#: ../src/plugins/abrt-action-upload.c:261
+msgid "Crash dump directory"
+msgstr "Katalog zrzutów awarii"
+
+#: ../src/daemon/abrt-action-save-package-data.c:293
+#: ../src/daemon/abrt-handle-crashdump.c:59 ../src/daemon/abrt-server.c:297
+#: ../src/plugins/abrt-action-bugzilla.cpp:926
+#: ../src/plugins/abrt-action-generate-backtrace.c:273
+#: ../src/plugins/abrt-action-kerneloops.c:146
+#: ../src/plugins/abrt-action-rhtsupport.c:280
+#: ../src/plugins/abrt-dump-oops.c:555
msgid "Log to syslog"
msgstr "Przekazuje komunikaty do dziennika systemowego"
-#: ../src/daemon/abrt-handle-crashdump.c:58
-#: ../src/plugins/abrt-action-analyze-c.c:166
-#: ../src/plugins/abrt-action-analyze-oops.c:143
-#: ../src/plugins/abrt-action-analyze-python.c:48
-#: ../src/plugins/abrt-action-mailx.cpp:150
-#: ../src/plugins/abrt-action-print.cpp:50
-#: ../src/plugins/abrt-action-upload.cpp:266
-msgid "Crash dump directory"
-msgstr "Katalog zrzutów awarii"
+#: ../src/daemon/abrt-handle-crashdump.c:43
+msgid ""
+" [-vs] -d DIR -e EVENT\n"
+" or: "
+msgstr ""
+" [-vs] -d KAT -e ZDARZENIE\n"
+" lub: "
-#: ../src/daemon/abrt-handle-crashdump.c:59
+#: ../src/daemon/abrt-handle-crashdump.c:61
msgid "Handle EVENT"
msgstr "Obsługa ZDARZEŃ"
-#: ../src/daemon/abrt-handle-crashdump.c:60
+#: ../src/daemon/abrt-handle-crashdump.c:62
msgid "List possible events [which start with PFX]"
msgstr "Wyświetla możliwe zdarzenia (zaczynające się od PFX)"
-#: ../src/daemon/CommLayerServerDBus.cpp:229
+#: ../src/daemon/abrt-server.c:286 ../src/daemon/Daemon.cpp:542
+msgid " [options]"
+msgstr " [opcje]"
+
+#: ../src/daemon/abrt-server.c:296
+msgid "Use UID as client uid"
+msgstr "Używa UID jako UID klienta"
+
+#: ../src/daemon/CommLayerServerDBus.cpp:242
msgid "Comment is too long"
msgstr "Komentarz jest za długi"
-#: ../src/daemon/CommLayerServerDBus.cpp:233
+#: ../src/daemon/CommLayerServerDBus.cpp:246
msgid "'How to reproduce' is too long"
msgstr "\"Jak powtórzyć awarię\" jest za długie"
-#: ../src/daemon/Daemon.cpp:534
+#: ../src/daemon/Daemon.cpp:371
msgid ""
"The size of the report exceeded the quota. Please check system's "
"MaxCrashReportsSize value in abrt.conf."
@@ -402,20 +419,16 @@ msgstr ""
"Wielkość zgłoszenia przekroczyła dozwolone ograniczenie. Proszę sprawdzić "
"wartość zmiennej MaxCrashReportsSize w pliku abrt.conf."
-#: ../src/daemon/Daemon.cpp:699
-msgid "abrtd [options]"
-msgstr "abrtd [opcje]"
-
-#: ../src/daemon/Daemon.cpp:709
+#: ../src/daemon/Daemon.cpp:553
msgid "Do not daemonize"
msgstr "Bez tworzenia demona"
-#: ../src/daemon/Daemon.cpp:710
+#: ../src/daemon/Daemon.cpp:554
msgid "Log to syslog even with -d"
msgstr ""
"Przekazuje komunikaty do dziennika systemowego, nawet jeśli podano opcję -d"
-#: ../src/daemon/Daemon.cpp:711
+#: ../src/daemon/Daemon.cpp:555
msgid "Exit after SEC seconds of inactivity"
msgstr "Kończy działanie po SEKUNDACH nieaktywności"
@@ -454,16 +467,16 @@ msgstr "Wtyczki zgłaszania"
msgid "Database plugins"
msgstr "Wtyczki baz danych"
-#: ../src/gui/CCDBusBackend.py:74 ../src/gui/CCDBusBackend.py:97
+#: ../src/gui/CCDBusBackend.py:75 ../src/gui/CCDBusBackend.py:98
msgid "Cannot connect to system dbus."
msgstr "Nie można połączyć się z systemową magistralą D-Bus."
-#: ../src/gui/CCDBusBackend.py:120 ../src/gui/CCDBusBackend.py:123
+#: ../src/gui/CCDBusBackend.py:121 ../src/gui/CCDBusBackend.py:124
msgid "Please check if the abrt daemon is running."
msgstr "Proszę sprawdzić, czy demon abrt jest uruchomiony."
#. FIXME: BUG: BarWindow remains. (how2reproduce: delete "component" in a dump dir and try to report it)
-#: ../src/gui/CCDBusBackend.py:169
+#: ../src/gui/CCDBusBackend.py:170
msgid ""
"Daemon did not return a valid report info.\n"
"Is debuginfo missing?"
@@ -511,11 +524,15 @@ msgstr "O programie ABRT"
msgid "Copy to Clipboard"
msgstr "Skopiuj do schowka"
-#: ../src/gui/ccgui.glade.h:12 ../src/gui/settings.glade.h:19
+#: ../src/gui/ccgui.glade.h:12
+msgid "Online _Help"
+msgstr "Pomo_c online"
+
+#: ../src/gui/ccgui.glade.h:13 ../src/gui/settings.glade.h:19
msgid "Plugins"
msgstr "Wtyczki"
-#: ../src/gui/ccgui.glade.h:14
+#: ../src/gui/ccgui.glade.h:15
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 "
@@ -545,19 +562,19 @@ msgstr ""
"Powszechnej Licencji Publicznej GNU (GNU General Public License); jeśli nie "
"- proszę odwiedzić stronę internetową <http://www.gnu.org/licenses/>."
-#: ../src/gui/ccgui.glade.h:19 ../src/gui/CReporterAssistant.py:71
+#: ../src/gui/ccgui.glade.h:20 ../src/gui/CReporterAssistant.py:111
msgid "View log"
msgstr "Wyświetl dziennik"
-#: ../src/gui/ccgui.glade.h:20
+#: ../src/gui/ccgui.glade.h:21
msgid "_Edit"
msgstr "_Edycja"
-#: ../src/gui/ccgui.glade.h:21
+#: ../src/gui/ccgui.glade.h:22
msgid "_File"
msgstr "_Plik"
-#: ../src/gui/ccgui.glade.h:22
+#: ../src/gui/ccgui.glade.h:23
msgid "_Help"
msgstr "Pomo_c"
@@ -578,7 +595,7 @@ msgstr "Nazwa komputera"
msgid "Latest Crash"
msgstr "Ostatnia awaria"
-#: ../src/gui/CCMainWindow.py:143
+#: ../src/gui/CCMainWindow.py:148
#, python-format
msgid ""
"Cannot show the settings dialog.\n"
@@ -587,7 +604,7 @@ msgstr ""
"Nie można wyświetlić okna ustawień.\n"
"%s"
-#: ../src/gui/CCMainWindow.py:148
+#: ../src/gui/CCMainWindow.py:153
#, python-format
msgid ""
"Unable to finish the current task!\n"
@@ -597,7 +614,7 @@ msgstr ""
"%s"
#. there is something wrong with the daemon if we cant get the dumplist
-#: ../src/gui/CCMainWindow.py:183
+#: ../src/gui/CCMainWindow.py:188
#, python-format
msgid ""
"Error while loading the dumplist.\n"
@@ -606,7 +623,7 @@ msgstr ""
"Błąd podczas wczytywania listy zrzutów.\n"
"%s"
-#: ../src/gui/CCMainWindow.py:241
+#: ../src/gui/CCMainWindow.py:246
#, python-format
msgid ""
"<b>%s Crash</b>\n"
@@ -615,11 +632,11 @@ msgstr ""
"<b>Awaria programu %s</b>\n"
"%s"
-#: ../src/gui/CCMainWindow.py:337
+#: ../src/gui/CCMainWindow.py:343
msgid "You have to select a crash to copy."
msgstr "Należy wybrać awarię do skopiowania."
-#: ../src/gui/CCMainWindow.py:421
+#: ../src/gui/CCMainWindow.py:427
msgid ""
"Usage: abrt-gui [OPTIONS]\n"
"\t-v[vv]\t\t\tVerbose\n"
@@ -630,7 +647,7 @@ msgstr ""
"\t--report=IDENTYFIKATOR_AWARII\tBezpośrednio zgłasza awarię z "
"IDENTYFIKATOREM_AWARII"
-#: ../src/gui/CCMainWindow.py:444
+#: ../src/gui/CCMainWindow.py:450
#, python-format
msgid ""
"No such crash in the database, probably wrong crashid.\n"
@@ -640,97 +657,6 @@ msgstr ""
"identyfikator_awarii.\n"
"identyfikator_awarii=%s"
-#. default texts
-#: ../src/gui/CCReporterDialog.py:22 ../src/gui/CReporterAssistant.py:20
-msgid "Brief description of how to reproduce this or what you did..."
-msgstr ""
-"Krótki opis, jak ponownie wywołać tę awarię lub co robił użytkownik (w "
-"języku angielskim)..."
-
-#: ../src/gui/CCReporterDialog.py:107
-msgid "You must check the backtrace for sensitive data."
-msgstr "Należy sprawdzić, czy wyjątek zawiera prywatne dane."
-
-#: ../src/gui/CCReporterDialog.py:118 ../src/gui/CReporterAssistant.py:364
-#, python-format
-msgid ""
-"Reporting disabled because the backtrace is unusable.\n"
-"Please try to install debuginfo manually using the command: <b>debuginfo-"
-"install %s</b> \n"
-"then use the Refresh button to regenerate the backtrace."
-msgstr ""
-"Zgłaszanie zostało wyłączone, ponieważ nie można użyć tego wyjątku.\n"
-"Proszę spróbować ręcznie zainstalować pakiet debuginfo używając polecenia: "
-"<b>debuginfo-install %s</b>, \n"
-"a następnie nacisnąć przycisk Odśwież, aby ponownie utworzyć wyjątek."
-
-#: ../src/gui/CCReporterDialog.py:120
-msgid "The backtrace is unusable, you cannot report this!"
-msgstr "Nie można użyć tego wyjątku, więc nie można tego zgłosić."
-
-#: ../src/gui/CCReporterDialog.py:124 ../src/gui/CReporterAssistant.py:342
-#: ../src/gui/CReporterAssistant.py:370
-msgid ""
-"The backtrace is incomplete, please make sure you provide the steps to "
-"reproduce."
-msgstr ""
-"Wyjątek jest niepełny. Proszę upewnić się, że podano właściwe kroki "
-"ponownego wywołania awarii."
-
-#: ../src/gui/CCReporterDialog.py:130
-msgid "Reporting disabled, please fix the problems shown above."
-msgstr "Zgłaszanie jest wyłączone. Proszę naprawić powyższe problemy."
-
-#: ../src/gui/CCReporterDialog.py:132
-msgid "Sends the report using the selected plugin."
-msgstr "Wysyła zgłoszenie używając wybranej wtyczki."
-
-#: ../src/gui/CCReporterDialog.py:398
-msgid ""
-"No reporter plugin available for this type of crash.\n"
-"Please check abrt.conf."
-msgstr ""
-"Brak dostępnej wtyczki zgłaszania dla tego typu awarii.\n"
-"Proszę sprawdzić plik abrt.conf."
-
-#: ../src/gui/CCReporterDialog.py:418 ../src/gui/CReporterAssistant.py:249
-#: ../src/gui/PluginsSettingsDialog.py:136
-#, python-format
-msgid ""
-"Cannot save plugin settings:\n"
-" %s"
-msgstr ""
-"Nie można zapisać ustawień wtyczki:\n"
-" %s"
-
-#: ../src/gui/CCReporterDialog.py:448 ../src/gui/CReporterAssistant.py:279
-#, python-format
-msgid "Configure %s options"
-msgstr "Skonfiguruj opcje %s"
-
-#: ../src/gui/CCReporterDialog.py:498 ../src/gui/CReporterAssistant.py:1074
-msgid ""
-"Unable to get report!\n"
-"Is debuginfo missing?"
-msgstr ""
-"Nie można uzyskać zgłoszenia.\n"
-"Brak pakietów debuginfo?"
-
-#: ../src/gui/CCReporterDialog.py:527 ../src/gui/CReporterAssistant.py:455
-#, python-format
-msgid ""
-"Reporting failed!\n"
-"%s"
-msgstr ""
-"Zgłoszenie nie powiodło się.\n"
-"%s"
-
-#: ../src/gui/CCReporterDialog.py:553 ../src/gui/CCReporterDialog.py:574
-#: ../src/gui/CReporterAssistant.py:1113
-#, python-format
-msgid "Error acquiring the report: %s"
-msgstr "Błąd podczas uzyskiwania zgłoszenia: %s"
-
#: ../src/gui/ConfBackend.py:78
msgid "Cannot connect to the Gnome Keyring daemon."
msgstr "Nie można połączyć się z demonem bazy kluczy środowiska GNOME."
@@ -762,40 +688,91 @@ msgid "Access to gnome-keyring has been denied, cannot load settings."
msgstr ""
"Dostęp do demona gnome-keyring został odrzucony. Nie można wczytać ustawień."
+#: ../src/gui/CReporterAssistant.py:20
+msgid "Brief description of how to reproduce this or what you did..."
+msgstr ""
+"Krótki opis, jak ponownie wywołać tę awarię lub co robił użytkownik (w "
+"języku angielskim)..."
+
#: ../src/gui/CReporterAssistant.py:21
msgid "Crash info doesn't contain a backtrace"
msgstr "Informacje o awarii nie zawierajÄ… wyjÄ…tku"
-#: ../src/gui/CReporterAssistant.py:334
+#: ../src/gui/CReporterAssistant.py:277
+#: ../src/gui/PluginsSettingsDialog.py:136
+#, python-format
+msgid ""
+"Cannot save plugin settings:\n"
+" %s"
+msgstr ""
+"Nie można zapisać ustawień wtyczki:\n"
+" %s"
+
+#: ../src/gui/CReporterAssistant.py:307
+#, python-format
+msgid "Configure %s options"
+msgstr "Skonfiguruj opcje %s"
+
+#: ../src/gui/CReporterAssistant.py:362
#, python-format
msgid "Rating is %s"
msgstr "Ocena wynosi %s"
-#: ../src/gui/CReporterAssistant.py:337
+#: ../src/gui/CReporterAssistant.py:365
msgid "Crashdump doesn't have rating => we suppose it's not required"
msgstr "Zrzut pamięci nie posiada oceny => prawdopodobnie nie jest wymagana"
-#: ../src/gui/CReporterAssistant.py:350
+#: ../src/gui/CReporterAssistant.py:370 ../src/gui/CReporterAssistant.py:398
+msgid ""
+"The backtrace is incomplete, please make sure you provide the steps to "
+"reproduce."
+msgstr ""
+"Wyjątek jest niepełny. Proszę upewnić się, że podano właściwe kroki "
+"ponownego wywołania awarii."
+
+#: ../src/gui/CReporterAssistant.py:378
msgid "You should check the backtrace for sensitive data."
msgstr "Należy sprawdzić, czy wyjątek zawiera prywatne dane."
-#: ../src/gui/CReporterAssistant.py:351
+#: ../src/gui/CReporterAssistant.py:379
msgid "You must agree with sending the backtrace."
msgstr "Należy wyrazić zgodę na wysłanie wyjątku."
-#: ../src/gui/CReporterAssistant.py:366
+#: ../src/gui/CReporterAssistant.py:392
+#, python-format
+msgid ""
+"Reporting disabled because the backtrace is unusable.\n"
+"Please try to install debuginfo manually using the command: <b>debuginfo-"
+"install %s</b> \n"
+"then use the Refresh button to regenerate the backtrace."
+msgstr ""
+"Zgłaszanie zostało wyłączone, ponieważ nie można użyć tego wyjątku.\n"
+"Proszę spróbować ręcznie zainstalować pakiet debuginfo używając polecenia: "
+"<b>debuginfo-install %s</b>, \n"
+"a następnie nacisnąć przycisk Odśwież, aby ponownie utworzyć wyjątek."
+
+#: ../src/gui/CReporterAssistant.py:394
msgid "Reporting disabled because the backtrace is unusable."
msgstr "Zgłaszanie jest wyłączone, ponieważ nie można użyć wyjątku."
-#: ../src/gui/CReporterAssistant.py:412
+#: ../src/gui/CReporterAssistant.py:440
msgid "You did not provide any steps to reproduce."
msgstr "Nie podano, jak powtórzyć awarię."
-#: ../src/gui/CReporterAssistant.py:426
+#: ../src/gui/CReporterAssistant.py:454
msgid "You did not provide any comments."
msgstr "Nie podano żadnych komentarzy."
-#: ../src/gui/CReporterAssistant.py:507
+#: ../src/gui/CReporterAssistant.py:483
+#, python-format
+msgid ""
+"Reporting failed!\n"
+"%s"
+msgstr ""
+"Zgłoszenie nie powiodło się.\n"
+"%s"
+
+#: ../src/gui/CReporterAssistant.py:535
#, python-format
msgid ""
"It looks like an application from the package <b>%s</b> has crashed on your "
@@ -820,15 +797,15 @@ msgstr ""
"Proszę wybrać, gdzie zgłosić błąd i nacisnąć przycisk \"Dalej\", aby "
"kontynuować."
-#: ../src/gui/CReporterAssistant.py:548
+#: ../src/gui/CReporterAssistant.py:576
msgid "Only one reporter plugin is configured."
msgstr "Skonfigurowana jest tylko jedna wtyczka zgłaszania."
-#: ../src/gui/CReporterAssistant.py:554
+#: ../src/gui/CReporterAssistant.py:582
msgid "Send a bug report"
msgstr "Wyślij zgłoszenie błędu"
-#: ../src/gui/CReporterAssistant.py:592
+#: ../src/gui/CReporterAssistant.py:620
msgid ""
"Below is the backtrace associated with your crash. A crash backtrace "
"provides developers with details about how the crash happened, helping them "
@@ -843,134 +820,147 @@ msgstr ""
"Proszę przejrzeć wyjątek znajdujący się poniżej i zmodyfikować go, aby "
"upewnić się, że zgłoszenie błędu nie zawiera prywatnych informacji:"
-#: ../src/gui/CReporterAssistant.py:663 ../src/gui/CReporterAssistant.py:676
-#: ../src/gui/CReporterAssistant.py:710
+#: ../src/gui/CReporterAssistant.py:691 ../src/gui/CReporterAssistant.py:704
+#: ../src/gui/CReporterAssistant.py:738
#, python-format
msgid "Found %i occurence(s) [at: %i of %i]"
msgstr "Odnaleziono %i wystąpień [w: %i z %i]"
-#: ../src/gui/CReporterAssistant.py:747
+#: ../src/gui/CReporterAssistant.py:775
msgid "Search:"
msgstr "Wyszukiwanie:"
-#: ../src/gui/CReporterAssistant.py:778
+#: ../src/gui/CReporterAssistant.py:806
msgid "Refresh"
msgstr "Odśwież"
-#: ../src/gui/CReporterAssistant.py:780
+#: ../src/gui/CReporterAssistant.py:808
msgid "Copy"
msgstr "Skopiuj"
-#: ../src/gui/CReporterAssistant.py:786
+#: ../src/gui/CReporterAssistant.py:814
msgid "I agree with submitting the backtrace"
msgstr "Zgadzam się na wysłanie wyjątku"
-#: ../src/gui/CReporterAssistant.py:791
+#: ../src/gui/CReporterAssistant.py:819
msgid "Approve the backtrace"
msgstr "AkceptujÄ™ wyjÄ…tek"
-#: ../src/gui/CReporterAssistant.py:834
+#: ../src/gui/CReporterAssistant.py:862
msgid "You need to fill the how to before you can proceed..."
msgstr "Należy wypełnić sekcję opisu awarii, aby kontynuować."
-#: ../src/gui/CReporterAssistant.py:857
+#: ../src/gui/CReporterAssistant.py:885
msgid "How did this crash happen (step-by-step)? How would you reproduce it?"
msgstr ""
"Jak wydarzyła się ta awaria i jak można ją powtórzyć, opisane krok po kroku "
"(w języku angielskim)."
-#: ../src/gui/CReporterAssistant.py:877
+#: ../src/gui/CReporterAssistant.py:905
msgid ""
"Are there any comments you would like to share with the software maintainers?"
msgstr "Komentarze dla opiekunów oprogramowania (w języku angielskim)."
-#: ../src/gui/CReporterAssistant.py:897
+#: ../src/gui/CReporterAssistant.py:925
msgid "Provide additional details"
msgstr "Podanie dodatkowych informacji"
-#: ../src/gui/CReporterAssistant.py:904
+#: ../src/gui/CReporterAssistant.py:932
msgid ""
"<b>Tip:</b> Your comments are not private. Please watch what you say "
"accordingly."
msgstr "<b>Wskazówka:</b> komentarze będą dostępne publicznie."
-#: ../src/gui/CReporterAssistant.py:945
+#: ../src/gui/CReporterAssistant.py:973
msgid "Confirm and send the report"
msgstr "Potwierdź i wyślij zgłoszenie"
-#: ../src/gui/CReporterAssistant.py:947
+#: ../src/gui/CReporterAssistant.py:975
msgid ""
"Below is a summary of your bug report. Please click 'Apply' to submit it."
msgstr ""
"Poniżej znajduje się zgłoszenie błędu. Proszę nacisnąć przycisk \"Zastosuj"
"\", aby je wysłać."
-#: ../src/gui/CReporterAssistant.py:952
+#: ../src/gui/CReporterAssistant.py:980
msgid "<b>Basic details</b>"
msgstr "<b>Podstawowe informacje</b>"
#. left table
-#: ../src/gui/CReporterAssistant.py:959
+#: ../src/gui/CReporterAssistant.py:987
msgid "Component"
msgstr "Składnik"
-#: ../src/gui/CReporterAssistant.py:960
+#: ../src/gui/CReporterAssistant.py:988
msgid "Package"
msgstr "Pakiet"
-#: ../src/gui/CReporterAssistant.py:961
+#: ../src/gui/CReporterAssistant.py:989
msgid "Executable"
msgstr "Plik wykonywalny"
-#: ../src/gui/CReporterAssistant.py:962
+#: ../src/gui/CReporterAssistant.py:990
msgid "Cmdline"
msgstr "Wiersz poleceń"
#. right table
-#: ../src/gui/CReporterAssistant.py:964
+#: ../src/gui/CReporterAssistant.py:992
msgid "Architecture"
msgstr "Architektura"
-#: ../src/gui/CReporterAssistant.py:965
+#: ../src/gui/CReporterAssistant.py:993
msgid "Kernel"
msgstr "JÄ…dro"
-#: ../src/gui/CReporterAssistant.py:966
+#: ../src/gui/CReporterAssistant.py:994
msgid "Release"
msgstr "Wydanie"
-#: ../src/gui/CReporterAssistant.py:967
+#: ../src/gui/CReporterAssistant.py:995
msgid "Reason"
msgstr "Przyczyna"
-#: ../src/gui/CReporterAssistant.py:978 ../src/gui/report.glade.h:3
+#: ../src/gui/CReporterAssistant.py:1006 ../src/gui/report.glade.h:3
msgid "<b>Backtrace</b>"
msgstr "<b>WyjÄ…tek</b>"
-#: ../src/gui/CReporterAssistant.py:981
+#: ../src/gui/CReporterAssistant.py:1009
msgid "Click to view..."
msgstr "Kliknięcie wyświetli..."
-#: ../src/gui/CReporterAssistant.py:993
+#: ../src/gui/CReporterAssistant.py:1021
msgid "<b>Steps to reproduce:</b>"
msgstr "<b>Jak powtórzyć awarię (w języku angielskim):</b>"
-#: ../src/gui/CReporterAssistant.py:1014
+#: ../src/gui/CReporterAssistant.py:1042
msgid "<b>Comments:</b>"
msgstr "<b>Komentarze (w języku angielskim):</b>"
-#: ../src/gui/CReporterAssistant.py:1017
+#: ../src/gui/CReporterAssistant.py:1045
msgid "No comment provided!"
msgstr "Nie podano żadnego komentarza."
-#: ../src/gui/CReporterAssistant.py:1053
+#: ../src/gui/CReporterAssistant.py:1081
msgid "Finished sending the bug report"
msgstr "Ukończono wysyłanie zgłoszenia błędu"
-#: ../src/gui/CReporterAssistant.py:1057
+#: ../src/gui/CReporterAssistant.py:1085
msgid "<b>Bug reports:</b>"
msgstr "<b>Zgłoszenia błędów:</b>"
+#: ../src/gui/CReporterAssistant.py:1102
+msgid ""
+"Unable to get report!\n"
+"Is debuginfo missing?"
+msgstr ""
+"Nie można uzyskać zgłoszenia.\n"
+"Brak pakietów debuginfo?"
+
+#: ../src/gui/CReporterAssistant.py:1139
+#, python-format
+msgid "Error acquiring the report: %s"
+msgstr "Błąd podczas uzyskiwania zgłoszenia: %s"
+
#: ../src/gui/dialogs.glade.h:1
msgid "Log"
msgstr "Dziennik"
@@ -1239,27 +1229,27 @@ msgstr ""
"naprawić ją przed kontynuowaniem. W innym przypadku proces zgłoszenia się "
"nie powiedzie.\n"
-#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.cpp:47
+#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.c:45
#, c-format
msgid "Uploaded: %llu of %llu kbytes"
msgstr "Wysłano: %llu z %llu kilobajtów"
-#: ../src/lib/parse_options.c:11
+#: ../src/lib/parse_options.c:29
#, c-format
msgid "Usage: %s\n"
msgstr "Użycie: %s\n"
-#: ../src/plugins/abrt-action-analyze-c.c:154
+#: ../src/plugins/abrt-action-analyze-c.c:156
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID of coredumps"
msgstr ""
-" [-vs] -d KAT\n"
+" [-v] -d KAT\n"
"\n"
"Oblicza i zapisuje UUID zrzutów core"
-#: ../src/plugins/abrt-action-analyze-oops.c:131
+#: ../src/plugins/abrt-action-analyze-oops.c:133
msgid ""
" [-vs] -d DIR\n"
"\n"
@@ -1269,87 +1259,110 @@ msgstr ""
"\n"
"Oblicza i zapisuje UUID oraz SUMĘ_DUPLIKATU zrzutów core awarii jądra"
-#: ../src/plugins/abrt-action-analyze-python.c:36
+#: ../src/plugins/abrt-action-analyze-python.c:38
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of python crash dumps"
msgstr ""
-" [-vs] -d KAT\n"
+" [-v] -d KAT\n"
"\n"
-"Oblicza i zapisuje UUID oraz SUMĘ_DUPLIKATU zrzutów core języka Python"
+"Oblicza i zapisuje UUID oraz SUMĘ_DUPLIKATU zrzutów awarii języka Python"
-#: ../src/plugins/abrt-action-bugzilla.cpp:532
+#: ../src/plugins/abrt-action-bugzilla.cpp:534
#, c-format
msgid "New bug id: %i"
msgstr "Identyfikator nowego błędu: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:645
-#, c-format
-msgid "Can't open '%s'"
-msgstr "Nie można otworzyć \"%s\""
-
-#: ../src/plugins/abrt-action-bugzilla.cpp:665
+#: ../src/plugins/abrt-action-bugzilla.cpp:662
#, c-format
msgid "Empty login or password, please check %s"
msgstr "Pusty login lub hasło, proszę sprawdzić %s"
-#: ../src/plugins/abrt-action-bugzilla.cpp:683
+#: ../src/plugins/abrt-action-bugzilla.cpp:680
msgid "Logging into bugzilla..."
msgstr "Logowanie do Bugzilli..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:686
+#: ../src/plugins/abrt-action-bugzilla.cpp:683
msgid "Checking for duplicates..."
msgstr "Sprawdzanie duplikatów..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:707
-#: ../src/plugins/abrt-action-bugzilla.cpp:743
+#: ../src/plugins/abrt-action-bugzilla.cpp:705
+#: ../src/plugins/abrt-action-bugzilla.cpp:741
msgid "Missing mandatory member 'bugs'"
msgstr "Brak obowiÄ…zkowego elementu \"bugs\""
-#: ../src/plugins/abrt-action-bugzilla.cpp:726
-#: ../src/plugins/abrt-action-bugzilla.cpp:759
-#: ../src/plugins/abrt-action-bugzilla.cpp:834
+#: ../src/plugins/abrt-action-bugzilla.cpp:724
+#: ../src/plugins/abrt-action-bugzilla.cpp:757
+#: ../src/plugins/abrt-action-bugzilla.cpp:833
msgid "get_bug_info() failed. Could not collect all mandatory information"
msgstr ""
"get_bug_info() nie powiodło się. Nie można zebrać wszystkich obowiązkowych "
"informacji"
-#: ../src/plugins/abrt-action-bugzilla.cpp:775
+#: ../src/plugins/abrt-action-bugzilla.cpp:772
msgid "Creating a new bug..."
msgstr "Tworzenie nowego błędu..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:780
+#: ../src/plugins/abrt-action-bugzilla.cpp:777
msgid "Bugzilla entry creation failed"
msgstr "Utworzenie wpisu w Bugzilli nie powiodło się"
-#: ../src/plugins/abrt-action-bugzilla.cpp:790
-#: ../src/plugins/abrt-action-bugzilla.cpp:887
+#: ../src/plugins/abrt-action-bugzilla.cpp:789
+#: ../src/plugins/abrt-action-bugzilla.cpp:886
msgid "Logging out..."
msgstr "Wylogowywanie..."
#. decision based on state
-#: ../src/plugins/abrt-action-bugzilla.cpp:808
+#: ../src/plugins/abrt-action-bugzilla.cpp:807
#, c-format
msgid "Bug is already reported: %i"
msgstr "Błąd został już zgłoszony: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:819
+#: ../src/plugins/abrt-action-bugzilla.cpp:818
#, c-format
msgid "Bugzilla couldn't find parent of bug %d"
msgstr "Bugzilla nie może odnaleźć nadrzędnego błędu %d"
-#: ../src/plugins/abrt-action-bugzilla.cpp:848
+#: ../src/plugins/abrt-action-bugzilla.cpp:847
#, c-format
msgid "Add %s to CC list"
msgstr "Dodanie %s do listy CC"
-#: ../src/plugins/abrt-action-bugzilla.cpp:872
+#: ../src/plugins/abrt-action-bugzilla.cpp:871
#, c-format
msgid "Adding new comment to bug %d"
msgstr "Dodawanie nowego komentarza do błędu %d"
-#: ../src/plugins/abrt-action-generate-backtrace.c:319
+#: ../src/plugins/abrt-action-bugzilla.cpp:913
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to Bugzilla"
+msgstr ""
+" [-vs] -c PLIK_KONFIDURACJI -d KAT\n"
+"\n"
+"Zgłasza awarię w Bugzilli"
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:928
+#: ../src/plugins/abrt-action-kerneloops.c:148
+#: ../src/plugins/abrt-action-rhtsupport.c:282
+msgid "Configuration file (may be given many times)"
+msgstr "Plik konfiguracji (może być podawany wiele razy)"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:258
+msgid " [options] -d DIR"
+msgstr " [opcje] -d KAT"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:271
+msgid "Additional debuginfo directories"
+msgstr "Dodatkowe katalogi debuginfo"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:272
+msgid "Kill gdb if it runs for more than N seconds"
+msgstr "Kończy działanie GDB, jeśli jest uruchomione dłużej niż N sekund"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:320
#, c-format
msgid "Backtrace parsing failed for %s"
msgstr "Przetworzenie wyjątku nie powiodło się dla %s"
@@ -1443,8 +1456,8 @@ msgstr "Kończenie działania na polecenie użytkownika"
#, python-format
msgid "Usage: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
msgstr ""
-"Użycie: %s --core=<PLIK_CORE> --tmpdir=<KAT_TYMCZASOWY> "
-"--cachedir=<KAT_PAMIĘCI_PODRĘCZNEJ>"
+"Użycie: %s --core=<PLIK_CORE> --tmpdir=<KAT_TYMCZASOWY> --"
+"cachedir=<KAT_PAMIĘCI_PODRĘCZNEJ>"
#: ../src/plugins/abrt-action-install-debuginfo.py:442
msgid "You have to specify the path to coredump."
@@ -1466,16 +1479,26 @@ msgstr "Wszystkie pakiety debuginfo są dostępne"
msgid "Complete!"
msgstr "Ukończono."
-#: ../src/plugins/abrt-action-kerneloops.cpp:111
+#: ../src/plugins/abrt-action-kerneloops.c:105
#, c-format
msgid "Submitting oops report to %s"
msgstr "Wysyłanie zgłoszenia awarii jądra do %s"
-#: ../src/plugins/abrt-action-mailx.cpp:114
+#: ../src/plugins/abrt-action-kerneloops.c:133
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a kernel oops to kerneloops.org (or similar) site"
+msgstr ""
+" [-vs] -c PLIK_KONFIGURACJI -d KAT\n"
+"\n"
+"Zgłasza awarię jądra w witrynie kerneloops.org (lub podobnej)"
+
+#: ../src/plugins/abrt-action-mailx.c:110
msgid "Sending an email..."
msgstr "Wysłanie wiadomości e-mail..."
-#: ../src/plugins/abrt-action-mailx.cpp:138
+#: ../src/plugins/abrt-action-mailx.c:137
msgid ""
" [-v] -d DIR [-c CONFFILE]\n"
"\n"
@@ -1485,12 +1508,12 @@ msgstr ""
"\n"
"Wysyła skompresowane archiwum tar zrzutu awarii"
-#: ../src/plugins/abrt-action-mailx.cpp:151
-#: ../src/plugins/abrt-action-upload.cpp:267
+#: ../src/plugins/abrt-action-mailx.c:150
+#: ../src/plugins/abrt-action-upload.c:262
msgid "Config file"
msgstr "Plik konfiguracji"
-#: ../src/plugins/abrt-action-print.cpp:39
+#: ../src/plugins/abrt-action-print.c:38
msgid ""
" [-v] [-o FILE] -d DIR\n"
"\n"
@@ -1500,16 +1523,16 @@ msgstr ""
"\n"
"Wyświetla informacje o awarii w standardowym wyjściu"
-#: ../src/plugins/abrt-action-print.cpp:51
+#: ../src/plugins/abrt-action-print.c:51
msgid "Output file"
msgstr "Plik wyjściowy"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was appended to %s"
msgstr "Zgłoszenie zostało dodane do %s"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was stored to %s"
msgstr "Zgłoszenie zostało przechowane w %s"
@@ -1517,36 +1540,46 @@ msgstr "Zgłoszenie zostało przechowane w %s"
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
#. error msg is already logged by dd_opendir
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
-#: ../src/plugins/abrt-action-rhtsupport.cpp:43
-#: ../src/plugins/abrt-action-upload.cpp:121
+#: ../src/plugins/abrt-action-rhtsupport.c:41
+#: ../src/plugins/abrt-action-upload.c:119
msgid "Compressing data"
msgstr "Kompresowanie danych"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:78
+#: ../src/plugins/abrt-action-rhtsupport.c:73
msgid "Empty login or password, please check RHTSupport.conf"
msgstr "Pusty login lub hasło, proszę sprawdzić plik RHTSupport.conf"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:194
+#: ../src/plugins/abrt-action-rhtsupport.c:192
msgid "Creating a new case..."
msgstr "Dodawanie nowego przypadku..."
-#: ../src/plugins/abrt-action-upload.cpp:65
+#: ../src/plugins/abrt-action-rhtsupport.c:267
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to RHTSupport"
+msgstr ""
+" [-vs] -c PLIK_KONFIGURACJI -d KAT\n"
+"\n"
+"Zgłasza awarię w RHTSupport"
+
+#: ../src/plugins/abrt-action-upload.c:63
#, c-format
msgid "Sending %s to %s"
msgstr "Wysyłanie %s do %s"
#. This ends up a "reporting status message" in abrtd
-#: ../src/plugins/abrt-action-upload.cpp:98
+#: ../src/plugins/abrt-action-upload.c:96
#, c-format
msgid "Successfully sent %s to %s"
msgstr "Pomyślnie wysłano %s do %s"
-#: ../src/plugins/abrt-action-upload.cpp:219
+#: ../src/plugins/abrt-action-upload.c:213
#, c-format
msgid "Archive is created: '%s'"
msgstr "Utworzono archiwum: \"%s\""
-#: ../src/plugins/abrt-action-upload.cpp:253
+#: ../src/plugins/abrt-action-upload.c:248
msgid ""
" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
"\n"
@@ -1556,10 +1589,36 @@ msgstr ""
"\n"
"Wysyła skompresowane archiwum tar zrzutu awarii"
-#: ../src/plugins/abrt-action-upload.cpp:268
+#: ../src/plugins/abrt-action-upload.c:263
msgid "Base URL to upload to"
msgstr "Podstawowy adres URL, do którego wysłać"
+#: ../src/plugins/abrt-dump-oops.c:540
+msgid ""
+" [-vsrdow] FILE\n"
+"\n"
+"Extract oops from syslog/dmesg file"
+msgstr ""
+" [-vsrdow] PLIK\n"
+"\n"
+"Wydobywa awarie z pliku syslog/dmesg"
+
+#: ../src/plugins/abrt-dump-oops.c:556
+msgid "Parse kernel's message buffer before parsing FILE"
+msgstr "Przetwarza bufor komunikatów jądra przed przetworzeniem PLIKU"
+
+#: ../src/plugins/abrt-dump-oops.c:557
+msgid "Create ABRT dump for every oops found"
+msgstr "Tworzy zrzut ABRT dla każdej odnalezionej awarii"
+
+#: ../src/plugins/abrt-dump-oops.c:558
+msgid "Print found oopses on standard output"
+msgstr "Wyświetla odnalezione awarie w standardowym wyjściu"
+
+#: ../src/plugins/abrt-dump-oops.c:559
+msgid "Do not exit, watch the file for new oopses"
+msgstr "Bez kończenia działania, obserwuje pliki pod kątem nowych awarii"
+
#: ../src/plugins/Bugzilla.glade.h:1
msgid "<b>Bugzilla plugin configuration</b>"
msgstr "<b>Konfiguracja wtyczki Bugzilli</b>"
@@ -1596,10 +1655,6 @@ msgstr ""
"Można je utworzyć pod <a href=\"https://bugzilla.redhat.com/createaccount.cgi"
"\">tym adresem</a>"
-#: ../src/plugins/CCpp.cpp:277
-msgid "Analyzes crashes in C/C++ programs"
-msgstr "Analizuje awarie w programach w językach C/C++"
-
#: ../src/plugins/KerneloopsReporter.glade.h:1
msgid "<b>Kerneloops Reporter plugin configuration</b>"
msgstr "<b>Konfiguracja wtyczki zgłaszania kerneloops</b>"
@@ -1608,10 +1663,6 @@ msgstr "<b>Konfiguracja wtyczki zgłaszania kerneloops</b>"
msgid "Submit URL:"
msgstr "Adres URL zgłaszania:"
-#: ../src/plugins/KerneloopsScanner.cpp:227
-msgid "Periodically scans for and saves kernel oopses"
-msgstr "Okresowo skanuje i zapisuje awarie jÄ…dra"
-
#: ../src/plugins/Logger.glade.h:1
msgid "<b>Logger plugin configuration</b>"
msgstr "<b>Konfiguracja wtyczki dziennika</b>"
diff --git a/po/pt_BR.po b/po/pt_BR.po
index bacfc036..dc5d0614 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -4,23 +4,23 @@
#
# Igor Pires Soares <igor@projetofedora.org>, 2009.
# Glaucia Cintra <gcintra@redhat.com>, 2009, 2010.
-# Taylon <taylon@taylon.eti.br>, 2010.
+# Taylon <taylon@taylon.eti.br>, 2010, 2011.
msgid ""
msgstr ""
"Project-Id-Version: abrt.master.pt_BR\n"
"Report-Msgid-Bugs-To: jmoskovc@redhat.com\n"
-"POT-Creation-Date: 2010-11-29 13:51+0100\n"
-"PO-Revision-Date: 2010-10-06 09:12-0300\n"
-"Last-Translator: Taylon <taylon@taylon.eti.br>\n"
+"POT-Creation-Date: 2011-02-17 02:58+0000\n"
+"PO-Revision-Date: 2011-02-17 23:06-0200\n"
+"Last-Translator: \n"
"Language-Team: Brazilian Portuguese <trans-pt_br@lists.fedoraproject.org>\n"
-"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Language: pt\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Poedit-Language: Portuguese\n"
"X-Poedit-Country: BRAZIL\n"
-"X-Generator: KBabel 1.11.4\n"
+"X-Generator: Lokalize 1.1\n"
#: ../src/applet/abrt-applet.desktop.in.h:1
msgid "ABRT notification applet"
@@ -32,16 +32,16 @@ msgstr "miniaplicativo de notificação do ABRT"
msgid "Automatic Bug Reporting Tool"
msgstr "Ferramenta para o relato automático de erros"
-#: ../src/applet/Applet.cpp:86
+#: ../src/applet/applet.c:85
#, c-format
msgid "A crash in the %s package has been detected"
msgstr "Um travamento no pacote %s foi detectado "
-#: ../src/applet/Applet.cpp:88
+#: ../src/applet/applet.c:87
msgid "A crash has been detected"
msgstr "Um travamento foi detectado"
-#: ../src/applet/Applet.cpp:285
+#: ../src/applet/applet.c:284
msgid "ABRT service is not running"
msgstr "O serviço do ABRT não está em execução"
@@ -57,7 +57,7 @@ msgstr ""
"O mini aplicativo da área de notificação para notificar o usuário sobre os "
"problemas detectados pelo ABRT "
-#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:23
+#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:24
msgid "translator-credits"
msgstr ""
"Glaucia Cintra\n"
@@ -67,7 +67,7 @@ msgstr ""
msgid "Hide"
msgstr "Esconder"
-#: ../src/applet/applet_gtk.c:360 ../src/gui/ccgui.glade.h:13
+#: ../src/applet/applet_gtk.c:360 ../src/gui/ccgui.glade.h:14
msgid "Report"
msgstr "Relatar"
@@ -75,7 +75,7 @@ msgstr "Relatar"
msgid "Open ABRT"
msgstr "Abrir ABRT"
-#: ../src/cli/CLI.cpp:47
+#: ../src/cli/CLI.cpp:90
#, fuzzy, c-format
msgid ""
"\tCrash dump : %s\n"
@@ -92,12 +92,12 @@ msgstr ""
"\tCrash Time : %s\n"
"\tCrash Count: %s\n"
-#: ../src/cli/CLI.cpp:65
+#: ../src/cli/CLI.cpp:109
#, c-format
msgid "\tHostname : %s\n"
msgstr "\tHostname : %s\n"
-#: ../src/cli/CLI.cpp:98
+#: ../src/cli/CLI.cpp:142
#, fuzzy, c-format
msgid ""
"Dump directory: %s\n"
@@ -120,27 +120,27 @@ msgstr ""
"Sistema: %s, kernel %s\n"
"Razão: %s\n"
-#: ../src/cli/CLI.cpp:125
+#: ../src/cli/CLI.cpp:170
#, c-format
msgid "Coredump file: %s\n"
msgstr "Arquivo de travamento %s\n"
-#: ../src/cli/CLI.cpp:129
+#: ../src/cli/CLI.cpp:174
#, c-format
msgid "Rating: %s\n"
msgstr "Avaliação: %s\n"
-#: ../src/cli/CLI.cpp:134
+#: ../src/cli/CLI.cpp:179
#, c-format
msgid "Crash function: %s\n"
msgstr "Função de travamento %s\n"
-#: ../src/cli/CLI.cpp:138
+#: ../src/cli/CLI.cpp:183
#, c-format
msgid "Hostname: %s\n"
msgstr "Hostname: %s\n"
-#: ../src/cli/CLI.cpp:142
+#: ../src/cli/CLI.cpp:187
#, c-format
msgid ""
"\n"
@@ -151,7 +151,7 @@ msgstr ""
"#Como reproduzir:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:146
+#: ../src/cli/CLI.cpp:191
#, c-format
msgid ""
"\n"
@@ -162,7 +162,7 @@ msgstr ""
"Comentário:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:152
+#: ../src/cli/CLI.cpp:197
#, c-format
msgid ""
"\n"
@@ -173,70 +173,47 @@ msgstr ""
"Backtrace:\n"
"%s\n"
-#. Message has embedded tabs.
-#: ../src/cli/CLI.cpp:243
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:295
+#, c-format
msgid ""
-"Usage: %s [OPTION]\n"
-"\n"
-"Startup:\n"
-"\t-V, --version\t\tdisplay the version of %s and exit\n"
-"\t-?, --help\t\tprint this help\n"
+"Usage: %s -l[f] [-D BASE_DIR]...]\n"
+" or: %s -r[y] CRASH_DIR\n"
+" or: %s -i[b] CRASH_DIR\n"
+" or: %s -d CRASH_DIR\n"
"\n"
-"Actions:\n"
-"\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
-"\t -f, --full\tprint a list of all crashes, including the already "
-"reported ones\n"
-"\t-r, --report CRASH_ID\tcreate and send a report\n"
-"\t -y, --always\tcreate and send a report without asking\n"
-"\t-d, --delete CRASH_ID\tremove a crash\n"
-"\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
-"\t -b, --backtrace\tprint detailed information about a crash including "
-"backtrace\n"
-"CRASH_ID can be:\n"
-"\ta name of dump directory, or\n"
-"\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
-msgstr ""
-"Usage: %s [OPTION]\n"
+"\t-l, --list\t\tList not yet reported crashes\n"
+"\t -f, --full\t\tList all crashes\n"
+"\t-D BASE_DIR\t\tDirectory to list crashes from\n"
+"\t\t\t\t(default: -D $HOME/.abrt/spool -D %s)\n"
"\n"
-"Inicialização:\n"
-"\t-V, --version\t\texibe a versão do %s e sai\n"
-"\t-?, --help\t\timprime esta ajuda\n"
+"\t-r, --report\t\tSend a report about CRASH_DIR\n"
+"\t -y, --always\t\t...without editing and asking\n"
+"\t-i, --info\t\tPrint detailed information about CRASH_DIR\n"
+"\t -b, --backtrace\t...including backtrace\n"
+"\t-d, --delete\t\tRemove CRASH_DIR\n"
"\n"
-"Ações:\n"
-"\t-l, --list\t\timprime uma lista de todos os travamentos que não são "
-"reportados ainda\n"
-"\t -f, --full\timprime uma lista de todos os travamentos, incluindo os "
-"que já foram reportados\n"
-"\t-r, --report CRASH_ID\tcria e envia um relatório\n"
-"\t -y, --always\tcria e envia um relatório sem perguntar\n"
-"\t-d, --delete CRASH_ID\tremove um travamento\n"
-"\t-i, --info CRASH_ID\timprime informação detalhada sobre o travamento\n"
-"\t -b, --backtrace\timprime informação detalhada sobre o travamento "
-"incluindo o backtrace\n"
-"CRASH_ID pode ser:\n"
-"\tUID:UUID par,\n"
-"\tunique UUID prefixo - o travamento com o UUID conincidente será acionado\n"
-"\t@N - N'th crash (como exibido por --list --full) será acionado\n"
-
-#: ../src/cli/CLI.cpp:287
+"\t-V, --version\t\tDisplay version and exit\n"
+"\t-v, --verbose\t\tBe verbose\n"
+msgstr ""
+
+#: ../src/cli/CLI.cpp:343
msgid "You must specify exactly one operation"
msgstr "Você precisa especificar exatamente uma operação"
-#: ../src/cli/report.cpp:166
+#: ../src/cli/report.cpp:154
#, c-format
msgid "# This field is read only\n"
msgstr "#Este campo é somente leitura\n"
-#: ../src/cli/report.cpp:186
+#: ../src/cli/report.cpp:174
msgid "# Describe the circumstances of this crash below"
msgstr "#Descreva as circunstâncias deste travamento abaixo"
-#: ../src/cli/report.cpp:188
+#: ../src/cli/report.cpp:176
msgid "# How to reproduce the crash?"
msgstr "#Como reproduzir o travamento?"
-#: ../src/cli/report.cpp:190
+#: ../src/cli/report.cpp:178
msgid ""
"# Backtrace\n"
"# Check that it does not contain any sensitive data (passwords, etc.)"
@@ -244,48 +221,48 @@ msgstr ""
"# Backtrace\n"
"# Verificar se não contém algum dado sensível (senhas, etc)"
-#: ../src/cli/report.cpp:192
+#: ../src/cli/report.cpp:180
msgid "# Architecture"
msgstr "#Arquitetura"
-#: ../src/cli/report.cpp:193
+#: ../src/cli/report.cpp:181
msgid "# Command line"
msgstr "# Linha de Comando"
-#: ../src/cli/report.cpp:194
+#: ../src/cli/report.cpp:182
msgid "# Component"
msgstr "#Componente"
-#: ../src/cli/report.cpp:195
+#: ../src/cli/report.cpp:183
msgid "# Core dump"
msgstr "#Despejo de Núcleo"
-#: ../src/cli/report.cpp:196
+#: ../src/cli/report.cpp:184
msgid "# Executable"
msgstr "#Executável"
-#: ../src/cli/report.cpp:197
+#: ../src/cli/report.cpp:185
msgid "# Kernel version"
msgstr "#Versão do Kernel"
-#: ../src/cli/report.cpp:198
+#: ../src/cli/report.cpp:186
msgid "# Package"
msgstr "#Pacote"
-#: ../src/cli/report.cpp:199
+#: ../src/cli/report.cpp:187
msgid "# Reason of crash"
msgstr "#Razão para o travamento"
-#: ../src/cli/report.cpp:200
+#: ../src/cli/report.cpp:188
msgid "# Release string of the operating system"
msgstr "#Faixa de lançamento do sistema operacional"
-#: ../src/cli/report.cpp:323
+#: ../src/cli/report.cpp:305
msgid "Cannot run vi: $TERM, $VISUAL and $EDITOR are not set"
msgstr ""
"Não foi possível executar vi: $TERM, $VISUAL e $EDITOR não está configurado "
-#: ../src/cli/report.cpp:411
+#: ../src/cli/report.cpp:389
msgid ""
"\n"
"The report has been updated"
@@ -293,7 +270,7 @@ msgstr ""
"\n"
"Um relatório foi atualizado"
-#: ../src/cli/report.cpp:413
+#: ../src/cli/report.cpp:391
msgid ""
"\n"
"No changes were detected in the report"
@@ -302,46 +279,46 @@ msgstr ""
" Não foi detectada nenhuma mudança no relatório"
#. The response might take more than 1 char in non-latin scripts.
-#: ../src/cli/report.cpp:464
+#: ../src/cli/report.cpp:423
msgid "y"
msgstr "y"
-#: ../src/cli/report.cpp:465
+#: ../src/cli/report.cpp:424
msgid "N"
msgstr "N"
#. Read the missing information and push it to plugin settings.
-#: ../src/cli/report.cpp:565
+#: ../src/cli/report.cpp:555
#, c-format
msgid "Wrong settings were detected for plugin %s\n"
msgstr "Configurações erradas foram detectadas no plugin %s\n"
-#: ../src/cli/report.cpp:569
+#: ../src/cli/report.cpp:559
msgid "Enter your login: "
msgstr "Insira seu login:"
-#: ../src/cli/report.cpp:575
+#: ../src/cli/report.cpp:565
msgid "Enter your password: "
msgstr "Insira sua senha:"
-#: ../src/cli/report.cpp:638
+#: ../src/cli/report.cpp:775
msgid "Reporting..."
msgstr "Relatando..."
-#: ../src/cli/report.cpp:657
+#: ../src/cli/report.cpp:788
#, c-format
msgid "Report using %s?"
msgstr "Relatar utilizando o %s?"
-#: ../src/cli/report.cpp:660
+#: ../src/cli/report.cpp:791
msgid "Skipping..."
msgstr "Pulando..."
-#: ../src/cli/report.cpp:672
+#: ../src/cli/report.cpp:807
msgid "Reporting disabled because the backtrace is unusable"
msgstr "Relatório desabilitado porque o backtrace está inutilizado"
-#: ../src/cli/report.cpp:676
+#: ../src/cli/report.cpp:811
#, c-format
msgid ""
"Please try to install debuginfo manually using the command: \"debuginfo-"
@@ -350,56 +327,81 @@ msgstr ""
"Por favor, tente instalar o debuginfo manualmente usando o comando: "
"\"debuginfo-install %s\" e tente novamente\n"
-#: ../src/cli/report.cpp:685
-msgid "Error loading reporter settings"
-msgstr "Erro ao carregar as configurações do relator"
-
-#: ../src/cli/report.cpp:704
+#: ../src/cli/report.cpp:829
#, fuzzy, c-format
msgid "Crash reported via %d report events (%d errors)\n"
msgstr "Travamento reportado via %d plugins (%d erros)\n"
-#: ../src/daemon/abrt-handle-crashdump.c:42
+#: ../src/daemon/abrt-action-save-package-data.c:271
msgid ""
-" [-vs] -d DIR -e EVENT\n"
-" or: "
+" [options] -d DIR\n"
+"\n"
+"Query package database and save package name, component, and description"
msgstr ""
+" [options] -d DIR\n"
+"\n"
+"Consulta a base de dados do pacote, salva o nome do pacote, componente e a "
+"descrição"
-#: ../src/daemon/abrt-handle-crashdump.c:57
+#: ../src/daemon/abrt-action-save-package-data.c:283
+#, fuzzy
+#: ../src/daemon/abrt-handle-crashdump.c:60
#: ../src/plugins/abrt-action-analyze-c.c:167
#: ../src/plugins/abrt-action-analyze-oops.c:144
#: ../src/plugins/abrt-action-analyze-python.c:49
-#, fuzzy
+#: ../src/plugins/abrt-action-bugzilla.cpp:927
+#: ../src/plugins/abrt-action-generate-backtrace.c:270
+#: ../src/plugins/abrt-action-kerneloops.c:147
+#: ../src/plugins/abrt-action-mailx.c:149
+#: ../src/plugins/abrt-action-print.c:50
+#: ../src/plugins/abrt-action-rhtsupport.c:280
+#: ../src/plugins/abrt-action-upload.c:260
+msgid "Crash dump directory"
+msgstr "Cdump no diretóridir"
+
+#: ../src/daemon/abrt-action-save-package-data.c:284
+#: ../src/daemon/abrt-handle-crashdump.c:59 ../src/daemon/abrt-server.c:297
+#: ../src/plugins/abrt-action-bugzilla.cpp:926
+#: ../src/plugins/abrt-action-generate-backtrace.c:273
+#: ../src/plugins/abrt-action-kerneloops.c:146
+#: ../src/plugins/abrt-action-rhtsupport.c:279
+#: ../src/plugins/abrt-dump-oops.c:555
msgid "Log to syslog"
-msgstr "Registrar no syslog mesmo com o -d"
+msgstr "Log para o syslog"
-#: ../src/daemon/abrt-handle-crashdump.c:58
-#: ../src/plugins/abrt-action-analyze-c.c:166
-#: ../src/plugins/abrt-action-analyze-oops.c:143
-#: ../src/plugins/abrt-action-analyze-python.c:48
-#: ../src/plugins/abrt-action-mailx.cpp:150
-#: ../src/plugins/abrt-action-print.cpp:50
-#: ../src/plugins/abrt-action-upload.cpp:266
-msgid "Crash dump directory"
+#: ../src/daemon/abrt-handle-crashdump.c:43
+msgid ""
+" [-vs] -d DIR -e EVENT\n"
+" or: "
msgstr ""
+" [-vs] -d DIRETÓRIOS -e EVENTOS\n"
+" ou: "
-#: ../src/daemon/abrt-handle-crashdump.c:59
+#: ../src/daemon/abrt-handle-crashdump.c:61
msgid "Handle EVENT"
-msgstr ""
+msgstr "Manipular EVENTOS"
-#: ../src/daemon/abrt-handle-crashdump.c:60
+#: ../src/daemon/abrt-handle-crashdump.c:62
msgid "List possible events [which start with PFX]"
-msgstr ""
+msgstr "Lista de possiveis eventos [que iniciam com PFX]i"
+
+#: ../src/daemon/abrt-server.c:286 ../src/daemon/Daemon.cpp:542
+msgid " [options]"
+msgstr "[opções]"
-#: ../src/daemon/CommLayerServerDBus.cpp:229
+#: ../src/daemon/abrt-server.c:296
+msgid "Use UID as client uid"
+msgstr "Use UID como cliente uid"
+
+#: ../src/daemon/CommLayerServerDBus.cpp:241
msgid "Comment is too long"
msgstr "Comentário muito longo"
-#: ../src/daemon/CommLayerServerDBus.cpp:233
+#: ../src/daemon/CommLayerServerDBus.cpp:245
msgid "'How to reproduce' is too long"
msgstr "'Como reproduzir' está muito longo"
-#: ../src/daemon/Daemon.cpp:534
+#: ../src/daemon/Daemon.cpp:371
msgid ""
"The size of the report exceeded the quota. Please check system's "
"MaxCrashReportsSize value in abrt.conf."
@@ -407,19 +409,15 @@ msgstr ""
"O tamanho do relatório excedeu a cota. Por favor, verifique o valor "
"MaxCrashReportsSize do sistema no abrt.conf. "
-#: ../src/daemon/Daemon.cpp:699
-msgid "abrtd [options]"
-msgstr "abrtd [opções]"
-
-#: ../src/daemon/Daemon.cpp:709
+#: ../src/daemon/Daemon.cpp:553
msgid "Do not daemonize"
msgstr "Não criar um daemon"
-#: ../src/daemon/Daemon.cpp:710
+#: ../src/daemon/Daemon.cpp:554
msgid "Log to syslog even with -d"
msgstr "Registrar no syslog mesmo com o -d"
-#: ../src/daemon/Daemon.cpp:711
+#: ../src/daemon/Daemon.cpp:555
msgid "Exit after SEC seconds of inactivity"
msgstr "Sair depois de SEC segundos de inatividade"
@@ -458,16 +456,16 @@ msgstr "Plugins de relato"
msgid "Database plugins"
msgstr "Plugins de banco de dados"
-#: ../src/gui/CCDBusBackend.py:74 ../src/gui/CCDBusBackend.py:97
+#: ../src/gui/CCDBusBackend.py:75 ../src/gui/CCDBusBackend.py:98
msgid "Cannot connect to system dbus."
msgstr "Não foi possível conectar ao dbus do sistema "
-#: ../src/gui/CCDBusBackend.py:120 ../src/gui/CCDBusBackend.py:123
+#: ../src/gui/CCDBusBackend.py:121 ../src/gui/CCDBusBackend.py:124
msgid "Please check if the abrt daemon is running."
msgstr "Por favor, verifique se o daemon do abrt está em execução "
#. FIXME: BUG: BarWindow remains. (how2reproduce: delete "component" in a dump dir and try to report it)
-#: ../src/gui/CCDBusBackend.py:169
+#: ../src/gui/CCDBusBackend.py:170
msgid ""
"Daemon did not return a valid report info.\n"
"Is debuginfo missing?"
@@ -515,11 +513,15 @@ msgstr "Sobre o ABRT"
msgid "Copy to Clipboard"
msgstr "Copiar para Ãrea de Transferência"
-#: ../src/gui/ccgui.glade.h:12 ../src/gui/settings.glade.h:19
+#: ../src/gui/ccgui.glade.h:12
+msgid "Online _Help"
+msgstr "Ajuda Online"
+
+#: ../src/gui/ccgui.glade.h:13 ../src/gui/settings.glade.h:12
msgid "Plugins"
msgstr "Plugins"
-#: ../src/gui/ccgui.glade.h:14
+#: ../src/gui/ccgui.glade.h:15
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 "
@@ -547,19 +549,19 @@ msgstr ""
"Você deve ter recebido uma cópia da GNU General Public License (GPL) junto "
"com este programa. Se não, acesse <http://www.gnu.org/licenses/>."
-#: ../src/gui/ccgui.glade.h:19 ../src/gui/CReporterAssistant.py:71
+#: ../src/gui/ccgui.glade.h:20 ../src/gui/CReporterAssistant.py:111
msgid "View log"
msgstr "Visualizar log"
-#: ../src/gui/ccgui.glade.h:20
+#: ../src/gui/ccgui.glade.h:21
msgid "_Edit"
msgstr "_Editar"
-#: ../src/gui/ccgui.glade.h:21
+#: ../src/gui/ccgui.glade.h:22
msgid "_File"
msgstr "_Arquivo"
-#: ../src/gui/ccgui.glade.h:22
+#: ../src/gui/ccgui.glade.h:23
msgid "_Help"
msgstr "Aj_uda"
@@ -580,7 +582,7 @@ msgstr "Hostname"
msgid "Latest Crash"
msgstr "Último Travamento"
-#: ../src/gui/CCMainWindow.py:143
+#: ../src/gui/CCMainWindow.py:148
#, python-format
msgid ""
"Cannot show the settings dialog.\n"
@@ -589,7 +591,7 @@ msgstr ""
"Não foi possível mostrar o diálogo de configurações\n"
"%s "
-#: ../src/gui/CCMainWindow.py:148
+#: ../src/gui/CCMainWindow.py:153
#, python-format
msgid ""
"Unable to finish the current task!\n"
@@ -599,7 +601,7 @@ msgstr ""
"%s "
#. there is something wrong with the daemon if we cant get the dumplist
-#: ../src/gui/CCMainWindow.py:183
+#: ../src/gui/CCMainWindow.py:188
#, python-format
msgid ""
"Error while loading the dumplist.\n"
@@ -608,7 +610,7 @@ msgstr ""
"Erro ao carregar a lista de despejo.\n"
"%s"
-#: ../src/gui/CCMainWindow.py:241
+#: ../src/gui/CCMainWindow.py:246
#, python-format
msgid ""
"<b>%s Crash</b>\n"
@@ -617,11 +619,11 @@ msgstr ""
"<b>%sTravamento</b>\n"
"%s"
-#: ../src/gui/CCMainWindow.py:337
+#: ../src/gui/CCMainWindow.py:343
msgid "You have to select a crash to copy."
msgstr "Você selecionou um travamento para cópia"
-#: ../src/gui/CCMainWindow.py:421
+#: ../src/gui/CCMainWindow.py:427
msgid ""
"Usage: abrt-gui [OPTIONS]\n"
"\t-v[vv]\t\t\tVerbose\n"
@@ -631,7 +633,7 @@ msgstr ""
"\t-v[W]\t\t\tVerbose\n"
"\t--report=CRASH_ID\tRelatar diretamente o problema com CRASH_ID"
-#: ../src/gui/CCMainWindow.py:444
+#: ../src/gui/CCMainWindow.py:450
#, python-format
msgid ""
"No such crash in the database, probably wrong crashid.\n"
@@ -640,96 +642,6 @@ msgstr ""
"Não existe tal travamento no banco de dados, provavelmete crashid errado.\n"
"crashid=%s "
-#. default texts
-#: ../src/gui/CCReporterDialog.py:22 ../src/gui/CReporterAssistant.py:20
-msgid "Brief description of how to reproduce this or what you did..."
-msgstr "Breve descrição sobre como reproduzir isto ou o que você fazia... "
-
-#: ../src/gui/CCReporterDialog.py:107
-msgid "You must check the backtrace for sensitive data."
-msgstr "Você precisa verificar o backtrace para dados sensíveis"
-
-#: ../src/gui/CCReporterDialog.py:118 ../src/gui/CReporterAssistant.py:364
-#, python-format
-msgid ""
-"Reporting disabled because the backtrace is unusable.\n"
-"Please try to install debuginfo manually using the command: <b>debuginfo-"
-"install %s</b> \n"
-"then use the Refresh button to regenerate the backtrace."
-msgstr ""
-"Relato desabilitado porque o backtrace está inutilizável.\n"
-"Por favor, tente instalar o debuginfo manualmente usando o comando: "
-"<b>debuginfo-install %s</b> \n"
-"e depois use o botão Atualizar para regerar o backtrace. "
-
-#: ../src/gui/CCReporterDialog.py:120
-msgid "The backtrace is unusable, you cannot report this!"
-msgstr "O backtrace está inutilizável, você não pode reportá-lo! "
-
-#: ../src/gui/CCReporterDialog.py:124 ../src/gui/CReporterAssistant.py:342
-#: ../src/gui/CReporterAssistant.py:370
-msgid ""
-"The backtrace is incomplete, please make sure you provide the steps to "
-"reproduce."
-msgstr ""
-"O backtrace está incompleto. Por favor, certifique-se de fornecer bons "
-"passos para a reprodução. "
-
-#: ../src/gui/CCReporterDialog.py:130
-msgid "Reporting disabled, please fix the problems shown above."
-msgstr ""
-"Relatório desabilitado, por favor, repare os problemas demonstrados acima."
-
-#: ../src/gui/CCReporterDialog.py:132
-msgid "Sends the report using the selected plugin."
-msgstr "Envia um relato usando o plugin selecionado. "
-
-#: ../src/gui/CCReporterDialog.py:398
-msgid ""
-"No reporter plugin available for this type of crash.\n"
-"Please check abrt.conf."
-msgstr ""
-"Não existe nenhum plugin relatador disponível para este tipo de travamento\n"
-"Por favor verifique o abrt.conf. "
-
-#: ../src/gui/CCReporterDialog.py:418 ../src/gui/CReporterAssistant.py:249
-#: ../src/gui/PluginsSettingsDialog.py:136
-#, python-format
-msgid ""
-"Cannot save plugin settings:\n"
-" %s"
-msgstr ""
-"Não foi possível salvar as configurações do plugin:\n"
-" %s "
-
-#: ../src/gui/CCReporterDialog.py:448 ../src/gui/CReporterAssistant.py:279
-#, python-format
-msgid "Configure %s options"
-msgstr "Configure %s opções"
-
-#: ../src/gui/CCReporterDialog.py:498 ../src/gui/CReporterAssistant.py:1074
-msgid ""
-"Unable to get report!\n"
-"Is debuginfo missing?"
-msgstr ""
-"Não foi possível obter o relatório!\n"
-"O debuginfo está faltando? "
-
-#: ../src/gui/CCReporterDialog.py:527 ../src/gui/CReporterAssistant.py:455
-#, python-format
-msgid ""
-"Reporting failed!\n"
-"%s"
-msgstr ""
-"Falha no relato!\n"
-"%s"
-
-#: ../src/gui/CCReporterDialog.py:553 ../src/gui/CCReporterDialog.py:574
-#: ../src/gui/CReporterAssistant.py:1113
-#, python-format
-msgid "Error acquiring the report: %s"
-msgstr "Erro ao obter o relatório: %s "
-
#: ../src/gui/ConfBackend.py:78
msgid "Cannot connect to the Gnome Keyring daemon."
msgstr "Não foi possível conectar ao daemon do Gnome Keyring."
@@ -761,40 +673,89 @@ msgid "Access to gnome-keyring has been denied, cannot load settings."
msgstr ""
"Acesso ao gnome-keyring foi negado, não foi possível carregar configurações."
+#: ../src/gui/CReporterAssistant.py:20
+msgid "Brief description of how to reproduce this or what you did..."
+msgstr "Breve descrição sobre como reproduzir isto ou o que você fazia... "
+
#: ../src/gui/CReporterAssistant.py:21
msgid "Crash info doesn't contain a backtrace"
msgstr "Informação de travamento não contém um backtrace."
-#: ../src/gui/CReporterAssistant.py:334
+#: ../src/gui/CReporterAssistant.py:277
+#: ../src/gui/PluginsSettingsDialog.py:136
+#, python-format
+msgid ""
+"Cannot save plugin settings:\n"
+" %s"
+msgstr ""
+"Não foi possível salvar as configurações do plugin:\n"
+" %s "
+
+#: ../src/gui/CReporterAssistant.py:307
+#, python-format
+msgid "Configure %s options"
+msgstr "Configure %s opções"
+
+#: ../src/gui/CReporterAssistant.py:362
#, python-format
msgid "Rating is %s"
msgstr "A taxa é %s"
-#: ../src/gui/CReporterAssistant.py:337
+#: ../src/gui/CReporterAssistant.py:365
msgid "Crashdump doesn't have rating => we suppose it's not required"
msgstr "O crashdump não possui taxa => supomos que não seja necessário"
-#: ../src/gui/CReporterAssistant.py:350
+#: ../src/gui/CReporterAssistant.py:370 ../src/gui/CReporterAssistant.py:398
+msgid ""
+"The backtrace is incomplete, please make sure you provide the steps to "
+"reproduce."
+msgstr ""
+"O backtrace está incompleto. Por favor, certifique-se de fornecer bons "
+"passos para a reprodução. "
+
+#: ../src/gui/CReporterAssistant.py:378
msgid "You should check the backtrace for sensitive data."
msgstr "Você precisa verificar o backtrace para dados sensíveis "
-#: ../src/gui/CReporterAssistant.py:351
+#: ../src/gui/CReporterAssistant.py:379
msgid "You must agree with sending the backtrace."
msgstr "Você precisa concordar em enviar o backtrace."
-#: ../src/gui/CReporterAssistant.py:366
+#: ../src/gui/CReporterAssistant.py:392
+#, python-format
+msgid ""
+"Reporting disabled because the backtrace is unusable.\n"
+"Please try to install debuginfo manually using the command: <b>debuginfo-"
+"install %s</b> \n"
+"then use the Refresh button to regenerate the backtrace."
+msgstr ""
+"Relato desabilitado porque o backtrace está inutilizável.\n"
+"Por favor, tente instalar o debuginfo manualmente usando o comando: "
+"<b>debuginfo-install %s</b> \n"
+"e depois use o botão Atualizar para regerar o backtrace. "
+
+#: ../src/gui/CReporterAssistant.py:394
msgid "Reporting disabled because the backtrace is unusable."
msgstr "Relatório desabilitado, porque o backtrace está inutilizado."
-#: ../src/gui/CReporterAssistant.py:412
+#: ../src/gui/CReporterAssistant.py:440
msgid "You did not provide any steps to reproduce."
msgstr "Você não forneceu qualquer passo para reprodução."
-#: ../src/gui/CReporterAssistant.py:426
+#: ../src/gui/CReporterAssistant.py:454
msgid "You did not provide any comments."
msgstr "Você não forneceu nenhum comentário."
-#: ../src/gui/CReporterAssistant.py:507
+#: ../src/gui/CReporterAssistant.py:483
+#, python-format
+msgid ""
+"Reporting failed!\n"
+"%s"
+msgstr ""
+"Falha no relato!\n"
+"%s"
+
+#: ../src/gui/CReporterAssistant.py:535
#, python-format
msgid ""
"It looks like an application from the package <b>%s</b> has crashed on your "
@@ -821,15 +782,15 @@ msgstr ""
"Selecione onde você deseja reportar este erro, e pressione 'Próximo' para "
"continuar."
-#: ../src/gui/CReporterAssistant.py:548
+#: ../src/gui/CReporterAssistant.py:576
msgid "Only one reporter plugin is configured."
msgstr "Somente um plugin reporter está configurado."
-#: ../src/gui/CReporterAssistant.py:554
+#: ../src/gui/CReporterAssistant.py:582
msgid "Send a bug report"
msgstr "Enviar relatório de erro"
-#: ../src/gui/CReporterAssistant.py:592
+#: ../src/gui/CReporterAssistant.py:620
msgid ""
"Below is the backtrace associated with your crash. A crash backtrace "
"provides developers with details about how the crash happened, helping them "
@@ -846,52 +807,52 @@ msgstr ""
"certificar-se que seu relatório de erro não contém nenhum dado sensível que "
"você prefira não compartilhar:"
-#: ../src/gui/CReporterAssistant.py:663 ../src/gui/CReporterAssistant.py:676
-#: ../src/gui/CReporterAssistant.py:710
+#: ../src/gui/CReporterAssistant.py:691 ../src/gui/CReporterAssistant.py:704
+#: ../src/gui/CReporterAssistant.py:738
#, python-format
msgid "Found %i occurence(s) [at: %i of %i]"
-msgstr ""
+msgstr "Encontrado %i ocorrência(s) [at: %i of %i]"
-#: ../src/gui/CReporterAssistant.py:747
+#: ../src/gui/CReporterAssistant.py:775
msgid "Search:"
-msgstr ""
+msgstr "Pesquisa:"
-#: ../src/gui/CReporterAssistant.py:778
+#: ../src/gui/CReporterAssistant.py:806
msgid "Refresh"
msgstr "Atualizar"
-#: ../src/gui/CReporterAssistant.py:780
+#: ../src/gui/CReporterAssistant.py:808
msgid "Copy"
msgstr "Copiar"
-#: ../src/gui/CReporterAssistant.py:786
+#: ../src/gui/CReporterAssistant.py:814
msgid "I agree with submitting the backtrace"
msgstr "Eu concordo em submeter o backtrace"
-#: ../src/gui/CReporterAssistant.py:791
+#: ../src/gui/CReporterAssistant.py:819
msgid "Approve the backtrace"
msgstr "Aprovar o backtrace"
-#: ../src/gui/CReporterAssistant.py:834
+#: ../src/gui/CReporterAssistant.py:862
msgid "You need to fill the how to before you can proceed..."
-msgstr ""
+msgstr "Você precisa preencher o campo antes de prosseguir...o"
-#: ../src/gui/CReporterAssistant.py:857
+#: ../src/gui/CReporterAssistant.py:885
msgid "How did this crash happen (step-by-step)? How would you reproduce it?"
msgstr ""
"Como este travamento aconteceu (passo-a-passo)? Como você o reproduziria?"
-#: ../src/gui/CReporterAssistant.py:877
+#: ../src/gui/CReporterAssistant.py:905
msgid ""
"Are there any comments you would like to share with the software maintainers?"
msgstr ""
"Existe algum comentário que você deseja fazer aos mantedores de software?"
-#: ../src/gui/CReporterAssistant.py:897
+#: ../src/gui/CReporterAssistant.py:925
msgid "Provide additional details"
msgstr "Forneça detalhes adicionais."
-#: ../src/gui/CReporterAssistant.py:904
+#: ../src/gui/CReporterAssistant.py:932
msgid ""
"<b>Tip:</b> Your comments are not private. Please watch what you say "
"accordingly."
@@ -899,83 +860,96 @@ msgstr ""
"<b> Dica:</b> Seus comentários não são privados. Por favor, tenha cuidado ao "
"utilizar as palavras."
-#: ../src/gui/CReporterAssistant.py:945
+#: ../src/gui/CReporterAssistant.py:973
msgid "Confirm and send the report"
msgstr "Confirmar e enviar o relatório"
-#: ../src/gui/CReporterAssistant.py:947
+#: ../src/gui/CReporterAssistant.py:975
msgid ""
"Below is a summary of your bug report. Please click 'Apply' to submit it."
msgstr ""
"Abaixo encontra-se o sumário de seu relatório de erro. Por favor, verifique "
"o botão 'Aplicar' e submeta-o."
-#: ../src/gui/CReporterAssistant.py:952
+#: ../src/gui/CReporterAssistant.py:980
msgid "<b>Basic details</b>"
msgstr "<b>Detalhes básicos</b>"
#. left table
-#: ../src/gui/CReporterAssistant.py:959
+#: ../src/gui/CReporterAssistant.py:987
msgid "Component"
msgstr "Componente"
-#: ../src/gui/CReporterAssistant.py:960
+#: ../src/gui/CReporterAssistant.py:988
msgid "Package"
msgstr "Pacote"
-#: ../src/gui/CReporterAssistant.py:961
+#: ../src/gui/CReporterAssistant.py:989
msgid "Executable"
msgstr "Executável"
-#: ../src/gui/CReporterAssistant.py:962
+#: ../src/gui/CReporterAssistant.py:990
msgid "Cmdline"
msgstr "Cmdline"
#. right table
-#: ../src/gui/CReporterAssistant.py:964
+#: ../src/gui/CReporterAssistant.py:992
msgid "Architecture"
msgstr "Arquitetura"
-#: ../src/gui/CReporterAssistant.py:965
+#: ../src/gui/CReporterAssistant.py:993
msgid "Kernel"
msgstr "Kernel"
-#: ../src/gui/CReporterAssistant.py:966
+#: ../src/gui/CReporterAssistant.py:994
msgid "Release"
msgstr "Lançamento"
-#: ../src/gui/CReporterAssistant.py:967
+#: ../src/gui/CReporterAssistant.py:995
msgid "Reason"
msgstr "Razão"
-#: ../src/gui/CReporterAssistant.py:978 ../src/gui/report.glade.h:3
+#: ../src/gui/CReporterAssistant.py:1006 ../src/gui/report.glade.h:3
msgid "<b>Backtrace</b>"
msgstr "<b>Backtrace</b>"
-#: ../src/gui/CReporterAssistant.py:981
+#: ../src/gui/CReporterAssistant.py:1009
msgid "Click to view..."
msgstr "Clique para visualizar..."
-#: ../src/gui/CReporterAssistant.py:993
+#: ../src/gui/CReporterAssistant.py:1021
msgid "<b>Steps to reproduce:</b>"
msgstr "<b>Passos para reproduzir:</b>"
-#: ../src/gui/CReporterAssistant.py:1014
+#: ../src/gui/CReporterAssistant.py:1042
msgid "<b>Comments:</b>"
msgstr "<b>Comentário:</b> "
-#: ../src/gui/CReporterAssistant.py:1017
+#: ../src/gui/CReporterAssistant.py:1045
msgid "No comment provided!"
msgstr "Nenhum comentário fornecido!"
-#: ../src/gui/CReporterAssistant.py:1053
+#: ../src/gui/CReporterAssistant.py:1081
msgid "Finished sending the bug report"
msgstr "Finalizar o envio do relatório de erro"
-#: ../src/gui/CReporterAssistant.py:1057
+#: ../src/gui/CReporterAssistant.py:1085
msgid "<b>Bug reports:</b>"
msgstr "<b>Relato de erros:</b> "
+#: ../src/gui/CReporterAssistant.py:1102
+msgid ""
+"Unable to get report!\n"
+"Is debuginfo missing?"
+msgstr ""
+"Não foi possível obter o relatório!\n"
+"O debuginfo está faltando? "
+
+#: ../src/gui/CReporterAssistant.py:1139
+#, python-format
+msgid "Error acquiring the report: %s"
+msgstr "Erro ao obter o relatório: %s "
+
#: ../src/gui/dialogs.glade.h:1
msgid "Log"
msgstr "Log"
@@ -1021,10 +995,9 @@ msgid "Name"
msgstr "Nome: "
#: ../src/gui/PluginsSettingsDialog.py:118
-#, fuzzy
msgid "Please select a plugin from the list to edit its options."
msgstr ""
-"Por favor, selecione um plugin a partir da lista para editar sua opção:"
+"Por favor, selecione um plugin a partir da lista para editar as opções:"
#: ../src/gui/PluginsSettingsDialog.py:126
#, python-format
@@ -1125,103 +1098,67 @@ msgstr "Enviar relatório"
msgid "Show log"
msgstr "Exibir log"
-#: ../src/gui/SettingsDialog.py:34 ../src/gui/SettingsDialog.py:51
-msgid "<b>Select plugin</b>"
-msgstr "<b>Selecionar plugin</b>"
-
-#: ../src/gui/SettingsDialog.py:37
-msgid "<b>Select database backend</b>"
-msgstr "<b>Selecione o backend de banco de dados</b>"
-
-#: ../src/gui/SettingsDialog.py:170
+#: ../src/gui/SettingsDialog.py:122
msgid "Remove this job"
msgstr "Remover este trabalho"
-#: ../src/gui/SettingsDialog.py:214
+#: ../src/gui/SettingsDialog.py:166
msgid "Remove this action"
msgstr "Remover esta ação"
#: ../src/gui/settings.glade.h:1
-msgid "<b>Analyzer plugin</b>"
-msgstr "<b>Plugins de análise</b>"
-
-#: ../src/gui/settings.glade.h:2
-msgid "<b>Associated action</b>"
-msgstr "<b>Ação associada</b>"
-
-#: ../src/gui/settings.glade.h:3
msgid "<b>Plugin details</b>"
msgstr "<b>Detalhes do plugin</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>Tempo (ou período)</b>"
-
-#: ../src/gui/settings.glade.h:6
-msgid "Analyzers, Actions, Reporters"
-msgstr "Analisadores, ações e relatores"
-
-#: ../src/gui/settings.glade.h:7
+#: ../src/gui/settings.glade.h:2
msgid "Author:"
msgstr "Autor:"
-#: ../src/gui/settings.glade.h:8
+#: ../src/gui/settings.glade.h:3
msgid "Blacklisted packages: "
msgstr "Pacotes excluídos: "
-#: ../src/gui/settings.glade.h:9
+#: ../src/gui/settings.glade.h:4
msgid "C_onfigure Plugin"
msgstr "C_onfigurar plugin "
-#: ../src/gui/settings.glade.h:10
+#: ../src/gui/settings.glade.h:5
msgid "Check package GPG signature"
msgstr "Verificar assinatura GPG do pacote"
-#: ../src/gui/settings.glade.h:11
+#: ../src/gui/settings.glade.h:6
msgid "Common"
msgstr "Comum"
-#: ../src/gui/settings.glade.h:12
-msgid "Cron"
-msgstr "Cron"
-
-#: ../src/gui/settings.glade.h:13
-msgid "Database backend: "
-msgstr "Backend de banco de dados: "
-
-#: ../src/gui/settings.glade.h:14
+#: ../src/gui/settings.glade.h:7
msgid "Description:"
msgstr "Descrição:"
-#: ../src/gui/settings.glade.h:15
+#: ../src/gui/settings.glade.h:8
msgid "GPG Keys"
msgstr "Chaves GPG"
-#: ../src/gui/settings.glade.h:16
+#: ../src/gui/settings.glade.h:9
msgid "GPG keys: "
msgstr "Chaves GPG: "
-#: ../src/gui/settings.glade.h:17
+#: ../src/gui/settings.glade.h:10
msgid "Max coredump storage size (MB):"
msgstr "Tamanho máximo (em MB) do despejo do núcleo:"
-#: ../src/gui/settings.glade.h:18
+#: ../src/gui/settings.glade.h:11
msgid "Name:"
msgstr "Nome:"
-#: ../src/gui/settings.glade.h:20
+#: ../src/gui/settings.glade.h:13
msgid "Preferences"
msgstr "Preferências"
-#: ../src/gui/settings.glade.h:21
+#: ../src/gui/settings.glade.h:14
msgid "Version:"
msgstr "Versão:"
-#: ../src/gui/settings.glade.h:22
+#: ../src/gui/settings.glade.h:15
msgid "Web Site:"
msgstr "Web site:"
@@ -1244,110 +1181,133 @@ msgstr ""
"respectiva e repare-a antes de proceder, caso contrário o processo de "
"reportagem pode falhar.\n"
-#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.cpp:47
+#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.c:45
#, c-format
msgid "Uploaded: %llu of %llu kbytes"
msgstr "Enviado: %llu de %llu kbytes"
-#: ../src/lib/parse_options.c:11
+#: ../src/lib/parse_options.c:29
#, c-format
msgid "Usage: %s\n"
-msgstr ""
+msgstr "Use: %s\n"
-#: ../src/plugins/abrt-action-analyze-c.c:154
+#: ../src/plugins/abrt-action-analyze-c.c:156
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID of coredumps"
msgstr ""
+" [-v] -d DIR\n"
+"\n"
+"Calculados e salvos UUID do coredumps"
-#: ../src/plugins/abrt-action-analyze-oops.c:131
+#: ../src/plugins/abrt-action-analyze-oops.c:133
msgid ""
" [-vs] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of oops crash dumps"
msgstr ""
-#: ../src/plugins/abrt-action-analyze-python.c:36
+#: ../src/plugins/abrt-action-analyze-python.c:38
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of python crash dumps"
msgstr ""
-#: ../src/plugins/abrt-action-bugzilla.cpp:532
+#: ../src/plugins/abrt-action-bugzilla.cpp:534
#, c-format
msgid "New bug id: %i"
msgstr "Novo id do erro: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:645
-#, c-format
-msgid "Can't open '%s'"
-msgstr ""
-
-#: ../src/plugins/abrt-action-bugzilla.cpp:665
+#: ../src/plugins/abrt-action-bugzilla.cpp:662
#, fuzzy, c-format
msgid "Empty login or password, please check %s"
msgstr ""
"Login ou senha vazios.\n"
"Por favor, verifique"
-#: ../src/plugins/abrt-action-bugzilla.cpp:683
+#: ../src/plugins/abrt-action-bugzilla.cpp:680
msgid "Logging into bugzilla..."
msgstr "Autenticando no bugzilla..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:686
+#: ../src/plugins/abrt-action-bugzilla.cpp:683
msgid "Checking for duplicates..."
msgstr "Verificando duplicatas..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:707
-#: ../src/plugins/abrt-action-bugzilla.cpp:743
+#: ../src/plugins/abrt-action-bugzilla.cpp:705
+#: ../src/plugins/abrt-action-bugzilla.cpp:741
msgid "Missing mandatory member 'bugs'"
msgstr "Membro 'bugs' obrigatórios faltando"
-#: ../src/plugins/abrt-action-bugzilla.cpp:726
-#: ../src/plugins/abrt-action-bugzilla.cpp:759
-#: ../src/plugins/abrt-action-bugzilla.cpp:834
+#: ../src/plugins/abrt-action-bugzilla.cpp:724
+#: ../src/plugins/abrt-action-bugzilla.cpp:757
+#: ../src/plugins/abrt-action-bugzilla.cpp:833
msgid "get_bug_info() failed. Could not collect all mandatory information"
msgstr ""
"get_bug_info()falhou. Não foi possível coletar todas as informações "
"obrigatórias."
-#: ../src/plugins/abrt-action-bugzilla.cpp:775
+#: ../src/plugins/abrt-action-bugzilla.cpp:772
msgid "Creating a new bug..."
msgstr "Criando novo erro... "
-#: ../src/plugins/abrt-action-bugzilla.cpp:780
+#: ../src/plugins/abrt-action-bugzilla.cpp:777
msgid "Bugzilla entry creation failed"
msgstr "Criação da entrada do bugzilla falhou"
-#: ../src/plugins/abrt-action-bugzilla.cpp:790
-#: ../src/plugins/abrt-action-bugzilla.cpp:887
+#: ../src/plugins/abrt-action-bugzilla.cpp:789
+#: ../src/plugins/abrt-action-bugzilla.cpp:886
msgid "Logging out..."
msgstr "Encerrando sessão..."
#. decision based on state
-#: ../src/plugins/abrt-action-bugzilla.cpp:808
+#: ../src/plugins/abrt-action-bugzilla.cpp:807
#, c-format
msgid "Bug is already reported: %i"
msgstr "O erro já foi relatado: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:819
+#: ../src/plugins/abrt-action-bugzilla.cpp:818
#, c-format
msgid "Bugzilla couldn't find parent of bug %d"
msgstr "O Bugzilla não conseguiu encontrar o pai do bug %d"
-#: ../src/plugins/abrt-action-bugzilla.cpp:848
+#: ../src/plugins/abrt-action-bugzilla.cpp:847
#, c-format
msgid "Add %s to CC list"
msgstr "Adicionar o %s à lista CC"
-#: ../src/plugins/abrt-action-bugzilla.cpp:872
+#: ../src/plugins/abrt-action-bugzilla.cpp:871
#, c-format
msgid "Adding new comment to bug %d"
msgstr "Adicionar novo comentário ao bug (%d)"
-#: ../src/plugins/abrt-action-generate-backtrace.c:319
+#: ../src/plugins/abrt-action-bugzilla.cpp:913
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to Bugzilla"
+msgstr ""
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:928
+#: ../src/plugins/abrt-action-kerneloops.c:148
+#: ../src/plugins/abrt-action-rhtsupport.c:281
+msgid "Configuration file (may be given many times)"
+msgstr "Configurando o arquivo (talvez seja feito muitas vezes) c"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:258
+msgid " [options] -d DIR"
+msgstr "[opções] -d DIR"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:271
+msgid "Additional debuginfo directories"
+msgstr "Diretórios de informações de depuração adicionaistri"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:272
+msgid "Kill gdb if it runs for more than N seconds"
+msgstr "Matar gdb se este executar por mais de N segundos"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:320
#, c-format
msgid "Backtrace parsing failed for %s"
msgstr ""
@@ -1355,84 +1315,83 @@ msgstr ""
#: ../src/plugins/abrt-action-install-debuginfo.py:72
#, python-format
msgid "Extracting cpio from %s"
-msgstr ""
+msgstr "Extraindo cpio de %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:77
msgid "Can't write to:"
-msgstr ""
+msgstr "Não é possível gravar:"
#: ../src/plugins/abrt-action-install-debuginfo.py:87
msgid "Removing the temporary rpm file"
-msgstr ""
+msgstr "Removendo arquivo rpm temporário"
#: ../src/plugins/abrt-action-install-debuginfo.py:91
#, python-format
msgid "Can't extract package: %s"
-msgstr ""
+msgstr "Não é possível extrair o pacote: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:99
#, python-format
msgid "Caching files from %s made from %s"
-msgstr ""
+msgstr "Efetuar cache de arquivos de %s a partir de %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:107
msgid "Removing the temporary cpio file"
-msgstr ""
+msgstr "Removendo arquivo cpio temporáriote"
#: ../src/plugins/abrt-action-install-debuginfo.py:110
#, python-format
msgid "Can't extract files from: %s"
-msgstr ""
+msgstr "Não é possível extrair arquivos de: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:134
#: ../src/plugins/abrt-action-install-debuginfo.py:140
#, python-format
msgid "Downloading (%i of %i) %.30s : %.3s %%"
-msgstr ""
+msgstr "Baixando (%i de %i) %.30s : %.3s %%n"
#: ../src/plugins/abrt-action-install-debuginfo.py:169
-#, fuzzy
msgid "Searching the missing debuginfo packages"
-msgstr "Iniciando instalação do debuginfo "
+msgstr "Procurando pacotes perdidos do debuginfo "
#: ../src/plugins/abrt-action-install-debuginfo.py:224
#, python-format
msgid "To download: (%.2f) M / Installed size: %.2f M"
-msgstr ""
+msgstr "Para download: (%.2f) M / Tamanho instalado: %.2f M"
#: ../src/plugins/abrt-action-install-debuginfo.py:240
msgid "Is this ok? [y/N] "
-msgstr ""
+msgstr "Esta correto? [y/N]"
#: ../src/plugins/abrt-action-install-debuginfo.py:257
#, python-format
msgid "Downloading package %s failed"
-msgstr ""
+msgstr "Baixando pacote %s falhou"
#. recursively delete the temp dir on failure
#: ../src/plugins/abrt-action-install-debuginfo.py:268
msgid "Unpacking failed, aborting download..."
-msgstr ""
+msgstr "Descompactação falhou, cancelando download..."
#: ../src/plugins/abrt-action-install-debuginfo.py:275
#, python-format
msgid "All downloaded packages have been extracted, removing %s"
-msgstr ""
+msgstr "Todos os pacotes baixados foram extraidos, removendo %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:280
#, python-format
msgid "Can't remove %s, probably contains an error log"
-msgstr ""
+msgstr "Não é possível remover %s, provávelmente contém erros no log"
#: ../src/plugins/abrt-action-install-debuginfo.py:305
#, python-format
msgid "Analyzing corefile: %(corefile_path)s"
-msgstr ""
+msgstr "Analizando arquivo central: %(corefile_path)sc"
#: ../src/plugins/abrt-action-install-debuginfo.py:384
#, python-format
msgid "Can't remove %(tmpdir_path)s: %(reason)s"
-msgstr ""
+msgstr "Não remova %(tmpdir_path)s: %(reason)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:394
msgid "Exiting on user Command"
@@ -1467,45 +1426,52 @@ msgstr ""
msgid "Complete!"
msgstr "Componente"
-#: ../src/plugins/abrt-action-kerneloops.cpp:111
+#: ../src/plugins/abrt-action-kerneloops.c:105
#, fuzzy, c-format
msgid "Submitting oops report to %s"
msgstr "Gravando um relato para '%s'"
-#: ../src/plugins/abrt-action-mailx.cpp:114
+#: ../src/plugins/abrt-action-kerneloops.c:133
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a kernel oops to kerneloops.org (or similar) site"
+msgstr ""
+
+#: ../src/plugins/abrt-action-mailx.c:110
msgid "Sending an email..."
msgstr "Enviando email..."
-#: ../src/plugins/abrt-action-mailx.cpp:138
+#: ../src/plugins/abrt-action-mailx.c:137
msgid ""
" [-v] -d DIR [-c CONFFILE]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
-#: ../src/plugins/abrt-action-mailx.cpp:151
-#: ../src/plugins/abrt-action-upload.cpp:267
+#: ../src/plugins/abrt-action-mailx.c:150
+#: ../src/plugins/abrt-action-upload.c:261
#, fuzzy
msgid "Config file"
msgstr "Arquivo do autenticador:"
-#: ../src/plugins/abrt-action-print.cpp:39
+#: ../src/plugins/abrt-action-print.c:38
msgid ""
" [-v] [-o FILE] -d DIR\n"
"\n"
"Print information about the crash to standard output"
msgstr ""
-#: ../src/plugins/abrt-action-print.cpp:51
+#: ../src/plugins/abrt-action-print.c:51
msgid "Output file"
msgstr ""
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was appended to %s"
msgstr "O relatório foi adicionado ao %s"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was stored to %s"
msgstr "O relatório foi armazenado em %s"
@@ -1513,49 +1479,79 @@ msgstr "O relatório foi armazenado em %s"
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
#. error msg is already logged by dd_opendir
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
-#: ../src/plugins/abrt-action-rhtsupport.cpp:43
-#: ../src/plugins/abrt-action-upload.cpp:121
+#: ../src/plugins/abrt-action-rhtsupport.c:41
+#: ../src/plugins/abrt-action-upload.c:119
msgid "Compressing data"
msgstr "Comprimindo dados"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:78
+#: ../src/plugins/abrt-action-rhtsupport.c:73
#, fuzzy
msgid "Empty login or password, please check RHTSupport.conf"
msgstr ""
"Login ou senha vazios.\n"
"Por favor, verifique"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:194
+#: ../src/plugins/abrt-action-rhtsupport.c:191
msgid "Creating a new case..."
msgstr "Criando novo caso..."
-#: ../src/plugins/abrt-action-upload.cpp:65
+#: ../src/plugins/abrt-action-rhtsupport.c:266
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to RHTSupport"
+msgstr ""
+
+#: ../src/plugins/abrt-action-upload.c:63
#, fuzzy, c-format
msgid "Sending %s to %s"
msgstr "Enviando o pacote %s para %s"
#. This ends up a "reporting status message" in abrtd
-#: ../src/plugins/abrt-action-upload.cpp:98
+#: ../src/plugins/abrt-action-upload.c:96
#, c-format
msgid "Successfully sent %s to %s"
msgstr ""
-#: ../src/plugins/abrt-action-upload.cpp:219
+#: ../src/plugins/abrt-action-upload.c:212
#, c-format
msgid "Archive is created: '%s'"
msgstr ""
-#: ../src/plugins/abrt-action-upload.cpp:253
+#: ../src/plugins/abrt-action-upload.c:247
msgid ""
" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
-#: ../src/plugins/abrt-action-upload.cpp:268
+#: ../src/plugins/abrt-action-upload.c:262
msgid "Base URL to upload to"
msgstr ""
+#: ../src/plugins/abrt-dump-oops.c:540
+msgid ""
+" [-vsrdow] FILE\n"
+"\n"
+"Extract oops from syslog/dmesg file"
+msgstr ""
+
+#: ../src/plugins/abrt-dump-oops.c:556
+msgid "Parse kernel's message buffer before parsing FILE"
+msgstr ""
+
+#: ../src/plugins/abrt-dump-oops.c:557
+msgid "Create ABRT dump for every oops found"
+msgstr ""
+
+#: ../src/plugins/abrt-dump-oops.c:558
+msgid "Print found oopses on standard output"
+msgstr ""
+
+#: ../src/plugins/abrt-dump-oops.c:559
+msgid "Do not exit, watch the file for new oopses"
+msgstr ""
+
#: ../src/plugins/Bugzilla.glade.h:1
msgid "<b>Bugzilla plugin configuration</b>"
msgstr "<b>Configuração do plugin do Bugzilla</b>"
@@ -1592,10 +1588,6 @@ msgstr ""
"Você pode criá-lo <a href=\"https://bugzilla.redhat.com/createaccount.cgi"
"\">aqui</a>"
-#: ../src/plugins/CCpp.cpp:277
-msgid "Analyzes crashes in C/C++ programs"
-msgstr "Análise de travamentos nos programas C/C++"
-
#: ../src/plugins/KerneloopsReporter.glade.h:1
msgid "<b>Kerneloops Reporter plugin configuration</b>"
msgstr "<b>Somente um plugin reporter está configurado.</b>"
@@ -1604,10 +1596,6 @@ msgstr "<b>Somente um plugin reporter está configurado.</b>"
msgid "Submit URL:"
msgstr "Submeta a URL:"
-#: ../src/plugins/KerneloopsScanner.cpp:227
-msgid "Periodically scans for and saves kernel oopses"
-msgstr "Copia periodicamente e salva para os oopses do kernel"
-
#: ../src/plugins/Logger.glade.h:1
msgid "<b>Logger plugin configuration</b>"
msgstr "<b>Configuração de plugin do autenticador</b>"
@@ -1653,9 +1641,8 @@ msgid "RHTSupport URL:"
msgstr "URL do Suporte de RHT:"
#: ../src/plugins/Upload.glade.h:1
-#, fuzzy
msgid "<b>Upload plugin configuration</b>"
-msgstr "<b>Configuração de plugin de Carregador de Ticket</b>"
+msgstr "<b>Upload do plugin de configuração</b>"
#: ../src/plugins/Upload.glade.h:2
msgid "Retry count:"
@@ -1673,6 +1660,108 @@ msgstr "URL:"
msgid "Use encryption"
msgstr "Usar criptografia:"
+#~ msgid "<b>Select plugin</b>"
+#~ msgstr "<b>Selecionar plugin</b>"
+
+#~ msgid "<b>Select database backend</b>"
+#~ msgstr "<b>Selecione o backend de banco de dados</b>"
+
+#~ msgid "<b>Analyzer plugin</b>"
+#~ msgstr "<b>Plugins de análise</b>"
+
+#~ msgid "<b>Associated action</b>"
+#~ msgstr "<b>Ação associada</b>"
+
+#~ msgid "<b>Plugin</b>"
+#~ msgstr "<b>Plugin</b>"
+
+#~ msgid "<b>Time (or period)</b>"
+#~ msgstr "<b>Tempo (ou período)</b>"
+
+#~ msgid "Analyzers, Actions, Reporters"
+#~ msgstr "Analisadores, ações e relatores"
+
+#~ msgid "Cron"
+#~ msgstr "Cron"
+
+#~ msgid "Database backend: "
+#~ msgstr "Backend de banco de dados: "
+
+#, fuzzy
+#~ msgid ""
+#~ "Usage: %s [OPTION]\n"
+#~ "\n"
+#~ "Startup:\n"
+#~ "\t-V, --version\t\tdisplay the version of %s and exit\n"
+#~ "\t-?, --help\t\tprint this help\n"
+#~ "\n"
+#~ "Actions:\n"
+#~ "\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
+#~ "\t -f, --full\tprint a list of all crashes, including the already "
+#~ "reported ones\n"
+#~ "\t-r, --report CRASH_ID\tcreate and send a report\n"
+#~ "\t -y, --always\tcreate and send a report without asking\n"
+#~ "\t-d, --delete CRASH_ID\tremove a crash\n"
+#~ "\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
+#~ "\t -b, --backtrace\tprint detailed information about a crash "
+#~ "including backtrace\n"
+#~ "CRASH_ID can be:\n"
+#~ "\ta name of dump directory, or\n"
+#~ "\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+#~ msgstr ""
+#~ "Usage: %s [OPTION]\n"
+#~ "\n"
+#~ "Inicialização:\n"
+#~ "\t-V, --version\t\texibe a versão do %s e sai\n"
+#~ "\t-?, --help\t\timprime esta ajuda\n"
+#~ "\n"
+#~ "Ações:\n"
+#~ "\t-l, --list\t\timprime uma lista de todos os travamentos que não são "
+#~ "reportados ainda\n"
+#~ "\t -f, --full\timprime uma lista de todos os travamentos, incluindo "
+#~ "os que já foram reportados\n"
+#~ "\t-r, --report CRASH_ID\tcria e envia um relatório\n"
+#~ "\t -y, --always\tcria e envia um relatório sem perguntar\n"
+#~ "\t-d, --delete CRASH_ID\tremove um travamento\n"
+#~ "\t-i, --info CRASH_ID\timprime informação detalhada sobre o travamento\n"
+#~ "\t -b, --backtrace\timprime informação detalhada sobre o travamento "
+#~ "incluindo o backtrace\n"
+#~ "CRASH_ID pode ser:\n"
+#~ "\tUID:UUID par,\n"
+#~ "\tunique UUID prefixo - o travamento com o UUID conincidente será "
+#~ "acionado\n"
+#~ "\t@N - N'th crash (como exibido por --list --full) será acionado\n"
+
+#~ msgid "Error loading reporter settings"
+#~ msgstr "Erro ao carregar as configurações do relator"
+
+#~ msgid "You must check the backtrace for sensitive data."
+#~ msgstr "Você precisa verificar o backtrace para dados sensíveis"
+
+#~ msgid "The backtrace is unusable, you cannot report this!"
+#~ msgstr "O backtrace está inutilizável, você não pode reportá-lo! "
+
+#~ msgid "Reporting disabled, please fix the problems shown above."
+#~ msgstr ""
+#~ "Relatório desabilitado, por favor, repare os problemas demonstrados acima."
+
+#~ msgid "Sends the report using the selected plugin."
+#~ msgstr "Envia um relato usando o plugin selecionado. "
+
+#~ msgid ""
+#~ "No reporter plugin available for this type of crash.\n"
+#~ "Please check abrt.conf."
+#~ msgstr ""
+#~ "Não existe nenhum plugin relatador disponível para este tipo de "
+#~ "travamento\n"
+#~ "Por favor verifique o abrt.conf. "
+
+#~ msgid "Analyzes crashes in C/C++ programs"
+#~ msgstr "Análise de travamentos nos programas C/C++"
+
+#~ msgid "Periodically scans for and saves kernel oopses"
+#~ msgstr "Copia periodicamente e salva para os oopses do kernel"
+
#~ msgid "Database plugin not specified. Please check abrtd settings."
#~ msgstr ""
#~ "O plugin do banco de dados não foi especificado. Por favor, verifique as "
diff --git a/po/ta.po b/po/ta.po
index c63ff5be..d0ab527f 100644
--- a/po/ta.po
+++ b/po/ta.po
@@ -3,28 +3,31 @@
# This file is distributed under the same license as the PACKAGE package.
#
# I. Felix <ifelix@redhat.com>, 2009, 2010.
-# I Felix <ifelix@redhat.com>, 2010.
+# I Felix <ifelix@redhat.com>, 2010, 2011.
msgid ""
msgstr ""
"Project-Id-Version: abrt.master.ta\n"
"Report-Msgid-Bugs-To: jmoskovc@redhat.com\n"
-"POT-Creation-Date: 2010-11-29 13:51+0100\n"
-"PO-Revision-Date: 2010-08-03 11:58+0530\n"
+"POT-Creation-Date: 2010-12-09 09:15+0000\n"
+"PO-Revision-Date: 2011-02-15 14:45+0530\n"
"Last-Translator: I Felix <ifelix@redhat.com>\n"
"Language-Team: American English <kde-i18n-doc@kde.org>\n"
-"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 1.0\n"
-"Plural-Forms: nplurals=2; plural=(n!=1);\\n\n"
+"Language: \n"
+"X-Generator: Lokalize 1.1\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\\n"
+"\n"
#: ../src/applet/abrt-applet.desktop.in.h:1
msgid "ABRT notification applet"
msgstr "ABRT அறிவிபà¯à®ªà¯ ஆபà¯à®²à¯†à®Ÿà¯"
-#: ../src/applet/abrt-applet.desktop.in.h:2 ../src/gui/abrt.desktop.in.h:1
-#: ../src/gui/ccgui.glade.h:10 ../src/gui/CCMainWindow.py:8
+#: ../src/applet/abrt-applet.desktop.in.h:2
+#: ../src/gui/abrt.desktop.in.h:1
+#: ../src/gui/ccgui.glade.h:10
+#: ../src/gui/CCMainWindow.py:8
#: ../src/gui/report.glade.h:16
msgid "Automatic Bug Reporting Tool"
msgstr "தானியகà¯à®• பிழை அறிகà¯à®•à¯ˆà®¯à®¿à®Ÿà¯à®®à¯ கரà¯à®µà®¿"
@@ -42,19 +45,19 @@ msgstr "ஒர௠சேதம௠கணà¯à®Ÿà®±à®¿à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯"
msgid "ABRT service is not running"
msgstr "ABRT சேவை இயஙà¯à®•à®µà®¿à®²à¯à®²à¯ˆ"
-#: ../src/applet/applet_gtk.c:176 ../src/applet/applet_gtk.c:178
-#: ../src/applet/applet_gtk.c:367 ../src/applet/applet_gtk.c:394
+#: ../src/applet/applet_gtk.c:176
+#: ../src/applet/applet_gtk.c:178
+#: ../src/applet/applet_gtk.c:367
+#: ../src/applet/applet_gtk.c:394
msgid "Warning"
msgstr "எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ"
#: ../src/applet/applet_gtk.c:230
-msgid ""
-"Notification area applet that notifies users about issues detected by ABRT"
-msgstr ""
-"ABRT ஆல௠கணà¯à®Ÿà¯à®ªà®¿à®Ÿà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ சிகà¯à®•à®²à¯à®•à®³à¯ˆà®ªà¯ பறà¯à®±à®¿ அபà¯à®²à¯†à®Ÿà¯à®Ÿà®¿à®²à¯ உளà¯à®³ அறிகà¯à®•à¯ˆà®ªà¯ பகà¯à®¤à®¿à®¯à®¿à®²à¯ பயனர௠"
-"கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿ வேணà¯à®Ÿà¯à®®à¯"
+msgid "Notification area applet that notifies users about issues detected by ABRT"
+msgstr "ABRT ஆல௠கணà¯à®Ÿà¯à®ªà®¿à®Ÿà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ சிகà¯à®•à®²à¯à®•à®³à¯ˆà®ªà¯ பறà¯à®±à®¿ அபà¯à®²à¯†à®Ÿà¯à®Ÿà®¿à®²à¯ உளà¯à®³ அறிகà¯à®•à¯ˆà®ªà¯ பகà¯à®¤à®¿à®¯à®¿à®²à¯ பயனர௠கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿ வேணà¯à®Ÿà¯à®®à¯"
-#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:23
+#: ../src/applet/applet_gtk.c:246
+#: ../src/gui/ccgui.glade.h:23
msgid "translator-credits"
msgstr "I. Felix <ifelix@redhat.com> 2010"
@@ -62,16 +65,18 @@ msgstr "I. Felix <ifelix@redhat.com> 2010"
msgid "Hide"
msgstr "மறை"
-#: ../src/applet/applet_gtk.c:360 ../src/gui/ccgui.glade.h:13
+#: ../src/applet/applet_gtk.c:360
+#: ../src/gui/ccgui.glade.h:13
msgid "Report"
msgstr "அறிகà¯à®•à¯ˆ"
-#: ../src/applet/applet_gtk.c:363 ../src/applet/applet_gtk.c:391
+#: ../src/applet/applet_gtk.c:363
+#: ../src/applet/applet_gtk.c:391
msgid "Open ABRT"
msgstr "Open ABRT"
-#: ../src/cli/CLI.cpp:47
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:46
+#, c-format
msgid ""
"\tCrash dump : %s\n"
"\tUID : %s\n"
@@ -80,12 +85,12 @@ msgid ""
"\tCrash Time : %s\n"
"\tCrash Count: %s\n"
msgstr ""
+"\tகà¯à®°à®¾à®·à¯ டமà¯à®ªà¯ : %s\n"
"\tUID : %s\n"
-"\tUUID : %s\n"
-"\tதொகà¯à®ªà¯à®ªà¯ : %s\n"
-"\tஇயஙà¯à®•à®•à¯à®•à¯‚டியத௠: %s\n"
-"\tகà¯à®°à®·à¯ நேரம௠: %s\n"
-"\tகà¯à®°à®·à¯ எணà¯à®£à®¿à®•à¯à®•à¯ˆ: %s\n"
+"\tPackage : %s\n"
+"\tExecutable : %s\n"
+"\tCrash Time : %s\n"
+"\tCrash Count: %s\n"
#: ../src/cli/CLI.cpp:65
#, c-format
@@ -93,7 +98,7 @@ msgid "\tHostname : %s\n"
msgstr "\tபà¯à®°à®µà®²à®©à¯ பெயர௠: %s\n"
#: ../src/cli/CLI.cpp:98
-#, fuzzy, c-format
+#, c-format
msgid ""
"Dump directory: %s\n"
"Last crash: %s\n"
@@ -105,39 +110,37 @@ msgid ""
"System: %s, kernel %s\n"
"Reason: %s\n"
msgstr ""
-"கà¯à®°à®¾à®·à¯ ID: %s:%s\n"
+"அடைபà¯à®ªà¯ அடைவà¯: %s\n"
"கடைசி கà¯à®°à®¾à®·à¯: %s\n"
-"ஆயà¯à®µà®¿: %s\n"
-"கூறà¯: %s\n"
+"ஆயà¯à®µà®¾à®³à®°à¯: %s\n"
+"ஆகà¯à®•à®•à¯à®•à¯‚à®±à¯: %s\n"
"தொகà¯à®ªà¯à®ªà¯: %s\n"
"கடà¯à®Ÿà®³à¯ˆ: %s\n"
-"இயஙà¯à®•à®•à¯à®•à¯‚டியதà¯: %s\n"
+"செயலாறà¯à®±à¯à®µà®¤à¯: %s\n"
"கணினி: %s, kernel %s\n"
-"மதிபà¯à®ªà¯€à®Ÿà¯: %s\n"
-"Coredump கோபà¯à®ªà¯: %s\n"
"காரணமà¯: %s\n"
-#: ../src/cli/CLI.cpp:125
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:126
+#, c-format
msgid "Coredump file: %s\n"
-msgstr "கà¯à®°à®¾à®·à¯ செயலà¯à®®à¯à®±à¯ˆ: %s\n"
+msgstr "Coredump file: %s\n"
-#: ../src/cli/CLI.cpp:129
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:130
+#, c-format
msgid "Rating: %s\n"
-msgstr "பà¯à®°à®µà®²à®©à¯ பெயரà¯: %s\n"
+msgstr "மதிபà¯à®ªà®¿à®Ÿà¯à®¤à®²à¯: %s\n"
-#: ../src/cli/CLI.cpp:134
+#: ../src/cli/CLI.cpp:135
#, c-format
msgid "Crash function: %s\n"
msgstr "கà¯à®°à®¾à®·à¯ செயலà¯à®®à¯à®±à¯ˆ: %s\n"
-#: ../src/cli/CLI.cpp:138
+#: ../src/cli/CLI.cpp:139
#, c-format
msgid "Hostname: %s\n"
msgstr "பà¯à®°à®µà®²à®©à¯ பெயரà¯: %s\n"
-#: ../src/cli/CLI.cpp:142
+#: ../src/cli/CLI.cpp:143
#, c-format
msgid ""
"\n"
@@ -148,7 +151,7 @@ msgstr ""
"எவà¯à®µà®¾à®±à¯ மறà¯à®‰à®±à¯à®ªà®¤à¯à®¤à®¿ செயà¯à®¯à®µà¯‡à®£à¯à®Ÿà¯à®®à¯:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:146
+#: ../src/cli/CLI.cpp:147
#, c-format
msgid ""
"\n"
@@ -159,7 +162,7 @@ msgstr ""
"கரà¯à®¤à¯à®¤à¯:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:152
+#: ../src/cli/CLI.cpp:153
#, c-format
msgid ""
"\n"
@@ -171,30 +174,29 @@ msgstr ""
"%s\n"
#. Message has embedded tabs.
-#: ../src/cli/CLI.cpp:243
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:248
+#, c-format
msgid ""
"Usage: %s [OPTION]\n"
"\n"
"Startup:\n"
"\t-V, --version\t\tdisplay the version of %s and exit\n"
+"\t-v, --verbose\t\tincrease verbosity\n"
"\t-?, --help\t\tprint this help\n"
"\n"
"Actions:\n"
"\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
-"\t -f, --full\tprint a list of all crashes, including the already "
-"reported ones\n"
+"\t -f, --full\tprint a list of all crashes, including the already reported ones\n"
"\t-r, --report CRASH_ID\tcreate and send a report\n"
"\t -y, --always\tcreate and send a report without asking\n"
"\t-d, --delete CRASH_ID\tremove a crash\n"
"\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
-"\t -b, --backtrace\tprint detailed information about a crash including "
-"backtrace\n"
+"\t -b, --backtrace\tprint detailed information about a crash including backtrace\n"
"CRASH_ID can be:\n"
"\ta name of dump directory, or\n"
"\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
msgstr ""
-"Usage: %s [OPTION]\n"
+"பயனà¯à®ªà®¾à®Ÿà¯: %s [OPTION]\n"
"\n"
"Startup:\n"
"\t-V, --version\t\tdisplay the version of %s and exit\n"
@@ -202,20 +204,18 @@ msgstr ""
"\n"
"Actions:\n"
"\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
-"\t -f, --full\tprint a list of all crashes, including the already "
-"reported ones\n"
+"\t -f, --full\tprint a list of all crashes, including the already reported ones\n"
"\t-r, --report CRASH_ID\tcreate and send a report\n"
"\t -y, --always\tcreate and send a report without asking\n"
"\t-d, --delete CRASH_ID\tremove a crash\n"
"\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
-"\t -b, --backtrace\tprint detailed information about a crash including "
-"backtrace\n"
+"\t -b, --backtrace\tprint detailed information about a crash including backtrace\n"
"CRASH_ID can be:\n"
"\tUID:UUID pair,\n"
"\tunique UUID prefix - the crash with matching UUID will be acted upon\n"
"\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
-#: ../src/cli/CLI.cpp:287
+#: ../src/cli/CLI.cpp:292
msgid "You must specify exactly one operation"
msgstr "நீஙà¯à®•à®³à¯ ஒர௠செயலà¯à®®à¯à®±à¯ˆà®¯à¯ˆ சரியாக கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿ வேணà¯à®Ÿà¯à®®à¯"
@@ -297,125 +297,119 @@ msgstr ""
"அறிகà¯à®•à¯ˆà®¯à®¿à®²à¯ எநà¯à®¤ மாறà¯à®±à®™à¯à®•à®³à¯à®®à¯ இலà¯à®²à¯ˆ"
#. The response might take more than 1 char in non-latin scripts.
-#: ../src/cli/report.cpp:464
+#: ../src/cli/report.cpp:445
msgid "y"
-msgstr ""
+msgstr "y"
-#: ../src/cli/report.cpp:465
+#: ../src/cli/report.cpp:446
msgid "N"
-msgstr ""
+msgstr "N"
#. Read the missing information and push it to plugin settings.
-#: ../src/cli/report.cpp:565
+#: ../src/cli/report.cpp:572
#, c-format
msgid "Wrong settings were detected for plugin %s\n"
msgstr "கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯ %sகà¯à®•à¯ தவறான அமைவ௠கணà¯à®Ÿà®±à®¿à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯\n"
-#: ../src/cli/report.cpp:569
+#: ../src/cli/report.cpp:576
msgid "Enter your login: "
msgstr "உஙà¯à®•à®³à¯ பà¯à®•à¯à®ªà®¤à®¿à®µà¯ˆ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯: "
-#: ../src/cli/report.cpp:575
+#: ../src/cli/report.cpp:582
msgid "Enter your password: "
msgstr "உஙà¯à®•à®³à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ உளà¯à®³à®¿à®Ÿà¯à®™à¯à®•à®³à¯: "
-#: ../src/cli/report.cpp:638
+#: ../src/cli/report.cpp:648
msgid "Reporting..."
msgstr "அறிகà¯à®•à¯ˆà®¯à®¿à®Ÿà¯à®•à®¿à®±à®¤à¯..."
-#: ../src/cli/report.cpp:657
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:667
+#, c-format
msgid "Report using %s?"
-msgstr "அறிகà¯à®•à¯ˆ %s஠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®•à®¿à®±à®¤à®¾? [y/N]: "
+msgstr "%s஠அறிகà¯à®•à¯ˆ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®•à®¿à®±à®¤à®¾?"
-#: ../src/cli/report.cpp:660
+#: ../src/cli/report.cpp:670
msgid "Skipping..."
msgstr "தவிரà¯à®•à¯à®•à®¿à®±à®¤à¯..."
-#: ../src/cli/report.cpp:672
-#, fuzzy
+#: ../src/cli/report.cpp:682
msgid "Reporting disabled because the backtrace is unusable"
-msgstr "அறிகà¯à®•à¯ˆ செயலà¯à®¨à¯€à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯, மேலே காடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿ சிகà¯à®•à®²à¯à®•à®³à¯ˆ பொரà¯à®¤à¯à®¤à®µà¯à®®à¯."
+msgstr "அறிகà¯à®•à¯ˆ செயலà¯à®¨à¯€à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ à®à®©à¯†à®©à®¿à®²à¯ பினà¯à®¨à®ª"
-#: ../src/cli/report.cpp:676
+#: ../src/cli/report.cpp:686
#, c-format
-msgid ""
-"Please try to install debuginfo manually using the command: \"debuginfo-"
-"install %s\" and try again\n"
-msgstr ""
+msgid "Please try to install debuginfo manually using the command: \"debuginfo-install %s\" and try again\n"
+msgstr "பிழைதிரà¯à®¤à¯à®¤ தகவலை கைமà¯à®±à¯ˆà®¯à®¾à®• நிறà¯à®µ கடà¯à®Ÿà®³à¯ˆà®¯à¯ˆ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ à®®à¯à®¯à®±à¯à®šà®¿à®•à¯à®•à®µà¯à®®à¯: \"debuginfo-install %s\" மறà¯à®±à¯à®®à¯ மீணà¯à®Ÿà¯à®®à¯ à®®à¯à®¯à®±à¯à®šà®¿à®•à¯à®•à®µà¯à®®à¯\n"
-#: ../src/cli/report.cpp:685
-#, fuzzy
+#: ../src/cli/report.cpp:695
msgid "Error loading reporter settings"
-msgstr "அறிகà¯à®•à¯ˆà®¯à¯ˆ பெறà¯à®®à¯ போத௠பிழை: %s"
+msgstr "பிழை à®à®±à¯à®±à¯à®®à¯ அறிவிபà¯à®ªà®¾à®³à®°à¯ அமைவà¯à®•à®³à¯"
-#: ../src/cli/report.cpp:704
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:716
+#, c-format
msgid "Crash reported via %d report events (%d errors)\n"
-msgstr "கà¯à®°à®·à¯ %d கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯à®•à®³à¯ வழியாக அறிகà¯à®•à¯ˆà®¯à®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ (%d பிழைகளà¯)\n"
+msgstr "%d à®®à¯à®Ÿà®¿à®µà¯ நிகழà¯à®µà¯à®•à®³à¯ கà¯à®°à®¾à®·à¯ வழியாக அறிகà¯à®•à¯ˆà®¯à®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ (%d பிழைகளà¯)\n"
#: ../src/daemon/abrt-handle-crashdump.c:42
msgid ""
" [-vs] -d DIR -e EVENT\n"
" or: "
msgstr ""
+" [-vs] -d DIR -e EVENT\n"
+" அலà¯à®²à®¤à¯: "
#: ../src/daemon/abrt-handle-crashdump.c:57
#: ../src/plugins/abrt-action-analyze-c.c:167
#: ../src/plugins/abrt-action-analyze-oops.c:144
#: ../src/plugins/abrt-action-analyze-python.c:49
msgid "Log to syslog"
-msgstr ""
+msgstr " syslogகà¯à®•à¯ பதியவà¯à®®à¯"
#: ../src/daemon/abrt-handle-crashdump.c:58
#: ../src/plugins/abrt-action-analyze-c.c:166
#: ../src/plugins/abrt-action-analyze-oops.c:143
#: ../src/plugins/abrt-action-analyze-python.c:48
-#: ../src/plugins/abrt-action-mailx.cpp:150
-#: ../src/plugins/abrt-action-print.cpp:50
-#: ../src/plugins/abrt-action-upload.cpp:266
+#: ../src/plugins/abrt-action-mailx.cpp:147
+#: ../src/plugins/abrt-action-print.cpp:49
+#: ../src/plugins/abrt-action-upload.cpp:261
msgid "Crash dump directory"
-msgstr ""
+msgstr "கà¯à®°à®¾à®·à¯ டமà¯à®ªà¯ அடைவà¯"
#: ../src/daemon/abrt-handle-crashdump.c:59
msgid "Handle EVENT"
-msgstr ""
+msgstr "நிகழà¯à®šà¯à®šà®¿à®¯à¯ˆ கையாளலà¯"
#: ../src/daemon/abrt-handle-crashdump.c:60
msgid "List possible events [which start with PFX]"
-msgstr ""
+msgstr "வாயà¯à®ªà¯à®ªà¯ நிகழà¯à®µà¯à®•à®³à¯ˆ படà¯à®Ÿà®¿à®¯à®²à®¿à®Ÿà¯ [PFX உடன௠தà¯à®µà®™à¯à®•à¯à®µà®¤à¯]"
-#: ../src/daemon/CommLayerServerDBus.cpp:229
+#: ../src/daemon/CommLayerServerDBus.cpp:238
msgid "Comment is too long"
msgstr "கà¯à®±à®¿à®ªà¯à®ªà¯ மிக நீணà¯à®Ÿà®¤à¯"
-#: ../src/daemon/CommLayerServerDBus.cpp:233
+#: ../src/daemon/CommLayerServerDBus.cpp:242
msgid "'How to reproduce' is too long"
msgstr "'How to reproduce' மிக நீணà¯à®Ÿà®¤à¯"
-#: ../src/daemon/Daemon.cpp:534
-msgid ""
-"The size of the report exceeded the quota. Please check system's "
-"MaxCrashReportsSize value in abrt.conf."
-msgstr ""
-"அறிகà¯à®•à¯ˆ அளவ௠ஒதà¯à®•à¯à®•à¯€à®Ÿà¯à®Ÿà¯ˆ தாணà¯à®Ÿà®¿à®¯à®¤à¯. உஙà¯à®•à®³à¯ MaxCrashReportsSize மதிபà¯à®ªà¯ˆ abrt.conf.இல௠"
-"சரிபாரà¯à®•à¯à®•à®µà¯à®®à¯."
+#: ../src/daemon/Daemon.cpp:533
+msgid "The size of the report exceeded the quota. Please check system's MaxCrashReportsSize value in abrt.conf."
+msgstr "அறிகà¯à®•à¯ˆ அளவ௠ஒதà¯à®•à¯à®•à¯€à®Ÿà¯à®Ÿà¯ˆ தாணà¯à®Ÿà®¿à®¯à®¤à¯. உஙà¯à®•à®³à¯ MaxCrashReportsSize மதிபà¯à®ªà¯ˆ abrt.conf.இல௠சரிபாரà¯à®•à¯à®•à®µà¯à®®à¯."
-#: ../src/daemon/Daemon.cpp:699
+#: ../src/daemon/Daemon.cpp:686
msgid "abrtd [options]"
-msgstr ""
+msgstr "abrtd [விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯]"
-#: ../src/daemon/Daemon.cpp:709
+#: ../src/daemon/Daemon.cpp:696
msgid "Do not daemonize"
-msgstr ""
+msgstr "அனà¯à®ªà¯à®ª வேணà¯à®Ÿà®¾à®®à¯à®…னà¯à®ªà¯à®ª வேணà¯à®Ÿ"
-#: ../src/daemon/Daemon.cpp:710
+#: ../src/daemon/Daemon.cpp:697
msgid "Log to syslog even with -d"
-msgstr ""
+msgstr "-d-உடன௠syslog பதிவ௠செயà¯à®¤à®¾à®²à¯à®®à¯"
-#: ../src/daemon/Daemon.cpp:711
+#: ../src/daemon/Daemon.cpp:698
msgid "Exit after SEC seconds of inactivity"
-msgstr ""
+msgstr "SEC விநாடிகள௠செயலிழபà¯à®ªà®¿à®²à¯ இரà¯à®¨à¯à®¤à®¾à®²à¯ வெளியேறà¯"
#: ../src/gui/abrt.desktop.in.h:2
msgid "View and report application crashes"
@@ -426,8 +420,7 @@ msgid "Another client is already running, trying to wake it..."
msgstr "வேற௠கிளையனà¯à®Ÿà¯ à®à®±à¯à®•à®©à®µà¯‡ இயஙà¯à®•à®¿à®•à¯à®•à¯Šà®£à¯à®Ÿà®¿à®°à¯à®•à¯à®•à®¿à®±à®¤à¯, அதனை எழà¯à®ªà¯à®ª à®®à¯à®¯à®±à¯à®šà®¿à®•à¯à®•à®¿à®±à®¤à¯..."
#: ../src/gui/ABRTExceptions.py:14
-msgid ""
-"Got unexpected data from the daemon (is the database properly updated?)."
+msgid "Got unexpected data from the daemon (is the database properly updated?)."
msgstr "டீமானà¯à®•à¯à®•à¯ எதிரà¯à®ªà®¾à®°à®¾à®¤ தரவ௠பெறபà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ (தரவà¯à®¤à¯à®¤à®³à®®à¯ சரியாக மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à®¾?)."
#: ../src/gui/ABRTPlugin.py:64
@@ -450,11 +443,13 @@ msgstr "ரிபà¯à®ªà¯‹à®°à¯à®Ÿà®°à¯ கூடà¯à®¤à®²à¯ இணைபà¯à
msgid "Database plugins"
msgstr "தரவà¯à®¤à¯à®¤à®³ கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯à®•à®³à¯"
-#: ../src/gui/CCDBusBackend.py:74 ../src/gui/CCDBusBackend.py:97
+#: ../src/gui/CCDBusBackend.py:74
+#: ../src/gui/CCDBusBackend.py:97
msgid "Cannot connect to system dbus."
msgstr "கணினி dbusஉடன௠இணைகà¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ."
-#: ../src/gui/CCDBusBackend.py:120 ../src/gui/CCDBusBackend.py:123
+#: ../src/gui/CCDBusBackend.py:120
+#: ../src/gui/CCDBusBackend.py:123
msgid "Please check if the abrt daemon is running."
msgstr "abrt டீமான௠இயஙà¯à®•à®¿à®©à®¾à®²à¯ சோதிகà¯à®•à®µà¯à®®à¯."
@@ -507,39 +502,27 @@ msgstr "ABRT பறà¯à®±à®¿"
msgid "Copy to Clipboard"
msgstr "கிளிப௠போரà¯à®Ÿà®¿à®²à¯ நகலெடà¯"
-#: ../src/gui/ccgui.glade.h:12 ../src/gui/settings.glade.h:19
+#: ../src/gui/ccgui.glade.h:12
+#: ../src/gui/settings.glade.h:19
msgid "Plugins"
msgstr "கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯à®•à®³à¯"
#: ../src/gui/ccgui.glade.h:14
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"
+"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"
+"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/>."
+"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"
+"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"
+"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/>."
+"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:19 ../src/gui/CReporterAssistant.py:71
+#: ../src/gui/ccgui.glade.h:19
+#: ../src/gui/CReporterAssistant.py:111
msgid "View log"
msgstr "பதிவை காடà¯à®Ÿà¯"
@@ -633,7 +616,8 @@ msgstr ""
"crashid=%s"
#. default texts
-#: ../src/gui/CCReporterDialog.py:22 ../src/gui/CReporterAssistant.py:20
+#: ../src/gui/CCReporterDialog.py:22
+#: ../src/gui/CReporterAssistant.py:20
msgid "Brief description of how to reproduce this or what you did..."
msgstr "இதனை மீணà¯à®Ÿà¯à®®à¯ உரà¯à®µà®¾à®•à¯à®•à¯à®µà®¤à®±à¯à®•à®¾à®© சà¯à®°à¯à®•à¯à®• விளகà¯à®•à®®à¯ அலà¯à®²à®¤à¯ நீஙà¯à®•à®³à¯ எனà¯à®© செயà¯à®¤à¯€à®°à¯à®•à®³à¯..."
@@ -641,31 +625,27 @@ msgstr "இதனை மீணà¯à®Ÿà¯à®®à¯ உரà¯à®µà®¾à®•à¯à®•à¯à®µà®¤à
msgid "You must check the backtrace for sensitive data."
msgstr "உணரà¯à®µà¯à®³à¯à®³ தரவà¯à®•à¯à®•à¯ பேகà¯à®Ÿà¯à®°à¯‡à®¸à¯ˆ சரி பாரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯."
-#: ../src/gui/CCReporterDialog.py:118 ../src/gui/CReporterAssistant.py:364
+#: ../src/gui/CCReporterDialog.py:118
+#: ../src/gui/CReporterAssistant.py:392
#, python-format
msgid ""
"Reporting disabled because the backtrace is unusable.\n"
-"Please try to install debuginfo manually using the command: <b>debuginfo-"
-"install %s</b> \n"
+"Please try to install debuginfo manually using the command: <b>debuginfo-install %s</b> \n"
"then use the Refresh button to regenerate the backtrace."
msgstr ""
"backtrace பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.\n"
-"இநà¯à®¤à®•à¯ கடà¯à®Ÿà®³à¯ˆà®¯à¯ˆà®ªà¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ debuginfo கைமà¯à®±à¯ˆà®¯à®¾à®• நிறà¯à®µà®µà¯à®®à¯:<b>debuginfo-install "
-"%s</b> \n"
+"இநà¯à®¤à®•à¯ கடà¯à®Ÿà®³à¯ˆà®¯à¯ˆà®ªà¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ debuginfo கைமà¯à®±à¯ˆà®¯à®¾à®• நிறà¯à®µà®µà¯à®®à¯:<b>debuginfo-install %s</b> \n"
" பின௠backtrace஠மீணà¯à®Ÿà¯à®®à¯ உரà¯à®µà®¾à®•à¯à®• பà¯à®¤à¯à®ªà¯à®ªà®¿ பொதà¯à®¤à®¾à®©à¯ˆ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯."
#: ../src/gui/CCReporterDialog.py:120
msgid "The backtrace is unusable, you cannot report this!"
msgstr "பேகà¯à®Ÿà¯à®°à¯‡à®¸à¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®•à¯à®•à¯‚டியதà¯à®¤à®²à¯à®², இதனை நீஙà¯à®•à®³à¯ அறிகà¯à®•à¯ˆà®¯à®¿à®Ÿ à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯!"
-#: ../src/gui/CCReporterDialog.py:124 ../src/gui/CReporterAssistant.py:342
+#: ../src/gui/CCReporterDialog.py:124
#: ../src/gui/CReporterAssistant.py:370
-msgid ""
-"The backtrace is incomplete, please make sure you provide the steps to "
-"reproduce."
-msgstr ""
-"bactrace à®®à¯à®Ÿà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà®¾à®®à®²à¯ உளà¯à®³à®¤à¯, மறà¯à®‰à®±à¯à®ªà®¤à¯à®¤à®¿à®•à¯à®•à¯ நீஙà¯à®•à®³à¯ சரியான படிகளை செயà¯à®¤à®¿à®°à¯à®•à¯à®•à®¿à®±à¯€à®°à¯à®•à®³à¯ "
-"என உறà¯à®¤à®¿à®šà¯†à®¯à¯à®¯à®µà¯à®®à¯."
+#: ../src/gui/CReporterAssistant.py:398
+msgid "The backtrace is incomplete, please make sure you provide the steps to reproduce."
+msgstr "bactrace à®®à¯à®Ÿà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà®¾à®®à®²à¯ உளà¯à®³à®¤à¯, மறà¯à®‰à®±à¯à®ªà®¤à¯à®¤à®¿à®•à¯à®•à¯ நீஙà¯à®•à®³à¯ சரியான படிகளை செயà¯à®¤à®¿à®°à¯à®•à¯à®•à®¿à®±à¯€à®°à¯à®•à®³à¯ என உறà¯à®¤à®¿à®šà¯†à®¯à¯à®¯à®µà¯à®®à¯."
#: ../src/gui/CCReporterDialog.py:130
msgid "Reporting disabled, please fix the problems shown above."
@@ -683,7 +663,8 @@ msgstr ""
"அறிவிபà¯à®ªà®¾à®³à®°à¯ கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯ இநà¯à®¤ வகையான கà¯à®°à®¾à®·à¯à®•à¯à®•à¯ இலà¯à®²à¯ˆ\n"
"abrt.conf.஠சரிபாரà¯à®•à¯à®•à®µà¯à®®à¯"
-#: ../src/gui/CCReporterDialog.py:418 ../src/gui/CReporterAssistant.py:249
+#: ../src/gui/CCReporterDialog.py:418
+#: ../src/gui/CReporterAssistant.py:277
#: ../src/gui/PluginsSettingsDialog.py:136
#, python-format
msgid ""
@@ -693,12 +674,14 @@ msgstr ""
"கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯ அமைவà¯à®•à®³à¯ˆ சேமிகà¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ:\n"
" %s"
-#: ../src/gui/CCReporterDialog.py:448 ../src/gui/CReporterAssistant.py:279
+#: ../src/gui/CCReporterDialog.py:448
+#: ../src/gui/CReporterAssistant.py:307
#, python-format
msgid "Configure %s options"
msgstr "%s விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯ˆ கடà¯à®Ÿà®®à¯ˆ"
-#: ../src/gui/CCReporterDialog.py:498 ../src/gui/CReporterAssistant.py:1074
+#: ../src/gui/CCReporterDialog.py:498
+#: ../src/gui/CReporterAssistant.py:1102
msgid ""
"Unable to get report!\n"
"Is debuginfo missing?"
@@ -706,7 +689,8 @@ msgstr ""
"அறிகà¯à®•à¯ˆà®¯à¯ˆ பெற à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ!\n"
"debuginfo விடà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à®¾?"
-#: ../src/gui/CCReporterDialog.py:527 ../src/gui/CReporterAssistant.py:455
+#: ../src/gui/CCReporterDialog.py:527
+#: ../src/gui/CReporterAssistant.py:483
#, python-format
msgid ""
"Reporting failed!\n"
@@ -715,8 +699,9 @@ msgstr ""
"அறிகà¯à®•à¯ˆà®¯à®¿à®Ÿà¯à®¤à®²à¯ தோலà¯à®µà®¿à®¯à¯à®±à¯à®±à®¤à¯!\n"
"%s"
-#: ../src/gui/CCReporterDialog.py:553 ../src/gui/CCReporterDialog.py:574
-#: ../src/gui/CReporterAssistant.py:1113
+#: ../src/gui/CCReporterDialog.py:553
+#: ../src/gui/CCReporterDialog.py:574
+#: ../src/gui/CReporterAssistant.py:1139
#, python-format
msgid "Error acquiring the report: %s"
msgstr "அறிகà¯à®•à¯ˆà®¯à¯ˆ பெறà¯à®®à¯ போத௠பிழை: %s"
@@ -731,17 +716,15 @@ msgstr "Gnome Keyring டீமானோட௠இணைகà¯à®• à®®à¯à®Ÿà®¿à®
msgid "Cannot get the default keyring."
msgstr "à®®à¯à®©à¯à®©à®¿à®°à¯à®ªà¯à®ªà¯ கீரிஙà¯à®•à¯ˆ பெற à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ"
-#: ../src/gui/ConfBackend.py:103 ../src/gui/ConfBackend.py:120
-msgid ""
-"Access to gnome-keyring has been denied, plugins settings will not be saved."
-msgstr ""
-"gnome-keyring஠அணà¯à®•à¯à®µà®¤à¯ மறà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯, கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯ அமைவà¯à®•à®³à¯ சேமிகà¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ."
+#: ../src/gui/ConfBackend.py:103
+#: ../src/gui/ConfBackend.py:120
+msgid "Access to gnome-keyring has been denied, plugins settings will not be saved."
+msgstr "gnome-keyring஠அணà¯à®•à¯à®µà®¤à¯ மறà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯, கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯ அமைவà¯à®•à®³à¯ சேமிகà¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ."
#. we tried 2 times, so giving up the authorization
#: ../src/gui/ConfBackend.py:154
#, python-format
-msgid ""
-"Access to gnome-keyring has been denied, cannot load the settings for %s!"
+msgid "Access to gnome-keyring has been denied, cannot load the settings for %s!"
msgstr "gnome-keyring஠அணà¯à®•à¯à®µà®¤à¯ மறà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯, %s-கà¯à®•à¯ அமைவà¯à®•à®³à¯ˆ à®à®±à¯à®± à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ!"
#: ../src/gui/ConfBackend.py:207
@@ -752,211 +735,187 @@ msgstr "gnome-keyring஠அணà¯à®•à¯à®µà®¤à¯ மறà¯à®•à¯à®•à®ªà¯à®ªà®Ÿ
msgid "Crash info doesn't contain a backtrace"
msgstr "கà¯à®°à®¾à®·à¯ தகவல௠ஒர௠பேகà¯à®Ÿà¯à®°à¯‡à®¸à¯ˆ கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®•à®¾à®¤à¯"
-#: ../src/gui/CReporterAssistant.py:334
+#: ../src/gui/CReporterAssistant.py:362
#, python-format
msgid "Rating is %s"
msgstr "மதிபà¯à®ªà®¿à®Ÿà¯à®¤à®²à¯ %s"
-#: ../src/gui/CReporterAssistant.py:337
+#: ../src/gui/CReporterAssistant.py:365
msgid "Crashdump doesn't have rating => we suppose it's not required"
msgstr "Crashdump மதிபà¯à®ªà¯€à®Ÿà¯à®Ÿà¯ˆ கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®•à®µà®¿à®²à¯à®²à¯ˆ => அத௠தேவையிலà¯à®²à¯ˆ"
-#: ../src/gui/CReporterAssistant.py:350
+#: ../src/gui/CReporterAssistant.py:378
msgid "You should check the backtrace for sensitive data."
msgstr "உணரà¯à®µà¯à®³à¯à®³ தரவà¯à®•à¯à®•à¯ பேகà¯à®Ÿà¯à®°à¯‡à®¸à¯ˆ சரி பாரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯."
-#: ../src/gui/CReporterAssistant.py:351
+#: ../src/gui/CReporterAssistant.py:379
msgid "You must agree with sending the backtrace."
msgstr "நீஙà¯à®•à®³à¯ பேகà¯à®Ÿà¯à®°à¯‡à®¸à¯à®Ÿà®©à¯ அனà¯à®ªà¯à®ªà¯à®®à¯ போத௠à®à®±à¯à®• வேணà¯à®Ÿà¯à®®à¯."
-#: ../src/gui/CReporterAssistant.py:366
+#: ../src/gui/CReporterAssistant.py:394
msgid "Reporting disabled because the backtrace is unusable."
msgstr "அறிகà¯à®•à¯ˆ செயலà¯à®¨à¯€à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯, மேலே காடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿ சிகà¯à®•à®²à¯à®•à®³à¯ˆ பொரà¯à®¤à¯à®¤à®µà¯à®®à¯."
-#: ../src/gui/CReporterAssistant.py:412
+#: ../src/gui/CReporterAssistant.py:440
msgid "You did not provide any steps to reproduce."
msgstr "நீஙà¯à®•à®³à¯ மறà¯à®‰à®±à¯à®ªà®¤à¯à®¤à®¿ செயà¯à®¯ படிகள௠எதà¯à®µà¯à®®à¯ வழஙà¯à®•à®µà®¿à®²à¯à®²à¯ˆ."
-#: ../src/gui/CReporterAssistant.py:426
+#: ../src/gui/CReporterAssistant.py:454
msgid "You did not provide any comments."
msgstr "நீஙà¯à®•à®³à¯ கரà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à¯ எதà¯à®µà¯à®®à¯ வழஙà¯à®•à®µà®¿à®²à¯à®²à¯ˆ."
-#: ../src/gui/CReporterAssistant.py:507
+#: ../src/gui/CReporterAssistant.py:535
#, python-format
msgid ""
-"It looks like an application from the package <b>%s</b> has crashed on your "
-"system. It is a good idea to send a bug report about this issue. The report "
-"will provide software maintainers with information essential in figuring out "
-"how to provide a bug fix for you.\n"
+"It looks like an application from the package <b>%s</b> has crashed on your system. It is a good idea to send a bug report about this issue. The report will provide software maintainers with information essential in figuring out how to provide a bug fix for you.\n"
"\n"
-"Please review the information that follows and modify it as needed to ensure "
-"your bug report does not contain any sensitive data you would rather not "
-"share.\n"
+"Please review the information that follows and modify it as needed to ensure your bug report does not contain any sensitive data you would rather not share.\n"
"\n"
-"Select where you would like to report the bug, and press 'Forward' to "
-"continue."
+"Select where you would like to report the bug, and press 'Forward' to continue."
msgstr ""
-"It looks like an application from the package <b>%s</b> has crashed on your "
-"system. It is a good idea to send a bug report about this issue. The report "
-"will provide software maintainers with information essential in figuring out "
-"how to provide a bug fix for you.\n"
+"It looks like an application from the package <b>%s</b> has crashed on your system. It is a good idea to send a bug report about this issue. The report will provide software maintainers with information essential in figuring out how to provide a bug fix for you.\n"
"\n"
-"Please review the information that follows and modify it as needed to ensure "
-"your bug report does not contain any sensitive data you would rather not "
-"share.\n"
+"Please review the information that follows and modify it as needed to ensure your bug report does not contain any sensitive data you would rather not share.\n"
"\n"
-"Select where you would like to report the bug, and press 'Forward' to "
-"continue."
+"Select where you would like to report the bug, and press 'Forward' to continue."
-#: ../src/gui/CReporterAssistant.py:548
+#: ../src/gui/CReporterAssistant.py:576
msgid "Only one reporter plugin is configured."
msgstr "ஒரே ஒர௠அறிகையிடà¯à®ªà®µà®°à¯ கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯ மடà¯à®Ÿà¯à®®à¯‡ கடà¯à®Ÿà®®à¯ˆà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯."
-#: ../src/gui/CReporterAssistant.py:554
+#: ../src/gui/CReporterAssistant.py:582
msgid "Send a bug report"
msgstr "ஒர௠பிழை அறிகà¯à®•à¯ˆ அனà¯à®ªà¯à®ªà¯"
-#: ../src/gui/CReporterAssistant.py:592
+#: ../src/gui/CReporterAssistant.py:620
msgid ""
-"Below is the backtrace associated with your crash. A crash backtrace "
-"provides developers with details about how the crash happened, helping them "
-"track down the source of the problem.\n"
+"Below is the backtrace associated with your crash. A crash backtrace provides developers with details about how the crash happened, helping them track down the source of the problem.\n"
"\n"
-"Please review the backtrace below and modify it as needed to ensure your bug "
-"report does not contain any sensitive data you would rather not share:"
+"Please review the backtrace below and modify it as needed to ensure your bug report does not contain any sensitive data you would rather not share:"
msgstr ""
-"Below is the backtrace associated with your crash. A crash backtrace "
-"provides developers with details about how the crash happened, helping them "
-"track down the source of the problem.\n"
+"Below is the backtrace associated with your crash. A crash backtrace provides developers with details about how the crash happened, helping them track down the source of the problem.\n"
"\n"
-"Please review the backtrace below and modify it as needed to ensure your bug "
-"report does not contain any sensitive data you would rather not share:"
+"Please review the backtrace below and modify it as needed to ensure your bug report does not contain any sensitive data you would rather not share:"
-#: ../src/gui/CReporterAssistant.py:663 ../src/gui/CReporterAssistant.py:676
-#: ../src/gui/CReporterAssistant.py:710
+#: ../src/gui/CReporterAssistant.py:691
+#: ../src/gui/CReporterAssistant.py:704
+#: ../src/gui/CReporterAssistant.py:738
#, python-format
msgid "Found %i occurence(s) [at: %i of %i]"
-msgstr ""
+msgstr "%i சிறபà¯à®ªà¯(களà¯) காணபà¯à®ªà®Ÿà¯à®Ÿà®© [இதிலà¯: %i ஆக %i]"
-#: ../src/gui/CReporterAssistant.py:747
+#: ../src/gui/CReporterAssistant.py:775
msgid "Search:"
-msgstr ""
+msgstr "தேடà¯:"
-#: ../src/gui/CReporterAssistant.py:778
+#: ../src/gui/CReporterAssistant.py:806
msgid "Refresh"
msgstr "பà¯à®¤à¯à®ªà¯à®ªà®¿"
-#: ../src/gui/CReporterAssistant.py:780
+#: ../src/gui/CReporterAssistant.py:808
msgid "Copy"
msgstr "நகலெடà¯"
-#: ../src/gui/CReporterAssistant.py:786
+#: ../src/gui/CReporterAssistant.py:814
msgid "I agree with submitting the backtrace"
msgstr "நான௠பேகà¯à®Ÿà¯à®°à¯‡à®¸à¯ˆ சமரà¯à®ªà¯à®ªà®¿à®•à¯à®• ஒதà¯à®¤à¯à®•à¯à®•à¯Šà®³à¯à®•à®¿à®±à¯‡à®©à¯"
-#: ../src/gui/CReporterAssistant.py:791
+#: ../src/gui/CReporterAssistant.py:819
msgid "Approve the backtrace"
msgstr "பேகà¯à®Ÿà¯à®°à¯‡à®¸à¯ˆ அனà¯à®®à®¤à®¿"
-#: ../src/gui/CReporterAssistant.py:834
+#: ../src/gui/CReporterAssistant.py:862
msgid "You need to fill the how to before you can proceed..."
-msgstr ""
+msgstr "நீஙà¯à®•à®³à¯ செயறà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®µà®¤à®±à¯à®•à¯ à®®à¯à®©à¯ எபà¯à®ªà®Ÿà®¿ நிறà¯à®µ வேணà¯à®Ÿà¯à®®à¯†à®© அறிய வேணà¯à®Ÿà¯à®®à¯..."
-#: ../src/gui/CReporterAssistant.py:857
+#: ../src/gui/CReporterAssistant.py:885
msgid "How did this crash happen (step-by-step)? How would you reproduce it?"
-msgstr ""
-"இநà¯à®¤ கà¯à®°à®¾à®·à¯ எவà¯à®µà®¾à®±à¯ à®à®±à¯à®ªà®Ÿà¯à®Ÿà®¤à¯ (படிபà¯à®ªà®Ÿà®¿à®¯à®¾à®•)? நீஙà¯à®•à®³à¯ அதை எவà¯à®µà®¾à®±à¯ மற௠உறà¯à®ªà®¤à¯à®¤à®¿ செயà¯à®¤à¯€à®°à¯à®•à®³à¯?"
+msgstr "இநà¯à®¤ கà¯à®°à®¾à®·à¯ எவà¯à®µà®¾à®±à¯ à®à®±à¯à®ªà®Ÿà¯à®Ÿà®¤à¯ (படிபà¯à®ªà®Ÿà®¿à®¯à®¾à®•)? நீஙà¯à®•à®³à¯ அதை எவà¯à®µà®¾à®±à¯ மற௠உறà¯à®ªà®¤à¯à®¤à®¿ செயà¯à®¤à¯€à®°à¯à®•à®³à¯?"
-#: ../src/gui/CReporterAssistant.py:877
-msgid ""
-"Are there any comments you would like to share with the software maintainers?"
+#: ../src/gui/CReporterAssistant.py:905
+msgid "Are there any comments you would like to share with the software maintainers?"
msgstr "மெனà¯à®ªà¯Šà®°à¯à®³à¯ பராமரிபà¯à®ªà®µà®°à¯à®•à®³à®¿à®Ÿà®®à¯ à®à®¤à®¾à®µà®¤à¯ கரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯ˆ பகிரà¯à®¨à¯à®¤à¯ கொளà¯à®³ வேணà¯à®Ÿà¯à®®à®¾?"
-#: ../src/gui/CReporterAssistant.py:897
+#: ../src/gui/CReporterAssistant.py:925
msgid "Provide additional details"
msgstr "கூடà¯à®¤à®²à¯ விவரஙà¯à®•à®³à¯ˆ கொடà¯"
-#: ../src/gui/CReporterAssistant.py:904
-msgid ""
-"<b>Tip:</b> Your comments are not private. Please watch what you say "
-"accordingly."
-msgstr ""
-"<b>தà¯à®£à¯à®•à¯à®•à¯:</b> உஙà¯à®•à®³à¯ கரà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à¯ தனிபà¯à®ªà®Ÿà¯à®Ÿà®µà¯ˆ அலà¯à®². நீஙà¯à®•à®³à¯ சொலà¯à®µà®¤à®±à¯à®•à¯ à®à®±à¯à®ª பாரà¯à®•à¯à®•à®µà¯à®®à¯."
+#: ../src/gui/CReporterAssistant.py:932
+msgid "<b>Tip:</b> Your comments are not private. Please watch what you say accordingly."
+msgstr "<b>தà¯à®£à¯à®•à¯à®•à¯:</b> உஙà¯à®•à®³à¯ கரà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à¯ தனிபà¯à®ªà®Ÿà¯à®Ÿà®µà¯ˆ அலà¯à®². நீஙà¯à®•à®³à¯ சொலà¯à®µà®¤à®±à¯à®•à¯ à®à®±à¯à®ª பாரà¯à®•à¯à®•à®µà¯à®®à¯."
-#: ../src/gui/CReporterAssistant.py:945
+#: ../src/gui/CReporterAssistant.py:973
msgid "Confirm and send the report"
msgstr "உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ அறிகà¯à®•à¯ˆà®¯à¯ˆ அனà¯à®ªà¯à®ªà¯"
-#: ../src/gui/CReporterAssistant.py:947
-msgid ""
-"Below is a summary of your bug report. Please click 'Apply' to submit it."
-msgstr ""
-"கீழே உளà¯à®³à®¤à¯ உஙà¯à®•à®³à¯ பிழை அறிகà¯à®•à¯ˆà®¯à®¿à®©à¯ ஒர௠சà¯à®°à¯à®•à¯à®•à®®à¯. 'செயலà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯' எனà¯à®ªà®¤à¯ˆ கிளிக௠செயà¯à®¤à¯ "
-"சமரà¯à®ªà®¿à®•à¯à®•à®µà¯à®®à¯."
+#: ../src/gui/CReporterAssistant.py:975
+msgid "Below is a summary of your bug report. Please click 'Apply' to submit it."
+msgstr "கீழே உளà¯à®³à®¤à¯ உஙà¯à®•à®³à¯ பிழை அறிகà¯à®•à¯ˆà®¯à®¿à®©à¯ ஒர௠சà¯à®°à¯à®•à¯à®•à®®à¯. 'செயலà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯' எனà¯à®ªà®¤à¯ˆ கிளிக௠செயà¯à®¤à¯ சமரà¯à®ªà®¿à®•à¯à®•à®µà¯à®®à¯."
-#: ../src/gui/CReporterAssistant.py:952
+#: ../src/gui/CReporterAssistant.py:980
msgid "<b>Basic details</b>"
msgstr "<b>அடிபà¯à®ªà®Ÿà¯ˆ விவரஙà¯à®•à®³à¯</b>"
#. left table
-#: ../src/gui/CReporterAssistant.py:959
+#: ../src/gui/CReporterAssistant.py:987
msgid "Component"
msgstr "கூறà¯"
-#: ../src/gui/CReporterAssistant.py:960
+#: ../src/gui/CReporterAssistant.py:988
msgid "Package"
msgstr "தொகà¯à®ªà¯à®ªà¯"
-#: ../src/gui/CReporterAssistant.py:961
+#: ../src/gui/CReporterAssistant.py:989
msgid "Executable"
msgstr "இயஙà¯à®•à®•à¯à®•à¯‚டியதà¯"
-#: ../src/gui/CReporterAssistant.py:962
+#: ../src/gui/CReporterAssistant.py:990
msgid "Cmdline"
msgstr "Cmdline"
#. right table
-#: ../src/gui/CReporterAssistant.py:964
+#: ../src/gui/CReporterAssistant.py:992
msgid "Architecture"
msgstr "கணினி"
-#: ../src/gui/CReporterAssistant.py:965
+#: ../src/gui/CReporterAssistant.py:993
msgid "Kernel"
msgstr "கரà¯à®©à®²à¯"
-#: ../src/gui/CReporterAssistant.py:966
+#: ../src/gui/CReporterAssistant.py:994
msgid "Release"
msgstr "வெளியீடà¯"
-#: ../src/gui/CReporterAssistant.py:967
+#: ../src/gui/CReporterAssistant.py:995
msgid "Reason"
msgstr "காரணமà¯"
-#: ../src/gui/CReporterAssistant.py:978 ../src/gui/report.glade.h:3
+#: ../src/gui/CReporterAssistant.py:1006
+#: ../src/gui/report.glade.h:3
msgid "<b>Backtrace</b>"
msgstr "<b>பேகà¯à®Ÿà¯à®°à¯‡à®¸à¯</b>"
-#: ../src/gui/CReporterAssistant.py:981
+#: ../src/gui/CReporterAssistant.py:1009
msgid "Click to view..."
msgstr "பாரà¯à®•à¯à®• கிளிக௠செயà¯"
-#: ../src/gui/CReporterAssistant.py:993
+#: ../src/gui/CReporterAssistant.py:1021
msgid "<b>Steps to reproduce:</b>"
msgstr "<b>மறà¯à®‰à®±à¯à®ªà®¤à¯à®¤à®¿ செயà¯à®µà®¤à®±à¯à®•à®¾à®© படிகளà¯</b>"
-#: ../src/gui/CReporterAssistant.py:1014
+#: ../src/gui/CReporterAssistant.py:1042
msgid "<b>Comments:</b>"
msgstr "<b>கரà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à¯:</b>"
-#: ../src/gui/CReporterAssistant.py:1017
+#: ../src/gui/CReporterAssistant.py:1045
msgid "No comment provided!"
msgstr "கà¯à®±à®¿à®ªà¯à®ªà¯à®°à¯ˆ வழஙà¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ!"
-#: ../src/gui/CReporterAssistant.py:1053
+#: ../src/gui/CReporterAssistant.py:1081
msgid "Finished sending the bug report"
msgstr "பிழை அறிகà¯à®•à¯ˆ அனà¯à®ªà¯à®ªà®¿à®¯à®¾à®•à®¿à®µà®¿à®Ÿà¯à®Ÿà®¤à¯"
-#: ../src/gui/CReporterAssistant.py:1057
+#: ../src/gui/CReporterAssistant.py:1085
msgid "<b>Bug reports:</b>"
msgstr "<b>பிழை அறிகà¯à®•à¯ˆà®•à®³à¯:</b>"
@@ -976,14 +935,13 @@ msgstr "PluginDialog விடà¯à®œà¯†à®Ÿà¯à®Ÿà¯ˆ UI விளகà¯à®•à®¤à¯à
#, python-format
msgid ""
"No UI for the plugin <b>%s</b>, this is probably a bug.\n"
-"Please report it at <a href=\"https://fedorahosted.org/abrt/newticket"
-"\">https://fedorahosted.org/abrt/newticket</a>"
+"Please report it at <a href=\"https://fedorahosted.org/abrt/newticket\">https://fedorahosted.org/abrt/newticket</a>"
msgstr ""
"கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯ <b>%s</b>கà¯à®•à¯ UI இலà¯à®²à¯ˆ, இத௠ஒர௠பிழையாக இரà¯à®•à¯à®•à®²à®¾à®®à¯.\n"
-"அதை <a href=\"https://fedorahosted.org/abrt/newticket\">https://fedorahosted."
-"org/abrt/newticket</a>இல௠அறிகà¯à®•à¯ˆà®¯à®¿à®Ÿà®µà¯à®®à¯"
+"அதை <a href=\"https://fedorahosted.org/abrt/newticket\">https://fedorahosted.org/abrt/newticket</a>இல௠அறிகà¯à®•à¯ˆà®¯à®¿à®Ÿà®µà¯à®®à¯"
-#: ../src/gui/PluginSettingsUI.py:60 ../src/gui/PluginSettingsUI.py:86
+#: ../src/gui/PluginSettingsUI.py:60
+#: ../src/gui/PluginSettingsUI.py:86
msgid "Combo box is not implemented"
msgstr "காமà¯à®ªà¯‹ பெடà¯à®Ÿà®¿ செயலà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ"
@@ -1002,9 +960,8 @@ msgid "Name"
msgstr "பெயரà¯"
#: ../src/gui/PluginsSettingsDialog.py:118
-#, fuzzy
msgid "Please select a plugin from the list to edit its options."
-msgstr "ஒர௠கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯ˆ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®¤à¯à®¤à¯ அதன௠விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯ˆ திரà¯à®¤à¯à®¤à®µà¯à®®à¯"
+msgstr "ஒர௠கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯ˆ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®¤à¯à®¤à¯ அதன௠விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯ˆ திரà¯à®¤à¯à®¤à®µà¯à®®à¯."
#: ../src/gui/PluginsSettingsDialog.py:126
#, python-format
@@ -1017,11 +974,13 @@ msgstr ""
"\n"
"%s"
-#: ../src/gui/progress_window.glade.h:1 ../src/gui/report.glade.h:17
+#: ../src/gui/progress_window.glade.h:1
+#: ../src/gui/report.glade.h:17
msgid "Details"
msgstr "விவரஙà¯à®•à®³à¯"
-#: ../src/gui/progress_window.glade.h:2 ../src/gui/report.glade.h:21
+#: ../src/gui/progress_window.glade.h:2
+#: ../src/gui/report.glade.h:21
msgid "Please wait..."
msgstr "காதà¯à®¤à®¿à®°à¯à®•à¯à®•à®µà¯à®®à¯..."
@@ -1105,7 +1064,8 @@ msgstr "அறிகà¯à®•à¯ˆ அனà¯à®ªà¯à®ªà¯"
msgid "Show log"
msgstr "பதிவை காடà¯à®Ÿà¯"
-#: ../src/gui/SettingsDialog.py:34 ../src/gui/SettingsDialog.py:51
+#: ../src/gui/SettingsDialog.py:34
+#: ../src/gui/SettingsDialog.py:51
msgid "<b>Select plugin</b>"
msgstr "<b>கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯ˆ தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯</b>"
@@ -1214,24 +1174,19 @@ msgid "Wrong Settings Detected"
msgstr "தவறான அமைவà¯à®•à®³à¯ கணà¯à®Ÿà®±à®¿à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯"
#: ../src/gui/settings_wizard.glade.h:3
-msgid ""
-"Wrong settings were detected for some of the enabled reporter plugins. "
-"Please use the buttons below to open the respective configuration and fix it "
-"before you proceed, otherwise, the reporting process may fail.\n"
-msgstr ""
-"Wrong settings were detected for some of the enabled reporter plugins. "
-"Please use the buttons below to open the respective configuration and fix it "
-"before you proceed, otherwise, the reporting process may fail.\n"
+msgid "Wrong settings were detected for some of the enabled reporter plugins. Please use the buttons below to open the respective configuration and fix it before you proceed, otherwise, the reporting process may fail.\n"
+msgstr "Wrong settings were detected for some of the enabled reporter plugins. Please use the buttons below to open the respective configuration and fix it before you proceed, otherwise, the reporting process may fail.\n"
-#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.cpp:47
+#: ../src/lib/abrt_curl.c:170
+#: ../src/plugins/abrt-action-upload.cpp:46
#, c-format
msgid "Uploaded: %llu of %llu kbytes"
-msgstr ""
+msgstr "பதிவேறà¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯: %llu இல௠%llu கேபைடà¯à®Ÿà¯à®•à®³à¯"
#: ../src/lib/parse_options.c:11
#, c-format
msgid "Usage: %s\n"
-msgstr ""
+msgstr "பயனà¯à®ªà®¾à®Ÿà¯: %s\n"
#: ../src/plugins/abrt-action-analyze-c.c:154
msgid ""
@@ -1239,6 +1194,9 @@ msgid ""
"\n"
"Calculates and saves UUID of coredumps"
msgstr ""
+" [-vs] -d DIR\n"
+"\n"
+"UUID கோரà¯à®Ÿà®®à¯à®ªà¯à®ªà¯à®•à®³à¯ˆ சேமிதà¯à®¤à¯ கணகà¯à®•à®¿à®Ÿà®µà¯à®®à¯"
#: ../src/plugins/abrt-action-analyze-oops.c:131
msgid ""
@@ -1246,6 +1204,9 @@ msgid ""
"\n"
"Calculates and saves UUID and DUPHASH of oops crash dumps"
msgstr ""
+" [-vs] -d DIR\n"
+"\n"
+"UUID மறà¯à®±à¯à®®à¯ DUPHASH இன௠டமà¯à®ªà®•à®³à¯ˆ கணகà¯à®•à®¿à®Ÿà¯à®Ÿà¯ சேமிகà¯à®•à®¿à®±à®¤à¯"
#: ../src/plugins/abrt-action-analyze-python.c:36
msgid ""
@@ -1253,74 +1214,69 @@ msgid ""
"\n"
"Calculates and saves UUID and DUPHASH of python crash dumps"
msgstr ""
+" [-vs] -d DIR\n"
+"\n"
+"UUID மறà¯à®±à¯à®®à¯ DUPHASH இன௠பைதà¯à®¤à®¾à®©à¯ டமà¯à®ªà®™à¯à®•à®³à¯ˆ கணகà¯à®•à®¿à®Ÿà¯à®Ÿà¯ சேமிகà¯à®•à®¿à®±à®¤à¯UUID மறà¯à®±à¯à®®à¯ DUPHASH இன௠பைதà¯à®¤à®¾à®©à¯ டà¯à®®à¯UUID மறà¯à®±à¯à®®à¯ DUPHASH இன௠"
-#: ../src/plugins/abrt-action-bugzilla.cpp:532
+#: ../src/plugins/abrt-action-bugzilla.cpp:531
#, c-format
msgid "New bug id: %i"
msgstr "பà¯à®¤à®¿à®¯ பிழை கà¯à®±à®¿à®¯à¯€à®Ÿà¯: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:645
+#: ../src/plugins/abrt-action-bugzilla.cpp:659
#, c-format
-msgid "Can't open '%s'"
-msgstr ""
-
-#: ../src/plugins/abrt-action-bugzilla.cpp:665
-#, fuzzy, c-format
msgid "Empty login or password, please check %s"
-msgstr ""
-"வெறà¯à®±à¯ பà¯à®•à¯à®ªà®¤à®¿à®µà¯ அலà¯à®²à®¤à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯.\n"
-"சரி பாரà¯à®•à¯à®•à®µà¯à®®à¯"
+msgstr "பà¯à®•à¯à®ªà®¤à®¿à®µà¯ அலà¯à®²à®¤à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ காலியாகà¯à®•à¯, %s஠சரி பாரà¯à®•à¯à®•à®µà¯à®®à¯"
-#: ../src/plugins/abrt-action-bugzilla.cpp:683
+#: ../src/plugins/abrt-action-bugzilla.cpp:677
msgid "Logging into bugzilla..."
msgstr "bugzillaவில௠உளà¯à®¨à¯à®´à¯ˆà®•à®¿à®±à®¤à¯..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:686
+#: ../src/plugins/abrt-action-bugzilla.cpp:680
msgid "Checking for duplicates..."
msgstr "போலிகளà¯à®•à¯à®•à¯ சரிபாரà¯à®•à¯à®•à®¿à®±à®¤à¯..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:707
-#: ../src/plugins/abrt-action-bugzilla.cpp:743
+#: ../src/plugins/abrt-action-bugzilla.cpp:701
+#: ../src/plugins/abrt-action-bugzilla.cpp:737
msgid "Missing mandatory member 'bugs'"
msgstr "விடà¯à®ªà®Ÿà¯à®Ÿ அவசியமான உறà¯à®ªà¯à®ªà®¿à®©à®°à¯ 'பிழைகளà¯'"
-#: ../src/plugins/abrt-action-bugzilla.cpp:726
-#: ../src/plugins/abrt-action-bugzilla.cpp:759
-#: ../src/plugins/abrt-action-bugzilla.cpp:834
+#: ../src/plugins/abrt-action-bugzilla.cpp:720
+#: ../src/plugins/abrt-action-bugzilla.cpp:753
+#: ../src/plugins/abrt-action-bugzilla.cpp:830
msgid "get_bug_info() failed. Could not collect all mandatory information"
-msgstr ""
-"get_bug_info() செயலிழகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯. அனைதà¯à®¤à¯ அவசிய தகவலையà¯à®®à¯ சேகரிகà¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ"
+msgstr "get_bug_info() செயலிழகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯. அனைதà¯à®¤à¯ அவசிய தகவலையà¯à®®à¯ சேகரிகà¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ"
-#: ../src/plugins/abrt-action-bugzilla.cpp:775
+#: ../src/plugins/abrt-action-bugzilla.cpp:769
msgid "Creating a new bug..."
msgstr "பà¯à®¤à®¿à®¯ பிழையை உரà¯à®µà®¾à®•à¯à®•à¯à®•à®¿à®±à®¤à¯..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:780
+#: ../src/plugins/abrt-action-bugzilla.cpp:774
msgid "Bugzilla entry creation failed"
msgstr "Bugzilla உளà¯à®³à¯€à®Ÿà¯ உரà¯à®µà®¾à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ"
-#: ../src/plugins/abrt-action-bugzilla.cpp:790
-#: ../src/plugins/abrt-action-bugzilla.cpp:887
+#: ../src/plugins/abrt-action-bugzilla.cpp:786
+#: ../src/plugins/abrt-action-bugzilla.cpp:883
msgid "Logging out..."
msgstr "வெளியேறà¯à®•à®¿à®±à®¤à¯..."
#. decision based on state
-#: ../src/plugins/abrt-action-bugzilla.cpp:808
+#: ../src/plugins/abrt-action-bugzilla.cpp:804
#, c-format
msgid "Bug is already reported: %i"
msgstr "பிழை à®à®±à¯à®•à®©à®µà¯‡ அறிகà¯à®•à¯ˆà®¯à®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:819
+#: ../src/plugins/abrt-action-bugzilla.cpp:815
#, c-format
msgid "Bugzilla couldn't find parent of bug %d"
msgstr "Bugzilla பிழை(%d) மூலதà¯à®¤à¯ˆ அறிய à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ"
-#: ../src/plugins/abrt-action-bugzilla.cpp:848
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-bugzilla.cpp:844
+#, c-format
msgid "Add %s to CC list"
-msgstr "%s கà¯à®•à¯ CC படà¯à®Ÿà®¿à®¯à®²à¯ˆà®šà¯ சேரà¯"
+msgstr "%s à® CC படà¯à®Ÿà®¿à®¯à®²à¯à®•à¯à®•à¯à®šà¯ சேரà¯"
-#: ../src/plugins/abrt-action-bugzilla.cpp:872
+#: ../src/plugins/abrt-action-bugzilla.cpp:868
#, c-format
msgid "Adding new comment to bug %d"
msgstr "பிழையில௠பà¯à®¤à®¿à®¯ கடà¯à®Ÿà®³à¯ˆà®¯à¯ˆà®šà¯ சேரà¯(%d)"
@@ -1328,162 +1284,162 @@ msgstr "பிழையில௠பà¯à®¤à®¿à®¯ கடà¯à®Ÿà®³à¯ˆà®¯à¯ˆà®šà¯
#: ../src/plugins/abrt-action-generate-backtrace.c:319
#, c-format
msgid "Backtrace parsing failed for %s"
-msgstr ""
+msgstr "பேகà¯à®Ÿà¯à®°à¯‡à®¸à¯ %s-கà¯à®•à¯ பகà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆà®ªà¯‡à®•à¯à®Ÿà¯‡"
#: ../src/plugins/abrt-action-install-debuginfo.py:72
#, python-format
msgid "Extracting cpio from %s"
-msgstr ""
+msgstr "cpio à® %s லிரà¯à®¨à¯à®¤à¯ இழà¯à®•à¯à®•à®¿à®±à®¤à¯"
#: ../src/plugins/abrt-action-install-debuginfo.py:77
msgid "Can't write to:"
-msgstr ""
+msgstr "இதறà¯à®•à¯ எழà¯à®¤ à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯:"
#: ../src/plugins/abrt-action-install-debuginfo.py:87
msgid "Removing the temporary rpm file"
-msgstr ""
+msgstr "தறà¯à®•à®¾à®²à®¿à®• rpm கோபà¯à®ªà®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ நீகà¯à®•à¯à®•à®¿à®±à®¤à¯"
#: ../src/plugins/abrt-action-install-debuginfo.py:91
#, python-format
msgid "Can't extract package: %s"
-msgstr ""
+msgstr "தொகà¯à®ªà¯à®ªà¯ˆ இழà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:99
#, python-format
msgid "Caching files from %s made from %s"
-msgstr ""
+msgstr "%s-லிரà¯à®¨à¯à®¤à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ %s கோபà¯à®ªà¯à®•à®³à¯ˆ மாறà¯à®±à¯à®•à®¿à®±à®¤à¯"
#: ../src/plugins/abrt-action-install-debuginfo.py:107
msgid "Removing the temporary cpio file"
-msgstr ""
+msgstr "தறà¯à®•à®¾à®²à®¿à®• cpio கோபà¯à®ªà¯ˆ நீகà¯à®•à¯à®•à®¿à®±à®¤à¯"
#: ../src/plugins/abrt-action-install-debuginfo.py:110
#, python-format
msgid "Can't extract files from: %s"
-msgstr ""
+msgstr "இதிலிரà¯à®¨à¯à®¤à¯ கோபà¯à®ªà¯à®•à®³à¯ˆ நீகà¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯: %s "
#: ../src/plugins/abrt-action-install-debuginfo.py:134
#: ../src/plugins/abrt-action-install-debuginfo.py:140
#, python-format
msgid "Downloading (%i of %i) %.30s : %.3s %%"
-msgstr ""
+msgstr "பதிவிறகà¯à®•à¯à®•à®¿à®±à®¤à¯ (%iகà¯à®•à¯ %i) %.30s : %.3s %%"
#: ../src/plugins/abrt-action-install-debuginfo.py:169
-#, fuzzy
msgid "Searching the missing debuginfo packages"
-msgstr "debug-info தொகà¯à®ªà¯à®ªà¯à®•à®³à¯à®•à¯à®•à¯ தேடà¯à®•à®¿à®±à®¤à¯..."
+msgstr "விடà¯à®ªà®Ÿà¯à®Ÿ பிழைதிரà¯à®¤à¯à®¤ தகவல௠தொகà¯à®ªà¯à®ªà¯à®•à®³à¯à®•à¯à®•à¯ தேடà¯à®•à®¿à®±à®¤à¯"
#: ../src/plugins/abrt-action-install-debuginfo.py:224
#, python-format
msgid "To download: (%.2f) M / Installed size: %.2f M"
-msgstr ""
+msgstr "பதிவிறகà¯à®•: (%.2f) M / நிறà¯à®µà®ªà¯à®ªà®Ÿà¯à®Ÿ அளவà¯: %.2f M"
#: ../src/plugins/abrt-action-install-debuginfo.py:240
msgid "Is this ok? [y/N] "
-msgstr ""
+msgstr "இத௠சரியா? [y/N] "
#: ../src/plugins/abrt-action-install-debuginfo.py:257
#, python-format
msgid "Downloading package %s failed"
-msgstr ""
+msgstr "தொகà¯à®ªà¯à®ªà¯ %s பதிவிறகà¯à®•à¯à®¤à®²à¯ தோலà¯à®µà®¿à®¯à¯à®±à¯à®±à®¤à¯"
#. recursively delete the temp dir on failure
#: ../src/plugins/abrt-action-install-debuginfo.py:268
msgid "Unpacking failed, aborting download..."
-msgstr ""
+msgstr "தொகà¯à®ªà¯à®ªà¯à®¨à¯€à®•à¯à®•à®²à¯ தோலà¯à®µà®¿à®¯à¯à®±à¯à®±à®¤à¯, பதிவிறகà¯à®•à®¤à¯à®¤à¯ˆ ஒதà¯à®•à¯à®•à¯à®•à®¿à®±à®¤à¯..."
#: ../src/plugins/abrt-action-install-debuginfo.py:275
#, python-format
msgid "All downloaded packages have been extracted, removing %s"
-msgstr ""
+msgstr "அனைதà¯à®¤à¯ பதிவிறகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ தொகà¯à®ªà¯à®ªà¯à®•à®³à¯, removing %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:280
#, python-format
msgid "Can't remove %s, probably contains an error log"
-msgstr ""
+msgstr "%s஠நீகà¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ, ஒர௠பதிவ௠பிழையால௠இரà¯à®•à¯à®•à®²à®¾à®®à¯"
#: ../src/plugins/abrt-action-install-debuginfo.py:305
#, python-format
msgid "Analyzing corefile: %(corefile_path)s"
-msgstr ""
+msgstr "கோரà¯à®•à¯‹à®ªà¯à®ªà¯ˆ ஆயà¯à®¨à¯à®¤à®±à®¿à®•à®¿à®±à®¤à¯: %(corefile_path)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:384
#, python-format
msgid "Can't remove %(tmpdir_path)s: %(reason)s"
-msgstr ""
+msgstr "%(tmpdir_path)s-஠நீகà¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯: %(reason)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:394
msgid "Exiting on user Command"
-msgstr ""
+msgstr "பயனர௠கடà¯à®Ÿà®³à¯ˆà®¯à®¿à®²à¯ வெளியேறà¯à®•à®¿à®±à®¤à¯"
#: ../src/plugins/abrt-action-install-debuginfo.py:413
#, python-format
msgid "Usage: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
-msgstr ""
+msgstr "பயனà¯à®ªà®¾à®Ÿà¯: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
#: ../src/plugins/abrt-action-install-debuginfo.py:442
-#, fuzzy
msgid "You have to specify the path to coredump."
-msgstr "நகலெடà¯à®•à¯à®• நீஙà¯à®•à®³à¯ ஒர௠கà¯à®°à®¾à®·à¯ˆ தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯."
+msgstr " coredump பாதையை நீஙà¯à®•à®³à¯ தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯."
#: ../src/plugins/abrt-action-install-debuginfo.py:446
-#, fuzzy
msgid "You have to specify the path to cachedir."
-msgstr "நகலெடà¯à®•à¯à®• நீஙà¯à®•à®³à¯ ஒர௠கà¯à®°à®¾à®·à¯ˆ தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯."
+msgstr "cachedir பாதையை நீஙà¯à®•à®³à¯ தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯."
#: ../src/plugins/abrt-action-install-debuginfo.py:450
-#, fuzzy
msgid "You have to specify the path to tmpdir."
-msgstr "நகலெடà¯à®•à¯à®• நீஙà¯à®•à®³à¯ ஒர௠கà¯à®°à®¾à®·à¯ˆ தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯."
+msgstr "tmpdir பாதையை நீஙà¯à®•à®³à¯ கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿ வேணà¯à®Ÿà¯à®®à¯."
#: ../src/plugins/abrt-action-install-debuginfo.py:463
msgid "All debuginfo seems to be available"
-msgstr ""
+msgstr "அனைதà¯à®¤à¯ பிழைதிரà¯à®¤à¯à®¤ தகவல௠கிடைகà¯à®•à¯à®®à®¾à®±à¯ தெரிகிறதà¯"
#: ../src/plugins/abrt-action-install-debuginfo.py:470
-#, fuzzy
msgid "Complete!"
-msgstr "கூறà¯"
+msgstr "à®®à¯à®Ÿà®¿à®¤à¯à®¤à®²à¯!"
-#: ../src/plugins/abrt-action-kerneloops.cpp:111
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-kerneloops.cpp:105
+#, c-format
msgid "Submitting oops report to %s"
-msgstr "'%s'கà¯à®•à¯ அறிகà¯à®•à¯ˆà®¯à¯ˆ எழà¯à®¤à®µà¯à®®à¯"
+msgstr "'%s'கà¯à®•à¯ ஊபà¯à®¸à¯ அறிகà¯à®•à¯ˆà®¯à¯ˆ சமரà¯à®ªà®¿à®•à¯à®•à®¿à®±à®¤à¯"
-#: ../src/plugins/abrt-action-mailx.cpp:114
+#: ../src/plugins/abrt-action-mailx.cpp:109
msgid "Sending an email..."
msgstr "ஒர௠மினà¯à®©à®žà¯à®šà®²à¯ அனà¯à®ªà¯à®ªà¯à®•à®¿à®±à®¤à¯..."
-#: ../src/plugins/abrt-action-mailx.cpp:138
+#: ../src/plugins/abrt-action-mailx.cpp:135
msgid ""
" [-v] -d DIR [-c CONFFILE]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d DIR [-c CONFFILE]\n"
+"\n"
+"à®…à®´à¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿ tarball கà¯à®°à®¾à®·à¯ டமà¯à®ªà¯à®ªà®¿à®±à¯à®•à¯ பதிவேறà¯à®±à¯"
-#: ../src/plugins/abrt-action-mailx.cpp:151
-#: ../src/plugins/abrt-action-upload.cpp:267
-#, fuzzy
+#: ../src/plugins/abrt-action-mailx.cpp:148
+#: ../src/plugins/abrt-action-upload.cpp:262
msgid "Config file"
-msgstr "Logger கோபà¯à®ªà¯:"
+msgstr "கோபà¯à®ªà¯ˆ கடà¯à®Ÿà®®à¯ˆ"
-#: ../src/plugins/abrt-action-print.cpp:39
+#: ../src/plugins/abrt-action-print.cpp:38
msgid ""
" [-v] [-o FILE] -d DIR\n"
"\n"
"Print information about the crash to standard output"
msgstr ""
+" [-v] [-o FILE] -d DIR\n"
+"\n"
+"நிலையான வெளிபà¯à®ªà®¾à®Ÿà¯à®Ÿà®¿à®±à¯à®•à¯ கà¯à®°à®¾à®·à¯ˆà®ªà¯ பறà¯à®±à®¿à®¯ தகவலை அசà¯à®šà®¿à®Ÿà®µà¯à®®à¯"
-#: ../src/plugins/abrt-action-print.cpp:51
+#: ../src/plugins/abrt-action-print.cpp:50
msgid "Output file"
-msgstr ""
+msgstr "வெளியேறà¯à®®à¯ கோபà¯à®ªà¯"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.cpp:91
#, c-format
msgid "The report was appended to %s"
msgstr "சேவை %sகà¯à®•à¯ சேரà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.cpp:91
#, c-format
msgid "The report was stored to %s"
msgstr "அறிகà¯à®•à¯ˆ %sஇல௠சேமிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯"
@@ -1491,48 +1447,48 @@ msgstr "அறிகà¯à®•à¯ˆ %sஇல௠சேமிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
#. error msg is already logged by dd_opendir
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
-#: ../src/plugins/abrt-action-rhtsupport.cpp:43
-#: ../src/plugins/abrt-action-upload.cpp:121
+#: ../src/plugins/abrt-action-rhtsupport.cpp:41
+#: ../src/plugins/abrt-action-upload.cpp:120
msgid "Compressing data"
-msgstr ""
+msgstr "à®…à®´à¯à®¤à¯à®¤à¯à®®à¯ தரவà¯"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:78
-#, fuzzy
+#: ../src/plugins/abrt-action-rhtsupport.cpp:69
msgid "Empty login or password, please check RHTSupport.conf"
-msgstr ""
-"வெறà¯à®±à¯ பà¯à®•à¯à®ªà®¤à®¿à®µà¯ அலà¯à®²à®¤à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯.\n"
-"சரி பாரà¯à®•à¯à®•à®µà¯à®®à¯"
+msgstr "பà¯à®•à¯à®ªà®¤à®¿à®µà¯ அலà¯à®²à®¤à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ காலியாகà¯à®•à¯, RHTதà¯à®£à¯ˆ.கடà¯à®Ÿà®®à¯ˆà®¯à¯ˆ சரிபாரà¯"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:194
+#: ../src/plugins/abrt-action-rhtsupport.cpp:188
msgid "Creating a new case..."
msgstr "ஒர௠பà¯à®¤à®¿à®¯ வழகà¯à®•à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯à®•à®¿à®±à®¤à¯..."
-#: ../src/plugins/abrt-action-upload.cpp:65
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-upload.cpp:64
+#, c-format
msgid "Sending %s to %s"
-msgstr "காபà¯à®ªà¯ %sà® %sவழியாக அனà¯à®ªà¯à®ªà¯à®•à®¿à®±à®¤à¯"
+msgstr "%sà® %sகà¯à®•à¯ அனà¯à®ªà¯à®ªà¯à®•à®¿à®±à®¤à¯"
#. This ends up a "reporting status message" in abrtd
-#: ../src/plugins/abrt-action-upload.cpp:98
+#: ../src/plugins/abrt-action-upload.cpp:97
#, c-format
msgid "Successfully sent %s to %s"
-msgstr ""
+msgstr "%s ஆல௠%s- கà¯à®•à¯ வெறà¯à®±à®¿à®•à®°à®•à®®à®¾à®• அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯"
-#: ../src/plugins/abrt-action-upload.cpp:219
+#: ../src/plugins/abrt-action-upload.cpp:214
#, c-format
msgid "Archive is created: '%s'"
-msgstr ""
+msgstr "ஆரà¯à®šà¯à®šà®¿à®µà¯ உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯: '%s'"
-#: ../src/plugins/abrt-action-upload.cpp:253
+#: ../src/plugins/abrt-action-upload.cpp:248
msgid ""
" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
+"\n"
+"à®…à®´à¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿ tarball கà¯à®°à®¾à®·à¯ டமà¯à®ªà¯à®ªà®¿à®±à¯à®•à¯ பதிவேறà¯à®±à¯"
-#: ../src/plugins/abrt-action-upload.cpp:268
+#: ../src/plugins/abrt-action-upload.cpp:263
msgid "Base URL to upload to"
-msgstr ""
+msgstr "பதிவேறà¯à®±à¯à®µà®¤à®±à¯à®•à¯ தள URL"
#: ../src/plugins/Bugzilla.glade.h:1
msgid "<b>Bugzilla plugin configuration</b>"
@@ -1550,27 +1506,26 @@ msgstr "இதà¯à®µà®°à¯ˆ ஒர௠கணகà¯à®•à¯ எதà¯à®µà¯à®®à¯ à®
msgid "Login(email):"
msgstr "பà¯à®•à¯à®ªà®¤à®¿à®µà¯(மினà¯à®©à®žà¯à®šà®²à¯):"
-#: ../src/plugins/Bugzilla.glade.h:5 ../src/plugins/RHTSupport.glade.h:3
+#: ../src/plugins/Bugzilla.glade.h:5
+#: ../src/plugins/RHTSupport.glade.h:3
msgid "Password:"
msgstr "கடவà¯à®šà¯à®šà¯Šà®²à¯:"
-#: ../src/plugins/Bugzilla.glade.h:6 ../src/plugins/RHTSupport.glade.h:5
+#: ../src/plugins/Bugzilla.glade.h:6
+#: ../src/plugins/RHTSupport.glade.h:5
msgid "SSL verify"
msgstr "SSL சரிபாரà¯à®¤à¯à®¤à®²à¯"
-#: ../src/plugins/Bugzilla.glade.h:7 ../src/plugins/RHTSupport.glade.h:6
+#: ../src/plugins/Bugzilla.glade.h:7
+#: ../src/plugins/RHTSupport.glade.h:6
msgid "Show password"
msgstr "கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ காடà¯à®Ÿà¯"
#: ../src/plugins/Bugzilla.glade.h:8
-msgid ""
-"You can create it <a href=\"https://bugzilla.redhat.com/createaccount.cgi"
-"\">here</a>"
-msgstr ""
-"நீஙà¯à®•à®³à¯ இதை <a href=\"https://bugzilla.redhat.com/createaccount.cgi\">இஙà¯à®•à¯‡</a> "
-"உரà¯à®µà®¾à®•à¯à®•à®²à®¾à®®à¯"
+msgid "You can create it <a href=\"https://bugzilla.redhat.com/createaccount.cgi\">here</a>"
+msgstr "நீஙà¯à®•à®³à¯ இதை <a href=\"https://bugzilla.redhat.com/createaccount.cgi\">இஙà¯à®•à¯‡</a> உரà¯à®µà®¾à®•à¯à®•à®²à®¾à®®à¯"
-#: ../src/plugins/CCpp.cpp:277
+#: ../src/plugins/CCpp.cpp:265
msgid "Analyzes crashes in C/C++ programs"
msgstr "C/C++ நிரலà¯à®•à®³à®¿à®²à¯ ஆயà¯à®µà¯à®•à®³à¯ சேதமடைகினà¯à®±à®©"
@@ -1582,7 +1537,7 @@ msgstr "<b>Kerneloops அறிகà¯à®•à¯ˆà®¯à®¿à®Ÿà¯à®ªà®µà®°à¯ கூடà¯
msgid "Submit URL:"
msgstr "URL஠சமரà¯à®ªà¯à®ªà®¿:"
-#: ../src/plugins/KerneloopsScanner.cpp:227
+#: ../src/plugins/KerneloopsScanner.cpp:226
msgid "Periodically scans for and saves kernel oopses"
msgstr "கால இடைவெளியில௠கரà¯à®©à®²à¯ ஊபà¯à®¸à¯à®•à®³à¯ˆ சேமிதà¯à®¤à¯ ஸà¯à®•à¯‡à®©à¯ செயà¯à®•à®¿à®±à®¤à¯"
@@ -1631,9 +1586,8 @@ msgid "RHTSupport URL:"
msgstr "RHTSupport URL:"
#: ../src/plugins/Upload.glade.h:1
-#, fuzzy
msgid "<b>Upload plugin configuration</b>"
-msgstr "<b>டிகà¯à®•à¯†à®Ÿà¯ பதிவேறà¯à®±à®¿ கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯ கடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯</b>"
+msgstr "<b>கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯ கடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯ˆ பதிவேறà¯à®±à¯</b>"
#: ../src/plugins/Upload.glade.h:2
msgid "Retry count:"
@@ -1654,64 +1608,44 @@ msgstr "மறைகà¯à®±à®¿à®¯à®¾à®•à¯à®•à®¤à¯à®¤à¯ˆ பயனà¯à®ªà®Ÿà¯à®
#~ msgid "Database plugin not specified. Please check abrtd settings."
#~ msgstr ""
#~ "தரவà¯à®¤à¯à®¤à®³ கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯ கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ. abrtd அமைவà¯à®•à®³à¯ˆ சரி பாரà¯à®•à¯à®•à®µà¯à®®à¯."
-
#~ msgid "Keeps SQLite3 database about all crashes"
#~ msgstr "SQLite3 தரவà¯à®¤à¯à®¤à®³à®¤à¯à®¤à¯ˆ அனைதà¯à®¤à¯ கà¯à®°à®¾à®·à¯à®•à®³à®¿à®²à¯ வைகà¯à®•à®¿à®±à®¤à¯"
-
#~ msgid "Reports bugs to bugzilla"
#~ msgstr "bugzilla-வà¯à®•à¯à®•à¯ பிழைகளை அறிகà¯à®•à¯ˆà®¯à®¿à®Ÿà¯à®•à®¿à®±à®¤à¯"
-
#~ msgid "Generating backtrace"
#~ msgstr "பேகà¯à®Ÿà¯à®°à¯‡à®¸à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯à®•à®¿à®±à®¤à¯..."
-
#~ msgid "Starting the debuginfo installation"
#~ msgstr "debuginfo நிறà¯à®µà®²à¯ˆ தà¯à®µà®•à¯à®•à¯à®•à®¿à®±à®¤à¯"
-
#~ msgid "Getting global universal unique identification..."
#~ msgstr "à®®à¯à®´à¯à®®à¯ˆà®¯à®¾à®© உலகளாவிய தனி அடையாளதà¯à®¤à¯ˆ பெறà¯à®•à®¿à®±à®¤à¯..."
-
#~ msgid "Skipping the debuginfo installation"
#~ msgstr "debuginfo நிறà¯à®µà®²à¯ˆ தவிரà¯à®¤à¯à®¤à®¤à¯"
-
#~ msgid "FileTransfer: URL not specified"
#~ msgstr "கோபà¯à®ªà¯ இடமாறà¯à®±à®®à¯: URL கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ"
-
#~ msgid "Sending archive %s to %s"
#~ msgstr "காபà¯à®ªà¯ %sà® %sவழியாக அனà¯à®ªà¯à®ªà¯à®•à®¿à®±à®¤à¯"
-
#~ msgid "FileTransfer: Creating a report..."
#~ msgstr "கோபà¯à®ªà¯ இடமாறà¯à®±à®®à¯: ஒர௠அறிகà¯à®•à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯à®•à®¿à®±à®¤à¯..."
-
#~ msgid "Cannot create and send an archive: %s"
#~ msgstr "ஒர௠காபà¯à®ªà¯ உரà¯à®µà®¾à®•à¯à®• மறà¯à®±à¯à®®à¯ அனà¯à®ªà¯à®ª à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ: %s"
-
#~ msgid "Sends a report via FTP or SCTP"
#~ msgstr "FTP அலà¯à®²à®¤à¯ SCTP வழியாக அறிகà¯à®•à¯ˆ அனà¯à®ªà¯à®ªà¯à®•à®¿à®±à®¤à¯"
-
#~ msgid "Analyzes kernel oopses"
#~ msgstr "kernel oops-களை ஆராயà¯à®•à®¿à®±à®¤à¯"
-
#~ msgid "Creating and submitting a report..."
#~ msgstr "ஒர௠அறிகà¯à®•à¯ˆà®¯à¯ˆ உரà¯à®µà®¾à®•à¯à®•à®¿ சமரà¯à®ªà¯à®ªà®¿à®•à¯à®•à®¿à®±à®¤à¯..."
-
#~ msgid "Sends kernel oops information to kerneloops.org"
#~ msgstr "kerneloops.orgகà¯à®•à¯ கரà¯à®©à®²à¯ ஊபà¯à®¸à¯ தகவலை அனà¯à®ªà¯à®ªà¯à®•à®¿à®±à®¤à¯"
-
#~ msgid "Writes report to a file"
#~ msgstr "ஒர௠கோபà¯à®ªà®¿à®²à¯ அறிகà¯à®•à¯ˆ எழà¯à®¤à¯à®•à®¿à®±à®¤à¯"
-
#~ msgid "Sends an email with a report (via mailx command)"
#~ msgstr "ஒர௠அறிகà¯à®•à¯ˆà®¯à¯à®Ÿà®©à¯ ஒர௠மினà¯à®©à®žà¯à®šà®²à¯ அனà¯à®ªà¯à®ªà¯à®•à®¿à®±à®¤à¯ (mailx கடà¯à®Ÿà®³à¯ˆ வழியாக)"
-
#~ msgid "Analyzes crashes in Python programs"
#~ msgstr "Python நிரலà¯à®•à®³à®¿à®²à¯ கà¯à®°à®¾à®·à¯à®•à®³à¯ˆ ஆராயà¯à®•à®¿à®±à®¤à¯"
-
#~ msgid "Sending failed, trying again. %s"
#~ msgstr "அனà¯à®ªà¯à®ª à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ, மீணà¯à®Ÿà¯à®®à¯ à®®à¯à®¯à®±à¯à®šà®¿à®•à¯à®•à®¿à®±à®¤à¯. %s"
-
#~ msgid "Creating a ReportUploader report..."
#~ msgstr "ஒர௠ReportUploader அறிகà¯à®•à¯ˆà®¯à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯à®•à®¿à®±à®¤à¯..."
-
#~ msgid ""
#~ "Packs crash data into .tar.gz file, optionally uploads it via FTP/SCP/etc"
#~ msgstr ""
@@ -1721,41 +1655,30 @@ msgstr "மறைகà¯à®±à®¿à®¯à®¾à®•à¯à®•à®¤à¯à®¤à¯ˆ பயனà¯à®ªà®Ÿà¯à®
#, fuzzy
#~ msgid "Reports bugs to Red Hat support"
#~ msgstr "bugzilla-வà¯à®•à¯à®•à¯ பிழைகளை அறிகà¯à®•à¯ˆà®¯à®¿à®Ÿà¯à®•à®¿à®±à®¤à¯"
-
#~ msgid "Runs a command, saves its output"
#~ msgstr "ஒர௠கடà¯à®Ÿà®³à¯ˆà®¯à¯ˆ இயகà¯à®•à®¿ அதன௠வெளிபà¯à®ªà®¾à®Ÿà¯à®Ÿà¯ˆ சேமிகà¯à®•à®¿à®±à®¤à¯"
-
#~ msgid "Running sosreport: %s"
#~ msgstr "sosreport஠இயஙà¯à®•à¯à®•à®¿à®±à®¤à¯: %s"
-
#~ msgid "Finished running sosreport"
#~ msgstr "sosreport இயஙà¯à®•à¯à®¤à®²à¯ à®®à¯à®Ÿà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯"
-
#~ msgid "Runs sosreport, saves the output"
#~ msgstr "sosreport஠இயகà¯à®•à®¿, வெளிபà¯à®ªà®¾à®Ÿà¯à®Ÿà¯ˆ சேமிகà¯à®•à®¿à®±à®¤à¯"
-
#~ msgid "Customer:"
#~ msgstr "வாடிகà¯à®•à¯ˆà®¯à®¾à®³à®°à¯:"
-
#~ msgid "Ticket:"
#~ msgstr "டிகà¯à®•à¯†à®Ÿà¯:"
-
#~ msgid "Upload"
#~ msgstr "பதிவேறà¯à®±à¯"
-
#~ msgid "Rating is required by the %s plugin"
#~ msgstr "மதிபà¯à®ªà®¿à®¤à®²à¯ %s கூடà¯à®¤à®²à¯ இணைபà¯à®ªà®¾à®²à¯ தேவைபà¯à®ªà®Ÿà¯à®•à®¿à®±à®¤à¯"
-
#~ msgid "Rating is not required by any plugin, skipping the check..."
#~ msgstr "மதிபà¯à®ªà¯€à®Ÿà¯ எநà¯à®¤ கூடà¯à®¤à®²à¯ இணைபà¯à®ªà®¿à®±à¯à®•à¯à®®à¯ தேவைபà¯à®ªà®Ÿà®¾à®¤à¯, சரிபாரà¯à®¤à¯à®¤à®²à¯ˆ தவிரà¯à®•à¯à®•à®¿à®±à®¤à¯..."
-
#~ msgid ""
#~ "Cannot login. Check Edit->Plugins->Bugzilla and /etc/abrt/plugins/"
#~ "Bugzilla.conf. Server said: %s"
#~ msgstr ""
#~ "பà¯à®•à¯à®ªà®¤à®¿à®µà¯ செயà¯à®¯ à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ. திரà¯à®¤à¯à®¤à¯ ->கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯à®•à®³à¯->Bugzilla மறà¯à®±à¯à®®à¯ /etc/"
#~ "abrt/plugins/Bugzilla.conf. சரà¯à®µà®°à¯ சொனà¯à®©à®¤à¯: %s"
-
#~ msgid "Can't create and send an archive %s"
#~ msgstr "ஒர௠காபà¯à®ªà¯ %s உரà¯à®µà®¾à®•à¯à®• மறà¯à®±à¯à®®à¯ அனà¯à®ªà¯à®ª à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ"
@@ -1778,17 +1701,14 @@ msgstr "மறைகà¯à®±à®¿à®¯à®¾à®•à¯à®•à®¤à¯à®¤à¯ˆ பயனà¯à®ªà®Ÿà¯à®
#, fuzzy
#~ msgid "Creating a signature..."
#~ msgstr "ஒர௠அறிகà¯à®•à¯ˆà®¯à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯à®•à®¿à®±à®¤à¯..."
-
#~ msgid "Jump to bug %d"
#~ msgstr "பிழை %dகà¯à®•à¯ தாவà¯"
-
#~ msgid "Getting local universal unique identification"
#~ msgstr "உளà¯à®³à®®à¯ˆ உலகளாவிய தனி அடையாளதà¯à®¤à¯ˆ பெறà¯à®•à®¿à®±à®¤à¯"
#, fuzzy
#~ msgid "Not reported"
#~ msgstr "அறிகà¯à®•à¯ˆà®¯à®¿à®Ÿà®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ"
-
#~ msgid ""
#~ "Usage: abrt-gui [OPTIONS]\n"
#~ "\t-h, --help \tthis help message\n"
@@ -1799,58 +1719,40 @@ msgstr "மறைகà¯à®±à®¿à®¯à®¾à®•à¯à®•à®¤à¯à®¤à¯ˆ பயனà¯à®ªà®Ÿà¯à®
#~ "\t-h, --help \tthis help message\n"
#~ "\t-v[vv] \tverbosity level\n"
#~ "\t--report=<crashid>\tdirectly report crash with crashid=<crashid>"
-
#~ msgid "Icon"
#~ msgstr "சினà¯à®©à®®à¯"
-
#~ msgid "Date"
#~ msgstr "தேதி"
-
#~ msgid "User"
#~ msgstr "பயனரà¯"
-
#~ msgid "This crash has been reported:\n"
#~ msgstr "இநà¯à®¤ சேதம௠அறிகà¯à®•à¯ˆà®¯à®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯:\n"
-
#~ msgid "<b>This crash has been reported:</b>\n"
#~ msgstr "<b>இநà¯à®¤ சேதம௠அறிகà¯à®•à¯ˆà®¯à®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯:</b>\n"
-
#~ msgid "No UI for plugin %s"
#~ msgstr "UI கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯ %sஇல௠இலà¯à®²à¯ˆ"
-
#~ msgid "Missing member 'reporter'"
#~ msgstr "விடà¯à®ªà®Ÿà¯à®Ÿ உறà¯à®ªà¯à®ªà®¿à®©à®°à¯ 'அறிகà¯à®•à¯ˆà®¯à®¾à®³à®°à¯'"
-
#~ msgid "Missing member 'cc'"
#~ msgstr "விடà¯à®ªà®Ÿà¯à®Ÿ உறà¯à®ªà¯à®ªà®¿à®©à®°à¯ 'cc'"
-
#~ msgid "Missing member 'bug_id'"
#~ msgstr "விடà¯à®ªà®Ÿà¯à®Ÿ உறà¯à®ªà¯à®ªà®¿à®©à®°à¯ 'bug_id'"
-
#~ msgid "Checking CC..."
#~ msgstr "CCகà¯à®•à¯ சரிபாரà¯à®•à¯à®•à®¿à®±à®¤à¯..."
-
#~ msgid "Creating kernel oops crash reports..."
#~ msgstr "கரà¯à®©à®²à¯ oops கà¯à®°à®·à¯à®•à®³à¯ˆ அறிகà¯à®•à¯ˆà®•à®³à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯à®•à®¿à®±à®¤à¯..."
-
#~ msgid "Settings"
#~ msgstr "அமைவà¯à®•à®³à¯"
-
#~ msgid "Global Settings"
#~ msgstr "பொதà¯à®µà®¾à®© அமைவà¯à®•à®³à¯"
-
#~ msgid "gtk-cancel"
#~ msgstr "gtk-cancel"
-
#~ msgid "gtk-ok"
#~ msgstr "gtk-ok"
-
#~ msgid "Getting local universal unique identification..."
#~ msgstr "உளà¯à®³à®®à¯ˆ உலகளாவிய தனி அடையாளதà¯à®¤à¯ˆ பெறà¯à®•à®¿à®±à®¤à¯..."
-
#~ msgid "Plugin name is not set, can't load its settings"
#~ msgstr "கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯ பெயர௠அமைகà¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ, அதன௠அமைவà¯à®•à®³à¯ˆ à®à®±à¯à®± à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ"
-
#~ msgid ""
#~ "<b>WARNING</b>, you're about to send data which might contain sensitive "
#~ "information.\n"
@@ -1859,39 +1761,28 @@ msgstr "மறைகà¯à®±à®¿à®¯à®¾à®•à¯à®•à®¤à¯à®¤à¯ˆ பயனà¯à®ªà®Ÿà¯à®
#~ "<b>எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ</b>, நீஙà¯à®•à®³à¯ அனà¯à®ªà¯à®ª இரà¯à®•à¯à®•à¯à®®à¯ தரவ௠சில உணரà¯à®µà®¾à®°à¯à®¨à¯à®¤ தகவலà¯à®•à®³à¯ˆ "
#~ "கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®•à¯à®®à¯.\n"
#~ "நீஙà¯à®•à®³à¯ <b>%s</b>஠அனà¯à®ªà¯à®ª வேணà¯à®Ÿà¯à®®à¯?\n"
-
#~ msgid "<b>Following items will be sent</b>"
#~ msgstr "<b>பினà¯à®µà®°à¯à®®à¯ உரà¯à®ªà¯à®ªà®Ÿà®¿à®•à®³à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®®à¯</b>"
-
#~ msgid "Send"
#~ msgstr "அனà¯à®ªà¯à®ªà¯"
-
#~ msgid "Downloading and installing debug-info packages..."
#~ msgstr "debug-info தொகà¯à®ªà¯à®ªà¯à®•à®³à¯ˆ பதிவிறகà¯à®•à®¿ நிறà¯à®µà¯à®•à®¿à®±à®¤à¯..."
-
#~ msgid "Executing SOSreport plugin..."
#~ msgstr "SOSreport கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯ˆ இயகà¯à®•à¯à®•à®¿à®±à®¤à¯..."
-
#~ msgid "Starting report creation..."
#~ msgstr "அறிகà¯à®•à¯ˆ உரà¯à®µà®¾à®•à¯à®•à®¤à¯à®¤à¯ˆ தà¯à®µà®•à¯à®•à¯à®•à®¿à®±à®¤à¯..."
-
#~ msgid "Can't get username for uid %s"
#~ msgstr "uid %sகà¯à®•à¯ பயனரà¯à®ªà¯†à®¯à®°à¯ˆ பெற à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ"
-
#~ msgid "Edit blacklisted packages"
#~ msgstr "நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ தொகà¯à®ªà¯à®ªà¯à®•à®³à¯ˆ திரà¯à®¤à¯à®¤à¯"
-
#~ msgid "This function is not implemented yet!"
#~ msgstr "இநà¯à®¤ செயலà¯à®ªà®¾à®Ÿà¯ இதà¯à®µà®°à¯ˆ செயலà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ!"
-
#~ msgid "gtk-add"
#~ msgstr "gtk-add"
-
#~ msgid "gtk-close"
#~ msgstr "gtk-close"
-
#~ msgid "gtk-remove"
#~ msgstr "gtk-remove"
-
#~ msgid "Executing RunApp plugin..."
#~ msgstr "RunApp கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯ˆ இயகà¯à®•à¯à®•à®¿à®±à®¤à¯..."
+
diff --git a/po/te.po b/po/te.po
index 1787abb6..bc157dcc 100644
--- a/po/te.po
+++ b/po/te.po
@@ -3,19 +3,20 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Krishna Babu K <kkrothap@redhat.com>, 2009, 2010.
+# Krishnababu Krothapalli <kkrothap@redhat.com>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: abrt.master.te\n"
"Report-Msgid-Bugs-To: jmoskovc@redhat.com\n"
-"POT-Creation-Date: 2010-11-29 13:51+0100\n"
-"PO-Revision-Date: 2010-07-30 14:44+0530\n"
-"Last-Translator: Krishna Babu K <kkrothap@redhat.com>\n"
+"POT-Creation-Date: 2011-01-24 21:06+0000\n"
+"PO-Revision-Date: 2011-01-27 16:01+0530\n"
+"Last-Translator: Krishnababu Krothapalli <kkrothap@redhat.com>\n"
"Language-Team: Telugu <en@li.org>\n"
"Language: te\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.11.4\n"
+"X-Generator: Lokalize 1.1\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
"\n"
"\n"
@@ -45,16 +46,16 @@ msgstr "ABRT à°ªà±à°°à°•à°Ÿà°¨ ఆపà±à°²à±†à°Ÿà±"
msgid "Automatic Bug Reporting Tool"
msgstr "à°¸à±à°µà°¯à°‚చాలక బగౠనివేదీకరణ సాధనమà±"
-#: ../src/applet/Applet.cpp:86
+#: ../src/applet/applet.c:86
#, c-format
msgid "A crash in the %s package has been detected"
msgstr "à°ªà±à°¯à°¾à°•à±‡à°œà±€ %s నందౠవొక à°•à±à°°à°¾à°·à± à°—à±à°°à±à°¤à°¿à°‚చబడింది"
-#: ../src/applet/Applet.cpp:88
+#: ../src/applet/applet.c:88
msgid "A crash has been detected"
msgstr "à°’à°• à°•à±à°°à°¾à°·à± à°—à±à°°à±à°¤à°¿à°‚చబడెనà±"
-#: ../src/applet/Applet.cpp:285
+#: ../src/applet/applet.c:285
msgid "ABRT service is not running"
msgstr "ABRT సేవ నడà±à°šà±à°Ÿà°²à±‡à°¦à±"
@@ -84,7 +85,7 @@ msgstr "నివేదించà±"
msgid "Open ABRT"
msgstr "ABRT తెరà±à°µà±à°®à±"
-#: ../src/cli/CLI.cpp:47
+#: ../src/cli/CLI.cpp:46
#, fuzzy, c-format
msgid ""
"\tCrash dump : %s\n"
@@ -127,31 +128,29 @@ msgstr ""
"ఆదేశం: %s\n"
"à°Žà°—à±à°œà°¿à°•à±à°¯à±‚à°Ÿà°¬à±à°²à±: %s\n"
"సిసà±à°Ÿà°®à±: %s, కెరà±à°¨à°²à± %s\n"
-"రేటింగà±: %s\n"
-"కోరà±â€Œà°¡à°‚పౠఫైలà±: %s\n"
"కారణం: %s\n"
-#: ../src/cli/CLI.cpp:125
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:126
+#, c-format
msgid "Coredump file: %s\n"
-msgstr "à°•à±à°°à°¾à°·à± à°«à°‚à°•à±à°·à°¨à±: %s\n"
+msgstr "కోరà±â€Œà°¡à°‚పౠఫైలà±: %s\n"
-#: ../src/cli/CLI.cpp:129
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:130
+#, c-format
msgid "Rating: %s\n"
-msgstr "హోసà±à°Ÿà±à°¨à°¾à°®à°®à±: %s\n"
+msgstr "రేటింగà±: %s\n"
-#: ../src/cli/CLI.cpp:134
+#: ../src/cli/CLI.cpp:135
#, c-format
msgid "Crash function: %s\n"
msgstr "à°•à±à°°à°¾à°·à± à°«à°‚à°•à±à°·à°¨à±: %s\n"
-#: ../src/cli/CLI.cpp:138
+#: ../src/cli/CLI.cpp:139
#, c-format
msgid "Hostname: %s\n"
msgstr "హోసà±à°Ÿà±à°¨à°¾à°®à°®à±: %s\n"
-#: ../src/cli/CLI.cpp:142
+#: ../src/cli/CLI.cpp:143
#, c-format
msgid ""
"\n"
@@ -162,7 +161,7 @@ msgstr ""
"ఎలా తిరిగి పొందవచà±à°šà±:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:146
+#: ../src/cli/CLI.cpp:147
#, c-format
msgid ""
"\n"
@@ -173,7 +172,7 @@ msgstr ""
"à°µà±à°¯à°¾à°–à±à°¯à°¾à°¨à°®à±:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:152
+#: ../src/cli/CLI.cpp:153
#, c-format
msgid ""
"\n"
@@ -185,13 +184,14 @@ msgstr ""
"%s\n"
#. Message has embedded tabs.
-#: ../src/cli/CLI.cpp:243
+#: ../src/cli/CLI.cpp:248
#, fuzzy, c-format
msgid ""
"Usage: %s [OPTION]\n"
"\n"
"Startup:\n"
"\t-V, --version\t\tdisplay the version of %s and exit\n"
+"\t-v, --verbose\t\tincrease verbosity\n"
"\t-?, --help\t\tprint this help\n"
"\n"
"Actions:\n"
@@ -229,24 +229,24 @@ msgstr ""
"\tunique UUID prefix - the crash with matching UUID will be acted upon\n"
"\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
-#: ../src/cli/CLI.cpp:287
+#: ../src/cli/CLI.cpp:292
msgid "You must specify exactly one operation"
msgstr "మీరౠతపà±à°ªà°• à°–à°šà±à°šà°¿à°¤à°‚à°—à°¾ వొక ఆపరేషనà±â€Œà°¨à± తెలపాలి"
-#: ../src/cli/report.cpp:166
+#: ../src/cli/report.cpp:164
#, c-format
msgid "# This field is read only\n"
msgstr "# à°ˆ à°•à±à°·à±‡à°¤à±à°°à°®à± à°šà°¦à±à°µà±à°Ÿà°•à± మాతà±à°°à°®à±‡\n"
-#: ../src/cli/report.cpp:186
+#: ../src/cli/report.cpp:184
msgid "# Describe the circumstances of this crash below"
msgstr "# à°ˆ à°•à±à°°à°¾à°·à± యొకà±à°• పరిసà±à°¥à°¿à°¤à±à°²à°¨à± కిందన వివరించà±à°®à±"
-#: ../src/cli/report.cpp:188
+#: ../src/cli/report.cpp:186
msgid "# How to reproduce the crash?"
msgstr "# à°•à±à°°à°¾à°·à±â€Œà°¨à± యెలా తిరిగి పొందవచà±à°šà±?"
-#: ../src/cli/report.cpp:190
+#: ../src/cli/report.cpp:188
msgid ""
"# Backtrace\n"
"# Check that it does not contain any sensitive data (passwords, etc.)"
@@ -255,47 +255,47 @@ msgstr ""
"# ఇది యేవిధమైన à°¸à±à°¨à±à°¨à°¿à°¤à°®à±ˆà°¨ డాటానౠకలిగివà±à°‚à°¡à°•à±à°‚à°¡à°¾ à°µà±à°‚à°¡à±à°¨à°Ÿà±à°²à± పరిశీలించà±à°®à± (సంకేతపదమà±à°²à±, "
"మొదలగà±à°¨à°µà°¿.)"
-#: ../src/cli/report.cpp:192
+#: ../src/cli/report.cpp:190
msgid "# Architecture"
msgstr "# ఆకృతి"
-#: ../src/cli/report.cpp:193
+#: ../src/cli/report.cpp:191
msgid "# Command line"
msgstr "# కమాండౠలైనà±"
-#: ../src/cli/report.cpp:194
+#: ../src/cli/report.cpp:192
msgid "# Component"
msgstr "# మూలకం"
-#: ../src/cli/report.cpp:195
+#: ../src/cli/report.cpp:193
msgid "# Core dump"
msgstr "# కోరౠడంపà±"
-#: ../src/cli/report.cpp:196
+#: ../src/cli/report.cpp:194
msgid "# Executable"
msgstr "# à°Žà°—à±à°œà°¿à°•à±à°¯à±‚à°Ÿà°¬à±à°²à±"
-#: ../src/cli/report.cpp:197
+#: ../src/cli/report.cpp:195
msgid "# Kernel version"
msgstr "# కెరà±à°¨à°²à± వరà±à°·à°¨à±"
-#: ../src/cli/report.cpp:198
+#: ../src/cli/report.cpp:196
msgid "# Package"
msgstr "# à°ªà±à°¯à°¾à°•à±‡à°œà°¿"
-#: ../src/cli/report.cpp:199
+#: ../src/cli/report.cpp:197
msgid "# Reason of crash"
msgstr "# à°•à±à°°à°¾à°·à± యొకà±à°• కారణం"
-#: ../src/cli/report.cpp:200
+#: ../src/cli/report.cpp:198
msgid "# Release string of the operating system"
msgstr "# ఆపరేటింగౠసిసà±à°Ÿà°®à± యొకà±à°• à°¸à±à°Ÿà±à°°à°¿à°‚à°—à±â€Œà°¨à± విడà±à°¦à°²à°šà±‡à°¯à±à°®à±"
-#: ../src/cli/report.cpp:323
+#: ../src/cli/report.cpp:321
msgid "Cannot run vi: $TERM, $VISUAL and $EDITOR are not set"
msgstr "vi నడà±à°ªà°²à±‡à°®à±: $TERM, $VISUAL మరియౠ$EDITOR సిదà±à°¦à°ªà°°à°šà°¬à°¡à°²à±‡à°¦à±"
-#: ../src/cli/report.cpp:411
+#: ../src/cli/report.cpp:405
msgid ""
"\n"
"The report has been updated"
@@ -303,7 +303,7 @@ msgstr ""
"\n"
"నివేదిక నవీకరించబడింది"
-#: ../src/cli/report.cpp:413
+#: ../src/cli/report.cpp:407
msgid ""
"\n"
"No changes were detected in the report"
@@ -312,103 +312,109 @@ msgstr ""
"నివేదికనందౠయే మారà±à°ªà±à°²à± à°—à±à°°à±à°¤à°¿à°‚చబడలేదà±"
#. The response might take more than 1 char in non-latin scripts.
-#: ../src/cli/report.cpp:464
+#: ../src/cli/report.cpp:439
msgid "y"
-msgstr ""
+msgstr "y"
-#: ../src/cli/report.cpp:465
+#: ../src/cli/report.cpp:440
msgid "N"
-msgstr ""
+msgstr "N"
#. Read the missing information and push it to plugin settings.
-#: ../src/cli/report.cpp:565
+#: ../src/cli/report.cpp:567
#, c-format
msgid "Wrong settings were detected for plugin %s\n"
msgstr "à°ªà±à°²à°—ినౠ%s కొరకౠతపà±à°ªà±à°¡à± అమరికలౠగà±à°°à±à°¤à°¿à°‚చబడినవి\n"
-#: ../src/cli/report.cpp:569
+#: ../src/cli/report.cpp:571
msgid "Enter your login: "
msgstr "మీ లాగినౠపà±à°°à°µà±‡à°¶à°ªà±†à°Ÿà±à°Ÿà±à°®à±: "
-#: ../src/cli/report.cpp:575
+#: ../src/cli/report.cpp:577
msgid "Enter your password: "
msgstr "మీ సంకేతపదమà±à°¨à± à°ªà±à°°à°µà±‡à°¶à°ªà±†à°Ÿà±à°Ÿà±à°®à±: "
-#: ../src/cli/report.cpp:638
+#: ../src/cli/report.cpp:643
msgid "Reporting..."
msgstr "నివేదించà±à°šà±à°¨à±à°¨à°¦à°¿..."
-#: ../src/cli/report.cpp:657
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:662
+#, c-format
msgid "Report using %s?"
-msgstr "నివేదిక %s à°µà±à°ªà°¯à±‹à°—à°¿à°‚à°šà±à°¨à°¾? [y/N]: "
+msgstr "%s à°µà±à°ªà°¯à±‹à°—à°¿à°‚à°šà°¿ నివేదించà±?"
-#: ../src/cli/report.cpp:660
+#: ../src/cli/report.cpp:665
msgid "Skipping..."
msgstr "వదిలివేయà±à°šà±à°¨à±à°¨à°¦à°¿..."
-#: ../src/cli/report.cpp:672
-#, fuzzy
+#: ../src/cli/report.cpp:677
msgid "Reporting disabled because the backtrace is unusable"
-msgstr "à°¬à±à°¯à°¾à°•à±â€Œà°Ÿà±à°°à±‡à°¸à± నిరà±à°ªà°¯à±‹à°—మైంది కావà±à°¨ నివేదీకరణ అచేతనపరచడమైంది."
+msgstr "à°¬à±à°¯à°¾à°•à±â€Œà°Ÿà±à°°à±‡à°¸à± నిరà±à°ªà°¯à±‹à°—మైంది కావà±à°¨ నివేదీకరణ అచేతనపరచడమైంది"
-#: ../src/cli/report.cpp:676
+#: ../src/cli/report.cpp:681
#, c-format
msgid ""
"Please try to install debuginfo manually using the command: \"debuginfo-"
"install %s\" and try again\n"
msgstr ""
+"à°ˆ ఆదేశమà±à°¨à± à°µà±à°ªà°¯à±‹à°—à°¿à°‚à°šà°¿ డీబగౠసమాచారమà±à°¨à± మానవీయంగా సంసà±à°¥à°¾à°ªà°¿à°‚à°šà±à°Ÿà°•à± à°ªà±à°°à°¯à°¤à±à°¨à°¿à°‚à°šà±à°®à±: \"debuginfo-"
+"install %s\" తిరిగి à°ªà±à°°à°¯à°¤à±à°¨à°¿à°‚à°šà±\n"
-#: ../src/cli/report.cpp:685
-#, fuzzy
+#: ../src/cli/report.cpp:690
msgid "Error loading reporter settings"
-msgstr "నివేదికనౠపొందà±à°Ÿà°²à±‹ దోషమà±: %s"
+msgstr "నివేదిక అమరికలౠలోడౠచేయà±à°Ÿà°²à±‹ దోషమà±"
-#: ../src/cli/report.cpp:704
+#: ../src/cli/report.cpp:711
#, fuzzy, c-format
msgid "Crash reported via %d report events (%d errors)\n"
msgstr "%d à°ªà±à°²à°—à°¿à°¨à±à°¸à± à°¦à±à°µà°¾à°°à°¾ à°•à±à°°à°¾à°·à± నివేదించబడింది (%d దోషమà±à°²à±)\n"
-#: ../src/daemon/abrt-handle-crashdump.c:42
+#: ../src/daemon/abrt-handle-crashdump.c:43
msgid ""
" [-vs] -d DIR -e EVENT\n"
" or: "
msgstr ""
-#: ../src/daemon/abrt-handle-crashdump.c:57
-#: ../src/plugins/abrt-action-analyze-c.c:167
-#: ../src/plugins/abrt-action-analyze-oops.c:144
-#: ../src/plugins/abrt-action-analyze-python.c:49
+#: ../src/daemon/abrt-handle-crashdump.c:59
+#: ../src/plugins/abrt-action-bugzilla.cpp:926
+#: ../src/plugins/abrt-action-generate-backtrace.c:272
+#: ../src/plugins/abrt-action-kerneloops.c:146
+#: ../src/plugins/abrt-action-rhtsupport.c:276
+#: ../src/plugins/abrt-dump-oops.c:554
msgid "Log to syslog"
msgstr ""
-#: ../src/daemon/abrt-handle-crashdump.c:58
-#: ../src/plugins/abrt-action-analyze-c.c:166
-#: ../src/plugins/abrt-action-analyze-oops.c:143
-#: ../src/plugins/abrt-action-analyze-python.c:48
-#: ../src/plugins/abrt-action-mailx.cpp:150
-#: ../src/plugins/abrt-action-print.cpp:50
-#: ../src/plugins/abrt-action-upload.cpp:266
+#: ../src/daemon/abrt-handle-crashdump.c:60
+#: ../src/plugins/abrt-action-analyze-c.c:167
+#: ../src/plugins/abrt-action-analyze-oops.c:144
+#: ../src/plugins/abrt-action-analyze-python.c:49
+#: ../src/plugins/abrt-action-bugzilla.cpp:927
+#: ../src/plugins/abrt-action-generate-backtrace.c:269
+#: ../src/plugins/abrt-action-kerneloops.c:147
+#: ../src/plugins/abrt-action-mailx.c:149
+#: ../src/plugins/abrt-action-print.c:50
+#: ../src/plugins/abrt-action-rhtsupport.c:277
+#: ../src/plugins/abrt-action-upload.c:261
msgid "Crash dump directory"
msgstr ""
-#: ../src/daemon/abrt-handle-crashdump.c:59
+#: ../src/daemon/abrt-handle-crashdump.c:61
msgid "Handle EVENT"
msgstr ""
-#: ../src/daemon/abrt-handle-crashdump.c:60
+#: ../src/daemon/abrt-handle-crashdump.c:62
msgid "List possible events [which start with PFX]"
msgstr ""
-#: ../src/daemon/CommLayerServerDBus.cpp:229
+#: ../src/daemon/CommLayerServerDBus.cpp:242
msgid "Comment is too long"
msgstr "à°µà±à°¯à°¾à°–à±à°¯à°¾ మరీ పొడవైంది"
-#: ../src/daemon/CommLayerServerDBus.cpp:233
+#: ../src/daemon/CommLayerServerDBus.cpp:246
msgid "'How to reproduce' is too long"
msgstr "'ఎలా తిరిగి పొందవచà±à°šà±' à°…à°¨à±à°¨à°¦à°¿ మరీ పొడవైంది"
-#: ../src/daemon/Daemon.cpp:534
+#: ../src/daemon/Daemon.cpp:371
msgid ""
"The size of the report exceeded the quota. Please check system's "
"MaxCrashReportsSize value in abrt.conf."
@@ -416,19 +422,19 @@ msgstr ""
"నివేదిక పరిమాణమౠకోటానౠమించినది. abrt.conf నందౠసిసà±à°Ÿà°®à± యొకà±à°• MaxCrashReportsSize విలà±à°µà°¨à± "
"పరిశీలించండి."
-#: ../src/daemon/Daemon.cpp:699
-msgid "abrtd [options]"
+#: ../src/daemon/Daemon.cpp:542
+msgid " [options]"
msgstr ""
-#: ../src/daemon/Daemon.cpp:709
+#: ../src/daemon/Daemon.cpp:553
msgid "Do not daemonize"
msgstr ""
-#: ../src/daemon/Daemon.cpp:710
+#: ../src/daemon/Daemon.cpp:554
msgid "Log to syslog even with -d"
msgstr ""
-#: ../src/daemon/Daemon.cpp:711
+#: ../src/daemon/Daemon.cpp:555
msgid "Exit after SEC seconds of inactivity"
msgstr ""
@@ -552,7 +558,7 @@ msgstr ""
"à°ˆ à°ªà±à°°à±‹à°—à±à°°à°¾à°®à± తో మీరౠGNU జనరలౠపబà±à°²à°¿à°•à± లైసెనà±à°¸à± నకలà±à°¨à± పొంది ఉంటారà±. పొందకపోతే, <http://www.gnu."
"org/licenses/> చూడండి."
-#: ../src/gui/ccgui.glade.h:19 ../src/gui/CReporterAssistant.py:71
+#: ../src/gui/ccgui.glade.h:19 ../src/gui/CReporterAssistant.py:111
msgid "View log"
msgstr "లాగà±â€Œà°¨à± దరà±à°¶à°¿à°‚à°šà±"
@@ -654,7 +660,7 @@ msgstr "దీనిని మరలా యెలా రాబటà±à°Ÿà°¾à°²à°¿
msgid "You must check the backtrace for sensitive data."
msgstr "à°¸à±à°¨à±à°¨à°¿à°¤à°®à±ˆà°¨ డాటా కొరకౠమీరౠబà±à°¯à°¾à°•à±â€Œà°Ÿà±à°°à±‡à°¸à±â€Œà°¨à± తపà±à°ªà°• పరిశీలించవలెనà±."
-#: ../src/gui/CCReporterDialog.py:118 ../src/gui/CReporterAssistant.py:364
+#: ../src/gui/CCReporterDialog.py:118 ../src/gui/CReporterAssistant.py:392
#, python-format
msgid ""
"Reporting disabled because the backtrace is unusable.\n"
@@ -671,8 +677,8 @@ msgstr ""
msgid "The backtrace is unusable, you cannot report this!"
msgstr "బాకà±â€Œà°Ÿà±à°°à±‡à°¸à± à°µà±à°ªà°¯à±‹à°—à°¿à°‚à°šà±à°Ÿà°•à± వీలà±à°•à°¾à°•à±à°‚à°¡à°¾ à°µà±à°‚ది, దీనిని మీరౠనివేదించలేరà±!"
-#: ../src/gui/CCReporterDialog.py:124 ../src/gui/CReporterAssistant.py:342
-#: ../src/gui/CReporterAssistant.py:370
+#: ../src/gui/CCReporterDialog.py:124 ../src/gui/CReporterAssistant.py:370
+#: ../src/gui/CReporterAssistant.py:398
msgid ""
"The backtrace is incomplete, please make sure you provide the steps to "
"reproduce."
@@ -695,7 +701,7 @@ msgstr ""
"à°ˆ రకమైన à°•à±à°°à°¾à°·à± కొరకౠఠనివేదిక à°ªà±à°²à°—ినౠఅందà±à°¬à°¾à°Ÿà±à°²à±‹ లేదà±.\n"
"దయచేసి abrt.conf పరిశీలించà±à°®à±."
-#: ../src/gui/CCReporterDialog.py:418 ../src/gui/CReporterAssistant.py:249
+#: ../src/gui/CCReporterDialog.py:418 ../src/gui/CReporterAssistant.py:277
#: ../src/gui/PluginsSettingsDialog.py:136
#, python-format
msgid ""
@@ -705,12 +711,12 @@ msgstr ""
"à°ªà±à°²à°—ినౠఅమరికలనౠదాయలేదà±:\n"
" %s"
-#: ../src/gui/CCReporterDialog.py:448 ../src/gui/CReporterAssistant.py:279
+#: ../src/gui/CCReporterDialog.py:448 ../src/gui/CReporterAssistant.py:307
#, python-format
msgid "Configure %s options"
msgstr "%s à°à°šà±à°šà°¿à°•à°®à±à°²à°¨à± ఆకృతీకరించà±à°®à±"
-#: ../src/gui/CCReporterDialog.py:498 ../src/gui/CReporterAssistant.py:1074
+#: ../src/gui/CCReporterDialog.py:498 ../src/gui/CReporterAssistant.py:1102
msgid ""
"Unable to get report!\n"
"Is debuginfo missing?"
@@ -718,7 +724,7 @@ msgstr ""
"నివేదికనౠపొందలేక పోయింది!\n"
"డీబగà±â€Œà°¸à°®à°¾à°šà°¾à°°à°®à± తపà±à°ªà°¿à°ªà±‹à°¯à°¿à°‚దా?"
-#: ../src/gui/CCReporterDialog.py:527 ../src/gui/CReporterAssistant.py:455
+#: ../src/gui/CCReporterDialog.py:527 ../src/gui/CReporterAssistant.py:483
#, python-format
msgid ""
"Reporting failed!\n"
@@ -728,14 +734,15 @@ msgstr ""
"%s"
#: ../src/gui/CCReporterDialog.py:553 ../src/gui/CCReporterDialog.py:574
-#: ../src/gui/CReporterAssistant.py:1113
+#: ../src/gui/CReporterAssistant.py:1139
#, python-format
msgid "Error acquiring the report: %s"
msgstr "నివేదికనౠపొందà±à°Ÿà°²à±‹ దోషమà±: %s"
#: ../src/gui/ConfBackend.py:78
+#, fuzzy
msgid "Cannot connect to the Gnome Keyring daemon."
-msgstr "Gnome కీరింగౠడెమోనà±â€Œà°•à± à°…à°¨à±à°¸à°‚ధానమౠకాలేకపోయింది."
+msgstr "సిసà±à°Ÿà°®à± dbusà°•à± à°…à°¨à±à°¸à°‚ధానమౠకాలేకపోయింది"
#. could happen if keyring daemon is running, but we run gui under
#. user who is not the owner of the running session - using su
@@ -763,36 +770,36 @@ msgstr "gnome-keyringకౠయాకà±à°¸à±†à°¸à± తిరసà±à°•à°°à°¿à°‚
msgid "Crash info doesn't contain a backtrace"
msgstr "à°•à±à°°à°¾à°·à± సమాచారమౠబà±à°¯à°¾à°•à±â€Œà°Ÿà±à°°à±‡à°¸à±â€Œà°¨à± కలిగిలేదà±"
-#: ../src/gui/CReporterAssistant.py:334
+#: ../src/gui/CReporterAssistant.py:362
#, python-format
msgid "Rating is %s"
msgstr "రేటింగౠ%s"
-#: ../src/gui/CReporterAssistant.py:337
+#: ../src/gui/CReporterAssistant.py:365
msgid "Crashdump doesn't have rating => we suppose it's not required"
msgstr "à°•à±à°°à°¾à°·à±â€Œà°¡à°‚పౠరేటింగà±â€Œà°¨à± కలిగిలేదౠ=> అది అవసరమౠలేదని మేమౠఅనà±à°•à±Šà°¨à±à°šà±à°¨à±à°¨à°¾à°®à±"
-#: ../src/gui/CReporterAssistant.py:350
+#: ../src/gui/CReporterAssistant.py:378
msgid "You should check the backtrace for sensitive data."
msgstr "à°¸à±à°¨à±à°¨à°¿à°¤à°®à±ˆà°¨ డాటా కొరకౠమీరౠబà±à°¯à°¾à°•à±â€Œà°Ÿà±à°°à±‡à°¸à±â€Œà°¨à± పరిశీలించవలెనà±."
-#: ../src/gui/CReporterAssistant.py:351
+#: ../src/gui/CReporterAssistant.py:379
msgid "You must agree with sending the backtrace."
msgstr "à°¬à±à°¯à°¾à°•à±â€Œà°Ÿà±à°°à±‡à°¸à±â€Œà°¨à± పంపà±à°Ÿà°¨à± మీరౠతపà±à°ªà°• అంగీకరించాలి."
-#: ../src/gui/CReporterAssistant.py:366
+#: ../src/gui/CReporterAssistant.py:394
msgid "Reporting disabled because the backtrace is unusable."
msgstr "à°¬à±à°¯à°¾à°•à±â€Œà°Ÿà±à°°à±‡à°¸à± నిరà±à°ªà°¯à±‹à°—మైంది కావà±à°¨ నివేదీకరణ అచేతనపరచడమైంది."
-#: ../src/gui/CReporterAssistant.py:412
+#: ../src/gui/CReporterAssistant.py:440
msgid "You did not provide any steps to reproduce."
msgstr "తిరిగి à°µà±à°¤à±à°ªà°¨à±à°¨à°‚ చేయà±à°Ÿà°•à± మీరౠయే à°¸à±à°Ÿà±†à°ªà±à°ªà±à°²à°¨à± యివà±à°µà°²à±‡à°¦à±."
-#: ../src/gui/CReporterAssistant.py:426
+#: ../src/gui/CReporterAssistant.py:454
msgid "You did not provide any comments."
msgstr "మీరౠయే à°µà±à°¯à°¾à°–à±à°¯à°¾à°¨à°¾à°²à°¨à± యీయలేదà±."
-#: ../src/gui/CReporterAssistant.py:507
+#: ../src/gui/CReporterAssistant.py:535
#, python-format
msgid ""
"It looks like an application from the package <b>%s</b> has crashed on your "
@@ -816,15 +823,15 @@ msgstr ""
"\n"
"మీరౠయెచట బగà±â€Œà°¨à± నివేదించà±à°Ÿà°•à± యిషà±à°Ÿà°ªà°¡à°¤à°¾à°°à±‹ యెంపికచేయండి, మరియౠకొనసాగించà±à°Ÿà°•à± 'à°®à±à°‚à°¦à±à°•à±' వతà±à°¤à°‚à°¡à°¿."
-#: ../src/gui/CReporterAssistant.py:548
+#: ../src/gui/CReporterAssistant.py:576
msgid "Only one reporter plugin is configured."
msgstr "à°’à°• నివేదిక à°ªà±à°²à°—ినౠమాతà±à°°à°®à±‡ ఆకృతీకరించబడింది."
-#: ../src/gui/CReporterAssistant.py:554
+#: ../src/gui/CReporterAssistant.py:582
msgid "Send a bug report"
msgstr "à°’à°• బగౠనివేదికనౠపంపà±à°®à±"
-#: ../src/gui/CReporterAssistant.py:592
+#: ../src/gui/CReporterAssistant.py:620
msgid ""
"Below is the backtrace associated with your crash. A crash backtrace "
"provides developers with details about how the crash happened, helping them "
@@ -839,128 +846,128 @@ msgstr ""
"దయచేసి సమాచారానà±à°¨à°¿ à°ªà±à°¨à°ƒà°ªà°°à°¿à°¶à±€à°²à°¿à°‚à°šà°‚à°¡à°¿ మరియౠమీ బగౠనివేదిక యెటà±à°µà°‚à°Ÿà°¿ à°¸à±à°¨à±à°¨à°¿à°¤à°®à±ˆà°¨ డాటానౠకలిగి లేకà±à°‚à°¡à°¾ "
"à°µà±à°‚à°¡à±à°¨à°Ÿà±à°²à± అవసరమైతే దానిని సవరించండి:"
-#: ../src/gui/CReporterAssistant.py:663 ../src/gui/CReporterAssistant.py:676
-#: ../src/gui/CReporterAssistant.py:710
+#: ../src/gui/CReporterAssistant.py:691 ../src/gui/CReporterAssistant.py:704
+#: ../src/gui/CReporterAssistant.py:738
#, python-format
msgid "Found %i occurence(s) [at: %i of %i]"
msgstr ""
-#: ../src/gui/CReporterAssistant.py:747
+#: ../src/gui/CReporterAssistant.py:775
msgid "Search:"
msgstr ""
-#: ../src/gui/CReporterAssistant.py:778
+#: ../src/gui/CReporterAssistant.py:806
msgid "Refresh"
msgstr "తాజాపరచà±"
-#: ../src/gui/CReporterAssistant.py:780
+#: ../src/gui/CReporterAssistant.py:808
msgid "Copy"
msgstr "నకలà±à°¤à±€à°¯à°¿"
-#: ../src/gui/CReporterAssistant.py:786
+#: ../src/gui/CReporterAssistant.py:814
msgid "I agree with submitting the backtrace"
msgstr "à°¬à±à°¯à°¾à°•à±â€Œà°Ÿà±à°°à±‡à°¸à± à°…à°ªà±à°ªà°—à°¿à°‚à°šà±à°Ÿà°•à± నేనౠఅంగీకరించà±à°šà±à°¨à±à°¨à°¾à°¨à±"
-#: ../src/gui/CReporterAssistant.py:791
+#: ../src/gui/CReporterAssistant.py:819
msgid "Approve the backtrace"
msgstr "à°¬à±à°¯à°¾à°•à±â€Œà°Ÿà±à°°à±‡à°¸à±â€Œà°¨à± ఆమోదించà±à°®à±"
-#: ../src/gui/CReporterAssistant.py:834
+#: ../src/gui/CReporterAssistant.py:862
msgid "You need to fill the how to before you can proceed..."
-msgstr ""
+msgstr "మీరౠకొనసాగà±à°Ÿà°•à± à°®à±à°‚à°¦à±à°—à°¾ యెలా అనేది పూరింప వలసివà±à°‚à°Ÿà±à°‚ది..."
-#: ../src/gui/CReporterAssistant.py:857
+#: ../src/gui/CReporterAssistant.py:885
msgid "How did this crash happen (step-by-step)? How would you reproduce it?"
msgstr "à°ˆ à°•à±à°°à°¾à°·à± యెలా సంభవించినది (అంచెలంచెలà±à°—à°¾)? మీరౠదానిని తిరిగి యెలా రాబటà±à°Ÿà±à°¤à°¾à°°à±?"
-#: ../src/gui/CReporterAssistant.py:877
+#: ../src/gui/CReporterAssistant.py:905
msgid ""
"Are there any comments you would like to share with the software maintainers?"
msgstr "మీరౠసాఫà±à°Ÿà±à°µà±‡à°°à± నిరà±à°µà°¾à°¹à°•à±à°²à°¤à±‹ పంచà±à°•à±Šà°µà°¾à°²à°¨à°¿ à°…à°¨à±à°•à±Šà°¨à±à°šà±à°¨à±à°¨ à°µà±à°¯à°¾à°–à±à°¯à°²à± యేమైనా à°µà±à°¨à±à°¨à°¾à°¯à°¾?"
-#: ../src/gui/CReporterAssistant.py:897
+#: ../src/gui/CReporterAssistant.py:925
msgid "Provide additional details"
msgstr "అదనపౠవివరమà±à°²à°¨à± అందించà±à°®à±"
-#: ../src/gui/CReporterAssistant.py:904
+#: ../src/gui/CReporterAssistant.py:932
msgid ""
"<b>Tip:</b> Your comments are not private. Please watch what you say "
"accordingly."
msgstr ""
"<b>à°šà°¿à°Ÿà±à°•à°¾:</b> మీ à°µà±à°¯à°¾à°–à±à°¯à°²à± గోపà±à°¯à°‚ కావà±. దయచేసి తదనà±à°—à±à°£à°‚à°—à°¾ మీరౠయేమి మాటà±à°²à°¾à°¡à±à°šà±à°¨à±à°¨à°¾à°°à±‹ గమనించà±à°•à±‹à°‚à°¡à°¿."
-#: ../src/gui/CReporterAssistant.py:945
+#: ../src/gui/CReporterAssistant.py:973
msgid "Confirm and send the report"
msgstr "ఖాయపరచà±à°®à± మరియౠనివేదికనౠపంపà±à°®à±"
-#: ../src/gui/CReporterAssistant.py:947
+#: ../src/gui/CReporterAssistant.py:975
msgid ""
"Below is a summary of your bug report. Please click 'Apply' to submit it."
msgstr "కిందిది మీ బగౠనివేదిక యొకà±à°• సంకà±à°·à°¿à°ªà±à°¤à°¸à°®à°¾à°šà°¾à°°à°®à±. దానిని à°…à°ªà±à°ªà°šà±†à°ªà±à°ªà±à°Ÿà°•à± దయచేసి 'ఆపాదించà±' నొకà±à°•à±à°®à±."
-#: ../src/gui/CReporterAssistant.py:952
+#: ../src/gui/CReporterAssistant.py:980
msgid "<b>Basic details</b>"
msgstr "<b>à°ªà±à°°à°¾à°§à°®à°¿à°• వివరమà±à°²à±</b>"
#. left table
-#: ../src/gui/CReporterAssistant.py:959
+#: ../src/gui/CReporterAssistant.py:987
msgid "Component"
msgstr "మూలకం"
-#: ../src/gui/CReporterAssistant.py:960
+#: ../src/gui/CReporterAssistant.py:988
msgid "Package"
msgstr "à°ªà±à°¯à°¾à°•à±‡à°œà°¿"
-#: ../src/gui/CReporterAssistant.py:961
+#: ../src/gui/CReporterAssistant.py:989
msgid "Executable"
msgstr "à°Žà°—à±à°œà°¿à°•à±à°¯à±‚à°Ÿà°¬à±à°²à±"
-#: ../src/gui/CReporterAssistant.py:962
+#: ../src/gui/CReporterAssistant.py:990
msgid "Cmdline"
msgstr "Cmdline"
#. right table
-#: ../src/gui/CReporterAssistant.py:964
+#: ../src/gui/CReporterAssistant.py:992
msgid "Architecture"
msgstr "ఆకృతి"
-#: ../src/gui/CReporterAssistant.py:965
+#: ../src/gui/CReporterAssistant.py:993
msgid "Kernel"
msgstr "కెరà±à°¨à°²à±"
-#: ../src/gui/CReporterAssistant.py:966
+#: ../src/gui/CReporterAssistant.py:994
msgid "Release"
msgstr "విడà±à°¦à°²à°šà±‡à°¯à°¿"
-#: ../src/gui/CReporterAssistant.py:967
+#: ../src/gui/CReporterAssistant.py:995
msgid "Reason"
msgstr "కారణం"
-#: ../src/gui/CReporterAssistant.py:978 ../src/gui/report.glade.h:3
+#: ../src/gui/CReporterAssistant.py:1006 ../src/gui/report.glade.h:3
msgid "<b>Backtrace</b>"
msgstr "<b>à°¬à±à°¯à°¾à°•à±â€Œà°Ÿà±à°°à±‡à°¸à±</b>"
-#: ../src/gui/CReporterAssistant.py:981
+#: ../src/gui/CReporterAssistant.py:1009
msgid "Click to view..."
msgstr "వీకà±à°·à°¿à°‚à°šà±à°Ÿà°•à± నొకà±à°•à±à°®à±..."
-#: ../src/gui/CReporterAssistant.py:993
+#: ../src/gui/CReporterAssistant.py:1021
msgid "<b>Steps to reproduce:</b>"
msgstr "<b>తిరిగివà±à°¤à±à°ªà°¨à±à°¨à°‚ చేయà±à°Ÿà°•à± అంచెలà±:</b>"
-#: ../src/gui/CReporterAssistant.py:1014
+#: ../src/gui/CReporterAssistant.py:1042
msgid "<b>Comments:</b>"
msgstr "<b>à°µà±à°¯à°¾à°–à±à°¯à°²à±:</b>"
-#: ../src/gui/CReporterAssistant.py:1017
+#: ../src/gui/CReporterAssistant.py:1045
msgid "No comment provided!"
msgstr "à° à°µà±à°¯à°¾à°–à±à°¯ అందివà±à°µà°¬à°¡à°²à±‡à°¦à±!"
-#: ../src/gui/CReporterAssistant.py:1053
+#: ../src/gui/CReporterAssistant.py:1081
msgid "Finished sending the bug report"
msgstr "బగౠనివేదికనౠపంపà±à°Ÿ పూరà±à°¤à±ˆà°¨à°¦à°¿"
-#: ../src/gui/CReporterAssistant.py:1057
+#: ../src/gui/CReporterAssistant.py:1085
msgid "<b>Bug reports:</b>"
msgstr "<b>బగౠనివేదికలà±:</b>"
@@ -1227,111 +1234,131 @@ msgstr ""
"à°®à±à°‚à°¦à±à°—à°¾ తతà±à°¸à°‚భందిత ఆకృతీకరణనౠతెరిచి మరియౠదానిని పరిషà±à°•à°°à°¿à°‚à°šà±à°Ÿà°•à± దయచేసి కింది బటనà±à°²à°¨à± "
"à°µà±à°ªà°¯à±‹à°—à°¿à°‚à°šà±à°®à±, లేదంటే, నివేదీకరణ కారà±à°¯à°•à±à°°à°®à°®à± విఫలం కావచà±à°šà±à°¨à±.\n"
-#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.cpp:47
+#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.c:45
#, c-format
msgid "Uploaded: %llu of %llu kbytes"
-msgstr ""
+msgstr "à°…à°ªà±â€Œà°²à±‹à°¡à±ˆà°‚ది: %llu మొతà±à°¤à°‚ %llu కిబైటà±à°²à°²à±‹"
-#: ../src/lib/parse_options.c:11
+#: ../src/lib/parse_options.c:29
#, c-format
msgid "Usage: %s\n"
msgstr ""
-#: ../src/plugins/abrt-action-analyze-c.c:154
+#: ../src/plugins/abrt-action-analyze-c.c:156
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID of coredumps"
msgstr ""
-#: ../src/plugins/abrt-action-analyze-oops.c:131
+#: ../src/plugins/abrt-action-analyze-oops.c:133
msgid ""
" [-vs] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of oops crash dumps"
msgstr ""
-#: ../src/plugins/abrt-action-analyze-python.c:36
+#: ../src/plugins/abrt-action-analyze-python.c:38
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of python crash dumps"
msgstr ""
-#: ../src/plugins/abrt-action-bugzilla.cpp:532
+#: ../src/plugins/abrt-action-bugzilla.cpp:534
#, c-format
msgid "New bug id: %i"
msgstr "కొతà±à°¤ బగౠid: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:645
-#, c-format
-msgid "Can't open '%s'"
-msgstr ""
-
-#: ../src/plugins/abrt-action-bugzilla.cpp:665
+#: ../src/plugins/abrt-action-bugzilla.cpp:662
#, fuzzy, c-format
msgid "Empty login or password, please check %s"
msgstr ""
"ఖాళీ లాగినౠలేదా సంకేతపదమà±.\n"
"దయచేసి సరిచూసà±à°•à±Šà°¨à±à°®à± "
-#: ../src/plugins/abrt-action-bugzilla.cpp:683
+#: ../src/plugins/abrt-action-bugzilla.cpp:680
msgid "Logging into bugzilla..."
msgstr "బగà±â€Œà°œà°¿à°²à±à°²à°¾ లోనికి లాగినౠఅవà±à°¤à±‹à°‚ది..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:686
+#: ../src/plugins/abrt-action-bugzilla.cpp:683
msgid "Checking for duplicates..."
msgstr "నకిలీల కొరకౠపరిశీలించà±à°šà±à°¨à±à°¨à°¦à°¿..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:707
-#: ../src/plugins/abrt-action-bugzilla.cpp:743
+#: ../src/plugins/abrt-action-bugzilla.cpp:704
+#: ../src/plugins/abrt-action-bugzilla.cpp:740
msgid "Missing mandatory member 'bugs'"
msgstr "తపà±à°ªà°¨à°¿à°¸à°°à±ˆà°¨ సభà±à°¯à±à°¨à°¿ 'bugs' తపà±à°ªà°¿à°ªà±‹à°¯à°¿à°¨à°µà°¿"
-#: ../src/plugins/abrt-action-bugzilla.cpp:726
-#: ../src/plugins/abrt-action-bugzilla.cpp:759
-#: ../src/plugins/abrt-action-bugzilla.cpp:834
+#: ../src/plugins/abrt-action-bugzilla.cpp:723
+#: ../src/plugins/abrt-action-bugzilla.cpp:756
+#: ../src/plugins/abrt-action-bugzilla.cpp:833
msgid "get_bug_info() failed. Could not collect all mandatory information"
msgstr "get_bug_info() విఫలమైంది. తపà±à°ªà°¨à°¿à°¸à°°à±ˆà°¨ సమాచారమౠమొతà±à°¤à°‚నౠసేకరించలేక పోయింది"
-#: ../src/plugins/abrt-action-bugzilla.cpp:775
+#: ../src/plugins/abrt-action-bugzilla.cpp:772
msgid "Creating a new bug..."
msgstr "కొతà±à°¤ బగà±â€Œà°¨à± సృషà±à°Ÿà°¿à°‚à°šà±à°šà±à°¨à±à°¨à°¦à°¿..."
-#: ../src/plugins/abrt-action-bugzilla.cpp:780
+#: ../src/plugins/abrt-action-bugzilla.cpp:777
msgid "Bugzilla entry creation failed"
msgstr "బగà±â€Œà°œà°¿à°²à±à°²à°¾ పదà±à°¦à± సృషà±à°Ÿà°¿à°‚à°šà±à°Ÿ విఫలమైంది"
-#: ../src/plugins/abrt-action-bugzilla.cpp:790
-#: ../src/plugins/abrt-action-bugzilla.cpp:887
+#: ../src/plugins/abrt-action-bugzilla.cpp:789
+#: ../src/plugins/abrt-action-bugzilla.cpp:886
msgid "Logging out..."
msgstr "లాగà±à°…à°µà±à°Ÿà± à°…à°µà±à°šà±à°¨à±à°¨à°¦à°¿..."
#. decision based on state
-#: ../src/plugins/abrt-action-bugzilla.cpp:808
+#: ../src/plugins/abrt-action-bugzilla.cpp:807
#, c-format
msgid "Bug is already reported: %i"
msgstr "బగౠయిపà±à°ªà°Ÿà°¿à°•à±‡ నివేదించబడింది: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:819
+#: ../src/plugins/abrt-action-bugzilla.cpp:818
#, c-format
msgid "Bugzilla couldn't find parent of bug %d"
msgstr "బగà±â€Œà°œà°¿à°²à±à°²à°¾ బగౠ%d యొకà±à°• మాతà±à°°à±à°•(పేరెంటà±)నౠకనà±à°—ొనలేక పోయింది"
-#: ../src/plugins/abrt-action-bugzilla.cpp:848
+#: ../src/plugins/abrt-action-bugzilla.cpp:847
#, fuzzy, c-format
msgid "Add %s to CC list"
msgstr "%sనౠCC జాబితాకౠజతచేసినది"
-#: ../src/plugins/abrt-action-bugzilla.cpp:872
+#: ../src/plugins/abrt-action-bugzilla.cpp:871
#, c-format
msgid "Adding new comment to bug %d"
msgstr "కొతà±à°¤ à°µà±à°¯à°¾à°–à±à°¯à°¨à± బగà±(%d)నకౠజతచేయà±à°®à±"
+#: ../src/plugins/abrt-action-bugzilla.cpp:913
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to Bugzilla"
+msgstr ""
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:928
+#: ../src/plugins/abrt-action-kerneloops.c:148
+#: ../src/plugins/abrt-action-rhtsupport.c:278
+msgid "Configuration file (may be given many times)"
+msgstr ""
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:257
+msgid " [options] -d DIR"
+msgstr ""
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:270
+msgid "Additional debuginfo directories"
+msgstr ""
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:271
+msgid "Kill gdb if it runs for more than N seconds"
+msgstr ""
+
#: ../src/plugins/abrt-action-generate-backtrace.c:319
#, c-format
msgid "Backtrace parsing failed for %s"
-msgstr ""
+msgstr "%s కొరకౠబాకà±â€Œà°Ÿà±à°°à±‡à°¸à± పారà±à°¶à°¿à°‚గౠవిఫలమైంది"
#: ../src/plugins/abrt-action-install-debuginfo.py:72
#, python-format
@@ -1448,45 +1475,52 @@ msgstr ""
msgid "Complete!"
msgstr "మూలకం"
-#: ../src/plugins/abrt-action-kerneloops.cpp:111
+#: ../src/plugins/abrt-action-kerneloops.c:105
#, fuzzy, c-format
msgid "Submitting oops report to %s"
msgstr "నివేదికనౠ'%s'à°•à± à°µà±à°°à°¾à°¯à±à°šà±à°¨à±à°¨à°¦à°¿"
-#: ../src/plugins/abrt-action-mailx.cpp:114
+#: ../src/plugins/abrt-action-kerneloops.c:133
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a kernel oops to kerneloops.org (or similar) site"
+msgstr ""
+
+#: ../src/plugins/abrt-action-mailx.c:110
msgid "Sending an email..."
msgstr "ఈమెయిలౠపంపà±à°šà±à°¨à±à°¨à°¦à°¿..."
-#: ../src/plugins/abrt-action-mailx.cpp:138
+#: ../src/plugins/abrt-action-mailx.c:137
msgid ""
" [-v] -d DIR [-c CONFFILE]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
-#: ../src/plugins/abrt-action-mailx.cpp:151
-#: ../src/plugins/abrt-action-upload.cpp:267
+#: ../src/plugins/abrt-action-mailx.c:150
+#: ../src/plugins/abrt-action-upload.c:262
#, fuzzy
msgid "Config file"
msgstr "లాగరౠఫైలà±:"
-#: ../src/plugins/abrt-action-print.cpp:39
+#: ../src/plugins/abrt-action-print.c:38
msgid ""
" [-v] [-o FILE] -d DIR\n"
"\n"
"Print information about the crash to standard output"
msgstr ""
-#: ../src/plugins/abrt-action-print.cpp:51
+#: ../src/plugins/abrt-action-print.c:51
msgid "Output file"
msgstr ""
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was appended to %s"
msgstr "నివేదిక à°…à°¨à±à°¨à°¦à°¿ %sకౠజోడించబడింది"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was stored to %s"
msgstr "నివేదిక %sకౠనిలà±à°µà°µà±à°‚చబడింది"
@@ -1494,49 +1528,79 @@ msgstr "నివేదిక %sకౠనిలà±à°µà°µà±à°‚చబడింà°
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
#. error msg is already logged by dd_opendir
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
-#: ../src/plugins/abrt-action-rhtsupport.cpp:43
-#: ../src/plugins/abrt-action-upload.cpp:121
+#: ../src/plugins/abrt-action-rhtsupport.c:41
+#: ../src/plugins/abrt-action-upload.c:119
msgid "Compressing data"
-msgstr ""
+msgstr "డాటానౠకà±à°¦à°¿à°‚à°šà±à°šà±à°¨à±à°¨à°¦à°¿"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:78
+#: ../src/plugins/abrt-action-rhtsupport.c:69
#, fuzzy
msgid "Empty login or password, please check RHTSupport.conf"
msgstr ""
"ఖాళీ లాగినౠలేదా సంకేతపదమà±.\n"
"దయచేసి సరిచూసà±à°•à±Šà°¨à±à°®à± "
-#: ../src/plugins/abrt-action-rhtsupport.cpp:194
+#: ../src/plugins/abrt-action-rhtsupport.c:188
msgid "Creating a new case..."
msgstr "కొతà±à°¤ కేసà±â€Œà°¨à± సృషà±à°Ÿà°¿à°‚à°šà±à°šà±à°¨à±à°¨à°¦à°¿..."
-#: ../src/plugins/abrt-action-upload.cpp:65
+#: ../src/plugins/abrt-action-rhtsupport.c:263
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to RHTSupport"
+msgstr ""
+
+#: ../src/plugins/abrt-action-upload.c:63
#, fuzzy, c-format
msgid "Sending %s to %s"
msgstr "ఆరà±à°šà°¿à°µà± %sనౠ%s కౠపంపà±à°šà±à°¨à±à°¨à°¦à°¿"
#. This ends up a "reporting status message" in abrtd
-#: ../src/plugins/abrt-action-upload.cpp:98
+#: ../src/plugins/abrt-action-upload.c:96
#, c-format
msgid "Successfully sent %s to %s"
msgstr ""
-#: ../src/plugins/abrt-action-upload.cpp:219
+#: ../src/plugins/abrt-action-upload.c:213
#, c-format
msgid "Archive is created: '%s'"
msgstr ""
-#: ../src/plugins/abrt-action-upload.cpp:253
+#: ../src/plugins/abrt-action-upload.c:248
msgid ""
" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
-#: ../src/plugins/abrt-action-upload.cpp:268
+#: ../src/plugins/abrt-action-upload.c:263
msgid "Base URL to upload to"
msgstr ""
+#: ../src/plugins/abrt-dump-oops.c:539
+msgid ""
+" [-vsrdow] FILE\n"
+"\n"
+"Extract oops from syslog/dmesg file"
+msgstr ""
+
+#: ../src/plugins/abrt-dump-oops.c:555
+msgid "Parse kernel's message buffer before parsing FILE"
+msgstr ""
+
+#: ../src/plugins/abrt-dump-oops.c:556
+msgid "Create ABRT dump for every oops found"
+msgstr ""
+
+#: ../src/plugins/abrt-dump-oops.c:557
+msgid "Print found oopses on standard output"
+msgstr ""
+
+#: ../src/plugins/abrt-dump-oops.c:558
+msgid "Do not exit, watch the file for new oopses"
+msgstr ""
+
#: ../src/plugins/Bugzilla.glade.h:1
msgid "<b>Bugzilla plugin configuration</b>"
msgstr "<b>బగà±â€Œà°œà°¿à°²à±à°²à°¾ à°ªà±à°²à°—ినౠఆకృతీకరణ</b>"
@@ -1573,10 +1637,6 @@ msgstr ""
"మీరౠదీనిని <a href=\"https://bugzilla.redhat.com/createaccount.cgi\">ఇచట</a> "
"సృషà±à°Ÿà°¿à°‚చగలరà±"
-#: ../src/plugins/CCpp.cpp:277
-msgid "Analyzes crashes in C/C++ programs"
-msgstr "C/C++ à°ªà±à°°à±‹à°—à±à°°à°¾à°®à±à°²à°¨à°‚దలి à°•à±à°°à°¾à°·à±â€Œà°²à°¨à± విశà±à°²à±‡à°·à°¿à°‚à°šà±à°®à±"
-
#: ../src/plugins/KerneloopsReporter.glade.h:1
msgid "<b>Kerneloops Reporter plugin configuration</b>"
msgstr "<b>Kerneloops నివేదకి à°ªà±à°²à°—ినౠఆకృతీకరణ</b>"
@@ -1585,10 +1645,6 @@ msgstr "<b>Kerneloops నివేదకి à°ªà±à°²à°—ినౠఆకృతà±
msgid "Submit URL:"
msgstr "URL à°…à°ªà±à°ªà°šà±†à°ªà±à°ªà±à°®à±:"
-#: ../src/plugins/KerneloopsScanner.cpp:227
-msgid "Periodically scans for and saves kernel oopses"
-msgstr "కెరà±à°¨à°²à± oops కొరకౠసమయానà±à°¸à°¾à°°à°‚ à°¸à±à°•à°¾à°¨à± చేసి మరియౠదాయà±à°¨à±"
-
#: ../src/plugins/Logger.glade.h:1
msgid "<b>Logger plugin configuration</b>"
msgstr "<b>లాగరౠపà±à°²à°—ినౠఆకృతీకరణ</b>"
@@ -1654,11 +1710,12 @@ msgstr "URL:"
msgid "Use encryption"
msgstr "à°Žà°¨à±à°•à±à°°à°¿à°ªà±à°·à°¨à± à°µà±à°ªà°¯à±‹à°—à°¿à°‚à°šà±à°®à±"
-#~ msgid "Database plugin not specified. Please check abrtd settings."
-#~ msgstr "డాటాబేసౠపà±à°²à°—ినౠతెలà±à°ªà°¬à°¡à°²à±‡à°¦à±. దయచేసి abrtd అమరికలనౠపరిశీలించండి."
-
-#~ msgid "Keeps SQLite3 database about all crashes"
-#~ msgstr "à°…à°¨à±à°¨à°¿ à°•à±à°°à°¾à°·à±â€Œà°² à°—à±à°°à°¿à°‚à°šà°¿ SQLite3 డాటాబేసà±â€Œà°¨à± కలిగివà±à°‚à°¡à±à°¨à±"
+#~ msgid ""
+#~ "Cannot login. Check Edit->Plugins->Bugzilla and /etc/abrt/plugins/"
+#~ "Bugzilla.conf. Server said: %s"
+#~ msgstr ""
+#~ "లాగినౠకాలేదà±. సరిచేయà±->à°ªà±à°²à°—à°¿à°¨à±à°¸à±->బగà±â€Œà°œà°¿à°²à±à°²à°¾ మరియౠ/etc/abrt/plugins/Bugzilla.conf "
+#~ "పరిశీలించà±à°®à±. సరà±à°µà°°à± చేబà±à°¤à±‹à°‚ది: %s"
#~ msgid "Reports bugs to bugzilla"
#~ msgstr "బగà±â€Œà°²à°¨à± బగà±â€Œà°œà°¿à°²à±à°²à°¾à°•à± నివేదించà±à°¨à±"
@@ -1666,12 +1723,12 @@ msgstr "à°Žà°¨à±à°•à±à°°à°¿à°ªà±à°·à°¨à± à°µà±à°ªà°¯à±‹à°—à°¿à°‚à°šà±à°®à±
#~ msgid "Generating backtrace"
#~ msgstr "బాకà±â€Œà°Ÿà±à°°à±‡à°¸à± à°µà±à°¦à±à°­à°µà°¿à°‚పచేయà±à°Ÿ"
-#~ msgid "Getting global universal unique identification..."
-#~ msgstr "à°—à±à°²à±‹à°¬à°²à± యూనివరà±à°¸à°²à± à°¯à±à°¨à°¿à°•à± à°—à±à°°à±à°¤à°¿à°‚à°ªà±à°¨à± పొందà±à°¤à±‹à°‚ది..."
-
#~ msgid "Skipping the debuginfo installation"
#~ msgstr "డీబగà±â€Œà°¸à°®à°¾à°šà°¾à°° సంసà±à°¥à°¾à°ªà°¨à°¨à± దాటవేసà±à°¤à±‹à°‚ది"
+#~ msgid "Analyzes crashes in C/C++ programs"
+#~ msgstr "C/C++ à°ªà±à°°à±‹à°—à±à°°à°¾à°®à±à°²à°¨à°‚దలి à°•à±à°°à°¾à°·à±â€Œà°²à°¨à± విశà±à°²à±‡à°·à°¿à°‚à°šà±à°®à±"
+
#~ msgid "FileTransfer: URL not specified"
#~ msgstr "ఫైలà±à°¬à°¦à°²à±€à°•à°°à°£: URL తెలà±à°ªà°¬à°¡à°²à±‡à°¦à±"
@@ -1693,6 +1750,9 @@ msgstr "à°Žà°¨à±à°•à±à°°à°¿à°ªà±à°·à°¨à± à°µà±à°ªà°¯à±‹à°—à°¿à°‚à°šà±à°®à±
#~ msgid "Sends kernel oops information to kerneloops.org"
#~ msgstr "కెరà±à°¨à°²à± oops సమాచారమà±à°¨à± kerneloops.orgకౠపంపà±à°¨à±"
+#~ msgid "Periodically scans for and saves kernel oopses"
+#~ msgstr "కెరà±à°¨à°²à± oops కొరకౠసమయానà±à°¸à°¾à°°à°‚ à°¸à±à°•à°¾à°¨à± చేసి మరియౠదాయà±à°¨à±"
+
#~ msgid "Writes report to a file"
#~ msgstr "నివేదికనౠఫైలà±à°¨à°•à± à°µà±à°°à°¾à°¯à±à°¨à±"
@@ -1713,9 +1773,8 @@ msgstr "à°Žà°¨à±à°•à±à°°à°¿à°ªà±à°·à°¨à± à°µà±à°ªà°¯à±‹à°—à°¿à°‚à°šà±à°®à±
#~ msgstr ""
#~ "à°•à±à°°à°¾à°·à± డాటానౠ.tar.gz ఫైలà±à°¨à°•à± పాకౠచేయà±à°¨à±, à°à°šà±à°šà°¿à°•à°‚à°—à°¾ దానిని FTP/SCP/etc à°¦à±à°µà°¾à°°à°¾ à°…à°ªà±â€Œà°²à±‹à°¡à± చేయà±à°¨à±"
-#, fuzzy
#~ msgid "Reports bugs to Red Hat support"
-#~ msgstr "బగà±â€Œà°²à°¨à± బగà±â€Œà°œà°¿à°²à±à°²à°¾à°•à± నివేదించà±à°¨à±"
+#~ msgstr "Red Hat తోడà±à°ªà°¾à°Ÿà±à°¨à°•à± బగà±â€Œà°²à°¨à± నివేదించà±à°¨à±"
#~ msgid "Runs a command, saves its output"
#~ msgstr "à°’à°• ఆదేశమà±à°¨à± నడà±à°ªà±à°¨à±, మరియౠదాని à°…à°µà±à°Ÿà±à°ªà±à°Ÿà±â€Œà°¨à± దాయà±à°¨à±"
@@ -1729,6 +1788,9 @@ msgstr "à°Žà°¨à±à°•à±à°°à°¿à°ªà±à°·à°¨à± à°µà±à°ªà°¯à±‹à°—à°¿à°‚à°šà±à°®à±
#~ msgid "Runs sosreport, saves the output"
#~ msgstr "sosreport నడà±à°ªà±à°¨à±, దాని à°…à°µà±à°Ÿà±à°ªà±à°Ÿà±â€Œà°¨à± దాయà±à°¨à±"
+#~ msgid "Keeps SQLite3 database about all crashes"
+#~ msgstr "à°…à°¨à±à°¨à°¿ à°•à±à°°à°¾à°·à±â€Œà°² à°—à±à°°à°¿à°‚à°šà°¿ SQLite3 డాటాబేసà±â€Œà°¨à± కలిగివà±à°‚à°¡à±à°¨à±"
+
#~ msgid "Customer:"
#~ msgstr "వినియోగదారి:"
@@ -1738,15 +1800,20 @@ msgstr "à°Žà°¨à±à°•à±à°°à°¿à°ªà±à°·à°¨à± à°µà±à°ªà°¯à±‹à°—à°¿à°‚à°šà±à°®à±
#~ msgid "Upload"
#~ msgstr "à°…à°ªà±â€Œà°²à±‹à°¡à±"
+#~ msgid "Database plugin not specified. Please check abrtd settings."
+#~ msgstr "డాటాబేసౠపà±à°²à°—ినౠతెలà±à°ªà°¬à°¡à°²à±‡à°¦à±. దయచేసి abrtd అమరికలనౠపరిశీలించండి."
+
+#~ msgid "Online _Help"
+#~ msgstr "ఆనà±â€Œà°²à±ˆà°¨à± సహాయం (_H)"
+
+#~ msgid "Can't connect to gnome-keyring-daemon, changes won't be saved."
+#~ msgstr "gnome-keyring-daemonà°•à± à°…à°¨à±à°¸à°‚ధానమౠకాలేకపోయింది, మారà±à°ªà±à°²à± దాయబడవà±."
+
#~ msgid "Rating is required by the %s plugin"
#~ msgstr "%s à°ªà±à°²à°—ినౠదà±à°µà°¾à°°à°¾ రేటింగౠఅవసరమైంది"
#~ msgid "Rating is not required by any plugin, skipping the check..."
#~ msgstr "à° à°ªà±à°²à°—ినౠదà±à°µà°¾à°°à°¾ రేటింగౠఅవసరమà±à°²à±‡à°¦à±, పరిశీలననౠదాటవేయà±à°šà±à°¨à±à°¨à°¦à°¿..."
-#~ msgid ""
-#~ "Cannot login. Check Edit->Plugins->Bugzilla and /etc/abrt/plugins/"
-#~ "Bugzilla.conf. Server said: %s"
-#~ msgstr ""
-#~ "లాగినౠకాలేదà±. సరిచేయà±->à°ªà±à°²à°—à°¿à°¨à±à°¸à±->బగà±â€Œà°œà°¿à°²à±à°²à°¾ మరియౠ/etc/abrt/plugins/Bugzilla.conf "
-#~ "పరిశీలించà±à°®à±. సరà±à°µà°°à± చేబà±à°¤à±‹à°‚ది: %s"
+#~ msgid "Getting global universal unique identification..."
+#~ msgstr "à°—à±à°²à±‹à°¬à°²à± యూనివరà±à°¸à°²à± à°¯à±à°¨à°¿à°•à± à°—à±à°°à±à°¤à°¿à°‚à°ªà±à°¨à± పొందà±à°¤à±‹à°‚ది..."
diff --git a/po/uk.po b/po/uk.po
index 6c6c6c60..94b13089 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -3,20 +3,20 @@
# This file is distributed under the same license as the abrt package.
#
# Maxim Dzumanenko <dziumanenko@gmail.com>, 2010.
-# Yuri Chornoivan <yurchor@ukr.net>, 2010.
+# Yuri Chornoivan <yurchor@ukr.net>, 2010, 2011.
msgid ""
msgstr ""
"Project-Id-Version: abrt\n"
"Report-Msgid-Bugs-To: jmoskovc@redhat.com\n"
-"POT-Creation-Date: 2010-11-29 13:51+0100\n"
-"PO-Revision-Date: 2010-10-15 18:47+0300\n"
+"POT-Creation-Date: 2011-02-06 02:46+0000\n"
+"PO-Revision-Date: 2011-02-06 09:36+0200\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <trans-uk@lists.fedoraproject.org>\n"
-"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 1.1\n"
+"Language: uk\n"
+"X-Generator: Lokalize 1.2\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: ../src/applet/abrt-applet.desktop.in.h:1
@@ -29,16 +29,16 @@ msgstr "Ðплет ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ ABRT"
msgid "Automatic Bug Reporting Tool"
msgstr "ABRT — автоматичне Ð·Ð²Ñ–Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ помилки"
-#: ../src/applet/Applet.cpp:86
+#: ../src/applet/applet.c:86
#, c-format
msgid "A crash in the %s package has been detected"
msgstr "Було виÑвлено збій у пакунку %s"
-#: ../src/applet/Applet.cpp:88
+#: ../src/applet/applet.c:88
msgid "A crash has been detected"
msgstr "ВиÑвлено збій у пакеті"
-#: ../src/applet/Applet.cpp:285
+#: ../src/applet/applet.c:285
msgid "ABRT service is not running"
msgstr "Службу ABRT не запущено"
@@ -54,7 +54,7 @@ msgstr ""
"Ðплет у облаÑÑ‚Ñ– Ñповіщень Ð´Ð»Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача про виÑвлені ABRT "
"проблеми"
-#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:23
+#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:24
msgid "translator-credits"
msgstr ""
"МакÑим Дзюманенко <dziumanenko@gmail.com>\n"
@@ -64,7 +64,7 @@ msgstr ""
msgid "Hide"
msgstr "Сховати"
-#: ../src/applet/applet_gtk.c:360 ../src/gui/ccgui.glade.h:13
+#: ../src/applet/applet_gtk.c:360 ../src/gui/ccgui.glade.h:14
msgid "Report"
msgstr "Повідомити"
@@ -72,8 +72,8 @@ msgstr "Повідомити"
msgid "Open ABRT"
msgstr "Відкрити ABRT"
-#: ../src/cli/CLI.cpp:47
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:91
+#, c-format
msgid ""
"\tCrash dump : %s\n"
"\tUID : %s\n"
@@ -82,20 +82,20 @@ msgid ""
"\tCrash Time : %s\n"
"\tCrash Count: %s\n"
msgstr ""
+"\tДамп збою : %s\n"
"\tUID : %s\n"
-"\tUUID : %s\n"
"\tПакунок : %s\n"
"\tВик. файл : %s\n"
"\tÐ§Ð°Ñ Ð·Ð±Ð¾ÑŽ : %s\n"
"\tКількіÑÑ‚ÑŒ : %s\n"
-#: ../src/cli/CLI.cpp:65
+#: ../src/cli/CLI.cpp:110
#, c-format
msgid "\tHostname : %s\n"
msgstr "\tÐазва вузла: %s\n"
-#: ../src/cli/CLI.cpp:98
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:143
+#, c-format
msgid ""
"Dump directory: %s\n"
"Last crash: %s\n"
@@ -107,7 +107,7 @@ msgid ""
"System: %s, kernel %s\n"
"Reason: %s\n"
msgstr ""
-"Ідентифікатор збою: %s:%s\n"
+"Каталог дампу: %s\n"
"ОÑтанній збій: %s\n"
"Ðналізатор: %s\n"
"Компонент: %s\n"
@@ -117,27 +117,27 @@ msgstr ""
"СиÑтема: %s, Ñдро %s\n"
"Причина: %s\n"
-#: ../src/cli/CLI.cpp:125
+#: ../src/cli/CLI.cpp:171
#, c-format
msgid "Coredump file: %s\n"
msgstr "Файл coredump: %s\n"
-#: ../src/cli/CLI.cpp:129
+#: ../src/cli/CLI.cpp:175
#, c-format
msgid "Rating: %s\n"
msgstr "Оцінка: %s\n"
-#: ../src/cli/CLI.cpp:134
+#: ../src/cli/CLI.cpp:180
#, c-format
msgid "Crash function: %s\n"
msgstr "Ðварійна функціÑ: %s\n"
-#: ../src/cli/CLI.cpp:138
+#: ../src/cli/CLI.cpp:184
#, c-format
msgid "Hostname: %s\n"
msgstr "Ðазва вузла: %s\n"
-#: ../src/cli/CLI.cpp:142
+#: ../src/cli/CLI.cpp:188
#, c-format
msgid ""
"\n"
@@ -148,7 +148,7 @@ msgstr ""
"СпоÑіб відтвореннÑ:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:146
+#: ../src/cli/CLI.cpp:192
#, c-format
msgid ""
"\n"
@@ -159,7 +159,7 @@ msgstr ""
"Коментар:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:152
+#: ../src/cli/CLI.cpp:198
#, c-format
msgid ""
"\n"
@@ -170,71 +170,65 @@ msgstr ""
"Зворотне траÑуваннÑ:\n"
"%s\n"
-#. Message has embedded tabs.
-#: ../src/cli/CLI.cpp:243
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:295
+#, c-format
msgid ""
-"Usage: %s [OPTION]\n"
+"Usage: %s -l[f] [-D BASE_DIR]...]\n"
+" or: %s -r[y] CRASH_DIR\n"
+" or: %s -i[b] CRASH_DIR\n"
+" or: %s -d CRASH_DIR\n"
"\n"
-"Startup:\n"
-"\t-V, --version\t\tdisplay the version of %s and exit\n"
-"\t-?, --help\t\tprint this help\n"
+"\t-l, --list\t\tList not yet reported crashes\n"
+"\t -f, --full\t\tList all crashes\n"
+"\t-D BASE_DIR\t\tDirectory to list crashes from\n"
+"\t\t\t\t(default: -D $HOME/.abrt/spool -D %s)\n"
"\n"
-"Actions:\n"
-"\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
-"\t -f, --full\tprint a list of all crashes, including the already "
-"reported ones\n"
-"\t-r, --report CRASH_ID\tcreate and send a report\n"
-"\t -y, --always\tcreate and send a report without asking\n"
-"\t-d, --delete CRASH_ID\tremove a crash\n"
-"\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
-"\t -b, --backtrace\tprint detailed information about a crash including "
-"backtrace\n"
-"CRASH_ID can be:\n"
-"\ta name of dump directory, or\n"
-"\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+"\t-r, --report\t\tSend a report about CRASH_DIR\n"
+"\t -y, --always\t\t...without editing and asking\n"
+"\t-i, --info\t\tPrint detailed information about CRASH_DIR\n"
+"\t -b, --backtrace\t...including backtrace\n"
+"\t-d, --delete\t\tRemove CRASH_DIR\n"
+"\n"
+"\t-V, --version\t\tDisplay version and exit\n"
+"\t-v, --verbose\t\tBe verbose\n"
msgstr ""
-"ВикориÑтаннÑ: %s [ПÐРÐМЕТР]\n"
+"ВикориÑтаннÑ: %s -l[f] [-D BASE_DIR]...]\n"
+" або %s -r[y] CRASH_DIR\n"
+" або %s -i[b] CRASH_DIR\n"
+" або %s -d CRASH_DIR\n"
+"\n"
+"\t-l, --list\t\tПоказати ÑпиÑок аварій, щодо Ñких не надіÑлано звітів.\n"
+"\t -f, --full\t\tПоказати ÑпиÑок вÑÑ–Ñ… аварій.\n"
+"\t-D BASE_DIR\t\tВказати каталог, за Ñким Ñлід будувати ÑпиÑки\n"
+"\t\t\t\t(типове значеннÑ: -D $HOME/.abrt/spool -D %s).\n"
"\n"
-"ЗапуÑк:\n"
-"\t-V, --version\t\tпоказати дані щодо верÑÑ–Ñ— %s Ñ– завершити роботу\n"
-"\t-?, --help\t\tпоказати цю довідкову інформацію\n"
+"\t-r, --report\t\tÐадіÑлати звіт щодо CRASH_DIR\n"
+"\t -y, --always\t\t...з редагуваннÑм та питаннÑми.\n"
+"\t-i, --info\t\tПоказати докладні дані щодо CRASH_DIR\n"
+"\t -b, --backtrace\t...зі зворотним траÑуваннÑм.\n"
+"\t-d, --delete\t\tВилучити CRASH_DIR.\n"
"\n"
-"Дії:\n"
-"\t-l, --list\t\tпоказати ÑпиÑок вÑÑ–Ñ… збоїв, щодо Ñких ще не Ñтворено звітів\n"
-"\t -f, --full\tвивеÑти ÑпиÑок вÑÑ–Ñ… збоїв, зокрема збоїв, щодо Ñких "
-"Ñтворено звіти\n"
-"\t-r, --report ІДЕÐТИФІКÐТОР\tÑтворити Ñ– надіÑлати звіт\n"
-"\t -y, --always\tÑтворити Ñ– надіÑлати звіт без підтвердженнÑ\n"
-"\t-d, --delete ІДЕÐТИФІКÐТОР\tвилучити звіт\n"
-"\t-i, --info ІДЕÐТИФІКÐТОР\tвивеÑти докладну інформацію щодо збою\n"
-"\t -b, --backtrace\tвивеÑти докладну інформацію щодо збою, зокрема "
-"зворотне траÑуваннÑ\n"
-"ЗначеннÑм ІДЕÐТИФІКÐТОР може бути:\n"
-"\tпара UID:UUID,\n"
-"\tунікальний Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ UUID — дію буде виконано над запиÑом збою з відповідним "
-"UUID\n"
-"\t@N — виконати дію над N-им збоєм (у ÑпиÑку, показаному командою з "
-"параметрами --list --full)\n"
-
-#: ../src/cli/CLI.cpp:287
+"\t-V, --version\t\tПоказати дані щодо верÑÑ–Ñ— Ñ– завершити роботу.\n"
+"\t-v, --verbose\t\tПоказувати докладні повідомленнÑ.\n"
+
+#: ../src/cli/CLI.cpp:343
msgid "You must specify exactly one operation"
msgstr "Вам Ñлід вказати точно одну дію"
-#: ../src/cli/report.cpp:166
+#: ../src/cli/report.cpp:161
#, c-format
msgid "# This field is read only\n"
msgstr "# Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñƒ цьому полі не можна змінювати\n"
-#: ../src/cli/report.cpp:186
+#: ../src/cli/report.cpp:181
msgid "# Describe the circumstances of this crash below"
msgstr "# Опишіть обÑтавини цього збою нижче"
-#: ../src/cli/report.cpp:188
+#: ../src/cli/report.cpp:183
msgid "# How to reproduce the crash?"
msgstr "# Як можна відтворити збій?"
-#: ../src/cli/report.cpp:190
+#: ../src/cli/report.cpp:185
msgid ""
"# Backtrace\n"
"# Check that it does not contain any sensitive data (passwords, etc.)"
@@ -242,49 +236,49 @@ msgstr ""
"# Зворотне траÑуваннÑ\n"
"# Ðе забудьте вилучити з цих даних будь-Ñкі конфіденційні дані (паролі тощо)"
-#: ../src/cli/report.cpp:192
+#: ../src/cli/report.cpp:187
msgid "# Architecture"
msgstr "# Ðрхітектура"
-#: ../src/cli/report.cpp:193
+#: ../src/cli/report.cpp:188
msgid "# Command line"
msgstr "# Командний Ñ€Ñдок"
-#: ../src/cli/report.cpp:194
+#: ../src/cli/report.cpp:189
msgid "# Component"
msgstr "# Компонент"
-#: ../src/cli/report.cpp:195
+#: ../src/cli/report.cpp:190
msgid "# Core dump"
msgstr "# Дамп Ñдра"
-#: ../src/cli/report.cpp:196
+#: ../src/cli/report.cpp:191
msgid "# Executable"
msgstr "# Виконуваний файл"
-#: ../src/cli/report.cpp:197
+#: ../src/cli/report.cpp:192
msgid "# Kernel version"
msgstr "# ВерÑÑ–Ñ Ñдра"
-#: ../src/cli/report.cpp:198
+#: ../src/cli/report.cpp:193
msgid "# Package"
msgstr "# Пакунок"
-#: ../src/cli/report.cpp:199
+#: ../src/cli/report.cpp:194
msgid "# Reason of crash"
msgstr "# Причина збою"
-#: ../src/cli/report.cpp:200
+#: ../src/cli/report.cpp:195
msgid "# Release string of the operating system"
msgstr "# РÑдок з даними щодо випуÑку операційної ÑиÑтеми"
-#: ../src/cli/report.cpp:323
+#: ../src/cli/report.cpp:318
msgid "Cannot run vi: $TERM, $VISUAL and $EDITOR are not set"
msgstr ""
"Ðе вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити vi: не вÑтановлено значень змінних $TERM, $VISUAL Ñ– "
"$EDITOR"
-#: ../src/cli/report.cpp:411
+#: ../src/cli/report.cpp:402
msgid ""
"\n"
"The report has been updated"
@@ -292,7 +286,7 @@ msgstr ""
"\n"
"Звіт було оновлено"
-#: ../src/cli/report.cpp:413
+#: ../src/cli/report.cpp:404
msgid ""
"\n"
"No changes were detected in the report"
@@ -301,46 +295,46 @@ msgstr ""
"Ðе виÑвлено жодних змін у звіті"
#. The response might take more than 1 char in non-latin scripts.
-#: ../src/cli/report.cpp:464
+#: ../src/cli/report.cpp:436
msgid "y"
msgstr "y"
-#: ../src/cli/report.cpp:465
+#: ../src/cli/report.cpp:437
msgid "N"
msgstr "N"
#. Read the missing information and push it to plugin settings.
-#: ../src/cli/report.cpp:565
+#: ../src/cli/report.cpp:568
#, c-format
msgid "Wrong settings were detected for plugin %s\n"
msgstr "ВиÑвлено помилкові параметри Ð¼Ð¾Ð´ÑƒÐ»Ñ %s\n"
-#: ../src/cli/report.cpp:569
+#: ../src/cli/report.cpp:572
msgid "Enter your login: "
msgstr "Введіть ваше Ñ–Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача: "
-#: ../src/cli/report.cpp:575
+#: ../src/cli/report.cpp:578
msgid "Enter your password: "
msgstr "Введіть ваш пароль: "
-#: ../src/cli/report.cpp:638
+#: ../src/cli/report.cpp:788
msgid "Reporting..."
msgstr "ЗвітуваннÑ…"
-#: ../src/cli/report.cpp:657
+#: ../src/cli/report.cpp:801
#, c-format
msgid "Report using %s?"
msgstr "Створити звіт за допомогою %s?"
-#: ../src/cli/report.cpp:660
+#: ../src/cli/report.cpp:804
msgid "Skipping..."
msgstr "ПропуÑкаємо…"
-#: ../src/cli/report.cpp:672
+#: ../src/cli/report.cpp:820
msgid "Reporting disabled because the backtrace is unusable"
msgstr "Ð—Ð²Ñ–Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾, оÑкільки зворотне траÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ” непридатним"
-#: ../src/cli/report.cpp:676
+#: ../src/cli/report.cpp:824
#, c-format
msgid ""
"Please try to install debuginfo manually using the command: \"debuginfo-"
@@ -349,55 +343,80 @@ msgstr ""
"Спробуйте вÑтановити debuginfo вручну: «debuginfo-install %s», потім "
"повторіть Ñпробу\n"
-#: ../src/cli/report.cpp:685
-msgid "Error loading reporter settings"
-msgstr "Помилка при завантаженні параметрів звітуваннÑ"
-
-#: ../src/cli/report.cpp:704
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:842
+#, c-format
msgid "Crash reported via %d report events (%d errors)\n"
-msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‰Ð¾Ð´Ð¾ збою Ñтворено за допомогою %d модулів (%d помилок)\n"
+msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‰Ð¾Ð´Ð¾ збою Ñтворено на оÑнові %d подій (%d помилок)\n"
-#: ../src/daemon/abrt-handle-crashdump.c:42
+#: ../src/daemon/abrt-action-save-package-data.c:280
msgid ""
-" [-vs] -d DIR -e EVENT\n"
-" or: "
+" [options] -d DIR\n"
+"\n"
+"Query package database and save package name, component, and description"
msgstr ""
+" [параметри] -d КÐТÐЛОГ\n"
+"\n"
+"Отримати дані з бази даних пакунків і зберегти назву пакунка, компонент та "
+"опиÑ"
-#: ../src/daemon/abrt-handle-crashdump.c:57
+#: ../src/daemon/abrt-action-save-package-data.c:292
+#: ../src/daemon/abrt-handle-crashdump.c:60
#: ../src/plugins/abrt-action-analyze-c.c:167
#: ../src/plugins/abrt-action-analyze-oops.c:144
#: ../src/plugins/abrt-action-analyze-python.c:49
+#: ../src/plugins/abrt-action-bugzilla.cpp:927
+#: ../src/plugins/abrt-action-generate-backtrace.c:270
+#: ../src/plugins/abrt-action-kerneloops.c:147
+#: ../src/plugins/abrt-action-mailx.c:149
+#: ../src/plugins/abrt-action-print.c:50
+#: ../src/plugins/abrt-action-rhtsupport.c:281
+#: ../src/plugins/abrt-action-upload.c:261
+msgid "Crash dump directory"
+msgstr "Каталог дампу аварійного завершеннÑ"
+
+#: ../src/daemon/abrt-action-save-package-data.c:293
+#: ../src/daemon/abrt-handle-crashdump.c:59 ../src/daemon/abrt-server.c:297
+#: ../src/plugins/abrt-action-bugzilla.cpp:926
+#: ../src/plugins/abrt-action-generate-backtrace.c:273
+#: ../src/plugins/abrt-action-kerneloops.c:146
+#: ../src/plugins/abrt-action-rhtsupport.c:280
+#: ../src/plugins/abrt-dump-oops.c:555
msgid "Log to syslog"
msgstr "ЗапиÑувати до журналу syslog"
-#: ../src/daemon/abrt-handle-crashdump.c:58
-#: ../src/plugins/abrt-action-analyze-c.c:166
-#: ../src/plugins/abrt-action-analyze-oops.c:143
-#: ../src/plugins/abrt-action-analyze-python.c:48
-#: ../src/plugins/abrt-action-mailx.cpp:150
-#: ../src/plugins/abrt-action-print.cpp:50
-#: ../src/plugins/abrt-action-upload.cpp:266
-msgid "Crash dump directory"
-msgstr "Каталог дампу аварійного завершеннÑ"
+#: ../src/daemon/abrt-handle-crashdump.c:43
+msgid ""
+" [-vs] -d DIR -e EVENT\n"
+" or: "
+msgstr ""
+" [-vs] -d КÐТÐЛОГ -e ПОДІЯ\n"
+" або: "
-#: ../src/daemon/abrt-handle-crashdump.c:59
+#: ../src/daemon/abrt-handle-crashdump.c:61
msgid "Handle EVENT"
-msgstr ""
+msgstr "Обробити ПОДІЮ"
-#: ../src/daemon/abrt-handle-crashdump.c:60
+#: ../src/daemon/abrt-handle-crashdump.c:62
msgid "List possible events [which start with PFX]"
-msgstr ""
+msgstr "СпиÑок запиÑів можливих подій [що починаютьÑÑ Ð· PFX]"
+
+#: ../src/daemon/abrt-server.c:286 ../src/daemon/Daemon.cpp:542
+msgid " [options]"
+msgstr " [параметри]"
-#: ../src/daemon/CommLayerServerDBus.cpp:229
+#: ../src/daemon/abrt-server.c:296
+msgid "Use UID as client uid"
+msgstr "ВикориÑтати UID Ñк унікальний ідентифікатор клієнта"
+
+#: ../src/daemon/CommLayerServerDBus.cpp:242
msgid "Comment is too long"
msgstr "Занадто довгий коментар"
-#: ../src/daemon/CommLayerServerDBus.cpp:233
+#: ../src/daemon/CommLayerServerDBus.cpp:246
msgid "'How to reproduce' is too long"
msgstr "Занадто довгий Ð·Ð°Ð¿Ð¸Ñ Â«Ð¡Ð¿Ð¾Ñіб відтвореннÑ»"
-#: ../src/daemon/Daemon.cpp:534
+#: ../src/daemon/Daemon.cpp:371
msgid ""
"The size of the report exceeded the quota. Please check system's "
"MaxCrashReportsSize value in abrt.conf."
@@ -405,19 +424,15 @@ msgstr ""
"Розмір звіту перевищує припуÑтимий. Змініть Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ MaxCrashReportsSize у "
"файлі abrt.conf"
-#: ../src/daemon/Daemon.cpp:699
-msgid "abrtd [options]"
-msgstr "abrtd [параметри]"
-
-#: ../src/daemon/Daemon.cpp:709
+#: ../src/daemon/Daemon.cpp:553
msgid "Do not daemonize"
msgstr "Ðе запуÑкати фонової Ñлужби"
-#: ../src/daemon/Daemon.cpp:710
+#: ../src/daemon/Daemon.cpp:554
msgid "Log to syslog even with -d"
msgstr "ЗапиÑувати до журналу syslog навіть з параметром -d"
-#: ../src/daemon/Daemon.cpp:711
+#: ../src/daemon/Daemon.cpp:555
msgid "Exit after SEC seconds of inactivity"
msgstr "Завершувати роботу піÑÐ»Ñ SEC Ñекунд бездіÑльноÑÑ‚Ñ–"
@@ -455,16 +470,16 @@ msgstr "Модулі звітуваннÑ"
msgid "Database plugins"
msgstr "Модулі бази даних"
-#: ../src/gui/CCDBusBackend.py:74 ../src/gui/CCDBusBackend.py:97
+#: ../src/gui/CCDBusBackend.py:75 ../src/gui/CCDBusBackend.py:98
msgid "Cannot connect to system dbus."
msgstr "Ðе вдаєтьÑÑ Ð·'єднатиÑÑ Ð· ÑиÑтемною dbus"
-#: ../src/gui/CCDBusBackend.py:120 ../src/gui/CCDBusBackend.py:123
+#: ../src/gui/CCDBusBackend.py:121 ../src/gui/CCDBusBackend.py:124
msgid "Please check if the abrt daemon is running."
msgstr "Перевірте, чи запущено Ñлужбу abrt."
#. FIXME: BUG: BarWindow remains. (how2reproduce: delete "component" in a dump dir and try to report it)
-#: ../src/gui/CCDBusBackend.py:169
+#: ../src/gui/CCDBusBackend.py:170
msgid ""
"Daemon did not return a valid report info.\n"
"Is debuginfo missing?"
@@ -512,11 +527,15 @@ msgstr "Про ABRT"
msgid "Copy to Clipboard"
msgstr "Скопіювати до буфера"
-#: ../src/gui/ccgui.glade.h:12 ../src/gui/settings.glade.h:19
+#: ../src/gui/ccgui.glade.h:12
+msgid "Online _Help"
+msgstr "Інтернет-_довідка"
+
+#: ../src/gui/ccgui.glade.h:13 ../src/gui/settings.glade.h:19
msgid "Plugins"
msgstr "Модулі"
-#: ../src/gui/ccgui.glade.h:14
+#: ../src/gui/ccgui.glade.h:15
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 "
@@ -543,19 +562,19 @@ msgstr ""
"ÐšÐ¾Ð¿Ñ–Ñ Ð»Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ— GNU надаєтьÑÑ Ñ€Ð°Ð·Ð¾Ð¼ із цією програмою. \n"
"Її також можна знайти на Ñайті <http://www.gnu.org/licenses/>."
-#: ../src/gui/ccgui.glade.h:19 ../src/gui/CReporterAssistant.py:71
+#: ../src/gui/ccgui.glade.h:20 ../src/gui/CReporterAssistant.py:111
msgid "View log"
msgstr "Показати журнал"
-#: ../src/gui/ccgui.glade.h:20
+#: ../src/gui/ccgui.glade.h:21
msgid "_Edit"
msgstr "_Правка"
-#: ../src/gui/ccgui.glade.h:21
+#: ../src/gui/ccgui.glade.h:22
msgid "_File"
msgstr "_Файл"
-#: ../src/gui/ccgui.glade.h:22
+#: ../src/gui/ccgui.glade.h:23
msgid "_Help"
msgstr "_Довідка"
@@ -576,7 +595,7 @@ msgstr "Ðазва вузла"
msgid "Latest Crash"
msgstr "ОÑтаннє аварійне завершеннÑ"
-#: ../src/gui/CCMainWindow.py:143
+#: ../src/gui/CCMainWindow.py:148
#, python-format
msgid ""
"Cannot show the settings dialog.\n"
@@ -585,7 +604,7 @@ msgstr ""
"Ðеможливо показати вікно параметрів.\n"
"%s"
-#: ../src/gui/CCMainWindow.py:148
+#: ../src/gui/CCMainWindow.py:153
#, python-format
msgid ""
"Unable to finish the current task!\n"
@@ -595,7 +614,7 @@ msgstr ""
"%s"
#. there is something wrong with the daemon if we cant get the dumplist
-#: ../src/gui/CCMainWindow.py:183
+#: ../src/gui/CCMainWindow.py:188
#, python-format
msgid ""
"Error while loading the dumplist.\n"
@@ -604,7 +623,7 @@ msgstr ""
"Помилка при завантаженні dumplist. \n"
"%s"
-#: ../src/gui/CCMainWindow.py:241
+#: ../src/gui/CCMainWindow.py:246
#, python-format
msgid ""
"<b>%s Crash</b>\n"
@@ -613,11 +632,11 @@ msgstr ""
"<b>Ðварійне Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ %s</b>\n"
"%s"
-#: ../src/gui/CCMainWindow.py:337
+#: ../src/gui/CCMainWindow.py:343
msgid "You have to select a crash to copy."
msgstr "Слід вибрати файл аварійного завершеннÑм Ð´Ð»Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ."
-#: ../src/gui/CCMainWindow.py:421
+#: ../src/gui/CCMainWindow.py:427
msgid ""
"Usage: abrt-gui [OPTIONS]\n"
"\t-v[vv]\t\t\tVerbose\n"
@@ -628,7 +647,7 @@ msgstr ""
"\t--report=ІДЕÐТИФІКÐТОР\tПовідомити про збій безпоÑередньо за його "
"ідентифікатором"
-#: ../src/gui/CCMainWindow.py:444
+#: ../src/gui/CCMainWindow.py:450
#, python-format
msgid ""
"No such crash in the database, probably wrong crashid.\n"
@@ -637,95 +656,6 @@ msgstr ""
"У базі даних немає такого збою, можливо, помилковий ідентифікатор.\n"
"ідентифікатор=%s"
-#. default texts
-#: ../src/gui/CCReporterDialog.py:22 ../src/gui/CReporterAssistant.py:20
-msgid "Brief description of how to reproduce this or what you did..."
-msgstr "Коротко опишіть дії, за допомогою Ñких можна відтворити помилку…"
-
-#: ../src/gui/CCReporterDialog.py:107
-msgid "You must check the backtrace for sensitive data."
-msgstr ""
-"Вам Ñлід вилучити з даних зворотного траÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²ÑÑ– конфіденційні дані."
-
-#: ../src/gui/CCReporterDialog.py:118 ../src/gui/CReporterAssistant.py:364
-#, python-format
-msgid ""
-"Reporting disabled because the backtrace is unusable.\n"
-"Please try to install debuginfo manually using the command: <b>debuginfo-"
-"install %s</b> \n"
-"then use the Refresh button to regenerate the backtrace."
-msgstr ""
-"Ð—Ð²Ñ–Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾, оÑкільки відомоÑÑ‚Ñ– траÑуванні непридатні.\n"
-"Спробуйте вÑтановити debuginfo вручну: <b>debuginfo-install %s</b>\n"
-"а потім натиÑніть кнопку Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ð³Ð¾ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð°ÑуваннÑ."
-
-#: ../src/gui/CCReporterDialog.py:120
-msgid "The backtrace is unusable, you cannot report this!"
-msgstr "Ðепридатні відомоÑÑ‚Ñ– траÑуваннÑ. Їх не можна надÑилати."
-
-#: ../src/gui/CCReporterDialog.py:124 ../src/gui/CReporterAssistant.py:342
-#: ../src/gui/CReporterAssistant.py:370
-msgid ""
-"The backtrace is incomplete, please make sure you provide the steps to "
-"reproduce."
-msgstr ""
-"Ðеповні відомоÑÑ‚Ñ– траÑуваннÑ. Вам доведетьÑÑ Ð²ÐºÐ°Ð·Ð°Ñ‚Ð¸ чіткі кроки з "
-"Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸."
-
-#: ../src/gui/CCReporterDialog.py:130
-msgid "Reporting disabled, please fix the problems shown above."
-msgstr "Ð—Ð²Ñ–Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾, виправте вказані вище проблеми."
-
-#: ../src/gui/CCReporterDialog.py:132
-msgid "Sends the report using the selected plugin."
-msgstr "ÐадÑилає звіт за допомогою вказано модулÑ."
-
-#: ../src/gui/CCReporterDialog.py:398
-msgid ""
-"No reporter plugin available for this type of crash.\n"
-"Please check abrt.conf."
-msgstr ""
-"Ðемає модулів Ð·Ð²Ñ–Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ типу збоїв.\n"
-"Будь лаÑка, внеÑÑ–Ñ‚ÑŒ зміни до abrt.conf"
-
-#: ../src/gui/CCReporterDialog.py:418 ../src/gui/CReporterAssistant.py:249
-#: ../src/gui/PluginsSettingsDialog.py:136
-#, python-format
-msgid ""
-"Cannot save plugin settings:\n"
-" %s"
-msgstr ""
-"Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ параметри модулÑ:\n"
-" %s"
-
-#: ../src/gui/CCReporterDialog.py:448 ../src/gui/CReporterAssistant.py:279
-#, python-format
-msgid "Configure %s options"
-msgstr "Ðалаштувати параметри %s"
-
-#: ../src/gui/CCReporterDialog.py:498 ../src/gui/CReporterAssistant.py:1074
-msgid ""
-"Unable to get report!\n"
-"Is debuginfo missing?"
-msgstr ""
-"Ðе вдаєтьÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ звіт.\n"
-"Ðемає debuginfo?"
-
-#: ../src/gui/CCReporterDialog.py:527 ../src/gui/CReporterAssistant.py:455
-#, python-format
-msgid ""
-"Reporting failed!\n"
-"%s"
-msgstr ""
-"Помилка під Ñ‡Ð°Ñ Ñпроби надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð²Ñ–Ñ‚Ñƒ!\n"
-"%s"
-
-#: ../src/gui/CCReporterDialog.py:553 ../src/gui/CCReporterDialog.py:574
-#: ../src/gui/CReporterAssistant.py:1113
-#, python-format
-msgid "Error acquiring the report: %s"
-msgstr "Помилка при отриманні звіту: %s"
-
#: ../src/gui/ConfBackend.py:78
msgid "Cannot connect to the Gnome Keyring daemon."
msgstr "Ðе вдалоÑÑ Ð²Ñтановити Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· фоновою Ñлужбою Gnome Keyring."
@@ -755,41 +685,89 @@ msgid "Access to gnome-keyring has been denied, cannot load settings."
msgstr ""
"ДоÑтуп до gnome-keyring було заборонено, параметри неможливо завантажити."
+#: ../src/gui/CReporterAssistant.py:20
+msgid "Brief description of how to reproduce this or what you did..."
+msgstr "Коротко опишіть дії, за допомогою Ñких можна відтворити помилку…"
+
#: ../src/gui/CReporterAssistant.py:21
msgid "Crash info doesn't contain a backtrace"
msgstr "ВідомоÑÑ‚Ñ– щодо збою не міÑÑ‚ÑÑ‚ÑŒ зворотного траÑуваннÑ"
-#: ../src/gui/CReporterAssistant.py:334
+#: ../src/gui/CReporterAssistant.py:277
+#: ../src/gui/PluginsSettingsDialog.py:136
+#, python-format
+msgid ""
+"Cannot save plugin settings:\n"
+" %s"
+msgstr ""
+"Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ параметри модулÑ:\n"
+" %s"
+
+#: ../src/gui/CReporterAssistant.py:307
+#, python-format
+msgid "Configure %s options"
+msgstr "Ðалаштувати параметри %s"
+
+#: ../src/gui/CReporterAssistant.py:362
#, python-format
msgid "Rating is %s"
msgstr "Оцінка: %s"
-#: ../src/gui/CReporterAssistant.py:337
+#: ../src/gui/CReporterAssistant.py:365
msgid "Crashdump doesn't have rating => we suppose it's not required"
msgstr "Дамп збою не міÑтить оцінки => припуÑкаємо, що вона не потрібна"
-#: ../src/gui/CReporterAssistant.py:350
+#: ../src/gui/CReporterAssistant.py:370 ../src/gui/CReporterAssistant.py:398
+msgid ""
+"The backtrace is incomplete, please make sure you provide the steps to "
+"reproduce."
+msgstr ""
+"Ðеповні відомоÑÑ‚Ñ– траÑуваннÑ. Вам доведетьÑÑ Ð²ÐºÐ°Ð·Ð°Ñ‚Ð¸ чіткі кроки з "
+"Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸."
+
+#: ../src/gui/CReporterAssistant.py:378
msgid "You should check the backtrace for sensitive data."
msgstr ""
"Вам Ñлід вилучити з даних зворотного траÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²ÑÑ– конфіденційні дані."
-#: ../src/gui/CReporterAssistant.py:351
+#: ../src/gui/CReporterAssistant.py:379
msgid "You must agree with sending the backtrace."
msgstr "Вам Ñлід погодитиÑÑ Ð½Ð° надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð²Ð¾Ñ€Ð¾Ñ‚Ð½Ð¾Ð³Ð¾ траÑуваннÑ."
-#: ../src/gui/CReporterAssistant.py:366
+#: ../src/gui/CReporterAssistant.py:392
+#, python-format
+msgid ""
+"Reporting disabled because the backtrace is unusable.\n"
+"Please try to install debuginfo manually using the command: <b>debuginfo-"
+"install %s</b> \n"
+"then use the Refresh button to regenerate the backtrace."
+msgstr ""
+"Ð—Ð²Ñ–Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾, оÑкільки відомоÑÑ‚Ñ– траÑуванні непридатні.\n"
+"Спробуйте вÑтановити debuginfo вручну: <b>debuginfo-install %s</b>\n"
+"а потім натиÑніть кнопку Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ð³Ð¾ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð°ÑуваннÑ."
+
+#: ../src/gui/CReporterAssistant.py:394
msgid "Reporting disabled because the backtrace is unusable."
msgstr "Ð—Ð²Ñ–Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾, оÑкільки зворотне траÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ” непридатним."
-#: ../src/gui/CReporterAssistant.py:412
+#: ../src/gui/CReporterAssistant.py:440
msgid "You did not provide any steps to reproduce."
msgstr "Ви не вказали кроків щодо Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð±Ð¾ÑŽ."
-#: ../src/gui/CReporterAssistant.py:426
+#: ../src/gui/CReporterAssistant.py:454
msgid "You did not provide any comments."
msgstr "Ви не зазначили жодних коментарів."
-#: ../src/gui/CReporterAssistant.py:507
+#: ../src/gui/CReporterAssistant.py:483
+#, python-format
+msgid ""
+"Reporting failed!\n"
+"%s"
+msgstr ""
+"Помилка під Ñ‡Ð°Ñ Ñпроби надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð²Ñ–Ñ‚Ñƒ!\n"
+"%s"
+
+#: ../src/gui/CReporterAssistant.py:535
#, python-format
msgid ""
"It looks like an application from the package <b>%s</b> has crashed on your "
@@ -816,15 +794,15 @@ msgstr ""
"Виберіть отримувача звіту про ваду Ñ– натиÑніть кнопку «Далі», щоб продовжити "
"Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð²Ñ–Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ."
-#: ../src/gui/CReporterAssistant.py:548
+#: ../src/gui/CReporterAssistant.py:576
msgid "Only one reporter plugin is configured."
msgstr "Ðалаштовано лише один модуль звітуваннÑ."
-#: ../src/gui/CReporterAssistant.py:554
+#: ../src/gui/CReporterAssistant.py:582
msgid "Send a bug report"
msgstr "ÐадіÑлати звіт про ваду"
-#: ../src/gui/CReporterAssistant.py:592
+#: ../src/gui/CReporterAssistant.py:620
msgid ""
"Below is the backtrace associated with your crash. A crash backtrace "
"provides developers with details about how the crash happened, helping them "
@@ -841,52 +819,52 @@ msgstr ""
"Будь лаÑка, ознайомтеÑÑ Ð· наведеними нижче даними Ñ– вилучіть з них будь-Ñкі "
"конфіденційні дані, Ñкими ви не бажаєте ділитиÑÑ Ð·Ñ– Ñторонніми оÑобами:"
-#: ../src/gui/CReporterAssistant.py:663 ../src/gui/CReporterAssistant.py:676
-#: ../src/gui/CReporterAssistant.py:710
+#: ../src/gui/CReporterAssistant.py:691 ../src/gui/CReporterAssistant.py:704
+#: ../src/gui/CReporterAssistant.py:738
#, python-format
msgid "Found %i occurence(s) [at: %i of %i]"
msgstr "Знайдено %i збіги [у %i з %i]"
-#: ../src/gui/CReporterAssistant.py:747
+#: ../src/gui/CReporterAssistant.py:775
msgid "Search:"
msgstr "Пошук:"
-#: ../src/gui/CReporterAssistant.py:778
+#: ../src/gui/CReporterAssistant.py:806
msgid "Refresh"
msgstr "Оновити"
-#: ../src/gui/CReporterAssistant.py:780
+#: ../src/gui/CReporterAssistant.py:808
msgid "Copy"
msgstr "Копіювати"
-#: ../src/gui/CReporterAssistant.py:786
+#: ../src/gui/CReporterAssistant.py:814
msgid "I agree with submitting the backtrace"
msgstr "Я погоджуюÑÑŒ на надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð²Ð¾Ñ€Ð¾Ñ‚Ð½Ð¾Ð³Ð¾ траÑуваннÑ"
-#: ../src/gui/CReporterAssistant.py:791
+#: ../src/gui/CReporterAssistant.py:819
msgid "Approve the backtrace"
msgstr "Згода з надÑиланнÑм зворотного траÑуваннÑ"
-#: ../src/gui/CReporterAssistant.py:834
+#: ../src/gui/CReporterAssistant.py:862
msgid "You need to fill the how to before you can proceed..."
-msgstr ""
+msgstr "Вам Ñлід вказати наÑтанови з відтвореннÑ, щоб обробку було продовжено…"
-#: ../src/gui/CReporterAssistant.py:857
+#: ../src/gui/CReporterAssistant.py:885
msgid "How did this crash happen (step-by-step)? How would you reproduce it?"
msgstr "Покрокові дії, Ñкі призвели до збою. Як відтворити збій?"
-#: ../src/gui/CReporterAssistant.py:877
+#: ../src/gui/CReporterAssistant.py:905
msgid ""
"Are there any comments you would like to share with the software maintainers?"
msgstr ""
"Чи маєте ви ÑкіÑÑŒ коментарі, про Ñкі варто знати розробникам програмного "
"забезпеченнÑ?"
-#: ../src/gui/CReporterAssistant.py:897
+#: ../src/gui/CReporterAssistant.py:925
msgid "Provide additional details"
msgstr "Ðадати додаткові дані"
-#: ../src/gui/CReporterAssistant.py:904
+#: ../src/gui/CReporterAssistant.py:932
msgid ""
"<b>Tip:</b> Your comments are not private. Please watch what you say "
"accordingly."
@@ -894,83 +872,96 @@ msgstr ""
"<b>Підказка:</b> доÑтуп до ваших коментарів Ñ” відкритим. Будь лаÑка, будьте "
"Ñтримані у виÑловлюваннÑÑ…."
-#: ../src/gui/CReporterAssistant.py:945
+#: ../src/gui/CReporterAssistant.py:973
msgid "Confirm and send the report"
msgstr "Підтвердити Ñ– надіÑлати звіт"
-#: ../src/gui/CReporterAssistant.py:947
+#: ../src/gui/CReporterAssistant.py:975
msgid ""
"Below is a summary of your bug report. Please click 'Apply' to submit it."
msgstr ""
"Ðижче наведено резюме вашого звіту про ваду. ÐатиÑніть кнопку «ЗаÑтоÑувати», "
"щоб надіÑлати його."
-#: ../src/gui/CReporterAssistant.py:952
+#: ../src/gui/CReporterAssistant.py:980
msgid "<b>Basic details</b>"
msgstr "<b>ОÑновні дані</b>"
#. left table
-#: ../src/gui/CReporterAssistant.py:959
+#: ../src/gui/CReporterAssistant.py:987
msgid "Component"
msgstr "Компонент"
-#: ../src/gui/CReporterAssistant.py:960
+#: ../src/gui/CReporterAssistant.py:988
msgid "Package"
msgstr "Пакунок"
-#: ../src/gui/CReporterAssistant.py:961
+#: ../src/gui/CReporterAssistant.py:989
msgid "Executable"
msgstr "Виконуваний файл"
-#: ../src/gui/CReporterAssistant.py:962
+#: ../src/gui/CReporterAssistant.py:990
msgid "Cmdline"
msgstr "Командний Ñ€Ñдок"
#. right table
-#: ../src/gui/CReporterAssistant.py:964
+#: ../src/gui/CReporterAssistant.py:992
msgid "Architecture"
msgstr "Ðрхітектура"
-#: ../src/gui/CReporterAssistant.py:965
+#: ../src/gui/CReporterAssistant.py:993
msgid "Kernel"
msgstr "Ядро"
-#: ../src/gui/CReporterAssistant.py:966
+#: ../src/gui/CReporterAssistant.py:994
msgid "Release"
msgstr "ВипуÑк"
-#: ../src/gui/CReporterAssistant.py:967
+#: ../src/gui/CReporterAssistant.py:995
msgid "Reason"
msgstr "Причина"
-#: ../src/gui/CReporterAssistant.py:978 ../src/gui/report.glade.h:3
+#: ../src/gui/CReporterAssistant.py:1006 ../src/gui/report.glade.h:3
msgid "<b>Backtrace</b>"
msgstr "<b>Зворотне траÑуваннÑ</b>"
-#: ../src/gui/CReporterAssistant.py:981
+#: ../src/gui/CReporterAssistant.py:1009
msgid "Click to view..."
msgstr "ÐатиÑніть, щоб переглÑнути…"
-#: ../src/gui/CReporterAssistant.py:993
+#: ../src/gui/CReporterAssistant.py:1021
msgid "<b>Steps to reproduce:</b>"
msgstr "<b>Кроки з відтвореннÑ:</b>"
-#: ../src/gui/CReporterAssistant.py:1014
+#: ../src/gui/CReporterAssistant.py:1042
msgid "<b>Comments:</b>"
msgstr "<b>Коментарі:</b>"
-#: ../src/gui/CReporterAssistant.py:1017
+#: ../src/gui/CReporterAssistant.py:1045
msgid "No comment provided!"
msgstr "Ðе надано жодних коментарів!"
-#: ../src/gui/CReporterAssistant.py:1053
+#: ../src/gui/CReporterAssistant.py:1081
msgid "Finished sending the bug report"
msgstr "ÐадÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð²Ñ–Ñ‚Ñƒ про ваду завершено"
-#: ../src/gui/CReporterAssistant.py:1057
+#: ../src/gui/CReporterAssistant.py:1085
msgid "<b>Bug reports:</b>"
msgstr "<b>Звіти про вади:</b>"
+#: ../src/gui/CReporterAssistant.py:1102
+msgid ""
+"Unable to get report!\n"
+"Is debuginfo missing?"
+msgstr ""
+"Ðе вдаєтьÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ звіт.\n"
+"Ðемає debuginfo?"
+
+#: ../src/gui/CReporterAssistant.py:1139
+#, python-format
+msgid "Error acquiring the report: %s"
+msgstr "Помилка при отриманні звіту: %s"
+
#: ../src/gui/dialogs.glade.h:1
msgid "Log"
msgstr "Журнал"
@@ -1238,28 +1229,27 @@ msgstr ""
"виправлень не буде внеÑено, у процеÑÑ– Ð·Ð²Ñ–Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ ваду можуть виникнути "
"помилки.\n"
-#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.cpp:47
+#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.c:45
#, c-format
msgid "Uploaded: %llu of %llu kbytes"
msgstr "Вивантажено: %llu з %llu кілобайтів"
-#: ../src/lib/parse_options.c:11
+#: ../src/lib/parse_options.c:29
#, c-format
msgid "Usage: %s\n"
msgstr "ВикориÑтаннÑ: %s\n"
-#: ../src/plugins/abrt-action-analyze-c.c:154
+#: ../src/plugins/abrt-action-analyze-c.c:156
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID of coredumps"
msgstr ""
-" [-vs] -d КÐТÐЛОГ\n"
+" [-v] -d КÐТÐЛОГ\n"
"\n"
"ОбчиÑлює Ñ– зберігає UUID дампів Ñдра"
-#: ../src/plugins/abrt-action-analyze-oops.c:131
-#, fuzzy
+#: ../src/plugins/abrt-action-analyze-oops.c:133
msgid ""
" [-vs] -d DIR\n"
"\n"
@@ -1267,88 +1257,110 @@ msgid ""
msgstr ""
" [-vs] -d КÐТÐЛОГ\n"
"\n"
-"ОбчиÑлює Ñ– зберігає UUID дампів Ñдра"
+"ОбчиÑлює Ñ– зберігає UUID та DUPHASH аварійних дампів Ñдра"
-#: ../src/plugins/abrt-action-analyze-python.c:36
-#, fuzzy
+#: ../src/plugins/abrt-action-analyze-python.c:38
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of python crash dumps"
msgstr ""
-" [-vs] -d КÐТÐЛОГ\n"
+" [-v] -d КÐТÐЛОГ\n"
"\n"
-"ОбчиÑлює Ñ– зберігає UUID дампів Ñдра"
+"ОбчиÑлює Ñ– зберігає UUID та DUPHASH аварійних дампів Python"
-#: ../src/plugins/abrt-action-bugzilla.cpp:532
+#: ../src/plugins/abrt-action-bugzilla.cpp:534
#, c-format
msgid "New bug id: %i"
msgstr "Ðовий ідентифікатор запиту: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:645
-#, c-format
-msgid "Can't open '%s'"
-msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ «%s»"
-
-#: ../src/plugins/abrt-action-bugzilla.cpp:665
+#: ../src/plugins/abrt-action-bugzilla.cpp:662
#, c-format
msgid "Empty login or password, please check %s"
msgstr "Порожнє ім'Ñ Ð°Ð±Ð¾ пароль. Перевірте %s"
-#: ../src/plugins/abrt-action-bugzilla.cpp:683
+#: ../src/plugins/abrt-action-bugzilla.cpp:680
msgid "Logging into bugzilla..."
msgstr "Триває вхід до Bugzilla…"
-#: ../src/plugins/abrt-action-bugzilla.cpp:686
+#: ../src/plugins/abrt-action-bugzilla.cpp:683
msgid "Checking for duplicates..."
msgstr "Пошук дублікатів…"
-#: ../src/plugins/abrt-action-bugzilla.cpp:707
-#: ../src/plugins/abrt-action-bugzilla.cpp:743
+#: ../src/plugins/abrt-action-bugzilla.cpp:705
+#: ../src/plugins/abrt-action-bugzilla.cpp:741
msgid "Missing mandatory member 'bugs'"
msgstr "Ðе вказано обов’Ñзкового учаÑника «bugs»"
-#: ../src/plugins/abrt-action-bugzilla.cpp:726
-#: ../src/plugins/abrt-action-bugzilla.cpp:759
-#: ../src/plugins/abrt-action-bugzilla.cpp:834
+#: ../src/plugins/abrt-action-bugzilla.cpp:724
+#: ../src/plugins/abrt-action-bugzilla.cpp:757
+#: ../src/plugins/abrt-action-bugzilla.cpp:833
msgid "get_bug_info() failed. Could not collect all mandatory information"
msgstr "Збій get_bug_info(). Ðе вдалоÑÑ Ð·Ñ–Ð±Ñ€Ð°Ñ‚Ð¸ потрібну інформацію."
-#: ../src/plugins/abrt-action-bugzilla.cpp:775
+#: ../src/plugins/abrt-action-bugzilla.cpp:772
msgid "Creating a new bug..."
msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ ваду…"
-#: ../src/plugins/abrt-action-bugzilla.cpp:780
+#: ../src/plugins/abrt-action-bugzilla.cpp:777
msgid "Bugzilla entry creation failed"
msgstr "Ðе вдалоÑÑ Ñтворити Ð·Ð°Ð¿Ð¸Ñ Ñƒ Bugzilla"
-#: ../src/plugins/abrt-action-bugzilla.cpp:790
-#: ../src/plugins/abrt-action-bugzilla.cpp:887
+#: ../src/plugins/abrt-action-bugzilla.cpp:789
+#: ../src/plugins/abrt-action-bugzilla.cpp:886
msgid "Logging out..."
msgstr "ВиконуєтьÑÑ Ð²Ð¸Ñ…Ñ–Ð´â€¦"
#. decision based on state
-#: ../src/plugins/abrt-action-bugzilla.cpp:808
+#: ../src/plugins/abrt-action-bugzilla.cpp:807
#, c-format
msgid "Bug is already reported: %i"
msgstr "Запит вже Ñ–Ñнує: %i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:819
+#: ../src/plugins/abrt-action-bugzilla.cpp:818
#, c-format
msgid "Bugzilla couldn't find parent of bug %d"
msgstr "Bugzilla не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ батьківÑький запит Ð´Ð»Ñ %d"
-#: ../src/plugins/abrt-action-bugzilla.cpp:848
+#: ../src/plugins/abrt-action-bugzilla.cpp:847
#, c-format
msgid "Add %s to CC list"
msgstr "Додати %s до ÑпиÑку CC"
-#: ../src/plugins/abrt-action-bugzilla.cpp:872
+#: ../src/plugins/abrt-action-bugzilla.cpp:871
#, c-format
msgid "Adding new comment to bug %d"
msgstr "Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ñ Ð´Ð¾ запиту (%d)"
-#: ../src/plugins/abrt-action-generate-backtrace.c:319
+#: ../src/plugins/abrt-action-bugzilla.cpp:913
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to Bugzilla"
+msgstr ""
+" [-vs] -c ФÐЙЛ_ÐÐЛÐШТУВÐÐЬ -d КÐТÐЛОГ\n"
+"\n"
+"Повідомити про аварійне Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð½Ð° Bugzilla"
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:928
+#: ../src/plugins/abrt-action-kerneloops.c:148
+#: ../src/plugins/abrt-action-rhtsupport.c:282
+msgid "Configuration file (may be given many times)"
+msgstr "Файл налаштувань (можна вказувати декілька файлів)"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:258
+msgid " [options] -d DIR"
+msgstr " [параметри] -d КÐТÐЛОГ"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:271
+msgid "Additional debuginfo directories"
+msgstr "Додаткові каталоги діагноÑтичних даних"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:272
+msgid "Kill gdb if it runs for more than N seconds"
+msgstr "Завершити роботу gdb, Ñкщо вона триває понад N Ñекунд"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:320
#, c-format
msgid "Backtrace parsing failed for %s"
msgstr "Ðе вдалоÑÑ Ð¾Ð±Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ дані зворотного траÑÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ %s"
@@ -1356,157 +1368,169 @@ msgstr "Ðе вдалоÑÑ Ð¾Ð±Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ дані зворотного Ñ‚Ñ€Ð
#: ../src/plugins/abrt-action-install-debuginfo.py:72
#, python-format
msgid "Extracting cpio from %s"
-msgstr ""
+msgstr "Ð’Ð¸Ð´Ð¾Ð±ÑƒÐ²Ð°Ð½Ð½Ñ cpio з %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:77
msgid "Can't write to:"
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до:"
#: ../src/plugins/abrt-action-install-debuginfo.py:87
msgid "Removing the temporary rpm file"
-msgstr ""
+msgstr "Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñового файла rpm"
#: ../src/plugins/abrt-action-install-debuginfo.py:91
#, python-format
msgid "Can't extract package: %s"
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð´Ð¾Ð±ÑƒÑ‚Ð¸ пакунок: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:99
#, python-format
msgid "Caching files from %s made from %s"
-msgstr ""
+msgstr "ÐšÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² з %s виконано з %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:107
msgid "Removing the temporary cpio file"
-msgstr ""
+msgstr "Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñового файла cpio"
#: ../src/plugins/abrt-action-install-debuginfo.py:110
#, python-format
msgid "Can't extract files from: %s"
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð´Ð¾Ð±ÑƒÑ‚Ð¸ файли з: %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:134
#: ../src/plugins/abrt-action-install-debuginfo.py:140
#, python-format
msgid "Downloading (%i of %i) %.30s : %.3s %%"
-msgstr ""
+msgstr "Ð—Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ (%i з %i) %.30s : %.3s %%"
#: ../src/plugins/abrt-action-install-debuginfo.py:169
-#, fuzzy
msgid "Searching the missing debuginfo packages"
-msgstr "ЗапуÑкаєтьÑÑ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ debuginfo"
+msgstr "Пошук потрібних пакунків діагноÑтичних даних"
#: ../src/plugins/abrt-action-install-debuginfo.py:224
#, python-format
msgid "To download: (%.2f) M / Installed size: %.2f M"
-msgstr ""
+msgstr "Об’єм звантаженнÑ: (%.2f) МБ / Об’єм вÑтановленнÑ: %.2f МБ"
#: ../src/plugins/abrt-action-install-debuginfo.py:240
msgid "Is this ok? [y/N] "
-msgstr ""
+msgstr "Виконати дію? [y/N] "
#: ../src/plugins/abrt-action-install-debuginfo.py:257
#, python-format
msgid "Downloading package %s failed"
-msgstr ""
+msgstr "Спроба Ð·Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ð°ÐºÑƒÐ½ÐºÐ° %s зазнала невдачі"
#. recursively delete the temp dir on failure
#: ../src/plugins/abrt-action-install-debuginfo.py:268
msgid "Unpacking failed, aborting download..."
-msgstr ""
+msgstr "Спроба Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð·Ð½Ð°Ð»Ð° невдачі, перериваємо звантаженнÑ…"
#: ../src/plugins/abrt-action-install-debuginfo.py:275
#, python-format
msgid "All downloaded packages have been extracted, removing %s"
-msgstr ""
+msgstr "Дані вÑÑ–Ñ… звантажених пакунків було видобуто, вилучаємо %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:280
#, python-format
msgid "Can't remove %s, probably contains an error log"
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ %s, ймовірно, міÑтить журнал помилки"
#: ../src/plugins/abrt-action-install-debuginfo.py:305
#, python-format
msgid "Analyzing corefile: %(corefile_path)s"
-msgstr ""
+msgstr "Ðналіз файла Ñдра: %(corefile_path)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:384
#, python-format
msgid "Can't remove %(tmpdir_path)s: %(reason)s"
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ %(tmpdir_path)s: %(reason)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:394
msgid "Exiting on user Command"
-msgstr ""
+msgstr "Ð—Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ за бажаннÑм кориÑтувача"
#: ../src/plugins/abrt-action-install-debuginfo.py:413
#, python-format
msgid "Usage: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
msgstr ""
+"ВикориÑтаннÑ: %s --core=<ФÐЙЛ_ЯДРÐ> --tmpdir=<КÐТÐЛОГ_ТИМЧÐСОВИХ_ДÐÐИХ> --"
+"cachedir=<КÐТÐЛОГ_КЕШУ>"
#: ../src/plugins/abrt-action-install-debuginfo.py:442
-#, fuzzy
msgid "You have to specify the path to coredump."
-msgstr "Слід вибрати файл аварійного завершеннÑм Ð´Ð»Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ."
+msgstr "Вам Ñлід вказати адреÑу, за Ñкою зберігаєтьÑÑ Ð´Ð°Ð¼Ð¿ Ñдра."
#: ../src/plugins/abrt-action-install-debuginfo.py:446
-#, fuzzy
msgid "You have to specify the path to cachedir."
-msgstr "Слід вибрати файл аварійного завершеннÑм Ð´Ð»Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ."
+msgstr "Вам Ñлід вказати адреÑу, за Ñкою зберігаютьÑÑ Ð´Ð°Ð½Ñ– кешу."
#: ../src/plugins/abrt-action-install-debuginfo.py:450
-#, fuzzy
msgid "You have to specify the path to tmpdir."
-msgstr "Слід вибрати файл аварійного завершеннÑм Ð´Ð»Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ."
+msgstr "Вам Ñлід вказати адреÑу, за Ñкою зберігаютьÑÑ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñові дані."
#: ../src/plugins/abrt-action-install-debuginfo.py:463
msgid "All debuginfo seems to be available"
-msgstr ""
+msgstr "Ð’ÑÑ– дані Ð´Ð»Ñ Ð´Ñ–Ð°Ð³Ð½Ð¾Ñтики доÑтупні"
#: ../src/plugins/abrt-action-install-debuginfo.py:470
-#, fuzzy
msgid "Complete!"
-msgstr "Компонент"
+msgstr "Завершено!"
-#: ../src/plugins/abrt-action-kerneloops.cpp:111
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-kerneloops.c:105
+#, c-format
msgid "Submitting oops report to %s"
-msgstr "Звіт запиÑуєтьÑÑ Ñƒ «%s»"
+msgstr "ÐадÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð²Ñ–Ñ‚Ñƒ про збій до %s"
+
+#: ../src/plugins/abrt-action-kerneloops.c:133
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a kernel oops to kerneloops.org (or similar) site"
+msgstr ""
+" [-vs] -c ФÐЙЛ_ÐÐЛÐШТУВÐÐЬ -d КÐТÐЛОГ\n"
+"\n"
+"Повідомити про аварію Ñдра (oops) на Ñайті kerneloops.org (або подібному)"
-#: ../src/plugins/abrt-action-mailx.cpp:114
+#: ../src/plugins/abrt-action-mailx.c:110
msgid "Sending an email..."
msgstr "ÐадÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ð¾ÑˆÑ‚Ð¸â€¦"
-#: ../src/plugins/abrt-action-mailx.cpp:138
+#: ../src/plugins/abrt-action-mailx.c:137
msgid ""
" [-v] -d DIR [-c CONFFILE]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d КÐТÐЛОГ [-c ФÐЙЛ_ÐÐЛÐШТУВÐÐÐЯ]\n"
+"\n"
+"Вивантажити ÑтиÑнутий архів дампу збою"
-#: ../src/plugins/abrt-action-mailx.cpp:151
-#: ../src/plugins/abrt-action-upload.cpp:267
-#, fuzzy
+#: ../src/plugins/abrt-action-mailx.c:150
+#: ../src/plugins/abrt-action-upload.c:262
msgid "Config file"
-msgstr "Файл журналу:"
+msgstr "Файл налаштувань"
-#: ../src/plugins/abrt-action-print.cpp:39
+#: ../src/plugins/abrt-action-print.c:38
msgid ""
" [-v] [-o FILE] -d DIR\n"
"\n"
"Print information about the crash to standard output"
msgstr ""
+" [-v] [-o ФÐЙЛ] -d КÐТÐЛОГ\n"
+"\n"
+"ВивеÑти дані щодо збою до Ñтандартного виводу"
-#: ../src/plugins/abrt-action-print.cpp:51
+#: ../src/plugins/abrt-action-print.c:51
msgid "Output file"
-msgstr ""
+msgstr "Вихідний файл"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was appended to %s"
msgstr "Звіт було долучено до %s"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was stored to %s"
msgstr "Звіт було збережено до %s"
@@ -1514,46 +1538,87 @@ msgstr "Звіт було збережено до %s"
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
#. error msg is already logged by dd_opendir
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
-#: ../src/plugins/abrt-action-rhtsupport.cpp:43
-#: ../src/plugins/abrt-action-upload.cpp:121
+#: ../src/plugins/abrt-action-rhtsupport.c:41
+#: ../src/plugins/abrt-action-upload.c:119
msgid "Compressing data"
msgstr "СтиÑÐºÐ°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:78
-#, fuzzy
+#: ../src/plugins/abrt-action-rhtsupport.c:73
msgid "Empty login or password, please check RHTSupport.conf"
-msgstr "Порожнє ім'Ñ Ð°Ð±Ð¾ пароль. Перевірте %s"
+msgstr "Порожнє ім'Ñ Ð°Ð±Ð¾ пароль. Перевірте, чи немає помилок у RHTSupport.conf"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:194
+#: ../src/plugins/abrt-action-rhtsupport.c:192
msgid "Creating a new case..."
msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ випадку…"
-#: ../src/plugins/abrt-action-upload.cpp:65
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-rhtsupport.c:267
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to RHTSupport"
+msgstr ""
+" [-vs] -c ФÐЙЛ_ÐÐЛÐШТУВÐÐЬ -d КÐТÐЛОГ\n"
+"\n"
+"Повідомити про аварійне Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð½Ð° Ñайті підтримки (RHTSupport)"
+
+#: ../src/plugins/abrt-action-upload.c:63
+#, c-format
msgid "Sending %s to %s"
-msgstr "Ðрхів %s надÑилаєтьÑÑ %s"
+msgstr "ÐадÑÐ¸Ð»Ð°Ð½Ð½Ñ %s до %s"
#. This ends up a "reporting status message" in abrtd
-#: ../src/plugins/abrt-action-upload.cpp:98
+#: ../src/plugins/abrt-action-upload.c:96
#, c-format
msgid "Successfully sent %s to %s"
-msgstr ""
+msgstr "УÑпішно надіÑлано %s до %s"
-#: ../src/plugins/abrt-action-upload.cpp:219
+#: ../src/plugins/abrt-action-upload.c:213
#, c-format
msgid "Archive is created: '%s'"
-msgstr ""
+msgstr "Створено архів: «%s»"
-#: ../src/plugins/abrt-action-upload.cpp:253
+#: ../src/plugins/abrt-action-upload.c:248
msgid ""
" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d КÐТÐЛОГ [-c ФÐЙЛ_ÐÐЛÐШТУВÐÐÐЯ] [-u ÐДРЕСÐ]\n"
+"\n"
+"Вивантажити ÑтиÑнутий архів дампу збою"
-#: ../src/plugins/abrt-action-upload.cpp:268
+#: ../src/plugins/abrt-action-upload.c:263
msgid "Base URL to upload to"
+msgstr "Базова адреÑа Ð´Ð»Ñ Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…"
+
+#: ../src/plugins/abrt-dump-oops.c:540
+msgid ""
+" [-vsrdow] FILE\n"
+"\n"
+"Extract oops from syslog/dmesg file"
+msgstr ""
+" [-vsrdow] ФÐЙЛ\n"
+"\n"
+"Видобути Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ аварії (oops) з файла syslog/dmesg"
+
+#: ../src/plugins/abrt-dump-oops.c:556
+msgid "Parse kernel's message buffer before parsing FILE"
+msgstr "Обробити буфер повідомлень Ñдра до обробки ФÐЙЛа"
+
+#: ../src/plugins/abrt-dump-oops.c:557
+msgid "Create ABRT dump for every oops found"
+msgstr ""
+"Створити дамп ABRT Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ знайденого Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ аварію (oops)"
+
+#: ../src/plugins/abrt-dump-oops.c:558
+msgid "Print found oopses on standard output"
+msgstr "ВивеÑти знайдені Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ аварії (oops) до Ñтандартного виводу"
+
+#: ../src/plugins/abrt-dump-oops.c:559
+msgid "Do not exit, watch the file for new oopses"
msgstr ""
+"Ðе завершувати роботу, ÑпоÑтерігати за поÑвою нових повідомлень про аварії "
+"(oops) у файлі"
#: ../src/plugins/Bugzilla.glade.h:1
msgid "<b>Bugzilla plugin configuration</b>"
@@ -1591,10 +1656,6 @@ msgstr ""
"Ви можете Ñтворити його <a href=\"https://bugzilla.redhat.com/createaccount."
"cgi\">тут</a>"
-#: ../src/plugins/CCpp.cpp:277
-msgid "Analyzes crashes in C/C++ programs"
-msgstr "Ðналізує аварійні Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ програм C/C++"
-
#: ../src/plugins/KerneloopsReporter.glade.h:1
msgid "<b>Kerneloops Reporter plugin configuration</b>"
msgstr "<b>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð·Ð²Ñ–Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ Kerneloops</b>"
@@ -1603,10 +1664,6 @@ msgstr "<b>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð·Ð²Ñ–Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ Kerne
msgid "Submit URL:"
msgstr "ÐдреÑа надÑиланнÑ:"
-#: ../src/plugins/KerneloopsScanner.cpp:227
-msgid "Periodically scans for and saves kernel oopses"
-msgstr "Виконує періодичні ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ– зберігає дані щодо помилок у Ñдрі"
-
#: ../src/plugins/Logger.glade.h:1
msgid "<b>Logger plugin configuration</b>"
msgstr "<b>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ</b>"
@@ -1652,9 +1709,8 @@ msgid "RHTSupport URL:"
msgstr "ÐдреÑа RHTSupport:"
#: ../src/plugins/Upload.glade.h:1
-#, fuzzy
msgid "<b>Upload plugin configuration</b>"
-msgstr "<b>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ° Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð²Ñ–Ñ‚Ñ–Ð²</b>"
+msgstr "<b>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ° Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…</b>"
#: ../src/plugins/Upload.glade.h:2
msgid "Retry count:"
@@ -1672,6 +1728,79 @@ msgstr "ÐдреÑа:"
msgid "Use encryption"
msgstr "ВикориÑтовувати шифруваннÑ"
+#~ msgid ""
+#~ "Usage: %s [OPTION]\n"
+#~ "\n"
+#~ "Startup:\n"
+#~ "\t-V, --version\t\tdisplay the version and exit\n"
+#~ "\t-v, --verbose\t\tincrease verbosity\n"
+#~ "Actions:\n"
+#~ "\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
+#~ "\t -f, --full\tprint a list of all crashes, including the already "
+#~ "reported ones\n"
+#~ "\t-r, --report CRASH_ID\tcreate and send a report\n"
+#~ "\t -y, --always\tcreate and send a report without asking\n"
+#~ "\t-d, --delete CRASH_ID\tremove a crash\n"
+#~ "\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
+#~ "\t -b, --backtrace\tprint detailed information about a crash "
+#~ "including backtrace\n"
+#~ "CRASH_ID can be:\n"
+#~ "\ta name of dump directory, or\n"
+#~ "\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+#~ msgstr ""
+#~ "ВикориÑтаннÑ: %s [ПÐРÐМЕТР]\n"
+#~ "\n"
+#~ "ЗапуÑк:\n"
+#~ "\t-V, --version\t\tпоказати дані щодо верÑÑ–Ñ— Ñ– завершити роботу\n"
+#~ "\t-v, --verbose\t\tзробити Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð¾ÐºÐ»Ð°Ð´Ð½Ñ–ÑˆÐ¸Ð¼Ð¸\n"
+#~ "Дії:\n"
+#~ "\t-l, --list\t\tпоказати ÑпиÑок вÑÑ–Ñ… збоїв, щодо Ñких ще не Ñтворено "
+#~ "звітів\n"
+#~ "\t -f, --full\tвивеÑти ÑпиÑок вÑÑ–Ñ… збоїв, зокрема збоїв, щодо Ñких "
+#~ "Ñтворено звіти\n"
+#~ "\t-r, --report ІДЕÐТИФІКÐТОР\tÑтворити Ñ– надіÑлати звіт\n"
+#~ "\t -y, --always\tÑтворити Ñ– надіÑлати звіт без підтвердженнÑ\n"
+#~ "\t-d, --delete ІДЕÐТИФІКÐТОР\tвилучити звіт\n"
+#~ "\t-i, --info ІДЕÐТИФІКÐТОР\tвивеÑти докладну інформацію щодо збою\n"
+#~ "\t -b, --backtrace\tвивеÑти докладну інформацію щодо збою, зокрема "
+#~ "зворотне траÑуваннÑ\n"
+#~ "ЗначеннÑм ІДЕÐТИФІКÐТОР може бути:\n"
+#~ "\tназва каталогу з дампом або\n"
+#~ "\t@N — Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð´Ñ–Ñ— над N-им збоєм (у ÑпиÑку, показаному командою з "
+#~ "параметрами --list --full)\n"
+
+#~ msgid "Error loading reporter settings"
+#~ msgstr "Помилка при завантаженні параметрів звітуваннÑ"
+
+#~ msgid "You must check the backtrace for sensitive data."
+#~ msgstr ""
+#~ "Вам Ñлід вилучити з даних зворотного траÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²ÑÑ– конфіденційні дані."
+
+#~ msgid "The backtrace is unusable, you cannot report this!"
+#~ msgstr "Ðепридатні відомоÑÑ‚Ñ– траÑуваннÑ. Їх не можна надÑилати."
+
+#~ msgid "Reporting disabled, please fix the problems shown above."
+#~ msgstr "Ð—Ð²Ñ–Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾, виправте вказані вище проблеми."
+
+#~ msgid "Sends the report using the selected plugin."
+#~ msgstr "ÐадÑилає звіт за допомогою вказано модулÑ."
+
+#~ msgid ""
+#~ "No reporter plugin available for this type of crash.\n"
+#~ "Please check abrt.conf."
+#~ msgstr ""
+#~ "Ðемає модулів Ð·Ð²Ñ–Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ типу збоїв.\n"
+#~ "Будь лаÑка, внеÑÑ–Ñ‚ÑŒ зміни до abrt.conf"
+
+#~ msgid "Can't open '%s'"
+#~ msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ «%s»"
+
+#~ msgid "Analyzes crashes in C/C++ programs"
+#~ msgstr "Ðналізує аварійні Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ програм C/C++"
+
+#~ msgid "Periodically scans for and saves kernel oopses"
+#~ msgstr "Виконує періодичні ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ– зберігає дані щодо помилок у Ñдрі"
+
#~ msgid "Database plugin not specified. Please check abrtd settings."
#~ msgstr ""
#~ "Ðе вказано Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ з базою даних. Будь лаÑка, змініть параметри "
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 9926c643..ac2e8973 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -8,19 +8,21 @@
# Huan Chen <chenhuan dot gt at gmail dot com>, 2010.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
+# Mike Ma <zhtx10@gmail.com>, 2011.
+#
msgid ""
msgstr ""
"Project-Id-Version: abrt.master.zh_CN(2)\n"
"Report-Msgid-Bugs-To: jmoskovc@redhat.com\n"
-"POT-Creation-Date: 2010-11-29 13:51+0100\n"
-"PO-Revision-Date: 2010-07-30 10:40+1000\n"
-"Last-Translator: Leah Liu <lliu@redhat.com>\n"
-"Language-Team: Wei Liu\n"
-"Language: zh_CN\n"
+"POT-Creation-Date: 2011-02-17 02:58+0000\n"
+"PO-Revision-Date: 2011-02-17 21:06+0800\n"
+"Last-Translator: Mike Ma <zhtx10@gmail.com>\n"
+"Language-Team: Chinese <zhtx10@gmail.com>\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"
+"Content-Transfer-Encoding: UTF-8\n"
+"Language: zh_CN\n"
+"Plural-Forms: 0\n"
"X-Generator: KBabel 1.11.4\n"
#: ../src/applet/abrt-applet.desktop.in.h:1
@@ -33,16 +35,16 @@ msgstr "ABRT 通知程åº"
msgid "Automatic Bug Reporting Tool"
msgstr "自动 bug 报告工具"
-#: ../src/applet/Applet.cpp:86
+#: ../src/applet/applet.c:85
#, c-format
msgid "A crash in the %s package has been detected"
msgstr "已探测到 %s 软件包中的一个崩溃"
-#: ../src/applet/Applet.cpp:88
+#: ../src/applet/applet.c:87
msgid "A crash has been detected"
msgstr "å·²å‘觉一个崩溃"
-#: ../src/applet/Applet.cpp:285
+#: ../src/applet/applet.c:284
msgid "ABRT service is not running"
msgstr "ABRT æœåŠ¡ä¸åœ¨è¿è¡Œ"
@@ -56,7 +58,7 @@ msgid ""
"Notification area applet that notifies users about issues detected by ABRT"
msgstr "用æ¥é€šçŸ¥ç”¨æˆ· ABRT 所探测到问题的通告区å°åº”用程åº"
-#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:23
+#: ../src/applet/applet_gtk.c:246 ../src/gui/ccgui.glade.h:24
msgid "translator-credits"
msgstr "译者åå•"
@@ -64,7 +66,7 @@ msgstr "译者åå•"
msgid "Hide"
msgstr "éšè—"
-#: ../src/applet/applet_gtk.c:360 ../src/gui/ccgui.glade.h:13
+#: ../src/applet/applet_gtk.c:360 ../src/gui/ccgui.glade.h:14
msgid "Report"
msgstr "报告"
@@ -72,8 +74,8 @@ msgstr "报告"
msgid "Open ABRT"
msgstr "打开 ABRT"
-#: ../src/cli/CLI.cpp:47
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:90
+#, c-format
msgid ""
"\tCrash dump : %s\n"
"\tUID : %s\n"
@@ -82,20 +84,20 @@ msgid ""
"\tCrash Time : %s\n"
"\tCrash Count: %s\n"
msgstr ""
+"\t崩溃转储: %s\n"
"\tUID : %s\n"
-"\tUUID : %s\n"
-"\tPackage : %s\n"
-"\tExecutable : %s\n"
-"\tCrash Time : %s\n"
-"\tCrash Count: %s\n"
+"\t包 : %s\n"
+"\tå¯æ‰§è¡Œæ–‡ä»¶ï¼š %s\n"
+"\t崩溃时间: %s\n"
+"\t崩溃计数: %s\n"
-#: ../src/cli/CLI.cpp:65
+#: ../src/cli/CLI.cpp:109
#, c-format
msgid "\tHostname : %s\n"
msgstr "\tHostname : %s\n"
-#: ../src/cli/CLI.cpp:98
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:142
+#, c-format
msgid ""
"Dump directory: %s\n"
"Last crash: %s\n"
@@ -107,39 +109,37 @@ msgid ""
"System: %s, kernel %s\n"
"Reason: %s\n"
msgstr ""
-"崩溃 ID: %s:%s\n"
-"上一个崩溃: %s\n"
-"分æžç¨‹åºï¼š %s\n"
-"组件: %s\n"
-"软件包: %s\n"
-"命令: %s\n"
-"å¯æ‰§è¡Œï¼š %s\n"
-"系统: %s, kernel %s\n"
-"等级: %s\n"
-"核转储文件: %s\n"
-"原因: %s\n"
-
-#: ../src/cli/CLI.cpp:125
-#, fuzzy, c-format
+"转储文件夹: %s\n"
+"上一次崩溃: %s\n"
+"分æžä»ªï¼š %s\n"
+"组件: %s\n"
+"包: %s\n"
+"命令: %s\n"
+"执行命令: %s\n"
+"系统: %s, kernel %s\n"
+"原因: %s\n"
+
+#: ../src/cli/CLI.cpp:170
+#, c-format
msgid "Coredump file: %s\n"
-msgstr "崩溃功能: %s\n"
+msgstr "核心转储文件: %s\n"
-#: ../src/cli/CLI.cpp:129
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:174
+#, c-format
msgid "Rating: %s\n"
-msgstr "主机å: %s\n"
+msgstr "评分: %s\n"
-#: ../src/cli/CLI.cpp:134
+#: ../src/cli/CLI.cpp:179
#, c-format
msgid "Crash function: %s\n"
msgstr "崩溃功能: %s\n"
-#: ../src/cli/CLI.cpp:138
+#: ../src/cli/CLI.cpp:183
#, c-format
msgid "Hostname: %s\n"
msgstr "主机å: %s\n"
-#: ../src/cli/CLI.cpp:142
+#: ../src/cli/CLI.cpp:187
#, c-format
msgid ""
"\n"
@@ -150,7 +150,7 @@ msgstr ""
"如何é‡å¤ï¼š\n"
"%s\n"
-#: ../src/cli/CLI.cpp:146
+#: ../src/cli/CLI.cpp:191
#, c-format
msgid ""
"\n"
@@ -161,7 +161,7 @@ msgstr ""
"注释:\n"
"%s\n"
-#: ../src/cli/CLI.cpp:152
+#: ../src/cli/CLI.cpp:197
#, c-format
msgid ""
"\n"
@@ -172,69 +172,65 @@ msgstr ""
"回溯:\n"
"%s\n"
-#. Message has embedded tabs.
-#: ../src/cli/CLI.cpp:243
-#, fuzzy, c-format
+#: ../src/cli/CLI.cpp:295
+#, c-format
msgid ""
-"Usage: %s [OPTION]\n"
+"Usage: %s -l[f] [-D BASE_DIR]...]\n"
+" or: %s -r[y] CRASH_DIR\n"
+" or: %s -i[b] CRASH_DIR\n"
+" or: %s -d CRASH_DIR\n"
+"\n"
+"\t-l, --list\t\tList not yet reported crashes\n"
+"\t -f, --full\t\tList all crashes\n"
+"\t-D BASE_DIR\t\tDirectory to list crashes from\n"
+"\t\t\t\t(default: -D $HOME/.abrt/spool -D %s)\n"
"\n"
-"Startup:\n"
-"\t-V, --version\t\tdisplay the version of %s and exit\n"
-"\t-?, --help\t\tprint this help\n"
+"\t-r, --report\t\tSend a report about CRASH_DIR\n"
+"\t -y, --always\t\t...without editing and asking\n"
+"\t-i, --info\t\tPrint detailed information about CRASH_DIR\n"
+"\t -b, --backtrace\t...including backtrace\n"
+"\t-d, --delete\t\tRemove CRASH_DIR\n"
"\n"
-"Actions:\n"
-"\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
-"\t -f, --full\tprint a list of all crashes, including the already "
-"reported ones\n"
-"\t-r, --report CRASH_ID\tcreate and send a report\n"
-"\t -y, --always\tcreate and send a report without asking\n"
-"\t-d, --delete CRASH_ID\tremove a crash\n"
-"\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
-"\t -b, --backtrace\tprint detailed information about a crash including "
-"backtrace\n"
-"CRASH_ID can be:\n"
-"\ta name of dump directory, or\n"
-"\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+"\t-V, --version\t\tDisplay version and exit\n"
+"\t-v, --verbose\t\tBe verbose\n"
msgstr ""
-"用法: %s [OPTION]\n"
+"用法: %s -l[f] [-D BASE_DIR]...]\n"
+" 或: %s -r[y] CRASH_DIR\n"
+" 或: %s -i[b] CRASH_DIR\n"
+" 或: %s -d CRASH_DIR\n"
"\n"
-"Startup:\n"
-"\t-V, --version\t\tdisplay the version of %s and exit\n"
-"\t-?, --help\t\tprint this help\n"
+"\t-l, --list\t\t列出未å馈的崩溃\n"
+"\t -f, --full\t\t列出所有崩溃\n"
+"\t-D BASE_DIR\t\t列出崩溃出处的目录\n"
+"\t\t\t\t(默认:-D $HOME/.abrt/spool -D %s)\n"
"\n"
-"Actions:\n"
-"\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
-"\t -f, --full\tprint a list of all crashes, including the already "
-"reported ones\n"
-"\t-r, --report CRASH_ID\tcreate and send a report\n"
-"\t -y, --always\tcreate and send a report without asking\n"
-"\t-d, --delete CRASH_ID\tremove a crash\n"
-"\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
-"\t -b, --backtrace\tprint detailed information about a crash including "
-"backtrace\n"
-"CRASH_ID can be:\n"
-"\tUID:UUID pair,\n"
-"\tunique UUID prefix - the crash with matching UUID will be acted upon\n"
-"\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
-
-#: ../src/cli/CLI.cpp:287
+"\t-r, --report\t\tå‘é€ä¸€ä¸ªå…³äºŽ CRASH_DIR çš„å馈\n"
+"\t -y, --always\t\t...无需编辑和æé—®\n"
+"\t-i, --info\t\t输出关于CRASH_DIR的详细信æ¯\n"
+"\t -b, --backtrace\t...包å«å›žæº¯\n"
+"\t-d, --delete\t\t移除 CRASH_DIR\n"
+"\n"
+"\t-V, --version\t\t显示版本å†é€€å‡º\n"
+"\t-v, --verbose\t\t详细\n"
+
+#: ../src/cli/CLI.cpp:343
msgid "You must specify exactly one operation"
msgstr "您必须指定具体的æ“作"
-#: ../src/cli/report.cpp:166
+#: ../src/cli/report.cpp:154
#, c-format
msgid "# This field is read only\n"
msgstr "# 该字段为åªè¯»\n"
-#: ../src/cli/report.cpp:186
+#: ../src/cli/report.cpp:174
msgid "# Describe the circumstances of this crash below"
msgstr "# 在下é¢æ述此崩溃的å‘生环境"
-#: ../src/cli/report.cpp:188
+#: ../src/cli/report.cpp:176
msgid "# How to reproduce the crash?"
msgstr "# 如何å†çŽ°è¯¥å´©æºƒï¼Ÿ"
-#: ../src/cli/report.cpp:190
+#: ../src/cli/report.cpp:178
msgid ""
"# Backtrace\n"
"# Check that it does not contain any sensitive data (passwords, etc.)"
@@ -242,47 +238,47 @@ msgstr ""
"# 回溯\n"
"# 检查它是å¦åŒ…å«ä»»ä½•æ•æ„Ÿæ•°æ®ï¼ˆå¯†ç ç­‰ç­‰ï¼‰ã€‚"
-#: ../src/cli/report.cpp:192
+#: ../src/cli/report.cpp:180
msgid "# Architecture"
msgstr "# 架构"
-#: ../src/cli/report.cpp:193
+#: ../src/cli/report.cpp:181
msgid "# Command line"
msgstr "# 命令行"
-#: ../src/cli/report.cpp:194
+#: ../src/cli/report.cpp:182
msgid "# Component"
msgstr "# 组件"
-#: ../src/cli/report.cpp:195
+#: ../src/cli/report.cpp:183
msgid "# Core dump"
msgstr "# 内存转储"
-#: ../src/cli/report.cpp:196
+#: ../src/cli/report.cpp:184
msgid "# Executable"
msgstr "# å¯æ‰§è¡Œæ–‡ä»¶"
-#: ../src/cli/report.cpp:197
+#: ../src/cli/report.cpp:185
msgid "# Kernel version"
msgstr "# 内核版本"
-#: ../src/cli/report.cpp:198
+#: ../src/cli/report.cpp:186
msgid "# Package"
msgstr "# 软件包"
-#: ../src/cli/report.cpp:199
+#: ../src/cli/report.cpp:187
msgid "# Reason of crash"
msgstr "# 崩溃原因"
-#: ../src/cli/report.cpp:200
+#: ../src/cli/report.cpp:188
msgid "# Release string of the operating system"
msgstr "# æ“作系统的å‘行版本"
-#: ../src/cli/report.cpp:323
+#: ../src/cli/report.cpp:305
msgid "Cannot run vi: $TERM, $VISUAL and $EDITOR are not set"
msgstr "无法è¿è¡Œ vi:还没有设置 $TERMã€$VISUAL å’Œ $EDITOR"
-#: ../src/cli/report.cpp:411
+#: ../src/cli/report.cpp:389
msgid ""
"\n"
"The report has been updated"
@@ -290,7 +286,7 @@ msgstr ""
"\n"
"该报告已更新"
-#: ../src/cli/report.cpp:413
+#: ../src/cli/report.cpp:391
msgid ""
"\n"
"No changes were detected in the report"
@@ -299,124 +295,142 @@ msgstr ""
"未查出报告有更改"
#. The response might take more than 1 char in non-latin scripts.
-#: ../src/cli/report.cpp:464
+#: ../src/cli/report.cpp:423
msgid "y"
-msgstr ""
+msgstr "y"
-#: ../src/cli/report.cpp:465
+#: ../src/cli/report.cpp:424
msgid "N"
-msgstr ""
+msgstr "N"
#. Read the missing information and push it to plugin settings.
-#: ../src/cli/report.cpp:565
+#: ../src/cli/report.cpp:555
#, c-format
msgid "Wrong settings were detected for plugin %s\n"
msgstr "探测到æ’件 %s 的错误设置。\n"
-#: ../src/cli/report.cpp:569
+#: ../src/cli/report.cpp:559
msgid "Enter your login: "
msgstr "输入您的登录å:"
-#: ../src/cli/report.cpp:575
+#: ../src/cli/report.cpp:565
msgid "Enter your password: "
msgstr "输入您的密ç ï¼š"
-#: ../src/cli/report.cpp:638
+#: ../src/cli/report.cpp:775
msgid "Reporting..."
msgstr "报告中……"
-#: ../src/cli/report.cpp:657
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:788
+#, c-format
msgid "Report using %s?"
-msgstr "用 %s 报告?[y/N]:"
+msgstr "用 %s 报告?"
-#: ../src/cli/report.cpp:660
+#: ../src/cli/report.cpp:791
msgid "Skipping..."
msgstr "跳过中……"
-#: ../src/cli/report.cpp:672
-#, fuzzy
+#: ../src/cli/report.cpp:807
msgid "Reporting disabled because the backtrace is unusable"
-msgstr "ä¸èƒ½æŠ¥å‘Šå› ä¸ºå›žæº¯ä¸å¯ç”¨ã€‚"
+msgstr "因为无法使用回溯而ç¦æ­¢æŠ¥å‘Šã€‚"
-#: ../src/cli/report.cpp:676
+#: ../src/cli/report.cpp:811
#, c-format
msgid ""
"Please try to install debuginfo manually using the command: \"debuginfo-"
"install %s\" and try again\n"
-msgstr ""
-
-#: ../src/cli/report.cpp:685
-#, fuzzy
-msgid "Error loading reporter settings"
-msgstr "获å–报告时出错:%s"
+msgstr "请å°è¯•ç”¨å‘½ä»¤\"debuginfo-install %s\"手动安装除错信æ¯å¹¶é‡è¯•\n"
-#: ../src/cli/report.cpp:704
-#, fuzzy, c-format
+#: ../src/cli/report.cpp:829
+#, c-format
msgid "Crash reported via %d report events (%d errors)\n"
-msgstr "使用 %d æ’件报告的崩溃(%d 错误)\n"
+msgstr "使用 %d 报告的崩溃(%d 错误)\n"
-#: ../src/daemon/abrt-handle-crashdump.c:42
+#: ../src/daemon/abrt-action-save-package-data.c:271
msgid ""
-" [-vs] -d DIR -e EVENT\n"
-" or: "
+" [options] -d DIR\n"
+"\n"
+"Query package database and save package name, component, and description"
msgstr ""
+" [选项] -d DIR\n"
+"\n"
+"请求包数æ®åº“并存储包åã€ç»„件和æè¿°"
-#: ../src/daemon/abrt-handle-crashdump.c:57
+#: ../src/daemon/abrt-action-save-package-data.c:283
+#: ../src/daemon/abrt-handle-crashdump.c:60
#: ../src/plugins/abrt-action-analyze-c.c:167
#: ../src/plugins/abrt-action-analyze-oops.c:144
#: ../src/plugins/abrt-action-analyze-python.c:49
+#: ../src/plugins/abrt-action-bugzilla.cpp:927
+#: ../src/plugins/abrt-action-generate-backtrace.c:270
+#: ../src/plugins/abrt-action-kerneloops.c:147
+#: ../src/plugins/abrt-action-mailx.c:149
+#: ../src/plugins/abrt-action-print.c:50
+#: ../src/plugins/abrt-action-rhtsupport.c:280
+#: ../src/plugins/abrt-action-upload.c:260
+msgid "Crash dump directory"
+msgstr "崩溃转储目录"
+
+#: ../src/daemon/abrt-action-save-package-data.c:284
+#: ../src/daemon/abrt-handle-crashdump.c:59 ../src/daemon/abrt-server.c:297
+#: ../src/plugins/abrt-action-bugzilla.cpp:926
+#: ../src/plugins/abrt-action-generate-backtrace.c:273
+#: ../src/plugins/abrt-action-kerneloops.c:146
+#: ../src/plugins/abrt-action-rhtsupport.c:279
+#: ../src/plugins/abrt-dump-oops.c:555
msgid "Log to syslog"
-msgstr ""
+msgstr "记录到系统日志"
-#: ../src/daemon/abrt-handle-crashdump.c:58
-#: ../src/plugins/abrt-action-analyze-c.c:166
-#: ../src/plugins/abrt-action-analyze-oops.c:143
-#: ../src/plugins/abrt-action-analyze-python.c:48
-#: ../src/plugins/abrt-action-mailx.cpp:150
-#: ../src/plugins/abrt-action-print.cpp:50
-#: ../src/plugins/abrt-action-upload.cpp:266
-msgid "Crash dump directory"
+#: ../src/daemon/abrt-handle-crashdump.c:43
+msgid ""
+" [-vs] -d DIR -e EVENT\n"
+" or: "
msgstr ""
+" [-vs] -d DIR -e EVENT\n"
+" 或: "
-#: ../src/daemon/abrt-handle-crashdump.c:59
+#: ../src/daemon/abrt-handle-crashdump.c:61
msgid "Handle EVENT"
-msgstr ""
+msgstr "处ç†äº‹ä»¶"
-#: ../src/daemon/abrt-handle-crashdump.c:60
+#: ../src/daemon/abrt-handle-crashdump.c:62
msgid "List possible events [which start with PFX]"
-msgstr ""
+msgstr "列出å¯èƒ½çš„事件 [用PFX开始的那个]"
+
+#: ../src/daemon/abrt-server.c:286 ../src/daemon/Daemon.cpp:542
+msgid " [options]"
+msgstr " [选项]"
-#: ../src/daemon/CommLayerServerDBus.cpp:229
+#: ../src/daemon/abrt-server.c:296
+msgid "Use UID as client uid"
+msgstr "使用作为客户端uid的UID"
+
+#: ../src/daemon/CommLayerServerDBus.cpp:241
msgid "Comment is too long"
msgstr "评论过长"
-#: ../src/daemon/CommLayerServerDBus.cpp:233
+#: ../src/daemon/CommLayerServerDBus.cpp:245
msgid "'How to reproduce' is too long"
msgstr "“如何å†çŽ°â€è¿‡é•¿"
-#: ../src/daemon/Daemon.cpp:534
+#: ../src/daemon/Daemon.cpp:371
msgid ""
"The size of the report exceeded the quota. Please check system's "
"MaxCrashReportsSize value in abrt.conf."
msgstr ""
"报告大å°å·²è¶…出é…é¢ã€‚请检查在 abrt.conf 文件中系统的 MaxCrashReportsSize 值。"
-#: ../src/daemon/Daemon.cpp:699
-msgid "abrtd [options]"
-msgstr ""
-
-#: ../src/daemon/Daemon.cpp:709
+#: ../src/daemon/Daemon.cpp:553
msgid "Do not daemonize"
-msgstr ""
+msgstr "ä¸è¦å®ˆæŠ¤è¿›ç¨‹"
-#: ../src/daemon/Daemon.cpp:710
+#: ../src/daemon/Daemon.cpp:554
msgid "Log to syslog even with -d"
-msgstr ""
+msgstr "记录到系统日志å³ä½¿ç”¨åˆ°-d"
-#: ../src/daemon/Daemon.cpp:711
+#: ../src/daemon/Daemon.cpp:555
msgid "Exit after SEC seconds of inactivity"
-msgstr ""
+msgstr "在SEC秒闲置åŽé€€å‡º"
#: ../src/gui/abrt.desktop.in.h:2
msgid "View and report application crashes"
@@ -451,16 +465,16 @@ msgstr "报告器æ’件"
msgid "Database plugins"
msgstr "æ•°æ®åº“æ’件"
-#: ../src/gui/CCDBusBackend.py:74 ../src/gui/CCDBusBackend.py:97
+#: ../src/gui/CCDBusBackend.py:75 ../src/gui/CCDBusBackend.py:98
msgid "Cannot connect to system dbus."
msgstr "ä¸èƒ½è¿žæŽ¥åˆ°ç³»ç»Ÿ dbus。"
-#: ../src/gui/CCDBusBackend.py:120 ../src/gui/CCDBusBackend.py:123
+#: ../src/gui/CCDBusBackend.py:121 ../src/gui/CCDBusBackend.py:124
msgid "Please check if the abrt daemon is running."
msgstr "请检查 abrt 守护进程是å¦æ­£åœ¨è¿è¡Œã€‚"
#. FIXME: BUG: BarWindow remains. (how2reproduce: delete "component" in a dump dir and try to report it)
-#: ../src/gui/CCDBusBackend.py:169
+#: ../src/gui/CCDBusBackend.py:170
msgid ""
"Daemon did not return a valid report info.\n"
"Is debuginfo missing?"
@@ -508,11 +522,15 @@ msgstr "关于 ABRT"
msgid "Copy to Clipboard"
msgstr "å¤åˆ¶åˆ°å‰ªåˆ‡æ¿"
-#: ../src/gui/ccgui.glade.h:12 ../src/gui/settings.glade.h:19
+#: ../src/gui/ccgui.glade.h:12
+msgid "Online _Help"
+msgstr "在线帮助(_H)"
+
+#: ../src/gui/ccgui.glade.h:13 ../src/gui/settings.glade.h:12
msgid "Plugins"
msgstr "æ’件"
-#: ../src/gui/ccgui.glade.h:14
+#: ../src/gui/ccgui.glade.h:15
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 "
@@ -536,19 +554,19 @@ msgstr ""
"您应该已收到了附于本程åºçš„ GNU 通用公共授æƒçš„副本。若没有收到,请查看 "
"<http://www.gnu.org/licenses/>。"
-#: ../src/gui/ccgui.glade.h:19 ../src/gui/CReporterAssistant.py:71
+#: ../src/gui/ccgui.glade.h:20 ../src/gui/CReporterAssistant.py:111
msgid "View log"
msgstr "查看日志"
-#: ../src/gui/ccgui.glade.h:20
+#: ../src/gui/ccgui.glade.h:21
msgid "_Edit"
msgstr "编辑(_E)"
-#: ../src/gui/ccgui.glade.h:21
+#: ../src/gui/ccgui.glade.h:22
msgid "_File"
msgstr "文件(_F)"
-#: ../src/gui/ccgui.glade.h:22
+#: ../src/gui/ccgui.glade.h:23
msgid "_Help"
msgstr "帮助(_H)"
@@ -569,7 +587,7 @@ msgstr "主机å"
msgid "Latest Crash"
msgstr "最近的崩溃"
-#: ../src/gui/CCMainWindow.py:143
+#: ../src/gui/CCMainWindow.py:148
#, python-format
msgid ""
"Cannot show the settings dialog.\n"
@@ -578,7 +596,7 @@ msgstr ""
"无法显示设置对è¯ã€‚\n"
"%s"
-#: ../src/gui/CCMainWindow.py:148
+#: ../src/gui/CCMainWindow.py:153
#, python-format
msgid ""
"Unable to finish the current task!\n"
@@ -588,7 +606,7 @@ msgstr ""
"%s"
#. there is something wrong with the daemon if we cant get the dumplist
-#: ../src/gui/CCMainWindow.py:183
+#: ../src/gui/CCMainWindow.py:188
#, python-format
msgid ""
"Error while loading the dumplist.\n"
@@ -597,7 +615,7 @@ msgstr ""
"载入转储列表时出错。\n"
"%s"
-#: ../src/gui/CCMainWindow.py:241
+#: ../src/gui/CCMainWindow.py:246
#, python-format
msgid ""
"<b>%s Crash</b>\n"
@@ -606,11 +624,11 @@ msgstr ""
"<b>%s 崩溃</b>\n"
"%s"
-#: ../src/gui/CCMainWindow.py:337
+#: ../src/gui/CCMainWindow.py:343
msgid "You have to select a crash to copy."
msgstr "您必须选择一个崩溃æ¥å¤åˆ¶ã€‚"
-#: ../src/gui/CCMainWindow.py:421
+#: ../src/gui/CCMainWindow.py:427
msgid ""
"Usage: abrt-gui [OPTIONS]\n"
"\t-v[vv]\t\t\tVerbose\n"
@@ -620,7 +638,7 @@ msgstr ""
"\t-v[vv]\t\t\t\t冗长的\n"
"\t--report=崩溃标识\t\t直接报告带有此崩溃标识的崩溃"
-#: ../src/gui/CCMainWindow.py:444
+#: ../src/gui/CCMainWindow.py:450
#, python-format
msgid ""
"No such crash in the database, probably wrong crashid.\n"
@@ -629,92 +647,6 @@ msgstr ""
"æ•°æ®åº“中没有这个崩溃,å¯èƒ½æ˜¯é”™è¯¯çš„ crashid。\n"
"crashid=%s"
-#. default texts
-#: ../src/gui/CCReporterDialog.py:22 ../src/gui/CReporterAssistant.py:20
-msgid "Brief description of how to reproduce this or what you did..."
-msgstr "简è¦æ述如何é‡å¤æ­¤å´©æºƒæˆ–者您åšäº†ä»€ä¹ˆ......"
-
-#: ../src/gui/CCReporterDialog.py:107
-msgid "You must check the backtrace for sensitive data."
-msgstr "您必须检查回溯是å¦åŒ…å«æ•æ„Ÿæ•°æ®ã€‚"
-
-#: ../src/gui/CCReporterDialog.py:118 ../src/gui/CReporterAssistant.py:364
-#, python-format
-msgid ""
-"Reporting disabled because the backtrace is unusable.\n"
-"Please try to install debuginfo manually using the command: <b>debuginfo-"
-"install %s</b> \n"
-"then use the Refresh button to regenerate the backtrace."
-msgstr ""
-"因为回溯ä¸å¯ç”¨ï¼Œæ‰€ä»¥ä¸èƒ½æŠ¥å‘Šã€‚\n"
-"请å°è¯•ç”¨å‘½ä»¤ <b>debuginfo-install %s</b> 手动安装调试信æ¯ï¼Œ\n"
-"然åŽæŒ‰åˆ·æ–°æŒ‰é’®æ¥é‡æ–°ç”Ÿæˆå›žæº¯ã€‚"
-
-#: ../src/gui/CCReporterDialog.py:120
-msgid "The backtrace is unusable, you cannot report this!"
-msgstr "回溯ä¸å¯ç”¨ï¼Œæ‚¨ä¸èƒ½æŠ¥å‘Šè¿™ä¸ª bugï¼"
-
-#: ../src/gui/CCReporterDialog.py:124 ../src/gui/CReporterAssistant.py:342
-#: ../src/gui/CReporterAssistant.py:370
-msgid ""
-"The backtrace is incomplete, please make sure you provide the steps to "
-"reproduce."
-msgstr "回溯是ä¸å®Œæ•´çš„,请确定您æ供了é‡å¤è¯¥é”™è¯¯çš„完整步骤。"
-
-#: ../src/gui/CCReporterDialog.py:130
-msgid "Reporting disabled, please fix the problems shown above."
-msgstr "ä¸èƒ½æŠ¥å‘Šï¼Œè¯·ä¿®å¤ä»¥ä¸Šæ˜¾ç¤ºçš„问题。"
-
-#: ../src/gui/CCReporterDialog.py:132
-msgid "Sends the report using the selected plugin."
-msgstr "用选择的æ’件å‘é€æŠ¥å‘Šã€‚"
-
-#: ../src/gui/CCReporterDialog.py:398
-msgid ""
-"No reporter plugin available for this type of crash.\n"
-"Please check abrt.conf."
-msgstr ""
-"没有å¯ç”¨äºŽè¯¥ç±»åž‹å´©æºƒçš„报告器æ’件。\n"
-"请检查 abrt.conf。"
-
-#: ../src/gui/CCReporterDialog.py:418 ../src/gui/CReporterAssistant.py:249
-#: ../src/gui/PluginsSettingsDialog.py:136
-#, python-format
-msgid ""
-"Cannot save plugin settings:\n"
-" %s"
-msgstr ""
-"无法ä¿å­˜æ’件设置:\n"
-" %s"
-
-#: ../src/gui/CCReporterDialog.py:448 ../src/gui/CReporterAssistant.py:279
-#, python-format
-msgid "Configure %s options"
-msgstr "é…ç½® %s 选项"
-
-#: ../src/gui/CCReporterDialog.py:498 ../src/gui/CReporterAssistant.py:1074
-msgid ""
-"Unable to get report!\n"
-"Is debuginfo missing?"
-msgstr ""
-"无法获å–报告ï¼\n"
-"调试信æ¯ç¼ºå¤±ï¼Ÿ"
-
-#: ../src/gui/CCReporterDialog.py:527 ../src/gui/CReporterAssistant.py:455
-#, python-format
-msgid ""
-"Reporting failed!\n"
-"%s"
-msgstr ""
-"报告失败ï¼\n"
-"%s"
-
-#: ../src/gui/CCReporterDialog.py:553 ../src/gui/CCReporterDialog.py:574
-#: ../src/gui/CReporterAssistant.py:1113
-#, python-format
-msgid "Error acquiring the report: %s"
-msgstr "获å–报告时出错:%s"
-
#: ../src/gui/ConfBackend.py:78
msgid "Cannot connect to the Gnome Keyring daemon."
msgstr "无法连接到 Gnome 密钥环守护进程。"
@@ -741,40 +673,86 @@ msgstr "对 gnome 密钥环的访问被拒ç»ï¼Œæ— æ³•è½½å…¥ %s 的设置ï¼"
msgid "Access to gnome-keyring has been denied, cannot load settings."
msgstr "对 gnome 密钥环的访问被拒ç»ï¼Œæ— æ³•è½½å…¥è®¾ç½®ã€‚"
+#: ../src/gui/CReporterAssistant.py:20
+msgid "Brief description of how to reproduce this or what you did..."
+msgstr "简è¦æ述如何é‡å¤æ­¤å´©æºƒæˆ–者您åšäº†ä»€ä¹ˆ......"
+
#: ../src/gui/CReporterAssistant.py:21
msgid "Crash info doesn't contain a backtrace"
msgstr "崩溃信æ¯ä¸­ä¸åŒ…å«å›žæº¯"
-#: ../src/gui/CReporterAssistant.py:334
+#: ../src/gui/CReporterAssistant.py:277
+#: ../src/gui/PluginsSettingsDialog.py:136
+#, python-format
+msgid ""
+"Cannot save plugin settings:\n"
+" %s"
+msgstr ""
+"无法ä¿å­˜æ’件设置:\n"
+" %s"
+
+#: ../src/gui/CReporterAssistant.py:307
+#, python-format
+msgid "Configure %s options"
+msgstr "é…ç½® %s 选项"
+
+#: ../src/gui/CReporterAssistant.py:362
#, python-format
msgid "Rating is %s"
msgstr "等级为 %s"
-#: ../src/gui/CReporterAssistant.py:337
+#: ../src/gui/CReporterAssistant.py:365
msgid "Crashdump doesn't have rating => we suppose it's not required"
msgstr "崩溃转储没有等级 => 我们å‡è®¾å®ƒä¸éœ€è¦"
-#: ../src/gui/CReporterAssistant.py:350
+#: ../src/gui/CReporterAssistant.py:370 ../src/gui/CReporterAssistant.py:398
+msgid ""
+"The backtrace is incomplete, please make sure you provide the steps to "
+"reproduce."
+msgstr "回溯是ä¸å®Œæ•´çš„,请确定您æ供了é‡å¤è¯¥é”™è¯¯çš„完整步骤。"
+
+#: ../src/gui/CReporterAssistant.py:378
msgid "You should check the backtrace for sensitive data."
msgstr "您应该检查回溯中是å¦æœ‰æ•æ„Ÿæ•°æ®ã€‚"
-#: ../src/gui/CReporterAssistant.py:351
+#: ../src/gui/CReporterAssistant.py:379
msgid "You must agree with sending the backtrace."
msgstr "您必须åŒæ„å‘é€æ­¤å›žæº¯ã€‚"
-#: ../src/gui/CReporterAssistant.py:366
+#: ../src/gui/CReporterAssistant.py:392
+#, python-format
+msgid ""
+"Reporting disabled because the backtrace is unusable.\n"
+"Please try to install debuginfo manually using the command: <b>debuginfo-"
+"install %s</b> \n"
+"then use the Refresh button to regenerate the backtrace."
+msgstr ""
+"因为回溯ä¸å¯ç”¨ï¼Œæ‰€ä»¥ä¸èƒ½æŠ¥å‘Šã€‚\n"
+"请å°è¯•ç”¨å‘½ä»¤ <b>debuginfo-install %s</b> 手动安装调试信æ¯ï¼Œ\n"
+"然åŽæŒ‰åˆ·æ–°æŒ‰é’®æ¥é‡æ–°ç”Ÿæˆå›žæº¯ã€‚"
+
+#: ../src/gui/CReporterAssistant.py:394
msgid "Reporting disabled because the backtrace is unusable."
msgstr "ä¸èƒ½æŠ¥å‘Šå› ä¸ºå›žæº¯ä¸å¯ç”¨ã€‚"
-#: ../src/gui/CReporterAssistant.py:412
+#: ../src/gui/CReporterAssistant.py:440
msgid "You did not provide any steps to reproduce."
msgstr "您未æ供任何é‡å¤æ­¥éª¤ã€‚"
-#: ../src/gui/CReporterAssistant.py:426
+#: ../src/gui/CReporterAssistant.py:454
msgid "You did not provide any comments."
msgstr "您未æ供任何评论。"
-#: ../src/gui/CReporterAssistant.py:507
+#: ../src/gui/CReporterAssistant.py:483
+#, python-format
+msgid ""
+"Reporting failed!\n"
+"%s"
+msgstr ""
+"报告失败ï¼\n"
+"%s"
+
+#: ../src/gui/CReporterAssistant.py:535
#, python-format
msgid ""
"It looks like an application from the package <b>%s</b> has crashed on your "
@@ -797,15 +775,15 @@ msgstr ""
"\n"
"选择您è¦åœ¨å“ªé‡ŒæŠ¥å‘Šæ­¤ bug 并按‘å‰è¿›â€™ç»§ç»­ã€‚"
-#: ../src/gui/CReporterAssistant.py:548
+#: ../src/gui/CReporterAssistant.py:576
msgid "Only one reporter plugin is configured."
msgstr "åªé…置了一个报告程åºæ’件。"
-#: ../src/gui/CReporterAssistant.py:554
+#: ../src/gui/CReporterAssistant.py:582
msgid "Send a bug report"
msgstr "å‘é€ bug 报告"
-#: ../src/gui/CReporterAssistant.py:592
+#: ../src/gui/CReporterAssistant.py:620
msgid ""
"Below is the backtrace associated with your crash. A crash backtrace "
"provides developers with details about how the crash happened, helping them "
@@ -820,130 +798,143 @@ msgstr ""
"请检查下é¢çš„回溯并在必è¦æ—¶ä¿®æ”¹å®ƒä»¥ç¡®ä¿æ‚¨çš„ bug 报告中ä¸å«ä»»ä½•æ‚¨ä¸æ„¿å…±äº«çš„æ•æ„Ÿ"
"æ•°æ®ï¼š"
-#: ../src/gui/CReporterAssistant.py:663 ../src/gui/CReporterAssistant.py:676
-#: ../src/gui/CReporterAssistant.py:710
+#: ../src/gui/CReporterAssistant.py:691 ../src/gui/CReporterAssistant.py:704
+#: ../src/gui/CReporterAssistant.py:738
#, python-format
msgid "Found %i occurence(s) [at: %i of %i]"
-msgstr ""
+msgstr "找到 %i 个å‘生 [在 %i 之于 %i]"
-#: ../src/gui/CReporterAssistant.py:747
+#: ../src/gui/CReporterAssistant.py:775
msgid "Search:"
-msgstr ""
+msgstr "æœç´¢ï¼š"
-#: ../src/gui/CReporterAssistant.py:778
+#: ../src/gui/CReporterAssistant.py:806
msgid "Refresh"
msgstr "刷新"
-#: ../src/gui/CReporterAssistant.py:780
+#: ../src/gui/CReporterAssistant.py:808
msgid "Copy"
msgstr "å¤åˆ¶"
-#: ../src/gui/CReporterAssistant.py:786
+#: ../src/gui/CReporterAssistant.py:814
msgid "I agree with submitting the backtrace"
msgstr "我åŒæ„æ交回溯"
-#: ../src/gui/CReporterAssistant.py:791
+#: ../src/gui/CReporterAssistant.py:819
msgid "Approve the backtrace"
msgstr "åŒæ„回溯"
-#: ../src/gui/CReporterAssistant.py:834
+#: ../src/gui/CReporterAssistant.py:862
msgid "You need to fill the how to before you can proceed..."
-msgstr ""
+msgstr "在你å¯ä»¥å¤„ç†å‰éœ€è¦å¡«å†™åšæ³•ã€‚"
-#: ../src/gui/CReporterAssistant.py:857
+#: ../src/gui/CReporterAssistant.py:885
msgid "How did this crash happen (step-by-step)? How would you reproduce it?"
msgstr "此崩溃是如何å‘生的(具体步骤)?您如何é‡å¤å®ƒï¼Ÿ"
-#: ../src/gui/CReporterAssistant.py:877
+#: ../src/gui/CReporterAssistant.py:905
msgid ""
"Are there any comments you would like to share with the software maintainers?"
msgstr "您有什么è¦ä¸Žè½¯ä»¶ç»´æŠ¤è€…分享的评论å—?"
-#: ../src/gui/CReporterAssistant.py:897
+#: ../src/gui/CReporterAssistant.py:925
msgid "Provide additional details"
msgstr "æ供附加细节"
-#: ../src/gui/CReporterAssistant.py:904
+#: ../src/gui/CReporterAssistant.py:932
msgid ""
"<b>Tip:</b> Your comments are not private. Please watch what you say "
"accordingly."
msgstr "<b>æ示:</b>您的评论ä¸æ˜¯ç§ä¸‹çš„。请注æ„您的言论。"
-#: ../src/gui/CReporterAssistant.py:945
+#: ../src/gui/CReporterAssistant.py:973
msgid "Confirm and send the report"
msgstr "确认并å‘é€æŠ¥å‘Š"
-#: ../src/gui/CReporterAssistant.py:947
+#: ../src/gui/CReporterAssistant.py:975
msgid ""
"Below is a summary of your bug report. Please click 'Apply' to submit it."
msgstr "下é¢æ˜¯æ‚¨çš„ bug 报告的摘è¦ã€‚请点击‘应用’æ交。"
-#: ../src/gui/CReporterAssistant.py:952
+#: ../src/gui/CReporterAssistant.py:980
msgid "<b>Basic details</b>"
msgstr "<b>基本细节</b>"
#. left table
-#: ../src/gui/CReporterAssistant.py:959
+#: ../src/gui/CReporterAssistant.py:987
msgid "Component"
msgstr "组件"
-#: ../src/gui/CReporterAssistant.py:960
+#: ../src/gui/CReporterAssistant.py:988
msgid "Package"
msgstr "软件包"
-#: ../src/gui/CReporterAssistant.py:961
+#: ../src/gui/CReporterAssistant.py:989
msgid "Executable"
msgstr "å¯æ‰§è¡Œæ–‡ä»¶"
-#: ../src/gui/CReporterAssistant.py:962
+#: ../src/gui/CReporterAssistant.py:990
msgid "Cmdline"
msgstr "命令行"
#. right table
-#: ../src/gui/CReporterAssistant.py:964
+#: ../src/gui/CReporterAssistant.py:992
msgid "Architecture"
msgstr "架构"
-#: ../src/gui/CReporterAssistant.py:965
+#: ../src/gui/CReporterAssistant.py:993
msgid "Kernel"
msgstr "内核"
-#: ../src/gui/CReporterAssistant.py:966
+#: ../src/gui/CReporterAssistant.py:994
msgid "Release"
msgstr "å‘行版"
-#: ../src/gui/CReporterAssistant.py:967
+#: ../src/gui/CReporterAssistant.py:995
msgid "Reason"
msgstr "原因"
-#: ../src/gui/CReporterAssistant.py:978 ../src/gui/report.glade.h:3
+#: ../src/gui/CReporterAssistant.py:1006 ../src/gui/report.glade.h:3
msgid "<b>Backtrace</b>"
msgstr "<b>回溯</b>"
-#: ../src/gui/CReporterAssistant.py:981
+#: ../src/gui/CReporterAssistant.py:1009
msgid "Click to view..."
msgstr "点击查看......"
-#: ../src/gui/CReporterAssistant.py:993
+#: ../src/gui/CReporterAssistant.py:1021
msgid "<b>Steps to reproduce:</b>"
msgstr "<b>å†çŽ°æ­¥éª¤ï¼š</b>"
-#: ../src/gui/CReporterAssistant.py:1014
+#: ../src/gui/CReporterAssistant.py:1042
msgid "<b>Comments:</b>"
msgstr "<b>评论:</b>"
-#: ../src/gui/CReporterAssistant.py:1017
+#: ../src/gui/CReporterAssistant.py:1045
msgid "No comment provided!"
msgstr "未æ供评论ï¼"
-#: ../src/gui/CReporterAssistant.py:1053
+#: ../src/gui/CReporterAssistant.py:1081
msgid "Finished sending the bug report"
msgstr " bug 报告å‘é€å®Œæ¯•"
-#: ../src/gui/CReporterAssistant.py:1057
+#: ../src/gui/CReporterAssistant.py:1085
msgid "<b>Bug reports:</b>"
msgstr "<b> bug 报告:</b>"
+#: ../src/gui/CReporterAssistant.py:1102
+msgid ""
+"Unable to get report!\n"
+"Is debuginfo missing?"
+msgstr ""
+"无法获å–报告ï¼\n"
+"调试信æ¯ç¼ºå¤±ï¼Ÿ"
+
+#: ../src/gui/CReporterAssistant.py:1139
+#, python-format
+msgid "Error acquiring the report: %s"
+msgstr "获å–报告时出错:%s"
+
#: ../src/gui/dialogs.glade.h:1
msgid "Log"
msgstr "日志"
@@ -986,7 +977,6 @@ msgid "Name"
msgstr "å称"
#: ../src/gui/PluginsSettingsDialog.py:118
-#, fuzzy
msgid "Please select a plugin from the list to edit its options."
msgstr "请从以下列表中选择一个æ’件以编辑其选项。"
@@ -1089,103 +1079,67 @@ msgstr "å‘é€æŠ¥å‘Š"
msgid "Show log"
msgstr "显示日志"
-#: ../src/gui/SettingsDialog.py:34 ../src/gui/SettingsDialog.py:51
-msgid "<b>Select plugin</b>"
-msgstr "<b>选择æ’件</b>"
-
-#: ../src/gui/SettingsDialog.py:37
-msgid "<b>Select database backend</b>"
-msgstr "<b>选择数æ®åº“åŽç«¯</b>"
-
-#: ../src/gui/SettingsDialog.py:170
+#: ../src/gui/SettingsDialog.py:122
msgid "Remove this job"
msgstr "删除此工作"
-#: ../src/gui/SettingsDialog.py:214
+#: ../src/gui/SettingsDialog.py:166
msgid "Remove this action"
msgstr "删除此动作"
#: ../src/gui/settings.glade.h:1
-msgid "<b>Analyzer plugin</b>"
-msgstr "<b>分æžå™¨æ’件</b>"
-
-#: ../src/gui/settings.glade.h:2
-msgid "<b>Associated action</b>"
-msgstr "<b>å…³è”动作</b>"
-
-#: ../src/gui/settings.glade.h:3
msgid "<b>Plugin details</b>"
msgstr "<b>æ’件细节</b>"
-#: ../src/gui/settings.glade.h:4
-msgid "<b>Plugin</b>"
-msgstr "<b>æ’件</b>"
-
-#: ../src/gui/settings.glade.h:5
-msgid "<b>Time (or period)</b>"
-msgstr "<b>时间(或时段)</b>"
-
-#: ../src/gui/settings.glade.h:6
-msgid "Analyzers, Actions, Reporters"
-msgstr "分æžå™¨, 动作, 报告器"
-
-#: ../src/gui/settings.glade.h:7
+#: ../src/gui/settings.glade.h:2
msgid "Author:"
msgstr "作者:"
-#: ../src/gui/settings.glade.h:8
+#: ../src/gui/settings.glade.h:3
msgid "Blacklisted packages: "
msgstr "被加入黑åå•çš„软件包:"
-#: ../src/gui/settings.glade.h:9
+#: ../src/gui/settings.glade.h:4
msgid "C_onfigure Plugin"
msgstr "é…ç½®æ’件(_O)"
-#: ../src/gui/settings.glade.h:10
+#: ../src/gui/settings.glade.h:5
msgid "Check package GPG signature"
msgstr "检查软件包的 GPG ç­¾å"
-#: ../src/gui/settings.glade.h:11
+#: ../src/gui/settings.glade.h:6
msgid "Common"
msgstr "普通"
-#: ../src/gui/settings.glade.h:12
-msgid "Cron"
-msgstr "定时任务"
-
-#: ../src/gui/settings.glade.h:13
-msgid "Database backend: "
-msgstr "æ•°æ®åº“åŽç«¯ï¼š"
-
-#: ../src/gui/settings.glade.h:14
+#: ../src/gui/settings.glade.h:7
msgid "Description:"
msgstr "æ述:"
-#: ../src/gui/settings.glade.h:15
+#: ../src/gui/settings.glade.h:8
msgid "GPG Keys"
msgstr "GPG 密钥"
-#: ../src/gui/settings.glade.h:16
+#: ../src/gui/settings.glade.h:9
msgid "GPG keys: "
msgstr "GPG 密钥:"
-#: ../src/gui/settings.glade.h:17
+#: ../src/gui/settings.glade.h:10
msgid "Max coredump storage size (MB):"
msgstr "最大核心转储存储大å°ï¼ˆMB):"
-#: ../src/gui/settings.glade.h:18
+#: ../src/gui/settings.glade.h:11
msgid "Name:"
msgstr "å称:"
-#: ../src/gui/settings.glade.h:20
+#: ../src/gui/settings.glade.h:13
msgid "Preferences"
msgstr "首选项"
-#: ../src/gui/settings.glade.h:21
+#: ../src/gui/settings.glade.h:14
msgid "Version:"
msgstr "版本:"
-#: ../src/gui/settings.glade.h:22
+#: ../src/gui/settings.glade.h:15
msgid "Web Site:"
msgstr "网站:"
@@ -1206,266 +1160,306 @@ msgstr ""
"探测到有些å¯ç”¨çš„报告程åºæ’件有错误设置。请使用以下按钮打开对应的é…置并在继续"
"报告å‰ä¿®å¤å®ƒï¼Œå¦åˆ™æŠ¥å‘Šè¿‡ç¨‹ä¼šå¤±è´¥ã€‚\n"
-#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.cpp:47
+#: ../src/lib/abrt_curl.c:170 ../src/plugins/abrt-action-upload.c:45
#, c-format
msgid "Uploaded: %llu of %llu kbytes"
-msgstr ""
+msgstr "上传:%llu之于%llu KB"
-#: ../src/lib/parse_options.c:11
+#: ../src/lib/parse_options.c:29
#, c-format
msgid "Usage: %s\n"
-msgstr ""
+msgstr "用法: %s\n"
-#: ../src/plugins/abrt-action-analyze-c.c:154
+#: ../src/plugins/abrt-action-analyze-c.c:156
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID of coredumps"
msgstr ""
+" [-v] -d DIR\n"
+"\n"
+"计算并ä¿å­˜æ ¸å¿ƒè½¬å‚¨çš„UUID。"
-#: ../src/plugins/abrt-action-analyze-oops.c:131
+#: ../src/plugins/abrt-action-analyze-oops.c:133
msgid ""
" [-vs] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of oops crash dumps"
msgstr ""
+" [-vs] -d DIR\n"
+"\n"
+"计算并ä¿å­˜oops核心转储的UUIDå’ŒDUPHASH。"
-#: ../src/plugins/abrt-action-analyze-python.c:36
+#: ../src/plugins/abrt-action-analyze-python.c:38
msgid ""
-" [-vs] -d DIR\n"
+" [-v] -d DIR\n"
"\n"
"Calculates and saves UUID and DUPHASH of python crash dumps"
msgstr ""
+" [-v] -d DIR\n"
+"\n"
+"计算并ä¿å­˜Python崩溃转储的UUIDå’ŒDUPHASH。"
-#: ../src/plugins/abrt-action-bugzilla.cpp:532
+#: ../src/plugins/abrt-action-bugzilla.cpp:534
#, c-format
msgid "New bug id: %i"
msgstr "新的 bug id:%i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:645
+#: ../src/plugins/abrt-action-bugzilla.cpp:662
#, c-format
-msgid "Can't open '%s'"
-msgstr ""
-
-#: ../src/plugins/abrt-action-bugzilla.cpp:665
-#, fuzzy, c-format
msgid "Empty login or password, please check %s"
-msgstr ""
-"空登录å或密ç ã€‚\n"
-"请检查一下ï¼"
+msgstr "空登陆或密ç ï¼Œè¯·æ£€æŸ¥ %s"
-#: ../src/plugins/abrt-action-bugzilla.cpp:683
+#: ../src/plugins/abrt-action-bugzilla.cpp:680
msgid "Logging into bugzilla..."
msgstr "正在登录 bugzilla ……"
-#: ../src/plugins/abrt-action-bugzilla.cpp:686
+#: ../src/plugins/abrt-action-bugzilla.cpp:683
msgid "Checking for duplicates..."
msgstr "检查是å¦å­˜åœ¨é‡å¤â€¦â€¦"
-#: ../src/plugins/abrt-action-bugzilla.cpp:707
-#: ../src/plugins/abrt-action-bugzilla.cpp:743
+#: ../src/plugins/abrt-action-bugzilla.cpp:705
+#: ../src/plugins/abrt-action-bugzilla.cpp:741
msgid "Missing mandatory member 'bugs'"
msgstr "缺少必需æˆå‘˜ 'bugs'"
-#: ../src/plugins/abrt-action-bugzilla.cpp:726
-#: ../src/plugins/abrt-action-bugzilla.cpp:759
-#: ../src/plugins/abrt-action-bugzilla.cpp:834
+#: ../src/plugins/abrt-action-bugzilla.cpp:724
+#: ../src/plugins/abrt-action-bugzilla.cpp:757
+#: ../src/plugins/abrt-action-bugzilla.cpp:833
msgid "get_bug_info() failed. Could not collect all mandatory information"
msgstr "get_bug_info() 失败。ä¸èƒ½æ”¶é›†åˆ°æ‰€æœ‰å¿…需信æ¯ã€‚"
-#: ../src/plugins/abrt-action-bugzilla.cpp:775
+#: ../src/plugins/abrt-action-bugzilla.cpp:772
msgid "Creating a new bug..."
msgstr "生æˆæ–° bug......"
-#: ../src/plugins/abrt-action-bugzilla.cpp:780
+#: ../src/plugins/abrt-action-bugzilla.cpp:777
msgid "Bugzilla entry creation failed"
msgstr "Bugzilla æ¡ç›®ç”Ÿæˆå¤±è´¥"
-#: ../src/plugins/abrt-action-bugzilla.cpp:790
-#: ../src/plugins/abrt-action-bugzilla.cpp:887
+#: ../src/plugins/abrt-action-bugzilla.cpp:789
+#: ../src/plugins/abrt-action-bugzilla.cpp:886
msgid "Logging out..."
msgstr "正在注销……"
#. decision based on state
-#: ../src/plugins/abrt-action-bugzilla.cpp:808
+#: ../src/plugins/abrt-action-bugzilla.cpp:807
#, c-format
msgid "Bug is already reported: %i"
msgstr " bug 已报告:%i"
-#: ../src/plugins/abrt-action-bugzilla.cpp:819
+#: ../src/plugins/abrt-action-bugzilla.cpp:818
#, c-format
msgid "Bugzilla couldn't find parent of bug %d"
msgstr "Bugzilla ä¸èƒ½æ‰¾åˆ° bug 的父级(%d)"
-#: ../src/plugins/abrt-action-bugzilla.cpp:848
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-bugzilla.cpp:847
+#, c-format
msgid "Add %s to CC list"
-msgstr "在 CC 列表中添加 %s"
+msgstr "添加 %s 到CC List"
-#: ../src/plugins/abrt-action-bugzilla.cpp:872
+#: ../src/plugins/abrt-action-bugzilla.cpp:871
#, c-format
msgid "Adding new comment to bug %d"
msgstr "在 bug 中添加新注释(%d)"
-#: ../src/plugins/abrt-action-generate-backtrace.c:319
+#: ../src/plugins/abrt-action-bugzilla.cpp:913
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to Bugzilla"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"报告一个崩溃到Bugzilla"
+
+#: ../src/plugins/abrt-action-bugzilla.cpp:928
+#: ../src/plugins/abrt-action-kerneloops.c:148
+#: ../src/plugins/abrt-action-rhtsupport.c:281
+msgid "Configuration file (may be given many times)"
+msgstr "é…置文件(或许需è¦ä¸€ç‚¹æ—¶é—´ï¼‰"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:258
+msgid " [options] -d DIR"
+msgstr " [选项] -d DIR"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:271
+msgid "Additional debuginfo directories"
+msgstr "附加出错信æ¯ç›®å½•"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:272
+msgid "Kill gdb if it runs for more than N seconds"
+msgstr "如果GDBè¿è¡Œè¶…过N秒就æ€æ­»å®ƒ"
+
+#: ../src/plugins/abrt-action-generate-backtrace.c:320
#, c-format
msgid "Backtrace parsing failed for %s"
-msgstr ""
+msgstr "%s的回溯解æžå¤±è´¥"
#: ../src/plugins/abrt-action-install-debuginfo.py:72
#, python-format
msgid "Extracting cpio from %s"
-msgstr ""
+msgstr "正在从%sæå–cpio"
#: ../src/plugins/abrt-action-install-debuginfo.py:77
msgid "Can't write to:"
-msgstr ""
+msgstr "ä¸èƒ½å†™å…¥åˆ°ï¼š"
#: ../src/plugins/abrt-action-install-debuginfo.py:87
msgid "Removing the temporary rpm file"
-msgstr ""
+msgstr "正在移除临时rpm文件"
#: ../src/plugins/abrt-action-install-debuginfo.py:91
#, python-format
msgid "Can't extract package: %s"
-msgstr ""
+msgstr "ä¸èƒ½æå–包 %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:99
#, python-format
msgid "Caching files from %s made from %s"
-msgstr ""
+msgstr "缓存文件æ¥è‡ª%s,创建自%s"
#: ../src/plugins/abrt-action-install-debuginfo.py:107
msgid "Removing the temporary cpio file"
-msgstr ""
+msgstr "正在移除临时cpio文件"
#: ../src/plugins/abrt-action-install-debuginfo.py:110
#, python-format
msgid "Can't extract files from: %s"
-msgstr ""
+msgstr "ä¸èƒ½ä»Ž %s æå–文件"
#: ../src/plugins/abrt-action-install-debuginfo.py:134
#: ../src/plugins/abrt-action-install-debuginfo.py:140
#, python-format
msgid "Downloading (%i of %i) %.30s : %.3s %%"
-msgstr ""
+msgstr "正在下载(%i于%i)%30s: %.3s %%"
#: ../src/plugins/abrt-action-install-debuginfo.py:169
-#, fuzzy
msgid "Searching the missing debuginfo packages"
-msgstr "正在å¯åŠ¨è°ƒè¯•ä¿¡æ¯çš„安装"
+msgstr "正在æœç´¢ç¼ºå°‘的除错信æ¯åŒ…"
#: ../src/plugins/abrt-action-install-debuginfo.py:224
#, python-format
msgid "To download: (%.2f) M / Installed size: %.2f M"
-msgstr ""
+msgstr "è¦ä¸‹è½½ï¼š (%.2f) M / 安装大å°ï¼š %.2f M"
#: ../src/plugins/abrt-action-install-debuginfo.py:240
msgid "Is this ok? [y/N] "
-msgstr ""
+msgstr "这好å—? [y/N]"
#: ../src/plugins/abrt-action-install-debuginfo.py:257
#, python-format
msgid "Downloading package %s failed"
-msgstr ""
+msgstr "下载包 %s 失败"
#. recursively delete the temp dir on failure
#: ../src/plugins/abrt-action-install-debuginfo.py:268
msgid "Unpacking failed, aborting download..."
-msgstr ""
+msgstr "解包失败,终止下载……"
#: ../src/plugins/abrt-action-install-debuginfo.py:275
#, python-format
msgid "All downloaded packages have been extracted, removing %s"
-msgstr ""
+msgstr "所有已下载的包已æå–,正在移除 %s"
#: ../src/plugins/abrt-action-install-debuginfo.py:280
#, python-format
msgid "Can't remove %s, probably contains an error log"
-msgstr ""
+msgstr "ä¸èƒ½ç§»é™¤ %s,å¯èƒ½åŒ…å«ä¸€ä¸ªé”™è¯¯æ—¥å¿—"
#: ../src/plugins/abrt-action-install-debuginfo.py:305
#, python-format
msgid "Analyzing corefile: %(corefile_path)s"
-msgstr ""
+msgstr "分æžæ ¸å¿ƒæ–‡ä»¶: %(corefile_path)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:384
#, python-format
msgid "Can't remove %(tmpdir_path)s: %(reason)s"
-msgstr ""
+msgstr "ä¸èƒ½ç§»é™¤%(tmpdir_path)s: %(reason)s"
#: ../src/plugins/abrt-action-install-debuginfo.py:394
msgid "Exiting on user Command"
-msgstr ""
+msgstr "离开用户命令"
#: ../src/plugins/abrt-action-install-debuginfo.py:413
#, python-format
msgid "Usage: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
-msgstr ""
+msgstr "用法: %s --core=<COREFILE> --tmpdir=<TMPDIR> --cachedir=<CACHEDIR>"
#: ../src/plugins/abrt-action-install-debuginfo.py:442
-#, fuzzy
msgid "You have to specify the path to coredump."
-msgstr "您必须选择一个崩溃æ¥å¤åˆ¶ã€‚"
+msgstr "你必须指定到核心转储的路径。"
#: ../src/plugins/abrt-action-install-debuginfo.py:446
-#, fuzzy
msgid "You have to specify the path to cachedir."
-msgstr "您必须选择一个崩溃æ¥å¤åˆ¶ã€‚"
+msgstr "你必须指定到缓存目录的路径。"
#: ../src/plugins/abrt-action-install-debuginfo.py:450
-#, fuzzy
msgid "You have to specify the path to tmpdir."
-msgstr "您必须选择一个崩溃æ¥å¤åˆ¶ã€‚"
+msgstr "你必须制定到临时目录的路径。"
#: ../src/plugins/abrt-action-install-debuginfo.py:463
msgid "All debuginfo seems to be available"
-msgstr ""
+msgstr "所有除错信æ¯çœ‹èµ·æ¥å¯ç”¨"
#: ../src/plugins/abrt-action-install-debuginfo.py:470
-#, fuzzy
msgid "Complete!"
-msgstr "组件"
+msgstr "完æˆï¼"
-#: ../src/plugins/abrt-action-kerneloops.cpp:111
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-kerneloops.c:105
+#, c-format
msgid "Submitting oops report to %s"
-msgstr "正在将报告写入 '%s'"
+msgstr "正在å‘é€oops报告到%s"
-#: ../src/plugins/abrt-action-mailx.cpp:114
+#: ../src/plugins/abrt-action-kerneloops.c:133
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a kernel oops to kerneloops.org (or similar) site"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"报告一个内核oops到kerneloops.org(或相似)站点"
+
+#: ../src/plugins/abrt-action-mailx.c:110
msgid "Sending an email..."
msgstr "正在å‘é€ç”µå­é‚®ä»¶â€¦â€¦"
-#: ../src/plugins/abrt-action-mailx.cpp:138
+#: ../src/plugins/abrt-action-mailx.c:137
msgid ""
" [-v] -d DIR [-c CONFFILE]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d DIR [-c CONFFILE]\n"
+"\n"
+"上传崩溃转储的压缩归档文件"
-#: ../src/plugins/abrt-action-mailx.cpp:151
-#: ../src/plugins/abrt-action-upload.cpp:267
-#, fuzzy
+#: ../src/plugins/abrt-action-mailx.c:150
+#: ../src/plugins/abrt-action-upload.c:261
msgid "Config file"
-msgstr "日志程åºæ–‡ä»¶ï¼š"
+msgstr "é…置文件"
-#: ../src/plugins/abrt-action-print.cpp:39
+#: ../src/plugins/abrt-action-print.c:38
msgid ""
" [-v] [-o FILE] -d DIR\n"
"\n"
"Print information about the crash to standard output"
msgstr ""
+" [-v] [-o FILE] -d DIR\n"
+"\n"
+"输出关于此次崩溃的信æ¯åˆ°æ ‡å‡†è¾“出"
-#: ../src/plugins/abrt-action-print.cpp:51
+#: ../src/plugins/abrt-action-print.c:51
msgid "Output file"
-msgstr ""
+msgstr "输出文件"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was appended to %s"
msgstr "已在 %s 中附加该报告"
-#: ../src/plugins/abrt-action-print.cpp:100
+#: ../src/plugins/abrt-action-print.c:91
#, c-format
msgid "The report was stored to %s"
msgstr "已在 %s 中ä¿å­˜è¯¥æŠ¥å‘Š"
@@ -1473,48 +1467,84 @@ msgstr "已在 %s 中ä¿å­˜è¯¥æŠ¥å‘Š"
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
#. error msg is already logged by dd_opendir
#. Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing
-#: ../src/plugins/abrt-action-rhtsupport.cpp:43
-#: ../src/plugins/abrt-action-upload.cpp:121
+#: ../src/plugins/abrt-action-rhtsupport.c:41
+#: ../src/plugins/abrt-action-upload.c:119
msgid "Compressing data"
-msgstr ""
+msgstr "压缩数æ®"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:78
-#, fuzzy
+#: ../src/plugins/abrt-action-rhtsupport.c:73
msgid "Empty login or password, please check RHTSupport.conf"
-msgstr ""
-"空登录å或密ç ã€‚\n"
-"请检查一下ï¼"
+msgstr "空登录或密ç ï¼Œè¯·æ£€æŸ¥RHTSupport.conf"
-#: ../src/plugins/abrt-action-rhtsupport.cpp:194
+#: ../src/plugins/abrt-action-rhtsupport.c:191
msgid "Creating a new case..."
msgstr "正在创建新案例……"
-#: ../src/plugins/abrt-action-upload.cpp:65
-#, fuzzy, c-format
+#: ../src/plugins/abrt-action-rhtsupport.c:266
+msgid ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"Report a crash to RHTSupport"
+msgstr ""
+" [-vs] -c CONFFILE -d DIR\n"
+"\n"
+"报告一个崩溃到RHTSupport"
+
+#: ../src/plugins/abrt-action-upload.c:63
+#, c-format
msgid "Sending %s to %s"
-msgstr "正在å‘é€å½’æ¡£ %s 至 %s"
+msgstr "正在å‘é€ %s 至 %s"
#. This ends up a "reporting status message" in abrtd
-#: ../src/plugins/abrt-action-upload.cpp:98
+#: ../src/plugins/abrt-action-upload.c:96
#, c-format
msgid "Successfully sent %s to %s"
-msgstr ""
+msgstr "æˆåŠŸå‘é€ %s 到 %s"
-#: ../src/plugins/abrt-action-upload.cpp:219
+#: ../src/plugins/abrt-action-upload.c:212
#, c-format
msgid "Archive is created: '%s'"
-msgstr ""
+msgstr "归档已创建:“%sâ€"
-#: ../src/plugins/abrt-action-upload.cpp:253
+#: ../src/plugins/abrt-action-upload.c:247
msgid ""
" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
"\n"
"Upload compressed tarball of crash dump"
msgstr ""
+" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
+"\n"
+"上传崩溃转储的压缩归档文件"
-#: ../src/plugins/abrt-action-upload.cpp:268
+#: ../src/plugins/abrt-action-upload.c:262
msgid "Base URL to upload to"
+msgstr "上传的基本URL"
+
+#: ../src/plugins/abrt-dump-oops.c:540
+msgid ""
+" [-vsrdow] FILE\n"
+"\n"
+"Extract oops from syslog/dmesg file"
msgstr ""
+" [-vsrdow] FILE\n"
+"\n"
+"从 syslog/dmesg 文件中æå–oops"
+
+#: ../src/plugins/abrt-dump-oops.c:556
+msgid "Parse kernel's message buffer before parsing FILE"
+msgstr "在解æžFILE之å‰è§£æžå†…核的消æ¯ç¼“冲区"
+
+#: ../src/plugins/abrt-dump-oops.c:557
+msgid "Create ABRT dump for every oops found"
+msgstr "为æ¯ä¸ªæ‰¾åˆ°çš„oops创建ABRT转储"
+
+#: ../src/plugins/abrt-dump-oops.c:558
+msgid "Print found oopses on standard output"
+msgstr "在标准输出上输出找到的oops"
+
+#: ../src/plugins/abrt-dump-oops.c:559
+msgid "Do not exit, watch the file for new oopses"
+msgstr "别退出,正为新的opps而监视此文件。"
#: ../src/plugins/Bugzilla.glade.h:1
msgid "<b>Bugzilla plugin configuration</b>"
@@ -1552,10 +1582,6 @@ msgstr ""
"您å¯åœ¨<a href=\"https://bugzilla.redhat.com/createaccount.cgi\">这里</a>生æˆ"
"它"
-#: ../src/plugins/CCpp.cpp:277
-msgid "Analyzes crashes in C/C++ programs"
-msgstr "使用 C/C++ 程åºåˆ†æžå´©æºƒ"
-
#: ../src/plugins/KerneloopsReporter.glade.h:1
msgid "<b>Kerneloops Reporter plugin configuration</b>"
msgstr "<b>内核回é€æŠ¥å‘Šç¨‹åºæ’件é…ç½®</b>"
@@ -1564,10 +1590,6 @@ msgstr "<b>内核回é€æŠ¥å‘Šç¨‹åºæ’件é…ç½®</b>"
msgid "Submit URL:"
msgstr "æ交 URL:"
-#: ../src/plugins/KerneloopsScanner.cpp:227
-msgid "Periodically scans for and saves kernel oopses"
-msgstr "周期性扫æ并ä¿å­˜å†…æ ¸ opps"
-
#: ../src/plugins/Logger.glade.h:1
msgid "<b>Logger plugin configuration</b>"
msgstr "<b>日志程åºæ’件é…ç½®</b>"
@@ -1613,9 +1635,8 @@ msgid "RHTSupport URL:"
msgstr "RHTSupport URL:"
#: ../src/plugins/Upload.glade.h:1
-#, fuzzy
msgid "<b>Upload plugin configuration</b>"
-msgstr "<b>Ticket 上传程åºæ’件é…ç½®</b>"
+msgstr "<b>上传æ’件é…ç½®</b>"
#: ../src/plugins/Upload.glade.h:2
msgid "Retry count:"
@@ -1633,6 +1654,105 @@ msgstr "URL:"
msgid "Use encryption"
msgstr "使用加密"
+#, fuzzy
+#~ msgid ""
+#~ "Usage: %s [OPTION]\n"
+#~ "\n"
+#~ "Startup:\n"
+#~ "\t-V, --version\t\tdisplay the version of %s and exit\n"
+#~ "\t-?, --help\t\tprint this help\n"
+#~ "\n"
+#~ "Actions:\n"
+#~ "\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
+#~ "\t -f, --full\tprint a list of all crashes, including the already "
+#~ "reported ones\n"
+#~ "\t-r, --report CRASH_ID\tcreate and send a report\n"
+#~ "\t -y, --always\tcreate and send a report without asking\n"
+#~ "\t-d, --delete CRASH_ID\tremove a crash\n"
+#~ "\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
+#~ "\t -b, --backtrace\tprint detailed information about a crash "
+#~ "including backtrace\n"
+#~ "CRASH_ID can be:\n"
+#~ "\ta name of dump directory, or\n"
+#~ "\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+#~ msgstr ""
+#~ "用法: %s [OPTION]\n"
+#~ "\n"
+#~ "Startup:\n"
+#~ "\t-V, --version\t\tdisplay the version of %s and exit\n"
+#~ "\t-?, --help\t\tprint this help\n"
+#~ "\n"
+#~ "Actions:\n"
+#~ "\t-l, --list\t\tprint a list of all crashes which are not yet reported\n"
+#~ "\t -f, --full\tprint a list of all crashes, including the already "
+#~ "reported ones\n"
+#~ "\t-r, --report CRASH_ID\tcreate and send a report\n"
+#~ "\t -y, --always\tcreate and send a report without asking\n"
+#~ "\t-d, --delete CRASH_ID\tremove a crash\n"
+#~ "\t-i, --info CRASH_ID\tprint detailed information about a crash\n"
+#~ "\t -b, --backtrace\tprint detailed information about a crash "
+#~ "including backtrace\n"
+#~ "CRASH_ID can be:\n"
+#~ "\tUID:UUID pair,\n"
+#~ "\tunique UUID prefix - the crash with matching UUID will be acted upon\n"
+#~ "\t@N - N'th crash (as displayed by --list --full) will be acted upon\n"
+
+#, fuzzy
+#~ msgid "Error loading reporter settings"
+#~ msgstr "获å–报告时出错:%s"
+
+#~ msgid "You must check the backtrace for sensitive data."
+#~ msgstr "您必须检查回溯是å¦åŒ…å«æ•æ„Ÿæ•°æ®ã€‚"
+
+#~ msgid "The backtrace is unusable, you cannot report this!"
+#~ msgstr "回溯ä¸å¯ç”¨ï¼Œæ‚¨ä¸èƒ½æŠ¥å‘Šè¿™ä¸ª bugï¼"
+
+#~ msgid "Reporting disabled, please fix the problems shown above."
+#~ msgstr "ä¸èƒ½æŠ¥å‘Šï¼Œè¯·ä¿®å¤ä»¥ä¸Šæ˜¾ç¤ºçš„问题。"
+
+#~ msgid "Sends the report using the selected plugin."
+#~ msgstr "用选择的æ’件å‘é€æŠ¥å‘Šã€‚"
+
+#~ msgid ""
+#~ "No reporter plugin available for this type of crash.\n"
+#~ "Please check abrt.conf."
+#~ msgstr ""
+#~ "没有å¯ç”¨äºŽè¯¥ç±»åž‹å´©æºƒçš„报告器æ’件。\n"
+#~ "请检查 abrt.conf。"
+
+#~ msgid "<b>Select plugin</b>"
+#~ msgstr "<b>选择æ’件</b>"
+
+#~ msgid "<b>Select database backend</b>"
+#~ msgstr "<b>选择数æ®åº“åŽç«¯</b>"
+
+#~ msgid "<b>Analyzer plugin</b>"
+#~ msgstr "<b>分æžå™¨æ’件</b>"
+
+#~ msgid "<b>Associated action</b>"
+#~ msgstr "<b>å…³è”动作</b>"
+
+#~ msgid "<b>Plugin</b>"
+#~ msgstr "<b>æ’件</b>"
+
+#~ msgid "<b>Time (or period)</b>"
+#~ msgstr "<b>时间(或时段)</b>"
+
+#~ msgid "Analyzers, Actions, Reporters"
+#~ msgstr "分æžå™¨, 动作, 报告器"
+
+#~ msgid "Cron"
+#~ msgstr "定时任务"
+
+#~ msgid "Database backend: "
+#~ msgstr "æ•°æ®åº“åŽç«¯ï¼š"
+
+#~ msgid "Analyzes crashes in C/C++ programs"
+#~ msgstr "使用 C/C++ 程åºåˆ†æžå´©æºƒ"
+
+#~ msgid "Periodically scans for and saves kernel oopses"
+#~ msgstr "周期性扫æ并ä¿å­˜å†…æ ¸ opps"
+
#~ msgid "Database plugin not specified. Please check abrtd settings."
#~ msgstr "没有指定数æ®åº“æ’件。请检查 abrtd 设置。"
diff --git a/scripts/dbg_mkrpm b/scripts/dbg_mkrpm
index e5f0fe97..c3dbcf84 100755
--- a/scripts/dbg_mkrpm
+++ b/scripts/dbg_mkrpm
@@ -1,30 +1,57 @@
#!/bin/sh
-test -f abrt.spec || exit 1
-ABRTVER=`grep ^Version: abrt.spec | head -n1 | sed 's/.* //'`
+#set -e
-if ! test -f configure; then
+#git clone git://git.fedorahosted.org/git/abrt.git
+#SRCDIR="abrt"
+#BUILDDIR="abrt"
+
+SRCDIR="."
+BUILDDIR="00_builddir"
+
+rm -rf "$BUILDDIR"
+
+if ! test -f "$SRCDIR/configure"; then
echo "Autogenerating configure"
- ./autogen.sh || { rm -f configure; exit 1; }
+ (cd "$SRCDIR" && ./autogen.sh) || { rm -f "$SRCDIR/configure"; exit 1; }
fi
+test -f "$SRCDIR/abrt.spec" || exit 1
+ABRTVER=`grep ^Version: "$SRCDIR/abrt.spec" | head -n1 | sed 's/.* //'`
+
+T=`mktemp -d`
+
+# Prepare source snapshot
+cp -a "$SRCDIR" "$T"/"abrt-$ABRTVER"
+
+# Can't do it before copying, BUILDDIR may be a subdir of SRCDIR
+mkdir "$BUILDDIR" 2>/dev/null
+
+# Prepare sources for rpmbuild
+(tar -czf - -C "$T" "abrt-$ABRTVER") >"$BUILDDIR"/"abrt-$ABRTVER".tar.gz
+rm -rf "$T"
+cp "$SRCDIR"/abrt.spec "$BUILDDIR"
+cp "$SRCDIR"/abrt.init "$BUILDDIR"
+cp "$SRCDIR"/abrt-ccpp.init "$BUILDDIR"
+#cp "$SRCDIR"/dbg_* "$BUILDDIR" 2>/dev/null # developers' toys
-T=/tmp/$$_$RANDOM
-test -d "$T" && exit 1
+{
-rm -rf BUILDROOT "abrt-$ABRTVER" "abrt-$ABRTVER".tar "abrt-$ABRTVER".tar.gz \
- abrt*.rpm \
- 2>/dev/null
+cd "$BUILDDIR" || exit 1
-mkdir -p "$T"/"abrt-$ABRTVER" || exit
-cp -a * "$T"/"abrt-$ABRTVER" || exit
-(cd "$T" && tar -c "abrt-$ABRTVER") >"abrt-$ABRTVER".tar || exit
-rm -rf "$T" || exit
+# Build them
+nice -n10 rpmbuild \
+ --define "_topdir $PWD" \
+ --define "_builddir $PWD" \
+ --define "_rpmdir $PWD" \
+ --define "_sourcedir $PWD" \
+ --define "_specdir $PWD" \
+ --define "_srcrpmdir $PWD" \
+ --define "_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm" \
+ -bb abrt.spec 2>&1
+echo "Exitcode: $?"
-gzip "abrt-$ABRTVER".tar || exit
+} | tee -a "$0.log"
-# Less ugly way to pass exitcode (without bashisms)?
-{ ./dbg_rpmbuildlocal -bb abrt.spec 2>&1; echo $? >"EXITCODE"; } | tee -a "$0.log"
-ret=`cat EXITCODE`
-rm EXITCODE
-exit "$ret"
+test x"`tail -n 1 "$0.log"`" = x"Exitcode: 0"
+exit $?
diff --git a/scripts/dbg_mkrpm.old b/scripts/dbg_mkrpm.old
new file mode 100755
index 00000000..0149b215
--- /dev/null
+++ b/scripts/dbg_mkrpm.old
@@ -0,0 +1,48 @@
+#!/bin/sh
+
+#set -e
+
+#git clone git://git.fedorahosted.org/git/abrt.git
+#SRCDIR="abrt"
+#BUILDDIR="abrt"
+
+SRCDIR="."
+BUILDDIR="../`basename "$PWD"`.builddir"
+
+if ! test -f "$SRCDIR/configure"; then
+ echo "Autogenerating configure"
+ (cd "$SRCDIR" && ./autogen.sh) || { rm -f "$SRCDIR/configure"; exit 1; }
+fi
+
+test -f "$SRCDIR/abrt.spec" || exit 1
+ABRTVER=`grep ^Version: "$SRCDIR/abrt.spec" | head -n1 | sed 's/.* //'`
+
+rm -rf "$BUILDDIR"
+mkdir "$BUILDDIR" 2>/dev/null
+
+cp -a "$SRCDIR" "$BUILDDIR"/abrt-$ABRTVER
+
+cd "$BUILDDIR" || exit 1
+
+tar -czf abrt-$ABRTVER.tar.gz abrt-$ABRTVER
+cp abrt-$ABRTVER/abrt.spec .
+cp abrt-$ABRTVER/abrt.init .
+cp abrt-$ABRTVER/abrt-ccpp.init .
+#cp abrt-$ABRTVER/dbg_* .
+rm -rf abrt-$ABRTVER
+
+# Less ugly way to pass exitcode (without bashisms)?
+{ nice -n10 rpmbuild \
+ --define "_topdir $PWD" \
+ --define "_builddir $PWD" \
+ --define "_rpmdir $PWD" \
+ --define "_sourcedir $PWD" \
+ --define "_specdir $PWD" \
+ --define "_srcrpmdir $PWD" \
+ --define "_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm" \
+ -bb abrt.spec 2>&1
+echo $? >"EXITCODE"
+} | tee -a "$0.log"
+ret=`cat EXITCODE`
+rm EXITCODE
+exit "$ret"
diff --git a/scripts/dbg_rpminst b/scripts/dbg_rpminst
index b51dbbfc..ea70278c 100755
--- a/scripts/dbg_rpminst
+++ b/scripts/dbg_rpminst
@@ -1,29 +1,9 @@
#!/bin/sh
-yum -y -C erase 'abrt*'
-yum -y -C --nogpgcheck localinstall *.rpm
-killall -HUP dbus-daemon
-
-exit
+BUILDDIR="00_builddir"
-while rpm -qa | grep abrt >/dev/null; do
- rpm -qa | grep abrt | while read package; do
- echo "$package: rpm -e `basename "$package" .rpm`"
- rpm -e "`basename "$package" .rpm`"
- done
-done
-
-while true; do
- r=0
- for package in *.rpm; do
- test -f "$package" || continue
- # Is it installed?
- rpm -q "`basename "$package" .rpm`" >/dev/null && continue
- # Try to install, record failure
- echo "$package: rpm -i `basename "$package" .rpm`"
- rpm -i "$package" || r=1
- done
- test $r = 0 && break
-done
+cd "$BUILDDIR" || exit 1
+yum -y -C erase 'abrt*' 'libreport*' 'report*'
+yum -y -C --nogpgcheck localinstall *.rpm
killall -HUP dbus-daemon
diff --git a/scripts/dbg_rpmuninst b/scripts/dbg_rpmuninst
index 4232440d..0635116a 100755
--- a/scripts/dbg_rpmuninst
+++ b/scripts/dbg_rpmuninst
@@ -1,12 +1,3 @@
#!/bin/sh
-yum -C -y erase 'abrt*'
-
-exit
-
-while rpm -qa | grep abrt >/dev/null; do
- rpm -qa | grep abrt | while read package; do
- echo "$package: rpm -e `basename "$package" .rpm`"
- rpm -e "`basename "$package" .rpm`"
- done
-done
+yum -C -y erase 'abrt*' 'libreport*' 'report*'
diff --git a/scripts/dbg_unpkrpm b/scripts/dbg_unpkrpm
index 143d4afa..fd4cbf96 100755
--- a/scripts/dbg_unpkrpm
+++ b/scripts/dbg_unpkrpm
@@ -1,5 +1,9 @@
#!/bin/sh
+BUILDDIR="00_builddir"
+
+cd "$BUILDDIR" || exit 1
+
rm -rf UNPACKED
mkdir -p UNPACKED
diff --git a/src/Makefile.am b/src/Makefile.am
index e42f1aec..c6d3abd9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1 +1 @@
-SUBDIRS = include lib hooks btparser daemon applet gui cli plugins retrace
+SUBDIRS = include lib report-python hooks btparser daemon applet gui gui-gtk cli plugins gui-wizard-gtk retrace
diff --git a/src/applet/Makefile.am b/src/applet/Makefile.am
index 4207e818..cd4a643f 100644
--- a/src/applet/Makefile.am
+++ b/src/applet/Makefile.am
@@ -1,14 +1,12 @@
bin_PROGRAMS = abrt-applet
+#test-report
abrt_applet_SOURCES = \
- Applet.cpp \
+ applet.c \
applet_gtk.h applet_gtk.c
abrt_applet_CPPFLAGS = \
- -Wall -Werror \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-I$(srcdir)/../lib \
- -I/usr/include/glib-2.0 \
- -I/usr/lib/glib-2.0/include \
-DBIN_DIR=\"$(bindir)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
-DCONF_DIR=\"$(CONF_DIR)\" \
@@ -18,11 +16,14 @@ abrt_applet_CPPFLAGS = \
-DICON_DIR=\"${datadir}/abrt/icons/hicolor/48x48/status\" \
$(GTK_CFLAGS) \
$(DBUS_CFLAGS) \
- -D_GNU_SOURCE
+ -D_GNU_SOURCE \
+ -Wall -Werror
+# -I/usr/include/glib-2.0
+# -I/usr/lib/glib-2.0/include
# $(LIBNOTIFY_CFLAGS)
# $(DBUS_GLIB_CFLAGS)
abrt_applet_LDADD = \
- ../lib/libabrt.la \
+ ../lib/libreport.la \
../lib/libabrt_dbus.la \
-lglib-2.0 \
-lgthread-2.0 \
@@ -30,6 +31,16 @@ abrt_applet_LDADD = \
$(LIBNOTIFY_LIBS) \
$(GTK_LIBS)
+#test_report_SOURCES = \
+# test_report.c
+#test_report_CPPFLAGS = \
+# -I$(srcdir)/../include/report -I$(srcdir)/../include \
+# $(GLIB_CFLAGS) \
+# -D_GNU_SOURCE \
+# -Wall -Werror
+#test_report_LDADD = \
+# ../lib/libreport.la
+
DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@
@INTLTOOL_DESKTOP_RULE@
diff --git a/src/applet/Applet.cpp b/src/applet/applet.c
index 4ce497cf..1a2bf5c0 100644
--- a/src/applet/Applet.cpp
+++ b/src/applet/applet.c
@@ -24,7 +24,6 @@
#include <dbus/dbus-glib-lowlevel.h>
#include "abrtlib.h"
#include "abrt_dbus.h"
-#include "dbus_common.h"
#include "applet_gtk.h"
@@ -38,8 +37,8 @@ static void Crash(DBusMessage* signal)
dbus_message_iter_init(signal, &in_iter);
/* 1st param: package */
- const char* package_name;
- r = load_val(&in_iter, package_name);
+ const char* package_name = NULL;
+ r = load_charp(&in_iter, &package_name);
/* 2nd param: crash_id */
if (r != ABRT_DBUS_MORE_FIELDS)
@@ -48,7 +47,7 @@ static void Crash(DBusMessage* signal)
return;
}
const char* crash_id = NULL;
- r = load_val(&in_iter, crash_id);
+ r = load_charp(&in_iter, &crash_id);
/* 3rd param: dir */
//dir parameter is not used for now, use is planned in the future
@@ -58,13 +57,13 @@ static void Crash(DBusMessage* signal)
return;
}
const char* dir = NULL;
- r = load_val(&in_iter, dir);
+ r = load_charp(&in_iter, &dir);
/* Optional 4th param: uid */
const char* uid_str = NULL;
if (r == ABRT_DBUS_MORE_FIELDS)
{
- r = load_val(&in_iter, uid_str);
+ r = load_charp(&in_iter, &uid_str);
}
if (r != ABRT_DBUS_LAST_FIELD)
{
@@ -113,13 +112,13 @@ static void Crash(DBusMessage* signal)
show_crash_notification(applet, crash_id, message, package_name);
}
-static void QuotaExceed(DBusMessage* signal)
+static void QuotaExceeded(DBusMessage* signal)
{
int r;
DBusMessageIter in_iter;
dbus_message_iter_init(signal, &in_iter);
- const char* str;
- r = load_val(&in_iter, str);
+ const char* str = NULL;
+ r = load_charp(&in_iter, &str);
if (r != ABRT_DBUS_LAST_FIELD)
{
error_msg("dbus signal %s: parameter type mismatch", __func__);
@@ -137,8 +136,8 @@ static void NameOwnerChanged(DBusMessage* signal)
int r;
DBusMessageIter in_iter;
dbus_message_iter_init(signal, &in_iter);
- const char* name;
- r = load_val(&in_iter, name);
+ const char* name = NULL;
+ r = load_charp(&in_iter, &name);
if (r != ABRT_DBUS_MORE_FIELDS)
{
error_msg("dbus signal %s: parameter type mismatch", __func__);
@@ -149,15 +148,15 @@ static void NameOwnerChanged(DBusMessage* signal)
if (strcmp(name, "com.redhat.abrt") != 0)
return;
- const char* old_owner;
- r = load_val(&in_iter, old_owner);
+ const char* old_owner = NULL;
+ r = load_charp(&in_iter, &old_owner);
if (r != ABRT_DBUS_MORE_FIELDS)
{
error_msg("dbus signal %s: parameter type mismatch", __func__);
return;
}
- const char* new_owner;
- r = load_val(&in_iter, new_owner);
+ const char* new_owner = NULL;
+ r = load_charp(&in_iter, &new_owner);
if (r != ABRT_DBUS_LAST_FIELD)
{
error_msg("dbus signal %s: parameter type mismatch", __func__);
@@ -186,8 +185,8 @@ static DBusHandlerResult handle_message(DBusConnection* conn, DBusMessage* msg,
NameOwnerChanged(msg);
else if (strcmp(member, "Crash") == 0)
Crash(msg);
- else if (strcmp(member, "QuotaExceed") == 0)
- QuotaExceed(msg);
+ else if (strcmp(member, "QuotaExceeded") == 0)
+ QuotaExceeded(msg);
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -234,7 +233,7 @@ int main(int argc, char** argv)
error_msg_and_die(
"Usage: abrt-applet [-v]\n"
"\nOptions:"
- "\n\t-v\tVerbose"
+ "\n\t-v\tBe verbose"
);
}
}
diff --git a/src/applet/test_report.c b/src/applet/test_report.c
new file mode 100644
index 00000000..f5e79d92
--- /dev/null
+++ b/src/applet/test_report.c
@@ -0,0 +1,62 @@
+/*
+ Copyright (C) 2009 Jiri Moskovcak (jmoskovc@redhat.com)
+ Copyright (C) 2009 RedHat inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+#if HAVE_LOCALE_H
+# include <locale.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include "crash_data.h"
+#include "dump_dir.h"
+#include "run_event.h"
+
+static char *do_log(char *log_line, void *param)
+{
+ printf("%s\n", log_line);
+ return log_line;
+}
+
+int main(int argc, char** argv)
+{
+ crash_data_t *crash_data = new_crash_data();
+
+ add_to_crash_data(crash_data, "analyzer", "wow");
+ const char *event = "report";
+
+ struct dump_dir *dd = create_dump_dir_from_crash_data(crash_data, "/tmp");
+ free_crash_data(crash_data);
+ if (!dd)
+ return 1;
+ char *dir_name = strdup(dd->dd_dirname);
+ dd_close(dd);
+
+ printf("Temp dump dir: '%s'\n", dir_name);
+
+ struct run_event_state *run_state = new_run_event_state();
+ run_state->logging_callback = do_log;
+ int r = run_event_on_dir_name(run_state, dir_name, event);
+ if (r == 0 && run_state->children_count == 0)
+ printf("No actions are found for event '%s'\n", event);
+ free_run_event_state(run_state);
+
+// delete_dump_dir(dir_name);
+ free(dir_name);
+
+ return 0;
+}
diff --git a/src/btparser/Makefile.am b/src/btparser/Makefile.am
index 349483a8..9f64f826 100644
--- a/src/btparser/Makefile.am
+++ b/src/btparser/Makefile.am
@@ -15,7 +15,7 @@ libbtparser_la_SOURCES = \
utils.h utils.c
libbtparser_la_CFLAGS = -Wall -Werror -D_GNU_SOURCE -I../lib
libbtparser_la_LDFLAGS = -version-info 1:1:0
-libbtparser_la_LIBADD = ../lib/libabrt.la
+libbtparser_la_LIBADD = ../lib/libreport.la
# From http://www.seul.org/docs/autotut/
# Version consists 3 numbers: CURRENT, REVISION, AGE.
diff --git a/src/btparser/normalize_glibc.c b/src/btparser/normalize_glibc.c
index ea40ba9d..3d0bca2b 100644
--- a/src/btparser/normalize_glibc.c
+++ b/src/btparser/normalize_glibc.c
@@ -71,9 +71,12 @@ btp_normalize_glibc_thread(struct btp_thread *thread)
/* Normalize frame names. */
#define NORMALIZE_ARCH_SPECIFIC(func) \
- if (btp_frame_calls_func_in_file2(frame, "__" func "_sse2", func ".S", "libc.so") || \
- btp_frame_calls_func_in_file2(frame, "__" func "_ssse3", func ".S", "libc.so") || \
- btp_frame_calls_func_in_file2(frame, "__" func "_ia32", func ".S", "libc.so")) \
+ if (btp_frame_calls_func_in_file3(frame, "__" func "_sse2", func, "/sysdeps/", "libc.so") || \
+ btp_frame_calls_func_in_file3(frame, "__" func "_sse2_bsf", func, "/sysdeps/", "libc.so") || \
+ btp_frame_calls_func_in_file3(frame, "__" func "_ssse3", func, "/sysdeps/", "libc.so") /* ssse3, not sse3! */ || \
+ btp_frame_calls_func_in_file3(frame, "__" func "_ssse3_rep", func, "/sysdeps/", "libc.so") || \
+ btp_frame_calls_func_in_file3(frame, "__" func "_sse42", func, "/sysdeps/", "libc.so") || \
+ btp_frame_calls_func_in_file3(frame, "__" func "_ia32", func, "/sysdeps", "libc.so")) \
{ \
strcpy(frame->function_name, func); \
}
@@ -81,8 +84,11 @@ btp_normalize_glibc_thread(struct btp_thread *thread)
NORMALIZE_ARCH_SPECIFIC("memchr");
NORMALIZE_ARCH_SPECIFIC("memcmp");
NORMALIZE_ARCH_SPECIFIC("memcpy");
+ NORMALIZE_ARCH_SPECIFIC("memmove");
NORMALIZE_ARCH_SPECIFIC("memset");
NORMALIZE_ARCH_SPECIFIC("rawmemchr");
+ NORMALIZE_ARCH_SPECIFIC("strcasecmp");
+ NORMALIZE_ARCH_SPECIFIC("strcasecmp_l");
NORMALIZE_ARCH_SPECIFIC("strcat");
NORMALIZE_ARCH_SPECIFIC("strchr");
NORMALIZE_ARCH_SPECIFIC("strchrnul");
@@ -91,9 +97,11 @@ btp_normalize_glibc_thread(struct btp_thread *thread)
NORMALIZE_ARCH_SPECIFIC("strcspn");
NORMALIZE_ARCH_SPECIFIC("strlen");
NORMALIZE_ARCH_SPECIFIC("strncmp");
+ NORMALIZE_ARCH_SPECIFIC("strncpy");
NORMALIZE_ARCH_SPECIFIC("strpbrk");
NORMALIZE_ARCH_SPECIFIC("strrchr");
NORMALIZE_ARCH_SPECIFIC("strspn");
+ NORMALIZE_ARCH_SPECIFIC("strstr");
NORMALIZE_ARCH_SPECIFIC("strtok");
/* Remove frames which are not a cause of the crash. */
@@ -106,7 +114,10 @@ btp_normalize_glibc_thread(struct btp_thread *thread)
btp_frame_calls_func(frame, "___vsnprintf_chk") ||
btp_frame_calls_func(frame, "__snprintf_chk") ||
btp_frame_calls_func(frame, "___snprintf_chk") ||
- btp_frame_calls_func(frame, "__vasprintf_chk");
+ btp_frame_calls_func(frame, "__vasprintf_chk") ||
+ btp_frame_calls_func_in_file(frame, "malloc_consolidate", "malloc.c") ||
+ btp_frame_calls_func_in_file(frame, "_int_malloc", "malloc.c") ||
+ btp_frame_calls_func_in_file(frame, "__libc_calloc", "malloc.c");
if (removable)
{
bool success = btp_thread_remove_frames_above(thread, frame);
diff --git a/src/btparser/thread.c b/src/btparser/thread.c
index af480eb3..05f154d6 100644
--- a/src/btparser/thread.c
+++ b/src/btparser/thread.c
@@ -293,7 +293,7 @@ btp_thread_parse(char **input,
return NULL;
}
- /* Skip spaces after the thread number and before the parenthesis. */
+ /* Skip spaces after the thread number and before parentheses. */
spaces = btp_skip_char_sequence(&local_input, ' ');
location->column += spaces;
if (0 == spaces)
@@ -303,31 +303,49 @@ btp_thread_parse(char **input,
return NULL;
}
- /* Read the Thread keyword in parenthesis, which is mandatory. */
+ /* Read the LWP section in parentheses, optional. */
+ location->column += btp_thread_skip_lwp(&local_input);
+
+ /* Read the Thread keyword in parentheses, optional. */
chars = btp_skip_string(&local_input, "(Thread ");
location->column += chars;
- if (0 == chars)
+ if (0 != chars)
{
- location->message = "Thread keyword in the parenthesis expected in the form '(Thread '.";
- btp_thread_free(imthread);
- return NULL;
- }
+ /* Read the thread identification number. It can be either in
+ * decimal or hexadecimal form.
+ * Examples:
+ * "Thread 10 (Thread 2476):"
+ * "Thread 8 (Thread 0xb07fdb70 (LWP 6357)):"
+ */
+ digits = btp_skip_hexadecimal_number(&local_input);
+ if (0 == digits)
+ digits = btp_skip_unsigned_integer(&local_input);
+ location->column += digits;
+ if (0 == digits)
+ {
+ location->message = "The thread identification number expected.";
+ btp_thread_free(imthread);
+ return NULL;
+ }
- /* Read the thread identification number. */
- digits = btp_skip_unsigned_integer(&local_input);
- location->column += digits;
- if (0 == digits)
- {
- location->message = "The thread identification number expected.";
- btp_thread_free(imthread);
- return NULL;
+ /* Handle the optional " (LWP [0-9]+)" section. */
+ location->column += btp_skip_char_sequence(&local_input, ' ');
+ location->column += btp_thread_skip_lwp(&local_input);
+
+ /* Read the end of the parenthesis. */
+ if (!btp_skip_char(&local_input, ')'))
+ {
+ location->message = "Closing parenthesis for Thread expected.";
+ btp_thread_free(imthread);
+ return NULL;
+ }
}
- /* Read the end of the parenthesis. */
- chars = btp_skip_string(&local_input, "):\n");
+ /* Read the end of the header line. */
+ chars = btp_skip_string(&local_input, ":\n");
if (0 == chars)
{
- location->message = "The end of the parenthesis expected in the form of '):\\n'.";
+ location->message = "Expected a colon followed by a newline ':\\n'.";
btp_thread_free(imthread);
return NULL;
}
@@ -362,3 +380,20 @@ btp_thread_parse(char **input,
*input = local_input;
return imthread;
}
+
+int
+btp_thread_skip_lwp(char **input)
+{
+ char *local_input = *input;
+ int count = btp_skip_string(&local_input, "(LWP ");
+ if (0 == count)
+ return 0;
+ int digits = btp_skip_unsigned_integer(&local_input);
+ if (0 == digits)
+ return 0;
+ count += digits;
+ if (!btp_skip_char(&local_input, ')'))
+ return 0;
+ *input = local_input;
+ return count + 1;
+}
diff --git a/src/btparser/thread.h b/src/btparser/thread.h
index f7287385..47a0211b 100644
--- a/src/btparser/thread.h
+++ b/src/btparser/thread.h
@@ -197,6 +197,17 @@ struct btp_thread *
btp_thread_parse(char **input,
struct btp_location *location);
+/**
+ * If the input contains a LWP section in form of "(LWP [0-9]+), move
+ * the input pointer after this section. Otherwise do not modify
+ * input.
+ * @returns
+ * The number of characters parsed from input. 0 if the input does not
+ * contain a LWP section.
+ */
+int
+btp_thread_skip_lwp(char **input);
+
#ifdef __cplusplus
}
#endif
diff --git a/src/cli/CLI.cpp b/src/cli/CLI.cpp
index 44271329..5ece3171 100644
--- a/src/cli/CLI.cpp
+++ b/src/cli/CLI.cpp
@@ -19,30 +19,73 @@
# include <locale.h>
#endif
#include <getopt.h>
-#include "abrt_exception.h"
#include "abrtlib.h"
#include "abrt_dbus.h"
-#include "dbus_common.h"
#include "report.h"
-#include "dbus.h"
/** Creates a localized string from crash time. */
static char *localize_crash_time(const char *timestr)
{
long time = xatou(timestr);
char timeloc[256];
- int success = strftime(timeloc, 128, "%c", localtime(&time));
+ int success = strftime(timeloc, sizeof(timeloc), "%c", localtime(&time));
if (!success)
- error_msg_and_die("Error while converting time to string");
- return xasprintf("%s", timeloc);
+ error_msg_and_die("Error while converting time '%s' to string", timestr);
+ return xstrdup(timeloc);
+}
+
+static crash_data_t *FillCrashInfo(const char *dump_dir_name)
+{
+ int sv_logmode = logmode;
+ logmode = 0; /* suppress EPERM/EACCES errors in opendir */
+ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ DD_OPEN_READONLY);
+ logmode = sv_logmode;
+
+ if (!dd)
+ return NULL;
+
+ crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
+ dd_close(dd);
+ add_to_crash_data_ext(crash_data, CD_DUMPDIR, dump_dir_name, CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE);
+
+ return crash_data;
+}
+
+static void GetCrashInfos(vector_of_crash_data_t *retval, const char *dir_name)
+{
+ VERB1 log("Loading dumps from '%s'", dir_name);
+
+ DIR *dir = opendir(dir_name);
+ if (dir != NULL)
+ {
+ struct dirent *dent;
+ while ((dent = readdir(dir)) != NULL)
+ {
+ if (dot_or_dotdot(dent->d_name))
+ continue; /* skip "." and ".." */
+
+ char *dump_dir_name = concat_path_file(dir_name, dent->d_name);
+
+ struct stat statbuf;
+ if (stat(dump_dir_name, &statbuf) == 0
+ && S_ISDIR(statbuf.st_mode)
+ ) {
+ crash_data_t *crash_data = FillCrashInfo(dump_dir_name);
+ if (crash_data)
+ g_ptr_array_add(retval, crash_data);
+ }
+ free(dump_dir_name);
+ }
+ closedir(dir);
+ }
}
/** Prints basic information about a crash to stdout. */
-static void print_crash(const map_crash_data_t &crash)
+static void print_crash(crash_data_t *crash_data)
{
/* Create a localized string from crash time. */
- const char *timestr = get_crash_data_item_content(crash, FILENAME_TIME).c_str();
- const char *timeloc = localize_crash_time(timestr);
+ const char *timestr = get_crash_item_content_or_die(crash_data, FILENAME_TIME);
+ char *timeloc = localize_crash_time(timestr);
printf(_("\tCrash dump : %s\n"
"\tUID : %s\n"
@@ -50,17 +93,18 @@ static void print_crash(const map_crash_data_t &crash)
"\tExecutable : %s\n"
"\tCrash Time : %s\n"
"\tCrash Count: %s\n"),
- get_crash_data_item_content(crash, CD_DUMPDIR).c_str(),
- get_crash_data_item_content(crash, FILENAME_UID).c_str(),
- get_crash_data_item_content(crash, FILENAME_PACKAGE).c_str(),
- get_crash_data_item_content(crash, FILENAME_EXECUTABLE).c_str(),
+ get_crash_item_content_or_NULL(crash_data, CD_DUMPDIR),
+ get_crash_item_content_or_NULL(crash_data, FILENAME_UID),
+ get_crash_item_content_or_NULL(crash_data, FILENAME_PACKAGE),
+ get_crash_item_content_or_NULL(crash_data, FILENAME_EXECUTABLE),
timeloc,
- get_crash_data_item_content(crash, FILENAME_COUNT).c_str());
+ get_crash_item_content_or_NULL(crash_data, FILENAME_COUNT)
+ );
- free((void *)timeloc);
+ free(timeloc);
/* Print the hostname if it's available. */
- const char *hostname = get_crash_data_item_content_or_NULL(crash, FILENAME_HOSTNAME);
+ const char *hostname = get_crash_item_content_or_NULL(crash_data, FILENAME_HOSTNAME);
if (hostname)
printf(_("\tHostname : %s\n"), hostname);
}
@@ -70,14 +114,14 @@ static void print_crash(const map_crash_data_t &crash)
* @param include_reported
* Do not skip entries marked as already reported.
*/
-static void print_crash_list(const vector_map_crash_data_t& crash_list, bool include_reported)
+static void print_crash_list(vector_of_crash_data_t *crash_list, bool include_reported)
{
- for (unsigned i = 0; i < crash_list.size(); ++i)
+ for (unsigned i = 0; i < crash_list->len; ++i)
{
- const map_crash_data_t& crash = crash_list[i];
+ crash_data_t *crash = get_crash_data(crash_list, i);
if (!include_reported)
{
- const char *msg = get_crash_data_item_content_or_NULL(crash, FILENAME_MESSAGE);
+ const char *msg = get_crash_item_content_or_NULL(crash, FILENAME_MESSAGE);
if (!msg || !msg[0])
continue;
}
@@ -90,10 +134,10 @@ static void print_crash_list(const vector_map_crash_data_t& crash_list, bool inc
/**
* Prints full information about a crash
*/
-static void print_crash_info(const map_crash_data_t& crash, bool show_backtrace)
+static void print_crash_info(crash_data_t *crash_data, bool show_backtrace)
{
- const char *timestr = get_crash_data_item_content(crash, FILENAME_TIME).c_str();
- const char *timeloc = localize_crash_time(timestr);
+ const char *timestr = get_crash_item_content_or_die(crash_data, FILENAME_TIME);
+ char *timeloc = localize_crash_time(timestr);
printf(_("Dump directory: %s\n"
"Last crash: %s\n"
@@ -104,91 +148,56 @@ static void print_crash_info(const map_crash_data_t& crash, bool show_backtrace)
"Executable: %s\n"
"System: %s, kernel %s\n"
"Reason: %s\n"),
- get_crash_data_item_content(crash, CD_DUMPDIR).c_str(),
+ get_crash_item_content_or_die(crash_data, CD_DUMPDIR),
timeloc,
- get_crash_data_item_content(crash, FILENAME_ANALYZER).c_str(),
- get_crash_data_item_content(crash, FILENAME_COMPONENT).c_str(),
- get_crash_data_item_content(crash, FILENAME_PACKAGE).c_str(),
- get_crash_data_item_content(crash, FILENAME_CMDLINE).c_str(),
- get_crash_data_item_content(crash, FILENAME_EXECUTABLE).c_str(),
- get_crash_data_item_content(crash, FILENAME_RELEASE).c_str(),
- get_crash_data_item_content(crash, FILENAME_KERNEL).c_str(),
- get_crash_data_item_content(crash, FILENAME_REASON).c_str());
-
- free((void *)timeloc);
+ get_crash_item_content_or_die(crash_data, FILENAME_ANALYZER),
+ get_crash_item_content_or_die(crash_data, FILENAME_COMPONENT),
+ get_crash_item_content_or_die(crash_data, FILENAME_PACKAGE),
+ get_crash_item_content_or_die(crash_data, FILENAME_CMDLINE),
+ get_crash_item_content_or_die(crash_data, FILENAME_EXECUTABLE),
+ get_crash_item_content_or_die(crash_data, FILENAME_OS_RELEASE),
+ get_crash_item_content_or_die(crash_data, FILENAME_KERNEL),
+ get_crash_item_content_or_die(crash_data, FILENAME_REASON)
+ );
+
+ free(timeloc);
/* Print optional fields only if they are available */
/* Coredump is not present in kerneloopses and Python exceptions. */
- const char *coredump = get_crash_data_item_content_or_NULL(crash, FILENAME_COREDUMP);
+ const char *coredump = get_crash_item_content_or_NULL(crash_data, FILENAME_COREDUMP);
if (coredump)
printf(_("Coredump file: %s\n"), coredump);
- const char *rating = get_crash_data_item_content_or_NULL(crash, FILENAME_RATING);
+ const char *rating = get_crash_item_content_or_NULL(crash_data, FILENAME_RATING);
if (rating)
printf(_("Rating: %s\n"), rating);
/* Crash function is not present in kerneloopses, and before the full report is created.*/
- const char *crash_function = get_crash_data_item_content_or_NULL(crash, FILENAME_CRASH_FUNCTION);
+ const char *crash_function = get_crash_item_content_or_NULL(crash_data, FILENAME_CRASH_FUNCTION);
if (crash_function)
printf(_("Crash function: %s\n"), crash_function);
- const char *hostname = get_crash_data_item_content_or_NULL(crash, FILENAME_HOSTNAME);
+ const char *hostname = get_crash_item_content_or_NULL(crash_data, FILENAME_HOSTNAME);
if (hostname)
printf(_("Hostname: %s\n"), hostname);
- const char *reproduce = get_crash_data_item_content_or_NULL(crash, FILENAME_REPRODUCE);
+ const char *reproduce = get_crash_item_content_or_NULL(crash_data, FILENAME_REPRODUCE);
if (reproduce)
printf(_("\nHow to reproduce:\n%s\n"), reproduce);
- const char *comment = get_crash_data_item_content_or_NULL(crash, FILENAME_COMMENT);
+ const char *comment = get_crash_item_content_or_NULL(crash_data, FILENAME_COMMENT);
if (comment)
printf(_("\nComment:\n%s\n"), comment);
if (show_backtrace)
{
- const char *backtrace = get_crash_data_item_content_or_NULL(crash, FILENAME_BACKTRACE);
+ const char *backtrace = get_crash_item_content_or_NULL(crash_data, FILENAME_BACKTRACE);
if (backtrace)
printf(_("\nBacktrace:\n%s\n"), backtrace);
}
}
-/**
- * Converts crash reference from user's input to crash dump dir name.
- * The returned string must be released by caller.
- */
-static char *guess_crash_id(const char *str)
-{
- vector_map_crash_data_t ci = call_GetCrashInfos();
- unsigned num_crashinfos = ci.size();
- if (str[0] == '@') /* "--report @N" syntax */
- {
- unsigned position = xatoi_u(str + 1);
- if (position >= num_crashinfos)
- error_msg_and_die("There are only %u crash infos", num_crashinfos);
- map_crash_data_t& info = ci[position];
- return xstrdup(get_crash_data_item_content(info, CD_DUMPDIR).c_str());
- }
-
- unsigned len = strlen(str);
- unsigned ii;
- char *result = NULL;
- for (ii = 0; ii < num_crashinfos; ii++)
- {
- map_crash_data_t& info = ci[ii];
- const char *this_dir = get_crash_data_item_content(info, CD_DUMPDIR).c_str();
- if (strncmp(str, this_dir, len) == 0)
- {
- if (result)
- error_msg_and_die("Crash prefix '%s' is not unique", str);
- result = xstrdup(this_dir);
- }
- }
- if (!result)
- error_msg_and_die("Crash dump directory '%s' not found", str);
- return result;
-}
-
/* Program options */
enum
{
@@ -210,6 +219,7 @@ static const struct option longopts[] =
{
/* name, has_arg, flag, val */
{ "help" , no_argument, NULL, '?' },
+ { "verbose" , no_argument, NULL, 'v' },
{ "version" , no_argument, NULL, 'V' },
{ "list" , no_argument, NULL, 'l' },
{ "full" , no_argument, NULL, 'f' },
@@ -234,36 +244,42 @@ static const char *progname(const char *argv0)
* Prints abrt-cli version and some help text.
* Then exits the program with return value 1.
*/
-static void usage(char *argv0)
+static void print_usage_and_die(char *argv0)
{
const char *name = progname(argv0);
printf("%s "VERSION"\n\n", name);
/* Message has embedded tabs. */
- printf(_("Usage: %s [OPTION]\n\n"
- "Startup:\n"
- " -V, --version display the version of %s and exit\n"
- " -?, --help print this help\n\n"
- "Actions:\n"
- " -l, --list print a list of all crashes which are not yet reported\n"
- " -f, --full print a list of all crashes, including the already reported ones\n"
- " -r, --report CRASH_ID create and send a report\n"
- " -y, --always create and send a report without asking\n"
- " -d, --delete CRASH_ID remove a crash\n"
- " -i, --info CRASH_ID print detailed information about a crash\n"
- " -b, --backtrace print detailed information about a crash including backtrace\n"
- "CRASH_ID can be:\n"
- " a name of dump directory, or\n"
- " @N - N'th crash (as displayed by --list --full) will be acted upon\n"
+ printf(_(
+ "Usage: %s -l[f] [-D BASE_DIR]...]\n"
+ " or: %s -r[y] CRASH_DIR\n"
+ " or: %s -i[b] CRASH_DIR\n"
+ " or: %s -d CRASH_DIR\n"
+ "\n"
+ " -l, --list List not yet reported crashes\n"
+ " -f, --full List all crashes\n"
+ " -D BASE_DIR Directory to list crashes from\n"
+ " (default: -D $HOME/.abrt/spool -D %s)\n"
+ "\n"
+ " -r, --report Send a report about CRASH_DIR\n"
+ " -y, --always ...without editing and asking\n"
+ " -i, --info Print detailed information about CRASH_DIR\n"
+ " -b, --backtrace ...including backtrace\n"
+ " -d, --delete Remove CRASH_DIR\n"
+ "\n"
+ " -V, --version Display version and exit\n"
+ " -v, --verbose Be verbose\n"
),
- name, name);
-
+ name, name, name, name,
+ DEBUG_DUMPS_DIR
+ );
exit(1);
}
int main(int argc, char** argv)
{
- const char* crash_id = NULL;
+ GList *D_list = NULL;
+ char *dump_dir_name = NULL;
int op = -1;
bool full = false;
bool always = false;
@@ -278,19 +294,18 @@ int main(int argc, char** argv)
while (1)
{
/* Do not use colons, arguments are handled after parsing all options. */
- int c = getopt_long_only(argc, argv, "?Vrdlfyib",
- longopts, NULL);
+ int c = getopt_long(argc, argv, "?Vvrdlfyib", longopts, NULL);
-#define SET_OP(newop) \
- if (op != -1 && op != newop) \
- { \
- error_msg(_("You must specify exactly one operation")); \
- return 1; \
- } \
- op = newop;
+#define SET_OP(newop) \
+ do { \
+ if (op != -1 && op != newop) \
+ error_msg_and_die(_("You must specify exactly one operation")); \
+ op = newop; \
+ } while (0)
switch (c)
{
+ case -1: goto end_of_arg_parsing;
case 'r': SET_OP(OPT_REPORT); break;
case 'd': SET_OP(OPT_DELETE); break;
case 'l': SET_OP(OPT_GET_LIST); break;
@@ -298,34 +313,44 @@ int main(int argc, char** argv)
case 'f': full = true; break;
case 'y': always = true; break;
case 'b': backtrace = true; break;
- case -1: /* end of options */ break;
- default: /* some error */
- case '?':
- usage(argv[0]); /* exits app */
+ case 'v': g_verbose++; break;
+ case 'D':
+ D_list = g_list_append(D_list, optarg);
+ break;
case 'V':
printf("%s "VERSION"\n", progname(argv[0]));
return 0;
+ case '?':
+ default: /* some error */
+ print_usage_and_die(argv[0]); /* exits app */
}
#undef SET_OP
- if (c == -1)
- break;
+ }
+ end_of_arg_parsing: ;
+
+ if (!D_list)
+ {
+ char *home = getenv("HOME");
+ if (home)
+ D_list = g_list_append(D_list, concat_path_file(home, ".abrt/spool"));
+ D_list = g_list_append(D_list, (void*)DEBUG_DUMPS_DIR);
}
/* Handle option arguments. */
- int arg_count = argc - optind;
- switch (arg_count)
+ argc -= optind;
+ switch (argc)
{
case 0:
if (op == OPT_REPORT || op == OPT_DELETE || op == OPT_INFO)
- usage(argv[0]);
+ print_usage_and_die(argv[0]);
break;
case 1:
if (op != OPT_REPORT && op != OPT_DELETE && op != OPT_INFO)
- usage(argv[0]);
- crash_id = argv[optind];
+ print_usage_and_die(argv[0]);
+ dump_dir_name = argv[optind];
break;
default:
- usage(argv[0]);
+ print_usage_and_die(argv[0]);
}
/* Check if we have an operation.
@@ -336,89 +361,72 @@ int main(int argc, char** argv)
(backtrace && op != OPT_INFO) ||
op == -1)
{
- usage(argv[0]);
- return 1;
+ print_usage_and_die(argv[0]);
}
- DBusError err;
- dbus_error_init(&err);
- s_dbus_conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
- handle_dbus_err(s_dbus_conn == NULL, &err);
-
/* Do the selected operation. */
int exitcode = 0;
switch (op)
{
case OPT_GET_LIST:
{
- vector_map_crash_data_t ci = call_GetCrashInfos();
+ vector_of_crash_data_t *ci = new_vector_of_crash_data();
+ while (D_list)
+ {
+ char *dir = (char *)D_list->data;
+ GetCrashInfos(ci, dir);
+ D_list = g_list_remove(D_list, dir);
+ }
print_crash_list(ci, full);
+ free_vector_of_crash_data(ci);
break;
}
case OPT_REPORT:
{
- int flags = CLI_REPORT_SILENT_IF_NOT_FOUND;
- if (always)
- flags |= CLI_REPORT_BATCH;
- exitcode = report(crash_id, flags);
- if (exitcode == -1) /* no such crash_id */
+ struct dump_dir *dd = dd_opendir(dump_dir_name, DD_OPEN_READONLY);
+ if (!dd)
+ break;
+ int readonly = !dd->locked;
+ dd_close(dd);
+ if (readonly)
{
- crash_id = guess_crash_id(crash_id);
- exitcode = report(crash_id, always ? CLI_REPORT_BATCH : 0);
- if (exitcode == -1)
+ log("'%s' is not writable", dump_dir_name);
+ /* D_list can't be NULL here */
+ struct dump_dir *dd_copy = steal_directory((char *)D_list->data, dump_dir_name);
+ if (dd_copy)
{
- error_msg("Crash '%s' not found", crash_id);
- free((void *)crash_id);
- xfunc_die();
+ delete_dump_dir_possibly_using_abrtd(dump_dir_name);
+ dump_dir_name = xstrdup(dd_copy->dd_dirname);
+ dd_close(dd_copy);
}
-
- free((void *)crash_id);
}
+
+ exitcode = report(dump_dir_name, (always ? CLI_REPORT_BATCH : 0));
+ if (exitcode == -1)
+ error_msg_and_die("Crash '%s' not found", dump_dir_name);
break;
}
case OPT_DELETE:
{
- exitcode = call_DeleteDebugDump(crash_id);
- if (exitcode == ENOENT)
- {
- crash_id = guess_crash_id(crash_id);
- exitcode = call_DeleteDebugDump(crash_id);
- if (exitcode == ENOENT)
- {
- error_msg("Crash '%s' not found", crash_id);
- free((void *)crash_id);
- xfunc_die();
- }
-
- free((void *)crash_id);
- }
- if (exitcode != 0)
- error_msg_and_die("Can't delete debug dump '%s'", crash_id);
+ exitcode = delete_dump_dir_possibly_using_abrtd(dump_dir_name);
break;
}
case OPT_INFO:
{
- int old_logmode = logmode;
- logmode = 0;
-
- map_crash_data_t crashData = call_CreateReport(crash_id);
- if (crashData.empty()) /* no such crash_id */
- {
- crash_id = guess_crash_id(crash_id);
- crashData = call_CreateReport(crash_id);
- if (crashData.empty())
- {
- error_msg("Crash '%s' not found", crash_id);
- free((void *)crash_id);
- xfunc_die();
- }
-
- free((void *)crash_id);
- }
-
- logmode = old_logmode;
-
- print_crash_info(crashData, backtrace);
+ if (run_analyze_event(dump_dir_name) != 0)
+ return 1;
+
+ /* Load crash_data from (possibly updated by analyze) dump dir */
+ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
+ if (!dd)
+ return -1;
+ crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
+ dd_close(dd);
+ add_to_crash_data_ext(crash_data, CD_DUMPDIR, dump_dir_name,
+ CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE);
+
+ print_crash_info(crash_data, backtrace);
+ free_crash_data(crash_data);
break;
}
diff --git a/src/cli/Makefile.am b/src/cli/Makefile.am
index 3584fd6c..0a5c6e1a 100644
--- a/src/cli/Makefile.am
+++ b/src/cli/Makefile.am
@@ -3,20 +3,20 @@ bin_PROGRAMS = abrt-cli
abrt_cli_SOURCES = \
CLI.cpp \
run-command.h run-command.c \
- report.h report.cpp \
- dbus.h dbus.cpp
-
+ report.h report.cpp
abrt_cli_CPPFLAGS = \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-I$(srcdir)/../lib \
-DVAR_RUN=\"$(VAR_RUN)\" \
+ -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \
+ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
$(ENABLE_SOCKET_OR_DBUS) \
$(DBUS_CFLAGS) $(GLIB_CFLAGS) \
- -D_GNU_SOURCE
+ -D_GNU_SOURCE \
+ -Wall -Werror
# $(GTK_CFLAGS)
-
abrt_cli_LDADD = \
- ../lib/libabrt.la \
+ ../lib/libreport.la \
../lib/libabrt_dbus.la \
$(GLIB_LIBS)
diff --git a/src/cli/dbus.cpp b/src/cli/dbus.cpp
deleted file mode 100644
index 7565d5bc..00000000
--- a/src/cli/dbus.cpp
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- Copyright (C) 2009 RedHat inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#include "dbus.h"
-#include "dbus_common.h"
-
-DBusConnection* s_dbus_conn;
-
-/*
- * DBus member calls
- */
-
-/* helpers */
-static DBusMessage* new_call_msg(const char* method)
-{
- DBusMessage* msg = dbus_message_new_method_call(ABRTD_DBUS_NAME, ABRTD_DBUS_PATH, ABRTD_DBUS_IFACE, method);
- if (!msg)
- die_out_of_memory();
- return msg;
-}
-
-static DBusMessage* send_get_reply_and_unref(DBusMessage* msg)
-{
- dbus_uint32_t serial;
- if (TRUE != dbus_connection_send(s_dbus_conn, msg, &serial))
- error_msg_and_die("Error sending DBus message");
- dbus_message_unref(msg);
-
- while (true)
- {
- DBusMessage *received = dbus_connection_pop_message(s_dbus_conn);
- if (!received)
- {
- if (FALSE == dbus_connection_read_write(s_dbus_conn, -1))
- error_msg_and_die("dbus connection closed");
- continue;
- }
-
- int tp = dbus_message_get_type(received);
- const char *error_str = dbus_message_get_error_name(received);
-#if 0
- /* Debugging */
- printf("type:%u (CALL:%u, RETURN:%u, ERROR:%u, SIGNAL:%u)\n", tp,
- DBUS_MESSAGE_TYPE_METHOD_CALL,
- DBUS_MESSAGE_TYPE_METHOD_RETURN,
- DBUS_MESSAGE_TYPE_ERROR,
- DBUS_MESSAGE_TYPE_SIGNAL
- );
- const char *sender = dbus_message_get_sender(received);
- if (sender)
- printf("sender: %s\n", sender);
- const char *path = dbus_message_get_path(received);
- if (path)
- printf("path: %s\n", path);
- const char *member = dbus_message_get_member(received);
- if (member)
- printf("member: %s\n", member);
- const char *interface = dbus_message_get_interface(received);
- if (interface)
- printf("interface: %s\n", interface);
- const char *destination = dbus_message_get_destination(received);
- if (destination)
- printf("destination: %s\n", destination);
- if (error_str)
- printf("error: '%s'\n", error_str);
-#endif
-
- DBusError err;
- dbus_error_init(&err);
-
- if (dbus_message_is_signal(received, ABRTD_DBUS_IFACE, "Update"))
- {
- const char *update_msg;
- if (!dbus_message_get_args(received, &err,
- DBUS_TYPE_STRING, &update_msg,
- DBUS_TYPE_INVALID))
- {
- error_msg_and_die("dbus Update message: arguments mismatch");
- }
- printf(">> %s\n", update_msg);
- }
- else if (dbus_message_is_signal(received, ABRTD_DBUS_IFACE, "Warning"))
- {
- const char *warning_msg;
- if (!dbus_message_get_args(received, &err,
- DBUS_TYPE_STRING, &warning_msg,
- DBUS_TYPE_INVALID))
- {
- error_msg_and_die("dbus Warning message: arguments mismatch");
- }
- log(">! %s\n", warning_msg);
- }
- else
- if (tp == DBUS_MESSAGE_TYPE_METHOD_RETURN
- && dbus_message_get_reply_serial(received) == serial
- ) {
- return received;
- }
- else
- if (tp == DBUS_MESSAGE_TYPE_ERROR
- && dbus_message_get_reply_serial(received) == serial
- ) {
- error_msg_and_die("dbus call returned error: '%s'", error_str);
- }
-
- dbus_message_unref(received);
- }
-}
-
-vector_map_crash_data_t call_GetCrashInfos()
-{
- DBusMessage* msg = new_call_msg(__func__ + 5);
- DBusMessage *reply = send_get_reply_and_unref(msg);
-
- DBusMessageIter in_iter;
- dbus_message_iter_init(reply, &in_iter);
-
- vector_map_crash_data_t argout;
- int r = load_val(&in_iter, argout);
- if (r != ABRT_DBUS_LAST_FIELD) /* more values present, or bad type */
- error_msg_and_die("dbus call %s: return type mismatch", __func__ + 5);
-
- dbus_message_unref(reply);
- return argout;
-}
-
-map_crash_data_t call_CreateReport(const char* crash_id)
-{
- DBusMessage* msg = new_call_msg(__func__ + 5);
- dbus_message_append_args(msg,
- DBUS_TYPE_STRING, &crash_id,
- DBUS_TYPE_INVALID);
-
- DBusMessage *reply = send_get_reply_and_unref(msg);
-
- DBusMessageIter in_iter;
- dbus_message_iter_init(reply, &in_iter);
-
- map_crash_data_t argout;
- int r = load_val(&in_iter, argout);
- if (r != ABRT_DBUS_LAST_FIELD) /* more values present, or bad type */
- error_msg_and_die("dbus call %s: return type mismatch", __func__ + 5);
-
- dbus_message_unref(reply);
- return argout;
-}
-
-report_status_t call_Report(const map_crash_data_t& report,
- const vector_string_t& reporters,
- const map_map_string_t &plugins)
-{
- DBusMessage* msg = new_call_msg(__func__ + 5);
- DBusMessageIter out_iter;
- dbus_message_iter_init_append(msg, &out_iter);
-
- /* parameter #1: report data */
- store_val(&out_iter, report);
- /* parameter #2: reporters to use */
- store_val(&out_iter, reporters);
- /* parameter #3 (opt): plugin config */
- if (!plugins.empty())
- store_val(&out_iter, plugins);
-
- DBusMessage *reply = send_get_reply_and_unref(msg);
-
- DBusMessageIter in_iter;
- dbus_message_iter_init(reply, &in_iter);
-
- report_status_t result;
- int r = load_val(&in_iter, result);
- if (r != ABRT_DBUS_LAST_FIELD) /* more values present, or bad type */
- error_msg_and_die("dbus call %s: return type mismatch", __func__ + 5);
-
- dbus_message_unref(reply);
- return result;
-}
-
-int32_t call_DeleteDebugDump(const char* crash_id)
-{
- DBusMessage* msg = new_call_msg(__func__ + 5);
- dbus_message_append_args(msg,
- DBUS_TYPE_STRING, &crash_id,
- DBUS_TYPE_INVALID);
-
- DBusMessage *reply = send_get_reply_and_unref(msg);
-
- DBusMessageIter in_iter;
- dbus_message_iter_init(reply, &in_iter);
-
- int32_t result;
- int r = load_val(&in_iter, result);
- if (r != ABRT_DBUS_LAST_FIELD) /* more values present, or bad type */
- error_msg_and_die("dbus call %s: return type mismatch", __func__ + 5);
-
- dbus_message_unref(reply);
- return result;
-}
-
-map_map_string_t call_GetPluginsInfo()
-{
- DBusMessage *msg = new_call_msg(__func__ + 5);
- DBusMessage *reply = send_get_reply_and_unref(msg);
-
- DBusMessageIter in_iter;
- dbus_message_iter_init(reply, &in_iter);
-
- map_map_string_t argout;
- int r = load_val(&in_iter, argout);
- if (r != ABRT_DBUS_LAST_FIELD) /* more values present, or bad type */
- error_msg_and_die("dbus call %s: return type mismatch", __func__ + 5);
-
- dbus_message_unref(reply);
- return argout;
-}
-
-map_plugin_settings_t call_GetPluginSettings(const char *name)
-{
- DBusMessage *msg = new_call_msg(__func__ + 5);
- dbus_message_append_args(msg,
- DBUS_TYPE_STRING, &name,
- DBUS_TYPE_INVALID);
-
- DBusMessage *reply = send_get_reply_and_unref(msg);
-
- DBusMessageIter in_iter;
- dbus_message_iter_init(reply, &in_iter);
-
- map_string_t argout;
- int r = load_val(&in_iter, argout);
- if (r != ABRT_DBUS_LAST_FIELD) /* more values present, or bad type */
- error_msg_and_die("dbus call %s: return type mismatch", __func__ + 5);
-
- dbus_message_unref(reply);
- return argout;
-}
-
-map_map_string_t call_GetSettings()
-{
- DBusMessage *msg = new_call_msg(__func__ + 5);
- DBusMessage *reply = send_get_reply_and_unref(msg);
-
- DBusMessageIter in_iter;
- dbus_message_iter_init(reply, &in_iter);
- map_map_string_t argout;
- int r = load_val(&in_iter, argout);
- if (r != ABRT_DBUS_LAST_FIELD) /* more values present, or bad type */
- error_msg_and_die("dbus call %s: return type mismatch", __func__ + 5);
-
- dbus_message_unref(reply);
- return argout;
-}
-
-void handle_dbus_err(bool error_flag, DBusError *err)
-{
- if (dbus_error_is_set(err))
- {
- error_msg("dbus error: %s", err->message);
- /* dbus_error_free(&err); */
- error_flag = true;
- }
- if (!error_flag)
- return;
- error_msg_and_die(
- "error requesting DBus name %s, possible reasons: "
- "abrt run by non-root; dbus config is incorrect; "
- "or dbus daemon needs to be restarted to reload dbus config",
- ABRTD_DBUS_NAME);
-}
diff --git a/src/cli/dbus.h b/src/cli/dbus.h
deleted file mode 100644
index 9c99c662..00000000
--- a/src/cli/dbus.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- Copyright (C) 2009 RedHat inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#ifndef ABRT_CLI_DBUS_H
-#define ABRT_CLI_DBUS_H
-
-#include "abrt_dbus.h"
-#include "abrt_crash_dump.h"
-
-extern DBusConnection* s_dbus_conn;
-
-vector_map_crash_data_t call_GetCrashInfos();
-
-map_crash_data_t call_CreateReport(const char *crash_id);
-
-/** Sends report using enabled Reporter plugins.
- * @param report
- * The report sent to Reporter plugins.
- * @param reporters
- * List of names of Reporters which should be called.
- * @param plugins
- * Optional settings for Reporter plugins, can be empty.
- * Format: plugins["PluginName"]["SettingsKey"] = "SettingsValue"
- * If it contains settings for some plugin, it must contain _all fields_
- * obtained by call_GetPluginSettings, otherwise the plugin might ignore
- * the settings.
- */
-report_status_t call_Report(const map_crash_data_t& report,
- const vector_string_t& reporters,
- const map_map_string_t &plugins);
-
-int32_t call_DeleteDebugDump(const char* crash_id);
-
-/* Gets basic data about all installed plugins.
- * @todo
- * Return more semantically structured output - maybe a struct instead of a map.
- */
-map_map_string_t call_GetPluginsInfo();
-
-/** Gets default plugin settings.
- * @param name
- * Corresponds to name obtained from call_GetPluginsInfo.
- */
-map_plugin_settings_t call_GetPluginSettings(const char *name);
-
-/** Gets global daemon settings.
- * @todo
- * Return more semantically structured output - maybe a struct instead of a map.
- */
-map_map_string_t call_GetSettings();
-
-void handle_dbus_err(bool error_flag, DBusError *err);
-
-#endif
diff --git a/src/cli/report.cpp b/src/cli/report.cpp
index 78a38916..6b2bf2e2 100644
--- a/src/cli/report.cpp
+++ b/src/cli/report.cpp
@@ -15,11 +15,8 @@
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#include <termios.h>
-#include <glib.h>
#include "report.h"
#include "run-command.h"
-#include "dbus.h"
#include "abrtlib.h"
/* Field separator for the crash report file that is edited by user. */
@@ -35,13 +32,10 @@ static char *trim(char *str)
return NULL;
// Remove leading spaces.
- char *ibuf;
- ibuf = skip_whitespace(str);
- int i = strlen(ibuf);
- if (str != ibuf)
- memmove(str, ibuf, i + 1);
+ overlapping_strcpy(str, skip_whitespace(str));
// Remove trailing spaces.
+ int i = strlen(str);
while (--i >= 0)
{
if (!isspace(str[i]))
@@ -142,30 +136,24 @@ static void remove_comments_and_unescape(char *str)
* Writes a field of crash report to a file.
* Field must be writable.
*/
-static void write_crash_report_field(FILE *fp, const map_crash_data_t &report,
+static void write_crash_report_field(FILE *fp, crash_data_t *crash_data,
const char *field, const char *description)
{
- const map_crash_data_t::const_iterator it = report.find(field);
- if (it == report.end())
+ const struct crash_item *value = get_crash_data_item_or_NULL(crash_data, field);
+ if (!value)
{
// exit silently, all fields are optional for now
//error_msg("Field %s not found", field);
return;
}
- if (it->second[CD_TYPE] == CD_SYS)
- {
- error_msg("Cannot update field %s because it is a system value", field);
- return;
- }
-
- fprintf(fp, "%s%s\n", FIELD_SEP, it->first.c_str());
+ fprintf(fp, "%s%s\n", FIELD_SEP, field);
fprintf(fp, "%s\n", description);
- if (it->second[CD_EDITABLE] != CD_ISEDITABLE)
+ if (!(value->flags & CD_FLAG_ISEDITABLE))
fprintf(fp, _("# This field is read only\n"));
- char *escaped_content = escape(it->second[CD_CONTENT].c_str());
+ char *escaped_content = escape(value->content);
fprintf(fp, "%s\n", escaped_content);
free(escaped_content);
}
@@ -177,7 +165,7 @@ static void write_crash_report_field(FILE *fp, const map_crash_data_t &report,
* If the report is successfully stored to the file, a zero value is returned.
* On failure, nonzero value is returned.
*/
-static void write_crash_report(const map_crash_data_t &report, FILE *fp)
+static void write_crash_report(crash_data_t *report, FILE *fp)
{
fprintf(fp, "# Please check this report. Lines starting with '#' will be ignored.\n"
"# Lines starting with '%%----' separate fields, please do not delete them.\n\n");
@@ -197,7 +185,7 @@ static void write_crash_report(const map_crash_data_t &report, FILE *fp)
write_crash_report_field(fp, report, FILENAME_KERNEL, _("# Kernel version"));
write_crash_report_field(fp, report, FILENAME_PACKAGE, _("# Package"));
write_crash_report_field(fp, report, FILENAME_REASON, _("# Reason of crash"));
- write_crash_report_field(fp, report, FILENAME_RELEASE, _("# Release string of the operating system"));
+ write_crash_report_field(fp, report, FILENAME_OS_RELEASE, _("# Release string of the operating system"));
}
/*
@@ -208,7 +196,7 @@ static void write_crash_report(const map_crash_data_t &report, FILE *fp)
* 1 if the field was changed.
* Changes to read-only fields are ignored.
*/
-static int read_crash_report_field(const char *text, map_crash_data_t &report,
+static int read_crash_report_field(const char *text, crash_data_t *report,
const char *field)
{
char separator[sizeof("\n" FIELD_SEP)-1 + strlen(field) + 2]; // 2 = '\n\0'
@@ -225,21 +213,15 @@ static int read_crash_report_field(const char *text, map_crash_data_t &report,
else
length = end - textfield;
- const map_crash_data_t::iterator it = report.find(field);
- if (it == report.end())
+ struct crash_item *value = get_crash_data_item_or_NULL(report, field);
+ if (!value)
{
error_msg("Field %s not found", field);
return 0;
}
- if (it->second[CD_TYPE] == CD_SYS)
- {
- error_msg("Cannot update field %s because it is a system value", field);
- return 0;
- }
-
// Do not change noneditable fields.
- if (it->second[CD_EDITABLE] != CD_ISEDITABLE)
+ if (!(value->flags & CD_FLAG_ISEDITABLE))
return 0;
// Compare the old field contents with the new field contents.
@@ -248,16 +230,16 @@ static int read_crash_report_field(const char *text, map_crash_data_t &report,
newvalue[length] = '\0';
trim(newvalue);
- char oldvalue[it->second[CD_CONTENT].length() + 1];
- strcpy(oldvalue, it->second[CD_CONTENT].c_str());
+ char oldvalue[strlen(value->content) + 1];
+ strcpy(oldvalue, value->content);
trim(oldvalue);
// Return if no change in the contents detected.
- int cmp = strcmp(newvalue, oldvalue);
- if (!cmp)
+ if (strcmp(newvalue, oldvalue) == 0)
return 0;
- it->second[CD_CONTENT].assign(newvalue);
+ free(value->content);
+ value->content = xstrdup(newvalue);
return 1;
}
@@ -269,7 +251,7 @@ static int read_crash_report_field(const char *text, map_crash_data_t &report,
* 1 if any field was changed.
* Changes to read-only fields are ignored.
*/
-static int read_crash_report(map_crash_data_t &report, const char *text)
+static int read_crash_report(crash_data_t *report, const char *text)
{
int result = 0;
result |= read_crash_report_field(text, report, FILENAME_COMMENT);
@@ -284,7 +266,7 @@ static int read_crash_report(map_crash_data_t &report, const char *text)
result |= read_crash_report_field(text, report, FILENAME_KERNEL);
result |= read_crash_report_field(text, report, FILENAME_PACKAGE);
result |= read_crash_report_field(text, report, FILENAME_REASON);
- result |= read_crash_report_field(text, report, FILENAME_RELEASE);
+ result |= read_crash_report_field(text, report, FILENAME_OS_RELEASE);
return result;
}
@@ -292,13 +274,13 @@ static int read_crash_report(map_crash_data_t &report, const char *text)
* Ensures that the fields needed for editor are present in the crash data.
* Fields: comments, how to reproduce.
*/
-static void create_fields_for_editor(map_crash_data_t &crash_data)
+static void create_fields_for_editor(crash_data_t *crash_data)
{
- if (crash_data.find(FILENAME_COMMENT) == crash_data.end())
- add_to_crash_data_ext(crash_data, FILENAME_COMMENT, CD_TXT, CD_ISEDITABLE, "");
+ if (!get_crash_data_item_or_NULL(crash_data, FILENAME_COMMENT))
+ add_to_crash_data_ext(crash_data, FILENAME_COMMENT, "", CD_FLAG_TXT + CD_FLAG_ISEDITABLE);
- if (crash_data.find(FILENAME_REPRODUCE) == crash_data.end())
- add_to_crash_data_ext(crash_data, FILENAME_REPRODUCE, CD_TXT, CD_ISEDITABLE, "1. \n2. \n3. \n");
+ if (!get_crash_data_item_or_NULL(crash_data, FILENAME_REPRODUCE))
+ add_to_crash_data_ext(crash_data, FILENAME_REPRODUCE, "1. \n2. \n3. \n", CD_FLAG_TXT + CD_FLAG_ISEDITABLE);
}
/**
@@ -342,7 +324,7 @@ static int launch_editor(const char *path)
* 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)
+static int run_report_editor(crash_data_t *crash_data)
{
/* Open a temporary file and write the crash report to it. */
char filename[] = "/tmp/abrt-report.XXXXXX";
@@ -356,15 +338,14 @@ static int run_report_editor(map_crash_data_t &cr)
FILE *fp = fdopen(fd, "w");
if (!fp) /* errno is set */
{
- perror_msg("can't open '%s' to save the crash report", filename);
- return 2;
+ die_out_of_memory();
}
- write_crash_report(cr, fp);
+ write_crash_report(crash_data, fp);
if (fclose(fp)) /* errno is set */
{
- perror_msg("can't close '%s'", filename);
+ perror_msg("can't write '%s'", filename);
return 2;
}
@@ -381,21 +362,18 @@ static int run_report_editor(map_crash_data_t &cr)
}
fseek(fp, 0, SEEK_END);
- long size = ftell(fp);
+ unsigned 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);
+ fclose(fp);
return 2;
}
text[size] = '\0';
- if (fclose(fp) != 0) /* errno is set */
- {
- perror_msg("can't close '%s'", filename);
- return 2;
- }
+ fclose(fp);
// Delete the tempfile.
if (unlink(filename) == -1) /* errno is set */
@@ -405,7 +383,7 @@ static int run_report_editor(map_crash_data_t &cr)
remove_comments_and_unescape(text);
// Updates the crash report from the file text.
- int report_changed = read_crash_report(cr, text);
+ int report_changed = read_crash_report(crash_data, text);
free(text);
if (report_changed)
puts(_("\nThe report has been updated"));
@@ -435,25 +413,6 @@ static void read_from_stdin(const char *question, char *result, int result_size)
strchrnul(result, '\n')[0] = '\0';
}
-/** Splits a string into substrings using chosen delimiters.
- * @param delim
- * Specifies a set of characters that delimit the
- * tokens in the parsed string
- */
-static GList *split(const char *s, const char delim)
-{
- GList *elems = NULL;
- while (1)
- {
- const char *end = strchrnul(s, delim);
- elems = g_list_append(elems, xstrndup(s, end - s));
- if (*end == '\0')
- break;
- s = end + 1;
- }
- return elems;
-}
-
/**
* Asks a [y/n] question on stdin/stdout.
* Returns true if the answer is yes, false otherwise.
@@ -467,97 +426,128 @@ static bool ask_yesno(const char *question)
fflush(NULL);
char answer[16];
- fgets(answer, sizeof(answer), stdin);
+ if (!fgets(answer, sizeof(answer), stdin))
+ return false;
/* Use strncmp here because the answer might contain a newline as
the last char. */
return 0 == strncmp(answer, yes, strlen(yes));
}
/* Returns true if echo has been changed from another state. */
-static bool set_echo(bool enabled)
+static bool set_echo(bool enable)
{
- if (isatty(STDIN_FILENO) == 0)
- {
- /* Clean errno, which is set by isatty. */
- errno = 0;
- return false;
- }
-
struct termios t;
if (tcgetattr(STDIN_FILENO, &t) < 0)
return false;
- /* No change needed. */
- if ((bool)(t.c_lflag & ECHO) == enabled)
+ /* No change needed? */
+ if ((bool)(t.c_lflag & ECHO) == enable)
return false;
- if (enabled)
- t.c_lflag |= ECHO;
- else
- t.c_lflag &= ~ECHO;
-
+ t.c_lflag ^= ECHO;
if (tcsetattr(STDIN_FILENO, TCSANOW, &t) < 0)
perror_msg_and_die("tcsetattr");
return true;
}
+
/**
* Gets reporter plugin settings.
- * @param reporters
- * List of reporter names. Settings of these reporters are handled.
- * @param settings
+ * @return settings
* A structure filled with reporter plugin settings.
+ * It's GHashTable<char *, map_plugin_t *> and must be passed to
+ * g_hash_table_destroy();
*/
-static void get_reporter_plugin_settings(const vector_string_t& reporters,
- map_map_string_t &settings)
+static void get_plugin_system_settings(GHashTable *settings)
{
- /* First of all, load system-wide report plugin settings. */
- for (vector_string_t::const_iterator it = reporters.begin(); it != reporters.end(); ++it)
+ DIR *dir = opendir(PLUGINS_CONF_DIR);
+ if (!dir)
+ return;
+
+ struct dirent *dent;
+ while ((dent = readdir(dir)) != NULL)
{
- map_string_t single_plugin_settings = call_GetPluginSettings(it->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->c_str()] = single_plugin_settings;
+ char *ext = strrchr(dent->d_name, '.');
+ if (!ext || strcmp(ext + 1, "conf") != 0)
+ continue;
+ if (!is_regular_file(dent, PLUGINS_CONF_DIR))
+ continue;
+ VERB3 log("Found %s", dent->d_name);
+
+ char *conf_file = concat_path_file(PLUGINS_CONF_DIR, dent->d_name);
+ map_string_h *single_plugin_settings = new_map_string();
+ if (load_conf_file(conf_file, single_plugin_settings, /*skip w/o value:*/ false))
+ VERB3 log("Loaded %s", dent->d_name);
+ free(conf_file);
+
+ *ext = '\0';
+ g_hash_table_replace(settings, xstrdup(dent->d_name), single_plugin_settings);
}
+ closedir(dir);
+}
+
+static GHashTable *get_plugin_settings(void)
+{
+ /* First of all, load system-wide plugin settings. */
+ GHashTable *settings = g_hash_table_new_full(
+ g_str_hash, g_str_equal,
+ free, (void (*)(void*))free_map_string
+ );
+
+ get_plugin_system_settings(settings);
/* Second, load user-specific settings, which override
- the system-wide settings. */
+ * the system-wide settings. */
struct passwd* pw = getpwuid(geteuid());
const char* homedir = pw ? pw->pw_dir : NULL;
if (homedir)
{
- map_map_string_t::const_iterator itend = settings.end();
- for (map_map_string_t::iterator it = settings.begin(); it != itend; ++it)
+ GHashTableIter iter;
+ char *plugin_name;
+ map_string_h *plugin_settings;
+ g_hash_table_iter_init(&iter, settings);
+ while (g_hash_table_iter_next(&iter, (void**)&plugin_name, (void**)&plugin_settings))
{
- map_string_t single_plugin_settings;
- std::string path = std::string(homedir) + "/.abrt/"
- + it->first + ".conf";
- /* 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);
+ /* 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/foo.conf, but he prefers to
+ * enter it every time he reports. */
+ map_string_h *single_plugin_settings = new_map_string();
+ char *path = xasprintf("%s/.abrt/%s.conf", homedir, plugin_name);
+ bool success = load_conf_file(path, single_plugin_settings, /*skip key w/o values:*/ false);
+ free(path);
if (!success)
+ {
+ free_map_string(single_plugin_settings);
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;
+ }
+
+ /* Merge user's plugin settings into already loaded settings */
+ GHashTableIter iter2;
+ char *key;
+ char *value;
+ g_hash_table_iter_init(&iter2, single_plugin_settings);
+ while (g_hash_table_iter_next(&iter2, (void**)&key, (void**)&value))
+ g_hash_table_replace(plugin_settings, xstrdup(key), xstrdup(value));
+
+ free_map_string(single_plugin_settings);
}
}
+ return settings;
}
/**
* Asks user for missing login information
*/
-static void ask_for_missing_settings(const char *plugin_name, map_string_t &single_plugin_settings)
+static void ask_for_missing_settings(const char *plugin_name, map_string_h *single_plugin_settings)
{
// 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(), "");
+ const char *login = get_map_string_item_or_NULL(single_plugin_settings, "Login");
+ const char *password = get_map_string_item_or_NULL(single_plugin_settings, "Password");
+ bool loginMissing = (login && login[0] == '\0');
+ bool passwordMissing = (password && password[0] == '\0');
if (!loginMissing && !passwordMissing)
return;
@@ -567,7 +557,7 @@ static void ask_for_missing_settings(const char *plugin_name, map_string_t &sing
if (loginMissing)
{
read_from_stdin(_("Enter your login: "), result, 64);
- single_plugin_settings["Login"] = std::string(result);
+ g_hash_table_replace(single_plugin_settings, xstrdup("Login"), xstrdup(result));
}
if (passwordMissing)
{
@@ -578,129 +568,266 @@ static void ask_for_missing_settings(const char *plugin_name, map_string_t &sing
// Newline was not added by pressing Enter because ECHO was disabled, so add it now.
puts("");
- single_plugin_settings["Password"] = std::string(result);
+ g_hash_table_replace(single_plugin_settings, xstrdup("Password"), xstrdup(result));
}
}
-/* Reports the crash with corresponding crash_id over DBus. */
-int report(const char *crash_id, int flags)
+
+struct logging_state {
+ char *last_line;
+};
+static char *do_log_and_save_line(char *log_line, void *param)
{
- int old_logmode = logmode;
- if (flags & CLI_REPORT_SILENT_IF_NOT_FOUND)
- logmode = 0;
- // Ask for an initial report.
- map_crash_data_t cr = call_CreateReport(crash_id);
- logmode = old_logmode;
- if (cr.size() == 0)
+ struct logging_state *l_state = (struct logging_state *)param;
+ log("%s", log_line);
+ free(l_state->last_line);
+ l_state->last_line = log_line;
+ return NULL;
+}
+static int run_events(const char *dump_dir_name,
+ const vector_string_t& events,
+ GHashTable *map_map_settings
+) {
+ int error_cnt = 0;
+ GList *env_list = NULL;
+
+ // Export overridden settings as environment variables
+ GHashTableIter iter;
+ char *plugin_name;
+ map_string_h *single_plugin_settings;
+ g_hash_table_iter_init(&iter, map_map_settings);
+ while (g_hash_table_iter_next(&iter, (void**)&plugin_name, (void**)&single_plugin_settings))
+ {
+ GHashTableIter iter2;
+ char *key;
+ char *value;
+ g_hash_table_iter_init(&iter2, single_plugin_settings);
+ while (g_hash_table_iter_next(&iter2, (void**)&key, (void**)&value))
+ {
+ char *s = xasprintf("%s_%s=%s", plugin_name, key, value);
+ VERB3 log("Exporting '%s'", s);
+ putenv(s);
+ env_list = g_list_append(env_list, s);
+ }
+ }
+
+ // Run events
+ bool at_least_one_reporter_succeeded = false;
+ std::string message;
+ struct logging_state l_state;
+ l_state.last_line = NULL;
+ struct run_event_state *run_state = new_run_event_state();
+ run_state->logging_callback = do_log_and_save_line;
+ run_state->logging_param = &l_state;
+ for (unsigned i = 0; i < events.size(); i++)
+ {
+ std::string event = events[i];
+
+ int r = run_event_on_dir_name(run_state, dump_dir_name, event.c_str());
+ if (r == 0 && run_state->children_count == 0)
+ {
+ l_state.last_line = xasprintf("Error: no processing is specified for event '%s'", event.c_str());
+ r = -1;
+ }
+ if (r == 0)
+ {
+ at_least_one_reporter_succeeded = true;
+ printf("%s: %s\n", event.c_str(), (l_state.last_line ? : "Reporting succeeded"));
+ if (message != "")
+ message += ";";
+ message += (l_state.last_line ? : "Reporting succeeded");
+ }
+ else
+ {
+ error_msg("Reporting via '%s' was not successful%s%s",
+ event.c_str(),
+ l_state.last_line ? ": " : "",
+ l_state.last_line ? l_state.last_line : ""
+ );
+ error_cnt++;
+ }
+ free(l_state.last_line);
+ l_state.last_line = NULL;
+ }
+ free_run_event_state(run_state);
+
+ // Unexport overridden settings
+ for (GList *li = env_list; li; li = g_list_next(li))
{
- return -1;
+ char *s = (char*)li->data;
+ /* Need to make a copy: just cutting s at '=' and unsetenv'ing
+ * the result would be a bug! s _itself_ is in environment now,
+ * we must not modify it there!
+ */
+ char *name = xstrndup(s, strchrnul(s, '=') - s);
+ VERB3 log("Unexporting '%s'", name);
+ unsetenv(name);
+ free(name);
+ free(s);
}
+ g_list_free(env_list);
+
+ // Save reporting results
+ if (at_least_one_reporter_succeeded)
+ {
+ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
+ if (dd)
+ {
+ dd_save_text(dd, FILENAME_MESSAGE, message.c_str());
+ dd_close(dd);
+ }
+ }
+
+ return error_cnt;
+}
+
+
+static char *do_log(char *log_line, void *param)
+{
+ log("%s", log_line);
+ return log_line;
+}
+int run_analyze_event(const char *dump_dir_name)
+{
+ VERB2 log("run_analyze_event('%s')", dump_dir_name);
+
+ struct run_event_state *run_state = new_run_event_state();
+ run_state->logging_callback = do_log;
+ int res = run_event_on_dir_name(run_state, dump_dir_name, "analyze");
+ free_run_event_state(run_state);
+ return res;
+}
- const char *rating_str = get_crash_data_item_content_or_NULL(cr, FILENAME_RATING);
- unsigned rating = rating_str ? xatou(rating_str) : 4;
- /* Open text editor and give a chance to review the backtrace etc. */
+/* Report the crash */
+int report(const char *dump_dir_name, int flags)
+{
+ if (run_analyze_event(dump_dir_name) != 0)
+ return 1;
+
+ /* Load crash_data from (possibly updated by analyze) dump dir */
+ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
+ if (!dd)
+ return -1;
+
+ crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
+ char *events_as_lines = list_possible_events(dd, NULL, "");
+ dd_close(dd);
+
if (!(flags & CLI_REPORT_BATCH))
{
- create_fields_for_editor(cr);
- int result = run_report_editor(cr);
+ /* Open text editor and give a chance to review the backtrace etc */
+ create_fields_for_editor(crash_data);
+ int result = run_report_editor(crash_data);
if (result != 0)
- return result;
+ {
+ free_crash_data(crash_data);
+ free(events_as_lines);
+ return 1;
+ }
+ /* Save comment, "how to reproduce", backtrace */
+ dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
+ if (dd)
+ {
+//TODO: we should iterate through crash_data and modify all modifiable fields
+ const char *comment = get_crash_item_content_or_NULL(crash_data, FILENAME_COMMENT);
+ const char *reproduce = get_crash_item_content_or_NULL(crash_data, FILENAME_REPRODUCE);
+ const char *backtrace = get_crash_item_content_or_NULL(crash_data, FILENAME_BACKTRACE);
+ if (comment)
+ dd_save_text(dd, FILENAME_COMMENT, comment);
+ if (reproduce)
+ dd_save_text(dd, FILENAME_REPRODUCE, reproduce);
+ if (backtrace)
+ dd_save_text(dd, FILENAME_BACKTRACE, backtrace);
+ dd_close(dd);
+ }
}
- /* Get possible reporters associated with this particular crash. */
- const char *events = get_crash_data_item_content_or_NULL(cr, CD_EVENTS);
- vector_string_t reporters;
- if (events) while (*events)
+ /* Get possible reporters associated with this particular crash */
+ vector_string_t report_events;
+ if (events_as_lines)
{
- const char *end = strchrnul(events, '\n');
- if (strncmp(events, "report", 6) == 0
- && (events[6] == '\0' || events[6] == '_')
- ) {
- char *tmp = xstrndup(events, end - events);
- reporters.push_back(tmp);
- free(tmp);
+ char *events = events_as_lines;
+ while (*events)
+ {
+ char *end = strchrnul(events, '\n');
+ if (strncmp(events, "report", 6) == 0
+ && (events[6] == '\0' || events[6] == '_')
+ ) {
+ char *tmp = xstrndup(events, end - events);
+ report_events.push_back(tmp);
+ free(tmp);
+ }
+ events = end;
+ if (!*events)
+ break;
+ events++;
}
- events = end;
- if (!*events)
- break;
- events++;
}
/* Get settings */
- map_map_string_t reporters_settings;
- get_reporter_plugin_settings(reporters, reporters_settings);
+ GHashTable *map_map_settings = get_plugin_settings();
int errors = 0;
int plugins = 0;
if (flags & CLI_REPORT_BATCH)
{
puts(_("Reporting..."));
- report_status_t r = call_Report(cr, reporters, reporters_settings);
- report_status_t::iterator it = r.begin();
- while (it != r.end())
- {
- 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")
- errors++;
- it++;
- }
+ errors += run_events(dump_dir_name, report_events, map_map_settings);
+ plugins += report_events.size();
}
else
{
+ const char *rating_str = get_crash_item_content_or_NULL(crash_data, FILENAME_RATING);
+ unsigned rating = rating_str ? xatou(rating_str) : 4;
+
/* For every reporter, ask if user really wants to report using it. */
- for (vector_string_t::const_iterator it = reporters.begin(); it != reporters.end(); ++it)
+ for (vector_string_t::const_iterator it = report_events.begin(); it != report_events.end(); ++it)
{
char question[255];
- snprintf(question, 255, _("Report using %s?"), it->c_str());
+ snprintf(question, sizeof(question), _("Report using %s?"), it->c_str());
if (!ask_yesno(question))
{
puts(_("Skipping..."));
continue;
}
- map_map_string_t::iterator settings = reporters_settings.find(it->c_str());
- if (settings != reporters_settings.end())
+//TODO: rethink how we associate report events with configs
+ if (strncmp(it->c_str(), "report_", strlen("report_")) == 0)
{
- map_string_t::iterator rating_setting = settings->second.find("RatingRequired");
- if (rating_setting != settings->second.end()
- && string_to_bool(rating_setting->second.c_str())
- && rating < 3)
+ const char *config_name = it->c_str() + strlen("report_");
+ map_string_h *single_plugin_settings = (map_string_h *)g_hash_table_lookup(map_map_settings, config_name);
+ if (single_plugin_settings)
{
- puts(_("Reporting disabled because the backtrace is unusable"));
-
- const char *package = get_crash_data_item_content_or_NULL(cr, FILENAME_PACKAGE);
- if (package[0])
- printf(_("Please try to install debuginfo manually using the command: \"debuginfo-install %s\" and try again\n"), package);
-
- plugins++;
- errors++;
- continue;
+ const char *rating_required = get_map_string_item_or_NULL(single_plugin_settings, "RatingRequired");
+ if (rating_required
+ && string_to_bool(rating_required) == true
+ && rating < 3
+ ) {
+ puts(_("Reporting disabled because the backtrace is unusable"));
+
+ const char *package = get_crash_item_content_or_NULL(crash_data, FILENAME_PACKAGE);
+ if (package && package[0])
+ printf(_("Please try to install debuginfo manually using the command: \"debuginfo-install %s\" and try again\n"), package);
+
+ plugins++;
+ errors++;
+ continue;
+ }
+ ask_for_missing_settings(it->c_str(), single_plugin_settings);
}
}
- else
- {
- puts(_("Error loading reporter settings"));
- plugins++;
- errors++;
- continue;
- }
- ask_for_missing_settings(it->c_str(), settings->second);
-
- vector_string_t cur_reporter(1, *it);
- report_status_t r = call_Report(cr, cur_reporter, reporters_settings);
- assert(r.size() == 1); /* one reporter --> one report status */
- vector_string_t &v = r.begin()->second;
- printf("%s: %s\n", r.begin()->first.c_str(), v[REPORT_STATUS_IDX_MSG].c_str());
+ vector_string_t cur_event(1, *it);
+ errors += run_events(dump_dir_name, cur_event, map_map_settings);
plugins++;
- if (v[REPORT_STATUS_IDX_FLAG] == "0")
- errors++;
}
}
+ g_hash_table_destroy(map_map_settings);
+
printf(_("Crash reported via %d report events (%d errors)\n"), plugins, errors);
- return errors != 0;
+ free_crash_data(crash_data);
+ free(events_as_lines);
+ return errors;
}
diff --git a/src/cli/report.h b/src/cli/report.h
index 8a851b8e..80c0b9f2 100644
--- a/src/cli/report.h
+++ b/src/cli/report.h
@@ -18,11 +18,12 @@
#ifndef ABRT_CLI_REPORT_H
#define ABRT_CLI_REPORT_H
-/* Reports the crash with corresponding uuid over DBus. */
+int run_analyze_event(const char *dump_dir_name);
+
+/* Report the crash */
enum {
CLI_REPORT_BATCH = 1 << 0,
- CLI_REPORT_SILENT_IF_NOT_FOUND = 1 << 1,
};
-int report(const char *uuid, int flags);
+int report(const char *dump_dir_name, int flags);
#endif
diff --git a/src/daemon/CommLayerServer.h b/src/daemon/CommLayerServer.h
deleted file mode 100644
index 5b7ecf57..00000000
--- a/src/daemon/CommLayerServer.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- Copyright (C) 2010 ABRT team
- Copyright (C) 2010 RedHat Inc
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#ifndef COMMLAYERSERVER_H_
-#define COMMLAYERSERVER_H_
-
-#include "abrtlib.h"
-#include "abrt_crash_dump.h"
-
-class CCommLayerServer {
- public:
- int m_init_error;
-
- CCommLayerServer();
- virtual ~CCommLayerServer();
-
- /* just stubs to be called when not implemented in specific comm layer */
- virtual void Crash(const char *package_name,
- const char *crash_id,
- const char *dir,
- const char *uid_str
- ) {}
- virtual void JobDone(const char* peer) = 0;
- virtual void QuotaExceed(const char* str) {}
-
- virtual void Update(const char* pMessage, const char* peer) {};
- virtual void Warning(const char* pMessage, const char* peer) {};
-};
-
-#endif
diff --git a/src/daemon/CommLayerServerDBus.cpp b/src/daemon/CommLayerServerDBus.cpp
index 28d6ee05..133feb7b 100644
--- a/src/daemon/CommLayerServerDBus.cpp
+++ b/src/daemon/CommLayerServerDBus.cpp
@@ -19,12 +19,9 @@
#include <dbus/dbus.h>
#include "abrtlib.h"
#include "abrt_dbus.h"
-#include "abrt_exception.h"
#include "comm_layer_inner.h"
-#include "dbus_common.h"
#include "MiddleWare.h"
#include "Settings.h"
-#include "Daemon.h"
#include "CommLayerServerDBus.h"
// 16kB message limit
@@ -48,6 +45,11 @@ static DBusMessage* new_signal_msg(const char* member, const char* peer = NULL)
}
static void send_flush_and_unref(DBusMessage* msg)
{
+ if (!g_dbus_conn)
+ {
+ /* Not logging this, it may recurse */
+ return;
+ }
if (!dbus_connection_send(g_dbus_conn, msg, NULL /* &serial */))
error_msg_and_die("Error sending DBus message");
dbus_connection_flush(g_dbus_conn);
@@ -56,7 +58,7 @@ static void send_flush_and_unref(DBusMessage* msg)
}
/* Notify the clients (UI) about a new crash */
-void CCommLayerServerDBus::Crash(const char *package_name,
+void send_dbus_sig_Crash(const char *package_name,
const char *crash_id,
const char *dir,
const char *uid_str
@@ -84,24 +86,24 @@ void CCommLayerServerDBus::Crash(const char *package_name,
send_flush_and_unref(msg);
}
-void CCommLayerServerDBus::QuotaExceed(const char* str)
+void send_dbus_sig_QuotaExceeded(const char* str)
{
- DBusMessage* msg = new_signal_msg("QuotaExceed");
+ DBusMessage* msg = new_signal_msg("QuotaExceeded");
dbus_message_append_args(msg,
DBUS_TYPE_STRING, &str,
DBUS_TYPE_INVALID);
- VERB2 log("Sending signal QuotaExceed('%s')", str);
+ VERB2 log("Sending signal QuotaExceeded('%s')", str);
send_flush_and_unref(msg);
}
-void CCommLayerServerDBus::JobDone(const char* peer)
+void send_dbus_sig_JobDone(const char* peer)
{
DBusMessage* msg = new_signal_msg("JobDone", peer);
VERB2 log("Sending signal JobDone() to peer %s", peer);
send_flush_and_unref(msg);
}
-void CCommLayerServerDBus::Update(const char* pMessage, const char* peer)
+void send_dbus_sig_Update(const char* pMessage, const char* peer)
{
DBusMessage* msg = new_signal_msg("Update", peer);
dbus_message_append_args(msg,
@@ -110,7 +112,7 @@ void CCommLayerServerDBus::Update(const char* pMessage, const char* peer)
send_flush_and_unref(msg);
}
-void CCommLayerServerDBus::Warning(const char* pMessage, const char* peer)
+void send_dbus_sig_Warning(const char* pMessage, const char* peer)
{
DBusMessage* msg = new_signal_msg("Warning", peer);
dbus_message_append_args(msg,
@@ -144,11 +146,12 @@ static long get_remote_uid(DBusMessage* call, const char** ppSender = NULL)
static int handle_GetCrashInfos(DBusMessage* call, DBusMessage* reply)
{
long unix_uid = get_remote_uid(call);
- vector_map_crash_data_t argout1 = GetCrashInfos(unix_uid);
+ vector_of_crash_data_t *argout1 = GetCrashInfos(unix_uid);
DBusMessageIter out_iter;
dbus_message_iter_init_append(reply, &out_iter);
- store_val(&out_iter, argout1);
+ store_vector_of_crash_data(&out_iter, argout1);
+ free_vector_of_crash_data(argout1);
send_flush_and_unref(reply);
return 0;
@@ -197,12 +200,12 @@ static int handle_CreateReport(DBusMessage* call, DBusMessage* reply)
}
long unix_uid = get_remote_uid(call);
- map_crash_data_t report;
- CreateReport(crash_id, unix_uid, /*force:*/ 0, report);
+ crash_data_t *report = NULL;
+ CreateReport(crash_id, unix_uid, /*force:*/ 0, &report);
DBusMessageIter out_iter;
dbus_message_iter_init_append(reply, &out_iter);
- store_val(&out_iter, report);
+ store_crash_data(&out_iter, report);
send_flush_and_unref(reply);
return 0;
@@ -211,19 +214,28 @@ static int handle_CreateReport(DBusMessage* call, DBusMessage* reply)
static int handle_Report(DBusMessage* call, DBusMessage* reply)
{
int r;
+ long unix_uid;
+ report_status_t argout1;
+ map_map_string_t user_conf_data;
+ vector_string_t events;
+ const char* comment = NULL;
+ const char* reproduce = NULL;
+ const char* errmsg = NULL;
DBusMessageIter in_iter;
+
dbus_message_iter_init(call, &in_iter);
- map_crash_data_t argin1;
- r = load_val(&in_iter, argin1);
+ crash_data_t *crash_data = NULL;
+ r = load_crash_data(&in_iter, &crash_data);
if (r != ABRT_DBUS_MORE_FIELDS)
{
error_msg("dbus call %s: parameter type mismatch", __func__ + 7);
- return -1;
+ r = -1;
+ goto ret;
}
- const char* comment = get_crash_data_item_content_or_NULL(argin1, FILENAME_COMMENT) ? : "";
- const char* reproduce = get_crash_data_item_content_or_NULL(argin1, FILENAME_REPRODUCE) ? : "";
- const char* errmsg = NULL;
+//TODO? get_crash_item_content_or_die_or_empty?
+ comment = get_crash_item_content_or_NULL(crash_data, FILENAME_COMMENT) ? : "";
+ reproduce = get_crash_item_content_or_NULL(crash_data, FILENAME_REPRODUCE) ? : "";
if (strlen(comment) > LIMIT_MESSAGE)
{
errmsg = _("Comment is too long");
@@ -239,52 +251,43 @@ static int handle_Report(DBusMessage* call, DBusMessage* reply)
if (!reply)
die_out_of_memory();
send_flush_and_unref(reply);
- return 0;
+ r = 0;
+ goto ret;
}
/* Second parameter: list of events to run */
- vector_string_t events;
r = load_val(&in_iter, events);
if (r == ABRT_DBUS_ERROR)
{
error_msg("dbus call %s: parameter type mismatch", __func__ + 7);
- return -1;
+ r = -1;
+ goto ret;
}
/* Third parameter (optional): configuration data for plugins */
- map_map_string_t user_conf_data;
if (r == ABRT_DBUS_MORE_FIELDS)
{
r = load_val(&in_iter, user_conf_data);
if (r != ABRT_DBUS_LAST_FIELD)
{
error_msg("dbus call %s: parameter type mismatch", __func__ + 7);
- return -1;
+ r = -1;
+ goto ret;
}
}
- long unix_uid = get_remote_uid(call);
- report_status_t argout1;
- try
- {
- argout1 = Report(argin1, events, user_conf_data, unix_uid);
- }
- catch (CABRTException &e)
- {
- dbus_message_unref(reply);
- reply = dbus_message_new_error(call, DBUS_ERROR_FAILED, e.what());
- if (!reply)
- die_out_of_memory();
- send_flush_and_unref(reply);
- return 0;
- }
+ unix_uid = get_remote_uid(call);
+ argout1 = Report(crash_data, events, user_conf_data, unix_uid);
DBusMessageIter out_iter;
dbus_message_iter_init_append(reply, &out_iter);
store_val(&out_iter, argout1);
send_flush_and_unref(reply);
- return 0;
+ r = 0;
+ ret:
+ free_crash_data(crash_data);
+ return r;
}
static int handle_DeleteDebugDump(DBusMessage* call, DBusMessage* reply)
@@ -339,12 +342,13 @@ static int handle_GetPluginSettings(DBusMessage* call, DBusMessage* reply)
//long unix_uid = get_remote_uid(call);
//VERB1 log("got %s('%s') call from uid %ld", "GetPluginSettings", PluginName, unix_uid);
- map_plugin_settings_t plugin_settings;
- GetPluginSettings(PluginName, plugin_settings);
+ map_string_h *plugin_settings = GetPluginSettings(PluginName);
DBusMessageIter out_iter;
dbus_message_iter_init_append(reply, &out_iter);
- store_val(&out_iter, plugin_settings);
+ store_map_string(&out_iter, plugin_settings);
+
+ free_map_string(plugin_settings);
send_flush_and_unref(reply);
return 0;
@@ -362,25 +366,25 @@ static int handle_GetSettings(DBusMessage* call, DBusMessage* reply)
return 0;
}
-static int handle_SetSettings(DBusMessage* call, DBusMessage* reply)
-{
- int r;
- DBusMessageIter in_iter;
- dbus_message_iter_init(call, &in_iter);
- map_abrt_settings_t param1;
- r = load_val(&in_iter, param1);
- if (r != ABRT_DBUS_LAST_FIELD)
- {
- error_msg("dbus call %s: parameter type mismatch", __func__ + 7);
- return -1;
- }
-
- const char * sender = dbus_message_get_sender(call);
- SetSettings(param1, sender);
-
- send_flush_and_unref(reply);
- return 0;
-}
+//static int handle_SetSettings(DBusMessage* call, DBusMessage* reply)
+//{
+// int r;
+// DBusMessageIter in_iter;
+// dbus_message_iter_init(call, &in_iter);
+// map_abrt_settings_t param1;
+// r = load_val(&in_iter, param1);
+// if (r != ABRT_DBUS_LAST_FIELD)
+// {
+// error_msg("dbus call %s: parameter type mismatch", __func__ + 7);
+// return -1;
+// }
+//
+// const char * sender = dbus_message_get_sender(call);
+// SetSettings(param1, sender);
+//
+// send_flush_and_unref(reply);
+// return 0;
+//}
/*
@@ -413,8 +417,11 @@ static DBusHandlerResult message_received(DBusConnection* conn, DBusMessage* msg
r = handle_GetPluginSettings(msg, reply);
else if (strcmp(member, "GetSettings") == 0)
r = handle_GetSettings(msg, reply);
- else if (strcmp(member, "SetSettings") == 0)
- r = handle_SetSettings(msg, reply);
+// looks unused to me.
+// Ok to grep for SetSettings and delete after 2011-04-01.
+// else if (strcmp(member, "SetSettings") == 0)
+// r = handle_SetSettings(msg, reply);
+
// NB: C++ binding also handles "Introspect" method, which returns a string.
// It was sending "dummy" introspection answer whick looks like this:
// "<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n"
@@ -460,7 +467,7 @@ static void handle_dbus_err(bool error_flag, DBusError *err)
ABRTD_DBUS_NAME);
}
-CCommLayerServerDBus::CCommLayerServerDBus()
+int init_dbus()
{
DBusConnection* conn;
DBusError err;
@@ -481,7 +488,7 @@ CCommLayerServerDBus::CCommLayerServerDBus()
//
// dbus-daemon drops connections if it recvs a malformed message
// (we actually observed this when we sent bad UTF-8 string).
- // Currently, in this case abrtd just exits with exitcode 1.
+ // Currently, in this case abrtd just exits with exit code 1.
// (symptom: last two log messages are "abrtd: remove_watch()")
// If we want to have better logging or other nontrivial handling,
// here we need to do:
@@ -510,9 +517,15 @@ CCommLayerServerDBus::CCommLayerServerDBus()
int cnt = 10;
while (dbus_connection_dispatch(conn) != DBUS_DISPATCH_COMPLETE && --cnt)
VERB3 log("processed initial buffered dbus message");
+
+ return 0;
}
-CCommLayerServerDBus::~CCommLayerServerDBus()
+void deinit_dbus()
{
- dbus_connection_unref(g_dbus_conn);
+ if (g_dbus_conn != NULL)
+ {
+ dbus_connection_unref(g_dbus_conn);
+ g_dbus_conn = NULL;
+ }
}
diff --git a/src/daemon/CommLayerServerDBus.h b/src/daemon/CommLayerServerDBus.h
index df767436..979fef69 100644
--- a/src/daemon/CommLayerServerDBus.h
+++ b/src/daemon/CommLayerServerDBus.h
@@ -19,26 +19,26 @@
#ifndef COMMLAYERSERVERDBUS_H_
#define COMMLAYERSERVERDBUS_H_
-#include "CommLayerServer.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
-class CCommLayerServerDBus
-: public CCommLayerServer
-{
- public:
- CCommLayerServerDBus();
- virtual ~CCommLayerServerDBus();
+int init_dbus(void);
+void deinit_dbus(void);
- /* DBus signal senders */
- virtual void Crash(const char *package_name,
+void send_dbus_sig_Crash(const char *package_name,
const char *crash_id,
const char *dir,
const char *uid_str
- );
- virtual void JobDone(const char* peer);
- virtual void QuotaExceed(const char* str);
+);
+void send_dbus_sig_JobDone(const char* peer);
+void send_dbus_sig_QuotaExceeded(const char* str);
+
+void send_dbus_sig_Update(const char* pMessage, const char* peer);
+void send_dbus_sig_Warning(const char* pMessage, const char* peer);
- virtual void Update(const char* pMessage, const char* peer);
- virtual void Warning(const char* pMessage, const char* peer);
-};
+#ifdef __cplusplus
+}
+#endif
#endif
diff --git a/src/daemon/CrashWatcher.cpp b/src/daemon/CrashWatcher.cpp
deleted file mode 100644
index a74fa3aa..00000000
--- a/src/daemon/CrashWatcher.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- Copyright (C) 2009 Jiri Moskovcak (jmoskovc@redhat.com)
- Copyright (C) 2009 RedHat inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#include "abrtlib.h"
-#include "Daemon.h"
-#include "CommLayerServer.h"
-#include "CrashWatcher.h"
-
-void CCrashWatcher::Status(const char *pMessage, const char* peer)
-{
- VERB1 log("Update('%s'): %s", peer, pMessage);
- if (g_pCommLayer != NULL)
- g_pCommLayer->Update(pMessage, peer);
-}
-
-void CCrashWatcher::Warning(const char *pMessage, const char* peer)
-{
- VERB1 log("Warning('%s'): %s", peer, pMessage);
- if (g_pCommLayer != NULL)
- g_pCommLayer->Warning(pMessage, peer);
-}
-
-CCrashWatcher::CCrashWatcher()
-{
-}
-
-CCrashWatcher::~CCrashWatcher()
-{
-}
diff --git a/src/daemon/CrashWatcher.h b/src/daemon/CrashWatcher.h
deleted file mode 100644
index 4f755a36..00000000
--- a/src/daemon/CrashWatcher.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- Copyright (C) 2009 Jiri Moskovcak (jmoskovc@redhat.com)
- Copyright (C) 2009 RedHat inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#ifndef CRASHWATCHER_H_
-#define CRASHWATCHER_H_
-
-#include "observer.h"
-
-
-class CCrashWatcher
-: public CObserver
-{
- public:
- CCrashWatcher();
- virtual ~CCrashWatcher();
-
- public:
- /* Observer methods */
- virtual void Status(const char *pMessage, const char* peer);
- virtual void Warning(const char *pMessage, const char* peer);
-};
-
-#endif
diff --git a/src/daemon/Daemon.cpp b/src/daemon/Daemon.cpp
index 609b0b26..f791fb38 100644
--- a/src/daemon/Daemon.cpp
+++ b/src/daemon/Daemon.cpp
@@ -25,21 +25,18 @@
#include <string>
#include <sys/inotify.h>
#include <sys/ioctl.h> /* ioctl(FIONREAD) */
-#include <glib.h>
#include "abrtlib.h"
-#include "abrt_exception.h"
#include "comm_layer_inner.h"
#include "Settings.h"
#include "CommLayerServerDBus.h"
-#include "CrashWatcher.h"
#include "MiddleWare.h"
-#include "Daemon.h"
#include "parse_options.h"
+#define PROGNAME "abrtd"
+
using namespace std;
-#define VAR_RUN_LOCK_FILE VAR_RUN"/abrt/abrtd.lock"
#define VAR_RUN_PIDFILE VAR_RUN"/abrtd.pid"
#define SOCKET_FILE VAR_RUN"/abrt/abrt.socket"
@@ -55,15 +52,15 @@ using namespace std;
* - signal: we got SIGTERM or SIGINT
*
* DBus methods we have:
- * - GetCrashInfos(): returns a vector_map_crash_data_t (vector_map_vector_string_t)
+ * - GetCrashInfos(): returns a vector_of_crash_data
* of crashes for given uid
* v[N]["executable"/"uid"/"kernel"/"backtrace"][N] = "contents"
* - StartJob(crash_id,force): starts creating a report for /var/spool/abrt/DIR with this UID:UUID.
* Returns job id (uint64).
* After thread returns, when report creation thread has finished,
* JobDone() dbus signal is emitted.
- * - CreateReport(crash_id): returns map_crash_data_t (map_vector_string_t)
- * - Report(map_crash_data_t (map_vector_string_t[, map_map_string_t])):
+ * - CreateReport(crash_id): returns crash data (hash table of struct crash_item)
+ * - Report(crash_data[, map_map_string_t]):
* "Please report this crash": calls Report() of all registered reporter plugins.
* Returns report_status_t (map_vector_string_t) - the status of each call.
* 2nd parameter is the contents of user's abrt.conf.
@@ -85,12 +82,11 @@ using namespace std;
* Both are sent as unicast to last client set by set_client_name(name).
* If set_client_name(NULL) was done, they are not sent.
*/
-CCommLayerServer* g_pCommLayer;
-
static volatile sig_atomic_t s_sig_caught;
static int s_signal_pipe[2];
static int s_signal_pipe_write = -1;
static int s_upload_watch = -1;
+static pid_t log_scanner_pid = -1;
static unsigned s_timeout;
static bool s_exiting;
@@ -203,205 +199,36 @@ static void dumpsocket_shutdown()
}
}
-
-/* Cron handling */
-
-typedef struct cron_callback_data_t
-{
- std::string m_sPluginName;
- std::string m_sPluginArgs;
- unsigned int m_nTimeout;
-
- cron_callback_data_t(
- const std::string& pPluginName,
- const std::string& pPluginArgs,
- const unsigned int& pTimeout) :
- m_sPluginName(pPluginName),
- m_sPluginArgs(pPluginArgs),
- m_nTimeout(pTimeout)
- {}
-} cron_callback_data_t;
-
-static void cron_delete_callback_data_cb(gpointer data)
-{
- cron_callback_data_t* cronDeleteCallbackData = static_cast<cron_callback_data_t*>(data);
- delete cronDeleteCallbackData;
-}
-
-static gboolean cron_activation_periodic_cb(gpointer data)
+static int create_pidfile()
{
- cron_callback_data_t* cronPeriodicCallbackData = static_cast<cron_callback_data_t*>(data);
- VERB1 log("Activating plugin: %s", cronPeriodicCallbackData->m_sPluginName.c_str());
- RunAction(DEBUG_DUMPS_DIR,
- cronPeriodicCallbackData->m_sPluginName.c_str(),
- cronPeriodicCallbackData->m_sPluginArgs.c_str()
- );
- return TRUE;
-}
-static gboolean cron_activation_one_cb(gpointer data)
-{
- cron_callback_data_t* cronOneCallbackData = static_cast<cron_callback_data_t*>(data);
- VERB1 log("Activating plugin: %s", cronOneCallbackData->m_sPluginName.c_str());
- RunAction(DEBUG_DUMPS_DIR,
- cronOneCallbackData->m_sPluginName.c_str(),
- cronOneCallbackData->m_sPluginArgs.c_str()
- );
- return FALSE;
-}
-static gboolean cron_activation_reshedule_cb(gpointer data)
-{
- cron_callback_data_t* cronResheduleCallbackData = static_cast<cron_callback_data_t*>(data);
- VERB1 log("Rescheduling plugin: %s", cronResheduleCallbackData->m_sPluginName.c_str());
- cron_callback_data_t* cronPeriodicCallbackData = new cron_callback_data_t(cronResheduleCallbackData->m_sPluginName,
- cronResheduleCallbackData->m_sPluginArgs,
- cronResheduleCallbackData->m_nTimeout);
- g_timeout_add_seconds_full(G_PRIORITY_DEFAULT,
- cronPeriodicCallbackData->m_nTimeout,
- cron_activation_periodic_cb,
- static_cast<gpointer>(cronPeriodicCallbackData),
- cron_delete_callback_data_cb
- );
- return FALSE;
-}
-
-static int SetUpCron()
-{
- map_cron_t::iterator it_c = g_settings_mapCron.begin();
- for (; it_c != g_settings_mapCron.end(); it_c++)
+ /* Note:
+ * No O_EXCL: we would happily overwrite stale pidfile from previous boot.
+ * No O_TRUNC: we must first try to lock the file, and if lock fails,
+ * there is another live abrtd. O_TRUNCing the file in this case
+ * would be wrong - it'll erase the pid to empty string!
+ */
+ int fd = open(VAR_RUN_PIDFILE, O_WRONLY|O_CREAT, 0644);
+ if (fd >= 0)
{
- std::string::size_type pos = it_c->first.find(":");
- int timeout = 0;
- int nH = -1;
- int nM = -1;
- int nS = -1;
-
-//TODO: rewrite using good old sscanf?
-
- if (pos != std::string::npos)
- {
- std::string sH;
- std::string sM;
-
- sH = it_c->first.substr(0, pos);
- nH = xatou(sH.c_str());
- nH = nH > 23 ? 23 : nH;
- nH = nH < 0 ? 0 : nH;
- timeout += nH * 60 * 60;
- sM = it_c->first.substr(pos + 1);
- nM = xatou(sM.c_str());
- nM = nM > 59 ? 59 : nM;
- nM = nM < 0 ? 0 : nM;
- timeout += nM * 60;
- }
- else
- {
- std::string sS;
-
- sS = it_c->first;
- nS = xatou(sS.c_str());
- nS = nS <= 0 ? 1 : nS;
- timeout = nS;
- }
-
- if (nS != -1)
+ if (lockf(fd, F_TLOCK, 0) < 0)
{
- vector_pair_string_string_t::iterator it_ar = it_c->second.begin();
- for (; it_ar != it_c->second.end(); it_ar++)
- {
- cron_callback_data_t* cronPeriodicCallbackData = new cron_callback_data_t(it_ar->first, it_ar->second, timeout);
- g_timeout_add_seconds_full(G_PRIORITY_DEFAULT,
- timeout,
- cron_activation_periodic_cb,
- static_cast<gpointer>(cronPeriodicCallbackData),
- cron_delete_callback_data_cb);
- }
+ perror_msg("Can't lock file '%s'", VAR_RUN_PIDFILE);
+ return -1;
}
- else
- {
- time_t actTime = time(NULL);
- struct tm locTime;
- localtime_r(&actTime, &locTime);
- locTime.tm_hour = nH;
- locTime.tm_min = nM;
- locTime.tm_sec = 0;
- time_t nextTime = mktime(&locTime);
- if (nextTime == ((time_t)-1))
- {
- /* paranoia */
- perror_msg("Can't set up cron time");
- return -1;
- }
- if (actTime > nextTime)
- {
- timeout = 24*60*60 + (nextTime - actTime);
- }
- else
- {
- timeout = nextTime - actTime;
- }
- vector_pair_string_string_t::iterator it_ar = it_c->second.begin();
- for (; it_ar != it_c->second.end(); it_ar++)
- {
- cron_callback_data_t* cronOneCallbackData = new cron_callback_data_t(it_ar->first, it_ar->second, timeout);
- g_timeout_add_seconds_full(G_PRIORITY_DEFAULT,
- timeout,
- cron_activation_one_cb,
- static_cast<gpointer>(cronOneCallbackData),
- cron_delete_callback_data_cb);
- cron_callback_data_t* cronResheduleCallbackData = new cron_callback_data_t(it_ar->first, it_ar->second, 24 * 60 * 60);
- g_timeout_add_seconds_full(G_PRIORITY_DEFAULT,
- timeout,
- cron_activation_reshedule_cb,
- static_cast<gpointer>(cronResheduleCallbackData),
- cron_delete_callback_data_cb);
- }
- }
- }
- return 0;
-}
-
-static int CreatePidFile()
-{
- int fd;
-
- /* JIC */
- unlink(VAR_RUN_PIDFILE);
-
- /* open the pidfile */
- fd = open(VAR_RUN_PIDFILE, O_WRONLY|O_CREAT|O_EXCL, 0644);
- if (fd >= 0)
- {
+ close_on_exec_on(fd);
/* write our pid to it */
char buf[sizeof(long)*3 + 2];
int len = sprintf(buf, "%lu\n", (long)getpid());
write(fd, buf, len);
- close(fd);
+ ftruncate(fd, len);
+ /* we leak opened+locked fd intentionally */
return 0;
}
- /* something went wrong */
perror_msg("Can't open '%s'", VAR_RUN_PIDFILE);
return -1;
}
-static int Lock()
-{
- int lfd = open(VAR_RUN_LOCK_FILE, O_RDWR|O_CREAT, 0640);
- if (lfd < 0)
- {
- perror_msg("Can't open '%s'", VAR_RUN_LOCK_FILE);
- return -1;
- }
- if (lockf(lfd, F_TLOCK, 0) < 0)
- {
- perror_msg("Can't lock file '%s'", VAR_RUN_LOCK_FILE);
- return -1;
- }
- close_on_exec_on(lfd);
- return 0;
- /* we leak opened lfd intentionally */
-}
-
static void handle_signal(int signo)
{
int save_errno = errno;
@@ -433,12 +260,22 @@ static gboolean handle_signal_cb(GIOChannel *gio, GIOCondition condition, gpoint
s_exiting = 1;
else
{
- if (socket_client_count)
- socket_client_count--;
- if (!socket_channel_cb_id)
+ pid_t pid;
+ while ((pid = waitpid(-1, NULL, WNOHANG)) > 0)
{
- log("Accepting connections on '%s'", SOCKET_FILE);
- socket_channel_cb_id = add_watch_or_die(socket_channel, G_IO_IN | G_IO_PRI, server_socket_cb);
+ if (pid == log_scanner_pid)
+ {
+ log("log scanner exited");
+ log_scanner_pid = -1;
+ continue;
+ }
+ if (socket_client_count)
+ socket_client_count--;
+ if (!socket_channel_cb_id)
+ {
+ log("Accepting connections on '%s'", SOCKET_FILE);
+ socket_channel_cb_id = add_watch_or_die(socket_channel, G_IO_IN | G_IO_PRI, server_socket_cb);
+ }
}
}
return TRUE;
@@ -531,76 +368,63 @@ static gboolean handle_inotify_cb(GIOChannel *gio, GIOCondition condition, gpoin
&& worst_dir
) {
log("Size of '%s' >= %u MB, deleting '%s'", DEBUG_DUMPS_DIR, g_settings_nMaxCrashReportsSize, worst_dir);
- g_pCommLayer->QuotaExceed(_("The size of the report exceeded the quota. Please check system's MaxCrashReportsSize value in abrt.conf."));
+ send_dbus_sig_QuotaExceeded(_("The size of the report exceeded the quota. Please check system's MaxCrashReportsSize value in abrt.conf."));
/* deletes both directory and DB record */
char *d = concat_path_file(DEBUG_DUMPS_DIR, worst_dir);
free(worst_dir);
worst_dir = NULL;
- delete_crash_dump_dir(d);
+ delete_dump_dir(d);
free(d);
}
}
char *fullname = NULL;
- try
+ crash_data_t *crash_data = NULL;
+ fullname = concat_path_file(DEBUG_DUMPS_DIR, name);
+ mw_result_t res = LoadDebugDump(fullname, &crash_data);
+ switch (res)
{
- fullname = concat_path_file(DEBUG_DUMPS_DIR, name);
- map_crash_data_t crashinfo;
- mw_result_t res = LoadDebugDump(fullname, crashinfo);
- switch (res)
- {
- case MW_OK:
- log("New crash %s, processing", fullname);
- /* Fall through */
+ case MW_OK:
+ log("New crash %s, processing", fullname);
+ /* Fall through */
- case MW_OCCURRED: /* dup */
+ case MW_OCCURRED: /* dup */
+ {
+ if (res != MW_OK)
{
- if (res != MW_OK)
- {
- const char *first = get_crash_data_item_content_or_NULL(crashinfo, CD_DUMPDIR);
- log("Deleting crash %s (dup of %s), sending dbus signal",
- strrchr(fullname, '/') + 1,
- strrchr(first, '/') + 1);
- delete_crash_dump_dir(fullname);
- }
-
- const char *uid_str = get_crash_data_item_content_or_NULL(crashinfo, FILENAME_UID);
- const char *inform_all = get_crash_data_item_content_or_NULL(crashinfo, FILENAME_INFORMALL);
-
- if (inform_all && string_to_bool(inform_all))
- uid_str = NULL;
- char *crash_id = xasprintf("%s:%s",
- get_crash_data_item_content_or_NULL(crashinfo, FILENAME_UID),
- get_crash_data_item_content_or_NULL(crashinfo, FILENAME_UUID)
- );
- /* Send dbus signal */
- g_pCommLayer->Crash(get_crash_data_item_content_or_NULL(crashinfo, FILENAME_PACKAGE),
- crash_id, //TODO: stop passing this param, it is unused
- fullname,
- uid_str
- );
- free(crash_id);
- break;
+ const char *first = get_crash_item_content_or_NULL(crash_data, CD_DUMPDIR);
+ log("Deleting crash %s (dup of %s), sending dbus signal",
+ strrchr(fullname, '/') + 1,
+ strrchr(first, '/') + 1);
+ delete_dump_dir(fullname);
}
- case MW_CORRUPTED:
- case MW_GPG_ERROR:
- default:
- log("Corrupted or bad crash %s (res:%d), deleting", fullname, (int)res);
- delete_crash_dump_dir(fullname);
- break;
+
+ const char *uid_str = get_crash_item_content_or_NULL(crash_data, FILENAME_UID);
+ const char *inform_all = get_crash_item_content_or_NULL(crash_data, FILENAME_INFORMALL);
+
+ if (inform_all && string_to_bool(inform_all))
+ uid_str = NULL;
+ char *crash_id = xasprintf("%s:%s",
+ get_crash_item_content_or_NULL(crash_data, FILENAME_UID),
+ get_crash_item_content_or_NULL(crash_data, FILENAME_UUID)
+ );
+ send_dbus_sig_Crash(get_crash_item_content_or_NULL(crash_data, FILENAME_PACKAGE),
+ crash_id, //TODO: stop passing this param, it is unused
+ fullname,
+ uid_str
+ );
+ free(crash_id);
+ break;
}
- }
- catch (CABRTException& e)
- {
- error_msg("%s", e.what());
- }
- catch (...)
- {
- free(fullname);
- free(buf);
- throw;
+ case MW_CORRUPTED:
+ case MW_GPG_ERROR:
+ default:
+ log("Corrupted or bad crash %s (res:%d), deleting", fullname, (int)res);
+ delete_dump_dir(fullname);
+ break;
}
free(fullname);
+ free_crash_data(crash_data);
} /* while */
free(buf);
@@ -636,10 +460,10 @@ static void run_main_loop(GMainLoop* loop)
fds = (GPollFD *)xrealloc(fds, fds_size * sizeof(fds[0]));
}
- if (s_timeout)
+ if (s_timeout != 0)
alarm(s_timeout);
g_poll(fds, nfds, timeout);
- if (s_timeout)
+ if (s_timeout != 0)
alarm(0);
some_ready = g_main_context_check(context, max_priority, fds, nfds);
@@ -659,8 +483,9 @@ static void start_syslog_logging()
* Otherwise fprintf(stderr) dumps messages into random fds, etc. */
xdup2(STDIN_FILENO, STDOUT_FILENO);
xdup2(STDIN_FILENO, STDERR_FILENO);
- openlog("abrtd", 0, LOG_DAEMON);
+ openlog(PROGNAME, 0, LOG_DAEMON);
logmode = LOGMODE_SYSLOG;
+ putenv((char*)"ABRT_SYSLOG=1");
}
static void ensure_writable_dir(const char *dir, mode_t mode, const char *user)
@@ -690,28 +515,11 @@ static void sanitize_dump_dir_rights()
/* 00777 bits are usual "rwxrwxrwx" access rights */
ensure_writable_dir(DEBUG_DUMPS_DIR, 0755, "abrt");
/* debuginfo cache */
- ensure_writable_dir(DEBUG_INFO_DIR, 0755, "root");
+ ensure_writable_dir(DEBUG_INFO_DIR, 0775, "abrt");
/* temp dir */
ensure_writable_dir(VAR_RUN"/abrt", 0755, "root");
}
-static char *timeout_opt;
-static const char* abrtd_usage = _("abrtd [options]");
-enum {
- OPT_v = 1 << 0,
- OPT_d = 1 << 1,
- OPT_s = 1 << 2,
- OPT_t = 1 << 3,
-};
-/* Keep enum above and order of options below in sync! */
-static struct options abrtd_options[] = {
- OPT__VERBOSE(&g_verbose),
- OPT_BOOL( 'd' , 0, NULL, _("Do not daemonize")),
- OPT_BOOL( 's' , 0, NULL, _("Log to syslog even with -d")),
- OPT_INTEGER( 't' , 0, &timeout_opt, _("Exit after SEC seconds of inactivity")),
- OPT_END()
-};
-
int main(int argc, char** argv)
{
int parent_pid = getpid();
@@ -730,26 +538,37 @@ int main(int argc, char** argv)
if (env_verbose)
g_verbose = atoi(env_verbose);
- unsigned opts = parse_opts(argc, argv, abrtd_options, abrtd_usage);
-
- if (opts & OPT_s)
- start_syslog_logging();
-
+ const char *program_usage_string = _(
+ PROGNAME" [options]"
+ );
+ enum {
+ OPT_v = 1 << 0,
+ OPT_d = 1 << 1,
+ OPT_s = 1 << 2,
+ OPT_t = 1 << 3,
+ };
+ /* Keep enum above and order of options below in sync! */
+ struct options program_options[] = {
+ OPT__VERBOSE(&g_verbose),
+ OPT_BOOL( 'd', NULL, NULL , _("Do not daemonize")),
+ OPT_BOOL( 's', NULL, NULL , _("Log to syslog even with -d")),
+ OPT_INTEGER('t', NULL, &s_timeout, _("Exit after SEC seconds of inactivity")),
+ OPT_END()
+ };
+ unsigned opts = parse_opts(argc, argv, program_options, program_usage_string);
+
+ unsetenv("ABRT_SYSLOG");
+ putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
/* When dbus daemon starts us, it doesn't set PATH
* (I saw it set only DBUS_STARTER_ADDRESS and DBUS_STARTER_BUS_TYPE).
* In this case, set something sane:
*/
- /* Need to add LIBEXEC_DIR to PATH, because otherwise abrt-action-*
- * are not found by exec()
- */
const char *env_path = getenv("PATH");
if (!env_path || !env_path[0])
- env_path = "/usr/sbin:/usr/bin:/sbin:/bin";
- putenv(xasprintf("PATH=%s:%s", LIBEXEC_DIR, env_path));
-
- putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
-
- msg_prefix = "abrtd"; /* for log(), error_msg() and such */
+ putenv((char*)"PATH=/usr/sbin:/usr/bin:/sbin:/bin");
+ msg_prefix = PROGNAME; /* for log(), error_msg() and such */
+ if (opts & OPT_s)
+ start_syslog_logging();
xpipe(s_signal_pipe);
close_on_exec_on(s_signal_pipe[0]);
@@ -757,7 +576,7 @@ int main(int argc, char** argv)
signal(SIGTERM, handle_signal);
signal(SIGINT, handle_signal);
signal(SIGCHLD, handle_signal);
- if (s_timeout)
+ if (s_timeout != 0)
signal(SIGALRM, handle_signal);
/* Daemonize unless -d */
@@ -799,37 +618,43 @@ int main(int argc, char** argv)
guint channel_inotify_event_id = 0;
GIOChannel* channel_signal = NULL;
guint channel_signal_event_id = 0;
- bool lockfile_created = false;
bool pidfile_created = false;
- CCrashWatcher watcher;
/* Initialization */
try
{
- init_daemon_logging(&watcher);
+ init_daemon_logging();
VERB1 log("Loading settings");
- if (LoadSettings() != 0)
+ if (load_settings() != 0)
throw 1;
+ sanitize_dump_dir_rights();
+
VERB1 log("Creating glib main loop");
pMainloop = g_main_loop_new(NULL, FALSE);
VERB1 log("Initializing inotify");
- sanitize_dump_dir_rights();
errno = 0;
int inotify_fd = inotify_init();
if (inotify_fd == -1)
perror_msg_and_die("inotify_init failed");
close_on_exec_on(inotify_fd);
+
/* Watching DEBUG_DUMPS_DIR for new files... */
if (inotify_add_watch(inotify_fd, DEBUG_DUMPS_DIR, IN_CREATE | IN_MOVED_TO) < 0)
- perror_msg_and_die("inotify_add_watch failed on '%s'", DEBUG_DUMPS_DIR);
+ {
+ perror_msg("inotify_add_watch failed on '%s'", DEBUG_DUMPS_DIR);
+ throw 1;
+ }
if (g_settings_sWatchCrashdumpArchiveDir)
{
s_upload_watch = inotify_add_watch(inotify_fd, g_settings_sWatchCrashdumpArchiveDir, IN_CLOSE_WRITE|IN_MOVED_TO);
if (s_upload_watch < 0)
- perror_msg_and_die("inotify_add_watch failed on '%s'", g_settings_sWatchCrashdumpArchiveDir);
+ {
+ perror_msg("inotify_add_watch failed on '%s'", g_settings_sWatchCrashdumpArchiveDir);
+ throw 1;
+ }
}
VERB1 log("Adding inotify watch to glib main loop");
channel_inotify = g_io_channel_unix_new(inotify_fd);
@@ -838,13 +663,6 @@ int main(int argc, char** argv)
handle_inotify_cb,
NULL);
- VERB1 log("Loading plugins from "PLUGINS_LIB_DIR);
- g_pPluginManager = new CPluginManager();
- g_pPluginManager->LoadPlugins();
-
- if (SetUpCron() != 0)
- throw 1;
-
/* Add an event source which waits for INT/TERM signal */
VERB1 log("Adding signal pipe watch to glib main loop");
channel_signal = g_io_channel_unix_new(s_signal_pipe[0]);
@@ -854,12 +672,8 @@ int main(int argc, char** argv)
NULL);
/* Mark the territory */
- VERB1 log("Creating lock file");
- if (Lock() != 0)
- throw 1;
- lockfile_created = true;
VERB1 log("Creating pid file");
- if (CreatePidFile() != 0)
+ if (create_pidfile() != 0)
throw 1;
pidfile_created = true;
@@ -870,8 +684,7 @@ int main(int argc, char** argv)
* therefore it should be the last thing to initialize.
*/
VERB1 log("Initializing dbus");
- g_pCommLayer = new CCommLayerServerDBus();
- if (g_pCommLayer->m_init_error)
+ if (init_dbus() != 0)
throw 1;
}
catch (...)
@@ -896,21 +709,26 @@ int main(int argc, char** argv)
/* Only now we want signal pipe to work */
s_signal_pipe_write = s_signal_pipe[1];
- /* Enter the event loop */
- try
- {
- log("Init complete, entering main loop");
- run_main_loop(pMainloop);
- }
- catch (CABRTException& e)
+ if (g_settings_sLogScanners)
{
- error_msg("Error: %s", e.what());
- }
- catch (std::exception& e)
- {
- error_msg("Error: %s", e.what());
+ const char *scanner_argv[] = {
+ "/bin/sh", "-c",
+ g_settings_sLogScanners,
+ NULL
+ };
+ log_scanner_pid = fork_execv_on_steroids(EXECFLG_INPUT_NUL,
+ (char**)scanner_argv,
+ /*pipefds:*/ NULL,
+ /*unsetenv_vec:*/ NULL,
+ /*dir:*/ NULL,
+ /*uid:*/ 0);
+ VERB1 log("Started log scanner, pid:%d", (int)log_scanner_pid);
}
+ /* Enter the event loop */
+ log("Init complete, entering main loop");
+ run_main_loop(pMainloop);
+
cleanup:
/* Error or INT/TERM. Clean up, in reverse order.
* Take care to not undo things we did not do.
@@ -918,8 +736,6 @@ int main(int argc, char** argv)
dumpsocket_shutdown();
if (pidfile_created)
unlink(VAR_RUN_PIDFILE);
- if (lockfile_created)
- unlink(VAR_RUN_LOCK_FILE);
if (channel_signal_event_id > 0)
g_source_remove(channel_signal_event_id);
@@ -930,21 +746,23 @@ int main(int argc, char** argv)
if (channel_inotify)
g_io_channel_unref(channel_inotify);
- delete g_pCommLayer;
- if (g_pPluginManager)
- {
- /* This restores /proc/sys/kernel/core_pattern, among other things: */
- g_pPluginManager->UnLoadPlugins();
- delete g_pPluginManager;
- }
+ deinit_dbus();
+
if (pMainloop)
g_main_loop_unref(pMainloop);
- settings_free();
+ free_settings();
+
+ if (log_scanner_pid > 0)
+ {
+ VERB2 log("Sending SIGTERM to %d", log_scanner_pid);
+ kill(log_scanner_pid, SIGTERM);
+ }
+
/* Exiting */
if (s_sig_caught && s_sig_caught != SIGALRM && s_sig_caught != SIGCHLD)
{
- error_msg_and_die("Got signal %d, exiting", s_sig_caught);
+ error_msg("Got signal %d, exiting", s_sig_caught);
signal(s_sig_caught, SIG_DFL);
raise(s_sig_caught);
}
diff --git a/src/daemon/Makefile.am b/src/daemon/Makefile.am
index 34c7aa7b..6fe73065 100644
--- a/src/daemon/Makefile.am
+++ b/src/daemon/Makefile.am
@@ -1,24 +1,22 @@
bin_SCRIPTS = \
abrt-handle-upload
-libexec_PROGRAMS = \
- abrt-action-save-package-data
bin_PROGRAMS = \
- abrt-handle-crashdump
+ abrt-handle-crashdump \
+ abrt-action-save-package-data
-sbin_PROGRAMS = abrtd \
+sbin_PROGRAMS = \
+ abrtd \
abrt-server
abrtd_SOURCES = \
- PluginManager.h PluginManager.cpp \
MiddleWare.h MiddleWare.cpp \
- CrashWatcher.h CrashWatcher.cpp \
- CommLayerServer.h CommLayerServer.cpp \
CommLayerServerDBus.h CommLayerServerDBus.cpp \
Settings.h Settings.cpp \
- Daemon.h Daemon.cpp
+ comm_layer_inner.h comm_layer_inner.cpp \
+ Daemon.cpp
abrtd_CPPFLAGS = \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-I$(srcdir)/../lib \
-DBIN_DIR=\"$(bindir)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
@@ -36,14 +34,13 @@ abrtd_CPPFLAGS = \
abrtd_LDADD = \
$(DL_LIBS) \
$(DBUS_LIBS) \
- ../lib/libabrt.la \
- ../lib/libabrt_daemon.la \
+ ../lib/libreport.la \
../lib/libabrt_dbus.la
abrt_server_SOURCES = \
abrt-server.c
abrt_server_CPPFLAGS = \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-I$(srcdir)/../lib \
-DBIN_DIR=\"$(bindir)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
@@ -52,15 +49,16 @@ abrt_server_CPPFLAGS = \
-DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \
-DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
+ $(GLIB_CFLAGS) \
-D_GNU_SOURCE \
-Wall -Werror
abrt_server_LDADD = \
- ../lib/libabrt.la
+ ../lib/libreport.la
abrt_handle_crashdump_SOURCES = \
abrt-handle-crashdump.c
abrt_handle_crashdump_CPPFLAGS = \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-I$(srcdir)/../lib \
-DBIN_DIR=\"$(bindir)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
@@ -71,17 +69,18 @@ abrt_handle_crashdump_CPPFLAGS = \
-DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
-DLIBEXEC_DIR=\"$(LIBEXEC_DIR)\" \
+ $(GLIB_CFLAGS) \
-D_GNU_SOURCE \
-Wall -Werror
abrt_handle_crashdump_LDADD = \
- ../lib/libabrt.la
+ ../lib/libreport.la
abrt_action_save_package_data_SOURCES = \
rpm.h rpm.c \
Settings.h Settings.cpp \
- abrt-action-save-package-data.cpp
+ abrt-action-save-package-data.c
abrt_action_save_package_data_CPPFLAGS = \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-I$(srcdir)/../lib \
-DBIN_DIR=\"$(bindir)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
@@ -96,7 +95,7 @@ abrt_action_save_package_data_CPPFLAGS = \
-Wall -Werror
abrt_action_save_package_data_LDADD = \
$(RPM_LIBS) \
- ../lib/libabrt.la
+ ../lib/libreport.la
dbusabrtconfdir = ${sysconfdir}/dbus-1/system.d/
dist_dbusabrtconf_DATA = dbus-abrt.conf
diff --git a/src/daemon/MiddleWare.cpp b/src/daemon/MiddleWare.cpp
index ee2853b2..2757d84f 100644
--- a/src/daemon/MiddleWare.cpp
+++ b/src/daemon/MiddleWare.cpp
@@ -19,32 +19,21 @@
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "abrtlib.h"
-#include "Daemon.h"
#include "Settings.h"
-#include "abrt_exception.h"
#include "comm_layer_inner.h"
-#include "CommLayerServer.h"
+#include "CommLayerServerDBus.h"
#include "MiddleWare.h"
using namespace std;
/**
- * An instance of CPluginManager. When MiddleWare wants to do something
- * with plugins, it calls the plugin manager.
- * @see PluginManager.h
- */
-CPluginManager* g_pPluginManager;
-
-
-/**
* Get one crash info. If getting is successful,
* then crash info is filled.
* @param dump_dir_name A dump dir containing all necessary data.
* @param pCrashData A crash info.
* @return It return results of operation. See mw_result_t.
*/
-static mw_result_t FillCrashInfo(const char *dump_dir_name,
- map_crash_data_t& pCrashData);
+static crash_data_t *FillCrashInfo(const char *dump_dir_name);
/**
* Transforms a debugdump directory to inner crash
@@ -52,36 +41,53 @@ static mw_result_t FillCrashInfo(const char *dump_dir_name,
* @param dump_dir_name A debugdump dir containing all necessary data.
* @param pCrashData A created crash report.
*/
-static bool DebugDumpToCrashReport(const char *dump_dir_name, map_crash_data_t& pCrashData)
+static crash_data_t *DebugDumpToCrashReport(const char *dump_dir_name)
{
VERB3 log(" DebugDumpToCrashReport('%s')", dump_dir_name);
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
- return false;
-
+ return NULL;
+
+ static const char *const must_have_files[] = {
+ FILENAME_ARCHITECTURE,
+ FILENAME_KERNEL ,
+ FILENAME_PACKAGE ,
+ FILENAME_COMPONENT ,
+ FILENAME_OS_RELEASE ,
+ FILENAME_EXECUTABLE ,
+ NULL
+ };
const char *const *v = must_have_files;
while (*v)
{
if (!dd_exist(dd, *v))
{
+ /* Old dump dir format compat. Remove in abrt-2.1 */
+ if (strcmp(*v, FILENAME_OS_RELEASE) == 0)
+ if (dd_exist(dd, "release"))
+ goto ok;
+
dd_close(dd);
log("Important file '%s/%s' is missing", dump_dir_name, *v);
- return false;
+ return NULL;
}
+ ok:
v++;
}
- load_crash_data_from_crash_dump_dir(dd, pCrashData);
+ crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
char *events = list_possible_events(dd, NULL, "");
dd_close(dd);
- add_to_crash_data_ext(pCrashData, CD_EVENTS, CD_SYS, CD_ISNOTEDITABLE, events);
+ add_to_crash_data_ext(crash_data, CD_EVENTS, events,
+ CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE);
free(events);
- add_to_crash_data_ext(pCrashData, CD_DUMPDIR, CD_SYS, CD_ISNOTEDITABLE, dump_dir_name);
+ add_to_crash_data_ext(crash_data, CD_DUMPDIR, dump_dir_name,
+ CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE);
- return true;
+ return crash_data;
}
static char *do_log_and_update_client(char *log_line, void *param)
@@ -91,22 +97,36 @@ static char *do_log_and_update_client(char *log_line, void *param)
return log_line;
}
+/**
+ * Takes care of getting all additional data needed
+ * for computing UUIDs and creating a report for particular analyzer
+ * plugin. This report could be send somewhere afterwards. If a creation
+ * is successful, then a crash report is filled.
+ * @param pAnalyzer A name of an analyzer plugin.
+ * @param pDebugDumpPath A debugdump dir containing all necessary data.
+ * @param pCrashData A filled crash report.
+ * @return It return results of operation. See mw_result_t.
+ */
/*
* Called in two cases:
* (1) by StartJob dbus call -> CreateReportThread(), in the thread
* (2) by CreateReport dbus call
*/
-mw_result_t CreateCrashReport(const char *dump_dir_name,
+static mw_result_t CreateCrashReport(const char *dump_dir_name,
long caller_uid,
int force,
- map_crash_data_t& pCrashData)
+ crash_data_t **crash_data)
{
- VERB2 log("CreateCrashReport('%s',%ld,result)", dump_dir_name, caller_uid);
+ VERB2 log("CreateCrashReport('%s',%ld)", dump_dir_name, caller_uid);
+
+ *crash_data = NULL;
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
return MW_NOENT_ERROR;
+ struct run_event_state *run_state;
+ int res;
mw_result_t r = MW_OK;
if (caller_uid != 0) /* not called by root */
@@ -131,63 +151,33 @@ mw_result_t CreateCrashReport(const char *dump_dir_name,
}
dd_close(dd);
- try
+ run_state = new_run_event_state();
+ run_state->logging_callback = do_log_and_update_client;
+ res = run_event_on_dir_name(run_state, dump_dir_name, force ? "reanalyze" : "analyze");
+ free_run_event_state(run_state);
+ if (res != 0)
{
- struct run_event_state *run_state = new_run_event_state();
- run_state->logging_callback = do_log_and_update_client;
- int res = run_event(run_state, dump_dir_name, force ? "reanalyze" : "analyze");
- free_run_event_state(run_state);
- if (res != 0 && res != -1) /* -1 is "nothing was done", here it is ok */
- {
- r = MW_PLUGIN_ERROR;
- goto ret;
- }
-
- /* Do a load_crash_data_from_crash_dump_dir from (possibly updated)
- * crash dump dir
- */
- if (!DebugDumpToCrashReport(dump_dir_name, pCrashData))
- {
- error_msg("Error loading crash data");
- r = MW_ERROR;
- goto ret;
- }
+ r = MW_PLUGIN_ERROR;
+ goto ret;
}
- catch (CABRTException& e)
+
+ /* Do a create_crash_data_from_dump_dir from (possibly updated)
+ * crash dump dir
+ */
+ *crash_data = DebugDumpToCrashReport(dump_dir_name);
+ if (!*crash_data)
{
- r = MW_CORRUPTED;
- error_msg("%s", e.what());
- if (e.type() == EXCEP_PLUGIN)
- {
- r = MW_PLUGIN_ERROR;
- }
+ error_msg("Error loading crash data");
+ r = MW_ERROR;
}
ret:
+ if (*crash_data == NULL)
+ *crash_data = new_crash_data();
VERB3 log("CreateCrashReport() returns %d", r);
return r;
}
-void RunAction(const char *pActionDir,
- const char *pPluginName,
- const char *pPluginArgs)
-{
- CAction* action = g_pPluginManager->GetAction(pPluginName);
- if (!action)
- {
- /* GetAction() already complained */
- return;
- }
- try
- {
- action->Run(pActionDir, pPluginArgs, /*force:*/ 0);
- }
- catch (CABRTException& e)
- {
- error_msg("Execution of '%s' was not successful: %s", pPluginName, e.what());
- }
-}
-
struct logging_state {
char *last_line;
};
@@ -205,43 +195,55 @@ static char *do_log_and_save_line(char *log_line, void *param)
// Do not trust client_report here!
// dbus handler passes it from user without checking
-report_status_t Report(const map_crash_data_t& client_report,
+report_status_t Report(crash_data_t *client_report,
const vector_string_t& events,
const map_map_string_t& settings,
long caller_uid)
{
- // Get ID fields
- const char *UID = get_crash_data_item_content_or_NULL(client_report, FILENAME_UID);
- const char *dump_dir_name = get_crash_data_item_content_or_NULL(client_report, CD_DUMPDIR);
- if (!UID || !dump_dir_name)
+ report_status_t ret;
+ const char *dump_dir_name = get_crash_item_content_or_NULL(client_report, CD_DUMPDIR);
+ if (!dump_dir_name)
{
- throw CABRTException(EXCEP_ERROR, "Report(): UID or DUMPDIR is missing in client's report data");
+ update_client("Reporting error: %s", "DUMPDIR is missing in client's report data");
+ ret[""].push_back("0"); // REPORT_STATUS_IDX_FLAG
+ ret[""].push_back("DUMPDIR is missing in client's report data"); // REPORT_STATUS_IDX_MSG
+ return ret;
}
// Retrieve corresponding stored record
- map_crash_data_t stored_report;
- mw_result_t r = FillCrashInfo(dump_dir_name, stored_report);
- if (r != MW_OK)
+ crash_data_t *stored_report = FillCrashInfo(dump_dir_name);
+ if (!stored_report)
{
return report_status_t();
}
// Is it allowed for this user to report?
- if (caller_uid != 0 // not called by root
- && strcmp(to_string(caller_uid).c_str(), UID) != 0
- ) {
- const char *inform_all = get_crash_data_item_content_or_NULL(stored_report, FILENAME_INFORMALL);
- if (!inform_all || !string_to_bool(inform_all))
- throw CABRTException(EXCEP_ERROR, "Report(): user with uid %ld can't report crash %s",
- caller_uid, dump_dir_name);
+ if (caller_uid != 0) // not called by root
+ {
+ char caller_uid_str[sizeof(long)*3 + 2];
+ sprintf(caller_uid_str, "%ld", caller_uid);
+ if (strcmp(caller_uid_str, get_crash_item_content_or_die(stored_report, FILENAME_UID)) != 0)
+ {
+ const char *inform_all = get_crash_item_content_or_NULL(stored_report, FILENAME_INFORMALL);
+ if (!inform_all || !string_to_bool(inform_all))
+ {
+ free_crash_data(stored_report);
+ char *errmsg = xasprintf("user with uid %ld can't report crash %s", caller_uid, dump_dir_name);
+ update_client("Reporting error: %s", errmsg);
+ ret[""].push_back("0"); // REPORT_STATUS_IDX_FLAG
+ ret[""].push_back(errmsg); // REPORT_STATUS_IDX_MSG
+ free(errmsg);
+ return ret;
+ }
+ }
}
// Save comment, "how to reproduce", backtrace
//TODO: we should iterate through stored_report and modify all
//modifiable fields which have new data in client_report
- const char *comment = get_crash_data_item_content_or_NULL(client_report, FILENAME_COMMENT);
- const char *reproduce = get_crash_data_item_content_or_NULL(client_report, FILENAME_REPRODUCE);
- const char *backtrace = get_crash_data_item_content_or_NULL(client_report, FILENAME_BACKTRACE);
+ const char *comment = get_crash_item_content_or_NULL(client_report, FILENAME_COMMENT);
+ const char *reproduce = get_crash_item_content_or_NULL(client_report, FILENAME_REPRODUCE);
+ const char *backtrace = get_crash_item_content_or_NULL(client_report, FILENAME_BACKTRACE);
if (comment || reproduce || backtrace)
{
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
@@ -250,45 +252,47 @@ report_status_t Report(const map_crash_data_t& client_report,
if (comment)
{
dd_save_text(dd, FILENAME_COMMENT, comment);
- add_to_crash_data_ext(stored_report, FILENAME_COMMENT, CD_TXT, CD_ISEDITABLE, comment);
+ add_to_crash_data_ext(stored_report, FILENAME_COMMENT, comment, CD_FLAG_TXT + CD_FLAG_ISEDITABLE);
}
if (reproduce)
{
dd_save_text(dd, FILENAME_REPRODUCE, reproduce);
- add_to_crash_data_ext(stored_report, FILENAME_REPRODUCE, CD_TXT, CD_ISEDITABLE, reproduce);
+ add_to_crash_data_ext(stored_report, FILENAME_REPRODUCE, reproduce, CD_FLAG_TXT + CD_FLAG_ISEDITABLE);
}
if (backtrace)
{
dd_save_text(dd, FILENAME_BACKTRACE, backtrace);
- add_to_crash_data_ext(stored_report, FILENAME_BACKTRACE, CD_TXT, CD_ISEDITABLE, backtrace);
+ add_to_crash_data_ext(stored_report, FILENAME_BACKTRACE, backtrace, CD_FLAG_TXT + CD_FLAG_ISEDITABLE);
}
dd_close(dd);
}
}
/* Remove BIN filenames from stored_report if they are not present in client's data */
- map_crash_data_t::const_iterator its = stored_report.begin();
- while (its != stored_report.end())
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, stored_report);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
{
- if (its->second[CD_TYPE] == CD_BIN)
+ if (value->flags & CD_FLAG_BIN)
{
- std::string key = its->first;
- if (get_crash_data_item_content_or_NULL(client_report, key.c_str()) == NULL)
+ if (get_crash_item_content_or_NULL(client_report, name) == NULL)
{
/* client does not have it -> does not want it passed to events */
- VERB3 log("Won't report BIN file %s:'%s'", key.c_str(), its->second[CD_CONTENT].c_str());
- its++; /* move off the element we will erase */
- stored_report.erase(key);
+ VERB3 log("Won't report BIN file %s:'%s'", name, value->content);
+ g_hash_table_iter_remove(&iter);
continue;
}
}
- its++;
}
VERB3 {
- log_map_crash_data(client_report, " client_report");
- log_map_crash_data(stored_report, " stored_report");
+ log_crash_data(client_report, " client_report");
+ log_crash_data(stored_report, " stored_report");
}
+ free_crash_data(stored_report);
+#define stored_report stored_report_must_not_be_used_below
#define client_report client_report_must_not_be_used_below
// Export overridden settings as environment variables
@@ -310,7 +314,6 @@ report_status_t Report(const map_crash_data_t& client_report,
// Run events
bool at_least_one_reporter_succeeded = false;
- report_status_t ret;
std::string message;
struct logging_state l_state;
struct run_event_state *run_state = new_run_event_state();
@@ -321,10 +324,11 @@ report_status_t Report(const map_crash_data_t& client_report,
std::string event = events[i];
l_state.last_line = NULL;
- int r = run_event(run_state, dump_dir_name, event.c_str());
- if (r == -1)
+ int r = run_event_on_dir_name(run_state, dump_dir_name, event.c_str());
+ if (r == 0 && run_state->children_count == 0)
{
l_state.last_line = xasprintf("Error: no processing is specified for event '%s'", event.c_str());
+ r = -1;
}
if (r == 0)
{
@@ -390,6 +394,7 @@ report_status_t Report(const map_crash_data_t& client_report,
}
return ret;
+#undef stored_report
#undef client_report
}
@@ -470,8 +475,7 @@ static char *do_log(char *log_line, void *param)
return log_line;
}
-mw_result_t LoadDebugDump(const char *dump_dir_name,
- map_crash_data_t& pCrashData)
+mw_result_t LoadDebugDump(const char *dump_dir_name, crash_data_t **crash_data)
{
mw_result_t res;
@@ -492,7 +496,7 @@ mw_result_t LoadDebugDump(const char *dump_dir_name,
run_state->post_run_callback = is_crash_a_dup;
run_state->post_run_param = &state;
run_state->logging_callback = do_log;
- int r = run_event(run_state, dump_dir_name, "post-create");
+ int r = run_event_on_dir_name(run_state, dump_dir_name, "post-create");
free_run_event_state(run_state);
//TODO: consider this case:
@@ -527,7 +531,7 @@ mw_result_t LoadDebugDump(const char *dump_dir_name,
dump_dir_name = state.crash_dump_dup_name;
}
- /* Loads pCrashData (from the *first debugdump dir* if this one is a dup)
+ /* Loads crash_data (from the *first debugdump dir* if this one is a dup)
* Returns:
* MW_OCCURRED: "crash count is != 1" (iow: it is > 1 - dup)
* MW_OK: "crash count is 1" (iow: this is a new crash, not a dup)
@@ -548,9 +552,10 @@ mw_result_t LoadDebugDump(const char *dump_dir_name,
dd_save_text(dd, FILENAME_COUNT, new_count_str);
dd_close(dd);
- res = FillCrashInfo(dump_dir_name, pCrashData);
- if (res == MW_OK)
+ *crash_data = FillCrashInfo(dump_dir_name);
+ if (*crash_data != NULL)
{
+ res = MW_OK;
if (count > 1)
{
log("Crash dump is a duplicate of %s", dump_dir_name);
@@ -568,99 +573,89 @@ mw_result_t LoadDebugDump(const char *dump_dir_name,
return res;
}
-static mw_result_t FillCrashInfo(const char *dump_dir_name,
- map_crash_data_t& pCrashData)
+static crash_data_t *FillCrashInfo(const char *dump_dir_name)
{
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
- return MW_ERROR;
+ return NULL;
- load_crash_data_from_crash_dump_dir(dd, pCrashData);
+ crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
char *events = list_possible_events(dd, NULL, "");
dd_close(dd);
- add_to_crash_data_ext(pCrashData, CD_EVENTS, CD_SYS, CD_ISNOTEDITABLE, events);
+ add_to_crash_data_ext(crash_data, CD_EVENTS, events,
+ CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE);
free(events);
- add_to_crash_data_ext(pCrashData, CD_DUMPDIR, CD_SYS, CD_ISNOTEDITABLE, dump_dir_name);
+ add_to_crash_data_ext(crash_data, CD_DUMPDIR, dump_dir_name,
+ CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE);
- return MW_OK;
+ return crash_data;
}
-vector_map_crash_data_t GetCrashInfos(long caller_uid)
+vector_of_crash_data_t *GetCrashInfos(long caller_uid)
{
- vector_map_crash_data_t retval;
+ vector_of_crash_data_t *retval = new_vector_of_crash_data();
log("Getting crash infos...");
DIR *dir = opendir(DEBUG_DUMPS_DIR);
if (dir != NULL)
{
- try
+ struct dirent *dent;
+ while ((dent = readdir(dir)) != NULL)
{
- struct dirent *dent;
- while ((dent = readdir(dir)) != NULL)
- {
- if (dot_or_dotdot(dent->d_name))
- continue; /* skip "." and ".." */
+ if (dot_or_dotdot(dent->d_name))
+ continue; /* skip "." and ".." */
- char *dump_dir_name = concat_path_file(DEBUG_DUMPS_DIR, dent->d_name);
+ char *dump_dir_name = concat_path_file(DEBUG_DUMPS_DIR, dent->d_name);
- struct stat statbuf;
- if (stat(dump_dir_name, &statbuf) != 0
- || !S_ISDIR(statbuf.st_mode)
- ) {
- goto next; /* not a dir, skip */
- }
+ struct stat statbuf;
+ if (stat(dump_dir_name, &statbuf) != 0
+ || !S_ISDIR(statbuf.st_mode)
+ ) {
+ goto next; /* not a dir, skip */
+ }
- /* Skip directories which are not for this uid */
- if (caller_uid != 0) /* not called by root? */
- {
- char *uid;
- char caller_uid_str[sizeof(long) * 3 + 2];
+ /* Skip directories which are not for this uid */
+ if (caller_uid != 0) /* not called by root? */
+ {
+ char *uid;
+ char caller_uid_str[sizeof(long) * 3 + 2];
- struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
- if (!dd)
- goto next;
+ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
+ if (!dd)
+ goto next;
- sprintf(caller_uid_str, "%ld", caller_uid);
- uid = dd_load_text(dd, FILENAME_UID);
- if (strcmp(uid, caller_uid_str) != 0)
+ sprintf(caller_uid_str, "%ld", caller_uid);
+ uid = dd_load_text(dd, FILENAME_UID);
+ if (strcmp(uid, caller_uid_str) != 0)
+ {
+ char *inform_all = dd_load_text_ext(dd, FILENAME_INFORMALL, DD_FAIL_QUIETLY);
+ bool for_all = string_to_bool(inform_all);
+ free(inform_all);
+ if (!for_all)
{
- char *inform_all = dd_load_text_ext(dd, FILENAME_INFORMALL, DD_FAIL_QUIETLY);
- bool for_all = string_to_bool(inform_all);
- free(inform_all);
- if (!for_all)
- {
- dd_close(dd);
- goto next;
- }
+ dd_close(dd);
+ goto next;
}
- dd_close(dd);
}
+ dd_close(dd);
+ }
+ {
+ crash_data_t *crash_data = FillCrashInfo(dump_dir_name);
+ if (!crash_data)
{
- map_crash_data_t info;
- mw_result_t res = FillCrashInfo(dump_dir_name, info);
- switch (res)
- {
- case MW_OK:
- retval.push_back(info);
- break;
- case MW_ERROR:
- error_msg("Dump directory %s doesn't exist or misses crucial files, deleting", dump_dir_name);
- delete_crash_dump_dir(dump_dir_name);
- break;
- default:
- break;
- }
+ error_msg("Dump directory %s doesn't exist or misses crucial files, deleting", dump_dir_name);
+ delete_dump_dir(dump_dir_name);
+ }
+ else
+ {
+ g_ptr_array_add(retval, crash_data);
}
- next:
- free(dump_dir_name);
}
- }
- catch (CABRTException& e)
- {
- error_msg("%s", e.what());
+ next:
+ free(dump_dir_name);
}
closedir(dir);
}
@@ -676,14 +671,14 @@ vector_map_crash_data_t GetCrashInfos(long caller_uid)
* StartJob dbus call already did all the processing, and we just retrieve
* the result from dump directory, which is fast.
*/
-void CreateReport(const char* crash_id, long caller_uid, int force, map_crash_data_t& crashReport)
+void CreateReport(const char* crash_id, long caller_uid, int force, crash_data_t **crash_data)
{
/* FIXME: starting from here, any shared data must be protected with a mutex. */
- mw_result_t res = CreateCrashReport(crash_id, caller_uid, force, crashReport);
+ mw_result_t res = CreateCrashReport(crash_id, caller_uid, force, crash_data);
switch (res)
{
case MW_OK:
- VERB2 log_map_crash_data(crashReport, "crashReport");
+ VERB2 log_crash_data(*crash_data, "crashReport");
break;
case MW_NOENT_ERROR:
error_msg("Can't find crash with id '%s'", crash_id);
@@ -715,18 +710,10 @@ static void* create_report(void* arg)
/* Client name is per-thread, need to set it */
set_client_name(thread_data->peer);
- try
- {
- log("Creating report...");
- map_crash_data_t crashReport;
- CreateReport(thread_data->crash_id, thread_data->caller_uid, thread_data->force, crashReport);
- g_pCommLayer->JobDone(thread_data->peer);
- }
- catch (CABRTException& e)
- {
- error_msg("%s", e.what());
- }
- catch (...) {}
+ log("Creating report...");
+ crash_data_t *crash_data = NULL;
+ CreateReport(thread_data->crash_id, thread_data->caller_uid, thread_data->force, &crash_data);
+ send_dbus_sig_JobDone(thread_data->peer);
set_client_name(NULL);
/* free strduped strings */
@@ -805,10 +792,10 @@ void GetPluginsInfo(map_map_string_t &map_of_plugin_info)
struct dirent *dent;
while ((dent = readdir(dir)) != NULL)
{
- if (!is_regular_file(dent, PLUGINS_CONF_DIR))
- continue;
char *ext = strrchr(dent->d_name, '.');
- if (!ext || strcmp(ext + 1, PLUGINS_CONF_EXTENSION) != 0)
+ if (!ext || strcmp(ext + 1, "conf") != 0)
+ continue;
+ if (!is_regular_file(dent, PLUGINS_CONF_DIR))
continue;
VERB3 log("Found %s", dent->d_name);
*ext = '\0';
@@ -853,10 +840,12 @@ void GetPluginsInfo(map_map_string_t &map_of_plugin_info)
closedir(dir);
}
-void GetPluginSettings(const char *plugin_name, map_plugin_settings_t &plugin_settings)
+map_string_h *GetPluginSettings(const char *plugin_name)
{
char *conf_file = xasprintf(PLUGINS_CONF_DIR"/%s.conf", plugin_name);
- if (LoadPluginSettings(conf_file, plugin_settings, /*skip w/o value:*/ false))
+ map_string_h *settings = new_map_string();
+ if (load_conf_file(conf_file, settings, /*skip w/o value:*/ false))
VERB3 log("Loaded %s.conf", plugin_name);
free(conf_file);
+ return settings;
}
diff --git a/src/daemon/MiddleWare.h b/src/daemon/MiddleWare.h
index 808d7be4..fde29978 100644
--- a/src/daemon/MiddleWare.h
+++ b/src/daemon/MiddleWare.h
@@ -23,7 +23,6 @@
#define MIDDLEWARE_H_
#include "abrt_types.h"
-#include "PluginManager.h"
/**
* An enum contains all return codes.
@@ -46,29 +45,6 @@ typedef enum {
/**
- * Takes care of getting all additional data needed
- * for computing UUIDs and creating a report for particular analyzer
- * plugin. This report could be send somewhere afterwards. If a creation
- * is successful, then a crash report is filled.
- * @param pAnalyzer A name of an analyzer plugin.
- * @param pDebugDumpPath A debugdump dir containing all necessary data.
- * @param pCrashData A filled crash report.
- * @return It return results of operation. See mw_result_t.
- */
-mw_result_t CreateCrashReport(const char *dump_dir_name,
- long caller_uid,
- int force,
- map_crash_data_t& pCrashData);
-/**
- * Activates particular action plugin.
- * @param pActionDir A directory, which is passed as working to a action plugin.
- * @param pPluginName An action plugin name.
- * @param pPluginArgs Action plugin's arguments.
- */
-void RunAction(const char *pActionDir,
- const char *pPluginName,
- const char *pPluginArgs);
-/**
* Reports a crash report to particular receiver. It
* takes an user uid, tries to find user config file and load it. If it
* fails, then default config is used. If pUID is emply string, default
@@ -76,16 +52,14 @@ void RunAction(const char *pActionDir,
* ...).
* @param crash_data
* A crash report.
- * @param reporters
- * List of allowed reporters. Which reporters will be used depends
- * on the analyzer of the crash_data. Reporters missing from this list
- * will not be used.
+ * @param events
+ * List of events to run.
* @param caller_uid
* An user uid.
* @return
- * A report status, which reporters ends successfuly with messages.
+ * A report status: which events finished successfully, with messages.
*/
-report_status_t Report(const map_crash_data_t& crash_data,
+report_status_t Report(crash_data_t *crash_data,
const vector_string_t& events,
const map_map_string_t& settings,
long caller_uid);
@@ -97,15 +71,14 @@ report_status_t Report(const map_crash_data_t& crash_data,
* @param pCrashData A crash info.
* @return It return results of operation. See mw_result_t.
*/
-mw_result_t LoadDebugDump(const char *dump_dir_name,
- map_crash_data_t& pCrashData);
+mw_result_t LoadDebugDump(const char *dump_dir_name, crash_data_t **crash_data);
-vector_map_crash_data_t GetCrashInfos(long caller_uid);
+vector_of_crash_data_t *GetCrashInfos(long caller_uid);
int CreateReportThread(const char* dump_dir_name, long caller_uid, int force, const char* pSender);
-void CreateReport(const char* dump_dir_name, long caller_uid, int force, map_crash_data_t&);
+void CreateReport(const char* dump_dir_name, long caller_uid, int force, crash_data_t **crash_data);
int DeleteDebugDump(const char *dump_dir_name, long caller_uid);
void GetPluginsInfo(map_map_string_t &map_of_plugin_info);
-void GetPluginSettings(const char *plugin_name, map_plugin_settings_t &plugin_settings);
+map_string_h *GetPluginSettings(const char *plugin_name);
#endif /*MIDDLEWARE_H_*/
diff --git a/src/daemon/PluginManager.cpp b/src/daemon/PluginManager.cpp
deleted file mode 100644
index 665a4625..00000000
--- a/src/daemon/PluginManager.cpp
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- PluginManager.cpp
-
- Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com)
- Copyright (C) 2009 RedHat inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#include <dlfcn.h>
-#include "abrtlib.h"
-#include "abrt_exception.h"
-#include "PluginManager.h"
-
-using namespace std;
-
-
-/**
- * CLoadedModule class. A class which contains a loaded plugin.
- */
-class CLoadedModule
-{
- private:
- /* dlopen'ed library */
- void *m_pHandle;
- const plugin_info_t *m_pPluginInfo;
- CPlugin* (*m_pFnPluginNew)();
-
- public:
- CLoadedModule(void *handle, const char *mod_name);
- ~CLoadedModule() { dlclose(m_pHandle); }
- int GetMagicNumber() { return m_pPluginInfo->m_nMagicNumber; }
- const char *GetVersion() { return m_pPluginInfo->m_sVersion; }
- const char *GetName() { return m_pPluginInfo->m_sName; }
- const char *GetDescription() { return m_pPluginInfo->m_sDescription; }
- const char *GetEmail() { return m_pPluginInfo->m_sEmail; }
- const char *GetWWW() { return m_pPluginInfo->m_sWWW; }
- const char *GetGTKBuilder() { return m_pPluginInfo->m_sGTKBuilder; }
- plugin_type_t GetType() { return m_pPluginInfo->m_Type; }
- CPlugin *PluginNew() { return m_pFnPluginNew(); }
-};
-CLoadedModule::CLoadedModule(void *handle, const char *mod_name)
-{
- m_pHandle = handle;
- /* All errors are fatal */
-#define LOADSYM(fp, handle, name) \
- do { \
- fp = (typeof(fp)) (dlsym(handle, name)); \
- if (!fp) \
- error_msg_and_die("'%s' has no %s entry", mod_name, name); \
- } while (0)
-
- LOADSYM(m_pPluginInfo, handle, "plugin_info");
- LOADSYM(m_pFnPluginNew, handle, "plugin_new");
-#undef LOADSYM
-}
-
-
-/**
- * Text representation of plugin types.
- */
-static const char *const plugin_type_str[] = {
- "Analyzer",
- "Action",
- "Reporter",
- "Database"
-};
-
-
-CPluginManager::CPluginManager()
-{}
-
-CPluginManager::~CPluginManager()
-{}
-
-void CPluginManager::LoadPlugins()
-{
- DIR *dir = opendir(PLUGINS_LIB_DIR);
- if (dir != NULL)
- {
- struct dirent *dent;
- while ((dent = readdir(dir)) != NULL)
- {
- if (!is_regular_file(dent, PLUGINS_LIB_DIR))
- continue;
- char *ext = strrchr(dent->d_name, '.');
- if (!ext || strcmp(ext + 1, PLUGINS_LIB_EXTENSION) != 0)
- continue;
- *ext = '\0';
- if (strncmp(dent->d_name, PLUGINS_LIB_PREFIX, sizeof(PLUGINS_LIB_PREFIX)-1) != 0)
- continue;
- LoadPlugin(dent->d_name + sizeof(PLUGINS_LIB_PREFIX)-1, /*enabled_only:*/ true);
- }
- closedir(dir);
- }
-}
-
-void CPluginManager::UnLoadPlugins()
-{
- map_loaded_module_t::iterator it_module;
- while ((it_module = m_mapLoadedModules.begin()) != m_mapLoadedModules.end())
- {
- UnLoadPlugin(it_module->first.c_str());
- }
-}
-
-CPlugin* CPluginManager::LoadPlugin(const char *pName, bool enabled_only)
-{
- map_plugin_t::iterator it_plugin = m_mapPlugins.find(pName);
- if (it_plugin != m_mapPlugins.end())
- {
- return it_plugin->second; /* ok */
- }
-
- map_string_t plugin_info;
- plugin_info["Name"] = pName;
-
- const char *conf_name = pName;
- if (strncmp(pName, "Kerneloops", sizeof("Kerneloops")-1) == 0)
- {
- /* Kerneloops{,Scanner,Reporter} share the same .conf file */
- conf_name = "Kerneloops";
- }
- map_plugin_settings_t pluginSettings;
- string conf_fullname = ssprintf(PLUGINS_CONF_DIR"/%s."PLUGINS_CONF_EXTENSION, conf_name);
- LoadPluginSettings(conf_fullname.c_str(), pluginSettings);
- m_map_plugin_settings[pName] = pluginSettings;
- /* If settings are empty, most likely .conf file does not exist.
- * Don't mislead the user: */
- VERB3 if (!pluginSettings.empty()) log("Loaded %s.conf", conf_name);
-
- if (enabled_only)
- {
- map_plugin_settings_t::iterator it = pluginSettings.find("Enabled");
- if (it == pluginSettings.end() || !string_to_bool(it->second.c_str()))
- {
- plugin_info["Enabled"] = "no";
- string empty;
- plugin_info["Type"] = empty;
- plugin_info["Version"] = empty;
- plugin_info["Description"] = empty;
- plugin_info["Email"] = empty;
- plugin_info["WWW"] = empty;
- plugin_info["GTKBuilder"] = empty;
- VERB3 log("Plugin %s: 'Enabled' is not set, not loading it (yet)", pName);
- return NULL; /* error */
- }
- }
-
- string libPath = ssprintf(PLUGINS_LIB_DIR"/"PLUGINS_LIB_PREFIX"%s."PLUGINS_LIB_EXTENSION, pName);
- void *handle = dlopen(libPath.c_str(), RTLD_NOW);
- if (!handle)
- {
- error_msg("Can't load '%s': %s", libPath.c_str(), dlerror());
- return NULL; /* error */
- }
- CLoadedModule *module = new CLoadedModule(handle, pName);
- if (module->GetMagicNumber() != PLUGINS_MAGIC_NUMBER
- || module->GetType() < 0
- || module->GetType() > MAX_PLUGIN_TYPE
- ) {
- error_msg("Can't load non-compatible plugin %s: magic %d != %d or type %d is not in [0,%d]",
- pName,
- module->GetMagicNumber(), PLUGINS_MAGIC_NUMBER,
- module->GetType(), MAX_PLUGIN_TYPE);
- delete module;
- return NULL; /* error */
- }
- VERB3 log("Loaded plugin %s v.%s", pName, module->GetVersion());
-
- CPlugin *plugin = NULL;
- try
- {
- plugin = module->PluginNew();
- plugin->Init();
- plugin->SetSettings(pluginSettings);
- }
- catch (CABRTException& e)
- {
- error_msg("Can't initialize plugin %s: %s",
- pName,
- e.what()
- );
- delete plugin;
- delete module;
- return NULL; /* error */
- }
-
- plugin_info["Enabled"] = "yes";
- plugin_info["Type"] = plugin_type_str[module->GetType()];
- //plugin_info["Name"] = module->GetName();
- plugin_info["Version"] = module->GetVersion();
- plugin_info["Description"] = module->GetDescription();
- plugin_info["Email"] = module->GetEmail();
- plugin_info["WWW"] = module->GetWWW();
- plugin_info["GTKBuilder"] = module->GetGTKBuilder();
-
- m_mapLoadedModules[pName] = module;
- m_mapPlugins[pName] = plugin;
- log("Registered %s plugin '%s'", plugin_type_str[module->GetType()], pName);
- return plugin; /* ok */
-}
-
-void CPluginManager::UnLoadPlugin(const char *pName)
-{
- map_loaded_module_t::iterator it_module = m_mapLoadedModules.find(pName);
- if (it_module != m_mapLoadedModules.end())
- {
- map_plugin_t::iterator it_plugin = m_mapPlugins.find(pName);
- if (it_plugin != m_mapPlugins.end()) /* always true */
- {
- it_plugin->second->DeInit();
- delete it_plugin->second;
- m_mapPlugins.erase(it_plugin);
- }
- log("UnRegistered %s plugin %s", plugin_type_str[it_module->second->GetType()], pName);
- delete it_module->second;
- m_mapLoadedModules.erase(it_module);
- }
-}
-
-CAction* CPluginManager::GetAction(const char *pName, bool silent)
-{
- CPlugin *plugin = LoadPlugin(pName);
- if (!plugin)
- {
- error_msg("Plugin '%s' is not registered", pName);
- return NULL;
- }
- if (m_mapLoadedModules[pName]->GetType() != ACTION)
- {
- if (!silent)
- error_msg("Plugin '%s' is not an action plugin", pName);
- return NULL;
- }
- return (CAction*)plugin;
-}
-
-plugin_type_t CPluginManager::GetPluginType(const char *pName)
-{
- CPlugin *plugin = LoadPlugin(pName);
- if (!plugin)
- {
- throw CABRTException(EXCEP_PLUGIN, "Plugin '%s' is not registered", pName);
- }
- map_loaded_module_t::iterator it_module = m_mapLoadedModules.find(pName);
- return it_module->second->GetType();
-}
diff --git a/src/daemon/PluginManager.h b/src/daemon/PluginManager.h
deleted file mode 100644
index c5036fbf..00000000
--- a/src/daemon/PluginManager.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- PluginManager.h - header file for plugin manager. it takes care about
- (un)loading plugins
-
- Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com)
- Copyright (C) 2009 RedHat inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#ifndef PLUGINMANAGER_H_
-#define PLUGINMANAGER_H_
-
-#include "abrt_types.h"
-#include "plugin.h"
-#include "analyzer.h"
-#include "action.h"
-
-class CLoadedModule; /* opaque */
-
-/**
- * A class. It takes care of loading, registering and manipulating with
- * plugins. When a plugin is loaded, its library is opened, but no plugin
- * instance is created. It is possible after plugin registration.
- */
-class CPluginManager
-{
- private:
- typedef std::map<std::string, CLoadedModule*> map_loaded_module_t;
- typedef std::map<std::string, CPlugin*> map_plugin_t;
-
- /**
- * Loaded plugins. A key is a plugin name.
- */
- map_loaded_module_t m_mapLoadedModules;
- /**
- * Registered plugins. A key is a plugin name.
- */
- map_plugin_t m_mapPlugins;
- /**
- * List of all possible plugins (loaded or not), with some attributes.
- */
- map_map_string_t m_map_plugin_settings;
-
- public:
- /**
- * A constructor.
- * @param pPluginsConfDir A plugins configuration directory.
- * @param pPluginsLibDir A plugins library directory.
- */
- CPluginManager();
- /**
- * A destructor.
- */
- ~CPluginManager();
- /**
- * A method, which loads all plugins in plugins library direcotry.
- */
- void LoadPlugins();
- /**
- * A method, which unregister and unload all loaded plugins.
- */
- void UnLoadPlugins();
- /**
- * A method, which loads particular plugin.
- * @param pName A plugin name.
- */
- CPlugin* LoadPlugin(const char *pName, bool enabled_only = false);
- /**
- * A method, which unloads particular plugin.
- * @param pName A plugin name.
- */
- void UnLoadPlugin(const char *pName);
- /**
- * A method, which returns instance of particular action plugin.
- * @param pName A plugin name.
- * @return An action plugin.
- */
- CAction* GetAction(const char *pName, bool silent = false);
- /**
- * A method, which returns type of particular plugin.
- * @param pName A plugin name.
- * @return A plugin type.
- */
- plugin_type_t GetPluginType(const char *pName);
-};
-
-#endif /*PLUGINMANAGER_H_*/
diff --git a/src/daemon/Settings.cpp b/src/daemon/Settings.cpp
index 5b9972ba..e25b7959 100644
--- a/src/daemon/Settings.cpp
+++ b/src/daemon/Settings.cpp
@@ -19,8 +19,8 @@
#include "abrtlib.h"
#include "Settings.h"
-#define SECTION_COMMON "Common"
-#define SECTION_CRON "Cron"
+#define SECTION_COMMON "Common"
+#define SECTION_LOG_SCANNERS "LogScanners"
/* Conf file has this format:
* [ section_name1 ]
@@ -31,32 +31,28 @@
*/
/* Static data */
-/* Filled by LoadSettings() */
+/* Filled by load_settings() */
/* map["name"] = "value" strings from [ Common ] section.
* If the same name found on more than one line,
* the values are appended, separated by comma: map["name"] = "value1,value2" */
static map_string_t s_mapSectionCommon;
-/* ... from [ Cron ] */
-static map_string_t s_mapSectionCron;
/* Public data */
-/* Written out exactly in this order by SaveSettings() */
/* [ Common ] */
/* one line: "OpenGPGCheck = value" */
bool g_settings_bOpenGPGCheck = false;
/* one line: "OpenGPGPublicKeys = value1,value2" */
-GList *g_settings_setOpenGPGPublicKeys = NULL;
-GList *g_settings_setBlackListedPkgs = NULL;
-GList *g_settings_setBlackListedPaths = NULL;
-char *g_settings_sWatchCrashdumpArchiveDir = NULL;
+GList * g_settings_setOpenGPGPublicKeys = NULL;
+GList * g_settings_setBlackListedPkgs = NULL;
+GList * g_settings_setBlackListedPaths = NULL;
+char * g_settings_sWatchCrashdumpArchiveDir = NULL;
unsigned int g_settings_nMaxCrashReportsSize = 1000;
bool g_settings_bProcessUnpackaged = false;
-/* [ Cron ] */
-/* many lines, one per key: "map_key = aa_first,bb_first(bb_second),cc_first" */
-map_cron_t g_settings_mapCron;
+/* [ LogScanners ] */
+char * g_settings_sLogScanners = NULL;
/*
@@ -80,107 +76,12 @@ static GList *parse_list(const char* list)
}
if (item->len > 0)
- l = g_list_append(l, xstrdup(item->buf));
+ l = g_list_append(l, xstrdup(item->buf));
strbuf_free(item);
return l;
}
-/* Format: name, name(param),name("param with spaces \"and quotes\"") */
-static vector_pair_string_string_t ParseListWithArgs(const char *pValue, int *err)
-{
- VERB3 log(" ParseListWithArgs(%s)", pValue);
-
- vector_pair_string_string_t pluginsWithArgs;
- std::string item;
- std::string action;
- bool is_quote = false;
- bool is_arg = false;
- for (int ii = 0; pValue[ii]; ii++)
- {
- if (is_quote && pValue[ii] == '\\' && pValue[ii + 1])
- {
- ii++;
- item += pValue[ii];
- continue;
- }
- if (pValue[ii] == '"')
- {
- is_quote = !is_quote;
- /*item += pValue[ii]; - wrong! name("param") must be == name(param) */
- continue;
- }
- if (is_quote)
- {
- item += pValue[ii];
- continue;
- }
- if (pValue[ii] == '(')
- {
- if (!is_arg)
- {
- action = item;
- item = "";
- is_arg = true;
- }
- else
- {
- *err = 1;
- error_msg("Parser error: Invalid syntax on column %d in \"%s\"", ii, pValue);
- }
-
- continue;
- }
- if (pValue[ii] == ')')
- {
- if (is_arg)
- {
- VERB3 log(" adding (%s,%s)", action.c_str(), item.c_str());
- pluginsWithArgs.push_back(make_pair(action, item));
- item = "";
- is_arg = false;
- action = "";
- }
- else
- {
- *err = 1;
- error_msg("Parser error: Invalid syntax on column %d in \"%s\"", ii, pValue);
- }
-
- continue;
- }
- if (pValue[ii] == ',' && !is_arg)
- {
- if (item != "")
- {
- VERB3 log(" adding (%s,%s)", item.c_str(), "");
- pluginsWithArgs.push_back(make_pair(item, ""));
- item = "";
- }
- continue;
- }
- item += pValue[ii];
- }
-
- if (is_quote)
- {
- *err = 1;
- error_msg("Parser error: Unclosed quote in \"%s\"", pValue);
- }
-
- if (is_arg)
- {
- *err = 1;
- error_msg("Parser error: Unclosed argument in \"%s\"", pValue);
- }
- else if (item != "")
- {
- VERB3 log(" adding (%s,%s)", item.c_str(), "");
- pluginsWithArgs.push_back(make_pair(item, ""));
- }
- return pluginsWithArgs;
-}
-
static int ParseCommon()
{
map_string_t::const_iterator end = s_mapSectionCommon.end();
@@ -207,7 +108,7 @@ static int ParseCommon()
it = s_mapSectionCommon.find("MaxCrashReportsSize");
if (it != end)
{
- g_settings_nMaxCrashReportsSize = xatoi_u(it->second.c_str());
+ g_settings_nMaxCrashReportsSize = xatoi_positive(it->second.c_str());
}
it = s_mapSectionCommon.find("ProcessUnpackaged");
if (it != end)
@@ -217,20 +118,6 @@ static int ParseCommon()
return 0; /* no error */
}
-static int ParseCron()
-{
- map_string_t::iterator it = s_mapSectionCron.begin();
- for (; it != s_mapSectionCron.end(); it++)
- {
- int err = 0;
- vector_pair_string_string_t actionsAndReporters = ParseListWithArgs(it->second.c_str(), &err);
- if (err)
- return err;
- g_settings_mapCron[it->first] = actionsAndReporters;
- }
- return 0; /* no error */
-}
-
static void LoadGPGKeys()
{
FILE *fp = fopen(CONF_DIR"/gpg_keys", "r");
@@ -277,7 +164,7 @@ static int ReadConfigurationFromFile(FILE *fp)
value += line[ii];
continue;
}
- if (isspace(line[ii]) && !is_quote)
+ if (isspace(line[ii]) && !is_quote && is_key)
{
continue;
}
@@ -304,8 +191,9 @@ static int ReadConfigurationFromFile(FILE *fp)
section += line[ii];
continue;
}
- if (line[ii] == '=' && !is_quote)
+ if (is_key && line[ii] == '=' && !is_quote)
{
+ while (isspace(line[ii + 1])) ii++;
is_key = false;
key = value;
value = "";
@@ -351,11 +239,9 @@ static int ReadConfigurationFromFile(FILE *fp)
s_mapSectionCommon[key] += ",";
s_mapSectionCommon[key] += value;
}
- else if (section == SECTION_CRON)
+ else if (section == SECTION_LOG_SCANNERS)
{
- if (s_mapSectionCron[key] != "")
- s_mapSectionCron[key] += ",";
- s_mapSectionCron[key] += value;
+ g_settings_sLogScanners = xstrdup(value.c_str());
}
else
{
@@ -372,7 +258,7 @@ static int ReadConfigurationFromFile(FILE *fp)
}
/* abrt daemon loads .conf file */
-int LoadSettings()
+int load_settings()
{
int err = 0;
@@ -387,8 +273,6 @@ int LoadSettings()
if (err == 0)
err = ParseCommon();
- if (err == 0)
- err = ParseCron();
if (err == 0)
{
@@ -411,49 +295,36 @@ map_abrt_settings_t GetSettings()
map_abrt_settings_t ABRTSettings;
ABRTSettings[SECTION_COMMON] = s_mapSectionCommon;
- ABRTSettings[SECTION_CRON] = s_mapSectionCron;
return ABRTSettings;
}
-/* dbus call to change some .conf file data */
-void SetSettings(const map_abrt_settings_t& pSettings, const char *dbus_sender)
+///* dbus call to change some .conf file data */
+//void SetSettings(const map_abrt_settings_t& pSettings, const char *dbus_sender)
+//{
+// map_abrt_settings_t::const_iterator it = pSettings.find(SECTION_COMMON);
+// map_abrt_settings_t::const_iterator end = pSettings.end();
+// if (it != end)
+// {
+// s_mapSectionCommon = it->second;
+// ParseCommon();
+// }
+//}
+
+void free_settings()
{
- map_abrt_settings_t::const_iterator it = pSettings.find(SECTION_COMMON);
- map_abrt_settings_t::const_iterator end = pSettings.end();
- if (it != end)
- {
- s_mapSectionCommon = it->second;
- ParseCommon();
- }
- it = pSettings.find(SECTION_CRON);
- if (it != end)
- {
- s_mapSectionCron = it->second;
- ParseCron();
- }
-}
-
-void settings_free()
-{
- for (GList *li = g_settings_setOpenGPGPublicKeys; li != NULL; li = g_list_next(li))
- free((char*)li->data);
-
- g_list_free(g_settings_setOpenGPGPublicKeys);
+ list_free_with_free(g_settings_setOpenGPGPublicKeys);
g_settings_setOpenGPGPublicKeys = NULL;
- for (GList *li = g_settings_setBlackListedPkgs; li != NULL; li = g_list_next(li))
- free((char*)li->data);
-
- g_list_free(g_settings_setBlackListedPkgs);
+ list_free_with_free(g_settings_setBlackListedPkgs);
g_settings_setBlackListedPkgs = NULL;
- for (GList *li = g_settings_setBlackListedPaths; li != NULL; li = g_list_next(li))
- free((char*)li->data);
-
- g_list_free(g_settings_setBlackListedPaths);
+ list_free_with_free(g_settings_setBlackListedPaths);
g_settings_setBlackListedPaths = NULL;
free(g_settings_sWatchCrashdumpArchiveDir);
g_settings_sWatchCrashdumpArchiveDir = NULL;
+
+ free(g_settings_sLogScanners);
+ g_settings_sLogScanners = NULL;
}
diff --git a/src/daemon/Settings.h b/src/daemon/Settings.h
index 71824c74..dce6407d 100644
--- a/src/daemon/Settings.h
+++ b/src/daemon/Settings.h
@@ -20,25 +20,33 @@
#define SETTINGS_H_
#include "abrt_types.h"
-#include <glib.h>
-typedef map_vector_pair_string_string_t map_cron_t;
+#ifdef __cplusplus
+
typedef map_map_string_t map_abrt_settings_t;
+// looks unused to me.
+// Ok to grep for SetSettings and delete after 2011-04-01.
+// void SetSettings(const map_abrt_settings_t& pSettings, const char *dbus_sender);
+map_abrt_settings_t GetSettings();
+
+extern "C" {
+#endif
-extern GList *g_settings_setOpenGPGPublicKeys;
-extern GList *g_settings_setBlackListedPkgs;
-extern GList *g_settings_setBlackListedPaths;
+extern GList * g_settings_setOpenGPGPublicKeys;
+extern GList * g_settings_setBlackListedPkgs;
+extern GList * g_settings_setBlackListedPaths;
extern unsigned int g_settings_nMaxCrashReportsSize;
extern bool g_settings_bOpenGPGCheck;
extern bool g_settings_bProcessUnpackaged;
-extern char *g_settings_sWatchCrashdumpArchiveDir;
-extern map_cron_t g_settings_mapCron;
+extern char * g_settings_sWatchCrashdumpArchiveDir;
-int LoadSettings();
-void SaveSettings();
-void SetSettings(const map_abrt_settings_t& pSettings, const char * dbus_sender);
-map_abrt_settings_t GetSettings();
+extern char * g_settings_sLogScanners;
+
+int load_settings();
+void free_settings();
-void settings_free();
+#ifdef __cplusplus
+}
+#endif
#endif
diff --git a/src/daemon/abrt-action-save-package-data.cpp b/src/daemon/abrt-action-save-package-data.c
index cb880bd3..5be712cf 100644
--- a/src/daemon/abrt-action-save-package-data.cpp
+++ b/src/daemon/abrt-action-save-package-data.c
@@ -91,7 +91,6 @@ static int SavePackageDescriptionToDebugDump(const char *dump_dir_name)
char *package_short_name = NULL;
char *component = NULL;
char *script_name = NULL; /* only if "interpreter /path/to/script" */
- char *dsc = NULL;
/* note: "goto ret" statements below free all the above variables,
* but they don't dd_close(dd) */
@@ -100,7 +99,6 @@ static int SavePackageDescriptionToDebugDump(const char *dump_dir_name)
component = xstrdup("kernel");
package_full_name = xstrdup("kernel");
package_short_name = xstrdup("kernel");
- dsc = rpm_get_description(package_short_name);
}
else
{
@@ -124,21 +122,7 @@ static int SavePackageDescriptionToDebugDump(const char *dump_dir_name)
if (!dd)
goto ret; /* return 1 (failure) */
dd_save_text(dd, FILENAME_PACKAGE, "");
- dd_save_text(dd, FILENAME_DESCRIPTION, "Crashed executable does not belong to any installed package");
dd_save_text(dd, FILENAME_COMPONENT, "");
-//TODO: move hostname saving to a more logical place
- if (!remote)
- {
- char host[HOST_NAME_MAX + 1];
- int ret = gethostname(host, HOST_NAME_MAX);
- if (ret < 0)
- {
- perror_msg("gethostname");
- host[0] = '\0';
- }
- host[HOST_NAME_MAX] = '\0';
- dd_save_text(dd, FILENAME_HOSTNAME, host);
- }
goto ret0; /* no error */
}
log("Executable '%s' doesn't belong to any package", executable);
@@ -220,7 +204,6 @@ static int SavePackageDescriptionToDebugDump(const char *dump_dir_name)
}
component = rpm_get_component(executable);
- dsc = rpm_get_description(package_short_name);
dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
@@ -231,27 +214,10 @@ static int SavePackageDescriptionToDebugDump(const char *dump_dir_name)
{
dd_save_text(dd, FILENAME_PACKAGE, package_full_name);
}
- if (dsc)
- {
- dd_save_text(dd, FILENAME_DESCRIPTION, dsc);
- }
if (component)
{
dd_save_text(dd, FILENAME_COMPONENT, component);
}
-//TODO: move hostname saving to a more logical place
- if (!remote)
- {
- char host[HOST_NAME_MAX + 1];
- int ret = gethostname(host, HOST_NAME_MAX);
- if (ret < 0)
- {
- perror_msg("gethostname");
- host[0] = '\0';
- }
- host[HOST_NAME_MAX] = '\0';
- dd_save_text(dd, FILENAME_HOSTNAME, host);
- }
dd_close(dd);
@@ -262,41 +228,40 @@ static int SavePackageDescriptionToDebugDump(const char *dump_dir_name)
free(package_short_name);
free(component);
free(script_name);
- free(dsc);
return error;
}
-static const char *dump_dir_name = ".";
-static const char abrt_action_save_package_data_usage[] =
- PROGNAME" [options] -d DIR\n"
- "\n"
- "Query package database and save package name, component, and description";
-enum {
- OPT_v = 1 << 0,
- OPT_d = 1 << 1,
- OPT_s = 1 << 2,
-};
-/* Keep enum above and order of options below in sync! */
-static struct options abrt_action_save_package_data_options[] = {
- OPT__VERBOSE(&g_verbose),
- OPT_STRING('d', NULL, &dump_dir_name, "DIR", "Crash dump directory"),
- OPT_BOOL( 's', NULL, NULL, "Log to syslog"),
- OPT_END()
-};
-
int main(int argc, char **argv)
{
char *env_verbose = getenv("ABRT_VERBOSE");
if (env_verbose)
g_verbose = atoi(env_verbose);
- unsigned opts = parse_opts(argc, argv, abrt_action_save_package_data_options,
- abrt_action_save_package_data_usage);
+ const char *dump_dir_name = ".";
+
+ /* Can't keep these strings/structs static: _() doesn't support that */
+ const char *program_usage_string = _(
+ PROGNAME" [options] -d DIR\n"
+ "\n"
+ "Query package database and save package name, component, and description"
+ );
+ enum {
+ OPT_v = 1 << 0,
+ OPT_d = 1 << 1,
+ OPT_s = 1 << 2,
+ };
+ /* Keep enum above and order of options below in sync! */
+ struct options program_options[] = {
+ OPT__VERBOSE(&g_verbose),
+ OPT_STRING('d', NULL, &dump_dir_name, "DIR", _("Crash dump directory")),
+ OPT_BOOL( 's', NULL, NULL , _("Log to syslog")),
+ OPT_END()
+ };
+ unsigned opts = parse_opts(argc, argv, program_options, program_usage_string);
putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
msg_prefix = PROGNAME;
-
if (opts & OPT_s)
{
openlog(msg_prefix, 0, LOG_DAEMON);
@@ -304,8 +269,8 @@ int main(int argc, char **argv)
}
VERB1 log("Loading settings");
- if (LoadSettings() != 0)
- return 1; /* syntax error (looged already by LoadSettings) */
+ if (load_settings() != 0)
+ return 1; /* syntax error (logged already by load_settings) */
VERB1 log("Initializing rpm library");
rpm_init();
diff --git a/src/daemon/abrt-handle-crashdump.c b/src/daemon/abrt-handle-crashdump.c
index 2217c67a..e7847c5f 100644
--- a/src/daemon/abrt-handle-crashdump.c
+++ b/src/daemon/abrt-handle-crashdump.c
@@ -38,11 +38,13 @@ int main(int argc, char **argv)
if (env_verbose)
g_verbose = atoi(env_verbose);
- const char *program_usage = _(
+ /* Can't keep these strings/structs static: _() doesn't support that */
+ const char *program_usage_string = _(
PROGNAME" [-vs]" /*" [-c CONFFILE]"*/ " -d DIR -e EVENT\n"
" or: "PROGNAME" [-vs]" /*" [-c CONFFILE]"*/ " [-d DIR] -l[PFX]\n"
"\n"
- "Handle crash dump according to rules in abrt_event.conf");
+ "Handle crash dump according to rules in abrt_event.conf"
+ );
enum {
OPT_v = 1 << 0,
OPT_s = 1 << 1,
@@ -61,11 +63,12 @@ int main(int argc, char **argv)
// OPT_STRING( 'c', NULL, &conf_filename, "CONFFILE", _("Configuration file" )),
OPT_END()
};
-
- unsigned opts = parse_opts(argc, argv, program_options, program_usage);
+ unsigned opts = parse_opts(argc, argv, program_options, program_usage_string);
if (!(opts & (OPT_e|OPT_l)))
- parse_usage_and_die(program_usage, program_options);
+ show_usage_and_die(program_usage_string, program_options);
+
putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
+ msg_prefix = PROGNAME;
if (opts & OPT_s)
{
openlog(msg_prefix, 0, LOG_DAEMON);
@@ -87,17 +90,10 @@ int main(int argc, char **argv)
/* -e EVENT: run event */
- /* Need to add LIBEXEC_DIR to PATH, because otherwise abrt-action-*
- * are not found by exec()
- */
- const char *env_path = getenv("PATH");
- if (!env_path) env_path = "";
- putenv(xasprintf("PATH=%s%s%s", LIBEXEC_DIR, (!env_path[0] ? "" : ":"), env_path));
-
struct run_event_state *run_state = new_run_event_state();
run_state->logging_callback = do_log;
- int r = run_event(run_state, dump_dir_name ? dump_dir_name : ".", event);
- if (r == -1)
+ int r = run_event_on_dir_name(run_state, dump_dir_name ? dump_dir_name : ".", event);
+ if (r == 0 && run_state->children_count == 0)
error_msg_and_die("No actions are found for event '%s'", event);
free_run_event_state(run_state);
diff --git a/src/daemon/abrt-server.c b/src/daemon/abrt-server.c
index fdf66e59..de22f427 100644
--- a/src/daemon/abrt-server.c
+++ b/src/daemon/abrt-server.c
@@ -16,11 +16,10 @@
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "abrtlib.h"
-#include "dump_dir.h"
-#include "abrt_crash_dump.h" /* FILENAME_foo */
#include "hooklib.h"
#include "parse_options.h"
+#define PROGNAME "abrt-server"
/* Maximal length of backtrace. */
#define MAX_BACKTRACE_SIZE (1024*1024)
@@ -108,9 +107,9 @@ static void create_debug_dump()
This directory is renamed to final directory name after
all files have been stored into it.
*/
- char *path = xasprintf(DEBUG_DUMPS_DIR"/%s-%ld-%u.new",
+ char *path = xasprintf(DEBUG_DUMPS_DIR"/%s-%s-%u.new",
dir_basename,
- (long)time(NULL),
+ iso_date_string(NULL),
pid);
/* No need to check the path length, as all variables used are limited, and dd_create()
fails if the path is too long. */
@@ -120,6 +119,7 @@ static void create_debug_dump()
{
error_msg_and_die("Error creating crash dump %s", path);
}
+ dd_create_basic_files(dd, client_uid);
dd_save_text(dd, FILENAME_ANALYZER, analyzer);
dd_save_text(dd, FILENAME_EXECUTABLE, executable);
@@ -275,31 +275,32 @@ static void process_message(const char *message)
static void dummy_handler(int sig_unused) {}
-static const char abrt_server_usage[] = "abrt-server [options]";
-enum {
- OPT_v = 1 << 0,
- OPT_u = 1 << 1,
- OPT_s = 1 << 2,
-};
-/* Keep enum above and order of options below in sync! */
-static struct options abrt_server_options[] = {
- OPT__VERBOSE(&g_verbose),
- OPT_INTEGER( 'u' , 0, &client_uid, "Use UID as client uid"),
- OPT_BOOL( 's' , 0, NULL, "Log to syslog"),
- OPT_END()
-};
-
int main(int argc, char **argv)
{
char *env_verbose = getenv("ABRT_VERBOSE");
if (env_verbose)
g_verbose = atoi(env_verbose);
- unsigned opts = parse_opts(argc, argv, abrt_server_options,
- abrt_server_usage);
+ /* Can't keep these strings/structs static: _() doesn't support that */
+ const char *program_usage_string = _(
+ PROGNAME" [options]"
+ );
+ enum {
+ OPT_v = 1 << 0,
+ OPT_u = 1 << 1,
+ OPT_s = 1 << 2,
+ };
+ /* Keep enum above and order of options below in sync! */
+ struct options program_options[] = {
+ OPT__VERBOSE(&g_verbose),
+ OPT_INTEGER('u', NULL, &client_uid, _("Use UID as client uid")),
+ OPT_BOOL( 's', NULL, NULL , _("Log to syslog")),
+ OPT_END()
+ };
+ unsigned opts = parse_opts(argc, argv, program_options, program_usage_string);
putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
- msg_prefix = xasprintf("abrt-server[%u]", getpid());
+ msg_prefix = xasprintf(PROGNAME"[%u]", getpid());
if (opts & OPT_s)
{
openlog(msg_prefix, 0, LOG_DAEMON);
diff --git a/src/daemon/abrt.conf b/src/daemon/abrt.conf
index 07ea51a0..7f5a9c58 100644
--- a/src/daemon/abrt.conf
+++ b/src/daemon/abrt.conf
@@ -8,7 +8,7 @@ OpenGPGCheck = yes
# Blacklisted packages
#
-BlackList = nspluginwrapper, valgrind, strace
+BlackList = nspluginwrapper,valgrind,strace
# Process crashes in executables which do not belong to any package?
#
@@ -16,7 +16,7 @@ ProcessUnpackaged = no
# Blacklisted executable paths (shell patterns)
#
-BlackListedPaths = /usr/share/doc/*, */example*
+BlackListedPaths = /usr/share/doc/*,*/example*
# Enable this if you want abrtd to auto-unpack crashdump tarballs which appear
# in this directory (for example, uploaded via ftp, scp etc).
@@ -30,12 +30,7 @@ BlackListedPaths = /usr/share/doc/*, */example*
MaxCrashReportsSize = 1000
-# Which Action plugins to run repeatedly
+# So far we support only one line here
#
-[ Cron ]
-# h:m - at h:m
-# s - every s seconds
-
-120 = KerneloopsScanner
-
-#02:00 = FileTransfer
+[ LogScanners ]
+abrt-dump-oops = abrt-dump-oops -drw /var/log/messages
diff --git a/src/daemon/abrt.conf.5 b/src/daemon/abrt.conf.5
index 3f9d8c39..84c8f002 100644
--- a/src/daemon/abrt.conf.5
+++ b/src/daemon/abrt.conf.5
@@ -65,18 +65,6 @@ all the C/C++ programs.
.TP
.B Kerneloops = \fIplugin\fP
This plugin will be used in the case of kernel crashes.
-.SS [ Cron ]
-This section specifies tasks that will be run at some specified time. You can specify
-either a time of day in the format
-.br
-.B hh:mm = \fIplugin\fP
-.br
-or an interval
-.br
-.B ss = \fIplugin2\fP
-.br
-in this case, \fIplugin2\fP will be run every \fIss\fP seconds (this number
-can be greater than 60).
.SH "SEE ALSO"
.IR abrtd (8),
.IR abrt-plugins (7)
diff --git a/src/daemon/abrt_event.conf b/src/daemon/abrt_event.conf
index 45c9017a..23765718 100644
--- a/src/daemon/abrt_event.conf
+++ b/src/daemon/abrt_event.conf
@@ -1,33 +1,49 @@
-# This table specifies which programs should be run
+# This configuration file specifies which programs should be run
# when the specified event occurs in crash dump lifetime.
#
# Example:
# EVENT=post-create { pwd; date; }>/tmp/dt; echo $HOSTNAME `uname -r`
#
-# Each line may have conditions to be checked
-# before the program is run.
+# Rule starts with a line with non-space leading character.
+# All subsequent lines which start with space or tab form one rule.
+# Note that separating newline is *retained*. Example:
+# EVENT=post-create date >/tmp/dt # semicolon is not needed here!
+# echo $HOSTNAME `uname -r`
+#
+# Rules may be commented out with #. One # is sufficient to comment out
+# even a multi-line rule (no need to comment out every line).
+#
+# Rule of the form "include GLOB_PATTERN" recurses to each file which matches
+# GLOB_PATTERN. Example: "include post-create.d/*.conf"
+#
+
+include events.d/*.conf
+
+# Any other rules specify which programs to run on the crash dump.
+#
+# Each rule may have conditions to be checked before the program is run.
#
# Conditions have form VAR=VAL, where VAR is either word "EVENT"
# or a name of crash dump element to be checked (for example,
# "executable", "package", hostname" etc).
#
-# If all conditions match, the program is run in the shell.
+# If all conditions match, the remaining part of the rule
+# (the "program" part) is run in the shell.
# All shell language constructs are valid.
# All stdout and stderr output is captured and passed to abrt
# and possibly to abrt's frontends and shown to the user.
#
-# If the program terminates with nonzero exitcode,
+# If the program terminates with nonzero exit code,
# the event processing is considered unsuccessful and is stopped.
# Last captured output line, if any, is considered to be
# the error message indicating the reason of the failure,
# and may be used by abrt as such.
#
-# If the program terminates successfully, next line is read
+# If the program terminates successfully, next rule is read
# and processed. This process is repeated until the end of this file.
# abrt-action-analyze-c needs package name, save package data first
EVENT=post-create abrt-action-save-package-data
-EVENT=post-create analyzer=CCpp abrt-action-analyze-c
EVENT=post-create analyzer=Python abrt-action-analyze-python
EVENT=post-create analyzer=Kerneloops abrt-action-analyze-oops
# If you want all users (not just root) to be able to see oopses:
@@ -38,24 +54,20 @@ EVENT=post-create analyzer=Kerneloops abrt-action-analyze-oops
# user interaction, uncomment this line:
#EVENT=post-create analyzer=Kerneloops abrt-action-kerneloops
# Example: if you want to save sosreport immediately at the moment of a crash:
-#EVENT=post-create nice sosreport --tmp-dir "$DUMP_DIR" --batch --only=anaconda --only=bootloader --only=devicemapper --only=filesys --only=hardware --only=kernel --only=libraries --only=memory --only=networking --only=nfsserver --only=pam --only=process --only=rpm -k rpm.rpmva=off --only=ssh --only=startup --only=yum && { rm sosreport*.md5; mv sosreport*.tar.bz2 sosreport.tar.bz2; mv sosreport*.tar.xz sosreport.tar.xz; true; } 2>/dev/null
-
-#TODO: implement this (or add this functionality to abrt-action-install-debuginfo):
-#EVENT=analyze analyzer=CCpp backtrace= trim-debuginfo-cache /var/cache/abrt-di 4096m
-# Additional directories to search for debuginfos can be specified
-# in the third argument (its format is CACHEDIR[:DEBUGINFODIR...]).
-# For example, you can specify a network-mounted shared store
-# of all debuginfos this way.
-EVENT=analyze analyzer=CCpp backtrace= abrt-action-install-debuginfo.py "--core=$DUMP_DIR/coredump" "--tmpdir=/var/run/abrt/$$-$RANDOM" --cache=/var/cache/abrt-di
-EVENT=analyze analyzer=CCpp backtrace= abrt-action-generate-backtrace
-
-# Same as "analyze", but executed when user requests "refresh" in GUI
-#EVENT=reanalyze analyzer=CCpp trim-debuginfo-cache /var/cache/abrt-di 4096m
-EVENT=reanalyze analyzer=CCpp abrt-action-install-debuginfo.py "--core=$DUMP_DIR/coredump" "--tmpdir=/var/run/abrt/$$-$RANDOM" --cache=/var/cache/abrt-di
-EVENT=reanalyze analyzer=CCpp abrt-action-generate-backtrace
+#EVENT=post-create
+ nice sosreport --tmp-dir "$DUMP_DIR" --batch \
+ --only=anaconda --only=bootloader --only=devicemapper \
+ --only=filesys --only=hardware --only=kernel --only=libraries \
+ --only=memory --only=networking --only=nfsserver --only=pam \
+ --only=process --only=rpm -k rpm.rpmva=off --only=ssh \
+ --only=startup --only=yum --only=general --only=x11 \
+ && {
+ rm sosreport*.md5
+ mv sosreport*.tar.bz2 sosreport.tar.bz2
+ mv sosreport*.tar.xz sosreport.tar.xz
+ true
+ } 2>/dev/null
EVENT=report analyzer=Kerneloops abrt-action-kerneloops
-EVENT=report_Bugzilla analyzer=CCpp abrt-action-bugzilla -c /etc/abrt/plugins/Bugzilla.conf
-EVENT=report_Logger analyzer=CCpp abrt-action-print -o /var/log/abrt.log
EVENT=report_Bugzilla analyzer=Python abrt-action-bugzilla -c /etc/abrt/plugins/Bugzilla.conf
EVENT=report_Logger analyzer=Python abrt-action-print -o /var/log/abrt.log
diff --git a/src/lib/CommLayerInner.cpp b/src/daemon/comm_layer_inner.cpp
index 3c102d6e..9d5ddfc2 100644
--- a/src/lib/CommLayerInner.cpp
+++ b/src/daemon/comm_layer_inner.cpp
@@ -19,10 +19,9 @@
#include <pthread.h>
#include <map>
#include "abrtlib.h"
+#include "CommLayerServerDBus.h"
#include "comm_layer_inner.h"
-static CObserver *s_pObs;
-
typedef std::map<uint64_t, std::string> map_uint_str_t;
static map_uint_str_t s_mapClientID;
static pthread_mutex_t s_map_mutex;
@@ -31,9 +30,6 @@ static bool s_map_mutex_inited;
/* called via [p]error_msg() */
static void warn_client(const char *msg)
{
- if (!s_pObs)
- return;
-
uint64_t key = uint64_t(pthread_self());
pthread_mutex_lock(&s_map_mutex);
@@ -42,12 +38,13 @@ static void warn_client(const char *msg)
pthread_mutex_unlock(&s_map_mutex);
if (peer)
- s_pObs->Warning(msg, peer);
+ {
+ send_dbus_sig_Warning(msg, peer);
+ }
}
-void init_daemon_logging(CObserver *pObs)
+void init_daemon_logging(void)
{
- s_pObs = pObs;
if (!s_map_mutex_inited)
{
s_map_mutex_inited = true;
@@ -71,9 +68,6 @@ void set_client_name(const char *name)
void update_client(const char *fmt, ...)
{
- if (!s_pObs)
- return;
-
uint64_t key = uint64_t(pthread_self());
pthread_mutex_lock(&s_map_mutex);
@@ -89,6 +83,8 @@ void update_client(const char *fmt, ...)
char *msg = xvasprintf(fmt, p);
va_end(p);
- s_pObs->Status(msg, peer);
+ VERB1 log("Update('%s'): %s", peer, msg);
+ send_dbus_sig_Update(msg, peer);
+
free(msg);
}
diff --git a/src/include/comm_layer_inner.h b/src/daemon/comm_layer_inner.h
index 2cca9add..48eb2010 100644
--- a/src/include/comm_layer_inner.h
+++ b/src/daemon/comm_layer_inner.h
@@ -20,18 +20,11 @@
#define COMMLAYERINNER_H_
#ifdef __cplusplus
-
-#include "observer.h"
-
-void init_daemon_logging(CObserver *pObs);
-
-#endif
-
-
-#ifdef __cplusplus
extern "C" {
#endif
+void init_daemon_logging(void);
+
/*
* Set client's name (dbus ID). NULL unsets it.
*/
diff --git a/src/daemon/rpm.c b/src/daemon/rpm.c
index a726d357..1295211e 100644
--- a/src/daemon/rpm.c
+++ b/src/daemon/rpm.c
@@ -16,7 +16,6 @@
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#include <glib.h>
#include "abrtlib.h"
#include "rpm.h"
@@ -150,7 +149,6 @@ bool CheckHash(const char* pPackage, const char* pPath)
goto error;
rpmfi fi = rpmfiNew(ts, header, RPMTAG_BASENAMES, RPMFI_NOHEADER);
- pgpHashAlgo hashAlgo;
std::string headerHash;
char computedHash[1024] = "";
@@ -158,8 +156,8 @@ bool CheckHash(const char* pPackage, const char* pPath)
{
if (strcmp(pPath, rpmfiFN(fi)) == 0)
{
- headerHash = rpmfiFDigestHex(fi, &hashAlgo);
- rpmDoDigest(hashAlgo, pPath, 1, (unsigned char*) computedHash, NULL);
+ headerHash = rpmfiFDigestHex(fi, NULL);
+ rpmDoDigest(rpmfiDigestAlgo(fi), pPath, 1, (unsigned char*) computedHash, NULL);
ret = (headerHash != "" && headerHash == computedHash);
break;
}
@@ -172,27 +170,6 @@ error:
}
*/
-char* rpm_get_description(const char* pkg)
-{
- char *dsc = NULL;
- const char *errmsg = NULL;
- rpmts ts = rpmtsCreate();
-
- rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_NAME, pkg, 0);
- Header header = rpmdbNextIterator(iter);
- if (!header)
- goto error;
-
- dsc = headerFormat(header, "%{SUMMARY}\n\n%{DESCRIPTION}", &errmsg);
- if (!dsc && errmsg)
- error_msg("cannot get summary and description. reason: %s", errmsg);
-
-error:
- rpmdbFreeIterator(iter);
- rpmtsFree(ts);
- return dsc;
-}
-
char* rpm_get_component(const char* filename)
{
char *ret = NULL;
diff --git a/src/daemon/rpm.h b/src/daemon/rpm.h
index 12b11ca8..11f02809 100644
--- a/src/daemon/rpm.h
+++ b/src/daemon/rpm.h
@@ -58,12 +58,6 @@ void rpm_load_gpgkey(const char* filename);
int rpm_chk_fingerprint(const char* pkg);
/**
- * Gets a package description.
- * @param pkg A package name.
- * @return A package description.
- */
-char* rpm_get_description(const char* pkg);
-/**
* Gets a package name. This package contains particular
* file. If the file doesn't belong to any package, empty string is
* returned.
diff --git a/src/gui-gtk/Makefile.am b/src/gui-gtk/Makefile.am
new file mode 100644
index 00000000..a0d0de40
--- /dev/null
+++ b/src/gui-gtk/Makefile.am
@@ -0,0 +1,45 @@
+bin_PROGRAMS = abrt-gtk
+
+abrt_gtk_SOURCES = \
+ abrt-gtk.h abrt-gtk.c \
+ main.c
+abrt_gtk_CFLAGS = \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
+ -I$(srcdir)/../lib \
+ -DBIN_DIR=\"$(bindir)\" \
+ -DVAR_RUN=\"$(VAR_RUN)\" \
+ -DCONF_DIR=\"$(CONF_DIR)\" \
+ -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \
+ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
+ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
+ -DICON_DIR=\"${datadir}/abrt/icons/hicolor/48x48/status\" \
+ $(GTK_CFLAGS) \
+ $(DBUS_CFLAGS) \
+ -D_GNU_SOURCE \
+ -Wall -Werror
+# -I/usr/include/glib-2.0
+# -I/usr/lib/glib-2.0/include
+# $(LIBNOTIFY_CFLAGS)
+# $(DBUS_GLIB_CFLAGS)
+abrt_gtk_LDADD = \
+ ../lib/libreport.la \
+ ../lib/libabrt_dbus.la \
+ -lglib-2.0 \
+ -lgthread-2.0 \
+ $(GTK_LIBS) \
+ $(DBUS_LIBS)
+# $(LIBNOTIFY_LIBS)
+
+#test_report_SOURCES = \
+# test_report.c
+#test_report_CPPFLAGS = \
+# -I$(srcdir)/../include/report -I$(srcdir)/../include \
+# $(GLIB_CFLAGS) \
+# -D_GNU_SOURCE \
+# -Wall -Werror
+#test_report_LDADD = \
+# ../lib/libreport.la
+
+DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@
+
+@INTLTOOL_DESKTOP_RULE@
diff --git a/src/gui-gtk/abrt-gtk.c b/src/gui-gtk/abrt-gtk.c
new file mode 100644
index 00000000..fc945d76
--- /dev/null
+++ b/src/gui-gtk/abrt-gtk.c
@@ -0,0 +1,307 @@
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+#include "abrtlib.h"
+#include "abrt_dbus.h"
+#include "abrt-gtk.h"
+
+static GtkListStore *s_dumps_list_store;
+static GtkWidget *s_treeview;
+
+enum
+{
+ COLUMN_REPORTED,
+ COLUMN_REASON,
+ COLUMN_DIRNAME,
+ COLUMN_LATEST_CRASH_STR,
+ COLUMN_LATEST_CRASH,
+ COLUMN_DUMP_DIR,
+ NUM_COLUMNS
+};
+
+void add_directory_to_dirlist(const char *dirname)
+{
+ struct dump_dir *dd = dd_opendir(dirname, DD_OPEN_READONLY);
+ if (!dd)
+ return;
+
+ time_t time = atoi(dd_load_text(dd, FILENAME_TIME));
+ struct tm *ptm = localtime(&time);
+ char time_buf[60];
+ size_t time_len = strftime(time_buf, sizeof(time_buf)-1, "%c", ptm);
+ time_buf[time_len] = '\0';
+
+ char *msg = dd_load_text_ext(dd, FILENAME_MESSAGE, 0
+ | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE
+ | DD_FAIL_QUIETLY
+ );
+ const char *reported = (msg ? GTK_STOCK_YES : GTK_STOCK_NO);
+ free(msg);
+ char *reason = dd_load_text(dd, FILENAME_REASON);
+
+ GtkTreeIter iter;
+ gtk_list_store_append(s_dumps_list_store, &iter);
+ gtk_list_store_set(s_dumps_list_store, &iter,
+ COLUMN_REPORTED, reported,
+ COLUMN_REASON, reason,
+ COLUMN_DIRNAME, dd->dd_dirname,
+ //OPTION: time format
+ COLUMN_LATEST_CRASH_STR, time_buf,
+ COLUMN_LATEST_CRASH, (int)time,
+ COLUMN_DUMP_DIR, dirname,
+ -1);
+
+ free(reason);
+
+ dd_close(dd);
+ VERB1 log("added: %s", dirname);
+}
+
+
+/* create_main_window and helpers */
+
+static void on_row_activated_cb(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
+{
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
+ if (selection)
+ {
+ GtkTreeIter iter;
+ GtkTreeModel *store = gtk_tree_view_get_model(treeview);
+ if (gtk_tree_selection_get_selected(selection, &store, &iter) == TRUE)
+ {
+ GValue d_dir = { 0 };
+ gtk_tree_model_get_value(store, &iter, COLUMN_DUMP_DIR, &d_dir);
+
+ pid_t pid = vfork();
+ if (pid == 0)
+ {
+ /* Undo signal(SIGCHLD, SIG_IGN), or child inherits it and gets terribly confused */
+ signal(SIGCHLD, SIG_DFL);
+
+ const char *dirname= g_value_get_string(&d_dir);
+ VERB1 log("Executing: %s %s", "bug-reporting-wizard", dirname);
+ execlp("bug-reporting-wizard", "bug-reporting-wizard", dirname, NULL);
+ perror_msg_and_die("Can't execute %s", "bug-reporting-wizard");
+ }
+ }
+ }
+}
+
+static gint on_key_press_event_cb(GtkTreeView *treeview, GdkEventKey *key, gpointer unused)
+{
+ int k = key->keyval;
+
+ if (k == GDK_Delete || k == GDK_KP_Delete)
+ {
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
+ if (selection)
+ {
+ GtkTreeIter iter;
+ GtkTreeModel *store = gtk_tree_view_get_model(treeview);
+ if (gtk_tree_selection_get_selected(selection, &store, &iter) == TRUE)
+ {
+ GtkTreePath *old_path = gtk_tree_model_get_path(store, &iter);
+
+ GValue d_dir = { 0 };
+ gtk_tree_model_get_value(store, &iter, COLUMN_DUMP_DIR, &d_dir);
+ const char *dump_dir_name = g_value_get_string(&d_dir);
+
+ VERB1 log("Deleting '%s'", dump_dir_name);
+ if (delete_dump_dir_possibly_using_abrtd(dump_dir_name) == 0)
+ {
+ gtk_list_store_remove(s_dumps_list_store, &iter);
+ }
+ else
+ {
+ /* Strange. Deletion did not succeed. Someone else deleted it?
+ * Rescan the whole list */
+ gtk_list_store_clear(s_dumps_list_store);
+ scan_dirs_and_add_to_dirlist();
+ }
+
+ /* Try to retain the same cursor position */
+ sanitize_cursor(old_path);
+ gtk_tree_path_free(old_path);
+ }
+ }
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void add_columns(GtkTreeView *treeview)
+{
+ GtkCellRenderer *renderer;
+ GtkTreeViewColumn *column;
+
+ renderer = gtk_cell_renderer_pixbuf_new();
+ column = gtk_tree_view_column_new_with_attributes(_("Reported"),
+ renderer,
+ "stock_id",
+ COLUMN_REPORTED,
+ NULL);
+ gtk_tree_view_column_set_resizable(column, TRUE);
+ gtk_tree_view_column_set_sort_column_id(column, COLUMN_REPORTED);
+ gtk_tree_view_append_column(treeview, column);
+
+ renderer = gtk_cell_renderer_text_new();
+ column = gtk_tree_view_column_new_with_attributes(_("Problem"),
+ renderer,
+ "text",
+ COLUMN_REASON,
+ NULL);
+ gtk_tree_view_column_set_resizable(column, TRUE);
+ gtk_tree_view_column_set_sort_column_id(column, COLUMN_REASON);
+ gtk_tree_view_append_column(treeview, column);
+
+ renderer = gtk_cell_renderer_text_new();
+ column = gtk_tree_view_column_new_with_attributes(_("Stored in"),
+ renderer,
+ "text",
+ COLUMN_DIRNAME,
+ NULL);
+ gtk_tree_view_column_set_resizable(column, TRUE);
+ gtk_tree_view_column_set_sort_column_id(column, COLUMN_DIRNAME);
+ gtk_tree_view_append_column(treeview, column);
+
+ renderer = gtk_cell_renderer_text_new();
+ column = gtk_tree_view_column_new_with_attributes(_("Last occurrence"),
+ renderer,
+ "text",
+ COLUMN_LATEST_CRASH_STR,
+ NULL);
+ gtk_tree_view_column_set_sort_column_id(column, COLUMN_LATEST_CRASH);
+ gtk_tree_view_append_column(treeview, column);
+}
+
+GtkWidget *create_menu(void)
+{
+ /* main bar */
+ GtkWidget *menu = gtk_menu_bar_new();
+ GtkWidget *file_item = gtk_menu_item_new_with_mnemonic(_("_File"));
+ GtkWidget *edit_item = gtk_menu_item_new_with_mnemonic(_("_Edit"));
+ GtkWidget *help_item = gtk_menu_item_new_with_mnemonic(_("_Help"));
+
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), file_item);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), edit_item);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), help_item);
+
+ /* file submenu */
+ GtkWidget *file_submenu = gtk_menu_new();
+ GtkWidget *quit_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL);
+ gtk_menu_shell_append(GTK_MENU_SHELL(file_submenu), quit_item);
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(file_item), file_submenu);
+
+ /* edit submenu */
+ GtkWidget *edit_submenu = gtk_menu_new();
+ GtkWidget *plugins_item = gtk_menu_item_new_with_mnemonic(_("_Plugins"));
+ GtkWidget *preferences_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES, NULL);
+ gtk_menu_shell_append(GTK_MENU_SHELL(edit_submenu), plugins_item);
+ gtk_menu_shell_append(GTK_MENU_SHELL(edit_submenu), preferences_item);
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(edit_item), edit_submenu);
+
+ /* help submenu */
+ GtkWidget *help_submenu = gtk_menu_new();
+ GtkWidget *log_item = gtk_menu_item_new_with_mnemonic(_("View _log"));
+ GtkWidget *online_help_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_HELP, NULL);
+ GtkWidget *about_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_ABOUT, NULL);
+ gtk_menu_shell_append(GTK_MENU_SHELL(help_submenu), log_item);
+ gtk_menu_shell_append(GTK_MENU_SHELL(help_submenu), online_help_item);
+ gtk_menu_shell_append(GTK_MENU_SHELL(help_submenu), about_item);
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(help_item), help_submenu);
+
+ return menu;
+}
+
+GtkWidget *create_main_window(void)
+{
+ /* main window */
+ GtkWidget *main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_default_size(GTK_WINDOW(main_window), 600, 700);
+ gtk_window_set_title(GTK_WINDOW(main_window), _("Automatic Bug Reporting Tool"));
+ gtk_window_set_icon_name(GTK_WINDOW(main_window), "abrt");
+
+ GtkWidget *main_vbox = gtk_vbox_new(false, 0);
+
+ /* scrolled region inside main window */
+ GtkWidget *scroll_win = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll_win),
+ GTK_SHADOW_ETCHED_IN);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+
+ gtk_box_pack_start(GTK_BOX(main_vbox), create_menu(), false, false, 0);
+ gtk_box_pack_start(GTK_BOX(main_vbox), scroll_win, true, true, 0);
+ gtk_container_add(GTK_CONTAINER(main_window), main_vbox);
+
+ /* tree view inside scrolled region */
+ s_treeview = gtk_tree_view_new();
+ add_columns(GTK_TREE_VIEW(s_treeview));
+ gtk_container_add(GTK_CONTAINER(scroll_win), s_treeview);
+
+ /* Create data store for the list and attach it */
+ s_dumps_list_store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_STRING, /* reported */
+ G_TYPE_STRING, /* executable */
+ G_TYPE_STRING, /* hostname */
+ G_TYPE_STRING, /* time */
+ G_TYPE_INT, /* unix time - used for sort */
+ G_TYPE_STRING);/* dump dir path */
+ gtk_tree_view_set_model(GTK_TREE_VIEW(s_treeview), GTK_TREE_MODEL(s_dumps_list_store));
+
+ /* Double click/Enter handler */
+ g_signal_connect(s_treeview, "row-activated", G_CALLBACK(on_row_activated_cb), NULL);
+ /* Delete handler */
+ g_signal_connect(s_treeview, "key-press-event", G_CALLBACK(on_key_press_event_cb), NULL);
+ /* Quit when user closes the main window */
+ g_signal_connect(main_window, "destroy", gtk_main_quit, NULL);
+
+ return main_window;
+}
+
+void sanitize_cursor(GtkTreePath *preferred_path)
+{
+ GtkTreePath *path;
+
+ gtk_tree_view_get_cursor(GTK_TREE_VIEW(s_treeview), &path, /* GtkTreeViewColumn** */ NULL);
+ if (path)
+ {
+ /* Cursor exists already */
+ goto ret;
+ }
+
+ if (preferred_path)
+ {
+ /* Try to position cursor on preferred_path */
+ gtk_tree_view_set_cursor(GTK_TREE_VIEW(s_treeview), preferred_path,
+ /* GtkTreeViewColumn *focus_column */ NULL, /* start_editing */ false);
+
+ /* Did it work? */
+ gtk_tree_view_get_cursor(GTK_TREE_VIEW(s_treeview), &path, /* GtkTreeViewColumn** */ NULL);
+ if (path) /* yes */
+ {
+ goto ret;
+ }
+ }
+
+ /* Try to position cursor on 1st element */
+ GtkTreeIter iter;
+ if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(s_dumps_list_store), &iter))
+ {
+ /* We have at least one element, put cursor on it */
+
+ /* Get path from iter pointing to 1st element */
+ path = gtk_tree_model_get_path(GTK_TREE_MODEL(s_dumps_list_store), &iter);
+
+ /* Use it to set cursor */
+ gtk_tree_view_set_cursor(GTK_TREE_VIEW(s_treeview), path,
+ /* GtkTreeViewColumn *focus_column */ NULL, /* start_editing */ false);
+ }
+ /* else we have no elements */
+
+ ret:
+ gtk_tree_path_free(path);
+
+ /* Without this, the *header* of the list gets the focus. Ugly. */
+ gtk_widget_grab_focus(s_treeview);
+}
diff --git a/src/gui-gtk/abrt-gtk.h b/src/gui-gtk/abrt-gtk.h
new file mode 100644
index 00000000..d67ca6ce
--- /dev/null
+++ b/src/gui-gtk/abrt-gtk.h
@@ -0,0 +1,5 @@
+GtkWidget *create_main_window(void);
+void add_directory_to_dirlist(const char *dirname);
+void sanitize_cursor(GtkTreePath *preferred_path);
+
+void scan_dirs_and_add_to_dirlist();
diff --git a/src/gui-gtk/main.c b/src/gui-gtk/main.c
new file mode 100644
index 00000000..d80256e9
--- /dev/null
+++ b/src/gui-gtk/main.c
@@ -0,0 +1,101 @@
+#include <gtk/gtk.h>
+#include "abrtlib.h"
+#include "parse_options.h"
+#include "abrt-gtk.h"
+
+#define PROGNAME "abrt-gtk"
+
+static char **s_dirs;
+
+static void scan_directory_and_add_to_dirlist(const char *path)
+{
+ DIR *dp = opendir(path);
+ if (!dp)
+ {
+ /* We don't want to yell if, say, $HOME/.abrt/spool doesn't exist */
+ //perror_msg("Can't open directory '%s'", path);
+ return;
+ }
+
+ struct dirent *dent;
+ while ((dent = readdir(dp)) != NULL)
+ {
+ if (dot_or_dotdot(dent->d_name))
+ continue; /* skip "." and ".." */
+
+ char *full_name = concat_path_file(path, dent->d_name);
+ struct stat statbuf;
+ if (stat(full_name, &statbuf) == 0 && S_ISDIR(statbuf.st_mode))
+ add_directory_to_dirlist(full_name);
+ free(full_name);
+ }
+ closedir(dp);
+}
+
+void scan_dirs_and_add_to_dirlist(void)
+{
+ char **argv = s_dirs;
+ while (*argv)
+ scan_directory_and_add_to_dirlist(*argv++);
+}
+
+int main(int argc, char **argv)
+{
+ /* I18n */
+ setlocale(LC_ALL, "");
+
+ gtk_init(&argc, &argv);
+
+ char *env_verbose = getenv("ABRT_VERBOSE");
+ if (env_verbose)
+ g_verbose = atoi(env_verbose);
+
+ /* Can't keep these strings/structs static: _() doesn't support that */
+ const char *program_usage_string = _(
+ PROGNAME" [-v] [DIR]...\n\n"
+ "Shows list of ABRT dump directories in specified DIR(s)\n"
+ "(default DIRs: "DEBUG_DUMPS_DIR" $HOME/.abrt/spool)"
+ );
+ enum {
+ OPT_v = 1 << 0,
+ };
+ /* Keep enum above and order of options below in sync! */
+ struct options program_options[] = {
+ OPT__VERBOSE(&g_verbose),
+ OPT_END()
+ };
+ /*unsigned opts =*/ parse_opts(argc, argv, program_options, program_usage_string);
+
+ putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
+
+ GtkWidget *main_window = create_main_window();
+
+ const char *default_dirs[] = {
+ "/var/spool/abrt",
+ NULL,
+ NULL,
+ };
+ argv += optind;
+ if (!argv[0])
+ {
+ char *home = getenv("HOME");
+ if (home)
+ default_dirs[1] = concat_path_file(home, ".abrt/spool");
+ argv = (char**)default_dirs;
+ }
+ s_dirs = argv;
+
+ scan_dirs_and_add_to_dirlist();
+
+ gtk_widget_show_all(main_window);
+
+ sanitize_cursor(NULL);
+
+ /* Prevent zombies when we spawn wizard */
+ signal(SIGCHLD, SIG_IGN);
+
+ /* Enter main loop */
+ gtk_main();
+
+ return 0;
+}
diff --git a/src/gui-wizard-gtk/Makefile.am b/src/gui-wizard-gtk/Makefile.am
new file mode 100644
index 00000000..4281c470
--- /dev/null
+++ b/src/gui-wizard-gtk/Makefile.am
@@ -0,0 +1,60 @@
+# bug-reporting-wizard binary
+bin_PROGRAMS = bug-reporting-wizard
+
+bug_reporting_wizard_SOURCES = \
+ wizard.h wizard.c \
+ main.c \
+ wizard_glade.c
+
+# Required for gtk_builder_connect_signals() to work correctly:
+# -g
+# -Wl,--export-dynamic
+bug_reporting_wizard_CFLAGS = \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
+ -I$(srcdir)/../lib \
+ -DBIN_DIR=\"$(bindir)\" \
+ -DVAR_RUN=\"$(VAR_RUN)\" \
+ -DCONF_DIR=\"$(CONF_DIR)\" \
+ -DDATA_DIR=\"$(datadir)\" \
+ -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \
+ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
+ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
+ -DICON_DIR=\"${datadir}/abrt/icons/hicolor/48x48/status\" \
+ $(GLIB_CFLAGS) \
+ $(GTK_CFLAGS) \
+ $(DBUS_CFLAGS) \
+ -D_GNU_SOURCE \
+ -Wall -Werror
+
+# Required for gtk_builder_connect_signals() to work correctly:
+# -lgmodule-2.0
+# -lgthread-2.0
+bug_reporting_wizard_LDADD = \
+ ../lib/libreport.la \
+ ../lib/libabrt_dbus.la \
+ $(GLIB_LIBS) \
+ $(GTK_LIBS) \
+ $(DBUS_LIBS)
+
+
+# we don't want to install it, just make it part of tarball
+# created by make dist
+GLADE_FILES = wizard.glade
+#pkgdata_DATA = $(GLADE_FILES)
+EXTRA_DIST = $(GLADE_FILES)
+
+
+# For internal glade file storage in the binary:
+wizard.c: wizard_glade.c
+
+wizard_glade.c: wizard.glade
+ { \
+ echo '#define WIZARD_GLADE_CONTENTS "\'; \
+ cat $(srcdir)/wizard.glade | sed -e 's/"/\\"/g' -e 's/?/\\?/g' -e 's/$$/\\/g'; \
+ echo '"'; \
+ } >wizard_glade.c
+
+
+DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@
+
+@INTLTOOL_DESKTOP_RULE@
diff --git a/src/gui-wizard-gtk/main.c b/src/gui-wizard-gtk/main.c
new file mode 100644
index 00000000..85f962cd
--- /dev/null
+++ b/src/gui-wizard-gtk/main.c
@@ -0,0 +1,80 @@
+#include <gtk/gtk.h>
+#include "abrtlib.h"
+#include "parse_options.h"
+#include "wizard.h"
+
+#define PROGNAME "bug-reporting-wizard"
+
+char *g_glade_file = NULL;
+char *g_dump_dir_name = NULL;
+char *g_analyze_label_selected = NULL;
+char *g_analyze_events = NULL;
+char *g_reanalyze_events = NULL;
+char *g_report_events = NULL;
+crash_data_t *g_cd;
+
+
+void reload_crash_data_from_dump_dir(void)
+{
+ free_crash_data(g_cd);
+ free(g_analyze_events);
+ free(g_reanalyze_events);
+ free(g_report_events);
+
+ struct dump_dir *dd = dd_opendir(g_dump_dir_name, DD_OPEN_READONLY);
+ if (!dd)
+ xfunc_die(); /* dd_opendir already logged error msg */
+ g_cd = create_crash_data_from_dump_dir(dd);
+ g_analyze_events = list_possible_events(dd, NULL, "analyze");
+ g_reanalyze_events = list_possible_events(dd, NULL, "reanalyze");
+ g_report_events = list_possible_events(dd, NULL, "report");
+ dd_close(dd);
+}
+
+int main(int argc, char **argv)
+{
+ gtk_init(&argc, &argv);
+
+ char *env_verbose = getenv("ABRT_VERBOSE");
+ if (env_verbose)
+ g_verbose = atoi(env_verbose);
+
+ /* Can't keep these strings/structs static: _() doesn't support that */
+ const char *program_usage_string = _(
+ PROGNAME" [-v] [-g GUI_FILE] DIR\n\n"
+ "GUI tool to analyze and report ABRT crash in specified DIR"
+ );
+ enum {
+ OPT_v = 1 << 0,
+ OPT_g = 1 << 1,
+ };
+ /* Keep enum above and order of options below in sync! */
+ struct options program_options[] = {
+ OPT__VERBOSE(&g_verbose),
+ OPT_STRING('g', NULL, &g_glade_file, "FILE" , _("Alternate GUI file")),
+ OPT_END()
+ };
+
+ /*unsigned opts =*/ parse_opts(argc, argv, program_options, program_usage_string);
+
+ putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
+
+ argv += optind;
+ if (!argv[0] || argv[1]) /* zero or >1 arguments */
+ show_usage_and_die(program_usage_string, program_options);
+
+ g_dump_dir_name = xstrdup(argv[0]);
+
+ create_assistant();
+
+ g_custom_logger = &show_error_as_msgbox;
+
+ reload_crash_data_from_dump_dir();
+
+ update_gui_state_from_crash_data();
+
+ /* Enter main loop */
+ gtk_main();
+
+ return 0;
+}
diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
new file mode 100644
index 00000000..77699480
--- /dev/null
+++ b/src/gui-wizard-gtk/wizard.c
@@ -0,0 +1,968 @@
+#include <gtk/gtk.h>
+#include "abrtlib.h"
+#include "abrt_dbus.h"
+#include "wizard.h"
+
+#define DEFAULT_WIDTH 800
+#define DEFAULT_HEIGHT 500
+
+GtkAssistant *g_assistant;
+
+GtkBox *g_box_analyzers;
+GtkLabel *g_lbl_analyze_log;
+GtkTextView *g_tv_analyze_log;
+GtkBox *g_box_reporters;
+GtkLabel *g_lbl_report_log;
+GtkTextView *g_tv_report_log;
+GtkContainer *g_container_details1;
+GtkContainer *g_container_details2;
+
+GtkLabel *g_lbl_cd_reason;
+GtkTextView *g_tv_backtrace;
+GtkTextView *g_tv_reproduce;
+GtkTextView *g_tv_comment;
+GtkTreeView *g_tv_details;
+GtkListStore *g_ls_details;
+GtkWidget *g_widget_warnings_area;
+GtkBox *g_box_warning_labels;
+GtkToggleButton *g_tb_approve_bt;
+GtkButton *g_btn_refresh;
+
+/* required for search in bt */
+guint g_timeout = 0;
+GtkEntry * g_search_entry_bt;
+
+
+static GtkBuilder *builder;
+static PangoFontDescription *monospace_font;
+
+
+/* THE PAGE FLOW
+ * page_1: analyze action selection
+ * page_2: analyze progress
+ * page_3: reporter selection
+ * page_4: backtrace editor
+ * page_5: how to + user comments
+ * page_6: summary
+ * page_7: reporting progress
+ */
+
+/* Use of arrays (instead of, say, #defines to C strings)
+ * allows cheaper page_obj_t->name == PAGE_FOO comparisons
+ * instead of strcmp.
+ */
+static const gchar PAGE_SUMMARY[] = "page_0";
+static const gchar PAGE_ANALYZE_SELECTOR[] = "page_1";
+static const gchar PAGE_ANALYZE_PROGRESS[] = "page_2";
+static const gchar PAGE_REPORTER_SELECTOR[] = "page_3";
+static const gchar PAGE_BACKTRACE_APPROVAL[] = "page_4";
+static const gchar PAGE_HOWTO[] = "page_5";
+static const gchar PAGE_REPORT[] = "page_6";
+static const gchar PAGE_REPORT_PROGRESS[] = "page_7";
+
+static const gchar *const page_names[] =
+{
+ PAGE_SUMMARY,
+ PAGE_ANALYZE_SELECTOR,
+ PAGE_ANALYZE_PROGRESS,
+ PAGE_REPORTER_SELECTOR,
+ PAGE_BACKTRACE_APPROVAL,
+ PAGE_HOWTO,
+ PAGE_REPORT,
+ PAGE_REPORT_PROGRESS,
+ NULL
+};
+
+typedef struct
+{
+ const gchar *name;
+ const gchar *title;
+ GtkAssistantPageType type;
+ GtkWidget *page_widget;
+} page_obj_t;
+
+static page_obj_t pages[] =
+{
+ /* Page types:
+ * INTRO: only [Fwd] button is shown
+ * CONTENT: normal page
+ * CONFIRM: has [Apply] instead of [Fwd] and emits "apply" signal
+ * PROGRESS: skipped on backward navigation
+ * SUMMARY: has only [Close] button
+ */
+ /* glade element name , on-screen text , type */
+ { PAGE_SUMMARY , "Problem description" , GTK_ASSISTANT_PAGE_CONTENT },
+ { PAGE_ANALYZE_SELECTOR , "Select analyzer" , GTK_ASSISTANT_PAGE_CONFIRM },
+ { PAGE_ANALYZE_PROGRESS , "Analyzing" , GTK_ASSISTANT_PAGE_CONTENT },
+ /* Some reporters don't need backtrace, we can skip bt page for them.
+ * Therefore we want to know reporters _before_ we go to bt page
+ */
+ { PAGE_REPORTER_SELECTOR , "Select reporter" , GTK_ASSISTANT_PAGE_CONTENT },
+ { PAGE_BACKTRACE_APPROVAL , "Review the backtrace" , GTK_ASSISTANT_PAGE_CONTENT },
+ { PAGE_HOWTO , "Provide additional information", GTK_ASSISTANT_PAGE_CONTENT },
+ { PAGE_REPORT , "Confirm data to report", GTK_ASSISTANT_PAGE_CONFIRM },
+ /* Was GTK_ASSISTANT_PAGE_PROGRESS */
+ { PAGE_REPORT_PROGRESS , "Reporting" , GTK_ASSISTANT_PAGE_SUMMARY },
+ { NULL }
+};
+
+
+/* Utility functions */
+
+static void remove_child_widget(GtkWidget *widget, gpointer container)
+{
+ /* Destroy will safely remove it and free the memory
+ * if there are no refs left
+ */
+ gtk_widget_destroy(widget);
+}
+
+static void save_dialog_response(GtkDialog *dialog, gint response_id, gpointer user_data)
+{
+ *(gint*)user_data = response_id;
+}
+
+struct dump_dir *steal_if_needed(struct dump_dir *dd)
+{
+ if (!dd)
+ xfunc_die(); /* error msg was already logged */
+
+ if (dd->locked)
+ return dd;
+
+ dd_close(dd);
+
+ char *HOME = getenv("HOME");
+ if (HOME && HOME[0])
+ HOME = concat_path_file(HOME, ".abrt/spool");
+ else
+ HOME = xstrdup("/tmp");
+
+ GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(g_assistant),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_OK_CANCEL,
+ _("Need writable directory, but '%s' is not writable."
+ " Move it to '%s' and operate on the moved copy?"),
+ g_dump_dir_name, HOME
+ );
+ gint response = GTK_RESPONSE_CANCEL;
+ g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(save_dialog_response), &response);
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+
+ if (response != GTK_RESPONSE_OK)
+ return NULL;
+
+ dd = steal_directory(HOME, g_dump_dir_name);
+ if (!dd)
+ return NULL; /* Stealing failed. Error msg was already logged */
+
+ /* Delete old dir and switch to new one.
+ * Don't want to keep new dd open across deletion,
+ * therefore it's a bit more complicated.
+ */
+ char *old_name = g_dump_dir_name;
+ g_dump_dir_name = xstrdup(dd->dd_dirname);
+ dd_close(dd);
+
+ gtk_window_set_title(GTK_WINDOW(g_assistant), g_dump_dir_name);
+ delete_dump_dir_possibly_using_abrtd(old_name); //TODO: if (deletion_failed) error_msg("BAD")?
+ free(old_name);
+
+ dd = dd_opendir(g_dump_dir_name, 0);
+ if (!dd)
+ xfunc_die(); /* error msg was already logged */
+
+ return dd;
+}
+
+void show_error_as_msgbox(const char *msg)
+{
+ GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(g_assistant),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_WARNING,
+ GTK_BUTTONS_CLOSE,
+ "%s", msg
+ );
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+}
+
+static void load_text_to_text_view(GtkTextView *tv, const char *name)
+{
+ const char *str = g_cd ? get_crash_item_content_or_NULL(g_cd, name) : NULL;
+ gtk_text_buffer_set_text(gtk_text_view_get_buffer(tv), (str ? str : ""), -1);
+}
+
+static gchar *get_malloced_string_from_text_view(GtkTextView *tv)
+{
+ GtkTextBuffer *buffer = gtk_text_view_get_buffer(tv);
+ GtkTextIter start;
+ GtkTextIter end;
+ gtk_text_buffer_get_start_iter(buffer, &start);
+ gtk_text_buffer_get_end_iter(buffer, &end);
+ return gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
+}
+
+static void save_text_if_changed(const char *name, const char *new_value)
+{
+ const char *old_value = g_cd ? get_crash_item_content_or_NULL(g_cd, name) : "";
+ if (!old_value)
+ old_value = "";
+ if (strcmp(new_value, old_value) != 0)
+ {
+ struct dump_dir *dd = dd_opendir(g_dump_dir_name, DD_OPEN_READONLY);
+ dd = steal_if_needed(dd);
+ if (dd && dd->locked)
+ {
+ dd_save_text(dd, name, new_value);
+ add_to_crash_data_ext(g_cd, name, new_value, CD_FLAG_TXT | CD_FLAG_ISEDITABLE);
+ }
+//FIXME: else: what to do with still-unsaved data in the widget??
+ dd_close(dd);
+ }
+}
+
+static void save_text_from_text_view(GtkTextView *tv, const char *name)
+{
+ gchar *new_str = get_malloced_string_from_text_view(tv);
+ save_text_if_changed(name, new_str);
+ free(new_str);
+}
+
+
+/* update_gui_state_from_crash_data */
+
+static void analyze_rb_was_toggled(GtkButton *button, gpointer user_data)
+{
+ const char *label = gtk_button_get_label(button);
+ if (label)
+ {
+ free(g_analyze_label_selected);
+ g_analyze_label_selected = xstrdup(label);
+ }
+}
+
+static void report_tb_was_toggled(GtkButton *button, gpointer user_data)
+{
+ GList *reporters = gtk_container_get_children(GTK_CONTAINER(g_box_reporters));
+ GList *li = reporters;
+ if (reporters)
+ {
+ for (; li; li = li->next)
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(li->data)) == TRUE)
+ break;
+ }
+ g_list_free(reporters);
+ gtk_assistant_set_page_complete(g_assistant,
+ pages[PAGENO_REPORTER_SELECTOR].page_widget,
+ li != NULL /* true if at least one checkbox is active */
+ );
+}
+
+static GtkWidget *add_event_buttons(GtkBox *box, char *event_name, GCallback func, bool radio, const char *prev_selected)
+{
+VERB2 log("removing all buttons from box %p", box);
+ gtk_container_foreach(GTK_CONTAINER(box), &remove_child_widget, box);
+
+ bool have_activated_btn = false;
+ GtkWidget *first_button = NULL;
+ while (event_name[0])
+ {
+ char *event_name_end = strchr(event_name, '\n');
+ *event_name_end = '\0';
+
+VERB2 log("adding button '%s' to box %p", event_name, box);
+ GtkWidget *button = radio
+ ? gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(first_button), event_name)
+ : gtk_check_button_new_with_label(event_name);
+ if (!first_button)
+ first_button = button;
+
+ if (prev_selected && strcmp(prev_selected, event_name) == 0)
+ {
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), true);
+ have_activated_btn = true;
+ prev_selected = NULL;
+ }
+
+ *event_name_end = '\n';
+ event_name = event_name_end + 1;
+
+ gtk_box_pack_start(box, button, /*expand*/ false, /*fill*/ false, /*padding*/ 0);
+
+ if (func)
+ g_signal_connect(G_OBJECT(button), "toggled", func, NULL);
+ }
+ return (have_activated_btn ? NULL : first_button);
+}
+
+static void append_item_to_details_ls(gpointer name, gpointer value, gpointer data)
+{
+ crash_item *item = (crash_item*)value;
+ GtkTreeIter iter;
+
+ gtk_list_store_append(g_ls_details, &iter);
+
+ //FIXME: use the value representation here
+ /* If text and not multiline... */
+ if ((item->flags & CD_FLAG_TXT) && !strchr(item->content, '\n'))
+ {
+ gtk_list_store_set(g_ls_details, &iter,
+ DETAIL_COLUMN_NAME, (char *)name,
+ DETAIL_COLUMN_VALUE, item->content,
+ //DETAIL_COLUMN_PATH, xasprintf("%s%s", g_dump_dir_name, name),
+ -1);
+ }
+ else
+ {
+ gtk_list_store_set(g_ls_details, &iter,
+ DETAIL_COLUMN_NAME, (char *)name,
+ DETAIL_COLUMN_VALUE, _("(click here to view/edit)"),
+ //DETAIL_COLUMN_PATH, xasprintf("%s%s", g_dump_dir_name, name),
+ -1);
+ //WARNING: will leak xasprintf results above if uncommented
+ }
+}
+
+void update_gui_state_from_crash_data(void)
+{
+ const char *reason = get_crash_item_content_or_NULL(g_cd, FILENAME_REASON);
+ gtk_label_set_text(g_lbl_cd_reason, reason ? reason : _("(no description)"));
+
+ gtk_list_store_clear(g_ls_details);
+ g_hash_table_foreach(g_cd, append_item_to_details_ls, NULL);
+
+ load_text_to_text_view(g_tv_backtrace, FILENAME_BACKTRACE);
+ load_text_to_text_view(g_tv_reproduce, FILENAME_REPRODUCE);
+ load_text_to_text_view(g_tv_comment, FILENAME_COMMENT);
+
+//Doesn't work: shows empty page
+// if (!g_analyze_events[0])
+// {
+// /* No available analyze events, go to reporter selector page */
+// gtk_assistant_set_current_page(GTK_ASSISTANT(assistant), PAGENO_REPORTER_SELECTOR);
+// }
+
+ /* Update analyze radio buttons */
+ GtkWidget *first_rb = add_event_buttons(g_box_analyzers, g_analyze_events, G_CALLBACK(analyze_rb_was_toggled), /*radio:*/ true, /*prev:*/ g_analyze_label_selected);
+ /* Update the value of currently selected analyzer */
+ if (first_rb)
+ {
+ const char *label = gtk_button_get_label(GTK_BUTTON(first_rb));
+ if (label)
+ {
+ free(g_analyze_label_selected);
+ g_analyze_label_selected = xstrdup(label);
+ }
+ }
+
+ /* Update reporter checkboxes */
+ /* Remember names of selected reporters */
+ GList *old_reporters = gtk_container_get_children(GTK_CONTAINER(g_box_reporters));
+ for (GList *li = old_reporters; li; li = li->next)
+ {
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(li->data)) == TRUE)
+ li->data = xstrdup(gtk_button_get_label(GTK_BUTTON(li->data)));
+ else
+ li->data = NULL;
+ }
+ old_reporters = g_list_remove_all(old_reporters, NULL);
+ /* Delete old checkboxes and create new ones */
+ add_event_buttons(g_box_reporters, g_report_events, /*callback:*/ G_CALLBACK(report_tb_was_toggled), /*radio:*/ false, /*prev:*/ NULL);
+ /* Re-select new reporters which were selected before we deleted them */
+ GList *new_reporters = gtk_container_get_children(GTK_CONTAINER(g_box_reporters));
+ for (GList *li_new = new_reporters; li_new; li_new = li_new->next)
+ {
+ const char *new_name = gtk_button_get_label(GTK_BUTTON(li_new->data));
+ for (GList *li_old = old_reporters; li_old; li_old = li_old->next)
+ {
+ if (strcmp(new_name, li_old->data) == 0)
+ {
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(li_new->data), true);
+ break;
+ }
+ }
+ }
+ g_list_free(new_reporters);
+ list_free_with_free(old_reporters);
+ /* Update readiness state of reporter selector page */
+ report_tb_was_toggled(NULL, NULL);
+
+ /* We can't just do gtk_widget_show_all once in main:
+ * We created new widgets (buttons). Need to make them visible.
+ */
+ gtk_widget_show_all(GTK_WIDGET(g_assistant));
+
+ if (g_reanalyze_events[0])
+ gtk_widget_show(GTK_WIDGET(g_btn_refresh));
+ else
+ gtk_widget_hide(GTK_WIDGET(g_btn_refresh));
+}
+
+
+/* start_event_run */
+
+struct analyze_event_data
+{
+ struct run_event_state *run_state;
+ const char *event_name;
+ GList *more_events;
+ GtkWidget *page_widget;
+ GtkLabel *status_label;
+ GtkTextView *tv_log;
+ const char *end_msg;
+ GIOChannel *channel;
+ int fd;
+ /*guint event_source_id;*/
+};
+
+static void append_to_textview(GtkTextView *tv, const char *str, int len)
+{
+ GtkTextBuffer *tb = gtk_text_view_get_buffer(tv);
+
+ /* Ensure we insert text at the end */
+ GtkTextIter text_iter;
+ gtk_text_buffer_get_iter_at_offset(tb, &text_iter, -1);
+ gtk_text_buffer_place_cursor(tb, &text_iter);
+
+ gtk_text_buffer_insert_at_cursor(tb, str, len >= 0 ? len : strlen(str));
+
+ /* Scroll so that the end of the log is visible */
+ gtk_text_buffer_get_iter_at_offset(tb, &text_iter, -1);
+ gtk_text_view_scroll_to_iter(tv, &text_iter,
+ /*within_margin:*/ 0.0, /*use_align:*/ FALSE, /*xalign:*/ 0, /*yalign:*/ 0);
+}
+
+static gboolean consume_cmd_output(GIOChannel *source, GIOCondition condition, gpointer data)
+{
+ struct analyze_event_data *evd = data;
+
+ /* Read and insert the output into the log pane */
+ char buf[256]; /* usually we get one line, no need to have big buf */
+ int r;
+ while ((r = read(evd->fd, buf, sizeof(buf))) > 0)
+ {
+ append_to_textview(evd->tv_log, buf, r);
+ }
+
+ if (r < 0 && errno == EAGAIN)
+ /* We got all data, but fd is still open. Done for now */
+ return TRUE; /* "please don't remove this event (yet)" */
+
+ /* EOF/error. Wait for child to actually exit, collect status */
+ int status;
+ waitpid(evd->run_state->command_pid, &status, 0);
+ int retval = WEXITSTATUS(status);
+ if (WIFSIGNALED(status))
+ retval = WTERMSIG(status) + 128;
+
+ /* Stop if exit code is not 0, or no more commands */
+ if (retval != 0
+ || spawn_next_command(evd->run_state, g_dump_dir_name, evd->event_name) < 0
+ ) {
+ VERB1 log("done running event on '%s': %d", g_dump_dir_name, retval);
+//append_to_textview(evd->tv_log, msg);
+
+ for (;;)
+ {
+ if (!evd->more_events)
+ {
+ char *msg = xasprintf(evd->end_msg, retval);
+ gtk_label_set_text(evd->status_label, msg);
+ free(msg);
+ /* Unfreeze assistant */
+ gtk_assistant_set_page_complete(g_assistant, evd->page_widget, true);
+
+ /*g_source_remove(evd->event_source_id);*/
+ close(evd->fd);
+ free_run_event_state(evd->run_state);
+ free(evd);
+
+ reload_crash_data_from_dump_dir();
+ update_gui_state_from_crash_data();
+
+ return FALSE; /* "please remove this event" */
+ }
+
+ evd->event_name = evd->more_events->data;
+ evd->more_events = g_list_remove(evd->more_events, evd->more_events->data);
+
+ if (prepare_commands(evd->run_state, g_dump_dir_name, evd->event_name) != 0
+ && spawn_next_command(evd->run_state, g_dump_dir_name, evd->event_name) >= 0
+ ) {
+ VERB1 log("running event '%s' on '%s'", evd->event_name, g_dump_dir_name);
+ break;
+ }
+ /* No commands needed?! (This is untypical) */
+//TODO: msg?
+//append_to_textview(evd->tv_log, msg);
+ }
+ }
+
+ /* New command was started. Continue waiting for input */
+
+ /* Transplant cmd's output fd onto old one, so that main loop
+ * is none the wiser that fd it waits on has changed
+ */
+ xmove_fd(evd->run_state->command_out_fd, evd->fd);
+ evd->run_state->command_out_fd = evd->fd; /* just to keep it consistent */
+ ndelay_on(evd->fd);
+
+ return TRUE; /* "please don't remove this event (yet)" */
+}
+
+static void start_event_run(const char *event_name,
+ GList *more_events,
+ GtkWidget *page,
+ GtkTextView *tv_log,
+ GtkLabel *status_label,
+ const char *start_msg,
+ const char *end_msg
+) {
+ /* Start event asyncronously on the dump dir
+ * (syncronous run would freeze GUI until completion)
+ */
+ struct run_event_state *state = new_run_event_state();
+
+ if (prepare_commands(state, g_dump_dir_name, event_name) == 0)
+ {
+ no_cmds:
+ /* No commands needed?! (This is untypical) */
+ free_run_event_state(state);
+//TODO: better msg?
+ char *msg = xasprintf(_("No processing for event '%s' is defined"), event_name);
+ gtk_label_set_text(status_label, msg);
+ free(msg);
+ return;
+ }
+
+ struct dump_dir *dd = dd_opendir(g_dump_dir_name, DD_OPEN_READONLY);
+ dd = steal_if_needed(dd);
+ int locked = (dd && dd->locked);
+ dd_close(dd);
+ if (!locked)
+ return; /* user refused to steal, or write error, etc... */
+
+ if (spawn_next_command(state, g_dump_dir_name, event_name) < 0)
+ goto no_cmds;
+
+ VERB1 log("running event '%s' on '%s'", event_name, g_dump_dir_name);
+
+ /* At least one command is needed, and we started first one.
+ * Hook its output fd to the main loop.
+ */
+ struct analyze_event_data *evd = xzalloc(sizeof(*evd));
+ evd->run_state = state;
+ evd->event_name = event_name;
+ evd->more_events = more_events;
+ evd->page_widget = page;
+ evd->status_label = status_label;
+ evd->tv_log = tv_log;
+ evd->end_msg = end_msg;
+ evd->fd = state->command_out_fd;
+ ndelay_on(evd->fd);
+ evd->channel = g_io_channel_unix_new(evd->fd);
+ /*evd->event_source_id = */ g_io_add_watch(evd->channel,
+ G_IO_IN | G_IO_ERR | G_IO_HUP, /* need HUP to detect EOF w/o any data */
+ consume_cmd_output,
+ evd
+ );
+
+ gtk_label_set_text(status_label, start_msg);
+ /* Freeze assistant so it can't move away from the page until analyzing is done */
+ gtk_assistant_set_page_complete(g_assistant, page, false);
+}
+
+
+/* Backtrace checkbox handling */
+
+static void add_warning(const char *warning)
+{
+ char *label_str = xasprintf("• %s", warning);
+ GtkWidget *warning_lbl = gtk_label_new(label_str);
+ /* should be safe to free it, gtk calls strdup() to copy it */
+ free(label_str);
+
+ gtk_misc_set_alignment(GTK_MISC(warning_lbl), 0.0, 0.0);
+ gtk_label_set_justify(GTK_LABEL(warning_lbl), GTK_JUSTIFY_LEFT);
+ gtk_box_pack_start(g_box_warning_labels, warning_lbl, false, false, 0);
+ gtk_widget_show(warning_lbl);
+}
+
+static void check_backtrace_and_allow_send(void) //TODO: rename, this checks rating, not backtrace
+{
+ bool send = true;
+ bool warn = false;
+
+ /* erase all warnings */
+ gtk_widget_hide(g_widget_warnings_area);
+ gtk_container_foreach(GTK_CONTAINER(g_box_warning_labels), &remove_child_widget, NULL);
+
+ /*
+ * FIXME: this should be bind to a reporter not to a compoment
+ * but so far only oopses doesn't have rating, so for now we
+ * skip the "kernel" manually
+ */
+ const char *component = get_crash_item_content_or_NULL(g_cd, FILENAME_COMPONENT);
+ if (strcmp(component, "kernel") != 0)
+ {
+ const char *rating = get_crash_item_content_or_NULL(g_cd, FILENAME_RATING);
+ if (rating) switch (*rating)
+ {
+ case '4': //bt is ok - no warning here
+ break;
+ case '3': //bt is usable, but not complete, so show a warning
+ add_warning(_("The backtrace is incomplete, please make sure you provide the steps to reproduce."));
+ warn = true;
+ break;
+ case '2':
+ case '1':
+ //FIXME: see CreporterAssistant: 394 for ideas
+ add_warning(_("Reporting disabled because the backtrace is unusable."));
+ send = false;
+ warn = true;
+ break;
+ }
+ }
+
+ if (!gtk_toggle_button_get_active(g_tb_approve_bt))
+ {
+ add_warning(_("You should check the backtrace for sensitive data."));
+ add_warning(_("You must agree with sending the backtrace."));
+ send = false;
+ warn = true;
+ }
+
+ gtk_assistant_set_page_complete(g_assistant,
+ pages[PAGENO_BACKTRACE_APPROVAL].page_widget,
+ send);
+ if (warn)
+ gtk_widget_show(g_widget_warnings_area);
+}
+
+static void on_bt_approve_toggle(GtkToggleButton *togglebutton, gpointer user_data)
+{
+ check_backtrace_and_allow_send();
+}
+
+
+/* Refresh button handling */
+
+static void on_btn_refresh_clicked(GtkButton *button)
+{
+ if (g_reanalyze_events[0])
+ {
+ g_analyze_events = append_to_malloced_string(g_analyze_events, g_reanalyze_events);
+ g_reanalyze_events[0] = '\0';
+ /* Save backtrace text if changed */
+ save_text_from_text_view(g_tv_backtrace, FILENAME_BACKTRACE);
+ /* Refresh GUI so that we see new analyze+reanalyze buttons */
+ update_gui_state_from_crash_data();
+ /* Change page to analyzer selector - let user play with them */
+ gtk_assistant_set_current_page(g_assistant, PAGENO_ANALYZE_SELECTOR);
+ }
+}
+
+
+/* Page navigation handlers */
+
+static void next_page(GtkAssistant *assistant, gpointer user_data)
+{
+ /* page_no is actually the previous page, because this
+ * function is called before assistant goes to the next_page
+ */
+ int page_no = gtk_assistant_get_current_page(assistant);
+ VERB2 log("page_no:%d", page_no);
+
+ if (page_no == PAGENO_ANALYZE_SELECTOR
+ && g_analyze_label_selected != NULL)
+ {
+ start_event_run(/*event_name:*/ g_analyze_label_selected,
+ NULL,
+ pages[PAGENO_ANALYZE_PROGRESS].page_widget,
+ g_tv_analyze_log,
+ g_lbl_analyze_log,
+ _("Analyzing..."),
+ _("Analyzing finished with exit code %d")
+ );
+ }
+
+ if (page_no == PAGENO_REPORT)
+ {
+ GList *reporters = gtk_container_get_children(GTK_CONTAINER(g_box_reporters));
+ if (reporters)
+ {
+ for (GList *li = reporters; li; li = li->next)
+ {
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(li->data)) == TRUE)
+ li->data = (gpointer)gtk_button_get_label(GTK_BUTTON(li->data));
+ else
+ li->data = NULL;
+ }
+ reporters = g_list_remove_all(reporters, NULL);
+ if (reporters)
+ {
+ char *first_event_name = reporters->data;
+ reporters = g_list_remove(reporters, reporters->data);
+ start_event_run(first_event_name,
+ reporters,
+ pages[PAGENO_REPORT_PROGRESS].page_widget,
+ g_tv_report_log,
+ g_lbl_report_log,
+ _("Reporting..."),
+ _("Reporting finished with exit code %d")
+ );
+ }
+ }
+ }
+}
+
+static void on_page_prepare(GtkAssistant *assistant, GtkWidget *page, gpointer user_data)
+{
+ if (pages[PAGENO_BACKTRACE_APPROVAL].page_widget == page)
+ {
+ check_backtrace_and_allow_send();
+ }
+
+ if (pages[PAGENO_HOWTO].page_widget == page)
+ {
+ /* User just pressed [Fwd] on backtrace page. Save backtrace text if changed */
+ save_text_from_text_view(g_tv_backtrace, FILENAME_BACKTRACE);
+ }
+
+ if (pages[PAGENO_REPORT].page_widget == page)
+ {
+ /* User just pressed [Fwd] on comment page. Same as above */
+ save_text_from_text_view(g_tv_reproduce, FILENAME_REPRODUCE);
+ save_text_from_text_view(g_tv_comment, FILENAME_COMMENT);
+ }
+
+ if (pages[PAGENO_SUMMARY].page_widget == page
+ || pages[PAGENO_REPORT].page_widget == page
+ ) {
+ GtkWidget *w = GTK_WIDGET(g_tv_details);
+ GtkContainer *c = GTK_CONTAINER(gtk_widget_get_parent(w));
+ if (c)
+ gtk_container_remove(c, w);
+ gtk_container_add(pages[PAGENO_SUMMARY].page_widget == page ?
+ g_container_details1 : g_container_details2,
+ w
+ );
+ }
+}
+
+static gint next_page_no(gint current_page_no, gpointer data)
+{
+ switch (current_page_no)
+ {
+ case PAGENO_SUMMARY:
+ if (!g_analyze_events[0])
+ {
+ //TODO: if (!g_reporter_events[0]) /* no reporters available */ then what?
+ return PAGENO_REPORTER_SELECTOR; /* skip analyze pages */
+ }
+ break;
+
+ case PAGENO_REPORTER_SELECTOR:
+ if (get_crash_item_content_or_NULL(g_cd, FILENAME_BACKTRACE))
+ break;
+ current_page_no++; /* no backtrace, skip next page */
+ /* fall through */
+
+#if 0
+ case PAGENO_BACKTRACE_APPROVAL:
+ if (get_crash_item_content_or_NULL(g_cd, FILENAME_COMMENT)
+ || get_crash_item_content_or_NULL(g_cd, FILENAME_REPRODUCE)
+ ) {
+ break;
+ }
+ current_page_no++; /* no comment, skip next page */
+ /* fall through */
+#endif
+
+ }
+
+ return current_page_no + 1;
+}
+
+
+static gboolean highlight_search(gpointer user_data)
+{
+ GtkEntry *entry = GTK_ENTRY(user_data);
+ g_print("searching: %s\n", gtk_entry_get_text(entry));
+ //returning will make gtk to remove this event
+ return false;
+}
+
+static void search_timeout(GtkEntry *entry)
+{
+ /* this little hack makes the search start after 500 milisec after
+ * user stops writing into entry box
+ * if this part is removed, then the search will be started on every
+ * char written into the entry
+ */
+ if(g_timeout != 0)
+ g_source_remove(g_timeout);
+ g_timeout = g_timeout_add(500, &highlight_search, (gpointer)entry);
+}
+
+
+/* Initialization */
+
+static void create_details_treeview()
+{
+ GtkCellRenderer *renderer;
+ GtkTreeViewColumn *column;
+
+ renderer = gtk_cell_renderer_text_new();
+ column = gtk_tree_view_column_new_with_attributes(_("Name"),
+ renderer,
+ "text",
+ DETAIL_COLUMN_NAME,
+ NULL);
+ gtk_tree_view_column_set_sort_column_id(column, DETAIL_COLUMN_NAME);
+ gtk_tree_view_append_column(g_tv_details, column);
+
+ renderer = gtk_cell_renderer_text_new();
+ column = gtk_tree_view_column_new_with_attributes(_("Value"),
+ renderer,
+ "text",
+ DETAIL_COLUMN_VALUE,
+ NULL);
+ gtk_tree_view_append_column(g_tv_details, column);
+
+ /*
+ renderer = gtk_cell_renderer_text_new();
+ column = gtk_tree_view_column_new_with_attributes(_("Path"),
+ renderer,
+ "text",
+ DETAIL_COLUMN_PATH,
+ NULL);
+ gtk_tree_view_append_column(g_tv_details, column);
+ */
+}
+
+/* wizard.glade file as a string WIZARD_GLADE_CONTENTS: */
+#include "wizard_glade.c"
+
+static void add_pages(void)
+{
+ GError *error = NULL;
+ if (!g_glade_file)
+ {
+ /* Load UI from internal string */
+ gtk_builder_add_objects_from_string(builder,
+ WIZARD_GLADE_CONTENTS, sizeof(WIZARD_GLADE_CONTENTS) - 1,
+ (gchar**)page_names,
+ &error);
+ if (error != NULL)
+ error_msg_and_die("Error loading glade data: %s", error->message);
+ }
+ else
+ {
+ /* -g FILE: load IU from it */
+ gtk_builder_add_objects_from_file(builder, g_glade_file, (gchar**)page_names, &error);
+ if (error != NULL)
+ error_msg_and_die("Can't load %s: %s", g_glade_file, error->message);
+ }
+
+ for (int i = 0; page_names[i] != NULL; i++)
+ {
+ GtkWidget *page = GTK_WIDGET(gtk_builder_get_object(builder, page_names[i]));
+ if (page == NULL)
+ continue;
+
+ pages[i].page_widget = page;
+
+ gtk_assistant_append_page(g_assistant, page);
+ /* If we set all pages to complete the wizard thinks there is nothing
+ * to do and shows the button "Last" which allows user to skip all pages
+ * so we need to set them all as incomplete and complete them one by one
+ * on proper place - on_page_prepare() ?
+ */
+ gtk_assistant_set_page_complete(g_assistant, page, true);
+
+ gtk_assistant_set_page_title(g_assistant, page, pages[i].title);
+ gtk_assistant_set_page_type(g_assistant, page, pages[i].type);
+
+ VERB1 log("added page: %s", page_names[i]);
+ }
+ /* Set pointers to objects we might need to work with */
+ g_lbl_cd_reason = GTK_LABEL( gtk_builder_get_object(builder, "lbl_cd_reason"));
+ g_box_analyzers = GTK_BOX( gtk_builder_get_object(builder, "vb_analyzers"));
+ g_lbl_analyze_log = GTK_LABEL( gtk_builder_get_object(builder, "lbl_analyze_log"));
+ g_tv_analyze_log = GTK_TEXT_VIEW( gtk_builder_get_object(builder, "tv_analyze_log"));
+ g_box_reporters = GTK_BOX( gtk_builder_get_object(builder, "vb_reporters"));
+ g_lbl_report_log = GTK_LABEL( gtk_builder_get_object(builder, "lbl_report_log"));
+ g_tv_report_log = GTK_TEXT_VIEW( gtk_builder_get_object(builder, "tv_report_log"));
+ g_tv_backtrace = GTK_TEXT_VIEW( gtk_builder_get_object(builder, "tv_backtrace"));
+ g_tv_reproduce = GTK_TEXT_VIEW( gtk_builder_get_object(builder, "tv_reproduce"));
+ g_tv_comment = GTK_TEXT_VIEW( gtk_builder_get_object(builder, "tv_comment"));
+ g_tv_details = GTK_TREE_VIEW( gtk_builder_get_object(builder, "tv_details"));
+ g_box_warning_labels = GTK_BOX( gtk_builder_get_object(builder, "box_warning_labels"));
+ g_tb_approve_bt = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "cb_approve_bt"));
+ g_widget_warnings_area = GTK_WIDGET( gtk_builder_get_object(builder, "box_warning_area"));
+ g_btn_refresh = GTK_BUTTON( gtk_builder_get_object(builder, "btn_refresh"));
+ g_search_entry_bt = GTK_ENTRY( gtk_builder_get_object(builder, "entry_search_bt"));
+ g_container_details1 = GTK_CONTAINER( gtk_builder_get_object(builder, "container_details1"));
+ g_container_details2 = GTK_CONTAINER( gtk_builder_get_object(builder, "container_details2"));
+
+ gtk_widget_modify_font(GTK_WIDGET(g_tv_analyze_log), monospace_font);
+ gtk_widget_modify_font(GTK_WIDGET(g_tv_report_log), monospace_font);
+ gtk_widget_modify_font(GTK_WIDGET(g_tv_backtrace), monospace_font);
+
+ ///* hide the warnings by default */
+ //gtk_widget_hide(g_widget_warnings_area);
+
+ //gtk_assistant_set_page_complete(g_assistant, pages[PAGENO_REPORTER_SELECTOR].page_widget, false);
+ gtk_assistant_set_page_complete(g_assistant, pages[PAGENO_BACKTRACE_APPROVAL].page_widget,
+ gtk_toggle_button_get_active(g_tb_approve_bt));
+}
+
+void create_assistant()
+{
+ monospace_font = pango_font_description_from_string("monospace");
+
+ builder = gtk_builder_new();
+
+ g_assistant = GTK_ASSISTANT(gtk_assistant_new());
+
+ gtk_assistant_set_forward_page_func(g_assistant, next_page_no, NULL, NULL);
+
+ GtkWindow *wnd_assistant = GTK_WINDOW(g_assistant);
+ gtk_window_set_default_size(wnd_assistant, DEFAULT_WIDTH, DEFAULT_HEIGHT);
+ gtk_window_set_title(wnd_assistant, g_dump_dir_name);
+ gtk_window_set_icon_name(wnd_assistant, "abrt");
+
+ GObject *obj_assistant = G_OBJECT(g_assistant);
+ g_signal_connect(obj_assistant, "cancel", G_CALLBACK(gtk_main_quit), NULL);
+ g_signal_connect(obj_assistant, "close", G_CALLBACK(gtk_main_quit), NULL);
+ g_signal_connect(obj_assistant, "apply", G_CALLBACK(next_page), NULL);
+ g_signal_connect(obj_assistant, "prepare", G_CALLBACK(on_page_prepare), NULL);
+
+ add_pages();
+
+ create_details_treeview();
+ g_ls_details = gtk_list_store_new(DETAIL_NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+ gtk_tree_view_set_model(g_tv_details, GTK_TREE_MODEL(g_ls_details));
+
+// gtk_builder_connect_signals(builder, NULL);
+
+ g_signal_connect(g_tb_approve_bt, "toggled", G_CALLBACK(on_bt_approve_toggle), NULL);
+ g_signal_connect(g_btn_refresh, "clicked", G_CALLBACK(on_btn_refresh_clicked), NULL);
+
+ /* init search */
+ GtkTextBuffer *backtrace_buf = gtk_text_view_get_buffer(g_tv_backtrace);
+ /* found items background */
+ gtk_text_buffer_create_tag(backtrace_buf, "search_result_bg", "background", "red", NULL);
+ /* current position */
+ gtk_text_buffer_create_tag(backtrace_buf, "current_pos_bg", "background", "yellow", NULL);
+ g_signal_connect(g_search_entry_bt, "changed", G_CALLBACK(search_timeout), NULL);
+
+ gtk_assistant_set_page_complete(g_assistant,
+ pages[PAGENO_BACKTRACE_APPROVAL].page_widget,
+ gtk_toggle_button_get_active(g_tb_approve_bt)
+ );
+}
diff --git a/src/gui-wizard-gtk/wizard.glade b/src/gui-wizard-gtk/wizard.glade
new file mode 100644
index 00000000..9dde4316
--- /dev/null
+++ b/src/gui-wizard-gtk/wizard.glade
@@ -0,0 +1,746 @@
+<?xml version="1.0"?>
+<interface>
+ <requires lib="gtk+" version="2.16"/>
+ <!-- interface-naming-policy project-wide -->
+ <object class="GtkWindow" id="window0">
+ <property name="width_request">800</property>
+ <property name="height_request">500</property>
+ <child>
+ <object class="GtkVBox" id="page_0">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="lbl_cd_reason">
+ <property name="width_request">750</property>
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="ypad">5</property>
+ <property name="wrap">True</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ <attribute name="foreground" value="#ffff00000000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">Press 'Forward' to proceed with analyzing and reporting this problem.</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkExpander" id="expander1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkScrolledWindow" id="container_details1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <object class="GtkTreeView" id="tv_details">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="dump_elements">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Details</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkWindow" id="window1">
+ <property name="width_request">800</property>
+ <property name="height_request">500</property>
+ <child>
+ <object class="GtkVBox" id="page_1">
+ <property name="width_request">750</property>
+ <property name="height_request">400</property>
+ <property name="visible">True</property>
+ <property name="border_width">10</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="lbl_page5">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Select how you would like to analyze the problem:</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vb_analyzers">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkWindow" id="window2">
+ <property name="width_request">800</property>
+ <property name="height_request">500</property>
+ <child>
+ <object class="GtkVBox" id="page_2">
+ <property name="visible">True</property>
+ <property name="border_width">10</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="lbl_analyze_log">
+ <property name="width_request">750</property>
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">Analyzing did not start yet</property>
+ <property name="use_markup">True</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <child>
+ <object class="GtkTextView" id="tv_analyze_log">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">False</property>
+ <property name="accepts_tab">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkWindow" id="window3">
+ <property name="width_request">800</property>
+ <property name="height_request">500</property>
+ <child>
+ <object class="GtkVBox" id="page_3">
+ <property name="visible">True</property>
+ <property name="border_width">10</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="lbl_page3">
+ <property name="width_request">750</property>
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Select how you would like to report the problem:</property>
+ <property name="use_markup">True</property>
+ <property name="justify">fill</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vb_reporters">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkWindow" id="window4">
+ <property name="width_request">800</property>
+ <property name="height_request">500</property>
+ <property name="tooltip_text" translatable="yes">Use this button to generate more informative backtrace after you installed additional debug packages</property>
+ <child>
+ <object class="GtkVBox" id="page_4">
+ <property name="visible">True</property>
+ <property name="border_width">10</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="lbl_page4">
+ <property name="width_request">750</property>
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="ypad">3</property>
+ <property name="label" translatable="yes">Backtrace provides developers with details of the crash, helping them track down the source of the problem. Please review it and remove any sensitive data you would rather not share:</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <object class="GtkTextView" id="tv_backtrace">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="wrap_mode">word</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <child>
+ <object class="GtkHBox" id="box_warning_area">
+ <property name="visible">True</property>
+ <property name="no_show_all">True</property>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="stock">gtk-dialog-warning</property>
+ <property name="icon-size">6</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox6">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="box_warning_labels">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox5">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkHBox" id="hbox2">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkEntry" id="entry_search_bt">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">&#x25CF;</property>
+ <property name="secondary_icon_stock">gtk-find</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkArrow" id="arrow1">
+ <property name="visible">True</property>
+ <property name="arrow_type">up</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkArrow" id="arrow2">
+ <property name="visible">True</property>
+ <property name="arrow_type">down</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_refresh">
+ <property name="label" translatable="yes">Regenerate backtrace</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Can create more informative backtrace if you installed additional debug packages</property>
+ <signal name="clicked" handler="on_b_refresh_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="cb_approve_bt">
+ <property name="label" translatable="yes">I agree with submitting the backtrace</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkWindow" id="window5">
+ <property name="width_request">800</property>
+ <property name="height_request">500</property>
+ <child>
+ <object class="GtkVBox" id="page_5">
+ <property name="visible">True</property>
+ <property name="border_width">10</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkVBox" id="vbox3">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="xalign">1.1175871339474952e-09</property>
+ <property name="yalign">0</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">How did this crash happen (step-by-step)? How can it be reproduced?</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <object class="GtkTextView" id="tv_reproduce">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="wrap_mode">word</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox4">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="label" translatable="yes">Are there any comments you would like to share with the software maintainers?</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <object class="GtkTextView" id="tv_comment">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="wrap_mode">word</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">&lt;b&gt;Your comments are not private.&lt;/b&gt; They may be included into publicly visible problem reports.</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkWindow" id="window6">
+ <property name="width_request">800</property>
+ <property name="height_request">500</property>
+ <child>
+ <object class="GtkVBox" id="page_6">
+ <property name="visible">True</property>
+ <property name="border_width">10</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="lbl_page6">
+ <property name="width_request">750</property>
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Below is the information to be reported, please review it.</property>
+ <property name="justify">fill</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="border_width">10</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">10</property>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Size:</property>
+ <property name="justify">right</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes"># files:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">ETA to upload:</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Reporter(s):</property>
+ <property name="justify">right</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Bugzilla, Logger</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">328kB</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">27</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label12">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">2 minutes</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="container_details2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkWindow" id="window7">
+ <property name="width_request">800</property>
+ <property name="height_request">500</property>
+ <child>
+ <object class="GtkVBox" id="page_7">
+ <property name="visible">True</property>
+ <property name="border_width">10</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="lbl_report_log">
+ <property name="width_request">750</property>
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">Reporting did not start yet</property>
+ <property name="use_markup">True</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <child>
+ <object class="GtkTextView" id="tv_report_log">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">False</property>
+ <property name="accepts_tab">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/src/gui-wizard-gtk/wizard.h b/src/gui-wizard-gtk/wizard.h
new file mode 100644
index 00000000..f27fb777
--- /dev/null
+++ b/src/gui-wizard-gtk/wizard.h
@@ -0,0 +1,38 @@
+enum {
+ PAGENO_SUMMARY,
+ PAGENO_ANALYZE_SELECTOR,
+ PAGENO_ANALYZE_PROGRESS,
+ PAGENO_REPORTER_SELECTOR,
+ PAGENO_BACKTRACE_APPROVAL,
+ PAGENO_HOWTO,
+ PAGENO_REPORT,
+ PAGENO_REPORT_PROGRESS,
+};
+extern GtkAssistant *g_assistant;
+extern GtkLabel *g_lbl_cd_reason;
+extern GtkLabel *g_lbl_analyze_log;
+extern GtkBox *g_box_analyzers;
+extern GtkBox *g_box_reporters;
+extern GtkTextView *g_tv_backtrace;
+enum
+{
+ DETAIL_COLUMN_NAME,
+ DETAIL_COLUMN_VALUE,
+ //COLUMN_PATH,
+ DETAIL_NUM_COLUMNS,
+};
+extern GtkTreeView *g_tv_details;
+extern GtkListStore *g_ls_details;
+void create_assistant(void);
+void update_gui_state_from_crash_data(void);
+void show_error_as_msgbox(const char *msg);
+
+
+extern char *g_glade_file;
+extern char *g_dump_dir_name;
+extern char *g_analyze_label_selected;
+extern char *g_analyze_events;
+extern char *g_reanalyze_events;
+extern char *g_report_events;
+extern crash_data_t *g_cd;
+void reload_crash_data_from_dump_dir(void);
diff --git a/src/gui/CCDBusBackend.py b/src/gui/CCDBusBackend.py
index 3fa95eb9..d2b867c7 100644
--- a/src/gui/CCDBusBackend.py
+++ b/src/gui/CCDBusBackend.py
@@ -21,6 +21,7 @@ class DBusManager(gobject.GObject):
# and later with policyKit
bus = None
def __init__(self):
+
session = None
# binds the dbus to glib mainloop
DBusGMainLoop(set_as_default=True)
@@ -60,7 +61,7 @@ class DBusManager(gobject.GObject):
# signal emited to update gui with current status
gobject.signal_new("update", self, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,))
# signal emited to show gui if user try to run it again
- gobject.signal_new("show", self, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ())
+ gobject.signal_new("show_gui", self, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ())
gobject.signal_new("daemon-state-changed", self, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,))
gobject.signal_new("report-done", self, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,))
@@ -211,11 +212,13 @@ class DBusManager(gobject.GObject):
def getSettings(self):
return self.daemon().GetSettings()
- def setSettings(self, settings):
- # FIXME: STUB!!!!
- log1("setSettings stub")
- retval = self.daemon().SetSettings(self.daemon().GetSettings())
- print ">>>", retval
+ ### looks unused to me.
+ ### Ok to grep for setSettings and delete after 2011-04-01.
+ ### def setSettings(self, settings):
+ ### # FIXME: STUB!!!!
+ ### log1("setSettings stub")
+ ### retval = self.daemon().SetSettings(self.daemon().GetSettings())
+ ### print ">>>", retval
def __del__(self):
log1("CCDBusBackend is about to be deleted")
diff --git a/src/gui/CCDump.py b/src/gui/CCDump.py
index df5c18aa..10d7c2a3 100644
--- a/src/gui/CCDump.py
+++ b/src/gui/CCDump.py
@@ -3,7 +3,7 @@ from datetime import datetime
from abrt_utils import _, init_logging, log, log1, log2
-# Keep in sync with [abrt_]crash_dump.h!
+# Keep in sync with [abrt_]crash_data.h!
CD_TYPE = 0
CD_EDITABLE = 1
CD_CONTENT = 2
@@ -25,10 +25,9 @@ FILENAME_CRASH_FUNCTION = "crash_function"
FILENAME_ARCHITECTURE = "architecture"
FILENAME_KERNEL = "kernel"
FILENAME_TIME = "time"
-FILENAME_RELEASE = "release"
+FILENAME_OS_RELEASE = "os_release"
FILENAME_PACKAGE = "package"
FILENAME_COMPONENT = "component"
-FILENAME_DESCRIPTION = "description"
FILENAME_COMMENT = "comment"
FILENAME_REPRODUCE = "reproduce"
FILENAME_RATING = "rating"
@@ -129,7 +128,11 @@ class Dump():
return self.analyzer
def get_release(self):
- return self.release
+ # Old dump dir format compat. Delete in abrt-2.1:
+ try:
+ return self.os_release
+ except AttributeError:
+ return self.release # old name
def get_reason(self):
return self.reason
diff --git a/src/gui/CCMainWindow.py b/src/gui/CCMainWindow.py
index 651c8e54..c6642f78 100644
--- a/src/gui/CCMainWindow.py
+++ b/src/gui/CCMainWindow.py
@@ -21,7 +21,6 @@ import CCDBusBackend
from CC_gui_functions import *
from CCDumpList import getDumpList
from CCDump import * # FILENAME_xxx, CD_xxx
-from CCReporterDialog import ReporterDialog, ReporterSelector
from CReporterAssistant import ReporterAssistant
from PluginsSettingsDialog import PluginsSettingsDialog
from SettingsDialog import SettingsDialog
@@ -39,6 +38,7 @@ class MainWindow():
self.gladefile = "%s/ccgui.glade" % sys.path[0]
self.wTree = gtk.glade.XML(self.gladefile)
+
#Get the Main Window, and connect the "destroy" event
self.window = self.wTree.get_widget("main_window")
if self.window:
@@ -89,9 +89,10 @@ class MainWindow():
self.wTree.get_widget("bReport").connect("clicked", self.on_bReport_clicked)
self.wTree.get_widget("b_close").connect("clicked", self.on_bQuit_clicked)
self.wTree.get_widget("b_copy").connect("clicked", self.on_b_copy_clicked)
- self.wTree.get_widget("b_help").connect("clicked", self.on_miAbout_clicked)
+ self.wTree.get_widget("b_help").connect("clicked", self.on_miOnlineHelp_clicked)
self.wTree.get_widget("miQuit").connect("activate", self.on_bQuit_clicked)
self.wTree.get_widget("miAbout").connect("activate", self.on_miAbout_clicked)
+ self.wTree.get_widget("miOnlineHelp").connect("activate", self.on_miOnlineHelp_clicked)
self.wTree.get_widget("miPlugins").connect("activate", self.on_miPreferences_clicked)
self.wTree.get_widget("miPreferences").connect("activate", self.on_miSettings_clicked)
self.wTree.get_widget("miReport").connect("activate", self.on_bReport_clicked)
@@ -102,7 +103,7 @@ class MainWindow():
#self.ccdaemon.connect("update", self.update_cb)
# for now, just treat them the same (w/o this, we don't even see daemon warnings in logs!):
#self.ccdaemon.connect("warning", self.update_cb)
- self.ccdaemon.connect("show", self.show_cb)
+ self.ccdaemon.connect("show_gui", self.show_cb)
self.ccdaemon.connect("daemon-state-changed", self.on_daemon_state_changed_cb)
self.ccdaemon.connect("report-done", self.on_report_done_cb)
@@ -130,6 +131,10 @@ class MainWindow():
result = dialog.run()
dialog.hide()
+ def on_miOnlineHelp_clicked(self, widget):
+ # opens default browser and shows ABRT chapter from deployment guide
+ gtk.show_uri(None, "http://docs.fedoraproject.org/en-US/Fedora/14/html/Deployment_Guide/ch-abrt.html", gtk.gdk.CURRENT_TIME)
+
def on_miPreferences_clicked(self, widget):
dialog = PluginsSettingsDialog(self.window,self.ccdaemon)
dialog.hydrate()
@@ -243,6 +248,7 @@ class MainWindow():
# process the labels in sw_details
# hide the fields that are not filled by daemon - e.g. comments
# and how to reproduce
+
for field in dump.not_required_fields:
self.wTree.get_widget("l_%s" % field.lower()).hide()
self.wTree.get_widget("l_%s_heading" % field.lower()).hide()
@@ -342,7 +348,7 @@ class MainWindow():
("Command:", dump.cmdline),
("Reason:", dump.reason),
("Comment:", dump.comment),
- ("Bug Reports:", dump.Message),
+ ("Bug Reports:", dump.message),
]
dumpinfo_text = ""
for line in dumpinfo:
@@ -394,7 +400,7 @@ class MainWindow():
sys.exit()
def show(self):
- self.window.show()
+ self.window.show_all()
def show_cb(self, daemon):
if self.window:
diff --git a/src/gui/CCReporterDialog.py b/src/gui/CCReporterDialog.py
deleted file mode 100644
index b34baf87..00000000
--- a/src/gui/CCReporterDialog.py
+++ /dev/null
@@ -1,578 +0,0 @@
-# -*- coding: utf-8 -*-
-import pygtk
-pygtk.require("2.0")
-import gtk
-import gobject
-import sys
-from CC_gui_functions import *
-import CellRenderers
-from ABRTPlugin import PluginInfo
-from PluginSettingsUI import PluginSettingsUI
-from PluginList import getPluginInfoList
-from CCDump import * # FILENAME_xxx, CD_xxx
-from abrt_utils import _, log, log1, log2, get_verbose_level, g_verbose
-
-# FIXME - create method or smth that returns type|editable|content
-
-# response
-REFRESH = -50
-SHOW_LOG = -60
-
-# default texts
-COMMENT_HINT_TEXT = _("Brief description of how to reproduce this or what you did...")
-HOW_TO_HINT_TEXT = "1.\n2.\n3.\n"
-
-class ReporterDialog():
- """Reporter window"""
- def __init__(self, report, daemon, log=None, parent=None):
- self.editable = []
- self.row_dict = {}
- self.report = report
- #Set the Glade file
- # FIXME add to path
- builderfile = "%s/report.glade" % sys.path[0]
- self.builder = gtk.Builder()
- self.builder.add_from_file(builderfile)
- #Get the Main Window, and connect the "destroy" event
- self.window = self.builder.get_object("reporter_dialog")
- self.window.set_default_size(-1, 800)
- self.window.connect("response", self.on_response, daemon)
- if parent:
- self.window.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
- self.window.set_transient_for(parent)
- self.window.set_modal(True)
- else:
- self.window.set_position(gtk.WIN_POS_CENTER)
-
- # comment textview
- self.tvComment = self.builder.get_object("tvComment")
- self.tvComment.connect("focus-in-event", self.on_comment_focus_cb)
- self.show_hint_comment = 1
-
- # "how to reproduce" textview
- self.tevHowToReproduce = self.builder.get_object("tevHowToReproduce")
-
- self.builder.get_object("fErrors").hide()
- bLog = self.builder.get_object("bLog")
- #if g_verbose > 0: - doesn't work! why?!
- if get_verbose_level() > 0:
- bLog.connect("clicked", self.show_log_cb, log)
- else:
- bLog.unset_flags(gtk.VISIBLE)
- tb_send_bt = self.builder.get_object("cbSendBacktrace")
- tb_send_bt.connect("toggled", self.on_send_backtrace_toggled)
- try:
- tb_send_bt.get_child().modify_fg(gtk.STATE_NORMAL,gtk.gdk.color_parse("red"))
- except Exception, ex:
- # we don't want gui to die if it fails to set the button color
- log(ex)
- self.allow_send()
- self.hydrate()
-
- def check_backtrace(self):
- print "checking backtrace"
-
- def warn_user(self, warnings):
- # FIXME: show in lError
- fErrors = self.builder.get_object("fErrors")
- lErrors = self.builder.get_object("lErrors")
- warning_lbl = None
- for warning in warnings:
- if warning_lbl:
- warning_lbl += "\n* %s" % warning
- else:
- warning_lbl = "* %s" % warning
- lErrors.set_label(warning_lbl)
- fErrors.show_all()
-
- def hide_warning(self):
- fErrors = self.builder.get_object("fErrors")
- lErrors = self.builder.get_object("lErrors")
- fErrors.hide()
-
- def allow_send(self):
- self.hide_warning()
- bSend = self.builder.get_object("bSend")
- SendBacktrace = self.builder.get_object("cbSendBacktrace").get_active()
- send = True
- error_msgs = []
- try:
- rating = int(self.report[FILENAME_RATING][CD_CONTENT])
- except:
- rating = None
- # active buttons acording to required fields
- # if an backtrace has rating use it
- if not SendBacktrace:
- send = False
- error_msgs.append(_("You must check the backtrace for sensitive data."))
- # we have both SendBacktrace and rating
- if rating != None:
- try:
- package = self.report[FILENAME_PACKAGE][CD_CONTENT]
- # if we don't have package for some reason
- except:
- package = None
- # not usable report
- if int(self.report[FILENAME_RATING][CD_CONTENT]) < 3:
- if package:
- error_msgs.append(_("Reporting disabled because the backtrace is unusable.\nPlease try to install debuginfo manually using the command: <b>debuginfo-install %s</b> \nthen use the Refresh button to regenerate the backtrace." % package[0:package.rfind('-',0,package.rfind('-'))]))
- else:
- error_msgs.append(_("The backtrace is unusable, you cannot report this!"))
- send = False
- # probably usable 3
- elif int(self.report[FILENAME_RATING][CD_CONTENT]) < 4:
- error_msgs.append(_("The backtrace is incomplete, please make sure you provide the steps to reproduce."))
-
- if error_msgs:
- self.warn_user(error_msgs)
- bSend.set_sensitive(send)
- if not send:
- bSend.set_tooltip_text(_("Reporting disabled, please fix the problems shown above."))
- else:
- bSend.set_tooltip_text(_("Sends the report using the selected plugin."))
-
- def on_send_backtrace_toggled(self, toggle_button):
- self.allow_send()
-
- def show_log_cb(self, widget, log):
- show_log(log, parent=self.window)
-
- # this callback is called when user press Cancel or Report button in Report dialog
- def on_response(self, dialog, response_id, daemon):
- # the button has been pressed (probably)
- if response_id == gtk.RESPONSE_APPLY:
- if not (self.check_report()):
- dialog.stop_emission("response")
- self.builder.get_object("bSend").stop_emission("clicked")
- if response_id == SHOW_LOG:
- # prevent the report dialog from quitting the run() and closing itself
- dialog.stop_emission("response")
-
- def on_send_toggled(self, cell, path, model):
- model[path][3] = not model[path][3]
-
- def on_comment_focus_cb(self, widget, event):
- if self.show_hint_comment:
- # clear "hint" text by supplying a fresh, empty TextBuffer
- widget.set_buffer(gtk.TextBuffer())
- self.show_hint_comment = 0
-
- def set_label(self, label_widget, text):
- if len(text) > label_widget.get_max_width_chars():
- label_widget.set_tooltip_text(text)
- label_widget.set_text(text)
-
- def hydrate(self):
- self.editable = []
- self.old_comment = COMMENT_HINT_TEXT
- self.old_how_to_reproduce = HOW_TO_HINT_TEXT
- for item in self.report:
- try:
- log2("report[%s]:%s/%s/%s", item, self.report[item][0], self.report[item][1], self.report[item][2][0:20])
- except:
- pass
-
- if item == FILENAME_BACKTRACE:
- buff = gtk.TextBuffer()
- tvBacktrace = self.builder.get_object("tvBacktrace")
- buff.set_text(self.report[item][CD_CONTENT])
- tvBacktrace.set_buffer(buff)
- continue
-
- if item == FILENAME_COMMENT:
- try:
- if self.report[item][CD_CONTENT]:
- self.old_comment = self.report[item][CD_CONTENT]
- except Exception, e:
- pass
- continue
-
- if item == FILENAME_REPRODUCE:
- try:
- if self.report[item][CD_CONTENT]:
- self.old_how_to_reproduce = self.report[item][CD_CONTENT]
- except Exception, e:
- pass
- continue
-
- if self.report[item][CD_TYPE] == CD_SYS:
- continue
-
- # item name 0| value 1| editable? 2| toggled? 3| visible?(attachment)4
- # FIXME: handle editable fields
- if self.report[item][CD_TYPE] == CD_BIN:
- self.builder.get_object("fAttachment").show()
- vbAttachments = self.builder.get_object("vbAttachments")
- toggle = gtk.CheckButton(self.report[item][CD_CONTENT])
- vbAttachments.pack_start(toggle)
- # bind item to checkbox
- toggle.item = item
- #FIXME: temporary workaround, in 1.0.4 reporters don't care
- # about this, they just send what they want to
- # TicketUploader even sends coredump!!
- #toggle.show()
- continue
-
- # It must be CD_TXT field
- item_label = self.builder.get_object("l%s" % item)
- if item_label:
- self.set_label(item_label, self.report[item][CD_CONTENT])
- else:
- # no widget to show this item
- # probably some new item need to adjust the GUI!
- # FIXME: add some window+button to show all the info
- # in raw form (smth like the old report dialog)
- pass
- #end for
-
- buff = gtk.TextBuffer()
- self.show_hint_comment = (self.old_comment == COMMENT_HINT_TEXT)
- if self.show_hint_comment:
- buff.set_text(COMMENT_HINT_TEXT)
- else:
- buff.set_text(self.old_comment)
- self.tvComment.set_buffer(buff)
-
- buff = gtk.TextBuffer()
- if self.old_how_to_reproduce == "":
- buff.set_text(HOW_TO_HINT_TEXT)
- else:
- buff.set_text(self.old_how_to_reproduce)
- self.tevHowToReproduce.set_buffer(buff)
-
- def dehydrate(self):
- ## # handle attachments
- ## vbAttachments = self.builder.get_object("vbAttachments")
- ## for attachment in vbAttachments.get_children():
- ## #print "%s file %s" % (["not sending","sending"][attachment.get_active()], attachment.get_label())
- ## del self.report[attachment.item]
-
- # handle comment
- buff = self.tvComment.get_buffer()
- text = buff.get_text(buff.get_start_iter(), buff.get_end_iter())
- if self.old_comment != text:
- self.report[FILENAME_COMMENT] = [CD_TXT, 'y', text]
- # handle how to reproduce
- buff = self.tevHowToReproduce.get_buffer()
- text = buff.get_text(buff.get_start_iter(), buff.get_end_iter())
- if self.old_how_to_reproduce != text:
- self.report[FILENAME_REPRODUCE] = [CD_TXT, 'y', text]
- # handle backtrace
- tev_backtrace = self.builder.get_object("tvBacktrace")
- buff = tev_backtrace.get_buffer()
- text = buff.get_text(buff.get_start_iter(), buff.get_end_iter())
- self.report[FILENAME_BACKTRACE] = [CD_TXT, 'y', text]
-
- def check_report(self):
- # FIXME: check the report for passwords and some other potentially
- # sensitive info
- self.dehydrate()
- return True
-
- def run(self):
- result = self.window.run()
- self.window.destroy()
- return (result, self.report)
-
-class ReporterSelector():
- def __init__(self, crashdump, daemon, log=None, parent=None):
- self.connected_signals = []
- self.updates = ""
- self.daemon = daemon
- self.dump = crashdump
- self.selected_reporters = []
- #FIXME: cache settings! Create some class to represent it like PluginList
- self.settings = daemon.getSettings()
- pluginlist = getPluginInfoList(daemon)
- self.reporters = []
- AnalyzerActionsAndReporters = self.settings["AnalyzerActionsAndReporters"]
- try:
- reporters = None
- try:
- reporters = AnalyzerActionsAndReporters[self.dump.getAnalyzerName()+":"+self.dump.getPackageName()]
- except KeyError:
- pass
- if not reporters:
- reporters = AnalyzerActionsAndReporters[crashdump.getAnalyzerName()]
- for reporter_name in reporters.split(','):
- reporter = pluginlist.getReporterByName(reporter_name)
- if reporter:
- self.reporters.append(reporter)
- except KeyError:
- # Analyzer has no associated reporters.
- pass
-
- builderfile = "%s/report.glade" % sys.path[0]
- self.builder = gtk.Builder()
- self.builder.add_from_file(builderfile)
- self.window = self.builder.get_object("w_reporters")
- b_cancel = self.builder.get_object("b_close")
-
- if parent:
- self.window.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
- self.window.set_transient_for(parent)
- self.window.set_modal(True)
- self.connect_signal(self.window, "delete-event", self.on_window_delete)
- self.connect_signal(self.window, "destroy-event", self.on_window_delete)
- self.connect_signal(b_cancel, "clicked", self.on_close_clicked)
- else:
- # if we don't have parent we want to quit the mainloop on close
- self.window.set_position(gtk.WIN_POS_CENTER)
- self.connect_signal(self.window, "delete-event", gtk.main_quit)
- self.connect_signal(self.window, "destroy-event", gtk.main_quit)
- self.connect_signal(b_cancel, "clicked", gtk.main_quit)
-
-
- self.pBarWindow = self.builder.get_object("pBarWindow")
- self.pBarWindow.set_transient_for(self.window)
-
- reporters_vbox = self.builder.get_object("vb_reporters")
- for reporter in self.reporters:
- button = gtk.Button(str(reporter))
- self.connect_signal(button, "clicked", self.on_reporter_clicked, data=reporter)
- reporters_vbox.pack_start(button)
-
- # progress bar window to show while bt is being extracted
- self.pBarWindow = self.builder.get_object("pBarWindow")
- if self.pBarWindow:
- self.connect_signal(self.pBarWindow, "delete_event", self.sw_delete_event_cb)
- if parent:
- self.pBarWindow.set_transient_for(parent)
- else:
- self.pBarWindow.set_transient_for(self.window)
- self.pBar = self.builder.get_object("pBar")
-
- # connect handlers for daemon signals
- #self.ccdaemon.connect("abrt-error", self.error_cb)
- self.connect_signal(daemon, "update", self.update_cb)
- # for now, just treat them the same (w/o this, we don't even see daemon warnings in logs!):
- #self.ccdaemon.connect("warning", self.update_cb)
- #self.ccdaemon.connect("show", self.show_cb)
- #self.ccdaemon.connect("daemon-state-changed", self.on_daemon_state_changed_cb)
- self.connect_signal(daemon, "report-done", self.on_report_done_cb)
- self.connect_signal(daemon, "analyze-complete", self.on_analyze_complete_cb, self.pBarWindow)
-
- def connect_signal(self, obj, signal, callback, data=None):
- if data:
- signal_id = obj.connect(signal, callback, data)
- else:
- signal_id = obj.connect(signal, callback)
- self.connected_signals.append((obj, signal_id))
-
- def disconnect_signals(self):
- # we need to disconnect all signals in order to break all references
- # to this object, otherwise python won't destroy this object and the
- # signals emmited by daemon will get caught by multiple instances of
- # this class
- for obj, signal_id in self.connected_signals:
- obj.disconnect(signal_id)
-
- def cleanup_and_exit(self):
- if not self.window.get_property("visible"):
- self.disconnect_signals()
- # if the reporter selector doesn't have a parent
- if not self.window.get_transient_for():
- gtk.main_quit()
-
- def update_cb(self, daemon, message):
- self.updates += message
- if self.updates[-1] != '\n':
- self.updates += '\n'
- message = message.replace('\n',' ')
- self.builder.get_object("lStatus").set_text(message)
- buff = gtk.TextBuffer()
- buff.set_text(self.updates)
- end = buff.get_insert()
- tvUpdates = self.builder.get_object("tvUpdates")
- tvUpdates.set_buffer(buff)
- tvUpdates.scroll_mark_onscreen(end)
-
- def sw_delete_event_cb(self, widget, event, data=None):
- if self.timer:
- gobject.source_remove(self.timer)
- widget.hide()
- return True
-
- def show(self):
- if not self.reporters:
- gui_error_message(_("No reporter plugin available for this type of crash.\n"
- "Please check abrt.conf."))
- elif len(self.reporters) > 1:
- self.builder.get_object("vb_reporters").show_all()
- self.window.show()
- else:
- # we have only one reporter in the list
- self.selected_reporters = [str(self.reporters[0])]
- self.show_report()
-
- def on_config_plugin_clicked(self, button, plugin, image):
- ui = PluginSettingsUI(plugin, parent=self.window)
- ui.hydrate()
- response = ui.run()
- if response == gtk.RESPONSE_APPLY:
- ui.dehydrate()
- if plugin.Settings.check():
- try:
- plugin.save_settings_on_client_side()
- except Exception, e:
- gui_error_message(_("Cannot save plugin settings:\n %s" % e))
- box = image.get_parent()
- im = gtk.Image()
- im.set_from_stock(gtk.STOCK_APPLY, gtk.ICON_SIZE_MENU)
- box.remove(image)
- box.pack_start(im, expand = False, fill = False)
- im.show()
- image.destroy()
- button.set_sensitive(False)
- elif response == gtk.RESPONSE_CANCEL:
- log1("cancel")
- ui.destroy()
-
- def check_settings(self, reporters):
- wrong_conf_plugs = []
- for reporter in reporters:
- if reporter.Settings.check() == False:
- wrong_conf_plugs.append(reporter)
-
- if wrong_conf_plugs:
- gladefile = "%s%ssettings_wizard.glade" % (sys.path[0],"/")
- builder = gtk.Builder()
- builder.add_from_file(gladefile)
- dialog = builder.get_object("WrongSettings")
- vbWrongSettings = builder.get_object("vbWrongSettings")
- for plugin in wrong_conf_plugs:
- hbox = gtk.HBox()
- hbox.set_spacing(6)
- image = gtk.Image()
- image.set_from_stock(gtk.STOCK_CANCEL, gtk.ICON_SIZE_MENU)
- button = gtk.Button(_("Configure %s options" % plugin.getName()))
- button.connect("clicked", self.on_config_plugin_clicked, plugin, image)
- hbox.pack_start(button)
- hbox.pack_start(image, expand = False, fill = False)
- vbWrongSettings.pack_start(hbox)
- vbWrongSettings.show_all()
- dialog.set_transient_for(self.window)
- dialog.set_modal(True)
- response = dialog.run()
- dialog.destroy()
- if response != gtk.RESPONSE_YES:
- # user cancelled reporting
- return False
- return True
-
- def on_reporter_clicked(self, widget, reporter):
- self.selected_reporters = [reporter]
- if self.check_settings(self.selected_reporters):
- self.show_report()
-
- def on_close_clicked(self, widget):
- self.disconnect_signals()
- self.window.destroy()
-
- def on_window_delete(self, window, event):
- self.disconnect_signals()
- return False
-
- def on_report_done_cb(self, daemon, result):
- try:
- gobject.source_remove(self.timer)
- except:
- pass
- self.pBarWindow.hide()
- gui_report_dialog(result, self.window)
-
- self.cleanup_and_exit()
-
- def on_analyze_complete_cb(self, daemon, report, pBarWindow):
- try:
- gobject.source_remove(self.timer)
- except:
- pass
- self.pBarWindow.hide()
-#FIXME - why we need this?? -> timeout warnings
-# try:
-# dumplist = getDumpList(self.daemon)
-# except Exception, e:
-# print e
- if not report:
- gui_error_message(_("Unable to get report!\nIs debuginfo missing?"))
- return
-
- # if we have only one reporter enabled, the window with
- # the selection is not shown, so we can't use it as a parent
- # and we use the mainwindow instead
- if self.window.get_property("visible"):
- parent_window = self.window
- else:
- parent_window = self.window.get_transient_for()
-
- report_dialog = ReporterDialog(report, self.daemon, log=self.updates, parent=parent_window)
- # (response, report)
- response, result = report_dialog.run()
-
- if response == gtk.RESPONSE_APPLY:
- try:
- self.pBarWindow.show_all()
- self.timer = gobject.timeout_add(100, self.progress_update_cb)
- pluginlist = getPluginInfoList(self.daemon)
- reporters_settings = pluginlist.getReporterPluginsSettings()
- log2("Report(result,reporters,settings):")
- log2(" result:%s", str(result))
- # Careful, this will print reporters_settings["Password"] too
- log2(" settings:%s", str(reporters_settings))
- self.daemon.Report(result, self.selected_reporters, reporters_settings)
- log2("Report() returned")
- #self.hydrate()
- except Exception, ex:
- gui_error_message(_("Reporting failed!\n%s" % ex))
- # -50 == REFRESH
- elif response == -50:
- self.refresh_report(report)
- else:
- self.cleanup_and_exit()
-
- # call to update the progressbar
- def progress_update_cb(self, *args):
- self.pBar.pulse()
- return True
-
- def refresh_report(self, report):
- self.updates = ""
- self.pBarWindow.show_all()
- self.timer = gobject.timeout_add(100, self.progress_update_cb)
-
- # show the report window with selected report
- try:
- self.daemon.start_job(report[CD_DUMPDIR][CD_CONTENT], force=1)
- except Exception, ex:
- # FIXME #3 dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NoReply: Did not receive a reply
- # do this async and wait for yum to end with debuginfoinstal
- if self.timer:
- gobject.source_remove(self.timer)
- self.pBarWindow.hide()
- gui_error_message(_("Error acquiring the report: %s" % ex))
- return
-
- def show_report(self):
- self.updates = ""
- # FIXME don't duplicate the code, move to function
- #self.pBar.show()
- self.pBarWindow.show_all()
- self.timer = gobject.timeout_add(100, self.progress_update_cb)
-
- # show the report window with selected dump
- # when getReport is done it emits "analyze-complete" and on_analyze_complete_cb is called
- # FIXME: does it make sense to change it to use callback rather then signal emitting?
- try:
- self.daemon.start_job(self.dump.getDumpDir())
- except Exception, ex:
- # FIXME #3 dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NoReply: Did not receive a reply
- # do this async and wait for yum to end with debuginfoinstal
- if self.timer:
- gobject.source_remove(self.timer)
- self.pBarWindow.hide()
- gui_error_message(_("Error acquiring the report: %s" % ex))
- return
-
- def __del__(self):
- log1("ReporterSelector: instance is about to be garbage-collected")
diff --git a/src/gui/CReporterAssistant.py b/src/gui/CReporterAssistant.py
index d998b870..300ddc3f 100644
--- a/src/gui/CReporterAssistant.py
+++ b/src/gui/CReporterAssistant.py
@@ -23,12 +23,48 @@ MISSING_BACKTRACE_TEXT = _("Crash info doesn't contain a backtrace")
DEFAULT_WIDTH = 800
DEFAULT_HEIGHT = 500
+
+class Log(gtk.ScrolledWindow):
+ def __init__(self, log=""):
+ gtk.ScrolledWindow.__init__(self)
+ self.tv = gtk.TextView()
+ self.tv.set_editable(False)
+ self.add(self.tv)
+ # FIXME: log shouldn't be None
+ self.buff = gtk.TextBuffer()
+ self.buff.set_text(log)
+ self.tv.set_buffer(self.buff)
+ self.scroll = False
+
+ def append_line(self, text):
+ end_iter = self.buff.get_end_iter()
+ self.buff.insert(end_iter, "%s\n" % text)
+ self.scroll_to_end()
+
+
+ def append_warning(self, text):
+ """ stub """
+ pass
+
+ def append_error(self, text):
+ """ do we need this? shouldn't error be an exception? """
+ pass
+
+ def set_scroll(self, scroll):
+ """ enables/disables scrolling to end, when new text is added """
+ self.scroll = scroll
+
+ def scroll_to_end(self):
+ if self.scroll:
+ mark = self.buff.get_insert()
+ self.tv.scroll_mark_onscreen(mark)
+
class ReporterAssistant():
def __init__(self, report, daemon, log=None, parent=None):
self.connected_signals = []
self.plugins_cb = []
self.daemon = daemon
- self.updates = ""
+ self.updates = []
self.pdict = {}
self.report = report
self.parent = parent
@@ -37,6 +73,8 @@ class ReporterAssistant():
self.report_has_bt = False
self.selected_report_events = []
self.ev_warning = None
+ self.log = Log()
+ self.log.set_scroll(True)
""" create the assistant """
self.assistant = gtk.Assistant()
self.assistant.set_icon_name("abrt")
@@ -61,6 +99,8 @@ class ReporterAssistant():
self.pBarWindow = self.builder.get_object("pBarWindow")
if self.pBarWindow:
self.connect_signal(self.pBarWindow, "delete_event", self.sw_delete_event_cb)
+ pb_log_expander = self.builder.get_object("pb_log_expander")
+ pb_log_expander.add(self.log)
self.connect_signal(daemon, "analyze-complete", self.on_analyze_complete_cb, self.pBarWindow)
self.connect_signal(daemon, "report-done", self.on_report_done_cb)
@@ -82,15 +122,10 @@ class ReporterAssistant():
viewer.set_transient_for(self.assistant)
vbox = gtk.VBox()
viewer.add(vbox)
- log_tev = gtk.TextView()
- log_tev.set_editable(False)
- log_buff = gtk.TextBuffer()
- log_buff.set_text(self.updates)
- log_sw = gtk.ScrolledWindow()
- log_sw.add(log_tev)
- log_sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
- log_tev.set_buffer(log_buff)
- vbox.pack_start(log_sw)
+ log = Log()
+ for line in self.updates:
+ log.append_line(line)
+ vbox.pack_start(log)
b_close = gtk.Button(stock=gtk.STOCK_CLOSE)
b_close.connect("clicked",lambda *w: viewer.destroy())
vbox.pack_start(b_close, False)
@@ -159,17 +194,10 @@ class ReporterAssistant():
gtk.main_quit()
def update_cb(self, daemon, message):
- self.updates += message
- if self.updates[-1] != '\n':
- self.updates += '\n'
+ self.updates.append(message)
message = message.replace('\n',' ')
self.builder.get_object("lStatus").set_text(message)
- buff = gtk.TextBuffer()
- buff.set_text(self.updates)
- end = buff.get_insert()
- tvUpdates = self.builder.get_object("tvUpdates")
- tvUpdates.set_buffer(buff)
- tvUpdates.scroll_mark_onscreen(end)
+ self.log.append_line(message)
def sw_delete_event_cb(self, widget, event, data=None):
if self.timer:
@@ -1093,9 +1121,7 @@ class ReporterAssistant():
self.prepare_page_3()
self.prepare_page_4()
self.prepare_page_5()
- self.updates = ""
# FIXME don't duplicate the code, move to function
- #self.pBar.show()
self.show_progress()
self.timer = gobject.timeout_add(100, self.progress_update_cb)
diff --git a/src/gui/CellRenderers.py b/src/gui/CellRenderers.py
deleted file mode 100644
index 155d8ce3..00000000
--- a/src/gui/CellRenderers.py
+++ /dev/null
@@ -1,66 +0,0 @@
-# -*- coding: utf-8 -*-
-import gtk
-
-class CellTextView(gtk.TextView, gtk.CellEditable):
-
- __gtype_name__ = "CellTextView"
-
- def do_editing_done(self, *args):
- self.remove_widget()
-
- def do_remove_widget(self, *args):
- pass
-
- def do_start_editing(self, *args):
- pass
-
- def get_text(self):
- text_buffer = self.get_buffer()
- bounds = text_buffer.get_bounds()
- return text_buffer.get_text(*bounds)
-
- def set_text(self, text):
- self.get_buffer().set_text(text)
-
-
-class MultilineCellRenderer(gtk.CellRendererText):
-
- __gtype_name__ = "MultilineCellRenderer"
-
- def __init__(self):
- gtk.CellRendererText.__init__(self)
- self._in_editor_menu = False
- self.old_text = ""
-
- def _on_editor_focus_out_event(self, editor, event):
- if self._in_editor_menu: return
- editor.remove_widget()
- self.emit("edited", editor.get_data("path"), editor.get_text())
-
- def _on_editor_key_press_event(self, editor, event):
- if event.state & (gtk.gdk.SHIFT_MASK | gtk.gdk.CONTROL_MASK): return
- if event.keyval == gtk.keysyms.Escape:
- editor.set_text(self.old_text)
- editor.remove_widget()
- self.emit("editing-canceled")
-
- def _on_editor_populate_popup(self, editor, menu):
- self._in_editor_menu = True
- def on_menu_unmap(menu, self):
- self._in_editor_menu = False
- menu.connect("unmap", on_menu_unmap, self)
-
- def do_start_editing(self, event, widget, path, bg_area, cell_area, flags):
- editor = CellTextView()
- editor.modify_font(self.props.font_desc)
- self.old_text = self.props.text
- editor.set_text(self.props.text)
- editor.set_size_request(cell_area.width, cell_area.height)
- editor.set_border_width(min(self.props.xpad, self.props.ypad))
- editor.set_data("path", path)
- editor.connect("focus-out-event", self._on_editor_focus_out_event)
- editor.connect("key-press-event", self._on_editor_key_press_event)
- editor.connect("populate-popup", self._on_editor_populate_popup)
- editor.show()
- return editor
-
diff --git a/src/gui/Makefile.am b/src/gui/Makefile.am
index 002b3bc7..61725d6f 100644
--- a/src/gui/Makefile.am
+++ b/src/gui/Makefile.am
@@ -1,8 +1,8 @@
bin_SCRIPTS = abrt-gui
PYTHON_FILES = CCDBusBackend.py CCDumpList.py CCDump.py CC_gui_functions.py \
- CCReporterDialog.py abrt_utils.py \
- CCMainWindow.py CellRenderers.py ABRTExceptions.py \
+ abrt_utils.py \
+ CCMainWindow.py ABRTExceptions.py \
SettingsDialog.py ABRTPlugin.py PluginList.py PluginSettingsUI.py \
PluginsSettingsDialog.py ConfBackend.py CReporterAssistant.py
diff --git a/src/gui/SettingsDialog.py b/src/gui/SettingsDialog.py
index e6d30e99..41fb9829 100644
--- a/src/gui/SettingsDialog.py
+++ b/src/gui/SettingsDialog.py
@@ -27,28 +27,10 @@ class SettingsDialog:
self.window = self.builder.get_object("wGlobalSettings")
self.builder.get_object("bSaveSettings").connect("clicked", self.on_ok_clicked)
self.builder.get_object("bCancelSettings").connect("clicked", self.on_cancel_clicked)
- self.builder.get_object("bAddCronJob").connect("clicked", self.on_bAddCronJob_clicked)
-
- # action plugin list for Cron tab
- self.actionPluginsListStore = gtk.ListStore(str, object)
- self.actionPluginsListStore.append([_("<b>Select plugin</b>"), None])
- # database plugin list
- self.databasePluginsListStore = gtk.ListStore(str, object)
- self.databasePluginsListStore.append([_("<b>Select database backend</b>"), None])
-
- self.dbcombo = self.builder.get_object("cbDatabase")
- self.dbcombo.set_model(self.databasePluginsListStore)
- cell = gtk.CellRendererText()
- self.dbcombo.pack_start(cell)
- self.dbcombo.add_attribute(cell, "markup", 0)
# blacklist edit
self.builder.get_object("bEditBlackList").connect("clicked", self.on_blacklistEdit_clicked)
self.builder.get_object("bOpenGPGPublicKeys").connect("clicked", self.on_GPGKeysEdit_clicked)
- self.builder.get_object("bAddAction").connect("clicked", self.on_bAddAction_clicked)
- # AnalyzerActionsAndReporters
- self.analyzerPluginsListStore = gtk.ListStore(str, object)
- self.analyzerPluginsListStore.append([_("<b>Select plugin</b>"), None])
# GPG keys
self.wGPGKeys = self.builder.get_object("wGPGKeys")
self.GPGKeysListStore = gtk.ListStore(str)
@@ -77,18 +59,6 @@ class SettingsDialog:
except Exception, e:
raise Exception("Comunication with daemon has failed, have you restarted the daemon after update?")
- ## hydrate cron jobs:
- for key,val in self.settings["Cron"].iteritems():
- # actions are separated by ','
- actions = val.split(',')
- self.settings["Cron"][key] = actions
- for plugin in self.pluginlist.getActionPlugins():
- it = self.actionPluginsListStore.append([plugin.getName(), plugin])
- for key,val in self.settings["Cron"].iteritems():
- if plugin.getName() in val:
- cron_job = (key,it)
- self.add_CronJob(cron_job)
- self.settings["Cron"][key].remove(plugin.getName())
# hydrate common
common = self.settings["Common"]
# ensure that all expected keys exist:
@@ -96,11 +66,6 @@ class SettingsDialog:
common["OpenGPGCheck"] = "no" # check unsigned pkgs too
## gpgcheck
self.builder.get_object("cbOpenGPGCheck").set_active(common["OpenGPGCheck"] == 'yes')
- ## database
- for dbplugin in self.pluginlist.getDatabasePlugins():
- it = self.databasePluginsListStore.append([dbplugin.getName(), dbplugin])
- if common["Database"] == dbplugin.getName():
- self.dbcombo.set_active_iter(it)
## MaxCrashSize
self.builder.get_object("sbMaxCrashReportsSize").set_value(float(common["MaxCrashReportsSize"]))
## GPG keys
@@ -114,13 +79,6 @@ class SettingsDialog:
## blacklist
self.builder.get_object("eBlacklist").set_text(common["BlackList"])
- # hydrate AnalyzerActionsAndReporters
- AnalyzerActionsAndReporters = self.settings["AnalyzerActionsAndReporters"]
- for analplugin in self.pluginlist.getAnalyzerPlugins():
- it = self.analyzerPluginsListStore.append([analplugin.getName(), analplugin])
- if analplugin.getName() in AnalyzerActionsAndReporters:
- action = (AnalyzerActionsAndReporters[analplugin.getName()], it)
- self.add_AnalyzerAction(action)
def on_bCancelGPGKeys_clicked(self, button):
self.wGPGKeys.hide()
@@ -147,12 +105,6 @@ class SettingsDialog:
def on_cancel_clicked(self, button):
self.window.hide()
- def on_remove_CronJob_clicked(self, button, job_hbox):
- self.removeHBoxWihtChildren(job_hbox)
-
- def on_remove_Action_clicked(self, button, binding_hbox):
- self.removeHBoxWihtChildren(binding_hbox)
-
def removeHBoxWihtChildren(self, job_hbox):
job_hbox.get_parent().remove(job_hbox)
for child in job_hbox.get_children():
@@ -237,7 +189,10 @@ class SettingsDialog:
self.add_AnalyzerAction()
def dehydrate(self):
- self.ccdaemon.setSettings(self.settings)
+ pass
+ ### looks unused to me.
+ ### Ok to grep for setSettings and delete after 2011-04-01.
+ ### self.ccdaemon.setSettings(self.settings)
def show(self):
self.window.show()
diff --git a/src/gui/ccgui.glade b/src/gui/ccgui.glade
index 4f8c4f02..c2efa148 100644
--- a/src/gui/ccgui.glade
+++ b/src/gui/ccgui.glade
@@ -9,7 +9,6 @@
<property name="window_position">center-on-parent</property>
<property name="icon_name">abrt</property>
<property name="type_hint">dialog</property>
- <property name="has_separator">False</property>
<property name="program_name">ABRT</property>
<property name="version">@VER@</property>
<property name="copyright" translatable="yes">(C) 2009, 2010 Red Hat, Inc.</property>
@@ -128,6 +127,20 @@ M&#xE1;ir&#xED;n Duffy &lt;duffy@redhat.com&gt;</property>
</widget>
</child>
<child>
+ <widget class="GtkImageMenuItem" id="miOnlineHelp">
+ <property name="label" translatable="yes">Online _Help</property>
+ <property name="visible">True</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">False</property>
+ <child internal-child="image">
+ <widget class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="stock">gtk-help</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
<widget class="GtkImageMenuItem" id="miAbout">
<property name="label">gtk-about</property>
<property name="visible">True</property>
@@ -589,11 +602,34 @@ M&#xE1;ir&#xED;n Duffy &lt;duffy@redhat.com&gt;</property>
<property name="homogeneous">True</property>
<child>
<widget class="GtkButton" id="b_help">
- <property name="label">gtk-help</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
- <property name="use_stock">True</property>
+ <child>
+ <widget class="GtkHBox" id="hbox5">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="yalign">0</property>
+ <property name="stock">gtk-help</property>
+ </widget>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes" context="yes">Online _Help</property>
+ <property name="use_underline">True</property>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
</widget>
<packing>
<property name="padding">10</property>
diff --git a/src/gui/progress_window.glade b/src/gui/progress_window.glade
index af48ee55..6fae1486 100644
--- a/src/gui/progress_window.glade
+++ b/src/gui/progress_window.glade
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
@@ -12,7 +12,6 @@
<child>
<object class="GtkVBox" id="vbox9">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="lStatus">
@@ -35,23 +34,11 @@
</packing>
</child>
<child>
- <object class="GtkExpander" id="expander1">
+ <object class="GtkExpander" id="pb_log_expander">
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
- <object class="GtkScrolledWindow" id="scrolledwindow4">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">automatic</property>
- <property name="vscrollbar_policy">automatic</property>
- <property name="shadow_type">etched-in</property>
- <child>
- <object class="GtkTextView" id="tvUpdates">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- </object>
- </child>
- </object>
+ <placeholder/>
</child>
<child type="label">
<object class="GtkLabel" id="lUpdates">
diff --git a/src/gui/settings.glade b/src/gui/settings.glade
index b83e6617..9dc1b96f 100644
--- a/src/gui/settings.glade
+++ b/src/gui/settings.glade
@@ -276,7 +276,7 @@
<object class="GtkTable" id="common_table">
<property name="visible">True</property>
<property name="border_width">6</property>
- <property name="n_rows">5</property>
+ <property name="n_rows">4</property>
<property name="n_columns">2</property>
<property name="column_spacing">12</property>
<property name="row_spacing">6</property>
@@ -294,32 +294,6 @@
</packing>
</child>
<child>
- <object class="GtkLabel" id="lDatabasePlugin">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xpad">5</property>
- <property name="label" translatable="yes">Database backend: </property>
- </object>
- <packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <object class="GtkComboBox" id="cbDatabase">
- <property name="visible">True</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
<object class="GtkLabel" id="lBlacklist">
<property name="visible">True</property>
<property name="xalign">0</property>
@@ -348,20 +322,6 @@
</packing>
</child>
<child>
- <object class="GtkLabel" id="lOpenGPGPublicKeys">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xpad">5</property>
- <property name="label" translatable="yes">GPG keys: </property>
- </object>
- <packing>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
<object class="GtkSpinButton" id="sbMaxCrashReportsSize">
<property name="visible">True</property>
<property name="can_focus">True</property>
@@ -414,6 +374,20 @@
</packing>
</child>
<child>
+ <object class="GtkLabel" id="lOpenGPGPublicKeys">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">GPG keys: </property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
<object class="GtkHBox" id="gpghbox">
<property name="visible">True</property>
<property name="spacing">6</property>
@@ -445,8 +419,8 @@
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
@@ -461,241 +435,6 @@
<property name="tab_fill">False</property>
</packing>
</child>
- <child>
- <object class="GtkVBox" id="cron_vbox">
- <property name="visible">True</property>
- <property name="border_width">6</property>
- <property name="orientation">vertical</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkScrolledWindow" id="swCronJobs">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">automatic</property>
- <property name="vscrollbar_policy">automatic</property>
- <child>
- <object class="GtkViewport" id="vpCronJobs">
- <property name="visible">True</property>
- <property name="resize_mode">queue</property>
- <property name="shadow_type">none</property>
- <child>
- <object class="GtkVBox" id="cjvbox1">
- <property name="visible">True</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkHBox" id="cjhbox1">
- <property name="visible">True</property>
- <child>
- <object class="GtkLabel" id="lPlugin">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Plugin&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="lTime">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Time (or period)&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="vbCronJobs">
- <property name="visible">True</property>
- <property name="orientation">vertical</property>
- <child>
- <placeholder/>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkHButtonBox" id="hbuttonboxy1">
- <property name="visible">True</property>
- <property name="spacing">12</property>
- <property name="layout_style">end</property>
- <child>
- <object class="GtkButton" id="bAddCronJob">
- <property name="label">gtk-add</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="use_stock">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child type="tab">
- <object class="GtkLabel" id="pCron">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Cron</property>
- </object>
- <packing>
- <property name="position">1</property>
- <property name="tab_fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="actions_vbox">
- <property name="visible">True</property>
- <property name="border_width">6</property>
- <property name="orientation">vertical</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkScrolledWindow" id="scrolledwindow1">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">automatic</property>
- <property name="vscrollbar_policy">automatic</property>
- <child>
- <object class="GtkViewport" id="viewportA1">
- <property name="visible">True</property>
- <property name="resize_mode">queue</property>
- <property name="shadow_type">none</property>
- <child>
- <object class="GtkVBox" id="vbox1">
- <property name="visible">True</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkHBox" id="ahbox1">
- <property name="visible">True</property>
- <child>
- <object class="GtkLabel" id="lReporter">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Analyzer plugin&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="lAssociatedActions">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Associated action&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="action_lbl_align">
- <property name="visible">True</property>
- <child>
- <placeholder/>
- </child>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="vbActions">
- <property name="visible">True</property>
- <property name="orientation">vertical</property>
- <child>
- <placeholder/>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkHButtonBox" id="hbuttonbox2">
- <property name="visible">True</property>
- <property name="spacing">12</property>
- <property name="layout_style">end</property>
- <child>
- <object class="GtkButton" id="bAddAction">
- <property name="label">gtk-add</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="use_stock">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- <child type="tab">
- <object class="GtkLabel" id="pAnacre">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Analyzers, Actions, Reporters</property>
- </object>
- <packing>
- <property name="position">2</property>
- <property name="tab_fill">False</property>
- </packing>
- </child>
</object>
<packing>
<property name="position">0</property>
diff --git a/src/hooks/Makefile.am b/src/hooks/Makefile.am
index 2f57d2e7..6ebf3628 100644
--- a/src/hooks/Makefile.am
+++ b/src/hooks/Makefile.am
@@ -1,38 +1,19 @@
libexec_PROGRAMS = abrt-hook-ccpp
-bin_PROGRAMS = dumpoops
# abrt-hook-ccpp
abrt_hook_ccpp_SOURCES = \
abrt-hook-ccpp.c
abrt_hook_ccpp_CPPFLAGS = \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-I$(srcdir)/../lib \
-DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \
-DCONF_DIR=\"$(CONF_DIR)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
- -D_GNU_SOURCE
-abrt_hook_ccpp_LDADD = \
- ../lib/libabrt.la
-
-# dumpoops
-dumpoops_SOURCES = \
- dumpoops.cpp
-dumpoops_CPPFLAGS = \
- -I$(srcdir)/../include \
- -I$(srcdir)/../lib \
- -I$(srcdir)/../plugins \
- -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \
- -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
- -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
- -DCONF_DIR=\"$(CONF_DIR)\" \
- -DVAR_RUN=\"$(VAR_RUN)\" \
$(GLIB_CFLAGS) \
+ -Wall \
-D_GNU_SOURCE
-# build will succeed, but at runtime plugins do need ABRT*d*Utils
-dumpoops_LDADD = \
- ../lib/libabrt_daemon.la \
- ../lib/libabrt.la \
- $(GLIB_FLAGS)
+abrt_hook_ccpp_LDADD = \
+ ../lib/libreport.la
python_PYTHON = abrt.pth abrt_exception_handler.py
EXTRA_DIST = abrt_exception_handler.py.in $(man_MANS)
diff --git a/src/hooks/abrt-hook-ccpp.c b/src/hooks/abrt-hook-ccpp.c
index bcdc8547..46d96c91 100644
--- a/src/hooks/abrt-hook-ccpp.c
+++ b/src/hooks/abrt-hook-ccpp.c
@@ -161,9 +161,22 @@ static char* get_cwd(pid_t pid)
return malloc_readlink(buf);
}
-static char core_basename[sizeof("core.%lu") + sizeof(long)*3] = "core";
+/*
+ * %s - signal number
+ * %c - ulimit -c value
+ * %p - pid
+ * %u - uid
+ * %g - gid
+ * %t - UNIX time of dump
+ * %h - hostname
+ * %e - executable filename
+ * %% - output one "%"
+ */
+/* Must match CORE_PATTERN order in daemon! */
+static const char percent_specifiers[] = "%scpugthe";
+static char *core_basename = "core";
-static int open_user_core(const char *user_pwd, uid_t uid, pid_t pid)
+static int open_user_core(const char *user_pwd, uid_t uid, pid_t pid, char **percent_values)
{
struct passwd* pw = getpwuid(uid);
gid_t gid = pw ? pw->pw_gid : uid;
@@ -178,20 +191,63 @@ static int open_user_core(const char *user_pwd, uid_t uid, pid_t pid)
return -1;
}
- /* Mimic "core.PID" if requested */
- char buf[] = "0\n";
- int fd = open("/proc/sys/kernel/core_uses_pid", O_RDONLY);
- if (fd >= 0)
+ if (strcmp(core_basename, "core") == 0)
{
- read(fd, buf, sizeof(buf));
- close(fd);
+ /* Mimic "core.PID" if requested */
+ char buf[] = "0\n";
+ int fd = open("/proc/sys/kernel/core_uses_pid", O_RDONLY);
+ if (fd >= 0)
+ {
+ read(fd, buf, sizeof(buf));
+ close(fd);
+ }
+ if (strcmp(buf, "1\n") == 0)
+ {
+ core_basename = xasprintf("%s.%lu", core_basename, (long)pid);
+ }
}
- if (strcmp(buf, "1\n") == 0)
+ else
{
- sprintf(core_basename, "core.%lu", (long)pid);
+ /* Expand old core pattern, put expanded name in core_basename */
+ core_basename = xstrdup(core_basename);
+ unsigned idx = 0;
+ while (1)
+ {
+ char c = core_basename[idx];
+ if (!c)
+ break;
+ idx++;
+ if (c != '%')
+ continue;
+
+ /* We just copied %, look at following char and expand %c */
+ c = core_basename[idx];
+ unsigned specifier_num = strchrnul(percent_specifiers, c) - percent_specifiers;
+ if (percent_specifiers[specifier_num] != '\0') /* valid %c (might be %% too) */
+ {
+ const char *val = "%";
+ if (specifier_num > 0) /* not %% */
+ val = percent_values[specifier_num - 1];
+ //log("c:'%c'", c);
+ //log("val:'%s'", val);
+
+ /* Replace %c at core_basename[idx] by its value */
+ idx--;
+ char *old = core_basename;
+ core_basename = xasprintf("%.*s%s%s", idx, core_basename, val, core_basename + idx + 2);
+ //log("pos:'%*s|'", idx, "");
+ //log("new:'%s'", core_basename);
+ //log("old:'%s'", old);
+ free(old);
+ idx += strlen(val);
+ }
+ /* else: invalid %c, % is already copied verbatim,
+ * next loop iteration will copy c */
+ }
}
- /* man core:
+ /* Open (create) compat core file.
+ * man core:
* There are various circumstances in which a core dump file
* is not produced:
*
@@ -209,8 +265,7 @@ static int open_user_core(const char *user_pwd, uid_t uid, pid_t pid)
*
* The RLIMIT_CORE or RLIMIT_FSIZE resource limits for the process
* are set to zero.
- * [shouldn't it be checked by kernel? 2.6.30.9-96 doesn't, still
- * calls us even if "ulimit -c 0"]
+ * [we check RLIMIT_CORE, but how can we check RLIMIT_FSIZE?]
*
* The binary being executed by the process does not have
* read permission enabled. [how we can check it here?]
@@ -221,7 +276,6 @@ static int open_user_core(const char *user_pwd, uid_t uid, pid_t pid)
* (However, see the description of the prctl(2) PR_SET_DUMPABLE operation,
* and the description of the /proc/sys/fs/suid_dumpable file in proc(5).)
*/
-
/* Do not O_TRUNC: if later checks fail, we do not want to have file already modified here */
struct stat sb;
errno = 0;
@@ -240,6 +294,7 @@ static int open_user_core(const char *user_pwd, uid_t uid, pid_t pid)
if (ftruncate(user_core_fd, 0) != 0) {
/* perror first, otherwise unlink may trash errno */
perror_msg("truncate %s/%s", user_pwd, core_basename);
+ unlink(core_basename);
return -1;
}
@@ -248,23 +303,28 @@ static int open_user_core(const char *user_pwd, uid_t uid, pid_t pid)
int main(int argc, char** argv)
{
- int i;
struct stat sb;
- if (argc < 5)
+ if (argc < 10) /* no argv[9]? */
{
- error_msg_and_die("Usage: %s: DUMPDIR PID SIGNO UID CORE_SIZE_LIMIT", argv[0]);
+ /* percent specifier: %s %c %p %u %g %t %h %e */
+ /* argv: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] */
+ error_msg_and_die("Usage: %s DUMPDIR SIGNO CORE_SIZE_LIMIT PID UID GID TIME HOSTNAME BINARY_NAME [OLD_PATTERN]", argv[0]);
}
/* Not needed on 2.6.30.
* At least 2.6.18 has a bug where
- * argv[1] = "DUMPDIR PID SIGNO UID CORE_SIZE_LIMIT"
- * argv[2] = "PID SIGNO UID CORE_SIZE_LIMIT"
+ * argv[1] = "DUMPDIR SIGNO CORE_SIZE_LIMIT ..."
+ * argv[2] = "SIGNO CORE_SIZE_LIMIT ..."
* and so on. Fixing it:
*/
- for (i = 1; argv[i]; i++)
+ if (strchr(argv[1], ' '))
{
- strchrnul(argv[i], ' ')[0] = '\0';
+ int i;
+ for (i = 1; argv[i]; i++)
+ {
+ strchrnul(argv[i], ' ')[0] = '\0';
+ }
}
openlog("abrt", LOG_PID, LOG_DAEMON);
@@ -272,19 +332,38 @@ int main(int argc, char** argv)
errno = 0;
const char* dddir = argv[1];
- pid_t pid = xatoi_u(argv[2]);
- const char* signal_str = argv[3];
- int signal_no = xatoi_u(argv[3]);
- uid_t uid = xatoi_u(argv[4]);
- off_t ulimit_c = strtoull(argv[5], NULL, 10);
+ const char* signal_str = argv[2];
+ int signal_no = xatoi_positive(signal_str);
+ off_t ulimit_c = strtoull(argv[3], NULL, 10);
if (ulimit_c < 0) /* unlimited? */
{
/* set to max possible >0 value */
ulimit_c = ~((off_t)1 << (sizeof(off_t)*8-1));
}
+ pid_t pid = xatoi_positive(argv[4]);
+ uid_t uid = xatoi_positive(argv[5]);
if (errno || pid <= 0)
{
- error_msg_and_die("pid '%s' or limit '%s' is bogus", argv[2], argv[5]);
+ perror_msg_and_die("pid '%s' or limit '%s' is bogus", argv[4], argv[3]);
+ }
+ if (argv[10]) /* OLD_PATTERN */
+ {
+ char *buf = (char*) xzalloc(strlen(argv[10]) / 2 + 2);
+ char *end = hex2bin(buf, argv[10], strlen(argv[10]));
+ if (end && end > buf && end[-1] == '\0')
+ {
+ core_basename = buf;
+ //log("core_basename:'%s'", core_basename);
+ }
+ else
+ {
+ /* Until recently, kernels were truncating expanded core pattern.
+ * In this case, we end up here...
+ */
+ error_msg("bad old pattern '%s', ignoring and using 'core'", argv[10]);
+ /* core_basename = "core"; - already is */
+ free(buf);
+ }
}
int src_fd_binary;
@@ -311,8 +390,8 @@ int main(int argc, char** argv)
/* Open a fd to compat coredump, if requested and is possible */
int user_core_fd = -1;
if (setting_MakeCompatCore && ulimit_c != 0)
- /* note: checks "user_pwd == NULL" inside */
- user_core_fd = open_user_core(user_pwd, uid, pid);
+ /* note: checks "user_pwd == NULL" inside, updates core_basename */
+ user_core_fd = open_user_core(user_pwd, uid, pid, &argv[2]);
if (executable == NULL)
{
@@ -340,7 +419,7 @@ int main(int argc, char** argv)
if (!daemon_is_ok())
{
- /* not an error, exit with exitcode 0 */
+ /* not an error, exit with exit code 0 */
log("abrt daemon is not running. If it crashed, "
"/proc/sys/kernel/core_pattern contains a stale value, "
"consider resetting it to 'core'"
@@ -410,16 +489,32 @@ int main(int argc, char** argv)
return 0;
}
- unsigned path_len = snprintf(path, sizeof(path), "%s/ccpp-%ld-%lu.new",
- dddir, (long)time(NULL), (long)pid);
+ unsigned path_len = snprintf(path, sizeof(path), "%s/ccpp-%s-%lu.new",
+ dddir, iso_date_string(NULL), (long)pid);
if (path_len >= (sizeof(path) - sizeof("/"FILENAME_COREDUMP)))
return 1;
struct dump_dir *dd = dd_create(path, uid);
if (dd)
{
+ dd_create_basic_files(dd, uid);
+
+ char source_filename[sizeof("/proc/%lu/smaps") + sizeof(long)*3];
+ int base_name = sprintf(source_filename, "/proc/%lu/smaps", (long)pid);
+ base_name -= strlen("smaps");
+ char *dest_filename = concat_path_file(dd->dd_dirname, FILENAME_SMAPS);
+ copy_file(source_filename, dest_filename, S_IRUSR | S_IRGRP | S_IWUSR);
+ chown(dest_filename, dd->dd_uid, dd->dd_gid);
+ strcpy(source_filename + base_name, "maps");
+ strcpy(strrchr(dest_filename, '/') + 1, FILENAME_MAPS);
+ copy_file(source_filename, dest_filename, S_IRUSR | S_IRGRP | S_IWUSR);
+ chown(dest_filename, dd->dd_uid, dd->dd_gid);
+ free(dest_filename);
+
char *cmdline = get_cmdline(pid); /* never NULL */
- char *reason = xasprintf("Process %s was killed by signal %s (SIG%s)", executable, signal_str, signame ? signame : signal_str);
+ char *reason = xasprintf("Process %s was killed by signal %s (SIG%s)",
+ executable, signal_str, signame ? signame : signal_str);
+
dd_save_text(dd, FILENAME_ANALYZER, "CCpp");
dd_save_text(dd, FILENAME_EXECUTABLE, executable);
dd_save_text(dd, FILENAME_CMDLINE, cmdline);
@@ -498,8 +593,8 @@ int main(int argc, char** argv)
}
/* We close dumpdir before we start catering for crash storm case.
- * Otherwise, delete_crash_dump_dir's from other concurrent
- * CCpp's won't be able to delete our dump (their delete_crash_dump_dir
+ * Otherwise, delete_dump_dir's from other concurrent
+ * CCpp's won't be able to delete our dump (their delete_dump_dir
* will wait for us), and we won't be able to delete their dumps.
* Classic deadlock.
*/
diff --git a/src/hooks/abrt_exception_handler.py.in b/src/hooks/abrt_exception_handler.py.in
index dd6fbaed..d12968e1 100644
--- a/src/hooks/abrt_exception_handler.py.in
+++ b/src/hooks/abrt_exception_handler.py.in
@@ -25,7 +25,6 @@ Module for the ABRT exception handling hook
import sys
import os
import syslog
-import subprocess
import socket
def write_dump(pid, tb):
@@ -61,8 +60,10 @@ def handleMyException((etype, value, tb)):
# restore original exception handler
sys.excepthook = sys.__excepthook__ # pylint: disable-msg=E1101
- # ignore uncaught ctrl-c
- if etype == KeyboardInterrupt:
+ # ignore
+ # - uncaught ctrl-c
+ # - SystemExit rhbz#636913 -> this exception is not an error
+ if etype in [KeyboardInterrupt, SystemExit]:
return sys.__excepthook__(etype, value, tb)
try:
diff --git a/src/hooks/dumpoops.cpp b/src/hooks/dumpoops.cpp
deleted file mode 100644
index c67f8cda..00000000
--- a/src/hooks/dumpoops.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- Copyright (C) 2010 ABRT team
- Copyright (C) 2010 RedHat Inc
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
- Authors:
- Denys Vlasenko <dvlasenk@redhat.com>
- Zdenek Prikryl <zprikryl@redhat.com>
-*/
-
-#include "abrtlib.h"
-#include "abrt_exception.h"
-#include "KerneloopsScanner.h"
-#include <dlfcn.h>
-#include <glib.h>
-
-#define LOADSYM(fp, name) \
-do { \
- fp = (typeof(fp)) (dlsym(handle, name)); \
- if (!fp) \
- perror_msg_and_die(PLUGINS_LIB_DIR"/libKerneloopsScanner.so has no %s", name); \
-} while (0)
-
-
-int main(int argc, char **argv)
-{
- char *program_name = strrchr(argv[0], '/');
- program_name = program_name ? program_name + 1 : argv[0];
-
- /* Parse options */
- bool opt_d = 0, opt_s = 0;
- int opt;
- while ((opt = getopt(argc, argv, "dsv")) != -1) {
- switch (opt) {
- case 'd':
- opt_d = 1;
- break;
- case 's':
- opt_s = 1;
- break;
- case 'v':
- /* Kerneloops code uses VERB3, thus: */
- g_verbose = 3;
- break;
- default:
-usage:
- error_msg_and_die(
- "Usage: %s [-dsv] FILE\n\n"
- "Options:\n"
- "\t-d\tCreate ABRT dump for every oops found\n"
- "\t-s\tPrint found oopses on standard output\n"
- "\t-v\tVerbose\n"
- , program_name
- );
- }
- }
- argv += optind;
- if (!argv[0])
- goto usage;
-
- msg_prefix = program_name;
-
- /* Load KerneloopsScanner plugin */
- // const plugin_info_t *plugin_info;
- CPlugin* (*plugin_newf)(void);
- int (*scan_syslog_file)(GList **oopsList, const char *filename, time_t *last_changed_p);
- int (*save_oops_to_debug_dump)(GList **oopsList);
- void *handle;
-
- errno = 0;
- //TODO: use it directly, not via dlopen?
- handle = dlopen(PLUGINS_LIB_DIR"/libKerneloopsScanner.so", RTLD_NOW);
- if (!handle)
- perror_msg_and_die("can't load %s", PLUGINS_LIB_DIR"/libKerneloopsScanner.so");
-
- // LOADSYM(plugin_info, "plugin_info");
- LOADSYM(plugin_newf, "plugin_new");
- LOADSYM(scan_syslog_file, "scan_syslog_file");
- LOADSYM(save_oops_to_debug_dump, "save_oops_to_debug_dump");
-
- // CKerneloopsScanner* scanner = (CKerneloopsScanner*) plugin_newf();
- // scanner->Init();
- // scanner->LoadSettings(path);
-
- /* Use it: parse and dump the oops */
- GList *oopsList = NULL;
- int cnt = scan_syslog_file(&oopsList, argv[0], NULL);
- log("found oopses: %d", cnt);
-
- if (cnt > 0) {
- if (opt_s) {
- int i = 0;
- int length = g_list_length(oopsList);
- while (i < length) {
- printf("\nVersion: %s", (char*)g_list_nth_data(oopsList, i));
- i++;
- }
- }
- if (opt_d) {
- log("dumping oopses");
- int errors = save_oops_to_debug_dump(&oopsList);
- if (errors > 0)
- {
- log("%d errors while dumping oopses", errors);
- return 1;
- }
- }
- }
-
- for (GList *li = oopsList; li != NULL; li = g_list_next(li))
- free((char*)li->data);
-
- g_list_free(oopsList);
- /*dlclose(handle); - why bother?
- * cos we are handsome and good lookin' guys :D
- */
- return 0;
-}
diff --git a/src/include/Makefile.am b/src/include/Makefile.am
index 3716d19e..477963c3 100644
--- a/src/include/Makefile.am
+++ b/src/include/Makefile.am
@@ -1,16 +1,12 @@
-HEADER_FILES = \
- abrt_exception.h \
+libreport_includedir = $(includedir)/report
+libreport_include_HEADERS = \
+ report/crash_data.h \
+ report/dump_dir.h \
+ report/run_event.h
+
+libabrt_includedir = $(includedir)/abrt
+libabrt_include_HEADERS = \
abrtlib.h \
abrt_types.h \
- comm_layer_inner.h \
- abrt_crash_dump.h \
- dbus_common.h \
- dump_dir.h \
- observer.h \
- plugin.h \
- action.h \
- analyzer.h \
+ abrt_crash_data.h \
xfuncs.h
-
-lib_includedir=$(includedir)/abrt/
-lib_include_HEADERS = $(HEADER_FILES)
diff --git a/src/include/abrt_crash_dump.h b/src/include/abrt_crash_data.h
index ed7ffe95..b71b046f 100644
--- a/src/include/abrt_crash_dump.h
+++ b/src/include/abrt_crash_data.h
@@ -19,8 +19,12 @@
#ifndef ABRT_CRASH_DUMP_H_
#define ABRT_CRASH_DUMP_H_
+#include "crash_data.h"
#include "abrt_types.h"
+// Text bigger than this usually is attached, not added inline
+#define CD_TEXT_ATT_SIZE (2*1024)
+
// Keep in sync with CCDump.py:
// Filenames in dump directory:
@@ -32,7 +36,8 @@
#define FILENAME_REASON "reason"
#define FILENAME_COREDUMP "coredump"
#define FILENAME_BACKTRACE "backtrace"
-#define FILENAME_MEMORYMAP "memorymap"
+#define FILENAME_MAPS "maps"
+#define FILENAME_SMAPS "smaps"
#define FILENAME_DUPHASH "global_uuid" /* name is compat, to be renamed to "duphash" */
// Name of the function where the application crashed.
// Optional.
@@ -41,11 +46,11 @@
#define FILENAME_ARCHITECTURE "architecture"
#define FILENAME_KERNEL "kernel"
#define FILENAME_TIME "time"
-#define FILENAME_RELEASE "release" /* from /etc/redhat-release */
-// filled by <what?>
+// From /etc/syste-release or /etc/redhat-release
+#define FILENAME_OS_RELEASE "os_release"
+// Filled by <what?>
#define FILENAME_PACKAGE "package"
#define FILENAME_COMPONENT "component"
-#define FILENAME_DESCRIPTION "description" /* package descr (not crash descr) */
#define FILENAME_COMMENT "comment"
#define FILENAME_REPRODUCE "reproduce"
#define FILENAME_RATING "rating"
@@ -67,62 +72,18 @@
#define CD_EVENTS "Events"
-// Crash data is a map of 3-element vectors of strings: type, editable, content
-#define CD_TYPE 0
-#define CD_EDITABLE 1
-#define CD_CONTENT 2
-
-// SYS - system value, should not be displayed
-// BIN - binary data
-// TXT - text data, can be displayed
-#define CD_SYS "s"
-#define CD_BIN "b"
-#define CD_TXT "t"
-// Text bigger than this usually is attached, not added inline
-#define CD_TEXT_ATT_SIZE (2*1024)
-
-#define CD_ISEDITABLE "y"
-#define CD_ISNOTEDITABLE "n"
-
-
#ifdef __cplusplus
extern "C" {
#endif
-extern const char *const must_have_files[];
-
+#define is_editable_file abrt_is_editable_file
bool is_editable_file(const char *file_name);
+#define log_crash_data abrt_log_crash_data
+void log_crash_data(crash_data_t *crash_data, const char *pfx);
+
#ifdef __cplusplus
}
#endif
-
-#ifdef __cplusplus
-
-// <key, data>
-typedef map_vector_string_t map_crash_data_t;
-typedef std::vector<map_crash_data_t> vector_map_crash_data_t;
-
-void add_to_crash_data_ext(map_crash_data_t& pCrashData,
- const char *pItem,
- const char *pType,
- const char *pEditable,
- const char *pContent);
-// Uses type:CD_TXT, editable:CD_ISNOTEDITABLE
-void add_to_crash_data(map_crash_data_t& pCrashData,
- const char *pItem,
- const char *pContent);
-
-void load_crash_data_from_crash_dump_dir(struct dump_dir *dd, map_crash_data_t& data);
-
-const char *get_crash_data_item_content_or_NULL(const map_crash_data_t& crash_data, const char *key);
-// Aborts if key is not found:
-const std::string& get_crash_data_item_content(const map_crash_data_t& crash_data, const char *key);
-
-void log_map_crash_data(const map_crash_data_t& data, const char *name);
-
-#endif /* __cplusplus */
-
-
#endif
diff --git a/src/include/abrt_exception.h b/src/include/abrt_exception.h
deleted file mode 100644
index b826bfa8..00000000
--- a/src/include/abrt_exception.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- Copyright (C) 2010 ABRT team
- Copyright (C) 2010 RedHat Inc
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#ifndef ABRTEXCEPTION_H_
-#define ABRTEXCEPTION_H_
-
-#include "abrtlib.h"
-
-typedef enum {
- EXCEP_UNKNOW,
- EXCEP_DD_OPEN,
- EXCEP_DD_LOAD,
- EXCEP_DD_SAVE,
- EXCEP_DD_DELETE,
- EXCEP_DL,
- EXCEP_PLUGIN,
- EXCEP_ERROR,
-} abrt_exception_t;
-
-/* std::exception is a class with virtual members.
- * deriving from it makes our ctor/dtor much more heavy,
- * and those are inlined in every throw and catch site!
- */
-class CABRTException /*: public std::exception*/
-{
- private:
- abrt_exception_t m_type;
- char *m_what;
-
- /* Not defined. You can't use it */
- CABRTException& operator= (const CABRTException&);
-
- public:
- ~CABRTException() { free(m_what); }
- CABRTException(abrt_exception_t type, const char* fmt, ...);
- CABRTException(const CABRTException& rhs);
-
- abrt_exception_t type() { return m_type; }
- const char* what() const { return m_what; }
-};
-
-#endif
diff --git a/src/include/abrt_types.h b/src/include/abrt_types.h
index 38804895..200946e1 100644
--- a/src/include/abrt_types.h
+++ b/src/include/abrt_types.h
@@ -20,6 +20,34 @@
#define ABRT_TYPES_H_
#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* We can't typedef it to map_string_t, since other parts of ABRT
+ * (daemon, cli) still use that name for C++ container. For now,
+ * let's call it map_string_h:
+ */
+typedef GHashTable map_string_h;
+
+#define new_map_string abrt_new_map_string
+map_string_h *new_map_string(void);
+#define free_map_string abrt_free_map_string
+void free_map_string(map_string_h *ms);
+#define get_map_string_item_or_empty abrt_get_map_string_item_or_empty
+const char *get_map_string_item_or_empty(map_string_h *ms, const char *key);
+static inline
+const char *get_map_string_item_or_NULL(map_string_h *ms, const char *key)
+{
+ return (const char*)g_hash_table_lookup(ms, key);
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#ifdef __cplusplus
#include <map>
#include <set>
diff --git a/src/include/abrtlib.h b/src/include/abrtlib.h
index 8cd0664a..61731587 100644
--- a/src/include/abrtlib.h
+++ b/src/include/abrtlib.h
@@ -42,6 +42,7 @@
#ifdef __cplusplus
# include <string>
#endif
+#include <glib.h>
#ifdef HAVE_CONFIG_H
# include "config.h"
@@ -77,74 +78,99 @@ int vdprintf(int d, const char *format, va_list ap);
#include "hash_sha1.h"
#include "hash_md5.h"
-#include "abrt_crash_dump.h"
-#include "dump_dir.h"
+#include "abrt_crash_data.h"
#include "abrt_types.h"
+#include "dump_dir.h"
+#include "run_event.h"
#ifdef __cplusplus
extern "C" {
#endif
+#define prefixcmp abrt_prefixcmp
int prefixcmp(const char *str, const char *prefix);
+#define suffixcmp abrt_suffixcmp
int suffixcmp(const char *str, const char *suffix);
+#define concat_path_file abrt_concat_path_file
char *concat_path_file(const char *path, const char *filename);
+#define append_to_malloced_string abrt_append_to_malloced_string
char *append_to_malloced_string(char *mstr, const char *append);
+#define skip_whitespace abrt_skip_whitespace
char* skip_whitespace(const char *s);
+#define skip_non_whitespace abrt_skip_non_whitespace
char* skip_non_whitespace(const char *s);
/* Like strcpy but can copy overlapping strings. */
+#define overlapping_strcpy abrt_overlapping_strcpy
void overlapping_strcpy(char *dst, const char *src);
/* A-la fgets, but malloced and of unlimited size */
+#define xmalloc_fgets abrt_xmalloc_fgets
char *xmalloc_fgets(FILE *file);
/* Similar, but removes trailing \n */
+#define xmalloc_fgetline abrt_xmalloc_fgetline
char *xmalloc_fgetline(FILE *file);
/* On error, copyfd_XX prints error messages and returns -1 */
enum {
COPYFD_SPARSE = 1 << 0,
};
+#define copyfd_eof abrt_copyfd_eof
off_t copyfd_eof(int src_fd, int dst_fd, int flags);
+#define copyfd_size abrt_copyfd_size
off_t copyfd_size(int src_fd, int dst_fd, off_t size, int flags);
+#define copyfd_exact_size abrt_copyfd_exact_size
void copyfd_exact_size(int src_fd, int dst_fd, off_t size);
+#define copy_file abrt_copy_file
off_t copy_file(const char *src_name, const char *dst_name, int mode);
+#define copy_file_recursive abrt_copy_file_recursive
+int copy_file_recursive(const char *source, const char *dest);
/* Returns malloc'ed block */
+#define encode_base64 abrt_encode_base64
char *encode_base64(const void *src, int length);
+#define xatou abrt_xatou
unsigned xatou(const char *numstr);
+#define xatoi abrt_xatoi
int xatoi(const char *numstr);
/* Using xatoi() instead of naive atoi() is not always convenient -
* in many places people want *non-negative* values, but store them
* in signed int. Therefore we need this one:
- * dies if input is not in [0, INT_MAX] range. Also will reject '-0' etc */
-int xatoi_u(const char *numstr);
+ * dies if input is not in [0, INT_MAX] range. Also will reject '-0' etc.
+ * It should really be named xatoi_nonnegative (since it allows 0),
+ * but that would be too long.
+ */
+#define xatoi_positive abrt_xatoi_positive
+int xatoi_positive(const char *numstr);
-unsigned long long monotonic_ns(void);
-unsigned long long monotonic_us(void);
-unsigned monotonic_sec(void);
+//unused for now
+//unsigned long long monotonic_ns(void);
+//unsigned long long monotonic_us(void);
+//unsigned monotonic_sec(void);
enum {
- /* on return, pipefds[1] is fd to which parent may write
- * and deliver data to child's stdin: */
- EXECFLG_INPUT = 1 << 0,
- /* on return, pipefds[0] is fd from which parent may read
- * child's stdout: */
- EXECFLG_OUTPUT = 1 << 1,
- /* open child's stdin to /dev/null: */
- EXECFLG_INPUT_NUL = 1 << 2,
- /* open child's stdout to /dev/null: */
- EXECFLG_OUTPUT_NUL = 1 << 3,
- /* redirect child's stderr to stdout: */
- EXECFLG_ERR2OUT = 1 << 4,
- /* open child's stderr to /dev/null: */
- EXECFLG_ERR_NUL = 1 << 5,
- /* suppress perror_msg("Can't execute 'foo'") if exec fails */
- EXECFLG_QUIET = 1 << 6,
- EXECFLG_SETGUID = 1 << 7,
- EXECFLG_SETSID = 1 << 8,
+ /* on return, pipefds[1] is fd to which parent may write
+ * and deliver data to child's stdin: */
+ EXECFLG_INPUT = 1 << 0,
+ /* on return, pipefds[0] is fd from which parent may read
+ * child's stdout: */
+ EXECFLG_OUTPUT = 1 << 1,
+ /* open child's stdin to /dev/null: */
+ EXECFLG_INPUT_NUL = 1 << 2,
+ /* open child's stdout to /dev/null: */
+ EXECFLG_OUTPUT_NUL = 1 << 3,
+ /* redirect child's stderr to stdout: */
+ EXECFLG_ERR2OUT = 1 << 4,
+ /* open child's stderr to /dev/null: */
+ EXECFLG_ERR_NUL = 1 << 5,
+ /* suppress perror_msg("Can't execute 'foo'") if exec fails */
+ EXECFLG_QUIET = 1 << 6,
+ EXECFLG_SETGUID = 1 << 7,
+ EXECFLG_SETSID = 1 << 8,
};
/* Returns pid */
+#define fork_execv_on_steroids abrt_fork_execv_on_steroids
pid_t fork_execv_on_steroids(int flags,
char **argv,
int *pipefds,
@@ -153,110 +179,67 @@ pid_t fork_execv_on_steroids(int flags,
uid_t uid);
/* Returns malloc'ed string. NULs are retained, and extra one is appended
* after the last byte (this NUL is not accounted for in *size_p) */
+#define run_in_shell_and_save_output abrt_run_in_shell_and_save_output
char *run_in_shell_and_save_output(int flags,
- const char *cmd,
- const char *dir,
- size_t *size_p);
-
-/* Networking helpers */
-typedef struct len_and_sockaddr {
- socklen_t len;
- union {
- struct sockaddr sa;
- struct sockaddr_in sin;
- struct sockaddr_in6 sin6;
- } u;
-} len_and_sockaddr;
-enum {
- LSA_LEN_SIZE = offsetof(len_and_sockaddr, u),
- LSA_SIZEOF_SA = sizeof(struct sockaddr) > sizeof(struct sockaddr_in6) ?
- sizeof(struct sockaddr) : sizeof(struct sockaddr_in6),
-};
-void setsockopt_reuseaddr(int fd);
-int setsockopt_broadcast(int fd);
-int setsockopt_bindtodevice(int fd, const char *iface);
-len_and_sockaddr* get_sock_lsa(int fd);
-void xconnect(int s, const struct sockaddr *s_addr, socklen_t addrlen);
-unsigned lookup_port(const char *port, const char *protocol, unsigned default_port);
-int get_nport(const struct sockaddr *sa);
-void set_nport(len_and_sockaddr *lsa, unsigned port);
-len_and_sockaddr* host_and_af2sockaddr(const char *host, int port, sa_family_t af);
-len_and_sockaddr* xhost_and_af2sockaddr(const char *host, int port, sa_family_t af);
-len_and_sockaddr* host2sockaddr(const char *host, int port);
-len_and_sockaddr* xhost2sockaddr(const char *host, int port);
-len_and_sockaddr* xdotted2sockaddr(const char *host, int port);
-int xsocket_type(len_and_sockaddr **lsap, int family, int sock_type);
-int xsocket_stream(len_and_sockaddr **lsap);
-int create_and_bind_stream_or_die(const char *bindaddr, int port);
-int create_and_bind_dgram_or_die(const char *bindaddr, int port);
-int create_and_connect_stream_or_die(const char *peer, int port);
-int xconnect_stream(const len_and_sockaddr *lsa);
-char* xmalloc_sockaddr2host(const struct sockaddr *sa);
-char* xmalloc_sockaddr2host_noport(const struct sockaddr *sa);
-char* xmalloc_sockaddr2hostonly_noport(const struct sockaddr *sa);
-char* xmalloc_sockaddr2dotted(const struct sockaddr *sa);
-char* xmalloc_sockaddr2dotted_noport(const struct sockaddr *sa);
+ const char *cmd,
+ const char *dir,
+ size_t *size_p);
/* Random utility functions */
+/* Frees every element'd data using free(),
+ * then frees list itself using g_list_free(list):
+ */
+#define list_free_with_free abrt_list_free_with_free
+void list_free_with_free(GList *list);
+
+#define get_dirsize abrt_get_dirsize
double get_dirsize(const char *pPath);
+#define get_dirsize_find_largest_dir abrt_get_dirsize_find_largest_dir
double get_dirsize_find_largest_dir(
const char *pPath,
char **worst_dir, /* can be NULL */
const char *excluded /* can be NULL */
);
+/* Emit a string of hex representation of bytes */
+#define bin2hex abrt_bin2hex
+char* bin2hex(char *dst, const char *str, int count);
+/* Convert "xxxxxxxx" hex string to binary, no more than COUNT bytes */
+#define hex2bin abrt_hex2bin
+char* hex2bin(char *dst, const char *str, int count);
+
/* Returns command line of running program.
* Caller is responsible to free() the returned value.
* If the pid is not valid or command line can not be obtained,
* empty string is returned.
*/
+#define get_cmdline abrt_get_cmdline
char* get_cmdline(pid_t pid);
/* Returns 1 if abrtd daemon is running, 0 otherwise. */
+#define daemon_is_ok abrt_daemon_is_ok
int daemon_is_ok();
-struct run_event_state {
- int (*post_run_callback)(const char *dump_dir_name, void *param);
- void *post_run_param;
- char* (*logging_callback)(char *log_line, void *param);
- void *logging_param;
-};
-static inline struct run_event_state *new_run_event_state()
- { return (struct run_event_state*)xzalloc(sizeof(struct run_event_state)); }
-static inline void free_run_event_state(struct run_event_state *state)
- { free(state); }
-/* Returns exitcode of first failed action, or first nonzero return value
- * of post_run_callback. If all actions are successful, returns 0.
- * If no actions were run for the event, returns -1.
+/* Takes ptr to time_t, or NULL if you want to use current time.
+ * Returns "YYYY-MM-DD-hh:mm:ss" string.
*/
-int run_event(struct run_event_state *state, const char *dump_dir_name, const char *event);
-char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const char *pfx);
-
-#ifdef __cplusplus
-}
-#endif
-
-
-/* C++ style stuff */
-#ifdef __cplusplus
-std::string unsigned_to_string(unsigned long long x);
-std::string signed_to_string(long long x);
-template <class T> inline
-std::string to_string(T x)
-{
- if ((T)~(T)0 < (T)0) /* T is a signed type */
- return signed_to_string(x);
- return unsigned_to_string(x);
-}
-
-void parse_args(const char *psArgs, vector_string_t& pArgs, int quote = -1);
-void parse_release(const char *pRelease, char **product, char **version);
-
-char* make_description_bz(const map_crash_data_t& pCrashData);
-char* make_description_reproduce_comment(const map_crash_data_t& pCrashData);
-char* make_description_logger(const map_crash_data_t& pCrashData);
-char* make_description_mailx(const map_crash_data_t& pCrashData);
+#define iso_date_string abrt_iso_date_string
+char *iso_date_string(time_t *pt);
+
+#define make_description_bz abrt_make_description_bz
+char* make_description_bz(crash_data_t *crash_data);
+#define make_description_reproduce_comment abrt_make_description_reproduce_comment
+char* make_description_reproduce_comment(crash_data_t *crash_data);
+#define make_description_logger abrt_make_description_logger
+char* make_description_logger(crash_data_t *crash_data);
+#define make_description_mailx abrt_make_description_mailx
+char* make_description_mailx(crash_data_t *crash_data);
+
+#define parse_release_for_bz abrt_parse_release_for_bz
+void parse_release_for_bz(const char *pRelease, char **product, char **version);
+#define parse_release_for_rhts abrt_parse_release_for_rhts
+void parse_release_for_rhts(const char *pRelease, char **product, char **version);
/**
* Loads settings and stores it in second parameter. On success it
@@ -264,29 +247,21 @@ char* make_description_mailx(const map_crash_data_t& pCrashData);
*
* @param path A path of config file.
* Config file consists of "key=value" lines.
- * @param settings A readed plugin's settings.
+ * @param settings A read 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);
+#define load_conf_file abrt_load_conf_file
+bool load_conf_file(const char *pPath, map_string_h *settings, bool skipKeysWithoutValue);
-// TODO: npajkovs: full rewrite ssprintf -> xasprintf
-static inline std::string ssprintf(const char *format, ...)
-{
- va_list p;
- char *string_ptr;
+/* Tries to create a copy of dump_dir_name in base_dir, with same or similar basename.
+ * Returns NULL if copying failed. In this case, logs a message before returning. */
+#define steal_directory abrt_steal_directory
+struct dump_dir *steal_directory(const char *base_dir, const char *dump_dir_name);
- va_start(p, format);
- string_ptr = xvasprintf(format, p);
- va_end(p);
-
- std::string res = string_ptr;
- free(string_ptr);
- return res;
+#ifdef __cplusplus
}
#endif
diff --git a/src/include/action.h b/src/include/action.h
deleted file mode 100644
index 21183366..00000000
--- a/src/include/action.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- Action.h - header file for action plugin
-
- Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com)
- Copyright (C) 2009 RedHat inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#ifndef ACTION_H_
-#define ACTION_H_
-
-#include "plugin.h"
-
-/**
- * An abstract class. The class defines an action plugin interface.
- */
-class CAction : public CPlugin
-{
- public:
- /**
- * A Method which performs particular action. As the first parameter it
- * takes an action directory. It could be either a directory of actual
- * crash or it could be a directory contains all crashes. It depends on
- * who call the plugin. The plugin can takes arguments, but the plugin
- * has to parse them by itself.
- * @param pActionDir An actual directory.
- * @param pArgs Plugin's arguments.
- */
- virtual void Run(const char *pActionDir, const char *pArgs, int force) = 0;
-};
-
-#endif
diff --git a/src/include/analyzer.h b/src/include/analyzer.h
deleted file mode 100644
index 1d78d576..00000000
--- a/src/include/analyzer.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- Analyzer.h - header file for analyzer plugin
-
- Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com)
- Copyright (C) 2009 RedHat inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#ifndef ANALYZER_H_
-#define ANALYZER_H_
-
-#include <string>
-#include "plugin.h"
-
-/**
- * An abstract class. The class defines an analyzer plugin interface.
- */
-class CAnalyzer : public CPlugin
-{
-};
-
-#endif /*ANALYZER_H_*/
diff --git a/src/include/dbus_common.h b/src/include/dbus_common.h
deleted file mode 100644
index 6c739169..00000000
--- a/src/include/dbus_common.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- Copyright (C) 2009 Jiri Moskovcak (jmoskovc@redhat.com)
- Copyright (C) 2009 RedHat inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#ifndef DBUSCOMMON_H_
-#define DBUSCOMMON_H_
-
-#include "abrt_crash_dump.h"
-
-#define ABRTD_DBUS_NAME "com.redhat.abrt"
-#define ABRTD_DBUS_PATH "/com/redhat/abrt"
-#define ABRTD_DBUS_IFACE "com.redhat.abrt"
-
-#endif
diff --git a/src/include/observer.h b/src/include/observer.h
deleted file mode 100644
index 1c8f2355..00000000
--- a/src/include/observer.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- Copyright (C) 2010 ABRT team
- Copyright (C) 2010 RedHat Inc
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#ifndef OBSERVER_H_
-#define OBSERVER_H_
-
-#include <string>
-#include "dbus_common.h"
-
-class CObserver {
- public:
- virtual ~CObserver() {}
- virtual void Status(const char *pMessage, const char* peer) = 0;
- virtual void Warning(const char *pMessage, const char* peer) = 0;
-};
-
-#endif
diff --git a/src/include/plugin.h b/src/include/plugin.h
deleted file mode 100644
index 3f652e65..00000000
--- a/src/include/plugin.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- Plugin.h - header file for plugin. It contains mandatory macros
- and common function for plugins
-
- Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com)
- Copyright (C) 2009 RedHat inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#ifndef PLUGIN_H_
-#define PLUGIN_H_
-
-#include "abrt_types.h"
-#include "abrt_crash_dump.h"
-
-#define PLUGINS_MAGIC_NUMBER 6
-
-#define PLUGINS_CONF_EXTENSION "conf"
-#define PLUGINS_LIB_EXTENSION "so"
-#define PLUGINS_LIB_PREFIX "lib"
-
-/**
- * An abstract class. The class defines a common plugin interface. If a plugin
- * has some settings, then a *Settings(*) method has to be written.
- */
-class CPlugin
-{
- protected:
- map_plugin_settings_t m_pSettings;
-
- public:
- CPlugin();
- /**
- * A destructor.
- */
- virtual ~CPlugin();
- /**
- * A method, which initializes a plugin. It is not mandatory method.
- */
- virtual void Init();
- /**
- * A method, which deinitializes a plugin. It is not mandatory method.
- */
- virtual void DeInit();
- /**
- * A method, which takes a settings and apply them. It is not a mandatory method.
- * @param pSettings Plugin's settings
- */
- virtual void SetSettings(const map_plugin_settings_t& pSettings);
- /**
- * A method, which return current settings. It is not mandatory method.
- * @return Plugin's settings
- */
-///
-// virtual const map_plugin_settings_t& GetSettings();
-};
-
-/**
- * An enum of plugin types.
- */
-typedef enum {
- ANALYZER, /**< An analyzer plugin*/
- ACTION, /**< An action plugin*/
- REPORTER, /**< A reporter plugin*/
- DATABASE, /**< A database plugin*/
- MAX_PLUGIN_TYPE = DATABASE,
-} plugin_type_t;
-
-/**
- * A struct contains all needed data about particular plugin.
- */
-typedef struct SPluginInfo
-{
- const plugin_type_t m_Type; /**< Plugin type.*/
- const char *const m_sName; /**< Plugin name.*/
- const char *const m_sVersion; /**< Plugin version.*/
- const char *const m_sDescription; /**< Plugin description.*/
- const char *const m_sEmail; /**< Plugin author's email.*/
- const char *const m_sWWW; /**< Plugin's home page.*/
- const char *const m_sGTKBuilder; /**< Plugin's gui description.*/
- const int m_nMagicNumber; /**< Plugin magical number.*/
-} plugin_info_t;
-
-#define PLUGIN_INFO(type, plugin_class, name, version, description, email, www, gtk_builder)\
- extern "C" CPlugin* plugin_new()\
- {\
- return new plugin_class();\
- }\
- extern "C" const plugin_info_t plugin_info =\
- {\
- type,\
- name,\
- version,\
- description,\
- email,\
- www,\
- gtk_builder,\
- PLUGINS_MAGIC_NUMBER,\
- };
-
-#endif
diff --git a/src/include/report/crash_data.h b/src/include/report/crash_data.h
new file mode 100644
index 00000000..3854118a
--- /dev/null
+++ b/src/include/report/crash_data.h
@@ -0,0 +1,101 @@
+/*
+ Copyright (C) 2009 Abrt team.
+ Copyright (C) 2009 RedHat inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+#ifndef CRASH_DATA_H_
+#define CRASH_DATA_H_
+
+#include <glib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct dump_dir;
+
+enum {
+ CD_FLAG_BIN = (1 << 0),
+ CD_FLAG_TXT = (1 << 1),
+ CD_FLAG_ISEDITABLE = (1 << 2),
+ CD_FLAG_ISNOTEDITABLE = (1 << 3),
+};
+
+struct crash_item {
+ char *content;
+ unsigned flags;
+};
+typedef struct crash_item crash_item;
+
+/* In-memory crash data structure and accessors */
+
+typedef GHashTable crash_data_t;
+
+crash_data_t *new_crash_data(void);
+
+static inline void free_crash_data(crash_data_t *crash_data)
+{
+ if (crash_data)
+ g_hash_table_destroy(crash_data);
+}
+
+void add_to_crash_data_ext(crash_data_t *crash_data,
+ const char *name,
+ const char *content,
+ unsigned flags);
+/* Uses CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE flags */
+void add_to_crash_data(crash_data_t *crash_data,
+ const char *name,
+ const char *content);
+
+static inline struct crash_item *get_crash_data_item_or_NULL(crash_data_t *crash_data, const char *key)
+{
+ return (struct crash_item *)g_hash_table_lookup(crash_data, key);
+}
+const char *get_crash_item_content_or_NULL(crash_data_t *crash_data, const char *key);
+/* Aborts if key is not found: */
+const char *get_crash_item_content_or_die(crash_data_t *crash_data, const char *key);
+
+
+/* Vector of these structures */
+
+typedef GPtrArray vector_of_crash_data_t;
+
+static inline crash_data_t *get_crash_data(vector_of_crash_data_t *vector, unsigned i)
+{
+ return (crash_data_t *)g_ptr_array_index(vector, i);
+}
+
+vector_of_crash_data_t *new_vector_of_crash_data(void);
+static inline void free_vector_of_crash_data(vector_of_crash_data_t *vector)
+{
+ if (vector)
+ g_ptr_array_free(vector, TRUE);
+}
+
+
+/* Conversions between in-memory and on-disk formats */
+
+void load_crash_data_from_dump_dir(crash_data_t *crash_data, struct dump_dir *dd);
+crash_data_t *create_crash_data_from_dump_dir(struct dump_dir *dd);
+
+struct dump_dir *create_dump_dir_from_crash_data(crash_data_t *crash_data, const char *base_dir_name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/include/dump_dir.h b/src/include/report/dump_dir.h
index 7a38f1e4..1376d7f3 100644
--- a/src/include/dump_dir.h
+++ b/src/include/report/dump_dir.h
@@ -21,16 +21,21 @@
#ifndef DUMP_DIR_H_
#define DUMP_DIR_H_
+/* For DIR */
+#include <sys/types.h>
+#include <dirent.h>
+
#ifdef __cplusplus
extern "C" {
#endif
enum {
DD_FAIL_QUIETLY = (1 << 0),
+ DD_OPEN_READONLY = (1 << 1),
};
struct dump_dir {
- char *dd_dir;
+ char *dd_dirname;
DIR *next_dir;
int locked;
uid_t dd_uid;
@@ -40,22 +45,27 @@ struct dump_dir {
void dd_close(struct dump_dir *dd);
struct dump_dir *dd_opendir(const char *dir, int flags);
+/* Pass uid = (uid_t)-1L to disable chown'ing of newly created files
+ * (IOW: if you aren't running under root):
+ */
struct dump_dir *dd_create(const char *dir, uid_t uid);
+void dd_create_basic_files(struct dump_dir *dd, uid_t uid);
int dd_exist(struct dump_dir *dd, const char *path);
DIR *dd_init_next_file(struct dump_dir *dd);
int dd_get_next_file(struct dump_dir *dd, char **short_name, char **full_name);
enum {
/* DD_FAIL_QUIETLY bit is valid for dd_load_text_ext too, */
- DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE = (1 << 1),
+ DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE = (1 << 2),
};
char* dd_load_text_ext(const struct dump_dir *dd, const char *name, unsigned flags);
char* dd_load_text(const struct dump_dir *dd, const char *name);
void dd_save_text(struct dump_dir *dd, const char *name, const char *data);
void dd_save_binary(struct dump_dir *dd, const char *name, const char *data, unsigned size);
-void dd_delete(struct dump_dir *dd);
+/* Returns 0 if directory is deleted or not found */
+int dd_delete(struct dump_dir *dd);
-void delete_crash_dump_dir(const char *dd_dir);
+void delete_dump_dir(const char *dirname);
#ifdef __cplusplus
}
diff --git a/src/include/report/run_event.h b/src/include/report/run_event.h
new file mode 100644
index 00000000..7fd8edea
--- /dev/null
+++ b/src/include/report/run_event.h
@@ -0,0 +1,82 @@
+/*
+ Copyright (C) 2009 Abrt team.
+ Copyright (C) 2009 RedHat inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+#ifndef RUN_EVENT_H_
+#define RUN_EVENT_H_
+
+#include "crash_data.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct dump_dir;
+
+struct run_event_state {
+ int children_count;
+
+ /* Used only for post-create dup detection. TODO: document its API */
+ int (*post_run_callback)(const char *dump_dir_name, void *param);
+ void *post_run_param;
+
+ /* Can take ownership of log_line, which is malloced. In this case, return NULL.
+ * Otherwise should return log_line (it will be freed by caller)
+ */
+ char* (*logging_callback)(char *log_line, void *param);
+ void *logging_param;
+
+ /* Internal data for async command execution */
+ GList *commands;
+ pid_t command_pid;
+ int command_out_fd;
+};
+struct run_event_state *new_run_event_state(void);
+void free_run_event_state(struct run_event_state *state);
+
+/* Asyncronous command execution */
+
+/* Returns 0 if no commands found for this dump_dir_name+event, else >0 */
+int prepare_commands(struct run_event_state *state, const char *dump_dir_name, const char *event);
+/* Returns -1 is no more commands needs to be executed,
+ * else sets state->command_pid and state->command_out_fd and returns >=0
+ */
+int spawn_next_command(struct run_event_state *state, const char *dump_dir_name, const char *event);
+/* Cleans up internal state created in prepare_commands */
+void free_commands(struct run_event_state *state);
+
+/* Syncronous command execution */
+
+/* Returns exit code of first failed action, or first nonzero return value
+ * of post_run_callback. If all actions are successful, returns 0.
+ */
+int run_event_on_dir_name(struct run_event_state *state, const char *dump_dir_name, const char *event);
+int run_event_on_crash_data(struct run_event_state *state, crash_data_t *data, const char *event);
+
+/* Querying for possible events */
+
+/* Scans event.conf for events starting with pfx which are applicable
+ * to dd, or (if dd is NULL), to dump_dir.
+ * Returns a malloced string with '\n'-terminated event names.
+ */
+char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const char *pfx);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/include/xfuncs.h b/src/include/xfuncs.h
index 20284564..61188c81 100644
--- a/src/include/xfuncs.h
+++ b/src/include/xfuncs.h
@@ -29,43 +29,69 @@
extern "C" {
#endif
+#define ndelay_on abrt_ndelay_on
int ndelay_on(int fd);
+#define ndelay_off abrt_ndelay_off
int ndelay_off(int fd);
+#define close_on_exec_on abrt_close_on_exec_on
int close_on_exec_on(int fd);
-void* xcalloc(size_t nmemb, size_t size);
+#define xmalloc abrt_xmalloc
void* xmalloc(size_t size);
+#define xrealloc abrt_xrealloc
void* xrealloc(void *ptr, size_t size);
+#define xzalloc abrt_xzalloc
void* xzalloc(size_t size);
+#define xstrdup abrt_xstrdup
char* xstrdup(const char *s);
+#define xstrndup abrt_xstrndup
char* xstrndup(const char *s, int n);
+#define xpipe abrt_xpipe
void xpipe(int filedes[2]);
+#define xdup abrt_xdup
void xdup(int from);
+#define xdup2 abrt_xdup2
void xdup2(int from, int to);
+#define xmove_fd abrt_xmove_fd
void xmove_fd(int from, int to);
+#define xwrite abrt_xwrite
void xwrite(int fd, const void *buf, size_t count);
+#define xwrite_str abrt_xwrite_str
void xwrite_str(int fd, const char *str);
+#define xlseek abrt_xlseek
off_t xlseek(int fd, off_t offset, int whence);
+#define xchdir abrt_xchdir
void xchdir(const char *path);
+#define xvasprintf abrt_xvasprintf
char* xvasprintf(const char *format, va_list p);
+#define xasprintf abrt_xasprintf
char* xasprintf(const char *format, ...);
+#define xsetenv abrt_xsetenv
void xsetenv(const char *key, const char *value);
+#define xsocket abrt_xsocket
int xsocket(int domain, int type, int protocol);
+#define xbind abrt_xbind
void xbind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
+#define xlisten abrt_xlisten
void xlisten(int s, int backlog);
+#define xsendto abrt_xsendto
ssize_t xsendto(int s, const void *buf, size_t len,
const struct sockaddr *to, socklen_t tolen);
+#define xstat abrt_xstat
void xstat(const char *name, struct stat *stat_buf);
+#define xopen3 abrt_xopen3
int xopen3(const char *pathname, int flags, int mode);
+#define xopen abrt_xopen
int xopen(const char *pathname, int flags);
+#define xunlink abrt_xunlink
void xunlink(const char *pathname);
/* Just testing dent->d_type == DT_REG is wrong: some filesystems
@@ -74,18 +100,28 @@ void xunlink(const char *pathname);
* This function handles this case. Note: it returns 0 on symlinks
* even if they point to regular files.
*/
+#define is_regular_file abrt_is_regular_file
int is_regular_file(struct dirent *dent, const char *dirname);
+
+#define dot_or_dotdot abrt_dot_or_dotdot
bool dot_or_dotdot(const char *filename);
+#define last_char_is abrt_last_char_is
char *last_char_is(const char *s, int c);
+#define string_to_bool abrt_string_to_bool
bool string_to_bool(const char *s);
+#define xseteuid abrt_xseteuid
void xseteuid(uid_t euid);
+#define xsetegid abrt_xsetegid
void xsetegid(gid_t egid);
+#define xsetreuid abrt_xsetreuid
void xsetreuid(uid_t ruid, uid_t euid);
+#define xsetregid abrt_xsetregid
void xsetregid(gid_t rgid, gid_t egid);
/* Returns getpwuid(uid)->pw_dir or NULL */
+#define get_home_dir abrt_get_home_dir
const char *get_home_dir(uid_t uid);
#ifdef __cplusplus
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
index ad2d2025..bad3e63a 100644
--- a/src/lib/Makefile.am
+++ b/src/lib/Makefile.am
@@ -1,69 +1,69 @@
-# libabrt - the stuff shared among most of abrt (like xmalloc, logging)
-# libabrt_daemon - only daemon related things are here
+# libreport - the stuff shared among most of abrt (like xmalloc, logging)
# libabrt_dbus - daemon, cli and applet use this
# libabrt_web - for abrt-action-foo where foo deals with network/web/ftp/...
lib_LTLIBRARIES = \
- libabrt.la \
- libabrt_daemon.la \
+ libreport.la \
libabrt_dbus.la \
libabrt_web.la
-HEADER_DIR = $(srcdir)/../include
-AM_CPPFLAGS = -I$(HEADER_DIR)
-
# Not used just yet:
# time.cpp
# xconnect.cpp
-libabrt_la_SOURCES = \
+libreport_la_SOURCES = \
xfuncs.c \
encbase64.c \
+ binhex.c \
stdio_helpers.c \
hash_md5.c hash_md5.h \
hash_sha1.c hash_sha1.h \
read_write.c read_write.h \
logging.c logging.h \
copyfd.c \
+ copy_file_recursive.c \
concat_path_file.c \
append_to_malloced_string.c \
overlapping_strcpy.c \
skip_whitespace.c \
- stringops.cpp \
+ glib_support.c \
+ iso_date_string.c \
strbuf.c strbuf.h \
- xatonum.c numtoa.cpp \
+ xatonum.c \
spawn.c \
dirsize.c \
dump_dir.c \
get_cmdline.c \
daemon_is_ok.c \
- load_plugin_settings.cpp \
- make_descr.cpp \
+ load_plugin_settings.c \
+ make_descr.c \
run_event.c \
- crash_dump.cpp \
- ABRTException.cpp \
+ crash_data.c \
+ create_dump_dir.c \
+ abrt_types.c \
hooklib.c hooklib.h \
- parse_release.cpp \
- parse_options.c parse_options.h
-libabrt_la_CPPFLAGS = \
+ parse_release.c \
+ parse_options.c parse_options.h \
+ steal_directory.c
+libreport_la_CPPFLAGS = \
-Wall -Werror \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \
-DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
+ -DLOCALSTATEDIR='"$(localstatedir)"' \
-DCONF_DIR=\"$(CONF_DIR)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
$(GLIB_CFLAGS) \
-D_GNU_SOURCE
-libabrt_la_LDFLAGS = \
+libreport_la_LDFLAGS = \
-version-info 0:1:0
-libabrt_la_LIBADD = \
+libreport_la_LIBADD = \
$(GLIB_LIBS)
libabrt_dbus_la_SOURCES = \
abrt_dbus.c abrt_dbus.h
libabrt_dbus_la_CPPFLAGS = \
- -Wall -Werror \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \
-DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
@@ -71,6 +71,7 @@ libabrt_dbus_la_CPPFLAGS = \
-DVAR_RUN=\"$(VAR_RUN)\" \
$(GLIB_CFLAGS) \
$(DBUS_CFLAGS) \
+ -Wall -Werror \
-D_GNU_SOURCE
libabrt_dbus_la_LDFLAGS = \
-version-info 0:1:0
@@ -78,34 +79,18 @@ libabrt_dbus_la_LIBADD = \
$(GLIB_LIBS) \
$(DBUS_LIBS)
-libabrt_daemon_la_SOURCES = \
- $(HEADER_DIR)/comm_layer_inner.h CommLayerInner.cpp \
- $(HEADER_DIR)/plugin.h Plugin.cpp
-libabrt_daemon_la_CPPFLAGS = \
- -Wall \
- -I$(srcdir)/../include \
- -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \
- -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
- -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
- -DCONF_DIR=\"$(CONF_DIR)\" \
- -DVAR_RUN=\"$(VAR_RUN)\" \
- -D_GNU_SOURCE
-libabrt_daemon_la_LDFLAGS = \
- -version-info 0:1:0
-libabrt_daemon_la_LIBADD = \
- -ldl
-
libabrt_web_la_SOURCES = \
abrt_curl.h abrt_curl.c \
abrt_xmlrpc.h abrt_xmlrpc.cpp
libabrt_web_la_CPPFLAGS = \
-Wall -Werror \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \
-DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
-DCONF_DIR=\"$(CONF_DIR)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
+ $(GLIB_CFLAGS) \
$(CURL_CFLAGS) \
$(LIBXML_CFLAGS) \
$(XMLRPC_CFLAGS) $(XMLRPC_CLIENT_CFLAGS) \
@@ -113,6 +98,7 @@ libabrt_web_la_CPPFLAGS = \
libabrt_web_la_LDFLAGS = \
-version-info 0:1:0
libabrt_web_la_LIBADD = \
+ $(GLIB_LIBS) \
$(CURL_LIBS) \
$(LIBXML_LIBS) \
$(XMLRPC_LIBS) $(XMLRPC_CLIENT_LIBS)
diff --git a/src/lib/Plugin.cpp b/src/lib/Plugin.cpp
deleted file mode 100644
index 0c2137f5..00000000
--- a/src/lib/Plugin.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com)
- Copyright (C) 2009 RedHat inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#include "plugin.h"
-#include "abrtlib.h"
-
-CPlugin::CPlugin() {}
-
-/* class CPlugin's virtuals */
-CPlugin::~CPlugin() {}
-void CPlugin::Init() {}
-void CPlugin::DeInit() {}
-void CPlugin::SetSettings(const map_plugin_settings_t& pSettings)
-{
- m_pSettings = pSettings;
- VERB3
- {
- log("SetSettings:");
- map_plugin_settings_t::const_iterator it = m_pSettings.begin();
- while (it != m_pSettings.end())
- {
- log(" settings[%s]='%s'", it->first.c_str(), it->second.c_str());
- it++;
- }
- }
-}
diff --git a/src/lib/abrt_curl.c b/src/lib/abrt_curl.c
index f23d3949..a17f14d2 100644
--- a/src/lib/abrt_curl.c
+++ b/src/lib/abrt_curl.c
@@ -287,8 +287,10 @@ abrt_post(abrt_post_state_t *state,
// truncates data_size on 32-bit arch. Need xcurl_easy_setopt_long_long()?
// Also, I'm not sure CURLOPT_POSTFIELDSIZE_LARGE special-cases -1.
}
- // Override "Content-Type:"
+
struct curl_slist *httpheader_list = NULL;
+
+ // Override "Content-Type:"
if (data_size != ABRT_POST_DATA_FROMFILE_AS_FORM_DATA)
{
char *content_type_header = xasprintf("Content-Type: %s", content_type);
@@ -300,6 +302,12 @@ abrt_post(abrt_post_state_t *state,
xcurl_easy_setopt_ptr(handle, CURLOPT_HTTPHEADER, httpheader_list);
}
+ // Override "Accept: text/plain": helps convince server to send plain-text
+ // error messages in the body of HTTP error responses [not verified to work]
+ httpheader_list = curl_slist_append(httpheader_list, "Accept: text/plain");
+ if (!httpheader_list)
+ error_msg_and_die("out of memory");
+
// Disabled: was observed to also handle "305 Use proxy" redirect,
// apparently with POST->GET remapping - which server didn't like at all.
// Attempted to suppress remapping on 305 using CURLOPT_POSTREDIR of -1,
@@ -354,6 +362,11 @@ abrt_post(abrt_post_state_t *state,
goto ret;
}
+ // curl-7.20.1 doesn't do it, we get NULL body in the log message below
+ // unless we fflush the body memstream ourself
+ if (body_stream)
+ fflush(body_stream);
+
// Headers/body are already saved (if requested), extract more info
curl_err = curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &response_code);
die_if_curl_error(curl_err);
diff --git a/src/lib/abrt_dbus.c b/src/lib/abrt_dbus.c
index 6bc155e3..5d8d861d 100644
--- a/src/lib/abrt_dbus.c
+++ b/src/lib/abrt_dbus.c
@@ -17,7 +17,6 @@
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <dbus/dbus.h>
-#include <glib.h>
#include "abrtlib.h"
#include "abrt_dbus.h"
@@ -156,6 +155,98 @@ void store_string(DBusMessageIter* iter, const char* val)
free((char*)sanitized);
}
+/* Helper for storing map_string */
+void store_map_string(DBusMessageIter* dbus_iter, map_string_h *val)
+{
+ DBusMessageIter sub_iter;
+ /* map_string is a map. map in dbus is an array of two element structs "({...})":
+ * "s" (string) for key and "s" for value (in this case, also string) */
+ if (!dbus_message_iter_open_container(dbus_iter, DBUS_TYPE_ARRAY, "{ss}", &sub_iter))
+ die_out_of_memory();
+
+ GHashTableIter iter;
+ char *name;
+ char *value;
+ g_hash_table_iter_init(&iter, val);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
+ {
+ DBusMessageIter sub_sub_iter;
+ if (!dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_DICT_ENTRY, NULL, &sub_sub_iter))
+ die_out_of_memory();
+ store_string(&sub_sub_iter, name);
+ store_string(&sub_sub_iter, value);
+ if (!dbus_message_iter_close_container(&sub_iter, &sub_sub_iter))
+ die_out_of_memory();
+ }
+
+ if (!dbus_message_iter_close_container(dbus_iter, &sub_iter))
+ die_out_of_memory();
+}
+
+/* Helpers for storing crash_data */
+
+static void store_crash_item(DBusMessageIter* iter, struct crash_item *val)
+{
+ DBusMessageIter sub_iter;
+ if (!dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, "s", &sub_iter))
+ die_out_of_memory();
+
+ /* Compat with python/cli:
+ * Crash item is represented in dbus as 3-element vector of strings:
+ * type, editable, content.
+ * This doesn't match daemon-side representation: { content, flags } struct
+ */
+ store_string(&sub_iter, (val->flags & CD_FLAG_BIN ? "b" : "t"));
+ store_string(&sub_iter, (val->flags & CD_FLAG_ISEDITABLE ? "y" : "n"));
+ store_string(&sub_iter, val->content);
+
+ if (!dbus_message_iter_close_container(iter, &sub_iter))
+ die_out_of_memory();
+}
+void store_crash_data(DBusMessageIter* dbus_iter, crash_data_t *val)
+{
+ DBusMessageIter sub_iter;
+ /* crash_data is a map. map in dbus is an array of two element structs "({...})":
+ * "s" (string) for key and "as" for value (in this case, array of strings) */
+ if (!dbus_message_iter_open_container(dbus_iter, DBUS_TYPE_ARRAY, "{sas}", &sub_iter))
+ die_out_of_memory();
+
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, val);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
+ {
+ DBusMessageIter sub_sub_iter;
+ if (!dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_DICT_ENTRY, NULL, &sub_sub_iter))
+ die_out_of_memory();
+ store_string(&sub_sub_iter, name);
+ store_crash_item(&sub_sub_iter, value);
+ if (!dbus_message_iter_close_container(&sub_iter, &sub_sub_iter))
+ die_out_of_memory();
+ }
+
+ if (!dbus_message_iter_close_container(dbus_iter, &sub_iter))
+ die_out_of_memory();
+}
+void store_vector_of_crash_data(DBusMessageIter* iter, vector_of_crash_data_t *val)
+{
+ DBusMessageIter sub_iter;
+ /* "array of maps". map in dbus is an array ("a") of two element structs "({...})":
+ * "s" (string) for key and "as" for value (in this case, array of strings) */
+ if (!dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, "a{sas}", &sub_iter))
+ die_out_of_memory();
+
+ for (unsigned i = 0; i < val->len; i++)
+ {
+ crash_data_t *crash_data = get_crash_data(val, i);
+ store_crash_data(&sub_iter, crash_data);
+ }
+
+ if (!dbus_message_iter_close_container(iter, &sub_iter))
+ die_out_of_memory();
+}
+
/*
* Helpers for parsing DBus messages
@@ -217,6 +308,8 @@ int load_uint64(DBusMessageIter* iter, uint64_t *val)
}
int load_charp(DBusMessageIter* iter, const char** val)
{
+ *val = NULL;
+
int type = dbus_message_iter_get_arg_type(iter);
if (type != DBUS_TYPE_STRING)
{
@@ -228,6 +321,157 @@ int load_charp(DBusMessageIter* iter, const char** val)
return dbus_message_iter_next(iter);
}
+/* Helpers for loading crash_data */
+
+static int load_crash_item(DBusMessageIter* iter, struct crash_item *item)
+{
+ int type = dbus_message_iter_get_arg_type(iter);
+ if (type != DBUS_TYPE_ARRAY)
+ {
+ error_msg("array expected in dbus message, but not found ('%c')", type);
+ return -1;
+ }
+
+ /* Compat with python/cli:
+ * Crash item is represented in dbus as 3-element vector of strings:
+ * type, editable, content.
+ * This doesn't match daemon-side representation: { content, flags } struct
+ */
+
+ DBusMessageIter sub_iter;
+ dbus_message_iter_recurse(iter, &sub_iter);
+
+ const char *typestr;
+ int r = load_charp(&sub_iter, &typestr);
+ if (r != ABRT_DBUS_MORE_FIELDS)
+ {
+ error_msg("malformed crash_item element in dbus message");
+ return -1;
+ }
+ const char *editable;
+ r = load_charp(&sub_iter, &editable);
+ if (r != ABRT_DBUS_MORE_FIELDS)
+ {
+ error_msg("malformed crash_item element in dbus message");
+ return -1;
+ }
+ const char *content;
+ r = load_charp(&sub_iter, &content);
+ if (r != ABRT_DBUS_LAST_FIELD)
+ {
+ error_msg("malformed crash_item element in dbus message");
+ return -1;
+ }
+ item->flags = 0;
+ if (typestr[0] == 'b') item->flags |= CD_FLAG_BIN;
+ if (typestr[0] == 't') item->flags |= CD_FLAG_TXT;
+ if (editable[0] == 'y') item->flags |= CD_FLAG_ISEDITABLE;
+ if (editable[0] == 'n') item->flags |= CD_FLAG_ISNOTEDITABLE;
+ item->content = xstrdup(content);
+ return 0;
+}
+int load_crash_data(DBusMessageIter* iter, crash_data_t **val)
+{
+ *val = NULL;
+
+ int type = dbus_message_iter_get_arg_type(iter);
+ if (type != DBUS_TYPE_ARRAY)
+ {
+ error_msg("array expected in dbus message, but not found ('%c')", type);
+ return -1;
+ }
+
+ crash_data_t *result = new_crash_data();
+
+ DBusMessageIter sub_iter;
+ dbus_message_iter_recurse(iter, &sub_iter);
+
+ bool next_exists;
+ int r;
+//int cnt = 0;
+ do {
+ type = dbus_message_iter_get_arg_type(&sub_iter);
+ if (type != DBUS_TYPE_DICT_ENTRY)
+ {
+ /* When the map has 0 elements, we see DBUS_TYPE_INVALID (on the first iteration) */
+ if (type == DBUS_TYPE_INVALID)
+ break;
+ error_msg("sub_iter type is not DBUS_TYPE_DICT_ENTRY (%c)!", type);
+ free_crash_data(result);
+ return -1;
+ }
+
+ DBusMessageIter sub_sub_iter;
+ dbus_message_iter_recurse(&sub_iter, &sub_sub_iter);
+
+ const char *key;
+ r = load_charp(&sub_sub_iter, &key);
+ if (r != ABRT_DBUS_MORE_FIELDS)
+ {
+ if (r == ABRT_DBUS_LAST_FIELD)
+ error_msg("malformed map element in dbus message");
+ free_crash_data(result);
+ return -1;
+ }
+ struct crash_item *value = xzalloc(sizeof(*value));
+ r = load_crash_item(&sub_sub_iter, value);
+ if (r != ABRT_DBUS_LAST_FIELD)
+ {
+ if (r == ABRT_DBUS_MORE_FIELDS)
+ error_msg("malformed map element in dbus message");
+ free(value);
+ free_crash_data(result);
+ return -1;
+ }
+ g_hash_table_replace(result, xstrdup(key), value);
+//cnt++;
+ next_exists = dbus_message_iter_next(&sub_iter);
+ } while (next_exists);
+//log("%s: %d elems", __func__, cnt);
+
+ *val = result;
+ return dbus_message_iter_next(iter); /* note: this can't fail (returns bool, thus never < 0) */
+}
+int load_vector_of_crash_data(DBusMessageIter* iter, vector_of_crash_data_t **val)
+{
+ *val = NULL;
+
+ int type = dbus_message_iter_get_arg_type(iter);
+ if (type != DBUS_TYPE_ARRAY)
+ {
+ error_msg("array expected in dbus message, but not found ('%c')", type);
+ return -1;
+ }
+
+ DBusMessageIter sub_iter;
+ dbus_message_iter_recurse(iter, &sub_iter);
+
+ vector_of_crash_data_t *result = new_vector_of_crash_data();
+
+ int r;
+//int cnt = 0;
+ /* When the vector has 0 elements, we see DBUS_TYPE_INVALID here */
+ type = dbus_message_iter_get_arg_type(&sub_iter);
+ if (type != DBUS_TYPE_INVALID)
+ {
+ do {
+ crash_data_t *cd = NULL;
+//cnt++;
+ r = load_crash_data(&sub_iter, &cd);
+ if (r < 0)
+ {
+ free_vector_of_crash_data(result);
+ return r;
+ }
+ g_ptr_array_add(result, cd);
+ } while (r == ABRT_DBUS_MORE_FIELDS);
+ }
+//log("%s: %d elems", __func__, cnt);
+
+ *val = result;
+ return dbus_message_iter_next(iter); /* note: this can't fail (returns bool, thus never < 0) */
+}
+
/*
* Glib integration machinery
@@ -353,8 +597,29 @@ static void unregister_vtable(DBusConnection *conn, void* data)
VERB3 log("%s()", __func__);
}
+
/*
- * Initialization works as follows:
+ * Simple logging handler for dbus errors.
+ */
+int log_dbus_error(const char *msg, DBusError *err)
+{
+ int ret = 0;
+ if (dbus_error_is_set(err))
+ {
+ error_msg("dbus error: %s", err->message);
+ ret = 1;
+ }
+ if (msg)
+ {
+ error_msg(msg);
+ ret = 1;
+ }
+ return ret;
+}
+
+
+/*
+ * Initialization. Works as follows:
*
* we have a DBusConnection* (say, obtained with dbus_bus_get)
* we call dbus_connection_set_watch_functions
@@ -428,3 +693,172 @@ void attach_dbus_conn_to_glib_main_loop(DBusConnection* conn,
}
}
}
+
+
+/*
+ * Support functions for clients
+ */
+
+/* helpers */
+static DBusMessage* new_call_msg(const char* method)
+{
+ DBusMessage* msg = dbus_message_new_method_call(ABRTD_DBUS_NAME, ABRTD_DBUS_PATH, ABRTD_DBUS_IFACE, method);
+ if (!msg)
+ die_out_of_memory();
+ return msg;
+}
+
+static DBusMessage* send_get_reply_and_unref(DBusMessage* msg)
+{
+ dbus_uint32_t serial;
+ if (TRUE != dbus_connection_send(g_dbus_conn, msg, &serial))
+ error_msg_and_die("Error sending DBus message");
+ dbus_message_unref(msg);
+
+ while (true)
+ {
+ DBusMessage *received = dbus_connection_pop_message(g_dbus_conn);
+ if (!received)
+ {
+ if (FALSE == dbus_connection_read_write(g_dbus_conn, -1))
+ error_msg_and_die("dbus connection closed");
+ continue;
+ }
+
+ int tp = dbus_message_get_type(received);
+ const char *error_str = dbus_message_get_error_name(received);
+#if 0
+ /* Debugging */
+ printf("type:%u (CALL:%u, RETURN:%u, ERROR:%u, SIGNAL:%u)\n", tp,
+ DBUS_MESSAGE_TYPE_METHOD_CALL,
+ DBUS_MESSAGE_TYPE_METHOD_RETURN,
+ DBUS_MESSAGE_TYPE_ERROR,
+ DBUS_MESSAGE_TYPE_SIGNAL
+ );
+ const char *sender = dbus_message_get_sender(received);
+ if (sender)
+ printf("sender: %s\n", sender);
+ const char *path = dbus_message_get_path(received);
+ if (path)
+ printf("path: %s\n", path);
+ const char *member = dbus_message_get_member(received);
+ if (member)
+ printf("member: %s\n", member);
+ const char *interface = dbus_message_get_interface(received);
+ if (interface)
+ printf("interface: %s\n", interface);
+ const char *destination = dbus_message_get_destination(received);
+ if (destination)
+ printf("destination: %s\n", destination);
+ if (error_str)
+ printf("error: '%s'\n", error_str);
+#endif
+
+ DBusError err;
+ dbus_error_init(&err);
+
+ if (dbus_message_is_signal(received, ABRTD_DBUS_IFACE, "Update"))
+ {
+ const char *update_msg;
+ if (!dbus_message_get_args(received, &err,
+ DBUS_TYPE_STRING, &update_msg,
+ DBUS_TYPE_INVALID))
+ {
+ error_msg_and_die("dbus Update message: arguments mismatch");
+ }
+ printf(">> %s\n", update_msg);
+ }
+ else if (dbus_message_is_signal(received, ABRTD_DBUS_IFACE, "Warning"))
+ {
+ const char *warning_msg;
+ if (!dbus_message_get_args(received, &err,
+ DBUS_TYPE_STRING, &warning_msg,
+ DBUS_TYPE_INVALID))
+ {
+ error_msg_and_die("dbus Warning message: arguments mismatch");
+ }
+ log(">! %s\n", warning_msg);
+ }
+ else
+ if (tp == DBUS_MESSAGE_TYPE_METHOD_RETURN
+ && dbus_message_get_reply_serial(received) == serial
+ ) {
+ return received;
+ }
+ else
+ if (tp == DBUS_MESSAGE_TYPE_ERROR
+ && dbus_message_get_reply_serial(received) == serial
+ ) {
+ error_msg_and_die("dbus call returned error: '%s'", error_str);
+ }
+
+ dbus_message_unref(received);
+ }
+}
+
+int32_t call_DeleteDebugDump(const char *dump_dir_name)
+{
+ DBusMessage* msg = new_call_msg(__func__ + 5);
+ dbus_message_append_args(msg,
+ DBUS_TYPE_STRING, &dump_dir_name,
+ DBUS_TYPE_INVALID);
+
+ DBusMessage *reply = send_get_reply_and_unref(msg);
+
+ DBusMessageIter in_iter;
+ dbus_message_iter_init(reply, &in_iter);
+
+ int32_t result;
+ int r = load_int32(&in_iter, &result);
+ if (r != ABRT_DBUS_LAST_FIELD) /* more values present, or bad type */
+ error_msg_and_die("dbus call %s: return type mismatch", __func__ + 5);
+
+ dbus_message_unref(reply);
+ return result;
+}
+
+static int connect_to_abrtd_and_call_DeleteDebugDump(const char *dump_dir_name)
+{
+ DBusError err;
+ dbus_error_init(&err);
+ g_dbus_conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
+ if (log_dbus_error(
+ g_dbus_conn ? NULL :
+ "error requesting system DBus, possible reasons: "
+ "dbus config is incorrect; dbus-daemon is not running, "
+ "or dbus daemon needs to be restarted to reload dbus config",
+ &err
+ )
+ ) {
+ if (g_dbus_conn)
+ dbus_connection_unref(g_dbus_conn);
+ g_dbus_conn = NULL;
+ return 1;
+ }
+
+ int ret = call_DeleteDebugDump(dump_dir_name);
+ if (ret == ENOENT)
+ error_msg("Dump directory '%s' is not found", dump_dir_name);
+ else if (ret != 0)
+ error_msg("Can't delete dump directory '%s'", dump_dir_name);
+
+ dbus_connection_unref(g_dbus_conn);
+ g_dbus_conn = NULL;
+
+ return ret;
+}
+
+int delete_dump_dir_possibly_using_abrtd(const char *dump_dir_name)
+{
+ /* Try to delete it ourselves */
+ struct dump_dir *dd = dd_opendir(dump_dir_name, DD_OPEN_READONLY);
+ if (dd)
+ {
+ if (dd->locked) /* it is not readonly */
+ return dd_delete(dd);
+ dd_close(dd);
+ }
+
+ VERB1 log("Deleting '%s' via abrtd dbus call", dump_dir_name);
+ return connect_to_abrtd_and_call_DeleteDebugDump(dump_dir_name);
+}
diff --git a/src/lib/abrt_dbus.h b/src/lib/abrt_dbus.h
index cdc963ca..8f559980 100644
--- a/src/lib/abrt_dbus.h
+++ b/src/lib/abrt_dbus.h
@@ -23,6 +23,11 @@
#include "abrtlib.h"
+#define ABRTD_DBUS_NAME "com.redhat.abrt"
+#define ABRTD_DBUS_PATH "/com/redhat/abrt"
+#define ABRTD_DBUS_IFACE "com.redhat.abrt"
+
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -53,6 +58,7 @@ extern DBusConnection* g_dbus_conn;
* // (note: "iface.sig.emitted.from" is not optional for signals!)
* dbus_message_set_destination(msg, "peer"); // optional
* dbus_connection_send(conn, msg, &serial); // &serial can be NULL
+ * dbus_connection_unref(conn); // if you don't want to *stay* connected
*
* - client which receives and processes signals:
* conn = dbus_bus_get(DBUS_BUS_SYSTEM/SESSION, &err);
@@ -73,6 +79,19 @@ void attach_dbus_conn_to_glib_main_loop(DBusConnection* conn,
DBusHandlerResult (*message_received_func)(DBusConnection *conn, DBusMessage *msg, void* data)
);
+/* Log dbus error if err has it set. Then log msg if it's !NULL.
+ * In both cases return 1. Otherwise return 0.
+ */
+int log_dbus_error(const char *msg, DBusError *err);
+
+/* Perform "DeleteDebugDump" call over g_dbus_conn */
+int32_t call_DeleteDebugDump(const char *dump_dir_name);
+
+/* Connect to system bus, find abrtd, perform "DeleteDebugDump" call, close g_dbus_conn */
+/* now static: int connect_to_abrtd_and_call_DeleteDebugDump(const char *dump_dir_name); */
+int delete_dump_dir_possibly_using_abrtd(const char *dump_dir_name);
+
+
/*
* Helpers for building DBus messages
*/
@@ -82,6 +101,9 @@ void store_uint32(DBusMessageIter* iter, uint32_t val);
void store_int64(DBusMessageIter* iter, int64_t val);
void store_uint64(DBusMessageIter* iter, uint64_t val);
void store_string(DBusMessageIter* iter, const char* val);
+void store_crash_data(DBusMessageIter* iter, crash_data_t *val);
+void store_vector_of_crash_data(DBusMessageIter* iter, vector_of_crash_data_t *val);
+void store_map_string(DBusMessageIter* iter, map_string_h *val);
/*
* Helpers for parsing DBus messages
@@ -103,13 +125,18 @@ int load_uint32(DBusMessageIter* iter, uint32_t *val);
int load_int64(DBusMessageIter* iter, int64_t *val);
int load_uint64(DBusMessageIter* iter, uint64_t *val);
int load_charp(DBusMessageIter* iter, const char **val);
+int load_crash_data(DBusMessageIter* iter, crash_data_t **val);
+int load_vector_of_crash_data(DBusMessageIter* iter, vector_of_crash_data_t **val);
#ifdef __cplusplus
}
#endif
-/* C++ style stuff */
+/*
+ * C++ style stuff
+ */
+
#ifdef __cplusplus
#include <map>
@@ -119,6 +146,20 @@ int load_charp(DBusMessageIter* iter, const char **val);
* Helpers for building DBus messages
*/
+static inline std::string ssprintf(const char *format, ...)
+{
+ va_list p;
+ char *string_ptr;
+
+ va_start(p, format);
+ string_ptr = xvasprintf(format, p);
+ va_end(p);
+
+ std::string res = string_ptr;
+ free(string_ptr);
+ return res;
+}
+
//static inline void store_val(DBusMessageIter* iter, bool val) { store_bool(iter, val); }
static inline void store_val(DBusMessageIter* iter, int32_t val) { store_int32(iter, val); }
static inline void store_val(DBusMessageIter* iter, uint32_t val) { store_uint32(iter, val); }
@@ -147,7 +188,7 @@ struct abrt_dbus_type< std::map<K,V> > {
static std::string sig() { return ssprintf("a{%s%s}", ABRT_DBUS_SIG(K), ABRT_DBUS_SIG(V)); }
};
-template<typename E>
+template <typename E>
static void store_vector(DBusMessageIter* iter, const std::vector<E>& val)
{
DBusMessageIter sub_iter;
@@ -170,7 +211,7 @@ static void store_vector(DBus::MessageIter &iter, const std::vector<uint8_t>& va
if we use such vector, MUST add specialized code here (see in dbus-c++ source)
}
*/
-template<typename K, typename V>
+template <typename K, typename V>
static void store_map(DBusMessageIter* iter, const std::map<K,V>& val)
{
DBusMessageIter sub_iter;
@@ -195,9 +236,9 @@ static void store_map(DBusMessageIter* iter, const std::map<K,V>& val)
die_out_of_memory();
}
-template<typename E>
+template <typename E>
static inline void store_val(DBusMessageIter* iter, const std::vector<E>& val) { store_vector(iter, val); }
-template<typename K, typename V>
+template <typename K, typename V>
static inline void store_val(DBusMessageIter* iter, const std::map<K,V>& val) { store_map(iter, val); }
@@ -220,7 +261,7 @@ static inline int load_val(DBusMessageIter* iter, std::string& val)
}
/* Templates for vector and map */
-template<typename E>
+template <typename E>
static int load_vector(DBusMessageIter* iter, std::vector<E>& val)
{
int type = dbus_message_iter_get_arg_type(iter);
@@ -259,7 +300,7 @@ static int load_vector(DBusMessageIter* iter, std::vector<uint8_t>& val)
if we use such vector, MUST add specialized code here (see in dbus-c++ source)
}
*/
-template<typename K, typename V>
+template <typename K, typename V>
static int load_map(DBusMessageIter* iter, std::map<K,V>& val)
{
int type = dbus_message_iter_get_arg_type(iter);
@@ -314,9 +355,9 @@ static int load_map(DBusMessageIter* iter, std::map<K,V>& val)
return dbus_message_iter_next(iter);
}
-template<typename E>
+template <typename E>
static inline int load_val(DBusMessageIter* iter, std::vector<E>& val) { return load_vector(iter, val); }
-template<typename K, typename V>
+template <typename K, typename V>
static inline int load_val(DBusMessageIter* iter, std::map<K,V>& val) { return load_map(iter, val); }
#endif /* __cplusplus */
diff --git a/src/lib/ABRTException.cpp b/src/lib/abrt_types.c
index 0ae5d452..42100075 100644
--- a/src/lib/ABRTException.cpp
+++ b/src/lib/abrt_types.c
@@ -1,6 +1,6 @@
/*
- Copyright (C) 2010 ABRT team
- Copyright (C) 2010 RedHat Inc
+ Copyright (C) 2010 ABRT Team
+ Copyright (C) 2010 RedHat inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -16,18 +16,22 @@
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#include "abrt_exception.h"
+#include "abrtlib.h"
-CABRTException::CABRTException(abrt_exception_t type, const char* fmt, ...)
+map_string_h *new_map_string(void)
{
- m_type = type;
- va_list ap;
- va_start(ap, fmt);
- m_what = xvasprintf(fmt, ap);
- va_end(ap);
+ return g_hash_table_new_full(g_str_hash, g_str_equal, free, free);
}
-CABRTException::CABRTException(const CABRTException& rhs):
- m_type(rhs.m_type),
- m_what(xstrdup(rhs.m_what))
-{}
+void free_map_string(map_string_h *ms)
+{
+ if (ms)
+ g_hash_table_destroy(ms);
+}
+
+const char *get_map_string_item_or_empty(map_string_h *ms, const char *key)
+{
+ const char *v = (const char*)g_hash_table_lookup(ms, key);
+ if (!v) v = "";
+ return v;
+}
diff --git a/src/lib/abrt_xmlrpc.cpp b/src/lib/abrt_xmlrpc.cpp
index bf74f05b..e2b8674c 100644
--- a/src/lib/abrt_xmlrpc.cpp
+++ b/src/lib/abrt_xmlrpc.cpp
@@ -18,15 +18,10 @@
*/
#include "abrtlib.h"
#include "abrt_xmlrpc.h"
-#include "abrt_exception.h"
void throw_xml_fault(xmlrpc_env *env)
{
- std::string errmsg = ssprintf("XML-RPC Fault(%d): %s", env->fault_code, env->fault_string);
- xmlrpc_env_clean(env); // this is needed ONLY if fault_occurred
- xmlrpc_env_init(env); // just in case user catches ex and _continues_ to use env
- error_msg("%s", errmsg.c_str()); // show error in daemon log
- throw CABRTException(EXCEP_PLUGIN, errmsg.c_str());
+ error_msg_and_die("XML-RPC Fault(%d): %s", env->fault_code, env->fault_string);
}
void throw_if_xml_fault_occurred(xmlrpc_env *env)
@@ -49,6 +44,17 @@ void abrt_xmlrpc_conn::new_xmlrpc_client(const char* url, bool ssl_verify)
* We do it in abrtd's main */
/* xmlrpc_client_setup_global_const(&env); */
+ /* URL - bugzilla.redhat.com/show_bug.cgi?id=666893 Unable to make sense of
+ * XML-RPC response from server
+ *
+ * By default, XML data from the network may be no larger than 512K.
+ * XMLRPC_XML_SIZE_LIMIT_DEFAULT is #defined to (512*1024) in xmlrpc-c/base.h
+ *
+ * Users reported trouble with 733402 byte long responses, hope raising the
+ * limit to 2*512k is enough
+ */
+ xmlrpc_limit_set(XMLRPC_XML_SIZE_LIMIT_ID, 2 * XMLRPC_XML_SIZE_LIMIT_DEFAULT);
+
struct xmlrpc_curl_xportparms curlParms;
memset(&curlParms, 0, sizeof(curlParms));
/* curlParms.network_interface = NULL; - done by memset */
diff --git a/src/lib/abrt_xmlrpc.h b/src/lib/abrt_xmlrpc.h
index ad1a87d3..93c5a9d6 100644
--- a/src/lib/abrt_xmlrpc.h
+++ b/src/lib/abrt_xmlrpc.h
@@ -23,12 +23,12 @@
#include <xmlrpc-c/base.h>
#include <xmlrpc-c/client.h>
+#ifdef __cplusplus
/*
* Simple class holding XMLRPC connection data.
* Used mainly to ensure we always destroy xmlrpc client and server_info
* on return or throw.
*/
-
struct abrt_xmlrpc_conn {
xmlrpc_client* m_pClient;
xmlrpc_server_info* m_pServer_info;
@@ -40,9 +40,19 @@ struct abrt_xmlrpc_conn {
void new_xmlrpc_client(const char* url, bool ssl_verify);
void destroy_xmlrpc_client();
};
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
/* Utility functions */
void throw_xml_fault(xmlrpc_env *env);
void throw_if_xml_fault_occurred(xmlrpc_env *env);
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/src/lib/binhex.c b/src/lib/binhex.c
new file mode 100644
index 00000000..1fcb7445
--- /dev/null
+++ b/src/lib/binhex.c
@@ -0,0 +1,74 @@
+/*
+ Copyright (C) 2010 ABRT team
+ Copyright (C) 2010 RedHat Inc
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2
+ as published by the Free Software Foundation.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+#include "abrtlib.h"
+
+static const char hexdigits_locase[] = "0123456789abcdef";
+
+/* Emit a string of hex representation of bytes */
+char *bin2hex(char *dst, const char *str, int count)
+{
+ while (count) {
+ unsigned char c = *str++;
+ /* put lowercase hex digits */
+ *dst++ = hexdigits_locase[c >> 4];
+ *dst++ = hexdigits_locase[c & 0xf];
+ count--;
+ }
+ return dst;
+}
+
+/* Convert "xxxxxxxx" hex string to binary, no more than COUNT bytes */
+char *hex2bin(char *dst, const char *str, int count)
+{
+ /* Parts commented out with // allow parsing
+ * of strings like "xx:x:x:xx:xx:xx:xxxxxx"
+ * (IPv6, ethernet addresses and the like).
+ */
+ errno = EINVAL;
+ while (*str && count) {
+ uint8_t val;
+ uint8_t c;
+
+ c = *str++;
+ if (isdigit(c))
+ val = c - '0';
+ else if ((c|0x20) >= 'a' && (c|0x20) <= 'f')
+ val = (c|0x20) - ('a' - 10);
+ else
+ return NULL;
+ val <<= 4;
+ c = *str;
+ if (isdigit(c))
+ val |= c - '0';
+ else if ((c|0x20) >= 'a' && (c|0x20) <= 'f')
+ val |= (c|0x20) - ('a' - 10);
+ //else if (c == ':' || c == '\0')
+ // val >>= 4;
+ else
+ return NULL;
+
+ *dst++ = val;
+ //if (c != '\0')
+ str++;
+ //if (*str == ':')
+ // str++;
+ count--;
+ }
+ errno = (*str ? ERANGE : 0);
+ return dst;
+}
diff --git a/src/lib/copy_file_recursive.c b/src/lib/copy_file_recursive.c
new file mode 100644
index 00000000..c3f021c7
--- /dev/null
+++ b/src/lib/copy_file_recursive.c
@@ -0,0 +1,139 @@
+/*
+ Copyright (C) 2011 ABRT team
+ Copyright (C) 2011 RedHat Inc
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "abrtlib.h"
+
+int copy_file_recursive(const char *source, const char *dest)
+{
+ /* This is a recursive function, try to minimize stack usage */
+ /* NB: each struct stat is ~100 bytes */
+ struct stat source_stat;
+ struct stat dest_stat;
+ int retval = 0;
+ int dest_exists = 0;
+
+ if (strcmp(source, ".lock") == 0)
+ goto skip;
+
+ if (stat(source, &source_stat) < 0) {
+ perror_msg("Can't stat '%s'", source);
+ return -1;
+ }
+
+ if (lstat(dest, &dest_stat) < 0) {
+ if (errno != ENOENT) {
+ perror_msg("Can't stat '%s'", dest);
+ return -1;
+ }
+ } else {
+ if (source_stat.st_dev == dest_stat.st_dev
+ && source_stat.st_ino == dest_stat.st_ino
+ ) {
+ error_msg("'%s' and '%s' are the same file", source, dest);
+ return -1;
+ }
+ dest_exists = 1;
+ }
+
+ if (S_ISDIR(source_stat.st_mode)) {
+ DIR *dp;
+ struct dirent *d;
+
+ if (dest_exists) {
+ if (!S_ISDIR(dest_stat.st_mode)) {
+ error_msg("Target '%s' is not a directory", dest);
+ return -1;
+ }
+ /* race here: user can substitute a symlink between
+ * this check and actual creation of files inside dest */
+ } else {
+ /* Create DEST */
+ mode_t mode = source_stat.st_mode;
+ /* Allow owner to access new dir (at least for now) */
+ mode |= S_IRWXU;
+ if (mkdir(dest, mode) < 0) {
+ perror_msg("Can't create directory '%s'", dest);
+ return -1;
+ }
+ }
+ /* Recursively copy files in SOURCE */
+ dp = opendir(source);
+ if (dp == NULL) {
+ retval = -1;
+ goto ret;
+ }
+
+ while (retval == 0 && (d = readdir(dp)) != NULL) {
+ char *new_source, *new_dest;
+
+ if (dot_or_dotdot(d->d_name))
+ continue;
+ new_source = concat_path_file(source, d->d_name);
+ new_dest = concat_path_file(dest, d->d_name);
+ if (copy_file_recursive(new_source, new_dest) < 0)
+ retval = -1;
+ free(new_source);
+ free(new_dest);
+ }
+ closedir(dp);
+
+ goto ret;
+ }
+
+ if (S_ISREG(source_stat.st_mode)) {
+ int src_fd;
+ int dst_fd;
+ mode_t new_mode;
+
+ src_fd = open(source, O_RDONLY);
+ if (src_fd < 0) {
+ perror_msg("Can't open '%s'", source);
+ return -1;
+ }
+
+ /* Do not try to open with weird mode fields */
+ new_mode = source_stat.st_mode;
+
+ // security problem versus (sym)link attacks
+ // dst_fd = open(dest, O_WRONLY|O_CREAT|O_TRUNC, new_mode);
+ /* safe way: */
+ dst_fd = open(dest, O_WRONLY|O_CREAT|O_EXCL, new_mode);
+ if (dst_fd < 0) {
+ close(src_fd);
+ return -1;
+ }
+
+ if (copyfd_eof(src_fd, dst_fd, COPYFD_SPARSE) == -1)
+ retval = -1;
+ close(src_fd);
+ /* Careful: do check that buffered writes succeeded... */
+ if (close(dst_fd) < 0) {
+ perror_msg("Error writing to '%s'", dest);
+ retval = -1;
+ }
+ goto ret;
+ }
+
+ /* Neither dir not regular file: skip */
+
+ skip:
+ log("Skipping '%s'", source);
+ ret:
+ return retval;
+}
diff --git a/src/lib/crash_dump.cpp b/src/lib/crash_data.c
index 338724d5..1ae8f4f1 100644
--- a/src/lib/crash_dump.cpp
+++ b/src/lib/crash_data.c
@@ -17,20 +17,77 @@
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "abrtlib.h"
-#include "abrt_crash_dump.h"
-
-const char *const must_have_files[] = {
- FILENAME_ARCHITECTURE,
- FILENAME_KERNEL ,
- FILENAME_PACKAGE ,
- FILENAME_COMPONENT ,
- FILENAME_RELEASE ,
- FILENAME_EXECUTABLE ,
- NULL
-};
+
+static void free_crash_item(void *ptr)
+{
+ if (ptr)
+ {
+ struct crash_item *item = (struct crash_item *)ptr;
+ free(item->content);
+ free(item);
+ }
+}
+
+
+/* crash_data["name"] = { "content", CD_FLAG_foo_bits } */
+
+crash_data_t *new_crash_data(void)
+{
+ return g_hash_table_new_full(g_str_hash, g_str_equal,
+ free, free_crash_item);
+}
+
+void add_to_crash_data_ext(crash_data_t *crash_data,
+ const char *name,
+ const char *content,
+ unsigned flags)
+{
+ if (!(flags & (CD_FLAG_BIN|CD_FLAG_TXT)))
+ flags |= CD_FLAG_TXT;
+ if (!(flags & (CD_FLAG_ISEDITABLE|CD_FLAG_ISNOTEDITABLE)))
+ flags |= CD_FLAG_ISNOTEDITABLE;
+
+ struct crash_item *item = (struct crash_item *)xzalloc(sizeof(*item));
+ item->content = xstrdup(content);
+ item->flags = flags;
+ g_hash_table_replace(crash_data, xstrdup(name), item);
+}
+
+void add_to_crash_data(crash_data_t *crash_data,
+ const char *name,
+ const char *content)
+{
+ add_to_crash_data_ext(crash_data, name, content, CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE);
+}
+
+const char *get_crash_item_content_or_die(crash_data_t *crash_data, const char *key)
+{
+ struct crash_item *item = get_crash_data_item_or_NULL(crash_data, key);
+ if (!item)
+ error_msg_and_die("Error accessing crash data: no ['%s']", key);
+ return item->content;
+}
+
+const char *get_crash_item_content_or_NULL(crash_data_t *crash_data, const char *key)
+{
+ struct crash_item *item = get_crash_data_item_or_NULL(crash_data, key);
+ if (!item)
+ return NULL;
+ return item->content;
+}
+
+
+/* crash_data_vector[i] = { "name" = { "content", CD_FLAG_foo_bits } } */
+
+vector_of_crash_data_t *new_vector_of_crash_data(void)
+{
+ return g_ptr_array_new_with_free_func((void (*)(void*)) &free_crash_data);
+}
+
+
+/* Miscellaneous helpers */
static const char *const editable_files[] = {
- FILENAME_DESCRIPTION,
FILENAME_COMMENT ,
FILENAME_REPRODUCE ,
FILENAME_BACKTRACE ,
@@ -52,36 +109,6 @@ bool is_editable_file(const char *file_name)
return is_editable(file_name, editable_files);
}
-
-void add_to_crash_data_ext(map_crash_data_t& pCrashData,
- const char *pItem,
- const char *pType,
- const char *pEditable,
- const char *pContent)
-{
- map_crash_data_t::iterator it = pCrashData.find(pItem);
- if (it == pCrashData.end()) {
- vector_string_t& v = pCrashData[pItem]; /* create empty vector */
- v.push_back(pType);
- v.push_back(pEditable);
- v.push_back(pContent);
- return;
- }
- vector_string_t& v = it->second;
- while (v.size() < 3)
- v.push_back("");
- v[CD_TYPE] = pType;
- v[CD_EDITABLE] = pEditable;
- v[CD_CONTENT] = pContent;
-}
-
-void add_to_crash_data(map_crash_data_t& pCrashData,
- const char *pItem,
- const char *pContent)
-{
- add_to_crash_data_ext(pCrashData, pItem, CD_TXT, CD_ISNOTEDITABLE, pContent);
-}
-
static char* is_text_file(const char *name, ssize_t *sz)
{
/* We were using magic.h API to check for file being text, but it thinks
@@ -156,7 +183,7 @@ static char* is_text_file(const char *name, ssize_t *sz)
return NULL; /* it's binary */
}
-void load_crash_data_from_crash_dump_dir(struct dump_dir *dd, map_crash_data_t& data)
+void load_crash_data_from_dump_dir(crash_data_t *crash_data, struct dump_dir *dd)
{
char *short_name;
char *full_name;
@@ -173,13 +200,11 @@ void load_crash_data_from_crash_dump_dir(struct dump_dir *dd, map_crash_data_t&
text = is_text_file(full_name, &sz);
if (!text)
{
- add_to_crash_data_ext(data,
+ add_to_crash_data_ext(crash_data,
short_name,
- CD_BIN,
- CD_ISNOTEDITABLE,
- full_name
+ full_name,
+ CD_FLAG_BIN + CD_FLAG_ISNOTEDITABLE
);
-
free(short_name);
free(full_name);
continue;
@@ -193,11 +218,10 @@ void load_crash_data_from_crash_dump_dir(struct dump_dir *dd, map_crash_data_t&
content = dd_load_text(dd, short_name);
free(text);
- add_to_crash_data_ext(data,
+ add_to_crash_data_ext(crash_data,
short_name,
- CD_TXT,
- editable ? CD_ISEDITABLE : CD_ISNOTEDITABLE,
- content
+ content,
+ (editable ? CD_FLAG_TXT + CD_FLAG_ISEDITABLE : CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE)
);
free(short_name);
free(full_name);
@@ -205,50 +229,25 @@ void load_crash_data_from_crash_dump_dir(struct dump_dir *dd, map_crash_data_t&
}
}
-static const std::string* helper_get_crash_data_item_content(const map_crash_data_t& crash_data, const char *key)
+crash_data_t *create_crash_data_from_dump_dir(struct dump_dir *dd)
{
- map_crash_data_t::const_iterator it = crash_data.find(key);
- if (it == crash_data.end()) {
- return NULL;
- }
- if (it->second.size() <= CD_CONTENT) {
- return NULL;
- }
- return &it->second[CD_CONTENT];
+ crash_data_t *crash_data = new_crash_data();
+ load_crash_data_from_dump_dir(crash_data, dd);
+ return crash_data;
}
-const std::string& get_crash_data_item_content(const map_crash_data_t& crash_data, const char *key)
+void log_crash_data(crash_data_t *crash_data, const char *pfx)
{
- const std::string* sp = helper_get_crash_data_item_content(crash_data, key);
- if (sp == NULL) {
- if (crash_data.find(key) == crash_data.end())
- error_msg_and_die("Error accessing crash data: no ['%s']", key);
- error_msg_and_die("Error accessing crash data: no ['%s'][%d]", key, CD_CONTENT);
- }
- return *sp;
-}
-
-const char *get_crash_data_item_content_or_NULL(const map_crash_data_t& crash_data, const char *key)
-{
- const std::string* sp = helper_get_crash_data_item_content(crash_data, key);
- if (!sp) {
- return NULL;
- }
- return sp->c_str();
-}
-
-void log_map_crash_data(const map_crash_data_t& data, const char *name)
-{
- map_crash_data_t::const_iterator it = data.begin();
- while (it != data.end())
- {
- ssize_t sz = it->second.size();
- log("%s[%s]:%s/%s/'%.20s'",
- name, it->first.c_str(),
- sz > 0 ? it->second[0].c_str() : "<NO [0]>",
- sz > 1 ? it->second[1].c_str() : "<NO [1]>",
- sz > 2 ? it->second[2].c_str() : "<NO [2]>"
- );
- it++;
- }
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, crash_data);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
+ {
+ log("%s[%s]:'%s' 0x%x",
+ pfx, name,
+ value->content,
+ value->flags
+ );
+ }
}
diff --git a/src/lib/create_dump_dir.c b/src/lib/create_dump_dir.c
new file mode 100644
index 00000000..cbacdab6
--- /dev/null
+++ b/src/lib/create_dump_dir.c
@@ -0,0 +1,85 @@
+/*
+ Copyright (C) 2010 ABRT team
+ Copyright (C) 2010 RedHat inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "abrtlib.h"
+
+static struct dump_dir *try_dd_create(const char *base_dir_name, const char *dir_name)
+{
+ char *path = concat_path_file(base_dir_name, dir_name);
+ struct dump_dir *dd = dd_create(path, (uid_t)-1L);
+ if (dd)
+ dd_create_basic_files(dd, (uid_t)-1L);
+ free(path);
+ return dd;
+}
+
+struct dump_dir *create_dump_dir_from_crash_data(crash_data_t *crash_data, const char *base_dir_name)
+{
+ char dir_name[sizeof("abrt-tmp-YYYY-MM-DD-HH:MM:SS-%lu") + sizeof(long)*3];
+ sprintf(dir_name, "abrt-tmp-%s-%lu", iso_date_string(NULL), (long)getpid());
+
+ struct dump_dir *dd;
+ if (base_dir_name)
+ dd = try_dd_create(base_dir_name, dir_name);
+ else
+ {
+ /* Try /var/run/abrt */
+ dd = try_dd_create(LOCALSTATEDIR"/run/abrt", dir_name);
+ /* Try $HOME/tmp */
+ if (!dd)
+ {
+ char *home = getenv("HOME");
+ if (home && home[0])
+ {
+ home = concat_path_file(home, "tmp");
+ /*mkdir(home, 0777); - do we want this? */
+ dd = try_dd_create(home, dir_name);
+ free(home);
+ }
+ }
+//TODO: try user's home dir obtained by getpwuid(getuid())?
+ /* Try /tmp */
+ if (!dd)
+ dd = try_dd_create("/tmp", dir_name);
+ }
+ if (!dd)
+ return NULL;
+
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, crash_data);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
+ {
+ if (name[0] == '.' || strchr(name, '/'))
+ {
+ error_msg("Crash data field name contains disallowed chars: '%s'", name);
+ goto next;
+ }
+
+//FIXME: what to do with CD_FLAG_BINs??
+ if (value->flags & CD_FLAG_BIN)
+ goto next;
+
+ dd_save_text(dd, name, value->content);
+ next: ;
+ }
+
+ return dd;
+}
diff --git a/src/lib/dump_dir.c b/src/lib/dump_dir.c
index 19f86072..a84e2814 100644
--- a/src/lib/dump_dir.c
+++ b/src/lib/dump_dir.c
@@ -1,6 +1,4 @@
/*
- DebugDump.cpp
-
Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com)
Copyright (C) 2009 RedHat inc.
@@ -22,11 +20,70 @@
#include "abrtlib.h"
#include "strbuf.h"
-// TODO:
+// Locking logic:
+//
+// The directory is locked by creating a symlink named .lock inside it,
+// whose value (where it "points to") is the pid of locking process.
+// We use symlink, not an ordinary file, because symlink creation
+// is an atomic operation.
+//
+// There are two cases where after .lock creation, we might discover
+// that directory is not really free:
+// * another process just created new directory, but didn't manage
+// to lock it before us.
+// * another process is deleting the directory, and we managed to sneak in
+// and create .lock after it deleted all files (including .lock)
+// but before it rmdir'ed the empty directory.
+//
+// Both these cases are detected by the fact that file named "time"
+// is not present (it must be present in any valid dump dir).
+// If after locking the dir we don't see time file, we remove the lock
+// at once and back off. What happens in concurrent processes
+// we interfered with?
+// * "create new dump dir" process just re-tries locking.
+// * "delete dump dir" process just retries rmdir.
//
-// Perhaps dd_opendir should do some sanity checking like
-// "if there is no "uid" file in the directory, it's not a crash dump",
-// and fail.
+// There is another case when we don't find time file:
+// when the directory is not really a *dump* dir - user gave us
+// an ordinary directory name by mistake.
+// We detect it by bailing out of "lock, check time file; sleep
+// and retry if it doesn't exist" loop using a counter.
+//
+// To make locking work reliably, it's important to set timeouts
+// correctly. For example, dd_create should retry locking
+// its newly-created directory much faster than dd_opendir
+// tries to lock the directory it tries to open.
+
+
+// How long to sleep between "symlink fails with EEXIST,
+// readlink fails with ENOENT" tries. Someone just unlocked the dir.
+// We never bail out in this case, we retry forever.
+// The value can be really small:
+#define SYMLINK_RETRY_USLEEP (10*1000)
+
+// How long to sleep when lock file with valid pid is seen by dd_opendir
+// (we are waiting for other process to unlock or die):
+#define WAIT_FOR_OTHER_PROCESS_USLEEP (500*1000)
+
+// How long to sleep when lock file with valid pid is seen by dd_create
+// (some idiot jumped the gun and locked the dir we just created).
+// Must not be the same as WAIT_FOR_OTHER_PROCESS_USLEEP (we depend on this)
+// and should be small (we have the priority in locking, this is OUR dir):
+#define CREATE_LOCK_USLEEP (10*1000)
+
+// How long to sleep after we locked a dir, found no time file
+// (either we are racing with someone, or it's not a dump dir)
+// and unlocked it;
+// and after how many tries to give up and declare it's not a dump dir:
+#define NO_TIME_FILE_USLEEP (50*1000)
+#define NO_TIME_FILE_COUNT 10
+
+// How long to sleep after we unlocked an empty dir, but then rmdir failed
+// (some idiot jumped the gun and locked the dir we are deleting);
+// and after how many tries to give up:
+#define RMDIR_FAIL_USLEEP (10*1000)
+#define RMDIR_FAIL_COUNT 50
+
static char *load_text_file(const char *path, unsigned flags);
@@ -53,12 +110,21 @@ static bool exist_file_dir(const char *path)
return false;
}
-static bool get_and_set_lock(const char* lock_file, const char* pid)
+/* Return values:
+ * -1: error
+ * 0: failed to lock (someone else has it locked)
+ * 1: success
+ */
+static int get_and_set_lock(const char* lock_file, const char* pid)
{
while (symlink(pid, lock_file) != 0)
{
if (errno != EEXIST)
- perror_msg_and_die("Can't create lock file '%s'", lock_file);
+ {
+ if (errno != ENOENT && errno != ENOTDIR)
+ perror_msg("Can't create lock file '%s'", lock_file);
+ return -1;
+ }
char pid_buf[sizeof(pid_t)*3 + 4];
ssize_t r = readlink(lock_file, pid_buf, sizeof(pid_buf) - 1);
@@ -67,54 +133,94 @@ static bool get_and_set_lock(const char* lock_file, const char* pid)
if (errno == ENOENT)
{
/* Looks like lock_file was deleted */
- usleep(10 * 1000); /* avoid CPU eating loop */
+ usleep(SYMLINK_RETRY_USLEEP); /* avoid CPU eating loop */
continue;
}
- perror_msg_and_die("Can't read lock file '%s'", lock_file);
+ perror_msg("Can't read lock file '%s'", lock_file);
+ return -1;
}
pid_buf[r] = '\0';
if (strcmp(pid_buf, pid) == 0)
{
log("Lock file '%s' is already locked by us", lock_file);
- return false;
+ return 0;
}
if (isdigit_str(pid_buf))
{
- char pid_str[sizeof("/proc/") + strlen(pid_buf)];
+ char pid_str[sizeof("/proc/") + sizeof(pid_buf)];
sprintf(pid_str, "/proc/%s", pid_buf);
if (access(pid_str, F_OK) == 0)
{
log("Lock file '%s' is locked by process %s", lock_file, pid_buf);
- return false;
+ return 0;
}
log("Lock file '%s' was locked by process %s, but it crashed?", lock_file, pid_buf);
}
/* The file may be deleted by now by other process. Ignore ENOENT */
if (unlink(lock_file) != 0 && errno != ENOENT)
{
- perror_msg_and_die("Can't remove stale lock file '%s'", lock_file);
+ perror_msg("Can't remove stale lock file '%s'", lock_file);
+ return -1;
}
}
VERB1 log("Locked '%s'", lock_file);
- return true;
+ return 1;
}
-static void dd_lock(struct dump_dir *dd)
+static int dd_lock(struct dump_dir *dd, unsigned sleep_usec)
{
if (dd->locked)
- error_msg_and_die("Locking bug on '%s'", dd->dd_dir);
-
- char lock_buf[strlen(dd->dd_dir) + sizeof(".lock")];
- sprintf(lock_buf, "%s.lock", dd->dd_dir);
+ error_msg_and_die("Locking bug on '%s'", dd->dd_dirname);
char pid_buf[sizeof(long)*3 + 2];
sprintf(pid_buf, "%lu", (long)getpid());
- while ((dd->locked = get_and_set_lock(lock_buf, pid_buf)) != true)
+
+ unsigned dirname_len = strlen(dd->dd_dirname);
+ char lock_buf[dirname_len + sizeof("/.lock")];
+ strcpy(lock_buf, dd->dd_dirname);
+ strcpy(lock_buf + dirname_len, "/.lock");
+
+ unsigned count = NO_TIME_FILE_COUNT;
+ retry:
+ while (1)
{
- sleep(1); /* was 0.5 seconds */
+ int r = get_and_set_lock(lock_buf, pid_buf);
+ if (r < 0)
+ return r; /* error */
+ if (r > 0)
+ break; /* locked successfully */
+ /* Other process has the lock, wait for it to go away */
+ usleep(sleep_usec);
}
+
+ /* Are we called by dd_opendir (as opposed to dd_create)? */
+ if (sleep_usec == WAIT_FOR_OTHER_PROCESS_USLEEP) /* yes */
+ {
+ strcpy(lock_buf + dirname_len, "/time");
+ if (access(lock_buf, F_OK) != 0)
+ {
+ /* time file doesn't exist. We managed to lock the directory
+ * which was just created by somebody else, or is almost deleted
+ * by delete_file_dir.
+ * Unlock and back off.
+ */
+ strcpy(lock_buf + dirname_len, "/.lock");
+ xunlink(lock_buf);
+ VERB1 log("Unlocked '%s' (no time file)", lock_buf);
+ if (--count == 0)
+ {
+ errno = EISDIR; /* "this is an ordinary dir, not dump dir" */
+ return -1;
+ }
+ usleep(NO_TIME_FILE_USLEEP);
+ goto retry;
+ }
+ }
+
+ dd->locked = true;
+ return 0;
}
static void dd_unlock(struct dump_dir *dd)
@@ -122,9 +228,13 @@ static void dd_unlock(struct dump_dir *dd)
if (dd->locked)
{
dd->locked = 0;
- char lock_buf[strlen(dd->dd_dir) + sizeof(".lock")];
- sprintf(lock_buf, "%s.lock", dd->dd_dir);
+
+ unsigned dirname_len = strlen(dd->dd_dirname);
+ char lock_buf[dirname_len + sizeof("/.lock")];
+ strcpy(lock_buf, dd->dd_dirname);
+ strcpy(lock_buf + dirname_len, "/.lock");
xunlink(lock_buf);
+
VERB1 log("Unlocked '%s'", lock_buf);
}
}
@@ -136,7 +246,7 @@ static inline struct dump_dir *dd_init(void)
int dd_exist(struct dump_dir *dd, const char *path)
{
- char *full_path = concat_path_file(dd->dd_dir, path);
+ char *full_path = concat_path_file(dd->dd_dirname, path);
int ret = exist_file_dir(full_path);
free(full_path);
return ret;
@@ -154,7 +264,7 @@ void dd_close(struct dump_dir *dd)
/* free(dd->next_dir); - WRONG! */
}
- free(dd->dd_dir);
+ free(dd->dd_dirname);
free(dd);
}
@@ -170,52 +280,68 @@ struct dump_dir *dd_opendir(const char *dir, int flags)
{
struct dump_dir *dd = dd_init();
- /* Used to use rm_trailing_slashes(dir) here, but with dir = "."
- * or "..", or if the last component is a symlink,
- * then lock file is created in the wrong place.
- * IOW: this breaks locking.
- */
- dd->dd_dir = realpath(dir, NULL);
- if (!dd->dd_dir)
- {
- if (!(flags & DD_FAIL_QUIETLY))
- error_msg("'%s' does not exist", dir);
- dd_close(dd);
- return NULL;
- }
- dir = dd->dd_dir;
-
- dd_lock(dd);
+ dir = dd->dd_dirname = rm_trailing_slashes(dir);
- struct stat stat_buf;
- if (stat(dir, &stat_buf) != 0 || !S_ISDIR(stat_buf.st_mode))
+ errno = 0;
+ if (dd_lock(dd, WAIT_FOR_OTHER_PROCESS_USLEEP) < 0)
{
- if (!(flags & DD_FAIL_QUIETLY))
- error_msg("'%s' does not exist", dir);
+ if ((flags & DD_OPEN_READONLY) && errno == EACCES)
+ {
+ /* Directory is not writable. If it seems to be readable,
+ * return "read only" dd, not NULL */
+ struct stat stat_buf;
+ if (stat(dir, &stat_buf) == 0
+ && S_ISDIR(stat_buf.st_mode)
+ && access(dir, R_OK) == 0
+ ) {
+ return dd;
+ }
+ }
+ if (errno == EISDIR)
+ {
+ /* EISDIR: dd_lock can lock the dir, but it sees no time file there,
+ * even after it retried many times. It must be an ordinary directory!
+ *
+ * Without this check, e.g. abrt-action-print happily prints any current
+ * directory when run without arguments, because its option -d DIR
+ * defaults to "."!
+ */
+ /*if (!(flags & DD_FAIL_QUIETLY))... - no, DD_FAIL_QUIETLY only means
+ * "it's ok if it doesn exist", not "ok if contents is bogus"!
+ */
+ error_msg("'%s' is not a crash dump directory", dir);
+ dd_close(dd);
+ return NULL;
+ }
+
+ if (errno == ENOENT || errno == ENOTDIR)
+ {
+ if (!(flags & DD_FAIL_QUIETLY))
+ error_msg("'%s' does not exist", dir);
+ }
+ else
+ {
+ perror_msg("Can't access '%s'", dir);
+ }
dd_close(dd);
return NULL;
}
- /* In case caller would want to create more files, he'll need uid:gid */
- dd->dd_uid = stat_buf.st_uid;
- dd->dd_gid = stat_buf.st_gid;
-
- /* Without this check, e.g. abrt-action-print happily prints any current
- * directory when run without arguments, because its option -d DIR
- * defaults to "."! Let's require that at least some crash dump dir
- * specific files exist before we declare open successful:
- */
- char *name = concat_path_file(dir, FILENAME_ANALYZER);
- int bad = (lstat(name, &stat_buf) != 0 || !S_ISREG(stat_buf.st_mode));
- free(name);
- if (bad)
+ dd->dd_uid = (uid_t)-1L;
+ dd->dd_gid = (gid_t)-1L;
+ if (geteuid() == 0)
{
- /*if (!(flags & DD_FAIL_QUIETLY))... - no, DD_FAIL_QUIETLY only means
- * "it's ok if it doesn exist", not "ok if contents is bogus"!
- */
- error_msg("'%s' is not a crash dump directory", dir);
- dd_close(dd);
- return NULL;
+ /* In case caller would want to create more files, he'll need uid:gid */
+ struct stat stat_buf;
+ if (stat(dir, &stat_buf) != 0 || !S_ISDIR(stat_buf.st_mode))
+ {
+ if (!(flags & DD_FAIL_QUIETLY))
+ error_msg("'%s' does not exist", dir);
+ dd_close(dd);
+ return NULL;
+ }
+ dd->dd_uid = stat_buf.st_uid;
+ dd->dd_gid = stat_buf.st_gid;
}
return dd;
@@ -248,7 +374,7 @@ struct dump_dir *dd_create(const char *dir, uid_t uid)
* realpath will always return NULL. We don't really have to:
* dd_opendir(".") makes sense, dd_create(".") does not.
*/
- dir = dd->dd_dir = rm_trailing_slashes(dir);
+ dir = dd->dd_dirname = rm_trailing_slashes(dir);
const char *last_component = strrchr(dir, '/');
if (last_component)
@@ -265,15 +391,38 @@ struct dump_dir *dd_create(const char *dir, uid_t uid)
return NULL;
}
- dd_lock(dd);
-
+ bool created_parents = false;
+ try_again:
/* Was creating it with mode 0700 and user as the owner, but this allows
* the user to replace any file in the directory, changing security-sensitive data
* (e.g. "uid", "analyzer", "executable")
*/
if (mkdir(dir, 0750) == -1)
{
- perror_msg("Can't create dir '%s'", dir);
+ int err = errno;
+ if (!created_parents && errno == ENOENT)
+ {
+ char *p = dd->dd_dirname + 1;
+ while ((p = strchr(p, '/')) != NULL)
+ {
+ *p = '\0';
+ int r = (mkdir(dd->dd_dirname, 0755) == 0 || errno == EEXIST);
+ *p++ = '/';
+ if (!r)
+ goto report_err;
+ }
+ created_parents = true;
+ goto try_again;
+ }
+ report_err:
+ errno = err;
+ perror_msg("Can't create directory '%s'", dir);
+ dd_close(dd);
+ return NULL;
+ }
+
+ if (dd_lock(dd, CREATE_LOCK_USLEEP) < 0)
+ {
dd_close(dd);
return NULL;
}
@@ -281,35 +430,51 @@ struct dump_dir *dd_create(const char *dir, uid_t uid)
/* mkdir's mode (above) can be affected by umask, fix it */
if (chmod(dir, 0750) == -1)
{
- perror_msg("Can't change mode of '%s'", dir);
+ perror_msg("can't change mode of '%s'", dir);
dd_close(dd);
return NULL;
}
- /* Get ABRT's user id */
- /*dd->dd_uid = 0; - dd_init did this already */
- struct passwd *pw = getpwnam("abrt");
- if (pw)
- dd->dd_uid = pw->pw_uid;
- else
- error_msg("User 'abrt' does not exist, using uid 0");
-
- /* Get crashed application's group id */
- /*dd->dd_gid = 0; - dd_init did this already */
- pw = getpwuid(uid);
- if (pw)
- dd->dd_gid = pw->pw_gid;
- else
- error_msg("User %lu does not exist, using gid 0", (long)uid);
-
- if (chown(dir, dd->dd_uid, dd->dd_gid) == -1)
+ dd->dd_uid = (uid_t)-1L;
+ dd->dd_gid = (gid_t)-1L;
+ if (uid != (uid_t)-1L)
{
- perror_msg("Can't change '%s' ownership to %lu:%lu", dir,
- (long)dd->dd_uid, (long)dd->dd_gid);
+ /* Get ABRT's user id */
+ dd->dd_uid = 0;
+ struct passwd *pw = getpwnam("abrt");
+ if (pw)
+ dd->dd_uid = pw->pw_uid;
+ else
+ error_msg("user 'abrt' does not exist, using uid 0");
+
+ /* Get crashed application's group id */
+ /*dd->dd_gid = 0; - dd_init did this already */
+ pw = getpwuid(uid);
+ if (pw)
+ dd->dd_gid = pw->pw_gid;
+ else
+ error_msg("User %lu does not exist, using gid 0", (long)uid);
+
+ if (chown(dir, dd->dd_uid, dd->dd_gid) == -1)
+ {
+ perror_msg("can't change '%s' ownership to %lu:%lu", dir,
+ (long)dd->dd_uid, (long)dd->dd_gid);
+ }
}
+ return dd;
+}
+
+void dd_create_basic_files(struct dump_dir *dd, uid_t uid)
+{
char long_str[sizeof(long) * 3 + 2];
+ time_t t = time(NULL);
+ sprintf(long_str, "%lu", (long)t);
+ dd_save_text(dd, FILENAME_TIME, long_str);
+
+ if (uid == (uid_t)-1)
+ uid = getuid();
sprintf(long_str, "%lu", (long)uid);
dd_save_text(dd, FILENAME_UID, long_str);
@@ -317,54 +482,102 @@ struct dump_dir *dd_create(const char *dir, uid_t uid)
uname(&buf); /* never fails */
dd_save_text(dd, FILENAME_KERNEL, buf.release);
dd_save_text(dd, FILENAME_ARCHITECTURE, buf.machine);
- char *release = load_text_file("/etc/redhat-release", /*flags:*/ 0);
- strchrnul(release, '\n')[0] = '\0';
- dd_save_text(dd, FILENAME_RELEASE, release);
- free(release);
+ dd_save_text(dd, FILENAME_HOSTNAME, buf.nodename);
- time_t t = time(NULL);
- sprintf(long_str, "%lu", (long)t);
- dd_save_text(dd, FILENAME_TIME, long_str);
-
- return dd;
+ char *release = load_text_file("/etc/system-release",
+ DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE);
+ if (!release)
+ release = load_text_file("/etc/redhat-release", /*flags:*/ 0);
+ dd_save_text(dd, FILENAME_OS_RELEASE, release);
+ free(release);
}
-static void delete_file_dir(const char *dir)
+static int delete_file_dir(const char *dir, bool skip_lock_file)
{
DIR *d = opendir(dir);
if (!d)
- return;
+ {
+ /* The caller expects us to error out only if the directory
+ * still exists (not deleted). If directory
+ * *doesn't exist*, return 0 and clear errno.
+ */
+ if (errno == ENOENT || errno == ENOTDIR)
+ {
+ errno = 0;
+ return 0;
+ }
+ return -1;
+ }
+ bool unlink_lock_file = false;
struct dirent *dent;
while ((dent = readdir(d)) != NULL)
{
if (dot_or_dotdot(dent->d_name))
continue;
+ if (skip_lock_file && strcmp(dent->d_name, ".lock") == 0)
+ {
+ unlink_lock_file = true;
+ continue;
+ }
char *full_path = concat_path_file(dir, dent->d_name);
if (unlink(full_path) == -1 && errno != ENOENT)
{
- if (errno != EISDIR)
+ int err = 0;
+ if (errno == EISDIR)
+ {
+ errno = 0;
+ err = delete_file_dir(full_path, /*skip_lock_file:*/ false);
+ }
+ if (errno || err)
{
- error_msg("Can't remove '%s'", full_path);
+ perror_msg("Can't remove '%s'", full_path);
free(full_path);
closedir(d);
- return;
+ return -1;
}
- delete_file_dir(full_path);
}
free(full_path);
}
closedir(d);
- if (rmdir(dir) == -1)
+
+ /* Here we know for sure that all files/subdirs we found via readdir
+ * were deleted successfully. If rmdir below fails, we assume someone
+ * is racing with us and created a new file.
+ */
+
+ if (unlink_lock_file)
{
- error_msg("Can't remove dir '%s'", dir);
+ char *full_path = concat_path_file(dir, ".lock");
+ xunlink(full_path);
+ free(full_path);
+
+ unsigned cnt = RMDIR_FAIL_COUNT;
+ do {
+ if (rmdir(dir) == 0)
+ return 0;
+ /* Someone locked the dir after unlink, but before rmdir.
+ * This "someone" must be dd_lock().
+ * It detects this (by seeing that there is no time file)
+ * and backs off at once. So we need to just retry rmdir,
+ * with minimal sleep.
+ */
+ usleep(RMDIR_FAIL_USLEEP);
+ } while (--cnt != 0);
}
+
+ int r = rmdir(dir);
+ if (r)
+ perror_msg("Can't remove directory '%s'", dir);
+ return r;
}
-void dd_delete(struct dump_dir *dd)
+int dd_delete(struct dump_dir *dd)
{
- delete_file_dir(dd->dd_dir);
+ int r = delete_file_dir(dd->dd_dirname, /*skip_lock_file:*/ true);
+ dd->locked = 0; /* delete_file_dir already removed .lock */
dd_close(dd);
+ return r;
}
static char *load_text_file(const char *path, unsigned flags)
@@ -411,10 +624,15 @@ static bool save_binary_file(const char *path, const char* data, unsigned size,
perror_msg("Can't open file '%s'", path);
return false;
}
- if (fchown(fd, uid, gid) == -1)
+
+ if (uid != (uid_t)-1L)
{
- perror_msg("can't change '%s' ownership to %lu:%lu", path, (long)uid, (long)gid);
+ if (fchown(fd, uid, gid) == -1)
+ {
+ perror_msg("can't change '%s' ownership to %lu:%lu", path, (long)uid, (long)gid);
+ }
}
+
unsigned r = full_write(fd, data, size);
close(fd);
if (r != size)
@@ -428,10 +646,14 @@ static bool save_binary_file(const char *path, const char* data, unsigned size,
char* dd_load_text_ext(const struct dump_dir *dd, const char *name, unsigned flags)
{
- if (!dd->locked)
- error_msg_and_die("dump_dir is not opened"); /* bug */
+// if (!dd->locked)
+// error_msg_and_die("dump_dir is not opened"); /* bug */
- char *full_path = concat_path_file(dd->dd_dir, name);
+ /* Compat with old abrt dumps. Remove in abrt-2.1 */
+ if (strcmp(name, "release") == 0)
+ name = FILENAME_OS_RELEASE;
+
+ char *full_path = concat_path_file(dd->dd_dirname, name);
char *ret = load_text_file(full_path, flags);
free(full_path);
@@ -448,7 +670,7 @@ void dd_save_text(struct dump_dir *dd, const char *name, const char *data)
if (!dd->locked)
error_msg_and_die("dump_dir is not opened"); /* bug */
- char *full_path = concat_path_file(dd->dd_dir, name);
+ char *full_path = concat_path_file(dd->dd_dirname, name);
save_binary_file(full_path, data, strlen(data), dd->dd_uid, dd->dd_gid);
free(full_path);
}
@@ -458,23 +680,23 @@ void dd_save_binary(struct dump_dir* dd, const char* name, const char* data, uns
if (!dd->locked)
error_msg_and_die("dump_dir is not opened"); /* bug */
- char *full_path = concat_path_file(dd->dd_dir, name);
+ char *full_path = concat_path_file(dd->dd_dirname, name);
save_binary_file(full_path, data, size, dd->dd_uid, dd->dd_gid);
free(full_path);
}
DIR *dd_init_next_file(struct dump_dir *dd)
{
- if (!dd->locked)
- error_msg_and_die("dump_dir is not opened"); /* bug */
+// if (!dd->locked)
+// error_msg_and_die("dump_dir is not opened"); /* bug */
if (dd->next_dir)
closedir(dd->next_dir);
- dd->next_dir = opendir(dd->dd_dir);
+ dd->next_dir = opendir(dd->dd_dirname);
if (!dd->next_dir)
{
- error_msg("Can't open dir '%s'", dd->dd_dir);
+ error_msg("Can't open directory '%s'", dd->dd_dirname);
}
return dd->next_dir;
@@ -488,12 +710,12 @@ int dd_get_next_file(struct dump_dir *dd, char **short_name, char **full_name)
struct dirent *dent;
while ((dent = readdir(dd->next_dir)) != NULL)
{
- if (is_regular_file(dent, dd->dd_dir))
+ if (is_regular_file(dent, dd->dd_dirname))
{
if (short_name)
*short_name = xstrdup(dent->d_name);
if (full_name)
- *full_name = concat_path_file(dd->dd_dir, dent->d_name);
+ *full_name = concat_path_file(dd->dd_dirname, dent->d_name);
return 1;
}
}
@@ -504,9 +726,9 @@ int dd_get_next_file(struct dump_dir *dd, char **short_name, char **full_name)
}
/* Utility function */
-void delete_crash_dump_dir(const char *dd_dir)
+void delete_dump_dir(const char *dirname)
{
- struct dump_dir *dd = dd_opendir(dd_dir, /*flags:*/ 0);
+ struct dump_dir *dd = dd_opendir(dirname, /*flags:*/ 0);
if (dd)
{
dd_delete(dd);
diff --git a/src/daemon/CommLayerServer.cpp b/src/lib/glib_support.c
index 5e250121..feb4c18b 100644
--- a/src/daemon/CommLayerServer.cpp
+++ b/src/lib/glib_support.c
@@ -1,6 +1,6 @@
/*
- Copyright (C) 2010 ABRT team
- Copyright (C) 2010 RedHat Inc
+ Copyright (C) 2011 ABRT team
+ Copyright (C) 2011 RedHat Inc
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -16,14 +16,11 @@
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#include "CommLayerServer.h"
-#include "CrashWatcher.h"
+#include "abrtlib.h"
-CCommLayerServer::CCommLayerServer()
-{
- m_init_error = 0;
-}
-
-CCommLayerServer::~CCommLayerServer()
+void list_free_with_free(GList *list)
{
+ for (GList *li = list; li; li = g_list_next(li))
+ free(li->data);
+ g_list_free(list);
}
diff --git a/src/lib/hash_md5.h b/src/lib/hash_md5.h
index cc1d2c43..f7e9f398 100644
--- a/src/lib/hash_md5.h
+++ b/src/lib/hash_md5.h
@@ -24,6 +24,9 @@ typedef struct md5_ctx_t {
uint32_t buflen;
char buffer[128];
} md5_ctx_t;
+#define md5_begin abrt_md5_begin
void md5_begin(md5_ctx_t *ctx);
+#define md5_hash abrt_md5_hash
void md5_hash(const void *data, size_t length, md5_ctx_t *ctx);
+#define md5_end abrt_md5_end
void md5_end(void *resbuf, md5_ctx_t *ctx);
diff --git a/src/lib/hash_sha1.h b/src/lib/hash_sha1.h
index 02978ea4..09f50d12 100644
--- a/src/lib/hash_sha1.h
+++ b/src/lib/hash_sha1.h
@@ -31,8 +31,11 @@ typedef struct sha1_ctx_t {
void (*process_block)(struct sha1_ctx_t*);
} sha1_ctx_t;
+#define sha1_begin abrt_sha1_begin
void sha1_begin(sha1_ctx_t *ctx);
+#define sha1_hash abrt_sha1_hash
void sha1_hash(const void *buffer, size_t len, sha1_ctx_t *ctx);
+#define sha1_end abrt_sha1_end
void sha1_end(void *resbuf, sha1_ctx_t *ctx);
#ifdef __cplusplus
diff --git a/src/lib/hooklib.c b/src/lib/hooklib.c
index 63c8a634..a89ab008 100644
--- a/src/lib/hooklib.c
+++ b/src/lib/hooklib.c
@@ -132,7 +132,7 @@ void trim_debug_dumps(unsigned setting_MaxCrashReportsSize, const char *exclude_
char *d = concat_path_file(DEBUG_DUMPS_DIR, worst_dir);
free(worst_dir);
worst_dir = NULL;
- delete_crash_dump_dir(d);
+ delete_dump_dir(d);
free(d);
}
}
diff --git a/src/lib/hooklib.h b/src/lib/hooklib.h
index ba76efbc..84b31a5f 100644
--- a/src/lib/hooklib.h
+++ b/src/lib/hooklib.h
@@ -20,8 +20,14 @@
extern "C" {
#endif
-void parse_conf(const char *additional_conf, unsigned *setting_MaxCrashReportsSize, bool *setting_MakeCompatCore, bool *setting_SaveBinaryImage);
+#define parse_conf abrt_parse_conf
+void parse_conf(const char *additional_conf,
+ unsigned *setting_MaxCrashReportsSize,
+ bool *setting_MakeCompatCore,
+ bool *setting_SaveBinaryImage);
+#define check_free_space abrt_check_free_space
void check_free_space(unsigned setting_MaxCrashReportsSize);
+#define trim_debug_dumps abrt_trim_debug_dumps
void trim_debug_dumps(unsigned setting_MaxCrashReportsSize, const char *exclude_path);
#ifdef __cplusplus
diff --git a/src/lib/numtoa.cpp b/src/lib/iso_date_string.c
index 061da553..4600ff7f 100644
--- a/src/lib/numtoa.cpp
+++ b/src/lib/iso_date_string.c
@@ -1,8 +1,6 @@
/*
- Number to string conversions
-
- Copyright (C) 2010 ABRT team
- Copyright (C) 2010 RedHat inc.
+ Copyright (C) 2011 ABRT team
+ Copyright (C) 2011 RedHat Inc
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -18,17 +16,16 @@
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
+
#include "abrtlib.h"
-std::string unsigned_to_string(unsigned long long x)
-{
- char buf[sizeof(x)*3];
- sprintf(buf, "%llu", x);
- return buf;
-}
-std::string signed_to_string(long long x)
+char *iso_date_string(time_t *pt)
{
- char buf[sizeof(x)*3];
- sprintf(buf, "%lld", x);
- return buf;
+ static char buf[sizeof("YYYY-MM-DD-HH:MM:SS") + 4];
+
+ time_t t;
+ struct tm *ptm = localtime(pt ? pt : (time(&t), &t));
+ strftime(buf, sizeof(buf), "%Y-%m-%d-%H:%M:%S", ptm);
+
+ return buf;
}
diff --git a/src/lib/load_plugin_settings.cpp b/src/lib/load_plugin_settings.c
index 1052f19e..1e6b31e7 100644
--- a/src/lib/load_plugin_settings.cpp
+++ b/src/lib/load_plugin_settings.c
@@ -18,8 +18,10 @@
*/
#include "abrtlib.h"
-bool LoadPluginSettings(const char *pPath, map_plugin_settings_t& pSettings,
- bool skipKeysWithoutValue /*= true*/)
+/* Returns NULL if open failed.
+ * Returns empty hash if conf file is empty.
+ */
+bool load_conf_file(const char *pPath, map_string_h *settings, bool skipKeysWithoutValue)
{
FILE *fp = stdin;
if (strcmp(pPath, "-") != 0)
@@ -33,11 +35,15 @@ bool LoadPluginSettings(const char *pPath, map_plugin_settings_t& pSettings,
while ((line = xmalloc_fgetline(fp)) != NULL)
{
unsigned ii;
- bool is_value = false;
bool valid = false;
bool in_quote = false;
- std::string key;
- std::string value;
+ /* We are reusing line buffer to form temporary
+ * "key\0value\0..." in its beginning
+ */
+ char *key = line;
+ char *value = line;
+ char *cur = line;
+
for (ii = 0; line[ii] != '\0'; ii++)
{
if (line[ii] == '"')
@@ -48,47 +54,43 @@ bool LoadPluginSettings(const char *pPath, map_plugin_settings_t& pSettings,
{
continue;
}
- if (line[ii] == '#' && !in_quote && key == "")
+ if (line[ii] == '#' && !in_quote && cur == line)
{
break;
}
if (line[ii] == '=' && !in_quote)
{
- is_value = true;
valid = true;
+ *cur++ = '\0'; /* terminate key */
+ value = cur; /* remember where value starts */
continue;
}
- if (!is_value)
- {
- key += line[ii];
- }
- else
- {
- value += line[ii];
- }
+ *cur++ = line[ii]; /* store next key or value char */
}
+ *cur++ = '\0'; /* terminate value */
/* Skip broken or empty lines. */
if (!valid)
goto free_line;
/* Skip lines with empty key. */
- if (key.length() == 0)
+ if (key[0] == '\0')
goto free_line;
- if (skipKeysWithoutValue && value.length() == 0)
+ if (skipKeysWithoutValue && value[0] == '\0')
goto free_line;
/* Skip lines with unclosed quotes. */
if (in_quote)
goto free_line;
- pSettings[key] = value;
+ g_hash_table_replace(settings, xstrdup(key), xstrdup(value));
free_line:
free(line);
}
if (fp != stdin)
fclose(fp);
+
return true;
}
diff --git a/src/lib/logging.h b/src/lib/logging.h
index 8a038bc7..316c1a22 100644
--- a/src/lib/logging.h
+++ b/src/lib/logging.h
@@ -33,14 +33,6 @@ extern "C" {
#define NORETURN __attribute__ ((noreturn))
-/* VERB1 log("what you sometimes want to see, even on a production box") */
-#define VERB1 if (g_verbose >= 1)
-/* VERB2 log("debug message, not going into insanely small details") */
-#define VERB2 if (g_verbose >= 2)
-/* VERB3 log("lots and lots of details") */
-#define VERB3 if (g_verbose >= 3)
-/* there is no level > 3 */
-
enum {
LOGMODE_NONE = 0,
LOGMODE_STDIO = (1 << 0),
@@ -49,26 +41,47 @@ enum {
LOGMODE_CUSTOM = (1 << 2),
};
+#define g_custom_logger abrt_g_custom_logger
extern void (*g_custom_logger)(const char*);
+#define msg_prefix abrt_msg_prefix
extern const char *msg_prefix;
+#define msg_eol abrt_msg_eol
extern const char *msg_eol;
+#define logmode abrt_logmode
extern int logmode;
+#define xfunc_error_retval abrt_xfunc_error_retval
extern int xfunc_error_retval;
/* Verbosity level */
+#define g_verbose abrt_g_verbose
extern int g_verbose;
+/* VERB1 log("what you sometimes want to see, even on a production box") */
+#define VERB1 if (g_verbose >= 1)
+/* VERB2 log("debug message, not going into insanely small details") */
+#define VERB2 if (g_verbose >= 2)
+/* VERB3 log("lots and lots of details") */
+#define VERB3 if (g_verbose >= 3)
+/* there is no level > 3 */
+#define abrt_
+#define xfunc_die abrt_xfunc_die
void xfunc_die(void) NORETURN;
+#define log_msg abrt_log_msg
void log_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2)));
/* It's a macro, not function, since it collides with log() from math.h */
#undef log
#define log(...) log_msg(__VA_ARGS__)
/* error_msg family will use g_custom_logger. log_msg does not. */
+#define error_msg abrt_error_msg
void error_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2)));
+#define error_msg_and_die abrt_error_msg_and_die
void error_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2)));
/* Reports error message with libc's errno error description attached. */
+#define perror_msg abrt_perror_msg
void perror_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2)));
+#define perror_msg_and_die abrt_perror_msg_and_die
void perror_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2)));
+#define die_out_of_memory abrt_die_out_of_memory
void die_out_of_memory(void) NORETURN;
#ifdef __cplusplus
diff --git a/src/lib/make_descr.cpp b/src/lib/make_descr.c
index e11325c8..1ba15203 100644
--- a/src/lib/make_descr.cpp
+++ b/src/lib/make_descr.c
@@ -17,10 +17,6 @@
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "abrtlib.h"
-#include "abrt_crash_dump.h"
-
-
-using namespace std;
// caller is responsible for freeing **dsc
static void add_content(bool *was_multiline, char **dsc, const char *header, const char *content)
@@ -64,7 +60,6 @@ static void add_content(bool *was_multiline, char **dsc, const char *header, con
static const char *const blacklisted_items[] = {
FILENAME_ANALYZER ,
FILENAME_COREDUMP ,
- FILENAME_DESCRIPTION, /* package description - basically useless */
FILENAME_HOSTNAME ,
FILENAME_DUPHASH ,
FILENAME_UUID ,
@@ -75,30 +70,32 @@ static const char *const blacklisted_items[] = {
NULL
};
-char* make_description_mailx(const map_crash_data_t & crash_data)
+char* make_description_mailx(crash_data_t *crash_data)
{
struct strbuf *buf_dsc = strbuf_new();
struct strbuf *buf_additional_files = strbuf_new();
struct strbuf *buf_duphash_file = strbuf_new();
struct strbuf *buf_common_files = strbuf_new();
- map_crash_data_t::const_iterator it;
- for (it = crash_data.begin(); it != crash_data.end(); it++)
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, crash_data);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
{
- if (it->second[CD_TYPE] == CD_TXT)
+ if (value->flags & CD_FLAG_TXT)
{
- const char *itemname = it->first.c_str();
- if ((strcmp(itemname, FILENAME_DUPHASH) != 0)
- && (strcmp(itemname, FILENAME_ARCHITECTURE) != 0)
- && (strcmp(itemname, FILENAME_KERNEL) != 0)
- && (strcmp(itemname, FILENAME_PACKAGE) != 0)
+ if ((strcmp(name, FILENAME_DUPHASH) != 0)
+ && (strcmp(name, FILENAME_ARCHITECTURE) != 0)
+ && (strcmp(name, FILENAME_KERNEL) != 0)
+ && (strcmp(name, FILENAME_PACKAGE) != 0)
) {
- strbuf_append_strf(buf_additional_files, "%s\n-----\n%s\n\n", itemname, it->second[CD_CONTENT].c_str());
+ strbuf_append_strf(buf_additional_files, "%s\n-----\n%s\n\n", name, value->content);
}
- else if (strcmp(itemname, FILENAME_DUPHASH) == 0)
- strbuf_append_strf(buf_duphash_file, "%s\n-----\n%s\n\n", itemname, it->second[CD_CONTENT].c_str());
+ else if (strcmp(name, FILENAME_DUPHASH) == 0)
+ strbuf_append_strf(buf_duphash_file, "%s\n-----\n%s\n\n", name, value->content);
else
- strbuf_append_strf(buf_common_files, "%s\n-----\n%s\n\n", itemname, it->second[CD_CONTENT].c_str());
+ strbuf_append_strf(buf_common_files, "%s\n-----\n%s\n\n", name, value->content);
}
}
@@ -117,24 +114,27 @@ char* make_description_mailx(const map_crash_data_t & crash_data)
return strbuf_free_nobuf(buf_dsc);
}
-char* make_description_bz(const map_crash_data_t& pCrashData)
+char* make_description_bz(crash_data_t *crash_data)
{
struct strbuf *buf_dsc = strbuf_new();
struct strbuf *buf_long_dsc = strbuf_new();
- map_crash_data_t::const_iterator it = pCrashData.begin();
- for (; it != pCrashData.end(); it++)
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, crash_data);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
{
- const char *itemname = it->first.c_str();
- const char *type = it->second[CD_TYPE].c_str();
- const char *content = it->second[CD_CONTENT].c_str();
- if (strcmp(type, CD_TXT) == 0)
+ struct stat statbuf;
+ unsigned flags = value->flags;
+ const char *content = value->content;
+ if (flags & CD_FLAG_TXT)
{
/* Skip items we are not interested in */
const char *const *bl = blacklisted_items;
while (*bl)
{
- if (strcmp(itemname, *bl) == 0)
+ if (strcmp(name, *bl) == 0)
break;
bl++;
}
@@ -151,7 +151,7 @@ char* make_description_bz(const map_crash_data_t& pCrashData)
add_content(&was_multiline,
&tmp,
/* "reproduce: blah" looks ugly, fixing: */
- (strcmp(itemname, FILENAME_REPRODUCE) == 0) ? "How to reproduce" : itemname,
+ (strcmp(name, FILENAME_REPRODUCE) == 0) ? "How to reproduce" : name,
content
);
@@ -167,13 +167,33 @@ char* make_description_bz(const map_crash_data_t& pCrashData)
strbuf_append_str(buf_dsc, tmp);
free(tmp);
- } else {
- bool was_multiline = 0;
- char *dsc = NULL;
- add_content(&was_multiline, &dsc, "Attached file", itemname);
- strbuf_append_str(buf_dsc, dsc);
- free(dsc);
}
+ else
+ {
+ statbuf.st_size = strlen(content);
+ goto add_attachment_info;
+ }
+ }
+ if (flags & CD_FLAG_BIN)
+ {
+ /* In many cases, it is useful to know how big binary files are
+ * (for example, helps with diagnosing bug upload problems)
+ */
+ if (stat(content, &statbuf) != 0)
+ statbuf.st_size = (off_t) -1;
+
+ add_attachment_info: ;
+ char *descr;
+ if (statbuf.st_size >= 0)
+ descr = xasprintf("%s, %llu bytes", name, (long long)statbuf.st_size);
+ else
+ descr = xstrdup(name);
+ bool was_multiline = 0;
+ char *tmp = NULL;
+ add_content(&was_multiline, &tmp, "Attached file", descr);
+ free(descr);
+ strbuf_append_str(buf_dsc, tmp);
+ free(tmp);
}
}
@@ -189,25 +209,25 @@ char* make_description_bz(const map_crash_data_t& pCrashData)
return strbuf_free_nobuf(buf_dsc);
}
-char* make_description_logger(const map_crash_data_t& pCrashData)
+char* make_description_logger(crash_data_t *crash_data)
{
struct strbuf *buf_dsc = strbuf_new();
struct strbuf *buf_long_dsc = strbuf_new();
- map_crash_data_t::const_iterator it = pCrashData.begin();
- for (; it != pCrashData.end(); it++)
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, crash_data);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
{
- const char *filename = it->first.c_str();
- const char *type = it->second[CD_TYPE].c_str();
- const char *content = it->second[CD_CONTENT].c_str();
- if ((strcmp(type, CD_TXT) == 0)
- || (strcmp(type, CD_BIN) == 0)
- ) {
+ const char *content = value->content;
+ if (value->flags & (CD_FLAG_TXT|CD_FLAG_BIN))
+ {
/* Skip items we are not interested in */
const char *const *bl = blacklisted_items;
while (*bl)
{
- if (filename == *bl)
+ if (name == *bl)
break;
bl++;
}
@@ -218,12 +238,12 @@ char* make_description_logger(const map_crash_data_t& pCrashData)
bool was_multiline = 0;
char *tmp = NULL;
- add_content(&was_multiline, &tmp, filename, content);
+ add_content(&was_multiline, &tmp, name, content);
if (was_multiline)
{
if (buf_long_dsc->len != 0)
- strbuf_append_char(buf_long_dsc,'\n');
+ strbuf_append_char(buf_long_dsc, '\n');
strbuf_append_str(buf_long_dsc, tmp);
}
@@ -242,29 +262,27 @@ char* make_description_logger(const map_crash_data_t& pCrashData)
return strbuf_free_nobuf(buf_dsc);
}
-char* make_description_reproduce_comment(const map_crash_data_t& pCrashData)
+char* make_description_reproduce_comment(crash_data_t *crash_data)
{
char *repro = NULL;
char *comment = NULL;
+ struct crash_item *value;
- map_crash_data_t::const_iterator end = pCrashData.end();
- map_crash_data_t::const_iterator it;
-
- it = pCrashData.find(FILENAME_REPRODUCE);
- if (it != end)
+ value = get_crash_data_item_or_NULL(crash_data, FILENAME_REPRODUCE);
+ if (value)
{
- if ((it->second[CD_CONTENT].size() > 0)
- && (it->second[CD_CONTENT] != "1.\n2.\n3.\n"))
- {
- repro = xasprintf("\n\nHow to reproduce\n-----\n%s", it->second[CD_CONTENT].c_str());
+ if (value->content[0]
+ && strcmp(value->content, "1.\n2.\n3.\n") != 0
+ ) {
+ repro = xasprintf("\n\nHow to reproduce\n-----\n%s", value->content);
}
}
- it = pCrashData.find(FILENAME_COMMENT);
- if (it != end)
+ value = get_crash_data_item_or_NULL(crash_data, FILENAME_COMMENT);
+ if (value)
{
- if (it->second[CD_CONTENT].size() > 0)
- comment = xasprintf("\n\nComment\n-----\n%s", it->second[CD_CONTENT].c_str());
+ if (value->content[0])
+ comment = xasprintf("\n\nComment\n-----\n%s", value->content);
}
if (!repro && !comment)
diff --git a/src/lib/parse_options.c b/src/lib/parse_options.c
index c1a2c297..3d631461 100644
--- a/src/lib/parse_options.c
+++ b/src/lib/parse_options.c
@@ -1,3 +1,21 @@
+/*
+ Copyright (C) 2010 ABRT team
+ Copyright (C) 2010 RedHat Inc
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
#include <getopt.h>
#include "abrtlib.h"
@@ -6,26 +24,17 @@
#define USAGE_OPTS_WIDTH 24
#define USAGE_GAP 2
-void parse_usage_and_die(const char *usage, const struct options *opt)
+void show_usage_and_die(const char *usage, const struct options *opt)
{
fprintf(stderr, _("Usage: %s\n"), usage);
- if (opt->type != OPTION_GROUP)
- fputc('\n', stderr);
+ fputc('\n', stderr);
for (; opt->type != OPTION_END; opt++)
{
size_t pos;
int pad;
- if (opt->type == OPTION_GROUP)
- {
- fputc('\n', stderr);
- if (*opt->help)
- fprintf(stderr, "%s\n", opt->help);
- continue;
- }
-
pos = fprintf(stderr, " ");
if (opt->short_name)
pos += fprintf(stderr, "-%c", opt->short_name);
@@ -92,6 +101,7 @@ unsigned parse_opts(int argc, char **argv, const struct options *opt,
break;
case OPTION_INTEGER:
case OPTION_STRING:
+ case OPTION_LIST:
curopt->has_arg = required_argument;
if (opt[ii].short_name)
strbuf_append_strf(shortopts, "%c:", opt[ii].short_name);
@@ -101,7 +111,6 @@ unsigned parse_opts(int argc, char **argv, const struct options *opt,
if (opt[ii].short_name)
strbuf_append_strf(shortopts, "%c::", opt[ii].short_name);
break;
- case OPTION_GROUP:
case OPTION_END:
break;
}
@@ -144,7 +153,7 @@ unsigned parse_opts(int argc, char **argv, const struct options *opt,
{
free(longopts);
strbuf_free(shortopts);
- parse_usage_and_die(usage, opt);
+ show_usage_and_die(usage, opt);
}
for (ii = 0; ii < size; ++ii)
@@ -157,17 +166,19 @@ unsigned parse_opts(int argc, char **argv, const struct options *opt,
if (opt[ii].value != NULL) switch (opt[ii].type)
{
case OPTION_BOOL:
- *(int*)opt[ii].value += 1;
+ *(int*)(opt[ii].value) += 1;
break;
case OPTION_INTEGER:
- *(int*)opt[ii].value = xatoi(optarg);
+ *(int*)(opt[ii].value) = xatoi(optarg);
break;
case OPTION_STRING:
case OPTION_OPTSTRING:
if (optarg)
- *(char**)opt[ii].value = (char*)optarg;
+ *(char**)(opt[ii].value) = (char*)optarg;
+ break;
+ case OPTION_LIST:
+ *(GList**)(opt[ii].value) = g_list_append(*(GList**)(opt[ii].value), optarg);
break;
- case OPTION_GROUP:
case OPTION_END:
break;
}
diff --git a/src/lib/parse_options.h b/src/lib/parse_options.h
index 105f081c..82f3c6b8 100644
--- a/src/lib/parse_options.h
+++ b/src/lib/parse_options.h
@@ -1,18 +1,34 @@
+/*
+ Copyright (C) 2010 ABRT team
+ Copyright (C) 2010 RedHat Inc
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
#ifndef PARSE_OPTIONS_H
#define PARSE_OPTIONS_H
-
#ifdef __cplusplus
extern "C" {
#endif
enum parse_opt_type {
OPTION_BOOL,
- OPTION_GROUP,
OPTION_STRING,
OPTION_INTEGER,
OPTION_OPTSTRING,
+ OPTION_LIST,
OPTION_END,
};
@@ -29,22 +45,24 @@ struct options {
* s - short_name
* l - long_name
* v - value
- * a - argh argument help
+ * a - option parameter name (for help text)
* h - help
*/
#define OPT_END() { OPTION_END }
#define OPT_BOOL(s, l, v, h) { OPTION_BOOL, (s), (l), (v), NULL, (h) }
-#define OPT_GROUP(h) { OPTION_GROUP, 0, NULL, NULL, NULL, (h) }
-#define OPT_INTEGER(s, l, v, h) { OPTION_INTEGER, (s), (l), (v), "n", (h) }
+#define OPT_INTEGER(s, l, v, h) { OPTION_INTEGER, (s), (l), (v), "NUM", (h) }
#define OPT_STRING(s, l, v, a, h) { OPTION_STRING, (s), (l), (v), (a), (h) }
#define OPT_OPTSTRING(s, l, v, a, h) { OPTION_OPTSTRING, (s), (l), (v), (a), (h) }
+#define OPT_LIST(s, l, v, a, h) { OPTION_LIST, (s), (l), (v), (a), (h) }
-#define OPT__VERBOSE(v) OPT_BOOL('v', "verbose", (v), "be verbose")
+#define OPT__VERBOSE(v) OPT_BOOL('v', "verbose", (v), _("Be verbose"))
+#define parse_opts abrt_parse_opts
unsigned parse_opts(int argc, char **argv, const struct options *opt,
const char *usage);
-void parse_usage_and_die(const char *usage, const struct options *opt);
+#define show_usage_and_die abrt_show_usage_and_die
+void show_usage_and_die(const char *usage, const struct options *opt);
#ifdef __cplusplus
}
diff --git a/src/lib/parse_release.cpp b/src/lib/parse_release.c
index f9057bfe..b24f928c 100644
--- a/src/lib/parse_release.cpp
+++ b/src/lib/parse_release.c
@@ -19,7 +19,7 @@
#include "abrtlib.h"
// caller is reposible for freeing *product* and *version*
-void parse_release(const char *release, char** product, char** version)
+static void parse_release(const char *release, char** product, char** version, bool append_rhel_version)
{
if (strstr(release, "Rawhide"))
{
@@ -33,21 +33,31 @@ void parse_release(const char *release, char** product, char** version)
if (strstr(release, "Fedora"))
strbuf_append_str(buf_product, "Fedora");
else if (strstr(release, "Red Hat Enterprise Linux"))
- strbuf_append_str(buf_product, "Red Hat Enterprise Linux ");
+ strbuf_append_str(buf_product, "Red Hat Enterprise Linux");
+ else
+ {
+ /* TODO: add logic for parsing other distros' names here */
+ strbuf_append_str(buf_product, release);
+ }
const char *r = strstr(release, "release");
const char *space = r ? strchr(r, ' ') : NULL;
struct strbuf *buf_version = strbuf_new();
- if (space++)
+ if (space)
{
+ space++;
while (*space != '\0' && *space != ' ')
{
/* Eat string like "5.2" */
strbuf_append_char(buf_version, *space);
- if ((strcmp(buf_product->buf, "Red Hat Enterprise Linux ") == 0))
+ if (append_rhel_version
+ && strcmp(buf_product->buf, "Red Hat Enterprise Linux") == 0
+ ) {
+ strbuf_append_char(buf_product, ' ');
strbuf_append_char(buf_product, *space);
-
+ }
+ append_rhel_version = false;
space++;
}
}
@@ -57,3 +67,15 @@ void parse_release(const char *release, char** product, char** version)
VERB3 log("%s: version:'%s' product:'%s'", __func__, *version, *product);
}
+
+void parse_release_for_bz(const char *release, char** product, char** version)
+{
+ /* Fedora/RH bugzilla uses "Red Hat Enterprise Linux N" product RHEL */
+ parse_release(release, product, version, /*append_rhel_version:*/ true);
+}
+
+void parse_release_for_rhts(const char *release, char** product, char** version)
+{
+ /* RHTS uses "Red Hat Enterprise Linux" product for RHEL */
+ parse_release(release, product, version, /*append_rhel_version:*/ false);
+}
diff --git a/src/lib/read_write.h b/src/lib/read_write.h
index 054a1a9a..dc85f33b 100644
--- a/src/lib/read_write.h
+++ b/src/lib/read_write.h
@@ -32,14 +32,20 @@ extern "C" {
// NB: will return short read on error, not -1,
// if some data was read before error occurred
+#define xread abrt_xread
void xread(int fd, void *buf, size_t count);
+#define safe_read abrt_safe_read
ssize_t safe_read(int fd, void *buf, size_t count);
+#define safe_write abrt_safe_write
ssize_t safe_write(int fd, const void *buf, size_t count);
+#define full_read abrt_full_read
ssize_t full_read(int fd, void *buf, size_t count);
+#define full_write abrt_full_write
ssize_t full_write(int fd, const void *buf, size_t count);
+#define full_write_str abrt_full_write_str
ssize_t full_write_str(int fd, const char *buf);
#ifdef __cplusplus
diff --git a/src/lib/run_event.c b/src/lib/run_event.c
index 4ff1070d..e96e762f 100644
--- a/src/lib/run_event.c
+++ b/src/lib/run_event.c
@@ -16,36 +16,78 @@
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
+#include <glob.h>
#include "abrtlib.h"
-int run_event(struct run_event_state *state,
+struct run_event_state *new_run_event_state()
+{
+ return xzalloc(sizeof(struct run_event_state));
+}
+
+void free_run_event_state(struct run_event_state *state)
+{
+ if (state)
+ {
+ free_commands(state);
+ free(state);
+ }
+}
+
+
+/* Asyncronous command execution */
+
+/* It is not yet clear whether we need to re-parse event config file
+ * and re-check the elements in dump dir after each comamnd.
+ *
+ * Consider this config file:
+ *
+ * EVENT=e cmd1
+ * EVENT=e foo=bar cmd2
+ * EVENT=e foo=baz cmd3
+ *
+ * Imagine that element foo existed and was equal to bar at the beginning.
+ * After cmd1, should we execute cmd2 if element foo disappeared?
+ * After cmd1/2, should we execute cmd3 if element foo changed value to baz?
+ *
+ * So far, we read entire config file and select a list of commands to execute,
+ * checking all conditions in the beginning. It is a bit more simple to code up.
+ * But we may want to change it later. Therefore list of commands machinery
+ * is encapsulated in struct run_event_state and public async API:
+ * prepare_commands(state, dir, event);
+ * spawn_next_command(state, dir, event);
+ * free_commands(state);
+ * does not expose it.
+ */
+
+static GList *load_event_config(GList *list,
const char *dump_dir_name,
- const char *event
+ const char *event,
+ const char *conf_file_name
) {
- FILE *conffile = fopen(CONF_DIR"/abrt_event.conf", "r");
+ FILE *conffile = fopen(conf_file_name, "r");
if (!conffile)
{
- error_msg("Can't open '%s'", CONF_DIR"/abrt_event.conf");
- return 1;
+ error_msg("Can't open '%s'", conf_file_name);
+ return list;
}
- close_on_exec_on(fileno(conffile));
-
- /* Export some useful environment variables for children */
- /* Just exporting dump_dir_name isn't always ok: it can be "."
- * and some children want to cd to other directory but still
- * be able to find dump directory by using $DUMP_DIR...
- */
- char *full_name = realpath(dump_dir_name, NULL);
- setenv("DUMP_DIR", (full_name ? full_name : dump_dir_name), 1);
- free(full_name);
- setenv("EVENT", event, 1);
- /* Read, match, and execute lines from abrt_event.conf */
- int retval = -1;
+ /* Read, match, and remember commands to execute */
struct dump_dir *dd = NULL;
- char *line;
- while ((line = xmalloc_fgetline(conffile)) != NULL)
+ char *next_line = xmalloc_fgetline(conffile);
+ while (next_line)
{
+ char *line = next_line;
+ while (1)
+ {
+ next_line = xmalloc_fgetline(conffile);
+ if (!next_line || !isblank(next_line[0]))
+ break;
+ char *old_line = line;
+ line = xasprintf("%s\n%s", line, next_line);
+ free(old_line);
+ free(next_line);
+ }
+
/* Line has form: [VAR=VAL]... PROG [ARGS] */
char *p = skip_whitespace(line);
if (*p == '\0' || *p == '#')
@@ -53,6 +95,43 @@ int run_event(struct run_event_state *state,
VERB3 log("%s: line '%s'", __func__, p);
+ if (strncmp(p, "include", strlen("include")) == 0 && isblank(p[strlen("include")]))
+ {
+ /* include GLOB_PATTERN */
+ p = skip_whitespace(p + strlen("include"));
+
+ const char *last_slash;
+ char *name_to_glob;
+ if (*p != '/'
+ && (last_slash = strrchr(conf_file_name, '/')) != NULL
+ )
+ /* GLOB_PATTERN is relative, and this include is in path/to/file.conf
+ * Construct path/to/GLOB_PATTERN:
+ */
+ name_to_glob = xasprintf("%.*s%s", (int)(last_slash - conf_file_name + 1), conf_file_name, p);
+ else
+ /* Either GLOB_PATTERN is absolute, or this include is in file.conf
+ * (no slashes in its name). Use unchanged GLOB_PATTERN:
+ */
+ name_to_glob = xstrdup(p);
+
+ glob_t globbuf;
+ memset(&globbuf, 0, sizeof(globbuf));
+ VERB3 log("%s: globbing '%s'", __func__, name_to_glob);
+ glob(name_to_glob, 0, NULL, &globbuf);
+ free(name_to_glob);
+ char **name = globbuf.gl_pathv;
+ if (name) while (*name)
+ {
+ VERB3 log("%s: recursing into '%s'", __func__, *name);
+ list = load_event_config(list, dump_dir_name, event, *name);
+ VERB3 log("%s: returned from '%s'", __func__, *name);
+ name++;
+ }
+ globfree(&globbuf);
+ goto next_line;
+ }
+
while (1) /* word loop */
{
char *end_word = skip_non_whitespace(p);
@@ -83,7 +162,11 @@ int run_event(struct run_event_state *state,
{
dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
+ {
+ free(line);
+ free(next_line);
goto stop; /* error (note: dd_opendir logged error msg) */
+ }
}
real_val = malloced_val = dd_load_text_ext(dd, p, DD_FAIL_QUIETLY);
}
@@ -104,54 +187,133 @@ int run_event(struct run_event_state *state,
p = next_word;
} /* end of word loop */
- /* Don't keep dump dir locked across program runs */
- dd_close(dd);
- dd = NULL;
+ /* We found matching line, remember its command */
+ VERB1 log("Adding '%s'", p);
+ overlapping_strcpy(line, p);
+ list = g_list_append(list, line);
+ continue;
+
+ next_line:
+ free(line);
+ } /* end of line loop */
+
+ stop:
+ dd_close(dd);
+ fclose(conffile);
+
+ return list;
+}
+
+int prepare_commands(struct run_event_state *state,
+ const char *dump_dir_name,
+ const char *event
+) {
+ free_commands(state);
- /* We found matching line, execute its command(s) in shell */
+ state->children_count = 0;
+
+ GList *commands = load_event_config(NULL, dump_dir_name, event, CONF_DIR"/abrt_event.conf");
+ state->commands = commands;
+ return commands != NULL;
+}
+
+void free_commands(struct run_event_state *state)
+{
+ list_free_with_free(state->commands);
+ state->commands = NULL;
+ state->command_out_fd = -1;
+ state->command_pid = 0;
+}
+
+/* event parameter is unused for now,
+ * but may be needed if we change implementation later
+ */
+int spawn_next_command(struct run_event_state *state,
+ const char *dump_dir_name,
+ const char *event
+) {
+ if (!state->commands)
+ return -1;
+
+ /* We count it even if fork fails. The counter isn't meant
+ * to count *successful* forks, it is meant to let caller know
+ * whether the event we run has *any* handlers configured, or not.
+ */
+ state->children_count++;
+
+ char *cmd = state->commands->data;
+ VERB1 log("Executing '%s'", cmd);
+
+ /* Export some useful environment variables for children */
+ /* Just exporting dump_dir_name isn't always ok: it can be "."
+ * and some children want to cd to other directory but still
+ * be able to find dump directory by using $DUMP_DIR...
+ */
+ char *full_name = realpath(dump_dir_name, NULL);
+ setenv("DUMP_DIR", (full_name ? full_name : dump_dir_name), 1);
+ free(full_name);
+ setenv("EVENT", event, 1);
+//FIXME: set vars in the child, not here! Need to improve fork_execv_on_steroids...
+
+ char *argv[4];
+ argv[0] = (char*)"/bin/sh";
+ argv[1] = (char*)"-c";
+ argv[2] = cmd;
+ argv[3] = NULL;
+
+ int pipefds[2];
+ state->command_pid = fork_execv_on_steroids(
+ EXECFLG_INPUT_NUL + EXECFLG_OUTPUT + EXECFLG_ERR2OUT,
+ argv,
+ pipefds,
+ /* unsetenv_vec: */ NULL,
+ /* dir: */ dump_dir_name,
+ /* uid(unused): */ 0
+ );
+ state->command_out_fd = pipefds[0];
+
+ state->commands = g_list_remove(state->commands, cmd);
+
+ return 0;
+}
+
+
+/* Syncronous command execution:
+ */
+int run_event_on_dir_name(struct run_event_state *state,
+ const char *dump_dir_name,
+ const char *event
+) {
+ prepare_commands(state, dump_dir_name, event);
+
+ /* Execute every command in shell */
+
+ int retval = 0;
+ while (spawn_next_command(state, dump_dir_name, event) >= 0)
+ {
+ /* Consume log from stdout */
+ FILE *fp = fdopen(state->command_out_fd, "r");
+ if (!fp)
+ die_out_of_memory();
+ char *buf;
+ while ((buf = xmalloc_fgetline(fp)) != NULL)
{
- VERB1 log("Executing '%s'", p);
-
- /* /bin/sh -c 'cmd [args]' NULL */
- char *argv[4];
- char **pp = argv;
- *pp++ = (char*)"/bin/sh";
- *pp++ = (char*)"-c";
- *pp++ = (char*)p;
- *pp = NULL;
- int pipefds[2];
- pid_t pid = fork_execv_on_steroids(EXECFLG_INPUT_NUL + EXECFLG_OUTPUT + EXECFLG_ERR2OUT,
- argv,
- pipefds,
- /* unsetenv_vec: */ NULL,
- /* dir: */ dump_dir_name,
- /* uid(unused): */ 0
- );
- free(line);
- line = NULL;
-
- /* Consume log from stdout */
- FILE *fp = fdopen(pipefds[0], "r");
- if (!fp)
- die_out_of_memory();
- char *buf;
- while ((buf = xmalloc_fgetline(fp)) != NULL)
- {
- if (state->logging_callback)
- buf = state->logging_callback(buf, state->logging_param);
- free(buf);
- }
- fclose(fp); /* Got EOF, close. This also closes pipefds[0] */
+ if (state->logging_callback)
+ buf = state->logging_callback(buf, state->logging_param);
+ free(buf);
+ }
+ fclose(fp); /* Got EOF, close. This also closes state->command_out_fd */
- /* Wait for child to actually exit, collect status */
- int status;
- waitpid(pid, &status, 0);
+ /* Wait for child to actually exit, collect status */
+ int status;
+ waitpid(state->command_pid, &status, 0);
- retval = WEXITSTATUS(status);
- if (WIFSIGNALED(status))
- retval = WTERMSIG(status) + 128;
- if (retval != 0)
- break;
+ retval = WEXITSTATUS(status);
+ if (WIFSIGNALED(status))
+ retval = WTERMSIG(status) + 128;
+ if (retval != 0)
+ {
+ break;
}
if (state->post_run_callback)
@@ -160,26 +322,49 @@ int run_event(struct run_event_state *state,
if (retval != 0)
break;
}
+ }
- next_line:
- free(line);
- } /* end of line loop */
-
- stop:
- free(line);
- dd_close(dd);
- fclose(conffile);
+ free_commands(state);
return retval;
}
-char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const char *pfx)
+int run_event_on_crash_data(struct run_event_state *state, crash_data_t *data, const char *event)
{
- FILE *conffile = fopen(CONF_DIR"/abrt_event.conf", "r");
+ state->children_count = 0;
+
+ struct dump_dir *dd = create_dump_dir_from_crash_data(data, NULL);
+ if (!dd)
+ return -1;
+ char *dir_name = xstrdup(dd->dd_dirname);
+ dd_close(dd);
+
+ int r = run_event_on_dir_name(state, dir_name, event);
+
+ g_hash_table_remove_all(data);
+ dd = dd_opendir(dir_name, 0);
+ free(dir_name);
+ if (dd)
+ {
+ load_crash_data_from_dump_dir(data, dd);
+ dd_delete(dd);
+ }
+ return r;
+}
+
+
+/* TODO: very similar to run_event_helper, try to combine into one fn? */
+static int list_possible_events_helper(struct strbuf *result,
+ struct dump_dir *dd,
+ const char *dump_dir_name,
+ const char *pfx,
+ const char *conf_file_name
+) {
+ FILE *conffile = fopen(conf_file_name, "r");
if (!conffile)
{
- error_msg("Can't open '%s'", CONF_DIR"/abrt_event.conf");
- return NULL;
+ error_msg("Can't open '%s'", conf_file_name);
+ return 0;
}
/* We check "dump_dir_name == NULL" later.
@@ -189,11 +374,23 @@ char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const
if (dd)
dump_dir_name = NULL;
+ int error = 0;
unsigned pfx_len = strlen(pfx);
- struct strbuf *result = strbuf_new();
- char *line;
- while ((line = xmalloc_fgetline(conffile)) != NULL)
+ char *next_line = xmalloc_fgetline(conffile);
+ while (next_line)
{
+ char *line = next_line;
+ while (1)
+ {
+ next_line = xmalloc_fgetline(conffile);
+ if (!next_line || !isblank(next_line[0]))
+ break;
+ char *old_line = line;
+ line = xasprintf("%s\n%s", line, next_line);
+ free(old_line);
+ free(next_line);
+ }
+
/* Line has form: [VAR=VAL]... PROG [ARGS] */
char *p = skip_whitespace(line);
if (*p == '\0' || *p == '#')
@@ -201,6 +398,45 @@ char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const
VERB3 log("%s: line '%s'", __func__, p);
+ if (strncmp(p, "include", strlen("include")) == 0 && isblank(p[strlen("include")]))
+ {
+ /* include GLOB_PATTERN */
+ p = skip_whitespace(p + strlen("include"));
+
+ const char *last_slash;
+ char *name_to_glob;
+ if (*p != '/'
+ && (last_slash = strrchr(conf_file_name, '/')) != NULL
+ )
+ /* GLOB_PATTERN is relative, and this include is in path/to/file.conf
+ * Construct path/to/GLOB_PATTERN:
+ */
+ name_to_glob = xasprintf("%.*s%s", (int)(last_slash - conf_file_name + 1), conf_file_name, p);
+ else
+ /* Either GLOB_PATTERN is absolute, or this include is in file.conf
+ * (no slashes in its name). Use unchanged GLOB_PATTERN:
+ */
+ name_to_glob = xstrdup(p);
+
+ glob_t globbuf;
+ memset(&globbuf, 0, sizeof(globbuf));
+ VERB3 log("%s: globbing '%s'", __func__, name_to_glob);
+ glob(name_to_glob, 0, NULL, &globbuf);
+ free(name_to_glob);
+ char **name = globbuf.gl_pathv;
+ if (name) while (*name)
+ {
+ VERB3 log("%s: recursing into '%s'", __func__, *name);
+ error = list_possible_events_helper(result, dd, dump_dir_name, pfx, *name);
+ VERB3 log("%s: returned from '%s'", __func__, *name);
+ if (error)
+ break;
+ name++;
+ }
+ globfree(&globbuf);
+ goto next_line;
+ }
+
while (1) /* word loop */
{
char *end_word = skip_non_whitespace(p);
@@ -233,13 +469,21 @@ char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const
goto next_word;
dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
+ {
+ error = -1;
+ free(line);
+ free(next_line);
goto stop; /* error (note: dd_opendir logged error msg) */
+ }
}
char *real_val = dd_load_text_ext(dd, p, DD_FAIL_QUIETLY);
/* Does VAL match? */
if (strcmp(real_val, line_val) != 0)
{
- VERB3 log("var '%s': '%s'!='%s', skipping line", p, real_val, line_val);
+ VERB3 log("var '%s': '%.*s'!='%s', skipping line",
+ p,
+ (int)(strchrnul(real_val, '\n') - real_val), real_val,
+ line_val);
free(real_val);
goto next_line; /* no */
}
@@ -265,10 +509,18 @@ char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const
} /* end of line loop */
stop:
- free(line);
if (dump_dir_name != NULL)
dd_close(dd);
fclose(conffile);
+ return error;
+}
+
+char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const char *pfx)
+{
+ struct strbuf *result = strbuf_new();
+ int error = list_possible_events_helper(result, dd, dump_dir_name, pfx, CONF_DIR"/abrt_event.conf");
+ if (error)
+ strbuf_clear(result);
return strbuf_free_nobuf(result);
}
diff --git a/src/lib/spawn.c b/src/lib/spawn.c
index 068f4ac7..f6b7263c 100644
--- a/src/lib/spawn.c
+++ b/src/lib/spawn.c
@@ -108,7 +108,7 @@ pid_t fork_execv_on_steroids(int flags,
execvp(argv[0], argv);
if (!(flags & EXECFLG_QUIET))
perror_msg("Can't execute '%s'", argv[0]);
- exit(127); /* shell uses this exitcode in this case */
+ exit(127); /* shell uses this exit code in this case */
}
if (flags & EXECFLG_INPUT) {
diff --git a/src/lib/steal_directory.c b/src/lib/steal_directory.c
new file mode 100644
index 00000000..a77861ee
--- /dev/null
+++ b/src/lib/steal_directory.c
@@ -0,0 +1,40 @@
+#include "abrtlib.h"
+
+struct dump_dir *steal_directory(const char *base_dir, const char *dump_dir_name)
+{
+ const char *base_name = strrchr(dump_dir_name, '/');
+ if (base_name)
+ base_name++;
+ else
+ base_name = dump_dir_name;
+
+ struct dump_dir *dd_dst;
+ unsigned count = 100;
+ char *dst_dir_name = concat_path_file(base_dir, base_name);
+ while (1)
+ {
+ dd_dst = dd_create(dst_dir_name, (uid_t)-1);
+ free(dst_dir_name);
+ if (dd_dst)
+ break;
+ if (--count == 0)
+ {
+ error_msg("Can't create new dump dir in '%s'", base_dir);
+ return NULL;
+ }
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ dst_dir_name = xasprintf("%s/%s.%u", base_dir, base_name, (int)tv.tv_usec);
+ }
+
+ VERB1 log("Creating copy in '%s'", dd_dst->dd_dirname);
+ if (copy_file_recursive(dump_dir_name, dd_dst->dd_dirname) < 0)
+ {
+ /* error. copy_file_recursive already emitted error message */
+ /* Don't leave half-copied dir lying around */
+ dd_delete(dd_dst);
+ return NULL;
+ }
+
+ return dd_dst;
+}
diff --git a/src/lib/strbuf.c b/src/lib/strbuf.c
index 04a35998..f56815a0 100644
--- a/src/lib/strbuf.c
+++ b/src/lib/strbuf.c
@@ -37,7 +37,7 @@ int suffixcmp(const char *str, const char *suffix)
return strcmp(str + len_minus_suflen, suffix);
}
-struct strbuf *strbuf_new()
+struct strbuf *strbuf_new(void)
{
struct strbuf *buf = xzalloc(sizeof(*buf));
/*buf->len = 0; - done by xzalloc */
diff --git a/src/lib/strbuf.h b/src/lib/strbuf.h
index dc45a199..44c6599a 100644
--- a/src/lib/strbuf.h
+++ b/src/lib/strbuf.h
@@ -39,13 +39,15 @@ struct strbuf
* It never returns NULL. The returned pointer must be released by
* calling the function strbuf_free().
*/
-struct strbuf *strbuf_new();
+#define strbuf_new abrt_strbuf_new
+struct strbuf *strbuf_new(void);
/**
* Releases the memory held by the string buffer.
* @param strbuf
* If the strbuf is NULL, no operation is performed.
*/
+#define strbuf_free abrt_strbuf_free
void strbuf_free(struct strbuf *strbuf);
/**
@@ -53,24 +55,28 @@ void strbuf_free(struct strbuf *strbuf);
* string buffer is returned. Caller is responsible to release the
* returned memory using free().
*/
+#define strbuf_free_nobuf abrt_strbuf_free_nobuf
char* strbuf_free_nobuf(struct strbuf *strbuf);
/**
* The string content is set to an empty string, erasing any previous
* content and leaving its length at 0 characters.
*/
+#define strbuf_clear abrt_strbuf_clear
void strbuf_clear(struct strbuf *strbuf);
/**
* The current content of the string buffer is extended by adding a
* character c at its end.
*/
+#define strbuf_append_char abrt_strbuf_append_char
struct strbuf *strbuf_append_char(struct strbuf *strbuf, char c);
/**
* The current content of the string buffer is extended by adding a
* string str at its end.
*/
+#define strbuf_append_str abrt_strbuf_append_str
struct strbuf *strbuf_append_str(struct strbuf *strbuf,
const char *str);
@@ -78,6 +84,7 @@ struct strbuf *strbuf_append_str(struct strbuf *strbuf,
* The current content of the string buffer is extended by inserting a
* string str at its beginning.
*/
+#define strbuf_prepend_str abrt_strbuf_prepend_str
struct strbuf *strbuf_prepend_str(struct strbuf *strbuf,
const char *str);
@@ -85,6 +92,7 @@ struct strbuf *strbuf_prepend_str(struct strbuf *strbuf,
* The current content of the string buffer is extended by adding a
* sequence of data formatted as the format argument specifies.
*/
+#define strbuf_append_strf abrt_strbuf_append_strf
struct strbuf *strbuf_append_strf(struct strbuf *strbuf,
const char *format, ...);
@@ -93,6 +101,7 @@ struct strbuf *strbuf_append_strf(struct strbuf *strbuf,
* sequence of data formatted as the format argument specifies at the
* buffer beginning.
*/
+#define strbuf_prepend_strf abrt_strbuf_prepend_strf
struct strbuf *strbuf_prepend_strf(struct strbuf *strbuf,
const char *format, ...);
diff --git a/src/lib/stringops.cpp b/src/lib/stringops.cpp
deleted file mode 100644
index 7bc5413f..00000000
--- a/src/lib/stringops.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- Copyright (C) 2010 ABRT team
- Copyright (C) 2010 RedHat Inc
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#include "abrtlib.h"
-
-void parse_args(const char *psArgs, vector_string_t& pArgs, int quote)
-{
- unsigned ii;
- bool inside_quotes = false;
- std::string item;
-
- for (ii = 0; psArgs[ii]; ii++)
- {
- if (quote != -1)
- {
- if (psArgs[ii] == quote)
- {
- inside_quotes = !inside_quotes;
- continue;
- }
- /* inside quotes we support escaping with \x */
- if (inside_quotes && psArgs[ii] == '\\' && psArgs[ii+1])
- {
- ii++;
- item += psArgs[ii];
- continue;
- }
- }
- if (psArgs[ii] == ',' && !inside_quotes)
- {
- pArgs.push_back(item);
- item.clear();
- continue;
- }
- item += psArgs[ii];
- }
-
- if (item.size() != 0)
- {
- pArgs.push_back(item);
- }
-}
diff --git a/src/lib/xatonum.c b/src/lib/xatonum.c
index 3b22071f..1a92db7f 100644
--- a/src/lib/xatonum.c
+++ b/src/lib/xatonum.c
@@ -28,7 +28,7 @@ inval:
error_msg_and_die("invalid number '%s'", numstr);
}
-int xatoi_u(const char *numstr)
+int xatoi_positive(const char *numstr)
{
unsigned r = xatou(numstr);
if (r > (unsigned)INT_MAX)
@@ -41,7 +41,7 @@ int xatoi(const char *numstr)
unsigned r;
if (*numstr != '-')
- return xatoi_u(numstr);
+ return xatoi_positive(numstr);
r = xatou(numstr + 1);
if (r > (unsigned)INT_MAX + 1)
diff --git a/src/lib/xfuncs.c b/src/lib/xfuncs.c
index d5166037..f451693a 100644
--- a/src/lib/xfuncs.c
+++ b/src/lib/xfuncs.c
@@ -26,12 +26,18 @@
/* Turn on nonblocking I/O on a fd */
int ndelay_on(int fd)
{
- return fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);
+ int flags = fcntl(fd, F_GETFL);
+ if (flags & O_NONBLOCK)
+ return 0;
+ return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
}
int ndelay_off(int fd)
{
- return fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~O_NONBLOCK);
+ int flags = fcntl(fd, F_GETFL);
+ if (!(flags & O_NONBLOCK))
+ return 0;
+ return fcntl(fd, F_SETFL, flags & ~O_NONBLOCK);
}
int close_on_exec_on(int fd)
@@ -39,16 +45,6 @@ int close_on_exec_on(int fd)
return fcntl(fd, F_SETFD, FD_CLOEXEC);
}
-#if 0 /* unused */
-void *xcalloc(size_t nmemb, size_t size)
-{
- void *ptr = calloc(nmemb, size);
- if (!ptr && nmemb && size)
- die_out_of_memory();
- return ptr;
-}
-#endif
-
// Die if we can't allocate size bytes of memory.
void* xmalloc(size_t size)
{
@@ -290,7 +286,7 @@ int xopen(const char *pathname, int flags)
void xunlink(const char *pathname)
{
if (unlink(pathname))
- perror_msg_and_die("can't remove file '%s'", pathname);
+ perror_msg_and_die("Can't remove file '%s'", pathname);
}
#if 0 //UNUSED
diff --git a/src/plugins/CCpp.cpp b/src/plugins/CCpp.cpp
deleted file mode 100644
index e6807ea7..00000000
--- a/src/plugins/CCpp.cpp
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- CCpp.cpp
-
- Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com)
- Copyright (C) 2009 RedHat inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#include <set>
-#include "abrtlib.h"
-#include "CCpp.h"
-#include "abrt_exception.h"
-#include "comm_layer_inner.h"
-
-using namespace std;
-
-#define CORE_PATTERN_IFACE "/proc/sys/kernel/core_pattern"
-#define CORE_PATTERN "|"CCPP_HOOK_PATH" "DEBUG_DUMPS_DIR" %p %s %u %c"
-#define CORE_PIPE_LIMIT_IFACE "/proc/sys/kernel/core_pipe_limit"
-/* core_pipe_limit specifies how many dump_helpers might run at the same time
- * 0 - means unlimited, but it's not guaranteed that /proc/<pid> of crashing
- * process will be available for dump_helper
- * 4 - means that 4 dump_helpers can run at the same time (the rest will also
- * run, but they will fail to read /proc/<pid>)
- * This should be enough for ABRT, we can miss some crashes, but what are
- * the odds that more processes crash at the same time?
- * The value of 4 has been recommended by nhorman.
- */
-#define CORE_PIPE_LIMIT "4"
-
-#define DEBUGINFO_CACHE_DIR LOCALSTATEDIR"/cache/abrt-di"
-
-CAnalyzerCCpp::CAnalyzerCCpp() :
- m_bBacktrace(true),
- m_bBacktraceRemotes(false),
- m_bMemoryMap(false),
- m_bInstallDebugInfo(true),
- m_nDebugInfoCacheMB(4000),
- m_nGdbTimeoutSec(60)
-{}
-
-/*
- this is just a workaround until kernel changes it's behavior
- when handling pipes in core_pattern
-*/
-#ifdef HOSTILE_KERNEL
-#define CORE_SIZE_PATTERN "Max core file size=1:unlimited"
-static int isdigit_str(char *str)
-{
- do {
- if (*str < '0' || *str > '9')
- return 0;
- } while (*++str);
- return 1;
-}
-
-static int set_limits()
-{
- DIR *dir = opendir("/proc");
- if (!dir) {
- /* this shouldn't fail, but to be safe.. */
- return 1;
- }
-
- struct dirent *ent;
- while ((ent = readdir(dir)) != NULL) {
- if (!isdigit_str(ent->d_name))
- continue;
-
- char limits_name[sizeof("/proc/%s/limits") + sizeof(long)*3];
- snprintf(limits_name, sizeof(limits_name), "/proc/%s/limits", ent->d_name);
- FILE *limits_fp = fopen(limits_name, "r");
- if (!limits_fp) {
- break;
- }
-
- char line[128];
- char *ulimit_c = NULL;
- while (1) {
- if (fgets(line, sizeof(line)-1, limits_fp) == NULL)
- break;
- if (strncmp(line, "Max core file size", sizeof("Max core file size")-1) == 0) {
- ulimit_c = skip_whitespace(line + sizeof("Max core file size")-1);
- skip_non_whitespace(ulimit_c)[0] = '\0';
- break;
- }
- }
- fclose(limits_fp);
- if (!ulimit_c || ulimit_c[0] != '0' || ulimit_c[1] != '\0') {
- /*process has nonzero ulimit -c, so need to modify it*/
- continue;
- }
- /* echo -n 'Max core file size=1:unlimited' >/proc/PID/limits */
- int fd = open(limits_name, O_WRONLY);
- if (fd >= 0) {
- errno = 0;
- /*full_*/
- ssize_t n = write(fd, CORE_SIZE_PATTERN, sizeof(CORE_SIZE_PATTERN)-1);
- if (n < sizeof(CORE_SIZE_PATTERN)-1)
- log("warning: can't write core_size limit to: %s", limits_name);
- close(fd);
- }
- else
- {
- log("warning: can't open %s for writing", limits_name);
- }
- }
- closedir(dir);
- return 0;
-}
-#endif /* HOSTILE_KERNEL */
-
-void CAnalyzerCCpp::Init()
-{
- FILE *fp = fopen(CORE_PATTERN_IFACE, "r");
- if (fp)
- {
- char line[PATH_MAX];
- if (fgets(line, sizeof(line), fp))
- m_sOldCorePattern = line;
- fclose(fp);
- }
- if (m_sOldCorePattern[0] == '|')
- {
- if (m_sOldCorePattern == CORE_PATTERN)
- {
- log("warning: %s already contains %s, "
- "did abrt daemon crash recently?",
- CORE_PATTERN_IFACE, CORE_PATTERN);
- /* There is no point in "restoring" CORE_PATTERN_IFACE
- * to CORE_PATTERN on exit. Will restore to a default value:
- */
- m_sOldCorePattern = "core";
- } else {
- log("warning: %s was already set to run a crash analyser (%s), "
- "abrt may interfere with it",
- CORE_PATTERN_IFACE, CORE_PATTERN);
- }
- }
-#ifdef HOSTILE_KERNEL
- if (set_limits() != 0)
- log("warning: failed to set core_size limit, ABRT won't detect crashes in"
- "compiled apps");
-#endif
-
- fp = fopen(CORE_PATTERN_IFACE, "w");
- if (fp)
- {
- fputs(CORE_PATTERN, fp);
- fclose(fp);
- }
-
- /* read the core_pipe_limit and change it if it's == 0
- otherwise the abrt-hook-ccpp won't be able to read /proc/<pid>
- of the crashing process
- */
- fp = fopen(CORE_PIPE_LIMIT_IFACE, "r");
- if (fp)
- {
- /* we care only about the first char, if it's
- * not '0' then we don't have to change it,
- * because it means that it's already != 0
- */
- char pipe_limit[2];
- if (!fgets(pipe_limit, sizeof(pipe_limit), fp))
- pipe_limit[0] = '1'; /* not 0 */
- fclose(fp);
- if (pipe_limit[0] == '0')
- {
- fp = fopen(CORE_PIPE_LIMIT_IFACE, "w");
- if (fp)
- {
- fputs(CORE_PIPE_LIMIT, fp);
- fclose(fp);
- }
- else
- {
- log("warning: failed to set core_pipe_limit, ABRT won't detect"
- "crashes in compiled apps if kernel > 2.6.31");
- }
- }
- }
-}
-
-void CAnalyzerCCpp::DeInit()
-{
- /* no need to restore the core_pipe_limit, because it's only used
- when there is s pipe in core_pattern
- */
- FILE *fp = fopen(CORE_PATTERN_IFACE, "w");
- if (fp)
- {
- fputs(m_sOldCorePattern.c_str(), fp);
- fclose(fp);
- }
-}
-
-void CAnalyzerCCpp::SetSettings(const map_plugin_settings_t& pSettings)
-{
- m_pSettings = pSettings;
-
- map_plugin_settings_t::const_iterator end = pSettings.end();
- map_plugin_settings_t::const_iterator it;
- it = pSettings.find("Backtrace");
- if (it != end)
- {
- m_bBacktrace = string_to_bool(it->second.c_str());
- }
- it = pSettings.find("BacktraceRemotes");
- if (it != end)
- {
- m_bBacktraceRemotes = string_to_bool(it->second.c_str());
- }
- it = pSettings.find("MemoryMap");
- if (it != end)
- {
- m_bMemoryMap = string_to_bool(it->second.c_str());
- }
- it = pSettings.find("DebugInfo");
- if (it != end)
- {
- m_sDebugInfo = it->second;
- }
- it = pSettings.find("DebugInfoCacheMB");
- if (it != end)
- {
- m_nDebugInfoCacheMB = xatou(it->second.c_str());
- }
- it = pSettings.find("GdbTimeoutSec");
- if (it != end)
- {
- m_nGdbTimeoutSec = xatoi_u(it->second.c_str());
- }
- it = pSettings.find("InstallDebugInfo");
- if (it == end) //compat, remove after 0.0.11
- it = pSettings.find("InstallDebuginfo");
- if (it != end)
- {
- m_bInstallDebugInfo = string_to_bool(it->second.c_str());
- }
- m_sDebugInfoDirs = DEBUGINFO_CACHE_DIR;
- it = pSettings.find("ReadonlyLocalDebugInfoDirs");
- if (it != end)
- {
- m_sDebugInfoDirs += ':';
- m_sDebugInfoDirs += it->second;
- }
-}
-
-//ok to delete?
-//const map_plugin_settings_t& CAnalyzerCCpp::GetSettings()
-//{
-// m_pSettings["MemoryMap"] = m_bMemoryMap ? "yes" : "no";
-// m_pSettings["DebugInfo"] = m_sDebugInfo;
-// m_pSettings["DebugInfoCacheMB"] = to_string(m_nDebugInfoCacheMB);
-// m_pSettings["InstallDebugInfo"] = m_bInstallDebugInfo ? "yes" : "no";
-//
-// return m_pSettings;
-//}
-
-PLUGIN_INFO(ANALYZER,
- CAnalyzerCCpp,
- "CCpp",
- "0.0.1",
- _("Analyzes crashes in C/C++ programs"),
- "zprikryl@redhat.com",
- "https://fedorahosted.org/abrt/wiki",
- "");
diff --git a/src/plugins/CCpp.h b/src/plugins/CCpp.h
deleted file mode 100644
index e95b4d09..00000000
--- a/src/plugins/CCpp.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- CCpp.h - header file for C/C++ analyzer plugin
- - it can get UUID and memory maps from core files
-
- Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com)
- Copyright (C) 2009 RedHat inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-#ifndef CCPP_H_
-#define CCPP_H_
-
-#include <string>
-#include "plugin.h"
-#include "analyzer.h"
-
-class CAnalyzerCCpp : public CAnalyzer
-{
- private:
- bool m_bBacktrace;
- bool m_bBacktraceRemotes;
- bool m_bMemoryMap;
- bool m_bInstallDebugInfo;
- unsigned m_nDebugInfoCacheMB;
- unsigned m_nGdbTimeoutSec;
- std::string m_sOldCorePattern;
- std::string m_sDebugInfo;
- std::string m_sDebugInfoDirs;
-
- public:
- CAnalyzerCCpp();
- virtual void Init();
- virtual void DeInit();
- virtual void SetSettings(const map_plugin_settings_t& pSettings);
-};
-
-#endif /* CCPP */
diff --git a/src/plugins/Kerneloops.conf b/src/plugins/Kerneloops.conf
index 67ad07b9..e65e176f 100644
--- a/src/plugins/Kerneloops.conf
+++ b/src/plugins/Kerneloops.conf
@@ -4,10 +4,4 @@ Enabled = yes
# Set to "yes" for compatibility with kerneloops.org tool.
InformAllUsers = yes
-# Kerneloops Scanner configuration
-##################################
-SysLogFile = /var/log/messages
-
-# KerneloopsReporter configuration
-##################################
SubmitURL = http://submit.kerneloops.org/submitoops.php
diff --git a/src/plugins/KerneloopsScanner.cpp b/src/plugins/KerneloopsScanner.cpp
deleted file mode 100644
index 93f37e07..00000000
--- a/src/plugins/KerneloopsScanner.cpp
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- Copyright (C) 2010 ABRT team
- Copyright (C) 2010 RedHat Inc
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
- Authors:
- Anton Arapov <anton@redhat.com>
- Arjan van de Ven <arjan@linux.intel.com>
-*/
-#include <syslog.h>
-#include <asm/unistd.h> /* __NR_syslog */
-#include <glib.h>
-#include "abrtlib.h"
-#include "abrt_exception.h"
-#include "comm_layer_inner.h"
-#include "KerneloopsSysLog.h"
-#include "KerneloopsScanner.h"
-
-// TODO: https://fedorahosted.org/abrt/ticket/78
-
-static int scan_dmesg(GList **oopsList)
-{
- VERB1 log("Scanning dmesg");
-
- /* syslog(3) - read the last len bytes from the log buffer
- * (non-destructively), but dont read more than was written
- * into the buffer since the last"clear ring buffer" cmd.
- * Returns the number of bytes read.
- */
- char *buffer = (char*)xzalloc(16*1024);
- syscall(__NR_syslog, 3, buffer, 16*1024 - 1); /* always NUL terminated */
- int cnt_FoundOopses = extract_oopses(oopsList, buffer, strlen(buffer));
- free(buffer);
-
- return cnt_FoundOopses;
-}
-
-
-/* "dumpoops" tool uses these two functions too */
-extern "C" {
-
-int scan_syslog_file(GList **oopsList, const char *filename, time_t *last_changed_p)
-{
- VERB1 log("Scanning syslog file '%s'", filename);
-
- char *buffer;
- struct stat statb;
- int fd;
- int cnt_FoundOopses;
- ssize_t sz;
- fd = open(filename, O_RDONLY);
- if (fd < 0)
- return 0;
- statb.st_size = 0; /* paranoia */
- if (fstat(fd, &statb) != 0 || statb.st_size < 1)
- {
- close(fd);
- return 0;
- }
-
- if (last_changed_p != NULL)
- {
- if (*last_changed_p == statb.st_mtime)
- {
- VERB1 log("Syslog file '%s' hasn't changed since last scan, skipping", filename);
- close(fd);
- return 0;
- }
- *last_changed_p = statb.st_mtime;
- }
-
- /*
- * In theory we have a race here, since someone could spew
- * to /var/log/messages before we read it in... we try to
- * deal with it by reading at most 10kbytes extra. If there's
- * more than that.. any oops will be in dmesg anyway.
- * Do not try to allocate an absurd amount of memory; ignore
- * older log messages because they are unlikely to have
- * sufficiently recent data to be useful. 32MB is more
- * than enough; it's not worth looping through more log
- * if the log is larger than that.
- */
- sz = statb.st_size + 10*1024;
- if (statb.st_size > (32*1024*1024 - 10*1024))
- {
- xlseek(fd, statb.st_size - (32*1024*1024 - 10*1024), SEEK_SET);
- sz = 32*1024*1024;
- }
- buffer = (char*)xzalloc(sz);
- sz = full_read(fd, buffer, sz);
- close(fd);
-
- cnt_FoundOopses = 0;
- if (sz > 0)
- cnt_FoundOopses = extract_oopses(oopsList, buffer, sz);
- free(buffer);
-
- return cnt_FoundOopses;
-}
-
-/* returns number of errors */
-int save_oops_to_debug_dump(GList **oopsList)
-{
- unsigned countdown = 16; /* do not report hundreds of oopses */
- unsigned idx = g_list_length(*oopsList);
- time_t t = time(NULL);
- pid_t my_pid = getpid();
-
- VERB1 log("Saving %u oopses as crash dump dirs", idx >= countdown ? countdown-1 : idx);
-
- char *tainted_str = NULL;
- /* once tainted flag is set to 1, only restart can reset the flag to 0 */
- FILE *tainted_fd = fopen("/proc/sys/kernel/tainted", "r");
- if (tainted_fd)
- {
- tainted_str = xmalloc_fgetline(tainted_fd);
- fclose(tainted_fd);
- }
- else
- error_msg("/proc/sys/kernel/tainted does not exist");
-
- int errors = 0;
-
- while (idx != 0 && --countdown != 0)
- {
- char path[sizeof(DEBUG_DUMPS_DIR"/kerneloops-%lu-%lu-%lu") + 3 * sizeof(long)*3];
- sprintf(path, DEBUG_DUMPS_DIR"/kerneloops-%lu-%lu-%lu", (long)t, (long)my_pid, (long)idx);
-
- char *first_line = (char*)g_list_nth_data(*oopsList,--idx);
- char *second_line = (char*)strchr(first_line, '\n'); /* never NULL */
- *second_line++ = '\0';
-
- struct dump_dir *dd = dd_create(path, /*uid:*/ 0);
- if (dd)
- {
- dd_save_text(dd, FILENAME_ANALYZER, "Kerneloops");
- dd_save_text(dd, FILENAME_EXECUTABLE, "kernel");
- dd_save_text(dd, FILENAME_KERNEL, first_line);
- dd_save_text(dd, FILENAME_CMDLINE, "not_applicable");
- dd_save_text(dd, FILENAME_BACKTRACE, second_line);
- /* Optional, makes generated bz more informative */
- strchrnul(second_line, '\n')[0] = '\0';
- dd_save_text(dd, FILENAME_REASON, second_line);
-
- if (tainted_str && tainted_str[0] != '0')
- dd_save_text(dd, FILENAME_TAINTED, tainted_str);
-
- free(tainted_str);
- dd_close(dd);
- }
- else
- errors++;
- }
-
- return errors;
-}
-
-} /* extern "C" */
-
-
-CKerneloopsScanner::CKerneloopsScanner()
-{
- int cnt_FoundOopses;
- m_syslog_last_change = 0;
-
- /* Scan dmesg, on first call only */
- GList *oopsList = NULL;
- cnt_FoundOopses = scan_dmesg(&oopsList);
- if (cnt_FoundOopses > 0)
- {
- int errors = save_oops_to_debug_dump(&oopsList);
- if (errors > 0)
- log("%d errors while dumping oopses", errors);
- }
-}
-
-void CKerneloopsScanner::Run(const char *pActionDir, const char *pArgs, int force)
-{
- const char *syslog_file = "/var/log/messages";
- map_plugin_settings_t::const_iterator it = m_pSettings.find("SysLogFile");
- if (it != m_pSettings.end())
- syslog_file = it->second.c_str();
-
- GList *oopsList = NULL;
- int cnt_FoundOopses = scan_syslog_file(&oopsList, syslog_file, &m_syslog_last_change);
- if (cnt_FoundOopses > 0)
- {
- int errors = save_oops_to_debug_dump(&oopsList);
- if (errors > 0)
- log("%d errors while dumping oopses", errors);
- /*
- * This marker in syslog file prevents us from
- * re-parsing old oopses (any oops before it is
- * ignored by scan_syslog_file()). The only problem
- * is that we can't be sure here that syslog_file
- * is the file where syslog(xxx) stuff ends up.
- */
- openlog("abrt", 0, LOG_KERN);
- syslog(LOG_WARNING,
- "Kerneloops: Reported %u kernel oopses to Abrt",
- cnt_FoundOopses);
- closelog();
- }
-
- for (GList *li = oopsList; li != NULL; li = g_list_next(li))
- free((char*)li->data);
- g_list_free(oopsList);
-}
-
-PLUGIN_INFO(ACTION,
- CKerneloopsScanner,
- "KerneloopsScanner",
- "0.0.1",
- _("Periodically scans for and saves kernel oopses"),
- "anton@redhat.com",
- "http://people.redhat.com/aarapov",
- "");
diff --git a/src/plugins/KerneloopsScanner.h b/src/plugins/KerneloopsScanner.h
deleted file mode 100644
index 2bddb0f4..00000000
--- a/src/plugins/KerneloopsScanner.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2007, Intel Corporation
- * Copyright 2009, Red Hat Inc.
- *
- * This file is part of Abrt.
- *
- * This program file 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; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program in a file named COPYING; if not, write to the
- * Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301 USA
- *
- * Authors:
- * Anton Arapov <anton@redhat.com>
- * Arjan van de Ven <arjan@linux.intel.com>
- */
-#ifndef KERNELOOPSSCANNER_H_
-#define KERNELOOPSSCANNER_H_
-
-#include "abrt_types.h"
-#include "plugin.h"
-#include "action.h"
-
-class CKerneloopsScanner : public CAction
-{
- private:
- time_t m_syslog_last_change;
- public:
- CKerneloopsScanner();
- virtual void Run(const char *pActionDir, const char *pArgs, int force);
-};
-
-#endif
diff --git a/src/plugins/KerneloopsSysLog.cpp b/src/plugins/KerneloopsSysLog.cpp
deleted file mode 100644
index 68f309bc..00000000
--- a/src/plugins/KerneloopsSysLog.cpp
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- Copyright (C) 2010 ABRT team
- Copyright (C) 2010 RedHat Inc
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- Authors:
- Anton Arapov <anton@redhat.com>
- Arjan van de Ven <arjan@linux.intel.com>
- */
-#include "abrtlib.h"
-#include "KerneloopsSysLog.h"
-#include <glib.h>
-
-static void queue_oops(GList **vec, const char *data, const char *version)
-{
- char *ver_data = xasprintf("%s\n%s", version, data);
- *vec = g_list_append(*vec, ver_data);
-}
-
-/*
- * extract_version tries to find the kernel version in given data
- */
-static char *extract_version(const char *linepointer)
-{
- if (strstr(linepointer, "Pid")
- || strstr(linepointer, "comm")
- || strstr(linepointer, "CPU")
- || strstr(linepointer, "REGS")
- || strstr(linepointer, "EFLAGS")
- ) {
- char* start;
- char* end;
-
- start = strstr((char*)linepointer, "2.6.");
- if (start)
- {
- end = strchr(start, ')');
- if (!end)
- end = strchrnul(start, ' ');
- return xstrndup(start, end-start);
- }
- }
-
- return NULL;
-}
-
-/*
- * extract_oops tries to find oops signatures in a log
- */
-struct line_info {
- char *ptr;
- char level;
-};
-
-static int record_oops(GList **oopses, struct line_info* lines_info, int oopsstart, int oopsend)
-{
- int q;
- int len;
- char *oops;
- char *version;
-
- len = 2;
- for (q = oopsstart; q <= oopsend; q++)
- len += strlen(lines_info[q].ptr) + 1;
-
- oops = (char*)xzalloc(len);
-
- version = NULL;
- for (q = oopsstart; q <= oopsend; q++)
- {
- if (!version)
- version = extract_version(lines_info[q].ptr);
-
- if (lines_info[q].ptr[0])
- {
- strcat(oops, lines_info[q].ptr);
- strcat(oops, "\n");
- }
- }
- int rv = 1;
- /* too short oopses are invalid */
- if (strlen(oops) > 100)
- queue_oops(oopses, oops, version ? version : "undefined");
- else
- {
- VERB3 log("Dropped oops: too short");
- rv = 0;
- }
- free(oops);
- free(version);
- return rv;
-}
-#define REALLOC_CHUNK 1000
-int extract_oopses(GList **oopses, char *buffer, size_t buflen)
-{
- char *c;
- int linecount = 0;
- int lines_info_alloc = 0;
- struct line_info *lines_info = NULL;
-
- /* Split buffer into lines */
-
- if (buflen != 0)
- buffer[buflen - 1] = '\n'; /* the buffer usually ends with \n, but let's make sure */
- c = buffer;
- while (c < buffer + buflen)
- {
- char linelevel;
- char *c9;
- char *colon;
-
- c9 = (char*)memchr(c, '\n', buffer + buflen - c); /* a \n will always be found */
- assert(c9);
- *c9 = '\0'; /* turn the \n into a string termination */
- if (c9 == c)
- goto next_line;
-
- /* Is it a syslog file (/var/log/messages or similar)?
- * Even though _usually_ it looks like "Nov 19 12:34:38 localhost kernel: xxx",
- * some users run syslog in non-C locale:
- * "2010-02-22T09:24:08.156534-08:00 gnu-4 gnome-session[2048]: blah blah"
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ !!!
- * We detect it by checking for N:NN:NN pattern in first 15 chars
- * (and this still is not good enough... false positive: "pci 0000:15:00.0: PME# disabled")
- */
- colon = strchr(c, ':');
- if (colon && colon > c && colon < c + 15
- && isdigit(colon[-1]) /* N:... */
- && isdigit(colon[1]) /* ...N:NN:... */
- && isdigit(colon[2])
- && colon[3] == ':'
- && isdigit(colon[4]) /* ...N:NN:NN... */
- && isdigit(colon[5])
- ) {
- /* It's syslog file, not a bare dmesg */
-
- /* Skip non-kernel lines */
- char *kernel_str = strstr(c, "kernel: ");
- if (kernel_str == NULL)
- {
- /* if we see our own marker:
- * "hostname abrt: Kerneloops: Reported 1 kernel oopses to Abrt"
- * we know we submitted everything upto here already */
- if (strstr(c, "abrt:") && strstr(c, "Abrt"))
- {
- VERB3 log("Found our marker at line %d, restarting line count from 0", linecount);
- linecount = 0;
- lines_info_alloc = 0;
- free(lines_info);
- lines_info = NULL;
- }
- goto next_line;
- }
- c = kernel_str + sizeof("kernel: ")-1;
- }
-
- linelevel = 0;
- /* store and remove kernel log level */
- if (*c == '<' && c[1] && c[2] == '>')
- {
- linelevel = c[1];
- c += 3;
- }
- /* remove jiffies time stamp counter if present */
- if (*c == '[')
- {
- char *c2 = strchr(c, '.');
- char *c3 = strchr(c, ']');
- if (c2 && c3 && (c2 < c3) && (c3-c) < 14 && (c2-c) < 8)
- {
- c = c3 + 1;
- if (*c == ' ')
- c++;
- }
- }
- if (linecount >= lines_info_alloc)
- {
- lines_info_alloc += REALLOC_CHUNK;
- lines_info = (line_info*)xrealloc(lines_info,
- lines_info_alloc * sizeof(struct line_info));
- }
- lines_info[linecount].ptr = c;
- lines_info[linecount].level = linelevel;
- linecount++;
-next_line:
- c = c9 + 1;
- }
-
- /* Analyze lines */
-
- int i;
- char prevlevel = 0;
- int oopsstart = -1;
- int inbacktrace = 0;
- int oopsesfound = 0;
-
- i = 0;
- while (i < linecount)
- {
- char *curline = lines_info[i].ptr;
-
- if (curline == NULL)
- {
- i++;
- continue;
- }
- while (*curline == ' ')
- curline++;
-
- if (oopsstart < 0)
- {
- /* find start-of-oops markers */
- if (strstr(curline, "general protection fault:"))
- oopsstart = i;
- else if (strstr(curline, "BUG:"))
- oopsstart = i;
- else if (strstr(curline, "kernel BUG at"))
- oopsstart = i;
- else if (strstr(curline, "do_IRQ: stack overflow:"))
- oopsstart = i;
- else if (strstr(curline, "RTNL: assertion failed"))
- oopsstart = i;
- else if (strstr(curline, "Eeek! page_mapcount(page) went negative!"))
- oopsstart = i;
- else if (strstr(curline, "near stack overflow (cur:"))
- oopsstart = i;
- else if (strstr(curline, "double fault:"))
- oopsstart = i;
- else if (strstr(curline, "Badness at"))
- oopsstart = i;
- else if (strstr(curline, "NETDEV WATCHDOG"))
- oopsstart = i;
- else if (strstr(curline, "WARNING: at ")) /* WARN_ON() generated message */
- oopsstart = i;
- else if (strstr(curline, "Unable to handle kernel"))
- oopsstart = i;
- else if (strstr(curline, "sysctl table check failed"))
- oopsstart = i;
- else if (strstr(curline, "INFO: possible recursive locking detected"))
- oopsstart = i;
- // Not needed: "--[ cut here ]--" is always followed
- // by "Badness at", "kernel BUG at", or "WARNING: at" string
- //else if (strstr(curline, "------------[ cut here ]------------"))
- // oopsstart = i;
- else if (strstr(curline, "list_del corruption."))
- oopsstart = i;
- else if (strstr(curline, "list_add corruption."))
- oopsstart = i;
- if (strstr(curline, "Oops:") && i >= 3)
- oopsstart = i-3;
-
- if (oopsstart >= 0)
- {
- /* debug information */
- VERB3 {
- log("Found oops at line %d: '%s'", oopsstart, lines_info[oopsstart].ptr);
- if (oopsstart != i)
- log("Trigger line is %d: '%s'", i, c);
- }
- /* try to find the end marker */
- int i2 = i + 1;
- while (i2 < linecount && i2 < (i+50))
- {
- if (strstr(lines_info[i2].ptr, "---[ end trace"))
- {
- inbacktrace = 1;
- i = i2;
- break;
- }
- i2++;
- }
- }
- }
-
- /* Are we entering a call trace part? */
- /* a call trace starts with "Call Trace:" or with the " [<.......>] function+0xFF/0xAA" pattern */
- if (oopsstart >= 0 && !inbacktrace)
- {
- if (strstr(curline, "Call Trace:"))
- inbacktrace = 1;
- else
- if (strnlen(curline, 9) > 8
- && curline[0] == '[' && curline[1] == '<'
- && strstr(curline, ">]")
- && strstr(curline, "+0x")
- && strstr(curline, "/0x")
- ) {
- inbacktrace = 1;
- }
- }
-
- /* Are we at the end of an oops? */
- else if (oopsstart >= 0 && inbacktrace)
- {
- int oopsend = INT_MAX;
-
- /* line needs to start with " [" or have "] [" if it is still a call trace */
- /* example: "[<ffffffffa006c156>] radeon_get_ring_head+0x16/0x41 [radeon]" */
- if (curline[0] != '['
- && !strstr(curline, "] [")
- && !strstr(curline, "--- Exception")
- && !strstr(curline, "LR =")
- && !strstr(curline, "<#DF>")
- && !strstr(curline, "<IRQ>")
- && !strstr(curline, "<EOI>")
- && !strstr(curline, "<<EOE>>")
- && strncmp(curline, "Code: ", 6) != 0
- && strncmp(curline, "RIP ", 4) != 0
- && strncmp(curline, "RSP ", 4) != 0
- ) {
- oopsend = i-1; /* not a call trace line */
- }
- /* oops lines are always more than 8 chars long */
- else if (strnlen(curline, 8) < 8)
- oopsend = i-1;
- /* single oopses are of the same loglevel */
- else if (lines_info[i].level != prevlevel)
- oopsend = i-1;
- else if (strstr(curline, "Instruction dump:"))
- oopsend = i;
- /* if a new oops starts, this one has ended */
- else if (strstr(curline, "WARNING: at ") && oopsstart != i) /* WARN_ON() generated message */
- oopsend = i-1;
- else if (strstr(curline, "Unable to handle") && oopsstart != i)
- oopsend = i-1;
- /* kernel end-of-oops marker (not including marker itself) */
- else if (strstr(curline, "---[ end trace"))
- oopsend = i-1;
-
- if (oopsend <= i)
- {
- VERB3 log("End of oops at line %d (%d): '%s'", oopsend, i, lines_info[oopsend].ptr);
- if (record_oops(oopses, lines_info, oopsstart, oopsend))
- oopsesfound++;
- oopsstart = -1;
- inbacktrace = 0;
- }
- }
-
- prevlevel = lines_info[i].level;
- i++;
-
- if (oopsstart >= 0)
- {
- /* Do we have a suspiciously long oops? Cancel it */
- if (i-oopsstart > 60)
- {
- inbacktrace = 0;
- oopsstart = -1;
- VERB3 log("Dropped oops, too long");
- continue;
- }
- if (!inbacktrace && i-oopsstart > 40)
- {
- /*inbacktrace = 0; - already is */
- oopsstart = -1;
- VERB3 log("Dropped oops, too long");
- continue;
- }
- }
- } /* while (i < linecount) */
-
- /* process last oops if we have one */
- if (oopsstart >= 0 && inbacktrace)
- {
- int oopsend = i-1;
- VERB3 log("End of oops at line %d (end of file): '%s'", oopsend, lines_info[oopsend].ptr);
- if (record_oops(oopses, lines_info, oopsstart, oopsend))
- oopsesfound++;
- }
-
- free(lines_info);
- return oopsesfound;
-}
diff --git a/src/plugins/KerneloopsSysLog.h b/src/plugins/KerneloopsSysLog.h
deleted file mode 100644
index d8b4d32b..00000000
--- a/src/plugins/KerneloopsSysLog.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2007, Intel Corporation
- * Copyright 2009, Red Hat Inc.
- *
- * This file is part of Abrt.
- *
- * This program file 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; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program in a file named COPYING; if not, write to the
- * Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301 USA
- *
- * Authors:
- * Anton Arapov <anton@redhat.com>
- * Arjan van de Ven <arjan@linux.intel.com>
- */
-
-#ifndef __INCLUDE_GUARD_KERNELOOPSSYSLOG_H_
-#define __INCLUDE_GUARD_KERNELOOPSSYSLOG_H_
-
-#include "abrt_types.h"
-#include <glib.h>
-
-int extract_oopses(GList **oopses, char *buffer, size_t buflen);
-
-#endif
diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am
index 71a2fd6f..207fc860 100644
--- a/src/plugins/Makefile.am
+++ b/src/plugins/Makefile.am
@@ -1,13 +1,22 @@
-INC_PATH=$(srcdir)/../include
-UTILS_PATH=$(srcdir)/../lib
-AM_CPPFLAGS = -I$(INC_PATH) -I$(UTILS_PATH)
-pluginslibdir=$(PLUGINS_LIB_DIR)
-libexec_SCRIPTS = \
+pluginslibdir = $(PLUGINS_LIB_DIR)
+
+bin_SCRIPTS = \
abrt-action-install-debuginfo.py
-pluginslib_LTLIBRARIES = \
- libCCpp.la \
- libKerneloopsScanner.la
+bin_PROGRAMS = \
+ abrt-dump-oops \
+ abrt-action-analyze-c \
+ abrt-action-analyze-python \
+ abrt-action-analyze-oops \
+ abrt-action-generate-backtrace \
+ abrt-action-bugzilla \
+ abrt-action-rhtsupport \
+ abrt-action-kerneloops \
+ abrt-action-upload \
+ abrt-action-mailx \
+ abrt-action-print \
+ abrt-action-install-debuginfo \
+ abrt-retrace-client
dist_pluginslib_DATA = \
Logger.glade \
@@ -18,6 +27,7 @@ dist_pluginslib_DATA = \
KerneloopsReporter.glade
pluginsconfdir = $(PLUGINS_CONF_DIR)
+
dist_pluginsconf_DATA = \
CCpp.conf \
Python.conf \
@@ -28,9 +38,13 @@ dist_pluginsconf_DATA = \
RHTSupport.conf \
Upload.conf
+eventsconfdir = $(EVENTS_CONF_DIR)
+
+dist_eventsconf_DATA = \
+ ccpp_events.conf
+
man_MANS = \
abrt-Bugzilla.7 \
- abrt-KerneloopsScanner.7 \
abrt-KerneloopsReporter.7 \
abrt-Logger.7 \
abrt-Mailx.7 \
@@ -48,39 +62,29 @@ install-data-hook: $(DESTDIR)/$(DEBUG_INFO_DIR)
sed 's: = /var/: = $(localstatedir)/:g' -i \
$(DESTDIR)$(sysconfdir)/abrt/plugins/Logger.conf
-# CCpp
-libCCpp_la_SOURCES = CCpp.cpp CCpp.h
-libCCpp_la_LDFLAGS = -avoid-version
-libCCpp_la_CPPFLAGS = -Wall -Werror \
- -I$(INC_PATH) \
- -I$(UTILS_PATH) \
- -DCCPP_HOOK_PATH=\"${libexecdir}/abrt-hook-ccpp\" \
+abrt_dump_oops_SOURCES = \
+ abrt-dump-oops.c
+abrt_dump_oops_CPPFLAGS = \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
+ -I$(srcdir)/../lib \
+ -DBIN_DIR=\"$(bindir)\" \
+ -DVAR_RUN=\"$(VAR_RUN)\" \
+ -DCONF_DIR=\"$(CONF_DIR)\" \
+ -DLOCALSTATEDIR='"$(localstatedir)"' \
-DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \
- -DLOCALSTATEDIR='"$(localstatedir)"'
-# -DHOSTILE_KERNEL
-
-# KerneloopsScanner
-libKerneloopsScanner_la_SOURCES = KerneloopsScanner.cpp KerneloopsScanner.h KerneloopsSysLog.cpp KerneloopsSysLog.h
-libKerneloopsScanner_la_LDFLAGS = -avoid-version $(GLIB_LIBS)
-libKerneloopsScanner_la_CPPFLAGS = -I$(INC_PATH) -I$(UTILS_PATH) -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" $(GLIB_CFLAGS)
-
-libexec_PROGRAMS = \
- abrt-action-analyze-c \
- abrt-action-analyze-python \
- abrt-action-analyze-oops \
- abrt-action-generate-backtrace \
- abrt-action-bugzilla \
- abrt-action-rhtsupport \
- abrt-action-kerneloops \
- abrt-action-upload \
- abrt-action-mailx \
- abrt-action-print \
- abrt-retrace-client
+ -DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \
+ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
+ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
+ $(GLIB_CFLAGS) \
+ -D_GNU_SOURCE \
+ -Wall -Werror
+abrt_dump_oops_LDADD = \
+ ../lib/libreport.la
abrt_action_analyze_c_SOURCES = \
abrt-action-analyze-c.c
abrt_action_analyze_c_CPPFLAGS = \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-I$(srcdir)/../lib \
-DBIN_DIR=\"$(bindir)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
@@ -90,15 +94,16 @@ abrt_action_analyze_c_CPPFLAGS = \
-DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \
-DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
+ $(GLIB_CFLAGS) \
-D_GNU_SOURCE \
-Wall -Werror
abrt_action_analyze_c_LDADD = \
- ../lib/libabrt.la
+ ../lib/libreport.la
abrt_action_analyze_python_SOURCES = \
abrt-action-analyze-python.c
abrt_action_analyze_python_CPPFLAGS = \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-I$(srcdir)/../lib \
-DBIN_DIR=\"$(bindir)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
@@ -108,15 +113,16 @@ abrt_action_analyze_python_CPPFLAGS = \
-DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \
-DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
+ $(GLIB_CFLAGS) \
-D_GNU_SOURCE \
-Wall -Werror
abrt_action_analyze_python_LDADD = \
- ../lib/libabrt.la
+ ../lib/libreport.la
abrt_action_analyze_oops_SOURCES = \
abrt-action-analyze-oops.c
abrt_action_analyze_oops_CPPFLAGS = \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-I$(srcdir)/../lib \
-DBIN_DIR=\"$(bindir)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
@@ -126,15 +132,16 @@ abrt_action_analyze_oops_CPPFLAGS = \
-DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \
-DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
+ $(GLIB_CFLAGS) \
-D_GNU_SOURCE \
-Wall -Werror
abrt_action_analyze_oops_LDADD = \
- ../lib/libabrt.la
+ ../lib/libreport.la
abrt_action_generate_backtrace_SOURCES = \
abrt-action-generate-backtrace.c
abrt_action_generate_backtrace_CPPFLAGS = \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-I$(srcdir)/../lib \
-DBIN_DIR=\"$(bindir)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
@@ -144,16 +151,17 @@ abrt_action_generate_backtrace_CPPFLAGS = \
-DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \
-DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
+ $(GLIB_CFLAGS) \
-D_GNU_SOURCE \
-Wall -Werror
abrt_action_generate_backtrace_LDADD = \
- ../lib/libabrt.la \
+ ../lib/libreport.la \
../btparser/libbtparser.la
abrt_action_bugzilla_SOURCES = \
abrt-action-bugzilla.cpp
abrt_action_bugzilla_CPPFLAGS = \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-I$(srcdir)/../lib \
-DBIN_DIR=\"$(bindir)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
@@ -169,13 +177,13 @@ abrt_action_bugzilla_CPPFLAGS = \
abrt_action_bugzilla_LDADD = \
$(GLIB_LIBS) \
../lib/libabrt_web.la \
- ../lib/libabrt.la
+ ../lib/libreport.la
abrt_action_rhtsupport_SOURCES = \
abrt_rh_support.h abrt_rh_support.c \
- abrt-action-rhtsupport.cpp
+ abrt-action-rhtsupport.c
abrt_action_rhtsupport_CPPFLAGS = \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-I$(srcdir)/../lib \
-DBIN_DIR=\"$(bindir)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
@@ -193,12 +201,12 @@ abrt_action_rhtsupport_LDADD = \
$(GLIB_LIBS) \
$(XMLRPC_LIBS) $(XMLRPC_CLIENT_LIBS) \
../lib/libabrt_web.la \
- ../lib/libabrt.la
+ ../lib/libreport.la
abrt_action_upload_SOURCES = \
- abrt-action-upload.cpp
+ abrt-action-upload.c
abrt_action_upload_CPPFLAGS = \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-I$(srcdir)/../lib \
-DBIN_DIR=\"$(bindir)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
@@ -213,16 +221,15 @@ abrt_action_upload_CPPFLAGS = \
-D_GNU_SOURCE \
-Wall -Werror
abrt_action_upload_LDFLAGS = -ltar
-# Needs libABRTdUtils only for LoadPluginSettings
abrt_action_upload_LDADD = \
$(GLIB_LIBS) \
$(CURL_LIBS) \
- ../lib/libabrt.la
+ ../lib/libreport.la
abrt_action_kerneloops_SOURCES = \
- abrt-action-kerneloops.cpp
+ abrt-action-kerneloops.c
abrt_action_kerneloops_CPPFLAGS = \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-I$(srcdir)/../lib \
-DBIN_DIR=\"$(bindir)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
@@ -235,15 +242,14 @@ abrt_action_kerneloops_CPPFLAGS = \
$(GLIB_CFLAGS) \
-D_GNU_SOURCE \
-Wall -Werror
-# libABRTdUtils is used only because of LoadPluginSettings:
abrt_action_kerneloops_LDADD = \
../lib/libabrt_web.la \
- ../lib/libabrt.la
+ ../lib/libreport.la
abrt_action_mailx_SOURCES = \
- abrt-action-mailx.cpp
+ abrt-action-mailx.c
abrt_action_mailx_CPPFLAGS = \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-I$(srcdir)/../lib \
-DBIN_DIR=\"$(bindir)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
@@ -257,12 +263,12 @@ abrt_action_mailx_CPPFLAGS = \
-D_GNU_SOURCE \
-Wall -Werror
abrt_action_mailx_LDADD = \
- ../lib/libabrt.la
+ ../lib/libreport.la
abrt_action_print_SOURCES = \
- abrt-action-print.cpp
+ abrt-action-print.c
abrt_action_print_CPPFLAGS = \
- -I$(srcdir)/../include \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
-I$(srcdir)/../lib \
-DBIN_DIR=\"$(bindir)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
@@ -275,9 +281,17 @@ abrt_action_print_CPPFLAGS = \
$(GLIB_CFLAGS) \
-D_GNU_SOURCE \
-Wall -Werror
-# libABRTdUtils is used only because of make_description_logger:
abrt_action_print_LDADD = \
- ../lib/libabrt.la
+ ../lib/libreport.la
+
+abrt_action_install_debuginfo_SOURCES = \
+ abrt-action-install-debuginfo.c
+abrt_action_install_debuginfo_CPPFLAGS = \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
+ -I$(srcdir)/../lib \
+ -D_GNU_SOURCE \
+ -Wall
+abrt_action_install_debuginfo_LDADD =
abrt_retrace_client_SOURCES = \
abrt-retrace-client.c
diff --git a/src/plugins/abrt-KerneloopsScanner.7 b/src/plugins/abrt-KerneloopsScanner.7
deleted file mode 100644
index ff094847..00000000
--- a/src/plugins/abrt-KerneloopsScanner.7
+++ /dev/null
@@ -1,46 +0,0 @@
-.TH abrt "7" "1 Jun 2009" ""
-.SH NAME
-KerneloopsScanner plugin for abrt(8)
-.SH DESCRIPTION
-.P
-.I abrt
-is a daemon that watches for application crashes. When a crash occurs,
-it collects the crash data and takes action according to
-its configuration. This manual page describes the \fIKerneloopsScanner\fP
-plugin for \fIabrt\fP.
-.P
-This plugin reads the system log file (default /var/log/messages)
-and stores the kernel oops crashes, which were not already
-reported, to abrt's debug dump directory.
-.P
-To distinguish between new crashes and crashes
-that were already reported, the plugin makes its own entry
-in the log file, which acts as a separator.
-.SH INVOCATION
-The plugin is invoked in the \fIabrt.conf\fP configuration file.
-No parameters are necessary.
-.SH CONFIGURATION
-The \fIKerneloopsScanner.conf\fP configuration file contains one entry:
-.SS SysLogFile
-The file to scan. The default is
-.br
-SysLogFile = /var/log/messages
-.SH EXAMPLES
-.P
-This is a snippet from the \fIabrt.conf\fP configuration file.
-Every 10 seconds look if there were any kernel crashes:
-.P
-[common]
-.br
-ActionsAndReporters = Kerneloops, KerneloopsScanner
-.br
-[cron]
-.br
-10 = KerneloopsScanner
-.SH "SEE ALSO"
-.IR abrt (8),
-.IR abrt.conf (5),
-.IR abrt-plugins (7)
-.SH AUTHOR
-Written by Anton Arapov <anton@redhat.com>. Manual
-page by Daniel Novotny <dnovotny@redhat.com>.
diff --git a/src/plugins/abrt-action-analyze-c.c b/src/plugins/abrt-action-analyze-c.c
index 6d8ac1b4..5def9aa1 100644
--- a/src/plugins/abrt-action-analyze-c.c
+++ b/src/plugins/abrt-action-analyze-c.c
@@ -52,7 +52,7 @@ static char *run_unstrip_n(const char *dump_dir_name, unsigned timeout_sec)
return NULL;
char *uid_str = dd_load_text(dd, FILENAME_UID);
dd_close(dd);
- unsigned uid = xatoi_u(uid_str);
+ unsigned uid = xatoi_positive(uid_str);
free(uid_str);
int flags = EXECFLG_INPUT_NUL | EXECFLG_OUTPUT | EXECFLG_SETGUID | EXECFLG_SETSID | EXECFLG_QUIET;
@@ -104,7 +104,7 @@ static char *run_unstrip_n(const char *dump_dir_name, unsigned timeout_sec)
if (status != 0)
{
- /* unstrip didnt exit with exitcode 0 */
+ /* unstrip didnt exit with exit code 0 */
strbuf_free(buf_out);
return NULL;
}
@@ -149,28 +149,28 @@ int main(int argc, char **argv)
if (env_verbose)
g_verbose = atoi(env_verbose);
+ const char *dump_dir_name = ".";
+
/* Can't keep these strings/structs static: _() doesn't support that */
const char *program_usage_string = _(
- PROGNAME" [-vs] -d DIR\n\n"
+ PROGNAME" [-v] -d DIR\n\n"
"Calculates and saves UUID of coredumps"
- );
- const char *dump_dir_name = ".";
+ );
enum {
OPT_v = 1 << 0,
OPT_d = 1 << 1,
- OPT_s = 1 << 2,
+// OPT_s = 1 << 2,
};
/* Keep enum above and order of options below in sync! */
struct options program_options[] = {
OPT__VERBOSE(&g_verbose),
OPT_STRING('d', NULL, &dump_dir_name, "DIR", _("Crash dump directory")),
- OPT_BOOL( 's', NULL, NULL, _("Log to syslog" )),
+// OPT_BOOL( 's', NULL, NULL, _("Log to syslog" )),
OPT_END()
};
/*unsigned opts =*/ parse_opts(argc, argv, program_options, program_usage_string);
putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
-
msg_prefix = PROGNAME;
//Maybe we will want this... later
// if (opts & OPT_s)
diff --git a/src/plugins/abrt-action-analyze-oops.c b/src/plugins/abrt-action-analyze-oops.c
index 24538641..0072c71d 100644
--- a/src/plugins/abrt-action-analyze-oops.c
+++ b/src/plugins/abrt-action-analyze-oops.c
@@ -126,28 +126,28 @@ int main(int argc, char **argv)
if (env_verbose)
g_verbose = atoi(env_verbose);
+ const char *dump_dir_name = ".";
+
/* Can't keep these strings/structs static: _() doesn't support that */
const char *program_usage_string = _(
PROGNAME" [-vs] -d DIR\n\n"
"Calculates and saves UUID and DUPHASH of oops crash dumps"
);
- const char *dump_dir_name = ".";
enum {
OPT_v = 1 << 0,
OPT_d = 1 << 1,
- OPT_s = 1 << 2,
+// OPT_s = 1 << 2,
};
/* Keep enum above and order of options below in sync! */
struct options program_options[] = {
OPT__VERBOSE(&g_verbose),
OPT_STRING('d', NULL, &dump_dir_name, "DIR", _("Crash dump directory")),
- OPT_BOOL( 's', NULL, NULL, _("Log to syslog" )),
+// OPT_BOOL( 's', NULL, NULL, _("Log to syslog" )),
OPT_END()
};
/*unsigned opts =*/ parse_opts(argc, argv, program_options, program_usage_string);
putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
-
msg_prefix = PROGNAME;
//Maybe we will want this... later
// if (opts & OPT_s)
diff --git a/src/plugins/abrt-action-analyze-python.c b/src/plugins/abrt-action-analyze-python.c
index 9fe563db..feffb439 100644
--- a/src/plugins/abrt-action-analyze-python.c
+++ b/src/plugins/abrt-action-analyze-python.c
@@ -31,28 +31,28 @@ int main(int argc, char **argv)
if (env_verbose)
g_verbose = atoi(env_verbose);
+ const char *dump_dir_name = ".";
+
/* Can't keep these strings/structs static: _() doesn't support that */
const char *program_usage_string = _(
- PROGNAME" [-vs] -d DIR\n\n"
+ PROGNAME" [-v] -d DIR\n\n"
"Calculates and saves UUID and DUPHASH of python crash dumps"
- );
- const char *dump_dir_name = ".";
+ );
enum {
OPT_v = 1 << 0,
OPT_d = 1 << 1,
- OPT_s = 1 << 2,
+// OPT_s = 1 << 2,
};
/* Keep enum above and order of options below in sync! */
struct options program_options[] = {
OPT__VERBOSE(&g_verbose),
OPT_STRING('d', NULL, &dump_dir_name, "DIR", _("Crash dump directory")),
- OPT_BOOL( 's', NULL, NULL, _("Log to syslog" )),
+// OPT_BOOL( 's', NULL, NULL, _("Log to syslog" )),
OPT_END()
};
/*unsigned opts =*/ parse_opts(argc, argv, program_options, program_usage_string);
putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
-
msg_prefix = PROGNAME;
//Maybe we will want this... later
// if (opts & OPT_s)
diff --git a/src/plugins/abrt-action-bugzilla.cpp b/src/plugins/abrt-action-bugzilla.cpp
index b396e453..2aa32b75 100644
--- a/src/plugins/abrt-action-bugzilla.cpp
+++ b/src/plugins/abrt-action-bugzilla.cpp
@@ -18,8 +18,10 @@
*/
#include "abrtlib.h"
#include "abrt_xmlrpc.h"
-#include "abrt_crash_dump.h"
-#include "abrt_exception.h"
+#include "abrt_crash_data.h"
+#include "parse_options.h"
+
+#define PROGNAME "abrt-action-bugzilla"
#define XML_RPC_SUFFIX "/xmlrpc.cgi"
#define MAX_HOPS 5
@@ -112,8 +114,8 @@ struct ctx: public abrt_xmlrpc_conn {
xmlrpc_int32 get_bug_dup_id(xmlrpc_value* result_xml);
void get_bug_cc(xmlrpc_value* result_xml, struct bug_info* bz);
int add_plus_one_cc(xmlrpc_int32 bug_id, const char* login);
- xmlrpc_int32 new_bug(const map_crash_data_t& pCrashData, int depend_on_bugno);
- int add_attachments(const char* bug_id_str, const map_crash_data_t& pCrashData);
+ xmlrpc_int32 new_bug(crash_data_t *crash_data, int depend_on_bugno);
+ int add_attachments(const char* bug_id_str, crash_data_t *crash_data);
int get_bug_info(struct bug_info* bz, xmlrpc_int32 bug_id);
int add_comment(xmlrpc_int32 bug_id, const char* comment, bool is_private);
@@ -326,7 +328,7 @@ xmlrpc_value* ctx::call_quicksearch_duphash(const char* component, const char* r
{
char *product = NULL;
char *version = NULL;
- parse_release(release, &product, &version);
+ parse_release_for_bz(release, &product, &version);
query = xasprintf("ALL component:\"%s\" whiteboard:\"%s\" product:\"%s\"",
component, duphash, product
);
@@ -442,17 +444,17 @@ static const char *tainted_string(unsigned tainted)
return taint_warnings[idx];
}
-xmlrpc_int32 ctx::new_bug(const map_crash_data_t& pCrashData, int depend_on_bugno)
+xmlrpc_int32 ctx::new_bug(crash_data_t *crash_data, int depend_on_bugno)
{
- const char *package = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_PACKAGE);
- const char *component = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_COMPONENT);
- const char *release = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_RELEASE);
- const char *arch = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_ARCHITECTURE);
- const char *duphash = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_DUPHASH);
- const char *reason = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_REASON);
- const char *function = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_CRASH_FUNCTION);
- const char *analyzer = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_ANALYZER);
- const char *tainted_str = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_TAINTED);
+ const char *package = get_crash_item_content_or_NULL(crash_data, FILENAME_PACKAGE);
+ const char *component = get_crash_item_content_or_NULL(crash_data, FILENAME_COMPONENT);
+ const char *release = get_crash_item_content_or_NULL(crash_data, FILENAME_OS_RELEASE);
+ const char *arch = get_crash_item_content_or_NULL(crash_data, FILENAME_ARCHITECTURE);
+ const char *duphash = get_crash_item_content_or_NULL(crash_data, FILENAME_DUPHASH);
+ const char *reason = get_crash_item_content_or_NULL(crash_data, FILENAME_REASON);
+ const char *function = get_crash_item_content_or_NULL(crash_data, FILENAME_CRASH_FUNCTION);
+ const char *analyzer = get_crash_item_content_or_NULL(crash_data, FILENAME_ANALYZER);
+ const char *tainted_str = get_crash_item_content_or_NULL(crash_data, FILENAME_TAINTED);
struct strbuf *buf_summary = strbuf_new();
strbuf_append_strf(buf_summary, "[abrt] %s", package);
@@ -466,7 +468,7 @@ xmlrpc_int32 ctx::new_bug(const map_crash_data_t& pCrashData, int depend_on_bugn
if (tainted_str && analyzer
&& (strcmp(analyzer, "Kerneloops") == 0)
) {
- unsigned long tainted = xatoi_u(tainted_str);
+ unsigned long tainted = xatoi_positive(tainted_str);
const char *tainted_warning = tainted_string(tainted);
if (tainted_warning)
strbuf_append_strf(buf_summary, ": TAINTED %s", tainted_warning);
@@ -474,13 +476,13 @@ xmlrpc_int32 ctx::new_bug(const map_crash_data_t& pCrashData, int depend_on_bugn
char *status_whiteboard = xasprintf("abrt_hash:%s", duphash);
- char *bz_dsc = make_description_bz(pCrashData);
+ char *bz_dsc = make_description_bz(crash_data);
char *full_dsc = xasprintf("abrt version: "VERSION"\n%s", bz_dsc);
free(bz_dsc);
char *product = NULL;
char *version = NULL;
- parse_release(release, &product, &version);
+ parse_release_for_bz(release, &product, &version);
xmlrpc_value* result = NULL;
char *summary = strbuf_free_nobuf(buf_summary);
@@ -534,23 +536,24 @@ xmlrpc_int32 ctx::new_bug(const map_crash_data_t& pCrashData, int depend_on_bugn
return bug_id;
}
-int ctx::add_attachments(const char* bug_id_str, const map_crash_data_t& pCrashData)
+int ctx::add_attachments(const char* bug_id_str, crash_data_t *crash_data)
{
- map_crash_data_t::const_iterator it = pCrashData.begin();
- for (; it != pCrashData.end(); it++)
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, crash_data);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
{
- const char *itemname = it->first.c_str();
- const char *type = it->second[CD_TYPE].c_str();
- const char *content = it->second[CD_CONTENT].c_str();
+ const char *content = value->content;
- if ((strcmp(type, CD_TXT) == 0)
- && (strlen(content) > CD_TEXT_ATT_SIZE || (strcmp(itemname, FILENAME_BACKTRACE) == 0))
+ if ((value->flags & CD_FLAG_TXT)
+ && (strlen(content) > CD_TEXT_ATT_SIZE || (strcmp(name, FILENAME_BACKTRACE) == 0))
) {
char *encoded64 = encode_base64(content, strlen(content));
- char *filename = xasprintf("File: %s", itemname);
+ char *filename = xasprintf("File: %s", name);
xmlrpc_value* result = call("bugzilla.addAttachment", "(s{s:s,s:s,s:s,s:s})", bug_id_str,
"description", filename,
- "filename", itemname,
+ "filename", name,
"contenttype", "text/plain",
"data", encoded64
);
@@ -567,7 +570,9 @@ int ctx::add_attachments(const char* bug_id_str, const map_crash_data_t& pCrashD
int ctx::get_bug_info(struct bug_info* bz, xmlrpc_int32 bug_id)
{
- xmlrpc_value* result = call("bugzilla.getBug", "(s)", to_string(bug_id).c_str());
+ char bug_id_str[sizeof(long)*3 + 2];
+ sprintf(bug_id_str, "%lu", (long)bug_id);
+ xmlrpc_value* result = call("bugzilla.getBug", "(s)", bug_id_str);
if (!result)
return -1;
@@ -611,15 +616,10 @@ int ctx::get_bug_info(struct bug_info* bz, xmlrpc_int32 bug_id)
void ctx::login(const char* login, const char* passwd)
{
xmlrpc_value* result = call("User.login", "({s:s,s:s})", "login", login, "password", passwd);
-
if (!result)
- {
- char *errmsg = xasprintf("Can't login. Check Edit->Plugins->Bugzilla and /etc/abrt/plugins/Bugzilla.conf. Server said: %s", env.fault_string);
- error_msg("%s", errmsg); // show error in daemon log
- CABRTException e(EXCEP_PLUGIN, errmsg);
- free(errmsg);
- throw e;
- }
+ error_msg_and_die("Can't login. Check Edit->Plugins->Bugzilla "
+ "and /etc/abrt/plugins/Bugzilla.conf. Server said: %s",
+ env.fault_string);
xmlrpc_DECREF(result);
}
@@ -637,15 +637,12 @@ void ctx::logout()
static void report_to_bugzilla(
const char *dump_dir_name,
- /*const*/ map_plugin_settings_t& settings)
+ map_string_h *settings)
{
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
- {
- throw CABRTException(EXCEP_PLUGIN, _("Can't open '%s'"), dump_dir_name);
- }
- map_crash_data_t pCrashData;
- load_crash_data_from_crash_dump_dir(dd, pCrashData);
+ xfunc_die(); /* dd_opendir already emitted error msg */
+ crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
dd_close(dd);
const char *env;
@@ -656,27 +653,27 @@ static void report_to_bugzilla(
bool ssl_verify;
env = getenv("Bugzilla_Login");
- login = env ? env : settings["Login"].c_str();
+ login = env ? env : get_map_string_item_or_empty(settings, "Login");
env = getenv("Bugzilla_Password");
- password = env ? env : settings["Password"].c_str();
+ password = env ? env : get_map_string_item_or_empty(settings, "Password");
if (!login[0] || !password[0])
{
VERB3 log("Empty login and password");
- throw CABRTException(EXCEP_PLUGIN, _("Empty login or password, please check %s"), PLUGINS_CONF_DIR"/Bugzilla.conf");
+ error_msg_and_die(_("Empty login or password, please check %s"), PLUGINS_CONF_DIR"/Bugzilla.conf");
}
env = getenv("Bugzilla_BugzillaURL");
- bugzilla_url = env ? env : settings["BugzillaURL"].c_str();
+ bugzilla_url = env ? env : get_map_string_item_or_empty(settings, "BugzillaURL");
if (!bugzilla_url[0])
bugzilla_url = "https://bugzilla.redhat.com";
bugzilla_xmlrpc = xasprintf("%s"XML_RPC_SUFFIX, bugzilla_url);
env = getenv("Bugzilla_SSLVerify");
- ssl_verify = string_to_bool(env ? env : settings["SSLVerify"].c_str());
+ ssl_verify = string_to_bool(env ? env : get_map_string_item_or_empty(settings, "SSLVerify"));
- const char *component = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_COMPONENT);
- const char *duphash = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_DUPHASH);
- const char *release = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_RELEASE);
+ const char *component = get_crash_item_content_or_NULL(crash_data, FILENAME_COMPONENT);
+ const char *duphash = get_crash_item_content_or_NULL(crash_data, FILENAME_DUPHASH);
+ const char *release = get_crash_item_content_or_NULL(crash_data, FILENAME_OS_RELEASE);
ctx bz_server(bugzilla_xmlrpc, ssl_verify);
@@ -687,7 +684,8 @@ static void report_to_bugzilla(
char *product = NULL;
char *version = NULL;
- parse_release(release, &product, &version);
+ parse_release_for_bz(release, &product, &version);
+ free(version);
xmlrpc_value *result;
if (strcmp(product, "Fedora") == 0)
@@ -704,7 +702,7 @@ static void report_to_bugzilla(
if (!all_bugs)
{
throw_if_xml_fault_occurred(&bz_server.env);
- throw CABRTException(EXCEP_PLUGIN, _("Missing mandatory member 'bugs'"));
+ error_msg_and_die(_("Missing mandatory member 'bugs'"));
}
xmlrpc_int32 bug_id = -1;
@@ -723,7 +721,7 @@ static void report_to_bugzilla(
{
bug_info_destroy(&bz);
throw_if_xml_fault_occurred(&bz_server.env);
- throw CABRTException(EXCEP_PLUGIN, _("get_bug_info() failed. Could not collect all mandatory information"));
+ error_msg_and_die(_("get_bug_info() failed. Could not collect all mandatory information"));
}
if (strcmp(bz.bug_product, product) != 0)
@@ -740,7 +738,7 @@ static void report_to_bugzilla(
if (!all_bugs)
{
throw_if_xml_fault_occurred(&bz_server.env);
- throw CABRTException(EXCEP_PLUGIN, _("Missing mandatory member 'bugs'"));
+ error_msg_and_die(_("Missing mandatory member 'bugs'"));
}
all_bugs_size = bz_server.get_array_size(all_bugs);
@@ -756,7 +754,7 @@ static void report_to_bugzilla(
{
bug_info_destroy(&bz);
throw_if_xml_fault_occurred(&bz_server.env);
- throw CABRTException(EXCEP_PLUGIN, _("get_bug_info() failed. Could not collect all mandatory information"));
+ error_msg_and_die(_("get_bug_info() failed. Could not collect all mandatory information"));
}
}
else
@@ -764,7 +762,6 @@ static void report_to_bugzilla(
}
}
free(product);
- free(version);
if (all_bugs_size < 0)
{
@@ -773,15 +770,17 @@ static void report_to_bugzilla(
else if (all_bugs_size == 0) // Create new bug
{
log(_("Creating a new bug..."));
- bug_id = bz_server.new_bug(pCrashData, depend_on_bugno);
+ bug_id = bz_server.new_bug(crash_data, depend_on_bugno);
if (bug_id < 0)
{
throw_if_xml_fault_occurred(&bz_server.env);
- throw CABRTException(EXCEP_PLUGIN, _("Bugzilla entry creation failed"));
+ error_msg_and_die(_("Bugzilla entry creation failed"));
}
- log("Adding attachments to bug %d...", bug_id);
- int ret = bz_server.add_attachments(to_string(bug_id).c_str(), pCrashData);
+ log("Adding attachments to bug %ld...", (long)bug_id);
+ char bug_id_str[sizeof(long)*3 + 2];
+ sprintf(bug_id_str, "%ld", (long) bug_id);
+ int ret = bz_server.add_attachments(bug_id_str, crash_data);
if (ret == -1)
{
throw_if_xml_fault_occurred(&bz_server.env);
@@ -816,7 +815,7 @@ static void report_to_bugzilla(
{
VERB3 log("Bugzilla could not find a parent of bug %d", (int)original_bug_id);
bug_info_destroy(&bz);
- throw CABRTException(EXCEP_PLUGIN, _("Bugzilla couldn't find parent of bug %d"), (int)original_bug_id);
+ error_msg_and_die(_("Bugzilla couldn't find parent of bug %d"), (int)original_bug_id);
}
log("Bug %d is a duplicate, using parent bug %d", bug_id, (int)bz.bug_dup_id);
@@ -831,7 +830,7 @@ static void report_to_bugzilla(
{
throw_if_xml_fault_occurred(&bz_server.env);
}
- throw CABRTException(EXCEP_PLUGIN, _("get_bug_info() failed. Could not collect all mandatory information"));
+ error_msg_and_die(_("get_bug_info() failed. Could not collect all mandatory information"));
}
// found a bug which is not CLOSED as DUPLICATE
@@ -855,13 +854,13 @@ static void report_to_bugzilla(
throw_if_xml_fault_occurred(&bz_server.env);
}
- char *dsc = make_description_reproduce_comment(pCrashData);
+ char *dsc = make_description_reproduce_comment(crash_data);
if (dsc)
{
- const char* package = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_PACKAGE);
- const char* release = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_RELEASE);
- const char* arch = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_ARCHITECTURE);
- const char* is_private = get_crash_data_item_content_or_NULL(pCrashData, "is_private");
+ const char* package = get_crash_item_content_or_NULL(crash_data, FILENAME_PACKAGE);
+ const char* release = get_crash_item_content_or_NULL(crash_data, FILENAME_OS_RELEASE);
+ const char* arch = get_crash_item_content_or_NULL(crash_data, FILENAME_ARCHITECTURE);
+ const char* is_private = get_crash_item_content_or_NULL(crash_data, "is_private");
char *full_dsc = xasprintf("Package: %s\n"
"Architecture: %s\n"
@@ -895,6 +894,7 @@ static void report_to_bugzilla(
(int)bug_id
);
+ free_crash_data(crash_data);
bug_info_destroy(&bz);
}
@@ -904,59 +904,50 @@ int main(int argc, char **argv)
if (env_verbose)
g_verbose = atoi(env_verbose);
- map_plugin_settings_t settings;
-
+ map_string_h *settings = new_map_string();
const char *dump_dir_name = ".";
+ GList *conf_file = NULL;
+
+ /* Can't keep these strings/structs static: _() doesn't support that */
+ const char *program_usage_string = _(
+ PROGNAME" [-vs] -c CONFFILE -d DIR"
+ "\n"
+ "\nReport a crash to Bugzilla"
+ );
enum {
- OPT_s = (1 << 0),
+ OPT_v = 1 << 0,
+ OPT_s = 1 << 1,
+ OPT_d = 1 << 2,
+ OPT_c = 1 << 3,
};
- int optflags = 0;
- int opt;
- while ((opt = getopt(argc, argv, "c:d:vs")) != -1)
- {
- switch (opt)
- {
- case 'c':
- VERB1 log("Loading settings from '%s'", optarg);
- LoadPluginSettings(optarg, settings);
- VERB3 log("Loaded '%s'", optarg);
- break;
- case 'd':
- dump_dir_name = optarg;
- break;
- case 'v':
- g_verbose++;
- break;
- case 's':
- optflags |= OPT_s;
- break;
- default:
- /* Careful: the string below contains tabs, dont replace with spaces */
- error_msg_and_die(
- "Usage: abrt-action-bugzilla -c CONFFILE -d DIR [-vs]"
- "\n"
- "\nReport a crash to Bugzilla"
- "\n"
- "\nOptions:"
- "\n -c FILE Configuration file (may be given many times)"
- "\n -d DIR Crash dump directory"
- "\n -v Verbose"
- "\n -s Log to syslog"
- );
- }
- }
+ /* Keep enum above and order of options below in sync! */
+ struct options program_options[] = {
+ OPT__VERBOSE(&g_verbose),
+ OPT_BOOL( 's', NULL, NULL , _("Log to syslog")),
+ OPT_STRING('d', NULL, &dump_dir_name, "DIR" , _("Crash dump directory")),
+ OPT_LIST( 'c', NULL, &conf_file , "FILE", _("Configuration file (may be given many times)")),
+ OPT_END()
+ };
+ unsigned opts = parse_opts(argc, argv, program_options, program_usage_string);
putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
-
//DONT! our stdout/stderr goes directly to daemon, don't want to have prefix there.
-// msg_prefix = xasprintf("abrt-action-bugzilla[%u]", getpid());
-
- if (optflags & OPT_s)
+// msg_prefix = xasprintf(PROGNAME"[%u]", getpid());
+ if (opts & OPT_s)
{
openlog(msg_prefix, 0, LOG_DAEMON);
logmode = LOGMODE_SYSLOG;
}
+ while (conf_file)
+ {
+ char *fn = (char *)conf_file->data;
+ VERB1 log("Loading settings from '%s'", fn);
+ load_conf_file(fn, settings, /*skip key w/o values:*/ true);
+ VERB3 log("Loaded '%s'", fn);
+ conf_file = g_list_remove(conf_file, fn);
+ }
+
VERB1 log("Initializing XML-RPC library");
xmlrpc_env env;
xmlrpc_env_init(&env);
@@ -965,14 +956,8 @@ int main(int argc, char **argv)
error_msg_and_die("XML-RPC Fault: %s(%d)", env.fault_string, env.fault_code);
xmlrpc_env_clean(&env);
- try
- {
- report_to_bugzilla(dump_dir_name, settings);
- }
- catch (CABRTException& e)
- {
- error_msg_and_die("%s", e.what());
- }
+ report_to_bugzilla(dump_dir_name, settings);
+ free_map_string(settings);
return 0;
}
diff --git a/src/plugins/abrt-action-generate-backtrace.c b/src/plugins/abrt-action-generate-backtrace.c
index 64ce4082..a8c18e36 100644
--- a/src/plugins/abrt-action-generate-backtrace.c
+++ b/src/plugins/abrt-action-generate-backtrace.c
@@ -28,8 +28,9 @@
#define DEBUGINFO_CACHE_DIR LOCALSTATEDIR"/cache/abrt-di"
static const char *dump_dir_name = ".";
-static const char *debuginfo_dirs;
-static int exec_timeout_sec = 60;
+static const char *debuginfo_dirs = DEBUGINFO_CACHE_DIR;
+/* 60 seconds was too limiting on slow machines */
+static int exec_timeout_sec = 240;
static void create_hash(char hash_str[SHA1_RESULT_LEN*2 + 1], const char *pInput)
@@ -131,7 +132,7 @@ static char* exec_vp(char **args, uid_t uid, int redirect_stderr, int *status)
static char *get_backtrace(struct dump_dir *dd)
{
char *uid_str = dd_load_text(dd, FILENAME_UID);
- uid_t uid = xatoi_u(uid_str);
+ uid_t uid = xatoi_positive(uid_str);
free(uid_str);
char *executable = dd_load_text(dd, FILENAME_EXECUTABLE);
dd_close(dd);
@@ -244,49 +245,49 @@ static char *get_backtrace(struct dump_dir *dd)
return bt;
}
-static char *i_opt;
-static const char abrt_action_generage_backtrace_usage[] = PROGNAME" [options] -d DIR";
-enum {
- OPT_v = 1 << 0,
- OPT_d = 1 << 1,
- OPT_i = 1 << 2,
- OPT_t = 1 << 3,
- OPT_s = 1 << 4,
-};
-/* Keep enum above and order of options below in sync! */
-static struct options abrt_action_generate_backtrace_options[] = {
- OPT__VERBOSE(&g_verbose),
- OPT_STRING( 'd', NULL, &dump_dir_name, "DIR", "Crash dump directory"),
- OPT_STRING( 'i', NULL, &i_opt, "dir1[:dir2]...", "Additional debuginfo directories"),
- OPT_INTEGER('t', NULL, &exec_timeout_sec, "Kill gdb if it runs for more than N seconds"),
- OPT_BOOL( 's', NULL, NULL, "Log to syslog"),
- OPT_END()
-};
-
int main(int argc, char **argv)
{
char *env_verbose = getenv("ABRT_VERBOSE");
if (env_verbose)
g_verbose = atoi(env_verbose);
- unsigned opts = parse_opts(argc, argv, abrt_action_generate_backtrace_options,
- abrt_action_generage_backtrace_usage);
-
- debuginfo_dirs = DEBUGINFO_CACHE_DIR;
- if (i_opt)
- {
- debuginfo_dirs = xasprintf("%s:%s", DEBUGINFO_CACHE_DIR, i_opt);
- }
+ char *i_opt = NULL;
+
+ /* Can't keep these strings/structs static: _() doesn't support that */
+ const char *program_usage_string = _(
+ PROGNAME" [options] -d DIR"
+ );
+ enum {
+ OPT_v = 1 << 0,
+ OPT_d = 1 << 1,
+ OPT_i = 1 << 2,
+ OPT_t = 1 << 3,
+ OPT_s = 1 << 4,
+ };
+ /* Keep enum above and order of options below in sync! */
+ struct options program_options[] = {
+ OPT__VERBOSE(&g_verbose),
+ OPT_STRING( 'd', NULL, &dump_dir_name , "DIR" , _("Crash dump directory")),
+ OPT_STRING( 'i', NULL, &i_opt , "dir1[:dir2]...", _("Additional debuginfo directories")),
+ OPT_INTEGER('t', NULL, &exec_timeout_sec, _("Kill gdb if it runs for more than N seconds")),
+ OPT_BOOL( 's', NULL, NULL , _("Log to syslog")),
+ OPT_END()
+ };
+ unsigned opts = parse_opts(argc, argv, program_options, program_usage_string);
putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
- msg_prefix = PROGNAME;
-
+ //msg_prefix = PROGNAME;
if (opts & OPT_s)
{
openlog(msg_prefix, 0, LOG_DAEMON);
logmode = LOGMODE_SYSLOG;
}
+ if (i_opt)
+ {
+ debuginfo_dirs = xasprintf("%s:%s", DEBUGINFO_CACHE_DIR, i_opt);
+ }
+
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
return 1;
@@ -294,49 +295,70 @@ int main(int argc, char **argv)
char *package = dd_load_text(dd, FILENAME_PACKAGE);
char *executable = dd_load_text(dd, FILENAME_EXECUTABLE);
- /* Create and store backtrace */
+ /* Create gdb backtrace */
/* NB: get_backtrace() closes dd */
char *backtrace_str = get_backtrace(dd);
if (!backtrace_str)
{
backtrace_str = xstrdup("");
- VERB3 log("get_backtrace() returns NULL, broken core/gdb?");
+ log("get_backtrace() returns NULL, broken core/gdb?");
}
+ /* Compute backtrace hash */
+ struct btp_location location;
+ btp_location_init(&location);
+ char *backtrace_str_ptr = backtrace_str;
+ struct btp_backtrace *backtrace = btp_backtrace_parse(&backtrace_str_ptr, &location);
+
+ /* Store gdb backtrace */
+
dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
return 1;
-
dd_save_text(dd, FILENAME_BACKTRACE, backtrace_str);
+ /* Don't be completely silent. gdb run takes a few seconds,
+ * it is useful to let user know it (maybe) worked.
+ */
+ log(_("Backtrace is generated and saved, %u bytes"), (int)strlen(backtrace_str));
+ free(backtrace_str);
+
+ /* Store backtrace hash */
- /* Compute and store backtrace hash. */
- struct btp_location location;
- btp_location_init(&location);
- char *backtrace_str_ptr = backtrace_str;
- struct btp_backtrace *backtrace = btp_backtrace_parse(&backtrace_str_ptr, &location);
if (!backtrace)
{
+ /*
+ * The parser failed. Compute the UUID from the executable
+ * and package only. This is not supposed to happen often.
+ */
VERB1 log(_("Backtrace parsing failed for %s"), dump_dir_name);
VERB1 log("%d:%d: %s", location.line, location.column, location.message);
- /* If the parser failed compute the UUID from the executable
- and package only. This is not supposed to happen often.
- Do not store the rating, as we do not know how good the
- backtrace is. */
struct strbuf *emptybt = strbuf_new();
strbuf_prepend_str(emptybt, executable);
strbuf_prepend_str(emptybt, package);
+
char hash_str[SHA1_RESULT_LEN*2 + 1];
create_hash(hash_str, emptybt->buf);
+
dd_save_text(dd, FILENAME_DUPHASH, hash_str);
+ /*
+ * Other parts of ABRT assume that if no rating is available,
+ * it is ok to allow reporting of the bug. To be sure no bad
+ * backtrace is reported, rate the backtrace with the lowest
+ * rating.
+ */
+ dd_save_text(dd, FILENAME_RATING, "0");
strbuf_free(emptybt);
- free(backtrace_str);
free(package);
free(executable);
dd_close(dd);
- return 2;
+
+ /* Report success even if the parser failed, as the backtrace
+ * has been created and rated. The failure is caused by a flaw
+ * in the parser, not in the backtrace.
+ */
+ return 0;
}
- free(backtrace_str);
/* Compute duplication hash. */
char *str_hash_core = btp_backtrace_get_duplication_hash(backtrace);
@@ -344,8 +366,10 @@ int main(int argc, char **argv)
strbuf_append_str(str_hash, package);
strbuf_append_str(str_hash, executable);
strbuf_append_str(str_hash, str_hash_core);
+
char hash_str[SHA1_RESULT_LEN*2 + 1];
create_hash(hash_str, str_hash->buf);
+
dd_save_text(dd, FILENAME_DUPHASH, hash_str);
strbuf_free(str_hash);
free(str_hash_core);
@@ -368,14 +392,14 @@ int main(int argc, char **argv)
/* Get the function name from the crash frame. */
struct btp_frame *crash_frame = btp_backtrace_get_crash_frame(backtrace);
if (crash_frame)
- {
+ {
if (crash_frame->function_name &&
0 != strcmp(crash_frame->function_name, "??"))
{
dd_save_text(dd, FILENAME_CRASH_FUNCTION, crash_frame->function_name);
}
btp_frame_free(crash_frame);
- }
+ }
btp_backtrace_free(backtrace);
dd_close(dd);
diff --git a/src/plugins/abrt-action-install-debuginfo.c b/src/plugins/abrt-action-install-debuginfo.c
new file mode 100644
index 00000000..39915e59
--- /dev/null
+++ b/src/plugins/abrt-action-install-debuginfo.c
@@ -0,0 +1,43 @@
+#include <unistd.h>
+#include <string.h>
+
+#define EXECUTABLE "abrt-action-install-debuginfo.py"
+
+static void error_msg_and_die(const char *msg, const char *arg)
+{
+ write(2, msg, strlen(msg));
+ if (arg)
+ {
+ write(2, " '", 2);
+ write(2, msg, strlen(msg));
+ write(2, "'", 1);
+ }
+ write(2, "\n", 1);
+ exit(1);
+}
+
+
+/* A binary wrapper is needed around python scripts if we want
+ * to run them in sgid/suid mode.
+ *
+ * This is such a wrapper.
+ */
+int main(int argc, char **argv)
+{
+ /*
+ * We disallow passing of arguments which point to writable dirs.
+ * This way, the script will always use default arguments.
+ */
+ char **pp = argv;
+ char *arg;
+ while ((arg = *++pp) != NULL)
+ {
+ if (strncmp(arg, "--cache", 7) == 0)
+ error_msg_and_die("bad option", arg);
+ if (strncmp(arg, "--tmpdir", 8) == 0)
+ error_msg_and_die("bad option", arg);
+ }
+
+ execvp(EXECUTABLE, argv);
+ error_msg_and_die("Can't execute", EXECUTABLE);
+}
diff --git a/src/plugins/abrt-action-install-debuginfo.py b/src/plugins/abrt-action-install-debuginfo.py
index b16cc3e9..9253c87f 100755
--- a/src/plugins/abrt-action-install-debuginfo.py
+++ b/src/plugins/abrt-action-install-debuginfo.py
@@ -6,6 +6,7 @@
from subprocess import Popen, PIPE
import sys
import os
+import time
import getopt
import shutil
from yum import _, YumBase
@@ -51,7 +52,11 @@ def unmute_stdout():
def ask_yes_no(prompt, retries=4):
while True:
- response = raw_input(prompt)
+ try:
+ response = raw_input(prompt)
+ except EOFError:
+ log1("got eof, probably executed from helper, assuming - yes")
+ response = 'y'
if response in ('y', 'Y'):
return True
if response in ('n', 'N', ''):
@@ -65,30 +70,30 @@ def ask_yes_no(prompt, retries=4):
# ..that can lead to: foo.c No such file and directory
# files is not used...
def unpack_rpm(package_nevra, files, tmp_dir, destdir, keeprpm):
- package_file_suffix = ".rpm"
- package_full_path = tmp_dir + "/" + package_nevra + package_file_suffix
+ package_name = package_nevra + ".rpm"
+ package_full_path = tmp_dir + "/" + package_name
log1("Extracting %s to %s" % (package_full_path, destdir))
log2(files)
- print (_("Extracting cpio from %s") % (package_full_path))
+ print _("Extracting cpio from %s") % (package_full_path)
unpacked_cpio_path = tmp_dir + "/unpacked.cpio"
try:
unpacked_cpio = open(unpacked_cpio_path, 'wb')
except IOError, ex:
- print (_("Can't write to:"), (unpacked_cpio_path,ex))
+ print _("Can't write to '%s': %s") % (unpacked_cpio_path, ex)
return RETURN_FAILURE
rpm2cpio = Popen(["rpm2cpio", package_full_path],
- stdout=unpacked_cpio, bufsize=-1)
+ stdout = unpacked_cpio, bufsize = -1)
retcode = rpm2cpio.wait()
if retcode == 0:
log1("cpio written OK")
if not keeprpm:
log1("keeprpms = False, removing %s" % package_full_path)
- print _("Removing the temporary rpm file")
+ #print _("Removing temporary rpm file")
os.unlink(package_full_path)
else:
unpacked_cpio.close()
- print (_("Can't extract package: %s") % package_full_path)
+ print _("Can't extract package '%s'") % package_full_path
return RETURN_FAILURE
# close the file
@@ -96,18 +101,17 @@ def unpack_rpm(package_nevra, files, tmp_dir, destdir, keeprpm):
# and open it for reading
unpacked_cpio = open(unpacked_cpio_path, 'rb')
- print (_("Caching files from %s made from %s") %
- (unpacked_cpio_path, package_full_path))
+ print _("Caching files from %s made from %s") % ("unpacked.cpio", package_name)
cpio = Popen(["cpio","-i", "-d", "--quiet"],
stdin=unpacked_cpio, cwd=destdir, bufsize=-1)
retcode = cpio.wait()
if retcode == 0:
log1("files extracted OK")
- print _("Removing the temporary cpio file")
+ #print _("Removing temporary cpio file")
os.unlink(unpacked_cpio_path)
else:
- print (_("Can't extract files from: %s") % unpacked_cpio_path)
+ print _("Can't extract files from '%s'") % unpacked_cpio_path
return RETURN_FAILURE
class MyDownloadCallback(DownloadBaseCallback):
@@ -115,36 +119,42 @@ class MyDownloadCallback(DownloadBaseCallback):
self.total_pkgs = total_pkgs
self.downloaded_pkgs = 0
self.last_pct = 0
+ self.last_time = 0
DownloadBaseCallback.__init__(self)
def updateProgress(self, name, frac, fread, ftime):
- pct = int( frac*100 )
+ pct = int(frac * 100)
if pct == self.last_pct:
log2("percentage is the same, not updating progress")
return
self.last_pct = pct
- # if run from terminal we can have a fancy output
+ # if run from terminal we can have fancy output
if sys.stdout.isatty():
- sys.stdout.write("\033[sDownloading (%i of %i) %.30s : %.3s %%\033[u"
- % (self.downloaded_pkgs + 1, self.total_pkgs,
- name, pct)
- )
+ sys.stdout.write("\033[sDownloading (%i of %i) %s: %3u%%\033[u"
+ % (self.downloaded_pkgs + 1, self.total_pkgs, name, pct)
+ )
if pct == 100:
- print _("Downloading (%i of %i) %.30s : %.3s %%"
- % (self.downloaded_pkgs + 1, self.total_pkgs,
- name, pct)
- )
+ print (_("Downloading (%i of %i) %s: %3u%%")
+ % (self.downloaded_pkgs + 1, self.total_pkgs, name, pct)
+ )
# but we want machine friendly output when spawned from abrt-server
else:
- print (_("Downloading (%i of %i) %.30s : %.3s %%")
- % (self.downloaded_pkgs + 1, self.total_pkgs, name, pct)
- )
+ t = time.time()
+ if self.last_time == 0:
+ self.last_time = t
+ # update only every 10 seconds
+ if pct == 100 or self.last_time > t or t - self.last_time >= 10:
+ print (_("Downloading (%i of %i) %s: %3u%%")
+ % (self.downloaded_pkgs + 1, self.total_pkgs, name, pct)
+ )
+ self.last_time = t
+ if pct == 100:
+ self.last_time = 0
sys.stdout.flush()
class DebugInfoDownload(YumBase):
- """abrt-debuginfo-install --core=CORE tmpdir cachedir"""
def __init__(self, cache, tmp, keep_rpms=False):
self.cachedir = cache
self.tmpdir = tmp
@@ -166,13 +176,13 @@ class DebugInfoDownload(YumBase):
if not files:
return
- print _("Searching the missing debuginfo packages")
- # this suppress yum messages about setting up repositories
- mute_stdout()
+ if verbose == 0:
+ # this suppress yum messages about setting up repositories
+ mute_stdout()
# make yumdownloader work as non root user.
if not self.setCacheDir():
- self.logger.error("Error: Could not make cachedir, exiting")
+ self.logger.error("Error: can't make cachedir, exiting")
sys.exit(50)
# disable all not needed
@@ -191,13 +201,14 @@ class DebugInfoDownload(YumBase):
self.repos.populateSack(mdtype='metadata', cacheonly=1)
self.repos.populateSack(mdtype='filelists', cacheonly=1)
- # re-enable the output to stdout
- unmute_stdout()
+ if verbose == 0:
+ # re-enable the output to stdout
+ unmute_stdout()
not_found = []
package_files_dict = {}
for debuginfo_path in files:
- log2("yum whatprovides %s" %debuginfo_path)
+ log2("yum whatprovides %s" % debuginfo_path)
pkg = self.pkgSack.searchFiles(debuginfo_path)
# sometimes one file is provided by more rpms, we can use either of
# them, so let's use the first match
@@ -210,29 +221,23 @@ class DebugInfoDownload(YumBase):
installed_size += float(pkg[0].installedsize)
total_pkgs += 1
- log2("found pkg for %s" % debuginfo_path)
+ log2("found pkg for %s: %s" % (debuginfo_path, pkg[0]))
else:
log2("not found pkg for %s" % debuginfo_path)
not_found.append(debuginfo_path)
# connect our progress update callback
dnlcb = MyDownloadCallback(total_pkgs)
- self.repos.setProgressBar( dnlcb )
-
- log1("%i files in %i packages" % (len(files), total_pkgs))
+ self.repos.setProgressBar(dnlcb)
- print (_("To download: (%.2f) M / Installed size: %.2f M" %
- (
- todownload_size / (1024**2),
- installed_size / (1024**2))
- )
- )
- #print _("%i debug infos not found" % len(not_found))
-
- log1("packages: %i\nTo download: %f \nUnpacked size: %f" %
- (total_pkgs,
- todownload_size / (1024**2),
- installed_size / (1024**2)))
+ if verbose != 0 or len(not_found) != 0:
+ print _("Can't find packages for %u debuginfo files") % len(not_found)
+ if verbose != 0 or total_pkgs != 0:
+ print _("Found %u packages to download") % total_pkgs
+ print _("Downloading %.2fMb, installed size: %.2fMb") % (
+ todownload_size / (1024**2),
+ installed_size / (1024**2)
+ )
# ask only if we have terminal, because for now we don't have a way
# how to pass the question to gui and the response back
@@ -271,13 +276,13 @@ class DebugInfoDownload(YumBase):
downloaded_pkgs += 1
- if not self.keeprpms:
+ if not self.keeprpms and os.path.exists(self.tmpdir):
print (_("All downloaded packages have been extracted, removing %s")
% self.tmpdir)
try:
os.rmdir(self.tmpdir)
except OSError:
- print _("Can't remove %s, probably contains an error log")
+ print _("Can't remove %s, probably contains an error log" % self.tmpdir)
verbose = 0
def log1(message):
@@ -302,8 +307,7 @@ def extract_info_from_core(corefile):
#SEP = 3
EXECUTABLE = 4
- print (_("Analyzing corefile: %(corefile_path)s") %
- {"corefile_path":corefile})
+ print _("Analyzing corefile '%s'") % corefile
eu_unstrip_OUT = Popen(["eu-unstrip","--core=%s" % corefile, "-n"], stdout=PIPE, bufsize=-1).communicate()[0]
# parse eu_unstrip_OUT and return the list of build_ids
@@ -323,7 +327,7 @@ def extract_info_from_core(corefile):
#print eu_unstrip_OUT
# we failed to get build ids from the core -> die
if not eu_unstrip_OUT:
- log1("can't get build ids from the core")
+ print "Can't get build ids from %s" % corefile
return RETURN_FAILURE
lines = eu_unstrip_OUT.split('\n')
@@ -344,7 +348,7 @@ def extract_info_from_core(corefile):
libraries.add(library)
build_ids.add(build_id)
else:
- log2("skipping line %s" % line)
+ log2("skipping line '%s'" % line)
log1("Found %i build_ids" % len(build_ids))
log1("Found %i libs" % len(libraries))
return build_ids
@@ -354,7 +358,7 @@ def build_ids_to_path(build_ids):
build_id1=${build_id:0:2}
build_id2=${build_id:2}
file="usr/lib/debug/.build-id/$build_id1/$build_id2.debug"
- """
+ """
return ["/usr/lib/debug/.build-id/%s/%s.debug" % (b_id[:2], b_id[2:]) for b_id in build_ids]
# beware this finds only missing libraries, but not the executable itself ..
@@ -381,9 +385,7 @@ def clean_up():
try:
shutil.rmtree(tmpdir)
except OSError, ex:
- print (_("Can't remove %(tmpdir_path)s: %(reason)s")
- % {"tmpdir_path":tmpdir, "reason": ex }
- )
+ print _("Can't remove '%s': %s") % (tmpdir, ex)
def sigterm_handler(signum, frame):
clean_up()
@@ -391,10 +393,11 @@ def sigterm_handler(signum, frame):
def sigint_handler(signum, frame):
clean_up()
- print "\n", _("Exiting on user Command")
+ print "\n", _("Exiting on user command")
exit(RETURN_OK)
import signal
+
if __name__ == "__main__":
# abrt-server can send SIGTERM to abort the download
signal.signal(signal.SIGTERM, sigterm_handler)
@@ -404,15 +407,14 @@ if __name__ == "__main__":
cachedir = None
tmpdir = None
keeprpms = False
- result = RETURN_OK
noninteractive = False
# localization
init_gettext()
- help_text = _("Usage: %s --core=<COREFILE> "
- "--tmpdir=<TMPDIR> "
- "--cachedir=<CACHEDIR>") % sys.argv[0]
+ help_text = _("Usage: %s --core=COREFILE "
+ "--tmpdir=TMPDIR "
+ "--cache=CACHEDIR") % sys.argv[0]
try:
opts, args = getopt.getopt(sys.argv[1:], "vyhc:", ["help", "core=",
"cache=", "tmpdir=",
@@ -426,7 +428,7 @@ if __name__ == "__main__":
verbose += 1
elif opt == "-y":
noninteractive = True
- elif opt in ("--core","-c"):
+ elif opt in ("--core", "-c"):
core = arg
elif opt in ("--cache"):
cachedir = arg
@@ -443,30 +445,26 @@ if __name__ == "__main__":
print help_text
exit(RETURN_FAILURE)
if not cachedir:
- print _("You have to specify the path to cachedir.")
- print help_text
- exit(RETURN_FAILURE)
+ cachedir = "/var/cache/abrt-di"
if not tmpdir:
- print _("You have to specify the path to tmpdir.")
- print help_text
- exit(RETURN_FAILURE)
+ # security people prefer temp subdirs in app's private dir, like /var/run/abrt
+ # for now, we use /tmp...
+ tmpdir = "/tmp/abrt-tmp-debuginfo-%s.%u" % (time.strftime("%Y-%m-%d-%H:%M:%S"), os.getpid())
b_ids = extract_info_from_core(core)
if b_ids == RETURN_FAILURE:
exit(RETURN_FAILURE)
+
missing = filter_installed_debuginfos(b_ids, cachedir)
if missing:
log2(missing)
+ print _("Coredump references %u debuginfo files, %u of them are not installed") % (len(b_ids), len(missing))
downloader = DebugInfoDownload(cache=cachedir, tmp=tmpdir)
result = downloader.download(missing)
- else:
- print _("All debuginfo seems to be available")
- exit(RETURN_OK)
-
- missing = filter_installed_debuginfos(b_ids, cachedir)
- for bid in missing:
- log1("MISSING:%s" % bid)
-
- print _("Complete!")
- exit(result)
+ missing = filter_installed_debuginfos(b_ids, cachedir)
+ for bid in missing:
+ print _("Missing debuginfo file: %s") % bid
+ exit(result)
+ print _("All %u debuginfo files are available") % len(b_ids)
+ exit(RETURN_OK)
diff --git a/src/plugins/abrt-action-kerneloops.cpp b/src/plugins/abrt-action-kerneloops.c
index dea6df17..8d00da52 100644
--- a/src/plugins/abrt-action-kerneloops.cpp
+++ b/src/plugins/abrt-action-kerneloops.c
@@ -19,8 +19,7 @@
#include <curl/curl.h>
#include "abrtlib.h"
-#include "abrt_crash_dump.h"
-#include "abrt_exception.h"
+#include "parse_options.h"
#define PROGNAME "abrt-action-kerneloops"
@@ -85,26 +84,21 @@ static CURLcode http_post_to_kerneloops_site(const char *url, const char *oopsda
static void report_to_kerneloops(
const char *dump_dir_name,
- const map_plugin_settings_t& settings)
+ map_string_h *settings)
{
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
exit(1); /* error msg is already logged */
- map_crash_data_t pCrashData;
- load_crash_data_from_crash_dump_dir(dd, pCrashData);
+ crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
dd_close(dd);
- const char *backtrace = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_BACKTRACE);
+ const char *backtrace = get_crash_item_content_or_NULL(crash_data, FILENAME_BACKTRACE);
if (!backtrace)
error_msg_and_die("Error sending kernel oops due to missing backtrace");
- map_plugin_settings_t::const_iterator end = settings.end();
- map_plugin_settings_t::const_iterator it;
-
const char *env = getenv("KerneloopsReporter_SubmitURL");
- it = settings.find("SubmitURL");
- const char *submitURL = (env ? env : it == end ? "" : it->second.c_str());
+ const char *submitURL = (env ? env : get_map_string_item_or_empty(settings, "SubmitURL"));
if (!submitURL[0])
submitURL = "http://submit.kerneloops.org/submitoops.php";
@@ -114,6 +108,8 @@ static void report_to_kerneloops(
if (ret != CURLE_OK)
error_msg_and_die("Kernel oops has not been sent due to %s", curl_easy_strerror(ret));
+ free_crash_data(crash_data);
+
/* Server replies with:
* 200 thank you for submitting the kernel oops information
* RemoteIP: 34192fd15e34bf60fac6a5f01bba04ddbd3f0558
@@ -128,67 +124,52 @@ int main(int argc, char **argv)
if (env_verbose)
g_verbose = atoi(env_verbose);
- map_plugin_settings_t settings;
-
+ map_string_h *settings = new_map_string();
const char *dump_dir_name = ".";
+ GList *conf_file = NULL;
+
+ /* Can't keep these strings/structs static: _() doesn't support that */
+ const char *program_usage_string = _(
+ PROGNAME" [-vs] -c CONFFILE -d DIR"
+ "\n"
+ "\nReport a kernel oops to kerneloops.org (or similar) site"
+ );
enum {
- OPT_s = (1 << 0),
+ OPT_v = 1 << 0,
+ OPT_s = 1 << 1,
+ OPT_d = 1 << 2,
+ OPT_c = 1 << 3,
};
- int optflags = 0;
- int opt;
- while ((opt = getopt(argc, argv, "c:d:vs")) != -1)
- {
- switch (opt)
- {
- case 'c':
- VERB1 log("Loading settings from '%s'", optarg);
- LoadPluginSettings(optarg, settings);
- VERB3 log("Loaded '%s'", optarg);
- break;
- case 'd':
- dump_dir_name = optarg;
- break;
- case 'v':
- g_verbose++;
- break;
- case 's':
- optflags |= OPT_s;
- break;
- default:
- /* Careful: the string below contains tabs, dont replace with spaces */
- error_msg_and_die(
- "Usage: "PROGNAME" -c CONFFILE -d DIR [-vs]"
- "\n"
- "\nReport a kernel oops to kerneloops.org (or similar) site"
- "\n"
- "\nOptions:"
- "\n -c FILE Configuration file (may be given many times)"
- "\n -d DIR Crash dump directory"
- "\n -v Verbose"
- "\n -s Log to syslog"
- );
- }
- }
+ /* Keep enum above and order of options below in sync! */
+ struct options program_options[] = {
+ OPT__VERBOSE(&g_verbose),
+ OPT_BOOL( 's', NULL, NULL , _("Log to syslog")),
+ OPT_STRING('d', NULL, &dump_dir_name, "DIR" , _("Crash dump directory")),
+ OPT_LIST( 'c', NULL, &conf_file , "FILE", _("Configuration file (may be given many times)")),
+ OPT_END()
+ };
+ unsigned opts = parse_opts(argc, argv, program_options, program_usage_string);
putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
-
//DONT! our stdout/stderr goes directly to daemon, don't want to have prefix there.
// msg_prefix = xasprintf(PROGNAME"[%u]", getpid());
-
- if (optflags & OPT_s)
+ if (opts & OPT_s)
{
openlog(msg_prefix, 0, LOG_DAEMON);
logmode = LOGMODE_SYSLOG;
}
- try
+ while (conf_file)
{
- report_to_kerneloops(dump_dir_name, settings);
- }
- catch (CABRTException& e)
- {
- error_msg_and_die("%s", e.what());
+ char *fn = (char *)conf_file->data;
+ VERB1 log("Loading settings from '%s'", fn);
+ load_conf_file(fn, settings, /*skip key w/o values:*/ true);
+ VERB3 log("Loaded '%s'", fn);
+ conf_file = g_list_remove(conf_file, fn);
}
+ report_to_kerneloops(dump_dir_name, settings);
+
+ free_map_string(settings);
return 0;
}
diff --git a/src/plugins/abrt-action-mailx.cpp b/src/plugins/abrt-action-mailx.c
index fa7fd8a0..3debf449 100644
--- a/src/plugins/abrt-action-mailx.cpp
+++ b/src/plugins/abrt-action-mailx.c
@@ -21,8 +21,6 @@
#include "abrtlib.h"
#include "parse_options.h"
-#include "abrt_crash_dump.h"
-#include "abrt_exception.h"
#define PROGNAME "abrt-action-mailx"
@@ -47,73 +45,71 @@ static void exec_and_feed_input(uid_t uid, const char* text, char **args)
error_msg_and_die("Error running '%s'", args[0]);
}
-static char** append_str_to_vector(char **vec, unsigned &size, const char *str)
+static char** append_str_to_vector(char **vec, unsigned *size_p, const char *str)
{
//log("old vec: %p", vec);
+ unsigned size = *size_p;
vec = (char**) xrealloc(vec, (size+2) * sizeof(vec[0]));
vec[size] = xstrdup(str);
//log("new vec: %p, added [%d] %p", vec, size, vec[size]);
size++;
vec[size] = NULL;
+ *size_p = size;
return vec;
}
static void create_and_send_email(
const char *dump_dir_name,
- const map_plugin_settings_t& settings)
+ map_string_h *settings)
{
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
exit(1); /* error msg is already logged by dd_opendir */
- map_crash_data_t pCrashData;
- load_crash_data_from_crash_dump_dir(dd, pCrashData);
+ crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
dd_close(dd);
char* env;
- map_plugin_settings_t::const_iterator end = settings.end();
- map_plugin_settings_t::const_iterator it;
env = getenv("Mailx_Subject");
- it = settings.find("Subject");
- const char *subject = xstrdup(env ? env : (it != end ? it->second.c_str() : "[abrt] full crash report"));
+ const char *subject = (env ? env : get_map_string_item_or_NULL(settings, "Subject") ? : "[abrt] full crash report");
env = getenv("Mailx_EmailFrom");
- it = settings.find("EmailFrom");
- const char *email_from = (env ? env : (it != end ? it->second.c_str() : "user@localhost"));
+ const char *email_from = (env ? env : get_map_string_item_or_NULL(settings, "EmailFrom") ? : "user@localhost");
env = getenv("Mailx_EmailTo");
- it = settings.find("EmailTo");
- const char *email_to = (env ? env : (it != end ? it->second.c_str() : "root@localhost"));
+ const char *email_to = (env ? env : get_map_string_item_or_NULL(settings, "EmailTo") ? : "root@localhost");
env = getenv("Mailx_SendBinaryData");
- it = settings.find("SendBinaryData");
- bool send_binary_data = string_to_bool(env ? env : (it != end ? it->second.c_str() : "0"));
+ bool send_binary_data = string_to_bool(env ? env : get_map_string_item_or_empty(settings, "SendBinaryData"));
char **args = NULL;
unsigned arg_size = 0;
- args = append_str_to_vector(args, arg_size, "/bin/mailx");
+ args = append_str_to_vector(args, &arg_size, "/bin/mailx");
- char *dsc = make_description_mailx(pCrashData);
+ char *dsc = make_description_mailx(crash_data);
if (send_binary_data)
{
- map_crash_data_t::const_iterator it_cd;
- for (it_cd = pCrashData.begin(); it_cd != pCrashData.end(); it_cd++)
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, crash_data);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
{
- if (it_cd->second[CD_TYPE] == CD_BIN)
+ if (value->flags & CD_FLAG_BIN)
{
- args = append_str_to_vector(args, arg_size, "-a");
- args = append_str_to_vector(args, arg_size, it_cd->second[CD_CONTENT].c_str());
+ args = append_str_to_vector(args, &arg_size, "-a");
+ args = append_str_to_vector(args, &arg_size, value->content);
}
}
}
- args = append_str_to_vector(args, arg_size, "-s");
- args = append_str_to_vector(args, arg_size, subject);
- args = append_str_to_vector(args, arg_size, "-r");
- args = append_str_to_vector(args, arg_size, email_from);
- args = append_str_to_vector(args, arg_size, email_to);
+ args = append_str_to_vector(args, &arg_size, "-s");
+ args = append_str_to_vector(args, &arg_size, subject);
+ args = append_str_to_vector(args, &arg_size, "-r");
+ args = append_str_to_vector(args, &arg_size, email_from);
+ args = append_str_to_vector(args, &arg_size, email_to);
log(_("Sending an email..."));
- const char *uid_str = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_UID);
- exec_and_feed_input(xatoi_u(uid_str), dsc, args);
+ const char *uid_str = get_crash_item_content_or_NULL(crash_data, FILENAME_UID);
+ exec_and_feed_input(xatoi_positive(uid_str), dsc, args);
free(dsc);
@@ -122,6 +118,8 @@ static void create_and_send_email(
args -= arg_size;
free(args);
+ free_crash_data(crash_data);
+
log("Email was sent to: %s", email_to);
}
@@ -134,7 +132,8 @@ int main(int argc, char **argv)
const char *dump_dir_name = ".";
const char *conf_file = NULL;
- const char *program_usage = _(
+ /* Can't keep these strings/structs static: _() doesn't support that */
+ const char *program_usage_string = _(
PROGNAME" [-v] -d DIR [-c CONFFILE]\n"
"\n"
"Upload compressed tarball of crash dump"
@@ -151,29 +150,22 @@ int main(int argc, char **argv)
OPT_STRING('c', NULL, &conf_file , "CONFFILE", _("Config file")),
OPT_END()
};
-
- /*unsigned opts =*/ parse_opts(argc, argv, program_options, program_usage);
+ /*unsigned opts =*/ parse_opts(argc, argv, program_options, program_usage_string);
putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
//msg_prefix = PROGNAME;
- //if (optflags & OPT_s)
+ //if (opts & OPT_s)
//{
// openlog(msg_prefix, 0, LOG_DAEMON);
// logmode = LOGMODE_SYSLOG;
//}
- map_plugin_settings_t settings;
+ map_string_h *settings = new_map_string();
if (conf_file)
- LoadPluginSettings(conf_file, settings);
+ load_conf_file(conf_file, settings, /*skip key w/o values:*/ true);
- try
- {
- create_and_send_email(dump_dir_name, settings);
- }
- catch (CABRTException& e)
- {
- error_msg_and_die("%s", e.what());
- }
+ create_and_send_email(dump_dir_name, settings);
+ free_map_string(settings);
return 0;
}
diff --git a/src/plugins/abrt-action-print.cpp b/src/plugins/abrt-action-print.c
index 303c05f7..cc7fbb34 100644
--- a/src/plugins/abrt-action-print.cpp
+++ b/src/plugins/abrt-action-print.c
@@ -20,8 +20,6 @@
*/
#include "abrtlib.h"
#include "parse_options.h"
-#include "abrt_crash_dump.h"
-#include "abrt_exception.h"
#define PROGNAME "abrt-action-print"
@@ -35,10 +33,12 @@ int main(int argc, char **argv)
if (env_verbose)
g_verbose = atoi(env_verbose);
- const char *program_usage = _(
+ /* Can't keep these strings/structs static: _() doesn't support that */
+ const char *program_usage_string = _(
PROGNAME" [-v] [-o FILE] -d DIR\n"
"\n"
- "Print information about the crash to standard output");
+ "Print information about the crash to standard output"
+ );
enum {
OPT_v = 1 << 0,
OPT_d = 1 << 1,
@@ -51,8 +51,7 @@ int main(int argc, char **argv)
OPT_STRING('o', NULL, &output_file , "FILE", _("Output file")),
OPT_END()
};
-
- /*unsigned opts =*/ parse_opts(argc, argv, program_options, program_usage);
+ /*unsigned opts =*/ parse_opts(argc, argv, program_options, program_usage_string);
putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
//msg_prefix = PROGNAME;
@@ -75,25 +74,17 @@ int main(int argc, char **argv)
}
}
- try
- {
- struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
- if (!dd)
- return 1; /* error message is already logged */
+ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
+ if (!dd)
+ return 1; /* error message is already logged */
- map_crash_data_t pCrashData;
- load_crash_data_from_crash_dump_dir(dd, pCrashData);
- dd_close(dd);
+ crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
+ dd_close(dd);
- char *dsc = make_description_logger(pCrashData);
- fputs(dsc, stdout);
- free(dsc);
- }
- catch (CABRTException& e)
- {
- log("%s", e.what());
- return 1;
- }
+ char *dsc = make_description_logger(crash_data);
+ fputs(dsc, stdout);
+ free(dsc);
+ free_crash_data(crash_data);
if (output_file)
{
diff --git a/src/plugins/abrt-action-rhtsupport.cpp b/src/plugins/abrt-action-rhtsupport.c
index eb69489d..94523e08 100644
--- a/src/plugins/abrt-action-rhtsupport.cpp
+++ b/src/plugins/abrt-action-rhtsupport.c
@@ -22,21 +22,19 @@
#include "abrt_curl.h"
#include "abrt_xmlrpc.h"
#include "abrt_rh_support.h"
-#include "abrt_crash_dump.h"
-#include "abrt_exception.h"
+#include "parse_options.h"
#define PROGNAME "abrt-action-rhtsupport"
static void report_to_rhtsupport(
const char *dump_dir_name,
- const map_plugin_settings_t& settings)
+ map_string_h *settings)
{
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
exit(1); /* error msg is already logged by dd_opendir */
- map_crash_data_t pCrashData;
- load_crash_data_from_crash_dump_dir(dd, pCrashData);
+ crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
dd_close(dd);
/* Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing */
@@ -54,34 +52,31 @@ static void report_to_rhtsupport(
const char* package;
char* env;
- map_plugin_settings_t::const_iterator end = settings.end();
- map_plugin_settings_t::const_iterator it;
-
env = getenv("RHTSupport_URL");
- it = settings.find("URL");
- char *url = xstrdup(env ? env : it == end ? "https://api.access.redhat.com/rs" : it->second.c_str());
+ char *url = xstrdup(env ? env : (get_map_string_item_or_NULL(settings, "URL") ? : "https://api.access.redhat.com/rs"));
env = getenv("RHTSupport_Login");
- it = settings.find("Login");
- char *login = xstrdup(env ? env : it == end ? "" : it->second.c_str());
+ char *login = xstrdup(env ? env : get_map_string_item_or_empty(settings, "Login"));
env = getenv("RHTSupport_Password");
- it = settings.find("Password");
- char *password = xstrdup(env ? env : it == end ? "" : it->second.c_str());
+ char *password = xstrdup(env ? env : get_map_string_item_or_empty(settings, "Password"));
env = getenv("RHTSupport_SSLVerify");
- it = settings.find("SSLVerify");
- bool ssl_verify = string_to_bool(env ? env : it == end ? "1" : it->second.c_str());
+ bool ssl_verify = string_to_bool(env ? env : get_map_string_item_or_empty(settings, "SSLVerify"));
if (!login[0] || !password[0])
{
- errmsg = _("Empty login or password, please check RHTSupport.conf");
- goto ret;
+ free_crash_data(crash_data);
+ free(url);
+ free(login);
+ free(password);
+ error_msg_and_die(_("Empty login or password, please check RHTSupport.conf"));
+ return;
}
- package = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_PACKAGE);
- reason = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_REASON);
- function = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_CRASH_FUNCTION);
+ package = get_crash_item_content_or_NULL(crash_data, FILENAME_PACKAGE);
+ reason = get_crash_item_content_or_NULL(crash_data, FILENAME_REASON);
+ function = get_crash_item_content_or_NULL(crash_data, FILENAME_CRASH_FUNCTION);
{
struct strbuf *buf_summary = strbuf_new();
@@ -92,7 +87,7 @@ static void report_to_rhtsupport(
strbuf_append_strf(buf_summary, ": %s", reason);
summary = strbuf_free_nobuf(buf_summary);
- char *bz_dsc = make_description_bz(pCrashData);
+ char *bz_dsc = make_description_bz(crash_data);
dsc = xasprintf("abrt version: "VERSION"\n%s", bz_dsc);
free(bz_dsc);
}
@@ -100,7 +95,7 @@ static void report_to_rhtsupport(
file = new_reportfile();
/* SELinux guys are not happy with /tmp, using /var/run/abrt */
- tempfile = xasprintf(LOCALSTATEDIR"/run/abrt/tmp-%lu-%lu.tar.gz", (long)getpid(), (long)time(NULL));
+ tempfile = xasprintf(LOCALSTATEDIR"/run/abrt/tmp-%s-%lu.tar.gz", iso_date_string(NULL), (long)getpid());
int pipe_from_parent_to_child[2];
xpipe(pipe_from_parent_to_child);
@@ -124,21 +119,23 @@ static void report_to_rhtsupport(
}
{
- map_crash_data_t::const_iterator it = pCrashData.begin();
- for (; it != pCrashData.end(); it++)
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, crash_data);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
{
- if (it->first == FILENAME_COUNT) continue;
- if (it->first == CD_DUMPDIR) continue;
- if (it->first == FILENAME_INFORMALL) continue;
- if (it->first == FILENAME_MESSAGE) continue; // plugin's status message (if we already reported it yesterday)
- if (it->first == FILENAME_DESCRIPTION) continue; // package description
-
- const char *content = it->second[CD_CONTENT].c_str();
- if (it->second[CD_TYPE] == CD_TXT)
+ if (strcmp(name, FILENAME_COUNT) == 0) continue;
+ if (strcmp(name, CD_DUMPDIR) == 0) continue;
+ if (strcmp(name, FILENAME_INFORMALL) == 0) continue;
+ if (strcmp(name, FILENAME_MESSAGE) == 0) continue; // plugin's status message (if we already reported it yesterday)
+
+ const char *content = value->content;
+ if (value->flags & CD_FLAG_TXT)
{
- reportfile_add_binding_from_string(file, it->first.c_str(), content);
+ reportfile_add_binding_from_string(file, name, content);
}
- else if (it->second[CD_TYPE] == CD_BIN)
+ else if (value->flags & CD_FLAG_BIN)
{
const char *basename = strrchr(content, '/');
if (basename)
@@ -148,7 +145,7 @@ static void report_to_rhtsupport(
char *xml_name = concat_path_file("content", basename);
reportfile_add_binding_from_namedfile(file,
/*on_disk_filename */ content,
- /*binding_name */ it->first.c_str(),
+ /*binding_name */ name,
/*recorded_filename*/ xml_name,
/*binary */ 1);
if (tar_append_file(tar, (char*)content, xml_name) != 0)
@@ -248,6 +245,7 @@ static void report_to_rhtsupport(
free(url);
free(login);
free(password);
+ free_crash_data(crash_data);
if (errmsg)
error_msg_and_die("%s", errmsg);
@@ -259,59 +257,50 @@ int main(int argc, char **argv)
if (env_verbose)
g_verbose = atoi(env_verbose);
- map_plugin_settings_t settings;
-
+ map_string_h *settings = new_map_string();
const char *dump_dir_name = ".";
+ GList *conf_file = NULL;
+
+ /* Can't keep these strings/structs static: _() doesn't support that */
+ const char *program_usage_string = _(
+ PROGNAME" [-vs] -c CONFFILE -d DIR"
+ "\n"
+ "\nReport a crash to RHTSupport"
+ );
enum {
- OPT_s = (1 << 0),
+ OPT_v = 1 << 0,
+ OPT_s = 1 << 1,
+ OPT_d = 1 << 2,
+ OPT_c = 1 << 3,
};
- int optflags = 0;
- int opt;
- while ((opt = getopt(argc, argv, "c:d:vs")) != -1)
- {
- switch (opt)
- {
- case 'c':
- VERB1 log("Loading settings from '%s'", optarg);
- LoadPluginSettings(optarg, settings);
- VERB3 log("Loaded '%s'", optarg);
- break;
- case 'd':
- dump_dir_name = optarg;
- break;
- case 'v':
- g_verbose++;
- break;
- case 's':
- optflags |= OPT_s;
- break;
- default:
- /* Careful: the string below contains tabs, dont replace with spaces */
- error_msg_and_die(
- "Usage: "PROGNAME" -c CONFFILE -d DIR [-vs]"
- "\n"
- "\nReport a crash to RHTSupport"
- "\n"
- "\nOptions:"
- "\n -c FILE Configuration file (may be given many times)"
- "\n -d DIR Crash dump directory"
- "\n -v Verbose"
- "\n -s Log to syslog"
- );
- }
- }
+ /* Keep enum above and order of options below in sync! */
+ struct options program_options[] = {
+ OPT__VERBOSE(&g_verbose),
+ OPT_BOOL( 's', NULL, NULL , _("Log to syslog")),
+ OPT_STRING('d', NULL, &dump_dir_name, "DIR" , _("Crash dump directory")),
+ OPT_LIST( 'c', NULL, &conf_file , "FILE", _("Configuration file (may be given many times)")),
+ OPT_END()
+ };
+ unsigned opts = parse_opts(argc, argv, program_options, program_usage_string);
putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
-
//DONT! our stdout/stderr goes directly to daemon, don't want to have prefix there.
// msg_prefix = xasprintf(PROGNAME"[%u]", getpid());
-
- if (optflags & OPT_s)
+ if (opts & OPT_s)
{
openlog(msg_prefix, 0, LOG_DAEMON);
logmode = LOGMODE_SYSLOG;
}
+ while (conf_file)
+ {
+ char *fn = (char *)conf_file->data;
+ VERB1 log("Loading settings from '%s'", fn);
+ load_conf_file(fn, settings, /*skip key w/o values:*/ true);
+ VERB3 log("Loaded '%s'", fn);
+ conf_file = g_list_remove(conf_file, fn);
+ }
+
VERB1 log("Initializing XML-RPC library");
xmlrpc_env env;
xmlrpc_env_init(&env);
@@ -320,14 +309,8 @@ int main(int argc, char **argv)
error_msg_and_die("XML-RPC Fault: %s(%d)", env.fault_string, env.fault_code);
xmlrpc_env_clean(&env);
- try
- {
- report_to_rhtsupport(dump_dir_name, settings);
- }
- catch (CABRTException& e)
- {
- error_msg_and_die("%s", e.what());
- }
+ report_to_rhtsupport(dump_dir_name, settings);
+ free_map_string(settings);
return 0;
}
diff --git a/src/plugins/abrt-action-upload.cpp b/src/plugins/abrt-action-upload.c
index 9741f543..88380bd7 100644
--- a/src/plugins/abrt-action-upload.cpp
+++ b/src/plugins/abrt-action-upload.c
@@ -21,8 +21,6 @@
#include <curl/curl.h>
#include "abrtlib.h"
#include "parse_options.h"
-#include "abrt_crash_dump.h"
-#include "abrt_exception.h"
#define PROGNAME "abrt-action-upload"
@@ -104,7 +102,7 @@ static int send_file(const char *url, const char *filename)
static int create_and_upload_archive(
const char *dump_dir_name,
- const map_plugin_settings_t& settings)
+ map_string_h *settings)
{
int result = 0;
@@ -125,16 +123,12 @@ static int create_and_upload_archive(
//ArchiveType = .tar.bz2
//ExcludeFiles = foo,bar*,b*z
char* env;
- map_plugin_settings_t::const_iterator end = settings.end();
- map_plugin_settings_t::const_iterator it;
-
env = getenv("Upload_URL");
- it = settings.find("URL");
- const char *url = (env ? env : (it == end ? NULL : it->second.c_str()));
+ const char *url = (env ? env : get_map_string_item_or_empty(settings, "URL"));
/* Create a child gzip which will compress the data */
/* SELinux guys are not happy with /tmp, using /var/run/abrt */
- tempfile = xasprintf(LOCALSTATEDIR"/run/abrt/tmp-%lu-%lu.tar.gz", (long)getpid(), (long)time(NULL));
+ tempfile = xasprintf(LOCALSTATEDIR"/run/abrt/upload-%s-%lu.tar.gz", iso_date_string(NULL), (long)getpid());
int pipe_from_parent_to_child[2];
xpipe(pipe_from_parent_to_child);
child = fork();
@@ -167,7 +161,6 @@ static int create_and_upload_archive(
if (strcmp(short_name, CD_DUMPDIR) == 0) goto next;
if (strcmp(short_name, FILENAME_INFORMALL) == 0) goto next;
if (strcmp(short_name, FILENAME_MESSAGE) == 0) goto next; // plugin's status message (if we already reported it yesterday)
- if (strcmp(short_name, FILENAME_DESCRIPTION) == 0) goto next; // package description
// dd_get_next_file guarantees this:
//struct stat stbuf;
//if (stat(full_name, &stbuf) != 0)
@@ -249,7 +242,8 @@ int main(int argc, char **argv)
const char *conf_file = NULL;
const char *url = NULL;
- const char *program_usage = _(
+ /* Can't keep these strings/structs static: _() doesn't support that */
+ const char *program_usage_string = _(
PROGNAME" [-v] -d DIR [-c CONFFILE] [-u URL]\n"
"\n"
"Upload compressed tarball of crash dump"
@@ -268,32 +262,24 @@ int main(int argc, char **argv)
OPT_STRING('u', NULL, &url , "URL" , _("Base URL to upload to")),
OPT_END()
};
-
- /*unsigned opts =*/ parse_opts(argc, argv, program_options, program_usage);
+ /*unsigned opts =*/ parse_opts(argc, argv, program_options, program_usage_string);
putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
//msg_prefix = PROGNAME;
- //if (optflags & OPT_s)
+ //if (opts & OPT_s)
//{
// openlog(msg_prefix, 0, LOG_DAEMON);
// logmode = LOGMODE_SYSLOG;
//}
- map_plugin_settings_t settings;
+ map_string_h *settings = new_map_string();
if (url)
- settings["URL"] = url;
+ g_hash_table_replace(settings, xstrdup("URL"), xstrdup(url));
if (conf_file)
- LoadPluginSettings(conf_file, settings);
+ load_conf_file(conf_file, settings, /*skip key w/o values:*/ true);
- int result = 0;
- try
- {
- result = create_and_upload_archive(dump_dir_name, settings);
- }
- catch (CABRTException& e)
- {
- error_msg_and_die("%s", e.what());
- }
+ int result = create_and_upload_archive(dump_dir_name, settings);
+ free_map_string(settings);
return result;
}
diff --git a/src/plugins/abrt-dump-oops.c b/src/plugins/abrt-dump-oops.c
new file mode 100644
index 00000000..5b6a2062
--- /dev/null
+++ b/src/plugins/abrt-dump-oops.c
@@ -0,0 +1,710 @@
+/*
+ Copyright (C) 2011 ABRT team
+ Copyright (C) 2011 RedHat Inc
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ Authors:
+ Anton Arapov <anton@redhat.com>
+ Arjan van de Ven <arjan@linux.intel.com>
+ */
+#include <syslog.h>
+#include <asm/unistd.h> /* __NR_syslog */
+#include <sys/inotify.h>
+#include <sys/ioctl.h> /* ioctl(FIONREAD) */
+#include "abrtlib.h"
+#include "parse_options.h"
+
+#define PROGNAME "abrt-dump-oops"
+
+static void queue_oops(GList **vec, const char *data, const char *version)
+{
+ char *ver_data = xasprintf("%s\n%s", version, data);
+ *vec = g_list_append(*vec, ver_data);
+}
+
+/*
+ * extract_version tries to find the kernel version in given data
+ */
+static char *extract_version(const char *linepointer)
+{
+ if (strstr(linepointer, "Pid")
+ || strstr(linepointer, "comm")
+ || strstr(linepointer, "CPU")
+ || strstr(linepointer, "REGS")
+ || strstr(linepointer, "EFLAGS")
+ ) {
+ char* start;
+ char* end;
+
+ start = strstr((char*)linepointer, "2.6.");
+ if (start)
+ {
+ end = strchr(start, ')');
+ if (!end)
+ end = strchrnul(start, ' ');
+ return xstrndup(start, end-start);
+ }
+ }
+
+ return NULL;
+}
+
+/*
+ * extract_oops tries to find oops signatures in a log
+ */
+struct line_info {
+ char *ptr;
+ char level;
+};
+
+static int record_oops(GList **oopses, struct line_info* lines_info, int oopsstart, int oopsend)
+{
+ int q;
+ int len;
+ char *oops;
+ char *version;
+
+ len = 2;
+ for (q = oopsstart; q <= oopsend; q++)
+ len += strlen(lines_info[q].ptr) + 1;
+
+ oops = (char*)xzalloc(len);
+
+ version = NULL;
+ for (q = oopsstart; q <= oopsend; q++)
+ {
+ if (!version)
+ version = extract_version(lines_info[q].ptr);
+
+ if (lines_info[q].ptr[0])
+ {
+ strcat(oops, lines_info[q].ptr);
+ strcat(oops, "\n");
+ }
+ }
+ int rv = 1;
+ /* too short oopses are invalid */
+ if (strlen(oops) > 100)
+ queue_oops(oopses, oops, version ? version : "undefined");
+ else
+ {
+ VERB3 log("Dropped oops: too short");
+ rv = 0;
+ }
+ free(oops);
+ free(version);
+ return rv;
+}
+
+#define REALLOC_CHUNK 1000
+static int extract_oopses(GList **oopses, char *buffer, size_t buflen)
+{
+ char *c;
+ int linecount = 0;
+ int lines_info_alloc = 0;
+ struct line_info *lines_info = NULL;
+
+ /* Split buffer into lines */
+
+ if (buflen != 0)
+ buffer[buflen - 1] = '\n'; /* the buffer usually ends with \n, but let's make sure */
+ c = buffer;
+ while (c < buffer + buflen)
+ {
+ char linelevel;
+ char *c9;
+ char *colon;
+
+ c9 = (char*)memchr(c, '\n', buffer + buflen - c); /* a \n will always be found */
+ assert(c9);
+ *c9 = '\0'; /* turn the \n into a string termination */
+ if (c9 == c)
+ goto next_line;
+
+ /* Is it a syslog file (/var/log/messages or similar)?
+ * Even though _usually_ it looks like "Nov 19 12:34:38 localhost kernel: xxx",
+ * some users run syslog in non-C locale:
+ * "2010-02-22T09:24:08.156534-08:00 gnu-4 gnome-session[2048]: blah blah"
+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ !!!
+ * We detect it by checking for N:NN:NN pattern in first 15 chars
+ * (and this still is not good enough... false positive: "pci 0000:15:00.0: PME# disabled")
+ */
+ colon = strchr(c, ':');
+ if (colon && colon > c && colon < c + 15
+ && isdigit(colon[-1]) /* N:... */
+ && isdigit(colon[1]) /* ...N:NN:... */
+ && isdigit(colon[2])
+ && colon[3] == ':'
+ && isdigit(colon[4]) /* ...N:NN:NN... */
+ && isdigit(colon[5])
+ ) {
+ /* It's syslog file, not a bare dmesg */
+
+ /* Skip non-kernel lines */
+ char *kernel_str = strstr(c, "kernel: ");
+ if (kernel_str == NULL)
+ {
+ /* if we see our own marker:
+ * "hostname abrt: Kerneloops: Reported 1 kernel oopses to Abrt"
+ * we know we submitted everything upto here already */
+ if (strstr(c, "abrt:") && strstr(c, "Abrt"))
+ {
+ VERB3 log("Found our marker at line %d, restarting line count from 0", linecount);
+ linecount = 0;
+ lines_info_alloc = 0;
+ free(lines_info);
+ lines_info = NULL;
+ }
+ goto next_line;
+ }
+ c = kernel_str + sizeof("kernel: ")-1;
+ }
+
+ linelevel = 0;
+ /* store and remove kernel log level */
+ if (*c == '<' && c[1] && c[2] == '>')
+ {
+ linelevel = c[1];
+ c += 3;
+ }
+ /* remove jiffies time stamp counter if present */
+ if (*c == '[')
+ {
+ char *c2 = strchr(c, '.');
+ char *c3 = strchr(c, ']');
+ if (c2 && c3 && (c2 < c3) && (c3-c) < 14 && (c2-c) < 8)
+ {
+ c = c3 + 1;
+ if (*c == ' ')
+ c++;
+ }
+ }
+ if (linecount >= lines_info_alloc)
+ {
+ lines_info_alloc += REALLOC_CHUNK;
+ lines_info = (struct line_info*)xrealloc(lines_info,
+ lines_info_alloc * sizeof(lines_info[0]));
+ }
+ lines_info[linecount].ptr = c;
+ lines_info[linecount].level = linelevel;
+ linecount++;
+next_line:
+ c = c9 + 1;
+ }
+
+ /* Analyze lines */
+
+ int i;
+ char prevlevel = 0;
+ int oopsstart = -1;
+ int inbacktrace = 0;
+ int oopsesfound = 0;
+
+ i = 0;
+ while (i < linecount)
+ {
+ char *curline = lines_info[i].ptr;
+
+ if (curline == NULL)
+ {
+ i++;
+ continue;
+ }
+ while (*curline == ' ')
+ curline++;
+
+ if (oopsstart < 0)
+ {
+ /* Find start-of-oops markers */
+ /* In some comparisons, we skip 1st letter, to avoid dealing with
+ * changes in capitalization in kernel. For example, I see that
+ * current kernel git (at 2011-01-01) has both "kernel BUG at ..."
+ * and "Kernel BUG at ..." messages, and I don't want to change
+ * the code below whenever kernel is changed to use "K" (or "k")
+ * uniformly.
+ */
+ if (strstr(curline, /*g*/ "eneral protection fault:"))
+ oopsstart = i;
+ else if (strstr(curline, "BUG:"))
+ oopsstart = i;
+ else if (strstr(curline, /*k*/ "ernel BUG at"))
+ oopsstart = i;
+ else if (strstr(curline, "do_IRQ: stack overflow:"))
+ oopsstart = i;
+ else if (strstr(curline, "RTNL: assertion failed"))
+ oopsstart = i;
+ else if (strstr(curline, /*e*/ "eek! page_mapcount(page) went negative!"))
+ oopsstart = i;
+ else if (strstr(curline, /*n*/ "ear stack overflow (cur:"))
+ oopsstart = i;
+ else if (strstr(curline, /*d*/ "ouble fault:"))
+ oopsstart = i;
+ else if (strstr(curline, /*b*/ "adness at"))
+ oopsstart = i;
+ else if (strstr(curline, "NETDEV WATCHDOG"))
+ oopsstart = i;
+ else if (strstr(curline, "WARNING: at ")) /* WARN_ON() generated message */
+ oopsstart = i;
+ else if (strstr(curline, /*u*/ "nable to handle kernel"))
+ oopsstart = i;
+ else if (strstr(curline, /*s*/ "ysctl table check failed"))
+ oopsstart = i;
+ else if (strstr(curline, "INFO: possible recursive locking detected"))
+ oopsstart = i;
+ // Not needed: "--[ cut here ]--" is always followed
+ // by "Badness at", "kernel BUG at", or "WARNING: at" string
+ //else if (strstr(curline, "------------[ cut here ]------------"))
+ // oopsstart = i;
+ else if (strstr(curline, "list_del corruption"))
+ oopsstart = i;
+ else if (strstr(curline, "list_add corruption"))
+ oopsstart = i;
+
+ if (i >= 3 && strstr(curline, "Oops:"))
+ oopsstart = i-3;
+
+ if (oopsstart >= 0)
+ {
+ /* debug information */
+ VERB3 {
+ log("Found oops at line %d: '%s'", oopsstart, lines_info[oopsstart].ptr);
+ if (oopsstart != i)
+ log("Trigger line is %d: '%s'", i, c);
+ }
+ /* try to find the end marker */
+ int i2 = i + 1;
+ while (i2 < linecount && i2 < (i+50))
+ {
+ if (strstr(lines_info[i2].ptr, "---[ end trace"))
+ {
+ inbacktrace = 1;
+ i = i2;
+ break;
+ }
+ i2++;
+ }
+ }
+ }
+
+ /* Are we entering a call trace part? */
+ /* a call trace starts with "Call Trace:" or with the " [<.......>] function+0xFF/0xAA" pattern */
+ if (oopsstart >= 0 && !inbacktrace)
+ {
+ if (strstr(curline, "Call Trace:"))
+ inbacktrace = 1;
+ else
+ if (strnlen(curline, 9) > 8
+ && curline[0] == '[' && curline[1] == '<'
+ && strstr(curline, ">]")
+ && strstr(curline, "+0x")
+ && strstr(curline, "/0x")
+ ) {
+ inbacktrace = 1;
+ }
+ }
+
+ /* Are we at the end of an oops? */
+ else if (oopsstart >= 0 && inbacktrace)
+ {
+ int oopsend = INT_MAX;
+
+ /* line needs to start with " [" or have "] [" if it is still a call trace */
+ /* example: "[<ffffffffa006c156>] radeon_get_ring_head+0x16/0x41 [radeon]" */
+ if (curline[0] != '['
+ && !strstr(curline, "] [")
+ && !strstr(curline, "--- Exception")
+ && !strstr(curline, "LR =")
+ && !strstr(curline, "<#DF>")
+ && !strstr(curline, "<IRQ>")
+ && !strstr(curline, "<EOI>")
+ && !strstr(curline, "<<EOE>>")
+ && strncmp(curline, "Code: ", 6) != 0
+ && strncmp(curline, "RIP ", 4) != 0
+ && strncmp(curline, "RSP ", 4) != 0
+ ) {
+ oopsend = i-1; /* not a call trace line */
+ }
+ /* oops lines are always more than 8 chars long */
+ else if (strnlen(curline, 8) < 8)
+ oopsend = i-1;
+ /* single oopses are of the same loglevel */
+ else if (lines_info[i].level != prevlevel)
+ oopsend = i-1;
+ else if (strstr(curline, "Instruction dump:"))
+ oopsend = i;
+ /* if a new oops starts, this one has ended */
+ else if (strstr(curline, "WARNING: at ") && oopsstart != i) /* WARN_ON() generated message */
+ oopsend = i-1;
+ else if (strstr(curline, "Unable to handle") && oopsstart != i)
+ oopsend = i-1;
+ /* kernel end-of-oops marker (not including marker itself) */
+ else if (strstr(curline, "---[ end trace"))
+ oopsend = i-1;
+
+ if (oopsend <= i)
+ {
+ VERB3 log("End of oops at line %d (%d): '%s'", oopsend, i, lines_info[oopsend].ptr);
+ if (record_oops(oopses, lines_info, oopsstart, oopsend))
+ oopsesfound++;
+ oopsstart = -1;
+ inbacktrace = 0;
+ }
+ }
+
+ prevlevel = lines_info[i].level;
+ i++;
+
+ if (oopsstart >= 0)
+ {
+ /* Do we have a suspiciously long oops? Cancel it */
+ if (i-oopsstart > 60)
+ {
+ inbacktrace = 0;
+ oopsstart = -1;
+ VERB3 log("Dropped oops, too long");
+ continue;
+ }
+ if (!inbacktrace && i-oopsstart > 40)
+ {
+ /*inbacktrace = 0; - already is */
+ oopsstart = -1;
+ VERB3 log("Dropped oops, too long");
+ continue;
+ }
+ }
+ } /* while (i < linecount) */
+
+ /* process last oops if we have one */
+ if (oopsstart >= 0 && inbacktrace)
+ {
+ int oopsend = i-1;
+ VERB3 log("End of oops at line %d (end of file): '%s'", oopsend, lines_info[oopsend].ptr);
+ if (record_oops(oopses, lines_info, oopsstart, oopsend))
+ oopsesfound++;
+ }
+
+ free(lines_info);
+ return oopsesfound;
+}
+
+#define MAX_SCAN_BLOCK (4*1024*1024)
+#define READ_AHEAD (10*1024)
+
+static void scan_dmesg(GList **oops_list)
+{
+ VERB1 log("Scanning dmesg");
+
+ /* syslog(3) - read the last len bytes from the log buffer
+ * (non-destructively), but dont read more than was written
+ * into the buffer since the last "clear ring buffer" cmd.
+ * Returns the number of bytes read.
+ */
+ char *buffer = xzalloc(16*1024);
+ syscall(__NR_syslog, 3, buffer, 16*1024 - 1); /* always NUL terminated */
+ extract_oopses(oops_list, buffer, strlen(buffer));
+ free(buffer);
+}
+
+static int scan_syslog_file(GList **oops_list, int fd, struct stat *statbuf, int partial_line_len)
+{
+ /* fstat(fd, &statbuf) was just done by caller */
+
+ off_t cur_pos = lseek(fd, 0, SEEK_CUR);
+ if (statbuf->st_size <= cur_pos)
+ return partial_line_len; /* we are at EOF, nothing to do */
+
+ VERB3 log("File grew by %llu bytes, from %llu to %llu",
+ (long long)(statbuf->st_size - cur_pos),
+ (long long)(cur_pos),
+ (long long)(statbuf->st_size));
+
+ /* Do not try to allocate an absurd amount of memory. */
+ int sz = MAX_SCAN_BLOCK - READ_AHEAD;
+ if (sz > statbuf->st_size - cur_pos)
+ sz = statbuf->st_size - cur_pos;
+
+ /* Rewind to the beginning of the current line */
+ if (partial_line_len > 0 && lseek(fd, -partial_line_len, SEEK_CUR) != (off_t)-1)
+ {
+ VERB3 log("Went back %u bytes", partial_line_len);
+ cur_pos -= partial_line_len;
+ sz += partial_line_len;
+ }
+
+ /*
+ * In theory we have a race here, since someone can spew
+ * to /var/log/messages before we read it in...
+ * We try to deal with it by reading READ_AHEAD extra.
+ */
+ sz += READ_AHEAD;
+ char *buffer = xzalloc(sz);
+
+ partial_line_len = 0;
+ do {
+ int r = full_read(fd, buffer, sz-1);
+ if (r <= 0)
+ break;
+ VERB3 log("Read %u bytes", r);
+
+ /* For future scans, try to find where last (incomplete) line starts */
+ partial_line_len = 0;
+ char *last_newline = memrchr(buffer, '\n', r) ? : buffer-1;
+ partial_line_len = buffer+r - (last_newline+1);
+ if (partial_line_len > 500) /* cap it */
+ partial_line_len = 500;
+
+ extract_oopses(oops_list, buffer, r);
+ cur_pos += r;
+ } while (cur_pos < statbuf->st_size);
+
+ free(buffer);
+
+ return partial_line_len;
+}
+
+/* returns number of errors */
+static int save_oops_to_dump_dir(GList *oops_list, unsigned oops_cnt)
+{
+ unsigned countdown = 16; /* do not report hundreds of oopses */
+ unsigned idx = oops_cnt;
+ time_t t = time(NULL);
+ pid_t my_pid = getpid();
+
+ VERB1 log("Saving %u oopses as crash dump dirs", idx >= countdown ? countdown-1 : idx);
+
+ char *tainted_str = NULL;
+ /* once tainted flag is set to 1, only restart can reset the flag to 0 */
+ FILE *tainted_fp = fopen("/proc/sys/kernel/tainted", "r");
+ if (tainted_fp)
+ {
+ tainted_str = xmalloc_fgetline(tainted_fp);
+ fclose(tainted_fp);
+ }
+ else
+ error_msg("/proc/sys/kernel/tainted does not exist");
+
+ int errors = 0;
+
+ while (idx != 0 && --countdown != 0)
+ {
+ char path[sizeof(DEBUG_DUMPS_DIR"/kerneloops-%lu-%lu-%lu") + 3 * sizeof(long)*3];
+ sprintf(path, DEBUG_DUMPS_DIR"/kerneloops-%lu-%lu-%lu", (long)t, (long)my_pid, (long)idx);
+
+ char *first_line = (char*)g_list_nth_data(oops_list, --idx);
+ char *second_line = (char*)strchr(first_line, '\n'); /* never NULL */
+ *second_line++ = '\0';
+
+ struct dump_dir *dd = dd_create(path, /*uid:*/ 0);
+ if (dd)
+ {
+ dd_create_basic_files(dd, /*uid:*/ 0);
+ dd_save_text(dd, FILENAME_ANALYZER, "Kerneloops");
+ dd_save_text(dd, FILENAME_EXECUTABLE, "kernel");
+ dd_save_text(dd, FILENAME_KERNEL, first_line);
+ dd_save_text(dd, FILENAME_CMDLINE, "not_applicable");
+ dd_save_text(dd, FILENAME_BACKTRACE, second_line);
+ /* Optional, makes generated bz more informative */
+ strchrnul(second_line, '\n')[0] = '\0';
+ dd_save_text(dd, FILENAME_REASON, second_line);
+
+ if (tainted_str && tainted_str[0] != '0')
+ dd_save_text(dd, FILENAME_TAINTED, tainted_str);
+
+ free(tainted_str);
+ dd_close(dd);
+ }
+ else
+ errors++;
+ }
+
+ return errors;
+}
+
+int main(int argc, char **argv)
+{
+ char *env_verbose = getenv("ABRT_VERBOSE");
+ if (env_verbose)
+ g_verbose = atoi(env_verbose);
+
+ /* Can't keep these strings/structs static: _() doesn't support that */
+ const char *program_usage_string = _(
+ PROGNAME" [-vsrdow] FILE\n"
+ "\n"
+ "Extract oops from syslog/dmesg file"
+ );
+ enum {
+ OPT_v = 1 << 0,
+ OPT_s = 1 << 1,
+ OPT_r = 1 << 2,
+ OPT_d = 1 << 3,
+ OPT_o = 1 << 4,
+ OPT_w = 1 << 5,
+ };
+ /* Keep enum above and order of options below in sync! */
+ struct options program_options[] = {
+ OPT__VERBOSE(&g_verbose),
+ OPT_BOOL('s', NULL, NULL, _("Log to syslog")),
+ OPT_BOOL('r', NULL, NULL, _("Parse kernel's message buffer before parsing FILE")),
+ OPT_BOOL('d', NULL, NULL, _("Create ABRT dump for every oops found")),
+ OPT_BOOL('o', NULL, NULL, _("Print found oopses on standard output")),
+ OPT_BOOL('w', NULL, NULL, _("Do not exit, watch the file for new oopses")),
+ OPT_END()
+ };
+ unsigned opts = parse_opts(argc, argv, program_options, program_usage_string);
+
+ putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
+ msg_prefix = PROGNAME;
+ if ((opts & OPT_s)
+ || getenv("ABRT_SYSLOG")
+ ) {
+ openlog(msg_prefix, 0, LOG_DAEMON);
+ logmode = LOGMODE_SYSLOG;
+ }
+
+ argv += optind;
+ if (!argv[0])
+ show_usage_and_die(program_usage_string, program_options);
+ const char *filename = argv[0];
+
+ int inotify_fd = -1;
+ if (opts & OPT_w)
+ {
+ inotify_fd = inotify_init();
+ if (inotify_fd == -1)
+ perror_msg_and_die("inotify_init failed");
+ //close_on_exec_on(inotify_fd);
+ }
+
+ GList *oops_list = NULL;
+ if (opts & OPT_r)
+ /* Scan dmesg (only once even with -w) */
+ scan_dmesg(&oops_list);
+
+ int partial_line_len = 0;
+ struct stat statbuf;
+ int file_fd = -1;
+ int wd = -1;
+
+ while (1) /* loops only if -w */
+ {
+ /* If file is already opened, parse oopses from current pos */
+ if (file_fd >= 0)
+ {
+ memset(&statbuf, 0, sizeof(statbuf));
+ fstat(file_fd, &statbuf);
+ partial_line_len = scan_syslog_file(&oops_list, file_fd, &statbuf, partial_line_len);
+
+ /* Was file deleted or replaced? */
+ ino_t fd_ino = statbuf.st_ino;
+ if (stat(filename, &statbuf) != 0 || statbuf.st_ino != fd_ino) /* yes */
+ {
+ VERB2 log("Can't stat '%s', closing fd", filename);
+ close(file_fd);
+ if (wd >= 0)
+ inotify_rm_watch(inotify_fd, wd);
+ file_fd = -1;
+ wd = -1;
+ partial_line_len = 0;
+ }
+ }
+
+ /* If file isn't opened, try to open it and parse oopses */
+ if (file_fd < 0)
+ {
+ file_fd = open(filename, O_RDONLY);
+ if (file_fd < 0)
+ {
+ if (!(opts & OPT_w))
+ perror_msg_and_die("Can't open '%s'", filename);
+ /* with -w, we ignore open errors */
+ }
+ else
+ {
+ VERB2 log("Opened '%s'", filename);
+ /* For -w case, if we don't have inotify watch yet, open one */
+ if ((opts & OPT_w) && wd < 0)
+ {
+ wd = inotify_add_watch(inotify_fd, filename, IN_MODIFY | IN_MOVE_SELF | IN_DELETE_SELF);
+ if (wd < 0)
+ perror_msg("inotify_add_watch failed on '%s'", filename);
+ else
+ VERB2 log("Added inotify watch for '%s'", filename);
+ }
+ if (fstat(file_fd, &statbuf) == 0)
+ {
+ /* If file is large, skip the beginning.
+ * IOW: ignore old log messages because they are unlikely
+ * to have sufficiently recent data to be useful.
+ */
+ if (statbuf.st_size > (MAX_SCAN_BLOCK - READ_AHEAD))
+ lseek(file_fd, statbuf.st_size - (MAX_SCAN_BLOCK - READ_AHEAD), SEEK_SET);
+ /* Note that statbuf is filled by fstat by now,
+ * scan_syslog_file needs that
+ */
+ partial_line_len = scan_syslog_file(&oops_list, file_fd, &statbuf, partial_line_len);
+ }
+ }
+ }
+
+ /* Print and/or save oopses */
+ int oops_cnt = g_list_length(oops_list);
+ if (!(opts & OPT_w) || oops_cnt != 0)
+ log("Found oopses: %d", oops_cnt);
+ if (oops_cnt != 0)
+ {
+ if (opts & OPT_o)
+ {
+ int i = 0;
+ while (i < oops_cnt)
+ printf("\nVersion: %s", (char*)g_list_nth_data(oops_list, i++));
+ }
+ if (opts & OPT_d)
+ {
+ log("Creating dump directories");
+ int errors = save_oops_to_dump_dir(oops_list, oops_cnt);
+ if (errors > 0)
+ log("%d errors while dumping oopses", errors);
+ }
+ }
+ list_free_with_free(oops_list);
+ oops_list = NULL;
+
+ /* Done if no -w */
+ if (!(opts & OPT_w))
+ break;
+
+ /* Even if log file grows all the time, say, a new line every 5 ms,
+ * we don't want to scan it all the time. Sleep a bit and let it grow
+ * in bigger increments.
+ * Sleep longer if file does not exist.
+ */
+ sleep(file_fd >= 0 ? 1 : 59);
+
+ /* Now wait for it to change, be moved or deleted */
+ if (wd >= 0)
+ {
+ char buf[4096];
+ VERB3 log("Waiting for '%s' to change", filename);
+ /* We block here: */
+ int len = read(inotify_fd, buf, sizeof(buf));
+ if (len < 0 && errno != EINTR) /* I saw EINTR here on strace attach */
+ perror_msg("Error reading inotify fd");
+ /* we don't actually check what happened to file -
+ * the code will handle all possibilities.
+ */
+ VERB3 log("Change in '%s' detected", filename);
+ }
+
+ } /* while (1) */
+
+ return 0;
+}
diff --git a/src/plugins/abrt-plugins.7 b/src/plugins/abrt-plugins.7
index 28de8f02..d8027057 100644
--- a/src/plugins/abrt-plugins.7
+++ b/src/plugins/abrt-plugins.7
@@ -33,7 +33,6 @@ stored in the \fI/etc/abrt/plugins\fP directory.
.IR abrt-Bugzilla (7),
.IR abrt-Upload (7),
.IR abrt-KerneloopsReporter (7),
-.IR abrt-KerneloopsScanner (7),
.IR abrt-Logger (7),
.IR abrt-Mailx (7),
.SH AUTHOR
diff --git a/src/plugins/abrt_rh_support.c b/src/plugins/abrt_rh_support.c
index 04e2c8ef..9a48485b 100644
--- a/src/plugins/abrt_rh_support.c
+++ b/src/plugins/abrt_rh_support.c
@@ -212,69 +212,6 @@ reportfile_free(reportfile_t* file)
//
-// post_signature()
-//
-char*
-post_signature(const char* baseURL, bool ssl_verify, const char* signature)
-{
- char *URL = concat_path_file(baseURL, "/signatures");
-
- abrt_post_state_t *state = new_abrt_post_state(0
- + ABRT_POST_WANT_HEADERS
- + ABRT_POST_WANT_BODY
- + ABRT_POST_WANT_ERROR_MSG
- + (ssl_verify ? ABRT_POST_WANT_SSL_VERIFY : 0)
- );
- int http_resp_code = abrt_post_string(state, URL, "application/xml", signature);
- free(URL);
-
- char *retval;
- const char *strata_msg;
- switch (http_resp_code)
- {
- case 200:
- case 201:
- if (state->body)
- {
- retval = state->body;
- state->body = NULL;
- break;
- }
- strata_msg = find_header_in_abrt_post_state(state, "Strata-Message:");
- if (strata_msg && strcmp(strata_msg, "CREATED") != 0) {
- retval = xstrdup(strata_msg);
- break;
- }
- retval = xstrdup("Signature submitted successfully");
- break;
-
- default:
- strata_msg = find_header_in_abrt_post_state(state, "Strata-Message:");
- if (strata_msg)
- {
- retval = xasprintf("Error (HTTP response %d): %s",
- http_resp_code,
- strata_msg);
- break;
- }
- if (state->curl_error_msg)
- {
- if (http_resp_code >= 0)
- retval = xasprintf("Error (HTTP response %d): %s", http_resp_code, state->curl_error_msg);
- else
- retval = xasprintf("Error in HTTP transaction: %s", state->curl_error_msg);
- break;
- }
- retval = xasprintf("Error (HTTP response %d), body:\n%s", http_resp_code, state->body);
- break;
- }
-
- free_abrt_post_state(state);
- return retval;
-}
-
-
-//
// send_report_to_new_case()
//
@@ -391,6 +328,15 @@ send_report_to_new_case(const char* baseURL,
char *case_location = find_header_in_abrt_post_state(case_state, "Location:");
switch (case_state->http_resp_code)
{
+ case 404:
+ /* Not strictly necessary (default branch would deal with it too),
+ * but makes this typical error less cryptic:
+ * instead of returning html-encoded body, we show short concise message,
+ * and show offending URL (typos in which is a typical cause) */
+ retval = xasprintf("error in case creation, "
+ "HTTP code: 404 (Not found), URL:'%s'", case_url);
+ break;
+
case 301: /* "301 Moved Permanently" (for example, used to move http:// to https://) */
case 302: /* "302 Found" (just in case) */
case 305: /* "305 Use Proxy" */
@@ -401,27 +347,16 @@ send_report_to_new_case(const char* baseURL,
free_abrt_post_state(case_state);
goto redirect_case;
}
- goto bad_resp_code;
-
- case 404:
- /* Not strictly necessary, but makes this typical error less cryptic:
- * instead of returning html-encoded body, we show short concise message,
- * and show offending URL (typos in which is a typical cause) */
- retval = xasprintf("error in case creation, "
- "HTTP code: 404 (Not found), URL:'%s'", case_url);
- break;
+ /* fall through */
default:
- bad_resp_code:
errmsg = case_state->curl_error_msg;
- if (errmsg)
+ if (errmsg && errmsg[0])
retval = xasprintf("error in case creation: %s", errmsg);
else
{
- errmsg = find_header_in_abrt_post_state(case_state, "Strata-Message:");
- if ((!errmsg || !errmsg[0]) && case_state->body && case_state->body[0])
- errmsg = case_state->body;
- if (errmsg)
+ errmsg = case_state->body;
+ if (errmsg && errmsg[0])
retval = xasprintf("error in case creation, HTTP code: %d, server says: '%s'",
case_state->http_resp_code, errmsg);
else
@@ -467,9 +402,7 @@ send_report_to_new_case(const char* baseURL,
default:
/* Case Creation Succeeded, attachement FAILED */
- errmsg = find_header_in_abrt_post_state(atch_state, "Strata-Message:");
- if (!errmsg || !errmsg[0])
- errmsg = atch_state->curl_error_msg;
+ errmsg = atch_state->curl_error_msg;
if (atch_state->body && atch_state->body[0])
{
if (errmsg && errmsg[0]
diff --git a/src/plugins/ccpp_events.conf b/src/plugins/ccpp_events.conf
new file mode 100644
index 00000000..1ad57608
--- /dev/null
+++ b/src/plugins/ccpp_events.conf
@@ -0,0 +1,17 @@
+EVENT=post-create analyzer=CCpp abrt-action-analyze-c
+
+#TODO: implement this (or add this functionality to abrt-action-install-debuginfo):
+#EVENT=analyze analyzer=CCpp backtrace= trim-debuginfo-cache /var/cache/abrt-di 4096m
+
+#TODO: can we still specify additional directories to search for debuginfos,
+# or was this ability lost with move to python installer?
+EVENT=analyze analyzer=CCpp backtrace= abrt-action-install-debuginfo --core="$DUMP_DIR/coredump"
+EVENT=analyze analyzer=CCpp backtrace= abrt-action-generate-backtrace
+
+# Same as "analyze", but executed when user requests "refresh" in GUI
+#EVENT=reanalyze analyzer=CCpp trim-debuginfo-cache /var/cache/abrt-di 4096m
+EVENT=reanalyze analyzer=CCpp abrt-action-install-debuginfo --core="$DUMP_DIR/coredump"
+EVENT=reanalyze analyzer=CCpp abrt-action-generate-backtrace
+
+EVENT=report_Bugzilla analyzer=CCpp abrt-action-bugzilla -c /etc/abrt/plugins/Bugzilla.conf
+EVENT=report_Logger analyzer=CCpp abrt-action-print -o /var/log/abrt.log
diff --git a/src/report-python/Makefile.am b/src/report-python/Makefile.am
new file mode 100644
index 00000000..a00e2d7b
--- /dev/null
+++ b/src/report-python/Makefile.am
@@ -0,0 +1,42 @@
+pyreportexecdir = $(pyexecdir)/report
+
+pyreportexec_PYTHON = \
+ __init__.py \
+ accountmanager.py
+
+pyreportexec_LTLIBRARIES = _pyreport.la
+
+_pyreport_la_SOURCES = \
+ reportmodule.c \
+ crash_data.c \
+ dump_dir.c \
+ run_event.c \
+ common.h
+_pyreport_la_CPPFLAGS = \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
+ -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \
+ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
+ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
+ -DLOCALSTATEDIR='"$(localstatedir)"' \
+ -DCONF_DIR=\"$(CONF_DIR)\" \
+ -DVAR_RUN=\"$(VAR_RUN)\" \
+ $(GLIB_CFLAGS) \
+ $(PYTHON_CFLAGS) \
+ -D_GNU_SOURCE \
+ -Wall -Werror
+_pyreport_la_LDFLAGS = \
+ -module \
+ -avoid-version \
+ -export-symbols-regex init_pyreport
+_pyreport_la_LIBADD = \
+ ../lib/libreport.la
+
+# report compat:
+
+pyreportioexecdir = $(pyexecdir)/report/io
+
+pyreportioexec_PYTHON = \
+ io/__init__.py \
+ io/GTKIO.py \
+ io/NewtIO.py \
+ io/TextIO.py
diff --git a/src/report-python/__init__.py b/src/report-python/__init__.py
new file mode 100644
index 00000000..0b0f5685
--- /dev/null
+++ b/src/report-python/__init__.py
@@ -0,0 +1,130 @@
+from _pyreport import *
+
+
+#Compatibility with report package:
+
+import os
+
+def createAlertSignature(component, hashmarkername, hashvalue, summary, alertSignature):
+
+ SYSTEM_RELEASE_PATHS = ["/etc/system-release","/etc/redhat-release"]
+ ####SYSTEM_RELEASE_DEPS = ["system-release", "redhat-release"]
+
+ _hardcoded_default_product = ""
+ _hardcoded_default_version = ""
+
+ ####def getProduct_fromPRODUCT():
+ #### try:
+ #### import product
+ #### return product.productName
+ #### except:
+ #### return ""
+
+ ####def getVersion_fromPRODUCT():
+ #### try:
+ #### import product
+ #### return product.productVersion
+ #### except:
+ #### return ""
+
+ ####def getProduct_fromRPM():
+ #### try:
+ #### import rpm
+ #### ts = rpm.TransactionSet()
+ #### for each_dep in SYSTEM_RELEASE_DEPS:
+ #### mi = ts.dbMatch('provides', each_dep)
+ #### for h in mi:
+ #### if h['name']:
+ #### return h['name'].split("-")[0].capitalize()
+ ####
+ #### return ""
+ #### except:
+ #### return ""
+
+ ####def getVersion_fromRPM():
+ #### try:
+ #### import rpm
+ #### ts = rpm.TransactionSet()
+ #### for each_dep in SYSTEM_RELEASE_DEPS:
+ #### mi = ts.dbMatch('provides', each_dep)
+ #### for h in mi:
+ #### if h['version']:
+ #### return str(h['version'])
+ #### return ""
+ #### except:
+ #### return ""
+
+ def getProduct_fromFILE():
+ for each_path in SYSTEM_RELEASE_PATHS:
+ try:
+ file = open(each_path, "r")
+ content = file.read()
+ if content.startswith("Red Hat Enterprise Linux"):
+ return "Red Hat Enterprise Linux"
+ if content.startswith("Fedora"):
+ return "Fedora"
+ i = content.find(" release")
+ if i > -1:
+ return content[0:i]
+ except:
+ pass
+ return ""
+
+ def getVersion_fromFILE():
+ for each_path in SYSTEM_RELEASE_PATHS:
+ try:
+ file = open(each_path, "r")
+ content = file.read()
+ if content.find("Rawhide") > -1:
+ return "rawhide"
+ clist = content.split(" ")
+ i = clist.index("release")
+ return clist[i+1]
+ except:
+ pass
+ return ""
+
+ def getProduct():
+ ####product = getProduct_fromPRODUCT()
+ ####if product:
+ #### return product
+ product = getProduct_fromFILE()
+ if product:
+ return product
+ ####product = getProduct_fromRPM()
+ ####if product:
+ #### return product
+ return _hardcoded_default_product
+
+ def getVersion():
+ ####version = getVersion_fromPRODUCT()
+ ####if version:
+ #### return version
+ version = getVersion_fromFILE()
+ if version:
+ return version
+ ####version = getVersion_fromRPM()
+ ####if version:
+ #### return version
+ return _hardcoded_default_version
+
+ cd = crash_data()
+ cd.add("component", component)
+ cd.add("hashmarkername", hashmarkername)
+ cd.add("localhash", hashvalue)
+ cd.add("summary", summary)
+ cd.add("description", alertSignature)
+ cd.add("product", getProduct())
+ cd.add("version", getVersion())
+ return cd
+
+def report(cd, io_unused):
+ #dd = cd.create_dump_dir()
+ #dir_name = dd.name
+ #dd.close()
+ #r = os.spawnlp(P_WAIT, "abrt-handle-crashdump", "abrt-handle-crashdump", "-d", dirname, "-e" , "report");
+ ### Silmpler alternative:
+ state = run_event_state()
+ #state.logging_callback = logfunc
+ r = state.run_event_on_crash_data(cd, "report")
+ return r
diff --git a/src/report-python/accountmanager.py b/src/report-python/accountmanager.py
new file mode 100644
index 00000000..db8ed117
--- /dev/null
+++ b/src/report-python/accountmanager.py
@@ -0,0 +1,6 @@
+"""
+ Compatibility with report package
+"""
+
+class AccountManager:
+ pass
diff --git a/src/daemon/Daemon.h b/src/report-python/common.h
index 158b48fb..d6d209e9 100644
--- a/src/daemon/Daemon.h
+++ b/src/report-python/common.h
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2009 Denys Vlasenko (dvlasenk@redhat.com)
+ Copyright (C) 2009 Abrt team.
Copyright (C) 2009 RedHat inc.
This program is free software; you can redistribute it and/or modify
@@ -16,21 +16,32 @@
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#ifndef DAEMON_H_
-#define DAEMON_H_
-
-#include <pthread.h>
-#include "abrt_types.h"
-#include "abrt_crash_dump.h"
-
-class CCrashWatcher;
-class CCommLayerServer;
-class CPluginManager;
-
-/* Used for sending dbus signals */
-extern CCommLayerServer *g_pCommLayer;
-
-/* Collection of loaded plugins */
-extern CPluginManager* g_pPluginManager;
-
-#endif
+#include <Python.h>
+
+#include "dump_dir.h"
+#include "crash_data.h"
+#include "run_event.h"
+
+/* exception object */
+extern PyObject *ReportError;
+
+/* type objects */
+extern PyTypeObject p_crash_data_type;
+extern PyTypeObject p_dump_dir_type;
+extern PyTypeObject p_run_event_state_type;
+
+/* module-level functions */
+PyObject *p_dd_opendir(PyObject *module, PyObject *args);
+PyObject *p_dd_create(PyObject *module, PyObject *args);
+PyObject *p_delete_dump_dir(PyObject *pself, PyObject *args);
+
+/* python objects' struct defs */
+typedef struct {
+ PyObject_HEAD
+ struct dump_dir *dd;
+} p_dump_dir;
+
+typedef struct {
+ PyObject_HEAD
+ crash_data_t *cd;
+} p_crash_data;
diff --git a/src/report-python/crash_data.c b/src/report-python/crash_data.c
new file mode 100644
index 00000000..217560e5
--- /dev/null
+++ b/src/report-python/crash_data.c
@@ -0,0 +1,137 @@
+/*
+ Copyright (C) 2010 Abrt team.
+ Copyright (C) 2010 RedHat inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+#include <Python.h>
+#include <structmember.h>
+
+#include <errno.h>
+#include "common.h"
+
+static void
+p_crash_data_dealloc(PyObject *pself)
+{
+ p_crash_data *self = (p_crash_data*)pself;
+ free_crash_data(self->cd);
+ self->cd = NULL;
+ self->ob_type->tp_free(pself);
+}
+
+static PyObject *
+p_crash_data_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ p_crash_data *self = (p_crash_data *)type->tp_alloc(type, 0);
+ if (self)
+ self->cd = new_crash_data();
+ return (PyObject *)self;
+}
+
+//static int
+//p_crash_data_init(PyObject *pself, PyObject *args, PyObject *kwds)
+//{
+// return 0;
+//}
+
+/*
+void add_to_crash_data_ext(crash_data_t *crash_data,
+ const char *name,
+ const char *content,
+ unsigned flags);
+*/
+static PyObject *p_crash_data_add(PyObject *pself, PyObject *args)
+{
+ p_crash_data *self = (p_crash_data*)pself;
+
+ const char *name;
+ const char *content;
+ int flags = 0;
+ if (!PyArg_ParseTuple(args, "ss|i", &name, &content, &flags))
+ {
+ /* PyArg_ParseTuple raises the exception saying why it fails
+ * eg: TypeError: function takes exactly 2 arguments (1 given)
+ */
+ return NULL;
+ }
+ add_to_crash_data_ext(self->cd, name, content, flags);
+
+ /* every function returns PyObject, to return void we need to do this */
+ Py_RETURN_NONE;
+}
+
+/* struct crash_item *get_crash_data_item_or_NULL(crash_data_t *crash_data, const char *key); */
+static PyObject *p_get_crash_data_item(PyObject *pself, PyObject *args)
+{
+ p_crash_data *self = (p_crash_data*)pself;
+ const char *key;
+ if (!PyArg_ParseTuple(args, "s", &key))
+ {
+ return NULL;
+ }
+ struct crash_item *ci = get_crash_data_item_or_NULL(self->cd, key);
+ if (ci == NULL)
+ {
+ Py_RETURN_NONE;
+ }
+ return Py_BuildValue("sI", ci->content, ci->flags);
+}
+
+/* struct dump_dir *create_dump_dir_from_crash_data(crash_data_t *crash_data, const char *base_dir_name); */
+static PyObject *p_create_dump_dir_from_crash_data(PyObject *pself, PyObject *args)
+{
+ p_crash_data *self = (p_crash_data*)pself;
+ const char *base_dir_name = NULL;
+ if (!PyArg_ParseTuple(args, "|s", &base_dir_name))
+ {
+ return NULL;
+ }
+ p_dump_dir *new_dd = PyObject_New(p_dump_dir, &p_dump_dir_type);
+ if (!new_dd)
+ return NULL;
+ struct dump_dir *dd = create_dump_dir_from_crash_data(self->cd, base_dir_name);
+ if (!dd)
+ {
+ PyObject_Del((PyObject*)new_dd);
+ PyErr_SetString(ReportError, "Can't create the dump dir");
+ return NULL;
+ }
+ new_dd->dd = dd;
+ return (PyObject*)new_dd;
+}
+
+//static PyMemberDef p_crash_data_members[] = {
+// { NULL }
+//};
+
+static PyMethodDef p_crash_data_methods[] = {
+ /* method_name, func, flags, doc_string */
+ { "add" , p_crash_data_add , METH_VARARGS },
+ { "get" , p_get_crash_data_item , METH_VARARGS },
+ { "create_dump_dir", p_create_dump_dir_from_crash_data, METH_VARARGS },
+ { NULL }
+};
+
+PyTypeObject p_crash_data_type = {
+ PyObject_HEAD_INIT(NULL)
+ .tp_name = "report.crash_data",
+ .tp_basicsize = sizeof(p_crash_data),
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ .tp_new = p_crash_data_new,
+ .tp_dealloc = p_crash_data_dealloc,
+ //.tp_init = p_crash_data_init,
+ //.tp_members = p_crash_data_members,
+ .tp_methods = p_crash_data_methods,
+};
diff --git a/src/report-python/dump_dir.c b/src/report-python/dump_dir.c
new file mode 100644
index 00000000..c8ff3798
--- /dev/null
+++ b/src/report-python/dump_dir.c
@@ -0,0 +1,264 @@
+/*
+ On-disk storage of crash dumps
+
+ Copyright (C) 2010 Abrt team
+ Copyright (C) 2010 RedHat inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+#include <Python.h>
+#include <structmember.h>
+
+#include <errno.h>
+#include "common.h"
+
+/*** init/cleanup ***/
+
+static PyObject *
+p_dump_dir_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ p_dump_dir *self = (p_dump_dir *)type->tp_alloc(type, 0);
+ if (self)
+ self->dd = NULL;
+ return (PyObject *)self;
+}
+
+static void
+p_dump_dir_dealloc(PyObject *pself)
+{
+ p_dump_dir *self = (p_dump_dir*)pself;
+ dd_close(self->dd);
+ self->dd = NULL;
+ self->ob_type->tp_free(pself);
+}
+
+//static int
+//p_dump_dir_init(PyObject *pself, PyObject *args, PyObject *kwds)
+//{
+// return 0;
+//}
+
+
+/*** methods ***/
+
+/* void dd_close(struct dump_dir *dd); */
+static PyObject *p_dd_close(PyObject *pself, PyObject *args)
+{
+ p_dump_dir *self = (p_dump_dir*)pself;
+ dd_close(self->dd);
+ self->dd = NULL;
+ Py_RETURN_NONE;
+}
+
+/* void dd_delete(struct dump_dir *dd); */
+static PyObject *p_dd_delete(PyObject *pself, PyObject *args)
+{
+ p_dump_dir *self = (p_dump_dir*)pself;
+//Do we want to disallow delete() on non-opened dd?
+// if (!self->dd)
+// {
+// PyErr_SetString(ReportError, "dump dir is not open");
+// return NULL;
+// }
+ dd_delete(self->dd);
+ self->dd = NULL;
+ Py_RETURN_NONE;
+}
+
+/* int dd_exist(struct dump_dir *dd, const char *path); */
+static PyObject *p_dd_exist(PyObject *pself, PyObject *args)
+{
+ p_dump_dir *self = (p_dump_dir*)pself;
+ if (!self->dd)
+ {
+ PyErr_SetString(ReportError, "dump dir is not open");
+ return NULL;
+ }
+ const char *path;
+ if (!PyArg_ParseTuple(args, "s", &path))
+ {
+ return NULL;
+ }
+ return Py_BuildValue("i", dd_exist(self->dd, path));
+}
+
+/* DIR *dd_init_next_file(struct dump_dir *dd); */
+//static PyObject *p_dd_init_next_file(PyObject *pself, PyObject *args);
+/* int dd_get_next_file(struct dump_dir *dd, char **short_name, char **full_name); */
+//static PyObject *p_dd_get_next_file(PyObject *pself, PyObject *args);
+
+/* char* dd_load_text_ext(const struct dump_dir *dd, const char *name, unsigned flags); */
+/* char* dd_load_text(const struct dump_dir *dd, const char *name); */
+static PyObject *p_dd_load_text(PyObject *pself, PyObject *args)
+{
+ p_dump_dir *self = (p_dump_dir*)pself;
+ if (!self->dd)
+ {
+ PyErr_SetString(ReportError, "dump dir is not open");
+ return NULL;
+ }
+ const char *name;
+ int flags = 0;
+ if (!PyArg_ParseTuple(args, "s|i", &name, &flags))
+ {
+ return NULL;
+ }
+ char *val = dd_load_text_ext(self->dd, name, flags);
+ PyObject *obj = Py_BuildValue("s", val); /* NB: if val is NULL, obj is None */
+ free(val);
+ return obj;
+}
+
+/* void dd_save_text(struct dump_dir *dd, const char *name, const char *data); */
+static PyObject *p_dd_save_text(PyObject *pself, PyObject *args)
+{
+ p_dump_dir *self = (p_dump_dir*)pself;
+ if (!self->dd)
+ {
+ PyErr_SetString(ReportError, "dump dir is not open");
+ return NULL;
+ }
+ const char *name;
+ const char *data;
+ if (!PyArg_ParseTuple(args, "ss", &name, &data))
+ {
+ return NULL;
+ }
+ dd_save_text(self->dd, name, data);
+ Py_RETURN_NONE;
+}
+
+/* void dd_save_binary(struct dump_dir *dd, const char *name, const char *data, unsigned size); */
+static PyObject *p_dd_save_binary(PyObject *pself, PyObject *args)
+{
+ p_dump_dir *self = (p_dump_dir*)pself;
+ if (!self->dd)
+ {
+ PyErr_SetString(ReportError, "dump dir is not open");
+ return NULL;
+ }
+ const char *name;
+ const char *data;
+ unsigned size;
+ if (!PyArg_ParseTuple(args, "ssI", &name, &data, &size))
+ {
+ return NULL;
+ }
+ dd_save_binary(self->dd, name, data, size);
+ Py_RETURN_NONE;
+}
+
+
+/*** attribute getters/setters ***/
+
+static PyObject *get_name(PyObject *pself, void *unused)
+{
+ p_dump_dir *self = (p_dump_dir*)pself;
+ if (self->dd)
+ return Py_BuildValue("s", self->dd->dd_dirname);
+ Py_RETURN_NONE;
+}
+
+//static PyObject *set_name(PyObject *pself, void *unused)
+//{
+// PyErr_SetString(ReportError, "dump dir name is not settable");
+// Py_RETURN_NONE;
+//}
+
+
+/*** type object ***/
+
+static PyMethodDef p_dump_dir_methods[] = {
+ /* method_name, func, flags, doc_string */
+ { "close" , p_dd_close, METH_NOARGS, NULL },
+ { "delete" , p_dd_delete, METH_NOARGS, NULL },
+ { "exist" , p_dd_exist, METH_VARARGS, NULL },
+ { "load_text" , p_dd_load_text, METH_VARARGS, NULL },
+ { "save_text" , p_dd_save_text, METH_VARARGS, NULL },
+ { "save_binary", p_dd_save_binary, METH_VARARGS, NULL },
+ { NULL }
+};
+
+static PyGetSetDef p_dump_dir_getset[] = {
+ /* attr_name, getter_func, setter_func, doc_string, void_param */
+ { "name", get_name, NULL /*set_name*/ },
+ { NULL }
+};
+
+/* Support for "dd = dd_opendir(...); if [not] dd: ..." */
+static int p_dd_is_non_null(PyObject *pself)
+{
+ p_dump_dir *self = (p_dump_dir*)pself;
+ return self->dd != NULL;
+}
+static PyNumberMethods p_dump_dir_number_methods = {
+ .nb_nonzero = p_dd_is_non_null,
+};
+
+PyTypeObject p_dump_dir_type = {
+ PyObject_HEAD_INIT(NULL)
+ .tp_name = "report.dump_dir",
+ .tp_basicsize = sizeof(p_dump_dir),
+ /* Py_TPFLAGS_BASETYPE means "can be subtyped": */
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ .tp_new = p_dump_dir_new,
+ .tp_dealloc = p_dump_dir_dealloc,
+ //.tp_init = p_dump_dir_init,
+ //.tp_members = p_dump_dir_members,
+ .tp_methods = p_dump_dir_methods,
+ .tp_as_number = &p_dump_dir_number_methods,
+ .tp_getset = p_dump_dir_getset,
+};
+
+
+/*** module-level functions ***/
+
+/* struct dump_dir *dd_opendir(const char *dir, int flags); */
+PyObject *p_dd_opendir(PyObject *module, PyObject *args)
+{
+ const char *dir;
+ int flags = 0;
+ if (!PyArg_ParseTuple(args, "s|i", &dir, &flags))
+ return NULL;
+ p_dump_dir *new_dd = PyObject_New(p_dump_dir, &p_dump_dir_type);
+ if (!new_dd)
+ return NULL;
+ new_dd->dd = dd_opendir(dir, flags);
+ return (PyObject*)new_dd;
+}
+
+/* struct dump_dir *dd_create(const char *dir, uid_t uid); */
+PyObject *p_dd_create(PyObject *module, PyObject *args)
+{
+ const char *dir;
+ int uid = -1;
+ if (!PyArg_ParseTuple(args, "s|i", &dir, &uid))
+ return NULL;
+ p_dump_dir *new_dd = PyObject_New(p_dump_dir, &p_dump_dir_type);
+ if (!new_dd)
+ return NULL;
+ new_dd->dd = dd_create(dir, uid);
+ return (PyObject*)new_dd;
+}
+
+/* void delete_dump_dir(const char *dirname); */
+PyObject *p_delete_dump_dir(PyObject *pself, PyObject *args)
+{
+ const char *dirname;
+ if (!PyArg_ParseTuple(args, "s", &dirname))
+ return NULL;
+ delete_dump_dir(dirname);
+ Py_RETURN_NONE;
+}
diff --git a/src/report-python/io/GTKIO.py b/src/report-python/io/GTKIO.py
new file mode 100644
index 00000000..4cc8766e
--- /dev/null
+++ b/src/report-python/io/GTKIO.py
@@ -0,0 +1,11 @@
+"""
+ Compatibility with report package
+"""
+
+class GTKIO:
+ def __init__(self, loginManager = None):
+ pass
+
+#class FailDialog():
+# def __init__(self, title, message):
+# pass
diff --git a/src/report-python/io/NewtIO.py b/src/report-python/io/NewtIO.py
new file mode 100644
index 00000000..10eae284
--- /dev/null
+++ b/src/report-python/io/NewtIO.py
@@ -0,0 +1,7 @@
+"""
+ Compatibility with report package
+"""
+
+class NewtIO:
+ def __init__(self, screen = None):
+ pass
diff --git a/src/report-python/io/TextIO.py b/src/report-python/io/TextIO.py
new file mode 100644
index 00000000..6162fb8b
--- /dev/null
+++ b/src/report-python/io/TextIO.py
@@ -0,0 +1,6 @@
+"""
+ Compatibility with report package
+"""
+
+class TextIO:
+ pass
diff --git a/src/report-python/io/__init__.py b/src/report-python/io/__init__.py
new file mode 100644
index 00000000..2ae28399
--- /dev/null
+++ b/src/report-python/io/__init__.py
@@ -0,0 +1 @@
+pass
diff --git a/src/report-python/reportmodule.c b/src/report-python/reportmodule.c
new file mode 100644
index 00000000..fd58a3bd
--- /dev/null
+++ b/src/report-python/reportmodule.c
@@ -0,0 +1,83 @@
+/*
+ Copyright (C) 2010 Abrt team.
+ Copyright (C) 2010 RedHat inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+#include <Python.h>
+
+#include "common.h"
+
+PyObject *ReportError;
+
+static PyMethodDef module_methods[] = {
+ /* method_name, func, flags, doc_string */
+ { "dd_opendir" , p_dd_opendir , METH_VARARGS },
+ { "dd_create" , p_dd_create , METH_VARARGS },
+ { "delete_dump_dir", p_delete_dump_dir, METH_VARARGS },
+ { NULL }
+};
+
+#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
+#define PyMODINIT_FUNC void
+#endif
+PyMODINIT_FUNC
+init_pyreport(void)
+{
+ if (PyType_Ready(&p_crash_data_type) < 0)
+ {
+ printf("PyType_Ready(&p_crash_data_type) < 0\n");
+ return;
+ }
+ if (PyType_Ready(&p_dump_dir_type) < 0)
+ {
+ printf("PyType_Ready(&p_dump_dir_type) < 0\n");
+ return;
+ }
+ if (PyType_Ready(&p_run_event_state_type) < 0)
+ {
+ printf("PyType_Ready(&p_run_event_state_type) < 0\n");
+ return;
+ }
+
+ PyObject *m = Py_InitModule("_pyreport", module_methods);
+ //m = Py_InitModule3("_pyreport", module_methods, "Python wrapper for libreport");
+ if (!m)
+ {
+ printf("m == NULL\n");
+ return;
+ }
+
+ /* init the exception object */
+ ReportError = PyErr_NewException("_pyreport.error", NULL, NULL);
+ Py_INCREF(ReportError);
+ PyModule_AddObject(m, "error", ReportError);
+
+ /* init type objects */
+ Py_INCREF(&p_crash_data_type);
+ PyModule_AddObject(m, "crash_data", (PyObject *)&p_crash_data_type);
+ PyModule_AddObject(m, "CD_FLAG_BIN" , Py_BuildValue("i", CD_FLAG_BIN ));
+ PyModule_AddObject(m, "CD_FLAG_TXT" , Py_BuildValue("i", CD_FLAG_TXT ));
+ PyModule_AddObject(m, "CD_FLAG_ISEDITABLE" , Py_BuildValue("i", CD_FLAG_ISEDITABLE ));
+ PyModule_AddObject(m, "CD_FLAG_ISNOTEDITABLE", Py_BuildValue("i", CD_FLAG_ISNOTEDITABLE));
+
+ Py_INCREF(&p_dump_dir_type);
+ PyModule_AddObject(m, "dump_dir", (PyObject *)&p_dump_dir_type);
+ PyModule_AddObject(m, "DD_FAIL_QUIETLY" , Py_BuildValue("i", DD_FAIL_QUIETLY ));
+ PyModule_AddObject(m, "DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE", Py_BuildValue("i", DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE));
+
+ Py_INCREF(&p_run_event_state_type);
+ PyModule_AddObject(m, "run_event_state", (PyObject *)&p_run_event_state_type);
+}
diff --git a/src/report-python/run_event.c b/src/report-python/run_event.c
new file mode 100644
index 00000000..6131df8e
--- /dev/null
+++ b/src/report-python/run_event.c
@@ -0,0 +1,220 @@
+/*
+ Copyright (C) 2010 Abrt team.
+ Copyright (C) 2010 RedHat inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+#include <Python.h>
+#include <structmember.h>
+
+#include <errno.h>
+#include "common.h"
+#include "crash_data.h"
+#include "run_event.h"
+
+typedef struct {
+ PyObject_HEAD
+ struct run_event_state *state;
+ PyObject *post_run_callback;
+ PyObject *logging_callback;
+} p_run_event_state;
+
+
+/*** init/cleanup ***/
+
+static int post_run_callback(const char *dump_dir_name, void *param);
+static char *logging_callback(char *log_line, void *param);
+
+static PyObject *p_run_event_state_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ p_run_event_state *self = (p_run_event_state *)type->tp_alloc(type, 0);
+ if (self)
+ {
+ self->state = new_run_event_state();
+ self->state->post_run_callback = post_run_callback;
+ self->state->logging_callback = logging_callback;
+ self->state->post_run_param = self;
+ self->state->logging_param = self;
+ }
+ return (PyObject *)self;
+}
+
+static void p_run_event_state_dealloc(PyObject *pself)
+{
+ p_run_event_state *self = (p_run_event_state*)pself;
+ free_run_event_state(self->state);
+ self->state = NULL;
+ Py_XDECREF(self->post_run_callback);
+ self->post_run_callback = NULL;
+ Py_XDECREF(self->logging_callback);
+ self->logging_callback = NULL;
+ self->ob_type->tp_free(pself);
+}
+
+//static int
+//p_run_event_state_init(PyObject *pself, PyObject *args, PyObject *kwds)
+//{
+// return 0;
+//}
+
+
+/*** methods ***/
+
+/* First, C-level callback helpers for run_event_on_FOO(): */
+static int post_run_callback(const char *dump_dir_name, void *param)
+{
+ PyObject *obj = (PyObject*)param;
+ PyObject *ret = PyObject_CallMethod(obj, "post_run_callback", "(s)", dump_dir_name);
+ int r = 0;
+ if (ret)
+ {
+ r = PyInt_AsLong(ret);
+ Py_DECREF(ret);
+ }
+ // TODO: handle exceptions: if (PyErr_Occurred()) ...
+ return r;
+}
+static char *logging_callback(char *log_line, void *param)
+{
+ PyObject *obj = (PyObject*)param;
+ PyObject *ret = PyObject_CallMethod(obj, "logging_callback", "(s)", log_line);
+ Py_XDECREF(ret);
+ // TODO: handle exceptions: if (PyErr_Occurred()) ...
+ return log_line; /* signaling to caller that we didnt consume the string */
+}
+
+/* int run_event_on_dir_name(struct run_event_state *state, const char *dump_dir_name, const char *event); */
+static PyObject *p_run_event_on_dir_name(PyObject *pself, PyObject *args)
+{
+ p_run_event_state *self = (p_run_event_state*)pself;
+ const char *dump_dir_name;
+ const char *event;
+ if (!PyArg_ParseTuple(args, "ss", &dump_dir_name, &event))
+ {
+ return NULL;
+ }
+ int r = run_event_on_dir_name(self->state, dump_dir_name, event);
+ PyObject *obj = Py_BuildValue("i", r);
+ return obj;
+}
+
+/* int run_event_on_crash_data(struct run_event_state *state, crash_data_t *data, const char *event); */
+static PyObject *p_run_event_on_crash_data(PyObject *pself, PyObject *args)
+{
+ p_run_event_state *self = (p_run_event_state*)pself;
+ p_crash_data *cd;
+ const char *event;
+ if (!PyArg_ParseTuple(args, "O!s", &p_crash_data_type, &cd, &event))
+ {
+ return NULL;
+ }
+ int r = run_event_on_crash_data(self->state, cd->cd, event);
+ PyObject *obj = Py_BuildValue("i", r);
+ return obj;
+}
+
+/* TODO: char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const char *pfx); */
+
+
+/*** attribute getters/setters ***/
+
+static PyObject *get_post_run_callback(PyObject *pself, void *unused)
+{
+ p_run_event_state *self = (p_run_event_state*)pself;
+ if (self->post_run_callback)
+ {
+ Py_INCREF(self->post_run_callback);
+ return self->post_run_callback;
+ }
+ Py_RETURN_NONE;
+}
+
+static PyObject *get_logging_callback(PyObject *pself, void *unused)
+{
+ p_run_event_state *self = (p_run_event_state*)pself;
+ if (self->logging_callback)
+ {
+ Py_INCREF(self->logging_callback);
+ return self->logging_callback;
+ }
+ Py_RETURN_NONE;
+}
+
+static int set_post_run_callback(PyObject *pself, PyObject *callback, void *unused)
+{
+ p_run_event_state *self = (p_run_event_state*)pself;
+//WRONG: we aren't a Python function, calling convention is different
+// PyObject *callback;
+// if (!PyArg_ParseTuple(args, "O", &callback))
+// return -1;
+ if (!PyCallable_Check(callback))
+ {
+ PyErr_SetString(PyExc_TypeError, "parameter must be callable");
+ return -1;
+ }
+ Py_INCREF(callback);
+ Py_XDECREF(self->post_run_callback);
+ self->post_run_callback = callback;
+ return 0;
+}
+
+static int set_logging_callback(PyObject *pself, PyObject *callback, void *unused)
+{
+ p_run_event_state *self = (p_run_event_state*)pself;
+ if (!PyCallable_Check(callback))
+ {
+ PyErr_SetString(PyExc_TypeError, "parameter must be callable");
+ return -1;
+ }
+ Py_INCREF(callback);
+ Py_XDECREF(self->logging_callback);
+ self->logging_callback = callback;
+ return 0;
+}
+
+
+/*** type object ***/
+
+//static PyMemberDef p_run_event_state_members[] = {
+// { NULL }
+//};
+
+static PyMethodDef p_run_event_state_methods[] = {
+ /* method_name, func, flags, doc_string */
+ { "run_event_on_dir_name" , p_run_event_on_dir_name , METH_VARARGS },
+ { "run_event_on_crash_data", p_run_event_on_crash_data, METH_VARARGS },
+ { NULL }
+};
+
+static PyGetSetDef p_run_event_state_getset[] = {
+ /* attr_name, getter_func, setter_func, doc_string, void_param */
+ { "post_run_callback", get_post_run_callback, set_post_run_callback },
+ { "logging_callback" , get_logging_callback , set_logging_callback },
+ { NULL }
+};
+
+PyTypeObject p_run_event_state_type = {
+ PyObject_HEAD_INIT(NULL)
+ .tp_name = "report.run_event_state",
+ .tp_basicsize = sizeof(p_run_event_state),
+ /* Py_TPFLAGS_BASETYPE means "can be subtyped": */
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ .tp_new = p_run_event_state_new,
+ .tp_dealloc = p_run_event_state_dealloc,
+ //.tp_init = p_run_event_state_init,
+ //.tp_members = p_run_event_state_members,
+ .tp_methods = p_run_event_state_methods,
+ .tp_getset = p_run_event_state_getset,
+};
diff --git a/src/report-python/test_crash_data b/src/report-python/test_crash_data
new file mode 100755
index 00000000..6f719a8f
--- /dev/null
+++ b/src/report-python/test_crash_data
@@ -0,0 +1,21 @@
+#!/usr/bin/python
+
+from report import *
+
+cd = crash_data()
+cd.add("foo", "bar")
+
+dd = cd.create_dump_dir()
+
+if dd:
+ print "dd is nonzero"
+else:
+ print "dd is zero"
+
+print "closing"
+dd.close()
+
+if dd:
+ print "dd is nonzero"
+else:
+ print "dd is zero"
diff --git a/src/report-python/test_crash_data2 b/src/report-python/test_crash_data2
new file mode 100755
index 00000000..2594f863
--- /dev/null
+++ b/src/report-python/test_crash_data2
@@ -0,0 +1,10 @@
+#!/usr/bin/python
+
+from report import *
+
+cd = crash_data()
+cd.add("foo", "bar")
+
+print "foo:", cd.get("foo")
+print "nonexistent:", cd.get("nonexistent")
+print "done"
diff --git a/src/report-python/test_dd_create b/src/report-python/test_dd_create
new file mode 100755
index 00000000..4da29b11
--- /dev/null
+++ b/src/report-python/test_dd_create
@@ -0,0 +1,25 @@
+#!/usr/bin/python
+
+from report import *
+
+dd = dd_create("testdir")
+print dd
+
+if dd:
+ print "dd is nonzero"
+else:
+ print "dd is zero"
+
+print "name:", dd.name
+print "closing"
+dd.close()
+
+if dd:
+ print "dd is nonzero"
+else:
+ print "dd is zero"
+
+# Should fail here
+dd.name = "qwe"
+
+print "Done"
diff --git a/src/report-python/test_full b/src/report-python/test_full
new file mode 100755
index 00000000..103535dd
--- /dev/null
+++ b/src/report-python/test_full
@@ -0,0 +1,27 @@
+#!/usr/bin/python
+
+import sys
+from report import *
+
+def run_event_on_crash_data(cd, event, log_function = None):
+ dd = cd.create_dump_dir("/tmp")
+ dir_name = dd.name
+ print "Created dump_dir:", dir_name
+ dd.close()
+ run_state = run_event_state()
+ if log_function: # maybe if callable(log_function)?
+ run_state.logging_callback = log_function
+ print "Running event:", event
+ r = run_state.run_event_on_dir_name(dir_name, event)
+ print "Deleting:", dir_name
+ delete_dump_dir(dir_name)
+ return r;
+
+def log_function(line):
+ print "LOG:", line
+
+cd = crash_data()
+cd.add("foo", "bar")
+cd.add("analyzer", "baz", CD_FLAG_ISNOTEDITABLE)
+r = run_event_on_crash_data(cd, "post-create", log_function)
+print "Result:", r
diff --git a/src/report-python/test_full2 b/src/report-python/test_full2
new file mode 100755
index 00000000..734946eb
--- /dev/null
+++ b/src/report-python/test_full2
@@ -0,0 +1,17 @@
+#!/usr/bin/python
+
+import sys
+from report import *
+
+def log_function(line):
+ print "LOG:", line
+
+cd = crash_data()
+cd.add("foo", "bar")
+cd.add("analyzer", "baz", CD_FLAG_ISNOTEDITABLE)
+
+st = run_event_state()
+st.logging_callback = log_function
+r = st.run_event_on_crash_data(cd, "post-create")
+
+print "Result:", r
diff --git a/src/report-python/test_run_event_state b/src/report-python/test_run_event_state
new file mode 100755
index 00000000..3e391407
--- /dev/null
+++ b/src/report-python/test_run_event_state
@@ -0,0 +1,13 @@
+#!/usr/bin/python
+
+from report import *
+
+def func():
+ return 0
+
+res = run_event_state()
+print res
+print res.post_run_callback
+res.post_run_callback = func
+res.logging_callback = func
+print res.post_run_callback
diff --git a/src/report-python/test_run_event_state1 b/src/report-python/test_run_event_state1
new file mode 100755
index 00000000..6c3584fe
--- /dev/null
+++ b/src/report-python/test_run_event_state1
@@ -0,0 +1,27 @@
+#!/usr/bin/python
+
+import sys
+from report import *
+
+def post_run_callback(dump_dir_name):
+ return 0
+
+def logging_callback(line):
+ print "LOG:", line
+ return
+
+res = run_event_state()
+res.post_run_callback = post_run_callback
+res.logging_callback = logging_callback
+
+dd = dd_create("testdir")
+if not dd:
+ sys.exit(1)
+dd.save_text("analyzer", "foo")
+dd.close()
+
+res.run_event_on_dir_name("testdir", "post-create")
+
+dd = dd_opendir("testdir")
+dd.delete()
+dd.close()
diff --git a/src/report-python/test_setroubleshoot_example b/src/report-python/test_setroubleshoot_example
new file mode 100755
index 00000000..74428f16
--- /dev/null
+++ b/src/report-python/test_setroubleshoot_example
@@ -0,0 +1,18 @@
+#!/usr/bin/python
+
+import report
+import report.io
+import report.io.GTKIO
+import report.accountmanager
+
+accounts = report.accountmanager.AccountManager()
+
+signature = report.createAlertSignature("selinux-policy",
+ "setroubleshoot",
+ "self.siginfo.get_hash()",
+ "self.summary",
+ "content")
+
+rc = report.report(signature, report.io.GTKIO.GTKIO(accounts))
+
+print "rc:", rc
diff --git a/src/report-python/test_setroubleshoot_example2 b/src/report-python/test_setroubleshoot_example2
new file mode 100755
index 00000000..8aebcdfe
--- /dev/null
+++ b/src/report-python/test_setroubleshoot_example2
@@ -0,0 +1,27 @@
+#!/usr/bin/python
+
+import report
+import report.io
+import report.io.GTKIO
+import report.accountmanager
+
+accounts = report.accountmanager.AccountManager()
+
+signature = report.createAlertSignature("selinux-policy",
+ "setroubleshoot",
+ "self.siginfo.get_hash()",
+ "self.summary",
+ "content")
+
+# Won't send log anywhere:
+#rc = report.report(signature, report.io.GTKIO.GTKIO(accounts))
+
+# report.report() + logging:
+def logging_callback(line):
+ print "LOG:", line
+ return
+state = report.run_event_state()
+state.logging_callback = logging_callback
+rc = state.run_event_on_crash_data(signature, "report")
+
+print "rc:", rc
diff --git a/tests/btparser/thread.at b/tests/btparser/thread.at
index c36b796f..5a3976e3 100644
--- a/tests/btparser/thread.at
+++ b/tests/btparser/thread.at
@@ -275,6 +275,14 @@ int main(void)
" tv_sec = 1273231242, tv_nsec = 190522021}, __unused = {0, 0, 0}}\n",
&thread);
+ /* Another format of the header. */
+ check("Thread 3 (LWP 635):\n"
+ "#0 0x000000322160e7fd in fsync () at ../sysdeps/unix/syscall-template.S:82\n"
+ "No locals.\n"
+ "#1 0x000000322222987a in write_to_temp_file () at gfileutils.c:980\n"
+ "No locals.\n",
+ &thread);
+
return 0;
}
]])
@@ -347,3 +355,42 @@ int main(void)
return 0;
}
]])
+
+## ------------------- ##
+## btp_thread_skip_lwp ##
+## ------------------- ##
+
+AT_TESTFUN([btp_thread_skip_lwp],
+[[
+#include <thread.h>
+#include <assert.h>
+#include <stdlib.h>
+
+void check(char *input,
+ int expected_count)
+{
+ char *old_input = input;
+ assert(expected_count == btp_thread_skip_lwp(&input));
+ assert(input - old_input == expected_count);
+}
+
+int main(void)
+{
+ check("(LWP 20)", 8);
+ check("(LWP 20)10", 8);
+ check("(LWP 245443452355454343450)", 27);
+ check("(LWP 245443452355454343450) ", 27);
+
+ check("", 0);
+ check(" ", 0);
+ check(" (LWP 20)", 0);
+ check("(LWP", 0);
+ check("(LWP 20", 0);
+ check("(LWP )", 0);
+ check("(LWP 20()", 0);
+ check("(LWP 0x0)", 0);
+ check("(LWP 20(", 0);
+
+ return 0;
+}
+]])