ports/159631: New port: sysutils/amount FreeBSD specific auto mount framework for X11
Aragon Gouveia
aragon at phat.za.net
Tue Aug 9 17:30:13 UTC 2011
>Number: 159631
>Category: ports
>Synopsis: New port: sysutils/amount FreeBSD specific auto mount framework for X11
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Tue Aug 09 17:30:12 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator: Aragon Gouveia
>Release: 8.2-RELEASE-p2
>Organization:
>Environment:
FreeBSD fuzz.geek.sh 8.2-RELEASE-p2 FreeBSD 8.2-RELEASE-p2 #0: Sun Jul 10 15:27:35 SAST 2011 toor at igor.geek.sh:/usr/obj/usr/src-RELENG_8_2/sys/FUZZ amd64
>Description:
amount is a FreeBSD specific auto mount framework,
primarily intended for X11 users. It uses FreeBSD-native
facilities to detect device insertion and perform
volume discovery.
>How-To-Repeat:
>Fix:
Patch attached with submission follows:
# This is a shell archive. Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file". Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
# amount
# amount/Makefile
# amount/files
# amount/files/amountd.in
# amount/files/dist
# amount/files/dist/amount.conf
# amount/files/dist/amount.in
# amount/files/dist/amount_ob.in
# amount/files/dist/amountd.in
# amount/files/dist/amount.sh
# amount/pkg-plist
# amount/pkg-descr
#
echo c - amount
mkdir -p amount > /dev/null 2>&1
echo x - amount/Makefile
sed 's/^X//' >amount/Makefile << '1d430d95b9cd4912298940d7717616b4'
X# New ports collection makefile for: amount
X# Date created: 7 August 2011
X# Whom: Aragon Gouveia <aragon at phat.za.net>
X#
X# $FreeBSD$
X#
X
XPORTNAME= amount
XPORTVERSION= 0.6
XCATEGORIES= sysutils
XMASTER_SITES= # empty
XDISTFILES= # none
XEXTRACT_ONLY= # empty
X
XMAINTAINER= aragon at phat.za.net
XCOMMENT= FreeBSD specific auto mount framework for X11
X
XRUN_DEPENDS= ${LOCALBASE}/bin/sudo:${PORTSDIR}/security/sudo
X
XSUB_FILES= dist/amount dist/amountd
XUSE_RC_SUBR= amountd
XNO_BUILD= yes
X
XOPTIONS= OPENBOX "Install Openbox pipemenu script" off
X
X.include <bsd.port.options.mk>
X
X.if defined(WITH_OPENBOX)
XSUB_FILES+= dist/amount_ob
XRUN_DEPENDS+= ${LOCALBASE}/bin/xmessage:${PORTSDIR}/x11/xmessage
XPLIST_SUB+= OPENBOX=""
X.else
XPLIST_SUB+= OPENBOX="@comment "
X.endif
X
Xdo-extract:
X @${MKDIR} ${WRKDIR}/dist
X
Xdo-install:
X ${INSTALL_SCRIPT} ${WRKDIR}/dist/amountd ${PREFIX}/sbin
X ${INSTALL_SCRIPT} ${WRKDIR}/dist/amount ${PREFIX}/bin
X.if defined(WITH_OPENBOX)
X ${INSTALL_SCRIPT} ${WRKDIR}/dist/amount_ob ${PREFIX}/bin
X.endif
X ${INSTALL_DATA} ${FILESDIR}/dist/amount.conf ${PREFIX}/etc/amount.conf.sample
X ${MKDIR} ${PREFIX}/lib/amount
X ${INSTALL_DATA} ${FILESDIR}/dist/amount.sh ${PREFIX}/lib/amount/amount.sh
X
X.include <bsd.port.mk>
1d430d95b9cd4912298940d7717616b4
echo c - amount/files
mkdir -p amount/files > /dev/null 2>&1
echo x - amount/files/amountd.in
sed 's/^X//' >amount/files/amountd.in << '1cba31682b6368f44d5497639df51b88'
X#!/bin/sh
X
X# PROVIDE: amountd
X# REQUIRE: DAEMON
X# KEYWORD: shutdown nojail
X
X. /etc/rc.subr
X
Xname="amountd"
Xrcvar=`set_rcvar`
Xcommand="%%PREFIX%%/sbin/amountd"
Xload_rc_config $name
Xpidfile="/var/run/amountd.pid"
Xcommand_interpreter=/bin/sh
X
Xrun_rc_command "$1"
1cba31682b6368f44d5497639df51b88
echo c - amount/files/dist
mkdir -p amount/files/dist > /dev/null 2>&1
echo x - amount/files/dist/amount.conf
sed 's/^X//' >amount/files/dist/amount.conf << 'b0b16dbe415c0c95e82edf5d60d524bd'
XWRKDIR=/tmp/amountd
XDEVMATCH="^(da|mmcsd)"
XLABELMATCH="^(msdosfs|ntfs|ufs)/"
XMNTPREFIX=/media
b0b16dbe415c0c95e82edf5d60d524bd
echo x - amount/files/dist/amount.in
sed 's/^X//' >amount/files/dist/amount.in << 'ecd6f9da579f629514b6b579f55fd3fd'
X#!/bin/sh
X#
X# Command line tool for amountd
X
X. %%PREFIX%%/lib/amount/amount.sh
X
Xif [ -r %%PREFIX%%/etc/amount.conf ]; then
X . %%PREFIX%%/etc/amount.conf
Xfi
X
X: ${WRKDIR:=/tmp/amountd}
X: ${MNTPREFIX=/media}
X
XVERSION=0.6
X
Xif [ "${1}" = "doCmd" ]; then
X shift
X doCmd "$@"
X exit $?
Xfi
X
Xif [ -n "${1}" ]; then
X cdev=${1}
Xfi
X
Xif [ ! -r ${WRKDIR}/mountable ]; then
X echo amountd mountable unreadable 1>&2
X exit 1
Xfi
X
XIFS=" "
Xwhile read dev fs mntcmd label <&3; do
X if [ -z "${label}" ]; then
X provider=/dev/${dev}
X mpoint=${MNTPREFIX}/${dev}
X olabel="${dev} ${fs}"
X else
X provider="/dev/${fs}/${label}"
X mpoint="${MNTPREFIX}/${label}"
X olabel="${dev} ${fs}/${label}"
X fi
X mstat=$(mount |grep -E "^/dev/(${dev}|${fs}/${label}) on")
X if [ $? -eq 0 ]; then
X op=umount
X eval $(echo ${mstat} |sed -E 's|^(/dev/.*) on (/.*) \(.*$|provider="\1"; mpoint="\2";|')
X else
X op=mount
X fi
X if [ -n "${cdev}" ]; then
X if [ "${cdev}" = "${dev}" ]; then
X echo -n "${op}ing ${olabel}... "
X sudo ${0} doCmd ${op} ${fs} "${mntcmd}" "${provider}" "${mpoint}" ${USER}
X if [ $? -eq 0 ]; then
X echo success
X else
X echo failed
X fi
X exit 0
X fi
X continue
X fi
X echo ${op} ${olabel}
Xdone 3<${WRKDIR}/mountable
ecd6f9da579f629514b6b579f55fd3fd
echo x - amount/files/dist/amount_ob.in
sed 's/^X//' >amount/files/dist/amount_ob.in << '199a753f9cd7d462806eaed010bcd508'
X#!/bin/sh
X#
X# OpenBox menu tool for amountd
X
X. %%PREFIX%%/lib/amount/amount.sh
X
Xif [ -r %%PREFIX%%/etc/amount.conf ]; then
X . %%PREFIX%%/etc/amount.conf
Xfi
X
X: ${WRKDIR:=/tmp/amountd}
X: ${MNTPREFIX=/media}
X
XVERSION=0.6
X
Xif [ "${1}" = "doCmd" ]; then
X shift
X doCmd "$@"
X exit $?
Xfi
X
Xif [ -n "${1}" -a -n "${2}" ]; then
X case "${1}" in
X mount|umount) ;;
X *)
X exit 1
X ;;
X esac
X cmd=${1}
X cdev=${2}
X if [ ! -r ${WRKDIR}/mountable ]; then
X exit 1
X fi
Xelse
X echo "<openbox_pipe_menu>"
X if [ ! -r ${WRKDIR}/mountable ]; then
X echo '<item label="Unable to read mountable"/>'
X echo "</openbox_pipe_menu>"
X exit 1
X fi
Xfi
X
XIFS=" "
Xwhile read dev fs mntcmd label <&3; do
X if [ -z "${label}" ]; then
X provider=/dev/${dev}
X mpoint=${MNTPREFIX}/${dev}
X oblabel="${dev} ${fs}"
X else
X provider="/dev/${fs}/${label}"
X mpoint="${MNTPREFIX}/${label}"
X oblabel="${dev} ${fs}/${label}"
X fi
X mstat=$(mount |grep -E "^/dev/(${dev}|${fs}/${label}) on")
X if [ $? -eq 0 ]; then
X op=umount
X eval $(echo ${mstat} |sed -E 's|^(/dev/.*) on (/.*) \(.*$|provider="\1"; mpoint="\2";|')
X else
X op=mount
X fi
X if [ -n "${cdev}" ]; then
X if [ "${cdev}" = "${dev}" -a "${op}" = "${cmd}" ]; then
X sudo ${0} doCmd ${op} ${fs} "${mntcmd}" "${provider}" "${mpoint}" ${USER}
X if [ $? -eq 0 ]; then
X xmessage -nearmouse -timeout 1 success
X else
X xmessage -nearmouse -timeout 5 fail
X fi
X exit 0
X fi
X continue
X fi
X cat <<_EOF
X <item label="${op} ${oblabel}">
X <action name="Execute">
X <command>${0} ${op} ${dev}</command>
X </action>
X </item>
X_EOF
Xdone 3<${WRKDIR}/mountable
X
Xecho "</openbox_pipe_menu>"
199a753f9cd7d462806eaed010bcd508
echo x - amount/files/dist/amountd.in
sed 's/^X//' >amount/files/dist/amountd.in << '64ac788b22d3ab8ffcfae31e35350152'
X#!/bin/sh
X#
X# Auto mount daemon for FreeBSD's devd(8)
X
Xif [ "${1}" != "daemon" ]; then
X daemon -cf -p /var/run/amountd.pid /usr/local/sbin/amountd daemon
X exit $?
Xfi
X
Xif [ -r %%PREFIX%%/etc/amount.conf ]; then
X . %%PREFIX%%/etc/amount.conf
Xfi
X
X: ${WRKDIR:=/tmp/amountd}
X: ${DEVMATCH:="^(da|mmcsd)"}
X: ${LABELMATCH:="^(msdosfs|ntfs|ufs)/"}
X: ${MNTPREFIX=/media}
X
Xcleanup () {
X trap - EXIT
X kill ${DEVDCAT}
X rm -rf ${WRKDIR}
X exit 0
X}
X
Xlog () {
X local level
X level=${1}
X shift
X logger -p user.${level} -t amountd $*
X}
X
XpollDev () {
X local status
X status=0
X while true; do
X log info polling ${1}
X sleep 5
X if camcontrol tur ${1} >/dev/null 2>/dev/null; then
X [ ${status} -eq 0 ] || continue
X status=1
X echo "!system=DEVFS subsystem=CDEV type=CREATE cdev=${1}" >${WRKDIR}/${AMOUNTDFIFO}
X sleep 1
X :>/dev/${1}
X else
X if ! camcontrol devlist |grep -q "[(,]${1}[,)]"; then
X log info lost device ${1}
X echo "!system=DEVFS subsystem=CDEV type=ENDPOLL cdev=${1}" >${WRKDIR}/${AMOUNTDFIFO}
X return 0
X fi
X [ ${status} -eq 1 ] || continue
X status=0
X echo "!system=DEVFS subsystem=CDEV type=DESTROY cdev=${1}" >${WRKDIR}/${AMOUNTDFIFO}
X fi
X done
X}
X
XprobeDev () {
X local dev probe gtype gprov status pollpid mntcmd
X dev=$1
X eval "status=\$STATUS_${dev}"
X eval "pollpid=\$POLLPID_${dev}"
X if [ "${status}" = "probed" ]; then return 0; fi
X if [ -z "${pollpid}" ]; then
X if camcontrol devlist |grep -q "[(,]${dev}[,)]"; then
X if ! camcontrol tur ${dev} >/dev/null; then
X pollDev ${dev} &
X eval "POLLPID_${dev}=$!"
X log info forking poller at PID $!
X return 1
X fi
X fi
X fi
X if [ ${OSREL} -lt 802503 ]; then
X probe=$(gpart show -r ${dev} 2>/dev/null)
X else
X probe=$(gpart show -rp ${dev} 2>/dev/null)
X fi
X if [ $? -ne 0 ]; then
X probe=$(dd if=/dev/${dev} bs=128k count=1 2>/dev/null |file -Ls /dev/stdin)
X case "${probe}" in
X *FAT*)
X mntcmd="mount_msdosfs"
X if [ $(diskinfo ${dev} |cut -f 1 -d " ") -gt 134217728 ]; then
X mntcmd="${mntcmd} -o large"
X fi
X eval "STATUS_${dev}=probed"
X eval "TYPE_${dev}=msdosfs"
X eval "MNTCMD_${dev}=\"${mntcmd}\""
X MOUNTABLE="${MOUNTABLE} ${dev}"
X return 0
X ;;
X *Linux*ext2*)
X eval "STATUS_${dev}=probed"
X eval "TYPE_${dev}=ext2fs"
X eval "MNTCMD_${dev}=\"mount -t ext2fs\""
X MOUNTABLE="${MOUNTABLE} ${dev}"
X return 0
X ;;
X *NTFS*)
X eval "STATUS_${dev}=probed"
X eval "TYPE_${dev}=ntfs"
X eval "MNTCMD_${dev}=\"mount_ntfs -o ro\""
X MOUNTABLE="${MOUNTABLE} ${dev}"
X return 0
X ;;
X esac
X return 1
X fi
X IFS="
X"
X for line in ${probe}; do
X IFS=" "
X set -- ${line}
X [ "${3}" != "-" ] || continue
X if [ "${1}" = "=>" ]; then
X shift
X eval "STATUS_${dev}=probed"
X gtype=${4}
X continue
X fi
X if [ ${OSREL} -lt 802503 ]; then
X gprov=$(gpart modify -i ${3} -f x ${dev} 2>/dev/null |cut -f 1 -d " ")
X gpart undo ${dev} >/dev/null 2>&1
X else
X gprov=${3}
X fi
X case "${gtype}" in
X MBR)
X case "${4}" in
X 1|4|5|6|12|13|15|16)
X mntcmd="mount_msdosfs"
X if [ $(diskinfo ${gprov} |cut -f 1 -d " ") -gt 134217728 ]; then
X mntcmd="${mntcmd} -o large"
X fi
X eval "STATUS_${gprov}=probed"
X eval "TYPE_${gprov}=msdosfs"
X eval "MNTCMD_${gprov}=\"${mntcmd}\""
X MOUNTABLE="${MOUNTABLE} ${gprov}"
X ;;
X 7)
X if dd if=/dev/${gprov} bs=128k count=1 2>/dev/null \
X |file -Ls /dev/stdin |grep -q "NTFS"; then
X eval "STATUS_${gprov}=probed"
X eval "TYPE_${gprov}=ntfs"
X eval "MNTCMD_${gprov}=\"mount_ntfs -o ro\""
X MOUNTABLE="${MOUNTABLE} ${gprov}"
X fi
X ;;
X 83)
X if dd if=/dev/${gprov} bs=128k count=1 2>/dev/null \
X |file -Ls /dev/stdin |grep -q "Linux.*ext2"; then
X eval "STATUS_${gprov}=probed"
X eval "TYPE_${gprov}=ext2fs"
X eval "MNTCMD_${gprov}=\"mount -t ext2fs\""
X MOUNTABLE="${MOUNTABLE} ${gprov}"
X fi
X ;;
X 165)
X probeDev ${gprov}
X if [ $? -eq 1 ]; then
X eval "STATUS_${gprov}=probed"
X eval "TYPE_${gprov}=ufs"
X eval "MNTCMD_${gprov}=\"mount -t ufs\""
X MOUNTABLE="${MOUNTABLE} ${gprov}"
X fi
X ;;
X esac
X ;;
X BSD)
X case "${4}" in
X 7)
X eval "STATUS_${gprov}=probed"
X eval "TYPE_${gprov}=ufs"
X eval "MNTCMD_${gprov}=\"mount -t ufs\""
X MOUNTABLE="${MOUNTABLE} ${gprov}"
X ;;
X esac
X ;;
X esac
X done
X unset IFS
X return 0
X}
X
XprobeLabel () {
X local label curtype glabel
X label=${1}
X glabel=$(glabel status |grep "${label}")
X [ $? -eq 0 ] || return 1
X set -- ${glabel}
X shift $((${#}-1))
X eval "curtype=\$TYPE_${1}"
X if [ "${curtype}" != "${label%/*}" ]; then
X eval "STATUS_${1}=probed"
X eval "TYPE_${1}=${label%/*}"
X MOUNTABLE="${MOUNTABLE} ${1}"
X fi
X eval "LABEL_${1}=\"${label#*/}\""
X return 0
X}
X
XOSREL=$(sysctl -n kern.osreldate)
XAMOUNTDFIFO=amountd.fifo
XMNTFILE=mountable
Xtrap cleanup 1 2 13 14 15 EXIT
X[ -d ${WRKDIR} ] && rm -rf ${WRKDIR}
Xmkdir ${WRKDIR} || ( log err unable to create WRKDIR at ${WRKDIR} && exit 1 )
Xmkfifo ${WRKDIR}/${AMOUNTDFIFO} || ( log err unable to create FIFO at ${WRKDIR}/${AMOUNTDFIFO} && exit 1 )
Xif [ -S /var/run/devd.pipe -a -r /var/run/devd.pipe ]; then
X cat /var/run/devd.pipe >${WRKDIR}/${AMOUNTDFIFO} 2>/dev/null &
X DEVDCAT=$!
Xelse
X log err devd domain socket non-existant or unreadable
X exit 1
Xfi
X
XMOUNTABLE=""
X:>${WRKDIR}/mountable
X
Xwhile read SYSTEM SUBSYS TYPE EXTRA <&3; do
X [ "${SYSTEM#*=}" = "DEVFS" -a "${SUBSYS#*=}" = "CDEV" ] || continue
X CDEV=${EXTRA#cdev=}
X if echo ${CDEV} |grep -qE ${DEVMATCH}; then
X PROBEFUNC=probeDev
X elif echo ${CDEV} |grep -qE ${LABELMATCH}; then
X PROBEFUNC=probeLabel
X else
X continue
X fi
X log notice ${TYPE#*=} ${CDEV}
X if [ "${TYPE#*=}" = "CREATE" ]; then
X ${PROBEFUNC} "${CDEV}"
X elif [ "${TYPE#*=}" = "DESTROY" ]; then
X if [ "${PROBEFUNC}" = "probeDev" ]; then
X eval "TYPE=\$TYPE_${CDEV}"
X if [ -n "${TYPE}" ]; then
X oldmountable=${MOUNTABLE}
X MOUNTABLE=""
X for mountable in ${oldmountable}; do
X [ "${mountable}" != "${CDEV}" ] || continue
X MOUNTABLE="${MOUNTABLE} ${mountable}"
X done
X eval "unset TYPE_${CDEV} LABEL_${CDEV}"
X fi
X eval "unset STATUS_${CDEV}"
X fi
X elif [ "${TYPE#*=}" = "ENDPOLL" ]; then
X eval "unset POLLPID_${CDEV}"
X fi
X :>${WRKDIR}/mountable
X for mountable in ${MOUNTABLE}; do
X eval "TYPE=\$TYPE_${mountable}"
X eval "MNTCMD=\"\$MNTCMD_${mountable}\""
X eval "LABEL=\$LABEL_${mountable}"
X printf '%s\t%s\t%s\t%s\n' ${mountable} ${TYPE} "${MNTCMD}" "${LABEL}" >>${WRKDIR}/mountable
X done
Xdone 3<${WRKDIR}/${AMOUNTDFIFO}
64ac788b22d3ab8ffcfae31e35350152
echo x - amount/files/dist/amount.sh
sed 's/^X//' >amount/files/dist/amount.sh << '291fe3b40195adb987ac7fb8556f1595'
X# Common functions for amount clients
X
XdoCmd () {
X local mcmd
X case "${1}" in
X mount)
X mcmd="${3}"
X case "${2}" in
X msdosfs|ntfs)
X if [ -n "${6}" ]; then
X mcmd="${mcmd} -u ${6}"
X fi
X ;;
X esac
X mkdir -p "${5}" && ${mcmd} "${4}" "${5}"
X ;;
X umount)
X umount "${4}" && rmdir "${5}"
X ;;
X esac
X return $?
X}
291fe3b40195adb987ac7fb8556f1595
echo x - amount/pkg-plist
sed 's/^X//' >amount/pkg-plist << 'f05ad28c58cc5b95db6ad13be4b8bbf3'
Xetc/amount.conf.sample
Xsbin/amountd
Xbin/amount
X%%OPENBOX%%bin/amount_ob
Xlib/amount/amount.sh
X at dirrm lib/amount
f05ad28c58cc5b95db6ad13be4b8bbf3
echo x - amount/pkg-descr
sed 's/^X//' >amount/pkg-descr << '46dcb1af1dfe840b985c260311849973'
Xamount is a FreeBSD specific auto mount framework,
Xprimarily intended for X11 users. It uses FreeBSD-native
Xfacilities to detect device insertion and perform
Xvolume discovery.
X
XWWW: http://forums.freebsd.org/showthread.php?t=23105
46dcb1af1dfe840b985c260311849973
exit
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list