aboutsummaryrefslogtreecommitdiff
path: root/shield-mount
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukasz.kasprzak@pm.me>2026-02-17 16:20:40 +0100
committerLukasz Kasprzak <lukasz.kasprzak@pm.me>2026-02-17 16:20:40 +0100
commitc74163f1ecbd809c83bb465ee89fa04369a89972 (patch)
treec1a52692a47566652d7f2a9a8eceb9f1839991b7 /shield-mount
parent70e6d80c2d367480478eacf46363ee88a0e994ff (diff)
downloadbin-c74163f1ecbd809c83bb465ee89fa04369a89972.tar.gz
bin-c74163f1ecbd809c83bb465ee89fa04369a89972.zip
cleaned up names and dir
Diffstat (limited to 'shield-mount')
-rwxr-xr-xshield-mount142
1 files changed, 142 insertions, 0 deletions
diff --git a/shield-mount b/shield-mount
new file mode 100755
index 0000000..9080f35
--- /dev/null
+++ b/shield-mount
@@ -0,0 +1,142 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+UUID="6659e638-d52a-4c32-9781-9dcedd44db35"
+NAME="shield"
+MNT="/mnt/shield"
+
+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() {
+ # Resolve the UUID symlink to an absolute /dev/... node
+ 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:"
+ # lsof is optional but useful; show what we can.
+ 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
+
+ # Best-effort power-off
+ if [[ -e "$DEV_BY_UUID" ]]; then
+ local dev
+ dev="$(resolve_blockdev)" || true
+ if [[ -n "${dev:-}" ]]; then
+ if command -v udisksctl >/dev/null 2>&1; then
+ sudo udisksctl power-off -b "$dev" || true
+ fi
+ 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 <<EOF
+Usage: $0 {open|close|status}
+
+open - unlock LUKS by UUID and mount to $MNT
+close - sync, unmount, close mapper, power-off block device (best-effort)
+status - show current state
+EOF
+}
+
+main() {
+ case "${1:-}" in
+ open) do_open ;;
+ close) do_close ;;
+ status) do_status ;;
+ *) usage; exit 2 ;;
+ esac
+}
+
+main "$@"
+