diff options
author | Karel Klic <kklic@redhat.com> | 2011-03-01 12:08:36 +0100 |
---|---|---|
committer | Karel Klic <kklic@redhat.com> | 2011-03-01 12:08:36 +0100 |
commit | 85f639b7fe277ba327e5013e5b101b4a67f14e1d (patch) | |
tree | 7caa3999e8c987e3ddbc26f4bfbbdc73defca73f | |
parent | fb52104af74bbf6eeda394880666df40b4354aba (diff) | |
parent | 77468fcdd7cc05db52320c373a24a5490ff32f52 (diff) | |
download | abrt-85f639b7fe277ba327e5013e5b101b4a67f14e1d.tar.gz abrt-85f639b7fe277ba327e5013e5b101b4a67f14e1d.tar.xz abrt-85f639b7fe277ba327e5013e5b101b4a67f14e1d.zip |
merge changes from master
196 files changed, 17321 insertions, 12062 deletions
@@ -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 @@ -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 ;; @@ -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, @@ -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:" @@ -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:" @@ -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" @@ -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 सेटिंग जाà¤à¤šà¥‡à¤‚." @@ -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 "" -#~ "ã„ãšã‚Œã®ãƒ—ラグインã«ã‚ˆã‚‹è©•ä¾¡ã‚‚å¿…è¦ã‚ã‚Šã¾ã›ã‚“。確èªã‚’çœç•¥ã—ã¦ã„ã¾ã™..." @@ -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" @@ -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." @@ -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 ସଂରଚନାକà ଯାଞàଚ କରନàତà।" @@ -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 ਸੈਟਿੰਗ ਚੈੱਕ ਕਰੋ ਜੀ।" @@ -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 " @@ -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 கூடà¯à®¤à®²à¯ இணைபà¯à®ªà¯ˆ இயகà¯à®•à¯à®•à®¿à®±à®¤à¯..." + @@ -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 "à°—à±à°²à±‹à°¬à°²à± యూనివరà±à°¸à°²à± à°¯à±à°¨à°¿à°•à± à°—à±à°°à±à°¤à°¿à°‚à°ªà±à°¨à± పొందà±à°¤à±‹à°‚ది..." @@ -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">●</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"><b>Your comments are not private.</b> 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áirín Duffy <duffy@redhat.com></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áirín Duffy <duffy@redhat.com></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"><b>Plugin</b></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"><b>Time (or period)</b></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"><b>Analyzer plugin</b></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"><b>Associated action</b></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; +} +]]) |