diff --git a/backup.sh b/backup.sh index 966f2dd..18d2cc0 100755 --- a/backup.sh +++ b/backup.sh @@ -4,7 +4,7 @@ # https://github.com/nicolaschan/minecraft-backup # MIT License # -# For Minecraft servers running in a GNU screen. +# For Minecraft servers running in a GNU screen, tmux, or RCON. # For most convenience, run automatically with cron. # Default Configuration @@ -405,6 +405,7 @@ clean-up () { delete-old-backups exit 0 else + rm "$ARCHIVE_PATH" # Delete bad archive so we can't fill up with bad archives message-players-error "Backup was not saved!" "Please notify an administrator" exit 1 fi @@ -428,7 +429,18 @@ case $COMPRESSION_ALGORITHM in *) tar -cf - -C "$SERVER_WORLD" . | $COMPRESSION_ALGORITHM -cv -"$COMPRESSION_LEVEL" - > "$ARCHIVE_PATH" 2>> /dev/null ;; esac -ARCHIVE_EXIT_CODE="$(exit-code "${PIPESTATUS[0]}" "${PIPESTATUS[1]}")" +EXIT_CODES=("${PIPESTATUS[@]}") + +# tar exit codes: http://www.gnu.org/software/tar/manual/html_section/Synopsis.html +# 0 = successful, 1 = some files differ, 2 = fatal +if [ "${EXIT_CODES[0]}" == "1" ]; then + log-warning "Some files may differ in the backup archive (file changed as read)" + TAR_EXIT_CODE="0" +else + TAR_EXIT_CODE="${EXIT_CODES[0]}" +fi + +ARCHIVE_EXIT_CODE="$(exit-code "$TAR_EXIT_CODE" "${EXIT_CODES[1]}")" if [ "$ARCHIVE_EXIT_CODE" -ne 0 ]; then log-fatal "Archive command exited with nonzero exit code $ARCHIVE_EXIT_CODE" fi diff --git a/test/test.sh b/test/test.sh index 62d0180..8e6e29b 100755 --- a/test/test.sh +++ b/test/test.sh @@ -152,6 +152,27 @@ test-nonzero-exit-warning () { EXIT_CODE="$?" assertNotEquals 0 "$EXIT_CODE" assertContains "$OUTPUT" "Archive command exited with nonzero exit code" + assertFalse "[ -f "$TEST_TMP/backups/$TIMESTAMP.tar.gz" ]" +} + +test-file-changed-as-read-warning () { + TIMESTAMP="$(date +%F_%H-%M-%S --date="2021-01-01")" + dd if=/dev/urandom of="$TEST_TMP/server/world/random" & + DD_PID="$!" + OUTPUT="$(./backup.sh -i "$TEST_TMP/server/world" -o "$TEST_TMP/backups" -s "$SCREEN_TMP" -f "$TIMESTAMP" 2>&1)" + EXIT_CODE="$?" + kill "$DD_PID" + assertEquals 0 "$EXIT_CODE" + assertContains "$OUTPUT" "Some files may differ in the backup archive" + + # Check that the backup actually resulted in a valid tar + assertTrue "[ -f "$TEST_TMP/backups/$TIMESTAMP.tar.gz" ]" + + mkdir -p "$TEST_TMP/restored" + tar --extract --file "$TEST_TMP/backups/$TIMESTAMP.tar.gz" --directory "$TEST_TMP/restored" + assert-equals-directory "$WORLD_DIR/file1.txt" "$TEST_TMP/restored/file1.txt" + assert-equals-directory "$WORLD_DIR/file2.txt" "$TEST_TMP/restored/file2.txt" + assert-equals-directory "$WORLD_DIR/file3.txt" "$TEST_TMP/restored/file3.txt" } test-screen-interface () {