aboutsummaryrefslogtreecommitdiff
path: root/dotfiles/.local/bin/menublk
diff options
context:
space:
mode:
authorYaroslav <contact@yaroslavps.com>2020-01-17 19:14:34 +0300
committerYaroslav <contact@yaroslavps.com>2020-01-17 19:14:34 +0300
commit5eee5b44924bf9079a67d5bc7612bfad56ddeed3 (patch)
tree0408697aba64aa3f012f134bdc35316841a4b404 /dotfiles/.local/bin/menublk
parent8f672e8a119e9efd23272f7cb0ff4550872f9d47 (diff)
downloadswayrice-5eee5b44924bf9079a67d5bc7612bfad56ddeed3.tar.gz
swayrice-5eee5b44924bf9079a67d5bc7612bfad56ddeed3.zip
config restructuring and cleanup
Diffstat (limited to 'dotfiles/.local/bin/menublk')
-rwxr-xr-xdotfiles/.local/bin/menublk106
1 files changed, 106 insertions, 0 deletions
diff --git a/dotfiles/.local/bin/menublk b/dotfiles/.local/bin/menublk
new file mode 100755
index 0000000..0ca0607
--- /dev/null
+++ b/dotfiles/.local/bin/menublk
@@ -0,0 +1,106 @@
+#!/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
+
+# Yaroslav de la Peña Smirnov
+
+. $HOME/.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" ]; 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="$(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
+}
+
+action="$(printf "mount\nunmount\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";;
+ *)
+ notify-send "💽Drive manager" "That's not an option";;
+esac