#!/bin/sh # 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/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" # 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 } # This function prepends timestamps to stderr and stdout of the # command supplied as parameters to this. 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" PREFIX="$SUCCESS_PREFIX" else log echo "FAILED: $RESULT" PREFIX="$FAILED_PREFIX" fi printf "Subject: $PREFIX: '$PARAM'\n\n$(cat $LOGFILE)\n" | sendmail -t "$MAIL_TO" } testmail() { echo -e "Subject: TESTING!\n\ntest mail, please ignore\n" | sendmail -t "$MAIL_TO" } failed() { log echo "Exited abnormally!" report rm -f "$LOGFILE" } cleanup() { borgmatic break-lock echo "Done, removing $LOGFILE" rm -f "$LOGFILE" } # Handle various kinds of exit trap failed INT QUIT KILL trap cleanup EXIT 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