aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/pmount
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/pmount')
-rwxr-xr-xscripts/pmount83
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 "$@"