blob: cfc1a7b05cde4b67405ac1c0690eb469115b5405 (
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
#!/bin/bash
# Script for mounting/unmounting drives (including encrypted ones)
# For encrypted drives, it works only if there's just one partition inside the
# crypt_LUKS volume
# It now also allows to power off devices so that you can safely disconnect
# them. It lists only USB devices.
# Yaroslav de la Peña Smirnov
. ~/.config/bemenurc
readarray -t blkdevs <<< "$(lsblk -r -o NAME,TYPE,FSTYPE,MOUNTPOINT | tail -n +2)"
get_mountable() {
for blkdev in "${blkdevs[@]}"; do
name="$(cut -d " " -f1 <<< "${blkdev}")"
btype="$(cut -d " " -f2 <<< "${blkdev}")"
fstype="$(cut -d " " -f3 <<< "${blkdev}")"
mountpoint="$(cut -d " " -f4 <<< "${blkdev}")"
if [ "$btype" = "part" ]; then
if [ -z "$mountpoint" ]; then
if [ "$fstype" = "crypto_LUKS" ]; then
if [ "$(lsblk -r -o FSTYPE "/dev/$name" | tail -n 1)" = "crypto_LUKS" ]; then
echo "$name"
fi
else
echo "$name"
fi
fi
fi
done
}
get_unmountable() {
for blkdev in "${blkdevs[@]}"; do
name="$(cut -d " " -f1 <<< "${blkdev}")"
btype="$(cut -d " " -f2 <<< "${blkdev}")"
fstype="$(cut -d " " -f3 <<< "${blkdev}")"
mountpoint="$(cut -d " " -f4 <<< "${blkdev}")"
if [ "$btype" = "part" ]; then
if [ -z "$mountpoint" ] && [ "$fstype" = "crypto_LUKS" ]; then
mountpoint="$(lsblk -r -o MOUNTPOINT "/dev/$name" | tail -n 1)"
fi
if [ -n "$mountpoint" ] && [ "$mountpoint" != "/" ] && [ "$mountpoint" != "/boot" ] && [ "$mountpoint" != "[SWAP]" ]
then
echo "$name"
fi
fi
done
}
mount_dev() {
fstype="$(lsblk -r -o FSTYPE "/dev/$1" | tail -n 1)"
part="/dev/$1"
if [ "$fstype" = "crypto_LUKS" ]; then
password="$(echo "" | bemenu -p "Enter passphrase for encrypted drive:" --tf="$BEMENU_TF" --tb="$BEMENU_NB" --ff="$BEMENU_NB" --fb="$BEMENU_NB" --fn="$BEMENU_FN" --nb="$BEMENU_NB" --nf="$BEMENU_NF" --hf="$BEMENU_HF" --hb="$BEMENU_HB")"
if [ -z "$password" ]; then
exit 0
fi
printf "%s" "$password" > "$HOME/.cache/diskey"
part="$(udisksctl unlock --key-file="$HOME/.cache/diskey" -b "/dev/$1" | cut -d " " -f4 )"
part="${part%?}"
rm -f "$HOME/.cache/diskey"
fi
message="$(udisksctl mount -b "$part")"
if [ $? -eq 0 ]; then
notify-send "💽Drive mounting" "$message"
else
notify-send "💽Drive mounting" "An error occurred, could not mount device $1"
fi
}
unmount_dev() {
fstype="$(lsblk -r -o FSTYPE "/dev/$1" | sed "2q;d")"
if [ "$fstype" = "crypto_LUKS" ]; then
volume="/dev/mapper/$(lsblk -r -o NAME "/dev/$1" | tail -n 1)"
if udisksctl unmount -b "$volume" && udisksctl lock -b "/dev/$1"; then
notify-send "💽Drive manager" "Device $1 has been unmounted and locked"
else
notify-send "💽Drive manager" "An error occurred, could not unmount device $1"
fi
else
if udisksctl unmount -b "/dev/$1"; then
notify-send "💽Drive manager" "Device $1 has been unmounted"
else
notify-send "💽Drive manager" "An error occurred, could not unmount device $1"
fi
fi
}
get_usb_storage() {
for dev in /sys/block/*; do
if udevadm info --query=property --path=$dev | grep -q ^ID_BUS=usb
then
echo "$(cut -d "/" -f4 <<< ${dev})"
fi
done
}
poweroff_dev() {
if udisksctl power-off -b "/dev/$1"; then
notify-send "💽Drive manager" "Device $1 has been powered off"
else
notify-send "💽Drive manager" "An error occurred, could not power off device $1. Make sure that it's not in use."
fi
}
action="$(printf "mount\nunmount\npoweroff\n" | bemenu -p "What to do?" --tf="$BEMENU_TF" --tb="$BEMENU_NB" --fb="$BEMENU_NB" --fn="$BEMENU_FN" --nb="$BEMENU_NB" --nf="$BEMENU_NF" --hf="$BEMENU_HF" --hb="$BEMENU_HB")"
case "$action" in
mount)
blkdev="$(get_mountable | bemenu -p "Choose device to mount:" --tf="$BEMENU_TF" --tb="$BEMENU_NB" --fb="$BEMENU_NB" --fn="$BEMENU_FN" --nb="$BEMENU_NB" --nf="$BEMENU_NF" --hf="$BEMENU_HF" --hb="$BEMENU_HB")"
if [ -z "$blkdev" ]; then
exit 0
fi
mount_dev "$blkdev";;
unmount)
blkdev="$(get_unmountable | bemenu -p "Choose device to umount:" --tf="$BEMENU_TF" --tb="$BEMENU_NB" --fb="$BEMENU_NB" --fn="$BEMENU_FN" --nb="$BEMENU_NB" --nf="$BEMENU_NF" --hf="$BEMENU_HF" --hb="$BEMENU_HB")"
if [ -z "$blkdev" ]; then
exit 0
fi
unmount_dev "$blkdev";;
poweroff)
blkdev="$(get_usb_storage | bemenu -p "Choose device to power off:" --tf="$BEMENU_TF" --tb="$BEMENU_NB" --fb="$BEMENU_NB" --fn="$BEMENU_FN" --nb="$BEMENU_NB" --nf="$BEMENU_NF" --hf="$BEMENU_HF" --hb="$BEMENU_HB")"
if [ -z "$blkdev" ]; then
exit 0
fi
poweroff_dev "$blkdev";;
*)
exit 0;;
esac
|