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>