diff --git a/templates/bin/backup b/templates/bin/backup index 1c2c6f2..640be57 100755 --- a/templates/bin/backup +++ b/templates/bin/backup @@ -9,6 +9,6 @@ DC_DIR=/opt/docker-compose/ cd $DC_DIR docker-compose down -docker-compose run --name borgmatic -T --rm borgmatic /backup.sh +docker-compose run --name borgmatic -T --rm borgmatic /backup.sh run docker-compose up -d main-services - +docker-compose run --name borgmatic -T --rm borgmatic /backup.sh check diff --git a/templates/docker-compose/borgmatic/backup.sh b/templates/docker-compose/borgmatic/backup.sh index 51b0965..182d608 100755 --- a/templates/docker-compose/borgmatic/backup.sh +++ b/templates/docker-compose/borgmatic/backup.sh @@ -1,42 +1,49 @@ #!/bin/sh -# Run the backup and mail the logs -# Set TEST_SMTP=1 to run in SMTP testing mode, which will just send an email - +# Run the backup and mail the logs: +# Depending on parameter 1: +# - test-smtp: just send a test email to $MAIL_TO +# - 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 -BACKUP_COMMAND="borgmatic --stats -v 2" +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" + # Helper function to prepend a timestamp and the first parameter to every line of STDIN -_indent() { +indent() { while read -rs line; do - printf "%s%s\n" "$(date +%s)" "$1" "$line" - done -} - + printf "%s%s%s\n" "$(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 " | " >>"$LOGFILE" -} + "$@" 2>&1 1>&3 3>&- | indent " ! " + } 3>&1 1>&2 | indent " | " | tee -a "$LOGFILE" +} report() { - if [ -n "$SUCCESS" ]; then - log echo SUCCESS + if [ "$RESULT" = "0" ]; then + log echo "SUCCESS" PREFIX="$SUCCESS_PREFIX" else - log echo FAILED + log echo "FAILED: $RESULT" PREFIX="$FAILED_PREFIX" fi - printf "Subject: $PREFIX: $MAIL_SUBJECT\n\n$(cat $LOGFILE)\n" | + printf "Subject: $PREFIX: '$PARAM'\n\n$(cat $LOGFILE)\n" | sendmail -t "$MAIL_TO" } @@ -61,16 +68,27 @@ cleanup() { trap failed INT QUIT KILL trap cleanup EXIT -if [ -n "$TEST_SMTP" ]; then - echo "Testing mail to $MAIL_TO" - testmail - echo "Done." - exit -fi +case "$PARAM" in + test-smtp) + echo "Testing mail to $MAIL_TO" + testmail + echo "Done." + ;; + check) + log echo STARTED: $CHECK_COMMAND + log $CHECK_COMMAND + RESULT=$? + report + ;; + run) + log echo STARTED: $RUN_COMMAND + log $RUN_COMMAND + RESULT=$? + report + ;; + *) + log echo "UNKNOWN COMMAND: '$PARAM'" + report + ;; +esac - -echo "STARTED" >> "$LOGFILE" -if log $BACKUP_COMMAND; then - SUCCESS=1 - report -fi