From 86653e5f79f6461b88b8531ddf480dc91a1c4c9f Mon Sep 17 00:00:00 2001 From: Nick Stokoe Date: Sat, 15 Apr 2023 22:36:57 +0100 Subject: [PATCH] borgmatic/backup.sh - fix printf bug Interpolation can and does insert % placeholders into the printf template text - although not valid ones as they're intended for python. So be more careful! Put all inserted text into the parameters to printf, or use echo. Also, keep some of the alterations used whilst diagnosing this. --- templates/docker-compose/borgmatic/backup.sh | 43 ++++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/templates/docker-compose/borgmatic/backup.sh b/templates/docker-compose/borgmatic/backup.sh index 182d608..102a781 100755 --- a/templates/docker-compose/borgmatic/backup.sh +++ b/templates/docker-compose/borgmatic/backup.sh @@ -5,46 +5,47 @@ # - run: create the backup, no checks # - check: prune, compact and check the backup # Anything else is an error. - + set -o pipefail - + # Set up environment -/bin/sh /scripts/msmtprc.sh +/bin/sh /scripts/msmtprc.sh /bin/sh /scripts/env.sh RUN_COMMAND="borgmatic --stats -v 2 create" CHECK_COMMAND="borgmatic --stats -v 1 prune compact check" LOGFILE="/tmp/backup_run_$(date +%s).log" SUCCESS_PREFIX="=?utf-8?Q? =E2=9C=85 SUCCESS?=" FAILED_PREFIX="=?utf-8?Q? =E2=9D=8C FAILED?=" - -PARAM="$1" - + +PARAM="$1" + # Helper function to prepend a timestamp and the first parameter to every line of STDIN -indent() { - while read -rs line; do - printf "%s%s%s\n" "$(date -Iminutes)" "${1:- }" "$line" - done -} - +indent() { + while IFS='' read -rs line; do + echo "$(date -Iminutes)${1:- }$line" + done +} + # This function prepends timestamps to stderr and stdout of the # command supplied as parameters to this. -log() { +log() { # Adapted from https://stackoverflow.com/a/31151808 { "$@" 2>&1 1>&3 3>&- | indent " ! " } 3>&1 1>&2 | indent " | " | tee -a "$LOGFILE" -} +} report() { if [ "$RESULT" = "0" ]; then - log echo "SUCCESS" + log echo "SUCCESS!" PREFIX="$SUCCESS_PREFIX" else log echo "FAILED: $RESULT" PREFIX="$FAILED_PREFIX" fi - printf "Subject: $PREFIX: '$PARAM'\n\n$(cat $LOGFILE)\n" | + printf "Subject: %s: '%s'\n\n%s\n" "$PREFIX" "$PARAM" "$(cat $LOGFILE)" | sendmail -t "$MAIL_TO" + log echo "Report sent." } testmail() { @@ -60,8 +61,9 @@ failed() { cleanup() { borgmatic break-lock - echo "Done, removing $LOGFILE" + echo "Removing $LOGFILE" rm -f "$LOGFILE" + echo "Exiting." } # Handle various kinds of exit @@ -86,9 +88,14 @@ case "$PARAM" in RESULT=$? report ;; + dummy-run) + log echo STARTED: dummy-run + borgmatic nonesuch + RESULT=$? + report + ;; *) log echo "UNKNOWN COMMAND: '$PARAM'" report ;; esac -