#!/bin/sh

devices_list() {
  #shopt -s nullglob
  local devlist=""
  for diskid in /dev/disk/by-id/usb*; do
    [ -e "$diskid" ] || [ -L "$diskid" ] || continue
    local disk=$(echo "$(readlink -f "$diskid")")
    local mnt=$(echo "$(lsblk -ln -o PATH,LABEL,MOUNTPOINT $disk | awk '{print $1"|"$2"|"$3}')")
    if [[ -z "${mnt// }" || "$mnt" =~ $'\n' ]]; then
      continue;
    fi
    #printf -v devlist "%s\n%s" $devlist $mnt
    if [ -z "${devlist// }" ]; then
      devlist=$mnt
    else
      printf -v devlist "%s\n%s" $devlist $mnt
    fi
  done
  echo $devlist
}

device_namefromlabel() {
  local devname=$1
  if [[ "$devname" != "/"* ]]; then
    devname=$(findfs LABEL=$devname)
  fi
  printf "%s" "$devname"
}

udisks_mount() {
  local devname=$(device_namefromlabel $1)
  if [ ! -z "${devname// }" ]; then
    udisksctl mount --block-device "$devname" --no-user-interaction --options flush,noatime,noexec,nosuid,dmask=000,fmask=111
  else
    return 1
  fi
}

udisks_unmount() {
  local devname=$(device_namefromlabel $1)
  local rescode=1
  if [ ! -z "${devname// }" ]; then
    udisksctl unmount -b "$devname" --no-user-interaction
    rescode=$?
    if [ $rescode -eq 0 ] ;  then
      udisksctl power-off -b "$devname" --no-user-interaction
    fi
  fi
  return $rescode
}


# utility part

opt=$1
if [ ! -z "${opt// }" ]; then
  rescode=1
  case $opt in
    list)
      devices_list
      rescode=$?
      ;;

    mount)
      if [ -n "$2" ]; then
        udisks_mount $2
        rescode=$?
      else
        echo "error: bad param for opt $opt"
      fi
      ;;

    unmount)
      if [ -n "$2" ]; then
        udisks_unmount $2
        rescode=$?
      else
        echo "error: bad param for opt $opt"
      fi
      ;;

    *)
      echo "error: bad opt $opt"
      ;;
  esac

  exit $rescode
fi


exit 126


if [ -n "$1" ] ; then
  devname=$(findfs LABEL=$1)
  if [ $? -eq 0 ] ;  then
    udisksctl unmount -b "$devname" --no-user-interaction
    if [ $? -eq 0 ] ;  then
      udisksctl power-off -b "$devname" --no-user-interaction
    fi
  fi
  exit
fi


# service part

devpathtoname() {
  udevadm info -p /sys/"$1" | awk -v FS== '/DEVNAME/ {print $2}'
}

stdbuf -oL -- udevadm monitor --udev -s block | while read -r -- _ _ event devpath _; do
  if [ "$event" = add ]; then
    devname=$(devpathtoname "$devpath")
    echo "Added $devname"
    #udisksctl mount --block-device "$devname" --no-user-interaction
    #su -c 'udisksctl mount --block-device "$devname" --no-user-interaction' - lion
    udisksctl mount --block-device "$devname" --no-user-interaction --options flush,noatime,noexec,nosuid,dmask=000,fmask=111
  fi
done
