Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 18 Feb 2012 18:06:23 +0100
From:      Uffe Jakobsen <uffe@uffe.org>
To:        freebsd-hackers@freebsd.org
Cc:        vermaden <vermaden@interia.pl>
Subject:   Re: devd based AUTOMOUNTER
Message-ID:  <4F3FDA8F.7080807@uffe.org>
In-Reply-To: <201202181409.08859.hselasky@c2i.net>
References:  <hkubftdrahxmtuzcfqzh@ziad> <4F3EE186.4020801@gmail.com> <uhhupehcnrebtwjfedhg@xlkc> <201202181409.08859.hselasky@c2i.net>

next in thread | previous in thread | raw e-mail | index | archive | help


On 2012-02-18 14:09, Hans Petter Selasky wrote:
> 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?
>

Nice,

Some comments:

Instead of requiring modification to /etc/devd.conf why not just put a 
"plugin" conf-file in /etc/devd/ - well even better put in 
/usr/local/etc/devd/ - that way your devd.conf modifications are not 
lost upon patching/updating base os.

There is an existing port called "automounter" by Dominic Fandrey  which 
is much similar to your work.

You can get inspired of how he places his devd.conf in /usr/local/etc/devd/
His "automounter" also works with disk labels (as found in /dev/ufs/ and 
/dev/msdosfs/ etc)

You should consider make a port out of your work.

/Uffe






Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4F3FDA8F.7080807>