| #!/bin/bash |
| |
| # This script is called from our systemd unit file to mount or unmount |
| # a USB drive. |
| |
| usage() |
| { |
| echo "Usage: $0 {add|remove} device_name (e.g. sdb1)" |
| exit 1 |
| } |
| |
| if [[ $# -ne 2 ]]; then |
| usage |
| fi |
| |
| ACTION=$1 |
| DEVBASE=$2 |
| DEVICE="/dev/${DEVBASE}" |
| |
| # See if this drive is already mounted, and if so where |
| MOUNT_POINT=$(mount | grep ${DEVICE} | awk '{ print $3 }') |
| |
| DEV_LABEL="" |
| |
| do_mount() |
| { |
| if [[ -n ${MOUNT_POINT} ]]; then |
| echo "Warning: ${DEVICE} is already mounted at ${MOUNT_POINT}" |
| exit 1 |
| fi |
| |
| # Get info for this drive: $ID_FS_LABEL and $ID_FS_TYPE |
| eval $(blkid -o udev ${DEVICE} | grep -i -e "ID_FS_LABEL" -e "ID_FS_TYPE") |
| |
| # Figure out a mount point to use |
| LABEL=${ID_FS_LABEL} |
| if grep -q " /media/${LABEL} " /etc/mtab; then |
| # Already in use, make a unique one |
| LABEL+="-${DEVBASE}" |
| fi |
| DEV_LABEL="${LABEL}" |
| |
| # Use the device name in case the drive doesn't have label |
| if [ -z ${DEV_LABEL} ]; then |
| DEV_LABEL="${DEVBASE}" |
| fi |
| |
| MOUNT_POINT="/media/${DEV_LABEL}" |
| |
| echo "Mount point: ${MOUNT_POINT}" |
| |
| mkdir -p ${MOUNT_POINT} |
| |
| # Global mount options |
| OPTS="rw,relatime" |
| |
| # File system type specific mount options |
| if [[ ${ID_FS_TYPE} == "vfat" ]]; then |
| OPTS+=",users,gid=100,umask=000,shortname=mixed,utf8=1,flush" |
| fi |
| |
| if ! mount -o ${OPTS} ${DEVICE} ${MOUNT_POINT}; then |
| echo "Error mounting ${DEVICE} (status = $?)" |
| rmdir "${MOUNT_POINT}" |
| exit 1 |
| fi |
| |
| echo "Mounted ${DEVICE} at ${MOUNT_POINT}" |
| } |
| |
| do_unmount() |
| { |
| if [[ -z ${MOUNT_POINT} ]]; then |
| echo "Warning: ${DEVICE} is not mounted" |
| else |
| umount -l ${DEVICE} |
| echo "Unmounted ${DEVICE} from ${MOUNT_POINT}" |
| /bin/rmdir "${MOUNT_POINT}" |
| fi |
| |
| |
| } |
| |
| case "${ACTION}" in |
| add) |
| do_mount |
| ;; |
| remove) |
| do_unmount |
| ;; |
| *) |
| usage |
| ;; |
| esac |