aboutsummaryrefslogtreecommitdiff
path: root/.local/bin/mountmgr
blob: 04a836b745cab6a2cb14b3a1dff552a56e328f80 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/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