Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 17 Feb 2012 21:41:06 +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:  <lumkdohgpitpiglhwvdq@ycbb>
In-Reply-To: <4F3EA8F6.6040702@gmail.com>
References:  <hkubftdrahxmtuzcfqzh@ziad> <4F3EA8F6.6040702@gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

I already made some changes for the 'better' ...

Here is the latest version:

#! /bin/sh

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

__create_mount_point() { # /* 1=DEV */
  MNT="/mnt/$( 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} ) in
        (*NTFS*)
          __create_mount_point ${I}
          ntfs-3g ${I} ${MNT} # /* sysutils/fusefs-ntfs */
          __log "${I}:mount (ntfs)"
          ;;
        (*FAT*)
          __create_mount_point ${I}
          fsck_msdosfs -y ${I}
          mount_msdosfs -o large -o longnames -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 < ${O} count=1 | 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 " ${MNT} " | awk '{printf $1}' ) ${MNT} || continue
    done
    ;;

  (detach)
    __state_lock
    grep ${1} ${STATE} \
      | while read DEV PROVIDER MNT
        do
          TARGET=$( 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"
    ;;

esac



I have made tests with 3 different USB drives, with different and same failesystems, connecting them all at once, disconnecting all at once, random connect, disconnect etc.

Currently it seems to work ok but suggestions are very welcome.


> Some things to consider/test:
> 
> How do I set custom flags, like nosuid,noatime,nodev,noexec,async (or
> sync) for mounts?
Currently You can add these options to filesystem specific mount command, but its definitely possible.

> What if make a usb drive with an illegal name, existing name or other dangerous values?
The filesystem label is not used at all, I just use device names, which are reported by FreeBSD, so quite bulletproof here and then create appreciate /mnt/da0s1 directories.

> Can I use the automounter to either mount over another mount to
> impersonate it, or can I overwrite arbitrary files or directories?
I have done everything to check that and to omit that, if not, then submit a BUG ;)

Thanks for suggestions Matt.

Regards,
vermaden


-- 








































...



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