diff options
Diffstat (limited to 'scripts/pmount')
-rwxr-xr-x | scripts/pmount | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/scripts/pmount b/scripts/pmount new file mode 100755 index 0000000..2022c10 --- /dev/null +++ b/scripts/pmount @@ -0,0 +1,83 @@ +#!/bin/bash + +set -e + +declare -a devices + +populate_devices() +{ + for devsys in /sys/class/block/sd*; do + case $(readlink $devsys) in + */devices/*/usb*/*/block/sd*[a-z]);; + # Skip non removable devices (/removable in sys is not reliable + # for usb3 disks). My definition of a removable device in this + # script is usb devices for now. + *) continue;; + esac + dev=${devsys##/sys/class/block/} + if [ -e /sys/class/block/$dev/${dev}1 ]; then + for subdev in /sys/class/block/$dev/${dev}*; do + subdev=${subdev##/sys/class/block/$dev/} + if ! mount | grep -q "^/dev/$subdev on /media/"; then + devices+=($subdev) + fi + done + else + if ! mount | grep -q "^/dev/$dev on /media/"; then + devices+=($dev) + fi + fi + done +} + +get_label() +{ + dev=$1 + for label in /dev/disk/by-label/*; do + label=${label##*/} + devfound=$(readlink /dev/disk/by-label/$label) + devfound=${devfound##*/} + if [ "$devfound" == "$dev" ]; then + echo $label + return + fi + done + echo $dev +} + +choose_device() +{ + echo "List of mountable devices (${#devices[*]}):" + format=" %-8s %s\n" + printf "$format" =Device= =Label= + for dev in ${devices[*]}; do + printf "$format" $dev "$(get_label $dev)" + done + + select choice in ${devices[@]}; do + REPLY=$((REPLY-1)) + break + done +} + +if [ "$#" -eq 0 ]; then + populate_devices + if [ ${#devices[*]} -eq 0 ]; then + echo "Nothing can be done, bye." + exit 0 + fi + + if [ ${#devices[*]} -eq 1 ]; then + dev=${devices[0]} + label="$(get_label ${devices[0]})" + else + choose_device + dev=${devices[$REPLY]} + label="$(get_label $dev)" + fi + + echo "mounting /dev/$dev in /media/$label" + exec pmount $dev "$label" +fi + +exec /usr/bin/pmount "$@" |