Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 18 Feb 2012 10:48:11 +0100
From:      vermaden <vermaden@interia.pl>
To:        matt <sendtomatt@gmail.com>
Cc:        freebsd-hackers@freebsd.org, freebsd-current@freebsd.org, freebsd-stable@FreeBSD.org
Subject:   Re: devd based AUTOMOUNTER
Message-ID:  <uhhupehcnrebtwjfedhg@xlkc>
In-Reply-To: <4F3EE186.4020801@gmail.com>
References:  <hkubftdrahxmtuzcfqzh@ziad> <4F3EA8F6.6040702@gmail.com> <zjtdgngjnushmrbwfbpj@cntv> <4F3EE186.4020801@gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Added a check if ntfs-3g is available, if not then mount_ntfs is used inste=
ad.
Added deleting of empty directories at ${MNTPREFIX}.
Added ${MNTPREFIX} to be set to /mnt or /media according to preference

#! /bin/sh

PATH=3D/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
MNTPREFIX=3D"/media"
LOG=3D"/var/log/automount.log"
STATE=3D"/var/run/automount.state"
DATEFMT=3D"%Y-%m-%d %H:%M:%S"

__create_mount_point() { # /* 1=3DDEV */
  MNT=3D"${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=3DDEV 2=3DPROVIDER 3=3DMNT */
  __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=3DMNT 2=3DSTATE 3=3DLINE */
  BSMNT=3D$( echo ${1} | sed 's/\//\\\//g' )
  sed -i '' "/${BSMNT}\$/d" ${2}
}

__log() { # /* @=3DMESSAGE */
  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=3D1 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=3D1 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=3D1 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=3D$( mount )
    __state_lock
    grep ${1} ${STATE} \
      | while read DEV PROVIDER MNT
        do
          TARGET=3D$( echo "${MOUNT}" | grep -E "^${PROVIDER} " | awk '{pri=
nt $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.

I will get look into that, thanks ;)



> Neat scripts!
> Matt

Thanks mate.



Regards,
vermaden



--=20








































...



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