From owner-freebsd-hackers@FreeBSD.ORG Sat Feb 18 17:08:20 2012 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4D6601065672 for ; Sat, 18 Feb 2012 17:08:20 +0000 (UTC) (envelope-from uffe@uffe.org) Received: from mail.starion.dk (mx0.starion.dk [93.162.70.34]) by mx1.freebsd.org (Postfix) with SMTP id 74DC28FC08 for ; Sat, 18 Feb 2012 17:08:18 +0000 (UTC) Received: (qmail 27891 invoked by uid 1004); 18 Feb 2012 17:08:42 -0000 Message-ID: <4F3FDA8F.7080807@uffe.org> Date: Sat, 18 Feb 2012 18:06:23 +0100 From: Uffe Jakobsen X-Mozilla-Draft-Info: internal/draft; vcard=0; receipt=0; DSN=0; uuencode=0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.2) Gecko/20120216 Thunderbird/10.0.2 MIME-Version: 1.0 To: freebsd-hackers@freebsd.org References: <4F3EE186.4020801@gmail.com> <201202181409.08859.hselasky@c2i.net> In-Reply-To: <201202181409.08859.hselasky@c2i.net> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Cc: vermaden Subject: Re: devd based AUTOMOUNTER X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Feb 2012 17:08:20 -0000 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