foxygit / dotfiles Log in
commit 49ef235586b83fd32da00ff3b6eae0f87c4db0aa
Author:     mrfox <jens.se@icloud.com>
AuthorDate: Sun Sep 20 20:20:26 2026 +0200
Commit:     mrfox <jens.se@icloud.com>
CommitDate: Sun Sep 20 20:20:26 2026 +0200

    woop
---
 bin/crypt | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 122 insertions(+)

diff --git a/bin/crypt b/bin/crypt
new file mode 100755
index 0000000..dd16a80
--- /dev/null
+++ b/bin/crypt
@@ -0,0 +1,122 @@
+#!/usr/bin/env bash
+#
+# crypt — montera gocryptfs-valvet på USB-stickan till ~/crypt
+#
+# Hittar själv den krypterade katalogen (den som innehåller gocryptfs.conf)
+# på inkopplade USB-diskar. gocryptfs frågar efter lösenordet själv, så
+# ingen hemlighet passerar det här scriptet.
+#
+# Användning:  crypt            montera (default)
+#              crypt umount     avmontera
+#              crypt status     visa läge
+#              crypt toggle     montera om avmonterat, annars avmontera
+#
+# Miljövariabler:
+#   CRYPT_MOUNT      monteringspunkt          (default: ~/crypt)
+#   CRYPT_CIPHERDIR  krypterad katalog        (default: autodetekteras)
+
+set -euo pipefail
+
+MOUNT="${CRYPT_MOUNT:-$HOME/crypt}"
+
+die()  { printf '✗ %s\n' "$*" >&2; exit 1; }
+info() { printf '%s\n' "$*"; }
+
+command -v gocryptfs >/dev/null 2>&1 || die "gocryptfs saknas (sudo apt install gocryptfs fuse3)"
+
+FUSERMOUNT=$(command -v fusermount3 || command -v fusermount || true)
+[ -n "$FUSERMOUNT" ] || die "fusermount saknas (sudo apt install fuse3)"
+
+is_mounted() { mountpoint -q "$MOUNT" 2>/dev/null; }
+
+# Skriver ut alla kataloger under monterade USB-diskar som ser ut som ett
+# gocryptfs-valv (innehåller gocryptfs.conf).
+find_cipherdirs() {
+    local base conf
+    for base in "/media/$USER" "/run/media/$USER"; do
+        [ -d "$base" ] || continue
+        while IFS= read -r conf; do
+            dirname "$conf"
+        done < <(find "$base" -maxdepth 3 -name gocryptfs.conf 2>/dev/null)
+    done
+}
+
+# Monterar omonterade USB-partitioner via udisks om inget valv hittades.
+automount_removable() {
+    command -v udisksctl >/dev/null 2>&1 || return 1
+    local name
+    while read -r name; do
+        [ -n "$name" ] && udisksctl mount -b "/dev/$name" >/dev/null 2>&1 || true
+    done < <(lsblk -rno NAME,TYPE,RM,FSTYPE,MOUNTPOINT \
+                 | awk '$2=="part" && $3=="1" && $4!="" && $5=="" {print $1}')
+}
+
+pick_cipherdir() {
+    if [ -n "${CRYPT_CIPHERDIR:-}" ]; then
+        [ -f "$CRYPT_CIPHERDIR/gocryptfs.conf" ] || die "ingen gocryptfs.conf i $CRYPT_CIPHERDIR"
+        printf '%s\n' "$CRYPT_CIPHERDIR"
+        return
+    fi
+
+    local dirs=()
+    mapfile -t dirs < <(find_cipherdirs)
+    if [ "${#dirs[@]}" -eq 0 ] && automount_removable; then
+        sleep 1
+        mapfile -t dirs < <(find_cipherdirs)
+    fi
+
+    case "${#dirs[@]}" in
+        0) die "hittade inget gocryptfs-valv — sitter USB-stickan i? (eller sätt CRYPT_CIPHERDIR)" ;;
+        1) printf '%s\n' "${dirs[0]}" ;;
+        *) local d
+           PS3="Välj valv: "
+           select d in "${dirs[@]}"; do
+               [ -n "${d:-}" ] && { printf '%s\n' "$d"; break; }
+           done >&2 < /dev/tty ;;
+    esac
+}
+
+do_mount() {
+    if is_mounted; then
+        info "● redan monterat på $MOUNT"
+        return 0
+    fi
+    local cipher
+    cipher=$(pick_cipherdir)
+    mkdir -p "$MOUNT"
+    # Monteringspunkten måste vara tom, annars nekar gocryptfs.
+    if [ -n "$(ls -A "$MOUNT" 2>/dev/null)" ]; then
+        die "$MOUNT är inte tom och inget är monterat där"
+    fi
+    info "Monterar $cipher → $MOUNT"
+    gocryptfs "$cipher" "$MOUNT"
+    info "● monterat på $MOUNT"
+}
+
+do_umount() {
+    if ! is_mounted; then
+        info "○ inget monterat på $MOUNT"
+        return 0
+    fi
+    "$FUSERMOUNT" -u "$MOUNT" || die "kunde inte avmontera $MOUNT (används den? prova: fuser -vm $MOUNT)"
+    info "○ avmonterat $MOUNT"
+}
+
+do_status() {
+    if is_mounted; then
+        info "● monterat på $MOUNT"
+    else
+        info "○ inte monterat ($MOUNT)"
+    fi
+    local d
+    while IFS= read -r d; do info "  valv: $d"; done < <(find_cipherdirs)
+}
+
+case "${1:-mount}" in
+    mount|m)         do_mount ;;
+    umount|unmount|u) do_umount ;;
+    status|s)        do_status ;;
+    toggle|t)        if is_mounted; then do_umount; else do_mount; fi ;;
+    -h|--help|help)  sed -n '3,17p' "$0" | sed 's/^# \{0,1\}//' ;;
+    *)               die "okänt kommando: $1 (mount|umount|status|toggle)" ;;
+esac