#!/bin/sh # === Config === BACKUP_NAME="$(hostname)_backup" BACKUP_SRC="$HOME/docs $HOME/pics $HOME/code $HOME/dls" PASSWORD_ENTRY="misc/backup-archive-password" # Known external backup drives (UUID-based mount points) BACKUP_DRIVE_PATHS=( "/run/media/opal/e1f36c5c-4775-4549-8edc-1fa4d273b82e" "/run/media/opal/790e21c0-77d3-4119-ad86-e9a6857fc89d" ) # === Find first mounted backup drive === for path in "${BACKUP_DRIVE_PATHS[@]}"; do if [ -d "$path" ] && mountpoint -q "$path"; then DRIVE_ROOT="$path" break fi done if [ -z "$DRIVE_ROOT" ]; then echo "โŒ No backup drive found." exit 1 fi # === Create backup directory on drive === BACKUP_TARGET_DIR="$DRIVE_ROOT/backups/desktop_backups" mkdir -p "$BACKUP_TARGET_DIR" # === Create archive directly on the drive === TODAY=$(date +%F) ARCHIVE="$BACKUP_TARGET_DIR/${BACKUP_NAME}_${TODAY}.7z" PASSWORD=$(gopass show "$PASSWORD_ENTRY") if [ -z "$PASSWORD" ]; then echo "โŒ Failed to get password from gopass" exit 1 fi echo "๐Ÿ“ฆ Creating archive directly at $ARCHIVE..." 7z a -mhe=on -p"$PASSWORD" "$ARCHIVE" $BACKUP_SRC if [ $? -ne 0 ]; then echo "โŒ 7z compression failed" exit 1 fi # === Retention policy === echo "๐Ÿงน Applying retention policy..." BASE="${BACKUP_NAME}_" find "$BACKUP_TARGET_DIR" -maxdepth 1 -name "${BASE}*.7z" | while read -r file; do fname=$(basename "$file") date_part=$(echo "$fname" | sed -E "s/^${BASE}([0-9]{4}-[0-9]{2}-[0-9]{2})\.7z$/\1/") if ! date -d "$date_part" >/dev/null 2>&1; then echo "โš ๏ธ Skipping unrecognized file: $fname" continue fi day_of_week=$(date -d "$date_part" +%u) # 7 = Sunday day_of_month=$(date -d "$date_part" +%d) # 01 = first of month month_day=$(date -d "$date_part" +%m-%d) # 01-01 = Jan 1 age_days=$(( ( $(date +%s) - $(date -d "$date_part" +%s) ) / 86400 )) keep=0 if [ "$month_day" = "01-01" ]; then keep=1 # yearly elif [ "$day_of_month" = "01" ] && [ "$age_days" -le 180 ]; then keep=1 # monthly elif [ "$day_of_week" = "7" ] && [ "$age_days" -le 28 ]; then keep=1 # weekly elif [ "$age_days" -le 3 ]; then keep=1 # daily fi if [ "$keep" -eq 1 ]; then echo "๐Ÿ“Œ Keeping: $fname" else echo "๐Ÿ—‘ Deleting: $fname" rm -f "$file" fi done echo "โœ… Backup complete."