devd based AUTOMOUNTER
Hans Petter Selasky
hselasky at c2i.net
Sat Feb 18 13:21:00 UTC 2012
On Saturday 18 February 2012 10:48:11 vermaden wrote:
> Added a check if ntfs-3g is available, if not then mount_ntfs is used
> instead. Added deleting of empty directories at ${MNTPREFIX}.
> Added ${MNTPREFIX} to be set to /mnt or /media according to preference
>
> #! /bin/sh
>
> PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
> MNTPREFIX="/media"
> LOG="/var/log/automount.log"
> STATE="/var/run/automount.state"
> DATEFMT="%Y-%m-%d %H:%M:%S"
>
> __create_mount_point() { # /* 1=DEV */
> MNT="${MNTPREFIX}/$( basename ${1} )"
> mkdir -p ${MNT}
> }
>
> __state_lock() {
> while [ -f ${STATE}.lock ]; do sleep 0.5; done
>
> :> ${STATE}.lock
>
> }
>
> __state_unlock() {
> rm ${STATE}.lock
> }
>
> __state_add() { # /* 1=DEV 2=PROVIDER 3=MNT */
> __state_lock
> grep -E "${3}" ${STATE} 1> /dev/null 2> /dev/null && {
> __log "${1}:duplicated '${STATE}'"
> return 1
> }
> echo "${1} ${2} ${3}" >> ${STATE}
> __state_unlock
> }
>
> __state_remove() { # /* 1=MNT 2=STATE 3=LINE */
> BSMNT=$( echo ${1} | sed 's/\//\\\//g' )
> sed -i '' "/${BSMNT}\$/d" ${2}
> }
>
> __log() { # /* @=MESSAGE */
> echo $( date +"${DATEFMT}" ) ${@} >> ${LOG}
> }
>
> case ${2} in
> (attach)
> for I in /dev/${1}*
> do
> case $( file -L -s ${I} | sed -E 's/label:\ \".*\"//g' ) in
> (*NTFS*)
> dd < ${I} count=1 2> /dev/null \
>
> | strings \
> | head -1 \
> | grep -q "NTFS" && {
>
> __create_mount_point ${I}
> which ntfs-3g 1> /dev/null 2> /dev/null && {
> ntfs-3g ${I} ${MNT} # /* sysutils/fusefs-ntfs */
> } || {
> mount_ntfs ${I} ${MNT}
> }
> __log "${I}:mount (ntfs)"
> }
> ;;
> (*FAT*)
> dd < ${I} count=1 2> /dev/null \
>
> | strings \
> | grep -q "FAT32" && {
>
> __create_mount_point ${I}
> fsck_msdosfs -y ${I}
> mount_msdosfs -o large -l -L pl_PL.ISO8859-2 -D cp852 ${I}
> ${MNT} __log "${I}:mount (fat)"
> }
> ;;
> (*ext2*)
> __create_mount_point ${I}
> fsck.ext2 -y ${I}
> mount -t ext2fs ${I} ${MNT}
> __log "${I}:mount (ext2)"
> ;;
> (*ext3*)
> __create_mount_point ${I}
> fsck.ext3 -y ${I}
> mount -t ext2fs ${I} ${MNT}
> __log "${I}:mount (ext3)"
> ;;
> (*ext4*)
> __create_mount_point ${I}
> fsck.ext4 -y ${I}
> ext4fuse ${I} ${MNT} # /* sysutils/fusefs-ext4fuse */
> __log "${I}:mount (ext4)"
> ;;
> (*Unix\ Fast\ File*)
> __create_mount_point ${I}
> fsck_ufs -y ${I}
> mount ${I} ${MNT}
> __log "${I}:mount (ufs)"
> ;;
> (*)
> case $( dd < ${I} count=1 2> /dev/null | strings | head -1 ) in
> (EXFAT)
> __create_mount_point ${I}
> mount.exfat ${I} ${MNT} # /* sysutils/fusefs-exfat */
> __log "${I}:mount (ufs)"
> ;;
> (*) continue ;;
> esac
> ;;
> esac
> __state_add ${I} $( mount | grep -m 1 " ${MNT} " | awk '{printf $1}'
> ) \ ${MNT} || continue
> done
> ;;
>
> (detach)
> MOUNT=$( mount )
> __state_lock
> grep ${1} ${STATE} \
>
> | while read DEV PROVIDER MNT
>
> do
> TARGET=$( echo "${MOUNT}" | grep -E "^${PROVIDER} " | awk '{print
> $3}' ) [ -z ${TARGET} ] && {
> __state_remove ${MNT} ${STATE} ${LINE}
> continue
> }
> umount -f ${TARGET} &
> unset TARGET
> __state_remove ${MNT} ${STATE} ${LINE}
> __log "${DEV}:umount"
> done
> __state_unlock
> __log "/dev/${1}:detach"
> find ${MNTPREFIX} -type d -empty -delete
> ;;
>
> esac
>
> > Not sure if you've looked at disktype in sysutils
> > but it may be useful to you.
>
Hi,
Should your script be written like an rc.d script, so that one can
enable/disable this automounting from /etc/rc.conf?
--HPS
More information about the freebsd-stable
mailing list