Re: devd based AUTOMOUNTER

From: Hans Petter Selasky <hselasky_at_c2i.net>
Date: Sat, 18 Feb 2012 14:09:08 +0100
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() { # /* _at_=MESSAGE */
>   echo $( date +"${DATEFMT}" ) ${_at_} >> ${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
Received on Sat Feb 18 2012 - 12:10:59 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:24 UTC