#!/bin/bash # Version: 0.1.0 # Copyright (c) 2023: # Darren 'Tadgy' Austin # Licensed under the terms of the GNU General Public License version 3. BACKUP_MOUNTPOINT="/localdata" BACKUP_DESTDIR="$BACKUP_MOUNTPOINT/backups/gv0" RSYNC_SOURCE="/storage/gv0/" # The / on the end is required. RSYNC_FILTER=() RSYNC_OPTIONS=( '-a' '-H' '-A' '--timeout=300' '--partial' '--partial-dir=.rsync-tmp' '--delete-delay' '--delay-updates' ) RSYNC_OPTIONS_VERBOSE=( '--verbose' '--stats' '--human-readable' ) RSYNC_LOG="/tmp/${BASH_SOURCE##*/}-$$.log" # Only allow one copy of the script to run at any time. # shellcheck disable=SC2154 if [[ "$FLOCK" != "$0" ]]; then exec env FLOCK="$0" flock -e -n "$0" "$0" "$@" || { printf "%s: %s\\n" "${BASH_SOURCE##*/}" "flock execution error" >&2 exit 1 } fi # Source the mail configuration. source /etc/mail.conf "backups" 2>/dev/null || { printf "%s: %s\\n" "${BASH_SOURCE##*/}" "Failed to source /etc/mail.conf" >&2 exit 1 } # Make sure BACKUP_MOUNTPOINT is a mountpoint. mountpoint "$BACKUP_MOUNTPOINT" >/dev/null 2>&1 || { CONFIG_FILE="backups" /opt/bin/pushover -T "Backup" -p '-1' -m "Failure: $RSYNC_SOURCE" mailx "${MAILX_ARGS[@]}" -S "from='$EMAIL_FROM'" -s "Backup failure: $RSYNC_SOURCE" "${EMAIL_TO[@]}" <<-EOF '$BACKUP_MOUNTPOINT' is not a mountpoint. EOF exit 1 } # Do the backup. rsync "${RSYNC_OPTIONS[@]}" "${RSYNC_OPTIONS_VERBOSE[@]}" "${RSYNC_FILTER[@]}" "$RSYNC_SOURCE" "$BACKUP_DESTDIR" >"$RSYNC_LOG" 2>&1 ERR="$?" # Send a notification and mail a log if there were errors. (( ERR != 0 )) && (( ERR != 10 )) && (( ERR != 24 )) && { CONFIG_FILE="backups" /opt/bin/pushover -T "Backup" -p '-1' -m "Failure: $RSYNC_SOURCE" mailx "${MAILX_ARGS[@]}" -S "from='$EMAIL_FROM'" -s "Backup failure: $RSYNC_SOURCE" "${EMAIL_TO[@]}" <<-EOF Exit code: $ERR Output: $(< "$RSYNC_LOG") EOF rm -f "$RSYNC_LOG" exit 1 } rm -f "$RSYNC_LOG" exit 0