aboutsummaryrefslogtreecommitdiff
path: root/dotfiles/.local/bin/menublk
blob: 6c362522339983c14f8e394c4234268fb37f0c13 (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" --monitor="$BEMENU_MONITOR")"
    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" --monitor="$BEMENU_MONITOR")"

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" --monitor="$BEMENU_MONITOR")"
    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" --monitor="$BEMENU_MONITOR")"
    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" --monitor="$BEMENU_MONITOR")"
    if [ -z "$blkdev" ]; then
      exit 0
    fi
    poweroff_dev "$blkdev";;
  *)
    exit 0;;
esac