* DeleteUploaded config option was added to abrt.conf * the default value of this new option is 'no'
* the option was introduced because /var/spool/abrt-upload is not writable by default * for more details see rhbz#836988 Signed-off-by: Jakub Filak <[email protected]> --- doc/abrt.conf.txt | 6 ++++++ src/daemon/abrt-handle-upload | 29 +++++++++++++++++++++-------- src/daemon/abrt.conf | 5 +++++ src/daemon/abrtd.c | 10 ++++++++-- src/include/libabrt.h | 3 +++ src/lib/abrt_conf.c | 8 ++++++++ 6 files changed, 51 insertions(+), 10 deletions(-) diff --git a/doc/abrt.conf.txt b/doc/abrt.conf.txt index db7f471..6626596 100644 --- a/doc/abrt.conf.txt +++ b/doc/abrt.conf.txt @@ -30,6 +30,12 @@ WatchCrashdumpArchiveDir = 'directory':: via ftp, scp, etc. The directory must exist and be writable for 'abrt'. There is no default. +DeleteUploaded = 'yes/no':: + The daemon will delete an uploaded crashdump archive after an atempt to + unpack it. An archive will be delete whether unpacking finishes successfully + or not. + The default value is 'no'. + SEE ALSO -------- abrtd(8) diff --git a/src/daemon/abrt-handle-upload b/src/daemon/abrt-handle-upload index a6ab3ae..85123d2 100755 --- a/src/daemon/abrt-handle-upload +++ b/src/daemon/abrt-handle-upload @@ -3,7 +3,12 @@ # The task of this script is to unpack the file and move # problem data found in it to abrtd spool directory. # -# Usage: abrt-handle-upload ABRT_SPOOL_DIR UPLOAD_DIR FILENAME +# Usage: abrt-handle-upload [-d] ABRT_SPOOL_DIR UPLOAD_DIR FILENAME +# +# -d - deletes an uploaded archive +# ABRT_SPOOL_DIR - a directory where valid uploaded archives are unpacked to +# UPLOAD_DIR - a directory where uploaded archives are stored in +# FILENAME - an uploaded archive file name #echo "Started: $0 $*" @@ -18,13 +23,15 @@ print_clean_and_die() die_exitcode=1 delete_on_exit="" +delete_archive=false +if test x"$1" == x"-d"; then delete_archive=true; shift; fi + abrt_dir="$1" upload_dir="$2" archive="$3" test -d "$abrt_dir" || print_clean_and_die "Not a directory: '$abrt_dir'" test -d "$upload_dir" || print_clean_and_die "Not a directory: '$upload_dir'" -test x"${archive%.working}" != x"$archive" && print_clean_and_die "Skipping: '$archive'" test x"${archive#/}" != x"$archive" && print_clean_and_die "Skipping: '$archive' (starts with slash)" test x"${archive#.}" != x"$archive" && print_clean_and_die "Skipping: '$archive' (starts with dot)" test x"${archive#*..}" != x"$archive" && print_clean_and_die "Skipping: '$archive' (contains ..)" @@ -41,17 +48,23 @@ test x"${archive%.tar.xz}" != x"$archive" && unpacker="unxz" test "$unpacker" || print_clean_and_die "Unknown file type: '$archive'" -tempdir="remote.`date +%Y-%m-%d-%H:%M:%S.%N`.$$" +workingdir=`mktemp -d "abrt_handle_upload.XXXXXXXXXX" --tmpdir=/tmp` || print_clean_and_die "Can't create working directory" +delete_on_exit="$workingdir" + +tempdir="$workingdir/remote.`date +%Y-%m-%d-%H:%M:%S.%N`.$$" +working_archive="$workingdir/$archive" -mv -- "$archive" "$archive.working" || print_clean_and_die "Can't lock '$archive'" +if $delete_archive; then + mv -- "$archive" "$working_archive" || print_clean_and_die "Can't move '$archive' to '$working_archive'" +else + cp -- "$archive" "$working_archive" || print_clean_and_die "Can't copy '$archive' to '$working_archive'" +fi -delete_on_exit="$archive.working" -$unpacker -t -- "$archive.working" || print_clean_and_die "Verification error on '$archive'" +$unpacker -t -- "$working_archive" || print_clean_and_die "Verification error on '$archive'" echo "Unpacking '$archive'" mkdir "$tempdir" || print_clean_and_die "Can't create '$tempdir' directory" -delete_on_exit="$archive.working $tempdir" -$unpacker <"$archive.working" | tar xf - -C "$tempdir" || print_clean_and_die "Can't unpack '$archive'" +$unpacker <"$working_archive" | tar xf - -C "$tempdir" || print_clean_and_die "Can't unpack '$archive'" # The archive can contain either plain dump files # or one or more complete problem data directories. diff --git a/src/daemon/abrt.conf b/src/daemon/abrt.conf index 9a35f0c..c7ad417 100644 --- a/src/daemon/abrt.conf +++ b/src/daemon/abrt.conf @@ -15,3 +15,8 @@ MaxCrashReportsSize = 1000 # Changing dump location could cause problems with SELinux. See man abrt_selinux(8). # #DumpLocation = /var/spool/abrt + +# If you want to automatically clean the upload directory you have to tweak the +# selinux policy. +# +DeleteUploaded = no diff --git a/src/daemon/abrtd.c b/src/daemon/abrtd.c index d4efec4..1112591 100644 --- a/src/daemon/abrtd.c +++ b/src/daemon/abrtd.c @@ -501,8 +501,14 @@ static gboolean handle_inotify_cb(GIOChannel *gio, GIOCondition condition, gpoin if (pid == 0) { xchdir(dir); - execlp("abrt-handle-upload", "abrt-handle-upload", - g_settings_dump_location, dir, name, (char*)NULL); + + if (g_settings_delete_uploaded) + execlp("abrt-handle-upload", "abrt-handle-upload", "-d", + g_settings_dump_location, dir, name, (char*)NULL); + else + execlp("abrt-handle-upload", "abrt-handle-upload", + g_settings_dump_location, dir, name, (char*)NULL); + error_msg_and_die("Can't execute '%s'", "abrt-handle-upload"); } if (pid > 0) diff --git a/src/include/libabrt.h b/src/include/libabrt.h index fff80ef..48d2ac3 100644 --- a/src/include/libabrt.h +++ b/src/include/libabrt.h @@ -56,6 +56,9 @@ extern unsigned int g_settings_nMaxCrashReportsSize; extern char * g_settings_sWatchCrashdumpArchiveDir; #define g_settings_dump_location abrt_g_settings_dump_location extern char * g_settings_dump_location; +#define g_settings_delete_uploaded abrt_g_settings_delete_uploaded +extern bool g_settings_delete_uploaded; + #define load_abrt_conf abrt_load_abrt_conf int load_abrt_conf(); diff --git a/src/lib/abrt_conf.c b/src/lib/abrt_conf.c index fc8a04f..0b53c21 100644 --- a/src/lib/abrt_conf.c +++ b/src/lib/abrt_conf.c @@ -21,6 +21,7 @@ char * g_settings_sWatchCrashdumpArchiveDir = NULL; unsigned int g_settings_nMaxCrashReportsSize = 1000; char * g_settings_dump_location = NULL; +bool g_settings_delete_uploaded = 0; void free_abrt_conf_data() { @@ -64,6 +65,13 @@ static void ParseCommon(map_string_h *settings, const char *conf_filename) else g_settings_dump_location = xstrdup("/var/spool/abrt"); + value = g_hash_table_lookup(settings, "DeleteUploaded"); + if (value) + { + g_settings_delete_uploaded = string_to_bool(value); + g_hash_table_remove(settings, "DeleteUploaded"); + } + GHashTableIter iter; char *name; /*char *value; - already declared */ -- 1.7.10.4
