#!/usr/bin/env bash set -Eeuo pipefail SCRIPT_ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd -P)" ENV_FILE="${DOCKERBACKUP_ENV:-$SCRIPT_ROOT/.env}" SOURCE_BASE_DIR="/dockervolumes" BACKUP_ROOT="/dockerbackups" CONTAINERS_FILE="$SCRIPT_ROOT/containers.txt" BACKUP_HOSTNAME="$(hostname -s)" BACKUP_METHODS="rclone smb" KEEP_COUNT=5 PULL_IMAGES=1 START_TIMEOUT=90 WAIT_INTERVAL=3 START_RETRIES=1 LOCK_FILE="/run/lock/zorruno-docker-backup.lock" RCLONE_ENABLED=0 RCLONE_REMOTE="" RCLONE_EXTRA_ARGS="" SMB_ENABLED=0 SMB_MOUNT="" SMB_HOST_SUBDIR=1 SMB_RSYNC_ARGS="-a" if [[ -f "$ENV_FILE" ]]; then set -a # shellcheck disable=SC1090 . "$ENV_FILE" set +a fi # Ease migration from the original prune script's .env names. if [[ -n "${SOURCE_DIR:-}" && "$BACKUP_ROOT" == "/dockerbackups" ]]; then BACKUP_ROOT="$SOURCE_DIR" fi timestamp() { date '+%F %T'; } log() { printf '%s [%s] %s\n' "$(timestamp)" "$1" "$2" >&2; } die() { log ERROR "$1"; exit "${2:-1}"; } is_true() { case "${1,,}" in 1|true|yes|on|enabled) return 0 ;; *) return 1 ;; esac } require_command() { command -v "$1" >/dev/null 2>&1 || die "Required command not found: $1" 3 } require_positive_integer() { [[ "$2" =~ ^[1-9][0-9]*$ ]] || die "$1 must be a positive integer (received: $2)" 2 } resolve_path() { if [[ "$1" = /* ]]; then printf '%s\n' "$1"; else printf '%s/%s\n' "$SCRIPT_ROOT" "$1"; fi } run_id() { date '+%Y-%m-%d_%H-%M-%S'; }