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



_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"

Reply via email to