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 2f2e95942e
1 changed files with 97 additions and 44 deletions

117
automount
View File

@ -124,26 +124,19 @@ fi
if [ "${USERUMOUNT}" = YES ]
then
chmod u+s /sbin/umount # WHEEL group member
sysctl vfs.usermount=1 # allow USER to mount
chmod u+s /sbin/umount 1> /dev/null 2> /dev/null # WHEEL group member
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
__create_mount_point() { # 1=DEV
mkdir -p ${MNT}
if ! [ "${USER}" = 0 ]
if [ "${USER}" != 0 ]
then
chown ${USER}:$( id -g -n ${USER} ) ${MNT}
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
if grep -E "${3}$" ${STATE} 1> /dev/null 2> /dev/null
then
@ -161,12 +154,34 @@ __state_remove() { # 1=MNT
__remove_dir() { # 1=TARGET
if [ "${REMOVEDIRS}" = YES ]
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
}
__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}
@ -175,23 +190,31 @@ case ${2} in
(attach)
ADD=0
MNT="${MNTPREFIX}/${1}"
__check_already_mounted ${MNT}
__check_already_mounted -d ${DEV}
__check_already_mounted -m ${MNT}
if [ "${ATIME}" = NO ]
then
OPTS="noatime"
fi
while ! head -c 1 ${DEV} 1> /dev/null 2> /dev/null
do
sleep 1
sleep 0.2
done
case $( file -b -L -s ${DEV} | sed -E 's/label:\ \".*\"//g' ) in
(*FAT*) # must be before NTFS section: newfs_msdos -O NTFS -L NTFS
__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} \
-m 644 -M 755 ${DEV} ${MNT}
then
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
__log "${DEV}: mount (fat)"
;;
@ -202,6 +225,9 @@ case ${2} in
if ntfs-3g -o ${OPTS} ${DEV} ${MNT}
then
ADD=1
else
__log "${DEV}: mount failed (ntfs) 'ntfs-3g -o ${OPTS} ${DEV} ${MNT}'"
exit 1
fi
else
if ! [ "${USER}" = 0 ]
@ -211,43 +237,74 @@ case ${2} in
if mount_ntfs ${OPTS} -o noatime ${DEV} ${MNT}
then
ADD=1
else
__log "${DEV}: mount failed (ntfs) 'ntfs-3g -o ${OPTS} ${DEV} ${MNT}'"
exit 1
fi
fi
__log "${DEV}: mount (ntfs)"
;;
(*ext2*)
__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}
then
ADD=1
else
__log "${DEV}: mount failed (ext2) 'mount -t ext2fs -o ${OPTS} ${DEV} ${MNT}'"
exit 1
fi
__log "${DEV}: mount (ext2)"
;;
(*ext3*)
__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}
then
ADD=1
else
__log "${DEV}: mount failed (ext3) 'mount -t ext2fs -o ${OPTS} ${DEV} ${MNT}'"
exit 1
fi
__log "${DEV}: mount (ext3)"
;;
(*ext4*)
__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
then
ADD=1
else
__log "${DEV}: mount failed (ext4) 'ext4fuse ${DEV} ${MNT}'"
exit 1
fi
__log "${DEV}: mount (ext4)"
;;
(*Unix\ Fast\ File*)
__create_mount_point ${DEV}
fsck_ufs -C -y ${DEV}
if mount -o ${OPTS} ${DEV} ${MNT}
fsck_ufs -C -y ${DEV} \
| while read LINE
do
__log "${DEV}: fsck_ufs ${LINE}"
done
if mount -t ufs -o ${OPTS} ${DEV} ${MNT}
then
ADD=1
else
__log "${DEV}: mount failed (ufs) 'mount -t ufs -o ${OPTS} ${DEV} ${MNT}'"
exit 1
fi
__log "${DEV}: mount (ufs)"
;;
@ -258,6 +315,9 @@ case ${2} in
if mount.exfat -o ${OPTS} ${DEV} ${MNT} # sysutils/fusefs-exfat
then
ADD=1
else
__log "${DEV}: mount failed (exfat) 'mount.exfat -o ${OPTS} ${DEV} ${MNT}'"
exit 1
fi
__log "${DEV}: mount (exfat)"
;;
@ -271,7 +331,8 @@ case ${2} in
__state_add ${DEV} ${PROVIDER} ${MNT}
if [ "${USER}" != 0 -a "${FM}" != 0 ]
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
;;
@ -286,7 +347,7 @@ case ${2} in
then
continue
fi
( # put entire umount and find/rm block into background
( # put entire umount/find/rm block into background
umount -f ${TARGET}
__remove_dir "${TARGET}"
__log "${DEV}: removed '${TARGET}'"
@ -296,15 +357,7 @@ case ${2} in
done
__log "${DEV}: detach"
__remove_dir "${MNTPREFIX}/${1}"
__log "${DEV}:removed '${MNTPREFIX}/${1}'"
__log "${DEV}: mount point '${MNTPREFIX}/${1}' removed"
;;
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