summaryrefslogtreecommitdiff
path: root/ar/.local/bin
diff options
context:
space:
mode:
Diffstat (limited to 'ar/.local/bin')
-rwxr-xr-xar/.local/bin/mounter65
1 files changed, 51 insertions, 14 deletions
diff --git a/ar/.local/bin/mounter b/ar/.local/bin/mounter
index fa4e115..1f71df5 100755
--- a/ar/.local/bin/mounter
+++ b/ar/.local/bin/mounter
@@ -11,29 +11,59 @@ IFS='
# Function for escaping cell-phone names.
escape() { echo "$@" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g"; }
+# Determine mount base: /mnt for internal drives, /media/$USER for external.
+mountbase() {
+ local dev="$1"
+ # Resolve through device-mapper and partitions to the underlying disk.
+ local cur="$dev"
+ while true; do
+ local parent
+ parent="$(sudo lsblk -no PKNAME "$cur" 2>/dev/null | head -1)"
+ [ -z "$parent" ] && break
+ cur="/dev/$parent"
+ done
+ local hotplug
+ hotplug="$(sudo lsblk -dno HOTPLUG "$cur" 2>/dev/null | head -1)"
+ printf "[DEBUG mountbase] dev=%s resolved=%s hotplug='%s'\n" "$dev" "$cur" "$hotplug" >&2
+ if [ "$hotplug" = "0" ]; then
+ echo "/mnt"
+ else
+ echo "/media/$USER"
+ fi
+}
+
# Function for prompting user for a mountpoint.
getmount() {
[ -z "$1" ] && mp="$(find "/media/$USER" /mnt -mindepth 1 -maxdepth 1 -type d 2>/dev/null | dmenu -i -p "Mount this drive where?")" || mp="$1"
test -n "$mp"
if [ ! -d "$mp" ]; then
mkdiryn=$(printf "Yes\nNo" | dmenu -i -p "$mp does not exist. Create it?")
- [ "$mkdiryn" = "Yes" ] && (mkdir -p "$mp" 2>/dev/null || sudo -A mkdir -p "$mp")
+ [ "$mkdiryn" = "Yes" ] && (mkdir -p "$mp" 2>/dev/null || { sudo -A mkdir -p "$mp" && sudo -A chown "$USER":"$(id -gn)" "$mp"; })
+ elif [ "$(stat -c '%U' "$mp")" != "$USER" ]; then
+ sudo -A chown "$USER":"$(id -gn)" "$mp"
fi
}
attemptmount() {
# Attempt to mount without a mountpoint, to see if drive is in fstab.
mplabel=$(sudo lsblk -no "label" "$chosen")
- mp="/media/$USER/$mplabel"
[ -n "$mplabel" ] || return
- if [ ! -d "$mp" ] && [ ! -d "/mnt/$mplabel" ]; then
- getmount "$mp" && sudo -A mount "$chosen" "$mp" >/dev/null 2>&1 || return 1
- elif [ -d "$mp" ] && [ ! -d "/mnt/$mplabel" ]; then
- sudo -A mount "$chosen" "$mp" >/dev/null 2>&1 || return 1
- elif [ -d "/mnt/$mplabel" ]; then
- getmount "/mnt/$mplabel" && sudo -A mount "$chosen" "/mnt/$mplabel" >/dev/null 2>&1 || return 1
+ local base
+ base="$(mountbase "$chosen")"
+ mp="$base/$mplabel"
+ # Determine mount options based on filesystem type.
+ fstype="$(sudo lsblk -no fstype "$chosen" | head -1)"
+ case "$fstype" in
+ vfat|exfat) mountopts="-o uid=$(id -u),gid=$(id -g),umask=0000" ;;
+ ntfs*) mountopts="-o uid=$(id -u),gid=$(id -g)" ;;
+ *) mountopts="" ;;
+ esac
+ if [ -d "$mp" ]; then
+ sudo -A mount $mountopts "$chosen" "$mp" >/dev/null 2>&1 || return 1
+ elif [ ! -d "$mp" ]; then
+ getmount "$mp" && sudo -A mount $mountopts "$chosen" "$mp" >/dev/null 2>&1 || return 1
else
- sudo -A mount "$chosen" >/dev/null 2>&1 || return 1
+ sudo -A mount $mountopts "$chosen" >/dev/null 2>&1 || return 1
fi
}
@@ -162,9 +192,12 @@ case "$chosen" in
chosen="${chosen:1}" # This is a bashism.
parttype="$(echo "$lsblkoutput" | grep "$chosen")"
attemptmount || {
- getmount
+ # Use label or device basename as default mount point.
+ mplabel="$(sudo lsblk -no label "$chosen" | head -1)"
+ [ -z "$mplabel" ] && mplabel="$(basename "$chosen")"
+ getmount "$(mountbase "$chosen")/$mplabel"
case "${parttype##* }" in
- vfat) sudo -A mount -t vfat "$chosen" "$mp" -o rw,umask=0000 ;;
+ vfat) sudo -A mount -t vfat "$chosen" "$mp" -o rw,umask=0000,uid="$(id -u)",gid="$(id -g)" ;;
btrfs) sudo -A mount "$chosen" "$mp" ;;
*) sudo -A mount "$chosen" "$mp" -o uid="$(id -u)",gid="$(id -g)" ;;
esac
@@ -183,23 +216,27 @@ case "$chosen" in
test -b "/dev/mapper/usb$num"
chosen="/dev/mapper/usb$num"
attemptmount || {
- getmount
+ mplabel="$(sudo lsblk -no label "$chosen" | head -1)"
+ [ -z "$mplabel" ] && mplabel="usb$num"
+ getmount "$(mountbase "$chosen")/$mplabel"
sudo -A mount "/dev/mapper/usb$num" "$mp" -o uid="$(id -u)",gid="$(id -g)" || sudo -A mount "/dev/mapper/usb$num" "$mp"
}
notify-send "🔓 Decrypted drive Mounted." "$chosen decrypted and mounted to $mp."
;;
📱*)
notify-send "❗ Note" "Remember to allow file access on your phone now."
- getmount
number="${chosen%%:*}"
number="${chosen:1}" # This is a bashism.
+ phonename="$(escape "$chosen")"
+ getmount "/media/$USER/$phonename"
sudo -A simple-mtpfs -o allow_other -o fsname="simple-mtpfs-$(escape "$chosen")" --device "$number" "$mp" 2>dev/null
notify-send "🤖 Android Mounted." "Android device mounted to $mp."
;;
🍎*)
- getmount
number="${chosen%%:*}"
number="${chosen:1}" # This is a bashism.
+ iphonename="$(escape "$chosen")"
+ getmount "/media/$USER/$iphonename"
sudo -A ifuse "$mp" 2>dev/null
notify-send "🍎 iPhone Mounted." "$chosen mounted to $mp."
;;