#!/usr/bin/env bash set -euo pipefail # --- SUDO CHECK --- if [ "$EUID" -ne 0 ]; then echo "This script requires root privileges. Re-running with sudo..." exec sudo "$0" "$@" fi # --- HANDLE OPTIONS --- BORG_PASSPHRASE="" SHOW_FOLDERS_ONLY=false SHOW_FILES=false # Default to showing files and directories while getopts "k:fp" opt; do case "$opt" in k) BORG_PASSPHRASE=$(<"$OPTARG") if [ -z "$BORG_PASSPHRASE" ]; then echo "Error: The key file is empty." exit 1 fi echo "Using passphrase from key file: $OPTARG" ;; f) SHOW_FOLDERS_ONLY=true echo "Only directories will be shown in fzf by default." SHOW_FILES=false ;; p) SHOW_FILES=true echo "Both files and directories will be shown in fzf." ;; *) echo "Usage: $0 [-k passphrase_file] [-f] [-p] " exit 1 ;; esac done shift $((OPTIND - 1)) # --- FALLBACK TO /run/secrets/borg_passwd IF NO KEY FILE --- if [ -z "$BORG_PASSPHRASE" ]; then if [ $# -eq 0 ]; then BORG_PASSPHRASE=$(<"/run/secrets/borg_passwd") echo "Using passphrase from /run/secrets/borg_passwd" else # Prompt user for passphrase if neither -k nor /run/secrets/borg_passwd is available read -s -p "Enter Borg repository passphrase: " BORG_PASSPHRASE echo fi fi export BORG_PASSPHRASE # --- DEFAULT REPO --- REPO="${1:-/holocron/archives/servers/snowbelle}" # --- CHECK REQUIRED COMMANDS --- for cmd in borg fzf find tree cp mkdir; do command -v "$cmd" >/dev/null || { echo "Error: '$cmd' is required but not installed."; exit 1; } done # --- LIST ARCHIVES (sorted, newest last) --- mapfile -t archives < <(borg list --format="{archive}{NL}" "$REPO" | sort -r) if [ ${#archives[@]} -eq 0 ]; then echo "No archives found in $REPO" exit 1 fi # --- FZF ARCHIVE SELECT --- selected=$(printf '%s\n' "${archives[@]}" | fzf --prompt="Select archive: " --height=40% --border) if [ -z "$selected" ]; then echo "No archive selected." exit 1 fi echo "Selected archive: $selected" # --- GENERATE A UNIQUE, SHORTER MOUNT POINT --- MOUNT_POINT="/tmp/$(uuidgen | sha256sum | head -c 2)-restore-${selected}" mkdir -p "$MOUNT_POINT" # --- MOUNT ARCHIVE --- echo "Mounting '$selected' to $MOUNT_POINT..." borg mount "$REPO::$selected" "$MOUNT_POINT" cleanup() { echo "Unmounting archive..." borg umount "$MOUNT_POINT" >/dev/null 2>&1 || true rmdir "$MOUNT_POINT" >/dev/null 2>&1 || true } trap cleanup EXIT INT TERM if [ ! -d "$MOUNT_POINT" ]; then echo "Error: mount failed." exit 1 fi lf $MOUNT_POINT