#!/bin/sh export UNMOUNT_BLACKLIST="luksdev nvme0n1p1" export PINENTRY="pinentry-dmenu" if [ -n "$WAYLAND_DISPLAY" ]; then export DMENU="dmenu-wl" else export DMENU="dmenu" fi prompt_pin() { printf "SETPROMPT $1\nGETPIN\n" | $PINENTRY | grep '^D' | sed 's/^D //g' } disk_dialog_entry() { lsblk -r -o NAME,FSTYPE,MOUNTPOINT,LABEL | column -s ' ' -t | grep "$1" } luks_map() { for map in $(sudo dmsetup ls | awk '{ print $1 }'); do echo $map $(sudo cryptsetup status "$map" | grep "device:" | awk '{ print $2 }') done } luks_regex() { luks_map | awk '{ print $2 }' | sed -E 's/\/dev\/(.*)/\1/g' | sed -z 's/\n/\\|/g' | sed -e 's/\\|$/\n/g' } list_mountable() { lsblk -r -o NAME,FSTYPE,MOUNTPOINTS | grep -E '^[^ ]+\s+[^ ]+\s*$' | sed -e '/\[SWAP\]/d' | sed -e "/$(luks_regex)/d" | awk '{ print $1 }' } list_unmountable() { lsblk -r -o NAME,FSTYPE,MOUNTPOINT | sed -e '/NAME FSTYPE MOUNTPOINT/d' | grep -E '^[^ ]+\s+[^ ]+\s+[^ ]+$' | awk '{ print $1 }' } main_dialog() { for d in $(list_unmountable); do [ -z "$(echo $UNMOUNT_BLACKLIST | grep "$d")" ] && echo "⏏ $(disk_dialog_entry $d)" done for d in $(list_mountable); do echo " $(disk_dialog_entry $d)" done } select=$(main_dialog | $DMENU) [ -z "$select" ] && exit if [ "$(echo $select | awk '{ print $1 }')" = "⏏" ]; then mountpoint=$(echo "$select" | awk '{ print $4 }') disk=$(echo "$select" | awk '{ print $2 }') sync sudo umount "$mountpoint" rmdir "$mountpoint" if [ -n "$(luks_map | grep "$disk")" ]; then sudo cryptsetup close "$disk" fi notify-send "Mount Manager" "$disk unmounted" else disk=$(echo "$select" | awk '{ print $1 }') device_path="/dev/$disk" fstype=$(echo "$select" | awk '{ print $2 }') if [ "$fstype" = "crypto_LUKS" ]; then prompt_pin "Passphrase to decrypt $disk" | sudo cryptsetup open "$device_path" "luks$disk" || exit new_disk="luks$disk" disk="$new_disk" device_path="/dev/mapper/$disk" fi mountpoint="/mnt/$disk" mkdir "$mountpoint" sudo mount "$device_path" "$mountpoint" notify-send "Mount Manager" "$disk mounted" fi