Improved checking for already mounted devices. More readable log format. Added logging of fsck(8) output. Added adding setuid also to /sbin/mount* when USERUMOUNT set to YES. Added error logging of failed mounts.

This commit is contained in:
Slawomir Wojciech Wojtczak (vermaden) 2013-01-10 09:22:08 +01:00
parent 8a9e8d24f8
commit 3dd2a79948
1 changed files with 97 additions and 44 deletions

141
automount
View File

@ -124,30 +124,23 @@ fi
if [ "${USERUMOUNT}" = YES ] if [ "${USERUMOUNT}" = YES ]
then then
chmod u+s /sbin/umount # WHEEL group member chmod u+s /sbin/umount 1> /dev/null 2> /dev/null # WHEEL group member
sysctl vfs.usermount=1 # allow USER to mount chmod u+s /sbin/mount* 1> /dev/null 2> /dev/null # WHEEL group member
sysctl vfs.usermount=1 1> /dev/null 2> /dev/null # allow USER to mount
fi fi
__create_mount_point() { # 1=DEV __create_mount_point() { # 1=DEV
mkdir -p ${MNT} mkdir -p ${MNT}
if ! [ "${USER}" = 0 ] if [ "${USER}" != 0 ]
then then
chown ${USER}:$( id -g -n ${USER} ) ${MNT} chown ${USER}:$( id -g -n ${USER} ) ${MNT}
fi fi
} }
__check_already_mounted() { # 1=MNT
if mount | grep " ${1} " 1> /dev/null 2> /dev/null
then
__log "${DEV}:already mounted (ntfs)"
exit 0
fi
}
__state_add() { # 1=DEV 2=PROVIDER 3=MNT __state_add() { # 1=DEV 2=PROVIDER 3=MNT
if grep -E "${3}$" ${STATE} 1> /dev/null 2> /dev/null if grep -E "${3}$" ${STATE} 1> /dev/null 2> /dev/null
then then
__log "${1}:duplicated '${STATE}'" __log "${1}: duplicated '${STATE}'"
exit 0 exit 0
fi fi
echo "${1} ${2} ${3}" >> ${STATE} echo "${1} ${2} ${3}" >> ${STATE}
@ -161,12 +154,34 @@ __state_remove() { # 1=MNT
__remove_dir() { # 1=TARGET __remove_dir() { # 1=TARGET
if [ "${REMOVEDIRS}" = YES ] if [ "${REMOVEDIRS}" = YES ]
then then
find "${1}" -type d -empty -maxdepth 1 -exec rm -r {} '+' find "${1}" -type d -empty -maxdepth 1 -exec rm -r {} '+' 2> /dev/null
fi fi
} }
__log() { # @=MESSAGE __log() { # @=MESSAGE
echo $( date +"${DATEFMT}" ) ${@} >> ${LOG} echo $( date +"${DATEFMT}" ) "${@}" >> ${LOG}
}
__check_already_mounted() { # 1=(-d|-m) 2=(DEV|MNT)
local MOUNT="$( mount )"
case ${1} in
(-d)
if echo "${MOUNT}" | grep -q "^${2} on "
then
local MOUNT="$( echo "${MOUNT}" | grep "^${2} on " | cut -d ' ' -f 3-255 | cut -d '(' -f 1 | sed s/.$// )"
__log "${DEV}: -d already mounted on '${MOUNT}' mount point"
exit 0
fi
;;
(-m)
if echo "${MOUNT}" | grep -q " on ${2} "
then
local DEVICE="$( echo "${MOUNT}" | grep " on ${2} " | awk '{print $1}' )"
__log "${DEVICE}: -m already mounted on '${2}' mount point"
exit 0
fi
;;
esac
} }
DEV=/dev/${1} DEV=/dev/${1}
@ -175,25 +190,33 @@ case ${2} in
(attach) (attach)
ADD=0 ADD=0
MNT="${MNTPREFIX}/${1}" MNT="${MNTPREFIX}/${1}"
__check_already_mounted ${MNT} __check_already_mounted -d ${DEV}
__check_already_mounted -m ${MNT}
if [ "${ATIME}" = NO ] if [ "${ATIME}" = NO ]
then then
OPTS="noatime" OPTS="noatime"
fi fi
while ! head -c 1 ${DEV} 1> /dev/null 2> /dev/null while ! head -c 1 ${DEV} 1> /dev/null 2> /dev/null
do do
sleep 1 sleep 0.2
done done
case $( file -b -L -s ${DEV} | sed -E 's/label:\ \".*\"//g' ) in case $( file -b -L -s ${DEV} | sed -E 's/label:\ \".*\"//g' ) in
(*FAT*) # must be before NTFS section: newfs_msdos -O NTFS -L NTFS (*FAT*) # must be before NTFS section: newfs_msdos -O NTFS -L NTFS
__create_mount_point ${DEV} __create_mount_point ${DEV}
fsck_msdosfs -y ${DEV} fsck_msdosfs -y ${DEV} \
| while read LINE
do
__log "${DEV}: fsck_msdosfs ${LINE}"
done
if mount_msdosfs -o large -D ${CODEPAGE} -L ${ENCODING} \ if mount_msdosfs -o large -D ${CODEPAGE} -L ${ENCODING} \
-m 644 -M 755 ${DEV} ${MNT} -m 644 -M 755 ${DEV} ${MNT}
then then
ADD=1 ADD=1
else
__log "${DEV}: mount failed (fat) 'mount_msdosfs -o large -D ${CODEPAGE} -L ${ENCODING} -m 644 -M 755 ${DEV} ${MNT}'"
exit 1
fi fi
__log "${DEV}:mount (fat)" __log "${DEV}: mount (fat)"
;; ;;
(*NTFS*) # must be after FAT section: newfs_msdos -O NTFS -L NTFS (*NTFS*) # must be after FAT section: newfs_msdos -O NTFS -L NTFS
__create_mount_point ${DEV} __create_mount_point ${DEV}
@ -202,6 +225,9 @@ case ${2} in
if ntfs-3g -o ${OPTS} ${DEV} ${MNT} if ntfs-3g -o ${OPTS} ${DEV} ${MNT}
then then
ADD=1 ADD=1
else
__log "${DEV}: mount failed (ntfs) 'ntfs-3g -o ${OPTS} ${DEV} ${MNT}'"
exit 1
fi fi
else else
if ! [ "${USER}" = 0 ] if ! [ "${USER}" = 0 ]
@ -211,45 +237,76 @@ case ${2} in
if mount_ntfs ${OPTS} -o noatime ${DEV} ${MNT} if mount_ntfs ${OPTS} -o noatime ${DEV} ${MNT}
then then
ADD=1 ADD=1
else
__log "${DEV}: mount failed (ntfs) 'ntfs-3g -o ${OPTS} ${DEV} ${MNT}'"
exit 1
fi fi
fi fi
__log "${DEV}:mount (ntfs)" __log "${DEV}: mount (ntfs)"
;; ;;
(*ext2*) (*ext2*)
__create_mount_point ${DEV} __create_mount_point ${DEV}
fsck.ext2 -y ${DEV} fsck.ext2 -y ${DEV} \
| while read LINE
do
__log "${DEV}: fsck.ext2 ${LINE}"
done
if mount -t ext2fs -o ${OPTS} ${DEV} ${MNT} if mount -t ext2fs -o ${OPTS} ${DEV} ${MNT}
then then
ADD=1 ADD=1
else
__log "${DEV}: mount failed (ext2) 'mount -t ext2fs -o ${OPTS} ${DEV} ${MNT}'"
exit 1
fi fi
__log "${DEV}:mount (ext2)" __log "${DEV}: mount (ext2)"
;; ;;
(*ext3*) (*ext3*)
__create_mount_point ${DEV} __create_mount_point ${DEV}
fsck.ext3 -y ${DEV} fsck.ext3 -y ${DEV} \
| while read LINE
do
__log "${DEV}: fsck.ext3 ${LINE}"
done
if mount -t ext2fs -o ${OPTS} ${DEV} ${MNT} if mount -t ext2fs -o ${OPTS} ${DEV} ${MNT}
then then
ADD=1 ADD=1
else
__log "${DEV}: mount failed (ext3) 'mount -t ext2fs -o ${OPTS} ${DEV} ${MNT}'"
exit 1
fi fi
__log "${DEV}:mount (ext3)" __log "${DEV}: mount (ext3)"
;; ;;
(*ext4*) (*ext4*)
__create_mount_point ${DEV} __create_mount_point ${DEV}
fsck.ext4 -y ${DEV} fsck.ext4 -y ${DEV} \
| while read LINE
do
__log "${DEV}: fsck.ext4 ${LINE}"
done
if ext4fuse ${DEV} ${MNT} # sysutils/fusefs-ext4fuse if ext4fuse ${DEV} ${MNT} # sysutils/fusefs-ext4fuse
then then
ADD=1 ADD=1
else
__log "${DEV}: mount failed (ext4) 'ext4fuse ${DEV} ${MNT}'"
exit 1
fi fi
__log "${DEV}:mount (ext4)" __log "${DEV}: mount (ext4)"
;; ;;
(*Unix\ Fast\ File*) (*Unix\ Fast\ File*)
__create_mount_point ${DEV} __create_mount_point ${DEV}
fsck_ufs -C -y ${DEV} fsck_ufs -C -y ${DEV} \
if mount -o ${OPTS} ${DEV} ${MNT} | while read LINE
do
__log "${DEV}: fsck_ufs ${LINE}"
done
if mount -t ufs -o ${OPTS} ${DEV} ${MNT}
then then
ADD=1 ADD=1
else
__log "${DEV}: mount failed (ufs) 'mount -t ufs -o ${OPTS} ${DEV} ${MNT}'"
exit 1
fi fi
__log "${DEV}:mount (ufs)" __log "${DEV}: mount (ufs)"
;; ;;
(*) (*)
case $( dd < ${DEV} count=1 2> /dev/null | strings | head -1 ) in case $( dd < ${DEV} count=1 2> /dev/null | strings | head -1 ) in
@ -258,8 +315,11 @@ case ${2} in
if mount.exfat -o ${OPTS} ${DEV} ${MNT} # sysutils/fusefs-exfat if mount.exfat -o ${OPTS} ${DEV} ${MNT} # sysutils/fusefs-exfat
then then
ADD=1 ADD=1
else
__log "${DEV}: mount failed (exfat) 'mount.exfat -o ${OPTS} ${DEV} ${MNT}'"
exit 1
fi fi
__log "${DEV}:mount (exfat)" __log "${DEV}: mount (exfat)"
;; ;;
esac esac
;; ;;
@ -271,7 +331,8 @@ case ${2} in
__state_add ${DEV} ${PROVIDER} ${MNT} __state_add ${DEV} ${PROVIDER} ${MNT}
if [ "${USER}" != 0 -a "${FM}" != 0 ] if [ "${USER}" != 0 -a "${FM}" != 0 ]
then then
su - ${USER} -c "env DISPLAY=:0 ${FM} ${MNT} &" # su - ${USER} -c "env DISPLAY=:0 ${FM} ${MNT} &"
su - ${USER} -c "env DISPLAY=:0 ${FM} &"
fi fi
fi fi
;; ;;
@ -286,25 +347,17 @@ case ${2} in
then then
continue continue
fi fi
( # put entire umount and find/rm block into background ( # put entire umount/find/rm block into background
umount -f ${TARGET} umount -f ${TARGET}
__remove_dir "${TARGET}" __remove_dir "${TARGET}"
__log "${DEV}:removed '${TARGET}'" __log "${DEV}: removed '${TARGET}'"
) & ) &
unset TARGET unset TARGET
__log "${DEV}:umount" __log "${DEV}: umount"
done done
__log "${DEV}:detach" __log "${DEV}: detach"
__remove_dir "${MNTPREFIX}/${1}" __remove_dir "${MNTPREFIX}/${1}"
__log "${DEV}:removed '${MNTPREFIX}/${1}'" __log "${DEV}: mount point '${MNTPREFIX}/${1}' removed"
;; ;;
esac esac
# camcontrol devlist
# <INTEL SSDSA2M160G2GC 2CV102HD> at scbus0 target 0 lun 0 (ada0,pass0)
# <HTC Android Phone 0100> at scbus4 target 0 lun 0 (pass1,da0)
# camcontrol devlist | grep -E -o "<.*>" | tr ' ' '-' | tr -d '<>'
# INTEL-SSDSA2M160G2GC-2CV102HD
# HTC-Android-Phone-0100