#!/usr/bin/env bash set -euo pipefail UUID="bdd2a016-b6db-493d-ad0a-e8dd8a93dfbd" NAME="usb_safe" MNT="/mnt/usb_safe" DEV_BY_UUID="/dev/disk/by-uuid/${UUID}" MAPPER="/dev/mapper/${NAME}" die() { echo "Error: $*" >&2; exit 1; } need_cmd() { command -v "$1" >/dev/null 2>&1 || die "Missing command: $1" } resolve_blockdev() { local target target="$(readlink -f "$DEV_BY_UUID")" || return 1 [[ -b "$target" ]] || return 1 echo "$target" } is_mapped() { [[ -e "$MAPPER" ]]; } is_mounted() { mountpoint -q "$MNT"; } show_busy() { echo "Mount appears busy. Processes using $MNT:" if command -v lsof >/dev/null 2>&1; then sudo lsof +f -- "$MNT" || true else echo "(Install lsof: sudo apt install lsof)" sudo fuser -vm "$MNT" || true fi } do_open() { need_cmd cryptsetup need_cmd mount need_cmd mountpoint need_cmd readlink [[ -e "$DEV_BY_UUID" ]] || die "UUID device not found: $DEV_BY_UUID (is the drive plugged in?)" local dev dev="$(resolve_blockdev)" || die "Could not resolve block device for UUID: $UUID" if is_mapped; then echo "Mapper already exists: $MAPPER" else sudo cryptsetup open "$dev" "$NAME" fi if [[ ! -d "$MNT" ]]; then sudo mkdir -p "$MNT" fi if is_mounted; then echo "Already mounted: $MNT" else sudo mount "$MAPPER" "$MNT" fi sudo sync echo "OK: unlocked and mounted at $MNT" } do_close() { need_cmd cryptsetup need_cmd umount need_cmd mountpoint need_cmd readlink if is_mounted; then sudo sync if ! sudo umount "$MNT"; then show_busy die "Unmount failed" fi fi if is_mapped; then sudo cryptsetup close "$NAME" fi if [[ -e "$DEV_BY_UUID" ]]; then local dev dev="$(resolve_blockdev)" || true if [[ -n "${dev:-}" ]] && command -v udisksctl >/dev/null 2>&1; then sudo udisksctl power-off -b "$dev" || true fi fi echo "OK: unmounted, closed, and powered off (if supported)" } do_status() { echo "UUID device: $DEV_BY_UUID" if [[ -e "$DEV_BY_UUID" ]]; then echo "Resolved: $(readlink -f "$DEV_BY_UUID")" else echo "Resolved: (not present)" fi echo -n "Mapper: " if is_mapped; then echo "OPEN ($MAPPER)"; else echo "CLOSED"; fi echo -n "Mount: " if is_mounted; then echo "MOUNTED ($MNT)"; else echo "NOT MOUNTED"; fi } usage() { cat <