From 2f2e95942eb6e1c05acc345bcaafd3175b636249 Mon Sep 17 00:00:00 2001 From: "Slawomir Wojciech Wojtczak (vermaden)" Date: Thu, 10 Jan 2013 09:22:08 +0100 Subject: [PATCH] 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. --- automount | 141 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 97 insertions(+), 44 deletions(-) diff --git a/automount b/automount index d96dece..1843667 100755 --- a/automount +++ b/automount @@ -124,30 +124,23 @@ 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 - __log "${1}:duplicated '${STATE}'" + __log "${1}: duplicated '${STATE}'" exit 0 fi echo "${1} ${2} ${3}" >> ${STATE} @@ -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,25 +190,33 @@ 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} + -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)" + __log "${DEV}: mount (fat)" ;; (*NTFS*) # must be after FAT section: newfs_msdos -O NTFS -L NTFS __create_mount_point ${DEV} @@ -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,45 +237,76 @@ 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)" + __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)" + __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)" + __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)" + __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)" + __log "${DEV}: mount (ufs)" ;; (*) 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 then ADD=1 + else + __log "${DEV}: mount failed (exfat) 'mount.exfat -o ${OPTS} ${DEV} ${MNT}'" + exit 1 fi - __log "${DEV}:mount (exfat)" + __log "${DEV}: mount (exfat)" ;; esac ;; @@ -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,25 +347,17 @@ 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}'" + __log "${DEV}: removed '${TARGET}'" ) & unset TARGET - __log "${DEV}:umount" + __log "${DEV}: umount" done - __log "${DEV}:detach" + __log "${DEV}: detach" __remove_dir "${MNTPREFIX}/${1}" - __log "${DEV}:removed '${MNTPREFIX}/${1}'" + __log "${DEV}: mount point '${MNTPREFIX}/${1}' removed" ;; esac - -# camcontrol devlist -# at scbus0 target 0 lun 0 (ada0,pass0) -# at scbus4 target 0 lun 0 (pass1,da0) - -# camcontrol devlist | grep -E -o "<.*>" | tr ' ' '-' | tr -d '<>' -# INTEL-SSDSA2M160G2GC-2CV102HD -# HTC-Android-Phone-0100