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