1- #! /usr/bin/env bash
2- # If you are executing this script in cron with a restricted environment,
3- # modify the shebang to specify appropriate path; /bin/bash in most distros.
4- # And, also if you aren't comfortable using(abuse?) env command.
1+ #! /bin/bash
52
6- # This script is based on https://serverfault.com/a/767079 posted
7- # by Mike Blackwell, modified to our needs. Credits to the author.
3+ DEVICE=" /dev/$1 "
84
9- # This script is called from systemd unit file to mount or unmount
10- # a USB drive.
5+ MOUNT_OPTS= " "
6+ FS_UID_GID= " vfat exfat ntfs fuseblk "
117
12- PATH=" $PATH :/usr/bin:/usr/local/bin:/usr/sbin:/usr/local/sbin:/bin:/sbin"
13- log=" logger -t usb-mount.sh -s "
14-
15- usage ()
16- {
17- ${log} " Usage: $0 {add|remove} device_name (e.g. sdb1)"
8+ # Get filesystem type
9+ FSTYPE=$( blkid -o value -s TYPE " $DEVICE " )
10+ if [ -z " $FSTYPE " ]; then
11+ logger " usb-mount: No filesystem type found for $DEVICE "
1812 exit 1
19- }
20-
21- if [[ $# -ne 2 ]]; then
22- usage
2313fi
2414
25- ACTION=$1
26- DEVBASE=$2
27- DEVICE=" /dev/${DEVBASE} "
28-
29- # See if this drive is already mounted, and if so where
30- MOUNT_POINT=$( mount | grep ${DEVICE} | awk ' { print $3 }' )
31-
32- DEV_LABEL=" "
33-
34- do_mount ()
35- {
36- if [[ -n ${MOUNT_POINT} ]]; then
37- ${log} " Warning: ${DEVICE} is already mounted at ${MOUNT_POINT} "
38- exit 1
39- fi
40-
41- # Get info for this drive: $ID_FS_LABEL and $ID_FS_TYPE
42- eval $( blkid -o udev ${DEVICE} | grep -i -e " ID_FS_LABEL" -e " ID_FS_TYPE" )
43-
44- # Figure out a mount point to use
45- LABEL=${ID_FS_LABEL}
46- if grep -q " /media/${LABEL} " /etc/mtab; then
47- # Already in use, make a unique one
48- LABEL+=" -${DEVBASE} "
49- fi
50- DEV_LABEL=" ${LABEL} "
51-
52- # Use the device name in case the drive doesn't have label
53- if [ -z ${DEV_LABEL} ]; then
54- DEV_LABEL=" ${DEVBASE} "
55- fi
56-
57- MOUNT_POINT=" /media/${DEV_LABEL} "
58-
59- ${log} " Mount point: ${MOUNT_POINT} "
60-
61- mkdir -p ${MOUNT_POINT}
62-
63- # Global mount options
64- OPTS=" rw,relatime"
65-
66- # File system type specific mount options
67- if [[ ${ID_FS_TYPE} == " vfat" ]]; then
68- OPTS+=" ,users,gid=100,umask=000,shortname=mixed,utf8=1,flush"
69- fi
70-
71- if ! mount -o ${OPTS} ${DEVICE} ${MOUNT_POINT} ; then
72- ${log} " Error mounting ${DEVICE} (status = $? )"
73- rmdir " ${MOUNT_POINT} "
74- exit 1
75- else
76- # Track the mounted drives
77- echo " ${MOUNT_POINT} :${DEVBASE} " | cat >> " /var/log/usb-mount.track"
78- fi
79-
80- ${log} " Mounted ${DEVICE} at ${MOUNT_POINT} "
81- }
82-
83- do_unmount ()
84- {
85- if [[ -z ${MOUNT_POINT} ]]; then
86- ${log} " Warning: ${DEVICE} is not mounted"
87- else
88- umount -l ${DEVICE}
89- ${log} " Unmounted ${DEVICE} from ${MOUNT_POINT} "
90- /bin/rmdir " ${MOUNT_POINT} "
91- sed -i.bak " \@${MOUNT_POINT} @d" /var/log/usb-mount.track
92- fi
93-
15+ # Get label or use device name
16+ LABEL=$( blkid -o value -s LABEL " $DEVICE " )
17+ if [ -z " $LABEL " ]; then
18+ LABEL=$( basename " $DEVICE " )
19+ fi
9420
95- }
21+ MOUNT_POINT=" /media/usb/$LABEL "
22+ if echo " $FS_UID_GID " | grep -qw " $FSTYPE " ; then
23+ MOUNT_OPTS=" -o uid=1000,gid=1000"
24+ fi
9625
97- case " ${ACTION} " in
98- add)
99- do_mount
100- ;;
101- remove)
102- do_unmount
103- ;;
104- * )
105- usage
106- ;;
107- esac
26+ mkdir -p " $MOUNT_POINT "
27+ mount $MOUNT_OPTS " $DEVICE " " $MOUNT_POINT "
28+ if [ $? -eq 0 ]; then
29+ # chown -R 1000:1000 "$MOUNT_POINT"
30+ logger " usb-mount: Mounted $DEVICE at $MOUNT_POINT "
31+ else
32+ logger " usb-mount: Failed to mount $DEVICE "
33+ rmdir " $MOUNT_POINT "
34+ fi
0 commit comments