Date: Mon, 24 Oct 2011 19:09:52 GMT From: Aragon Gouveia <aragon@phat.za.net> To: freebsd-gnats-submit@FreeBSD.org Subject: ports/161977: New port: sysutils/volman FreeBSD specific volume manager Message-ID: <201110241909.p9OJ9quU085152@red.freebsd.org> Resent-Message-ID: <201110241910.p9OJA1u9076813@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 161977 >Category: ports >Synopsis: New port: sysutils/volman FreeBSD specific volume manager >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: Mon Oct 24 19:10:01 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@igor.geek.sh:/usr/obj/usr/src-RELENG_8_2/sys/FUZZ amd64 >Description: volman is a FreeBSD specific volume manager. It acts as a translator of devd(8) events, probing storage devices for their file system information, and serving this over a FIFO based API to which clients can subscribe. In addition to notifying clients of new or lost volumes, it will mount and unmount such volumes at the command of subscribing clients. It runs as root and allows any local clients the ability to mount and unmount volumes which are detected, regardless of any user privileges. This is intended for single user X11 systems needing an easy way of accessing USB flash disks on the fly. WWW: http://forums.freebsd.org/showthread.php?t=27233 Please note! This replaces PR ports/159631 which was never committed. Please could that old PR be closed. >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: # # volman # volman/files # volman/files/dist # volman/files/dist/obvolman.in # volman/files/dist/vmount.in # volman/files/dist/volmand.in # volman/files/dist/volman.conf # volman/files/volmand.in # volman/Makefile # volman/pkg-plist # volman/pkg-descr # echo c - volman mkdir -p volman > /dev/null 2>&1 echo c - volman/files mkdir -p volman/files > /dev/null 2>&1 echo c - volman/files/dist mkdir -p volman/files/dist > /dev/null 2>&1 echo x - volman/files/dist/obvolman.in sed 's/^X//' >volman/files/dist/obvolman.in << 'faf461b0b9b5f3018e6c2d02a1c9f0ac' X#!/bin/sh X# X# Volume manager CLI client X# version 0.7 X Xcleanup () { X trap - EXIT X if [ -z "${OUTPUT}" ]; then X OUTPUT='<item label="Unexpected error"/>' X fi X if [ -z "${DOMOUNT}" ]; then X echo '<openbox_pipe_menu>' X printf "${OUTPUT}\\n" X echo '</openbox_pipe_menu>' X fi X} X Xset -e Xtrap cleanup EXIT X Xif [ -r %%PREFIX%%/etc/volman.conf ]; then X . %%PREFIX%%/etc/volman.conf Xfi X X: ${WRKDIR:=/tmp/volman} X Xi=0 Xwhile [ ! -e ${WRKDIR}/fifo.obvolman -a ${i} -lt 3 ]; do X i=$((${i}+1)) X echo "obvolman SUBSCRIBE" >${WRKDIR}/fifo.volmand X sleep 0.5 Xdone X Xecho "obvolman VOLUMES" >${WRKDIR}/fifo.volmand Xif [ ${#} -eq 1 ]; then X DOMOUNT="${1}" Xfi X Xwhile read RESP DATA <&3; do X case "${RESP}" in X VOLUME) X set -- ${DATA} X if [ "${1}" = "LIST" ]; then X case "${2}" in X m) X out="*" X if [ "${DOMOUNT}" = "${3}" ]; then X echo "obvolman UMOUNT ${3}" >${WRKDIR}/fifo.volmand X fi X ;; X u) X out=" " X if [ "${DOMOUNT}" = "${3}" ]; then X echo "obvolman MOUNT ${3}" >${WRKDIR}/fifo.volmand X fi X ;; X END) X if [ -n "${DOMOUNT}" ]; then X continue X else X if [ -z "${OUTPUT}" ]; then X OUTPUT="<item label=\"No devices\"/>" X fi X break X fi X ;; X esac X if [ -z "${DOMOUNT}" ]; then X size=${5} X unit=B X while [ ${size} -gt 1000 ]; do X size=$((${size} / 1000)) X case "${unit}" in X B) unit=KB ;; X KB) unit=MB ;; X MB) unit=GB ;; X GB) unit=TB ;; X TB) unit=PB ;; X esac X done X out="${out} ${3} ${4} ${size}${unit}" X dev=${3} X if [ ${#} -gt 5 ]; then X shift 5 X out="${out} ${*}" X fi X OUTPUT="${OUTPUT}<item label=\"${out}\"><action name=\"Execute\">" X OUTPUT="${OUTPUT}<command>${0} ${dev}</command></action></item>" X fi X fi X ;; X ERROR) X if [ -z "${DOMOUNT}" ]; then X OUTPUT="<item label\"ERROR: ${DATA}\"/>" X else X xmessage -nearmouse -timeout 5 ERROR: ${DATA} X fi X break X ;; X MOUNT) X set -- ${DATA} X if [ "${1}" = "${DOMOUNT}" ]; then X shift X xmessage -nearmouse -timeout 3 mounted: ${*} X fi X break X ;; X UMOUNT) X set -- ${DATA} X if [ "${1}" = "${DOMOUNT}" ]; then X shift X xmessage -nearmouse -timeout 1 unmounted X fi X break X ;; X PING) X echo "obvolman PONG" >${WRKDIR}/fifo.volmand X ;; X esac Xdone 3<${WRKDIR}/fifo.obvolman faf461b0b9b5f3018e6c2d02a1c9f0ac echo x - volman/files/dist/vmount.in sed 's/^X//' >volman/files/dist/vmount.in << 'e3bac69a3764b727eb76345aad0be18e' X#!/bin/sh X# X# Volume manager CLI client X# version 0.7 X Xset -e X Xif [ -r %%PREFIX%%/etc/volman.conf ]; then X . %%PREFIX%%/etc/volman.conf Xfi X X: ${WRKDIR:=/tmp/volman} X Xi=0 Xwhile [ ! -e ${WRKDIR}/fifo.vmount -a ${i} -lt 3 ]; do X i=$((${i}+1)) X echo "vmount SUBSCRIBE" >${WRKDIR}/fifo.volmand X sleep 0.5 Xdone X Xecho "vmount VOLUMES" >${WRKDIR}/fifo.volmand Xif [ ${#} -eq 1 ]; then X DOMOUNT="${1}" Xfi X Xwhile read RESP DATA <&3; do X case "${RESP}" in X VOLUME) X set -- ${DATA} X if [ "${1}" = "LIST" ]; then X case "${2}" in X m) X out="[m]" X if [ "${DOMOUNT}" = "${3}" ]; then X echo -n "umounting ${3}... " X echo "vmount UMOUNT ${3}" >${WRKDIR}/fifo.volmand X fi X ;; X u) X out="[u]" X if [ "${DOMOUNT}" = "${3}" ]; then X echo -n "mounting ${3}... " X echo "vmount MOUNT ${3}" >${WRKDIR}/fifo.volmand X fi X ;; X END) X if [ -n "${DOMOUNT}" ]; then X continue X else X break X fi X ;; X esac X if [ -z "${DOMOUNT}" ]; then X size=${5} X unit=B X while [ ${size} -gt 1000 ]; do X size=$((${size} / 1000)) X case "${unit}" in X B) unit=KB ;; X KB) unit=MB ;; X MB) unit=GB ;; X GB) unit=TB ;; X TB) unit=PB ;; X esac X done X out="${out} ${3} ${4} ${size}${unit}" X if [ ${#} -gt 5 ]; then X shift 5 X out="${out} ${*}" X fi X echo ${out} X fi X fi X ;; X ERROR) X echo ERROR: ${DATA} X break X ;; X MOUNT) X set -- ${DATA} X if [ "${1}" = "${DOMOUNT}" ]; then X shift X echo success: ${*} X fi X break X ;; X UMOUNT) X set -- ${DATA} X if [ "${1}" = "${DOMOUNT}" ]; then X shift X echo success X fi X break X ;; X PING) X echo "vmount PONG" >${WRKDIR}/fifo.volmand X ;; X esac Xdone 3<${WRKDIR}/fifo.vmount e3bac69a3764b727eb76345aad0be18e echo x - volman/files/dist/volmand.in sed 's/^X//' >volman/files/dist/volmand.in << 'f28555958277b552f6e4c1a317e9ab89' X#!/bin/sh X# X# Volume manager daemon for FreeBSD's devd(8) X# version 0.7 X Xif [ "${1}" != "daemon" ]; then X daemon -cf -p /var/run/volmand.pid %%PREFIX%%/sbin/volmand daemon X exit $? Xfi X Xif [ -r %%PREFIX%%/etc/volman.conf ]; then X . %%PREFIX%%/etc/volman.conf Xfi X X: ${WRKDIR:=/tmp/volman} X: ${DEVMATCH:="^(da|mmcsd)"} X: ${LABELMATCH:="^(msdosfs|ntfs|ufs)/"} X: ${MNTPREFIX=/media} X: ${DEVMPOINT=NO} X Xcleanup () { X trap - 1 15 EXIT X rm -rf ${WRKDIR} X kill -1 -${MASTERPID} X kill -15 -${MASTERPID} X exit 0 X} X Xlog () { X local level X level=${1} X shift X logger -p user.${level} -t volmand $* 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}/internal 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=VOLMAND _poller ENDPOLL ${1}" >${WRKDIR}/internal X return 0 X fi X [ ${status} -eq 1 ] || continue X status=0 X echo "!system=DEVFS subsystem=CDEV type=DESTROY cdev=${1}" >${WRKDIR}/internal X fi X done X} X XprobeMagic () { X local probe size X probe=$(dd if=/dev/${1} bs=128k count=1 2>/dev/null |file -Ls /dev/stdin) X size=$(diskinfo ${1} |cut -f 3 -d " ") X case "${probe}" in X *FAT*) X addDev ${1} ${size} msdosfs X return 0 X ;; X *Linux*ext2*) X addDev ${1} ${size} ext2fs X return 0 X ;; X *NTFS*) X addDev ${1} ${size} ntfs X return 0 X ;; X esac X return 1 X} X XprobeDev () { X local dev gtype gprov gsize status pollpid mntcmd X dev=$1 X eval "status=\$STATUS_${dev}" X eval "pollpid=\$POLLPID_${dev}" X if [ -n "${status}" ]; 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 probeMagic ${dev} X return $? 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 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 gsize=$(diskinfo ${gprov} |cut -f 3 -d " ") X case "${gtype}" in X MBR) X case "${4}" in X 1|4|5|6|12|13|15|16) X addDev ${gprov} ${gsize} msdosfs 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 addDev ${gprov} ${gsize} ntfs 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 addDev ${gprov} ${gsize} ext2fs X fi X ;; X 165) X probeDev ${gprov} X if [ $? -eq 1 ]; then X addDev ${gprov} ${gsize} ufs X fi X ;; X esac X ;; X BSD) X case "${4}" in X 7) X addDev ${gprov} ${gsize} ufs X ;; X esac X ;; X esac X done X # partitionless devices with a boot record (eg. emulated floppy disks) X # look like empty MBR providers to gpart, so must be probed with file(1) X if [ "${gtype}" = "MBR" -a -z "${gprov}" ]; then X if ! probeMagic ${dev}; then X eval "STATUS_${dev}=novolume" X fi X fi X unset IFS X return 0 X} X XprobeLabel () { X local label curlabel curstatus glabel subscriber X label=${1} X glabel=$(glabel status |grep "${label}") X [ $? -eq 0 ] || return 1 X set -- ${glabel} X shift $((${#}-1)) X eval "curlabel=\$LABEL_${1}" X [ -z "${curlabel}" ] || return 0 X eval "curstatus=\$STATUS_${1}" X case "${curstatus}" in X novolume) X return 1 X ;; X umounted|mounted) X ;; X *) X addDev ${1} $(diskinfo ${1} |cut -f 3 -d " ") ${label%/*} X sleep 0.5 X ;; X esac X for subscriber in ${SUBSCRIBERS}; do X echo "VOLUME LABEL ${1} ${label#*/}" >>${WRKDIR}/fifo.${subscriber} & X done X eval "LABEL_${1}=\"${label#*/}\"" X return 0 X} X X# $1 = dev node X# $2 = size in bytes X# $3 = filesystem XaddDev () { X local status subscriber X eval "status=\$STATUS_${1}" X case "${status}" in X umounted|mounted) X ;; X *) X eval "STATUS_${1}=umounted" X eval "SIZE_${1}=${2}" X eval "FS_${1}=${3}" X if [ "${3}" = "msdosfs" -a ${2} -gt 68719476736 ]; then X # MSDOS volumes larger than 64 GiB X eval "MNTCMD_${1}=\"\$MNTCMD_${3} -o large\"" X else X eval "MNTCMD_${1}=\"\$MNTCMD_${3}\"" X fi X MOUNTABLE="${MOUNTABLE} ${1}" X for subscriber in ${SUBSCRIBERS}; do X echo "VOLUME CREATE ${1} ${3} ${2}" >>${WRKDIR}/fifo.${subscriber} & X done X ;; X esac X} X XgetInput () { X local src cmd data X while true; do X while read src cmd data <&3; do X echo "${src}" |grep -Eq "^[a-z][a-z0-9]+" || continue X case "${cmd}" in X SUBSCRIBE) X echo "!system=VOLMAND ${src} SUBSCRIBE" >${WRKDIR}/internal X ;; X VOLUMES) X echo "!system=VOLMAND ${src} VOLUMES" >${WRKDIR}/internal X ;; X MOUNT|UMOUNT) X if echo "${data}" |grep -Eq ${DEVMATCH}; then X echo "!system=VOLMAND ${src} ${cmd} ${data}" >${WRKDIR}/internal X else X if [ -e ${WRKDIR}/fifo.${src} ]; then X echo "ERROR ${data} unmountable" >${WRKDIR}/fifo.${src} X fi X fi X ;; X PONG) X echo "!system=VOLMAND ${src} PONG" >${WRKDIR}/internal X ;; X esac X done 3<${WRKDIR}/fifo.volmand X done X} X Xpinger () { X local subscriber pings subpids keep X for subscriber in ${SUBSCRIBERS}; do X eval "pings=\$PINGS_${subscriber}" X pings=$((${pings}+1)) X if [ ${pings} -le 3 ]; then X keep="${keep} ${subscriber}" X echo "PING" >>${WRKDIR}/fifo.${subscriber} & X eval "PINGS_${subscriber}=${pings}" X else X eval "subpids=\"\$SUBPIDS_${subscriber}\"" X kill ${subpids} X rm -f ${WRKDIR}/fifo.${subscriber} X unset PINGS_${subscriber} SUBPIDS_${subscriber} X fi X done X SUBSCRIBERS="${keep}" X LASTPING=$(date +%s) X} X X# $1 = type paramter X# $2 = cdev paramter XmsgDevfs () { X local probefunc oldmountable mountable fs mntcmd label subscriber X if echo ${2} |grep -qE ${DEVMATCH}; then X probefunc=probeDev X elif echo ${2} |grep -qE ${LABELMATCH}; then X probefunc=probeLabel X else X continue X fi X log notice ${1} ${2} X case "${1}" in X CREATE) X ${probefunc} "${2}" X ;; X DESTROY) X if [ "${probefunc}" = "probeDev" ]; then X eval "fs=\$FS_${2}" X if [ -n "${fs}" ]; then X oldmountable=${MOUNTABLE} X MOUNTABLE="" X for mountable in ${oldmountable}; do X [ "${mountable}" != "${2}" ] || continue X MOUNTABLE="${MOUNTABLE} ${mountable}" X done X for subscriber in ${SUBSCRIBERS}; do X echo "VOLUME REMOVE ${2}" >>${WRKDIR}/fifo.${subscriber} & X done X unset FS_${2} SIZE_${2} MNTCMD_${2} LABEL_${2} X fi X unset STATUS_${2} X fi X ;; X esac X :>${WRKDIR}/mountable X for mountable in ${MOUNTABLE}; do X eval "fs=\$FS_${mountable}" X eval "mntcmd=\"\$MNTCMD_${mountable}\"" X eval "label=\$LABEL_${mountable}" X printf '%s\t%s\t%s\t%s\n' ${mountable} ${fs} "${mntcmd}" "${label}" >>${WRKDIR}/mountable X done X} X X# $1 = subsys X# $2 = cmd X# $3+ = data XmsgVolmand () { X local pings vol status fs size label mntcmd mdev mpoint subscriber X case "${2}" in X SUBSCRIBE) X eval "pings=\$PINGS_${1}" X if [ -z "${pings}" ]; then X if mkfifo -m 644 ${WRKDIR}/fifo.${1}; then X SUBSCRIBERS="${SUBSCRIBERS} ${1}" X cat ${WRKDIR}/block >${WRKDIR}/fifo.${1} & X eval "SUBPIDS_${1}=$!" X eval "PINGS_${1}=0" X fi X fi X ;; X VOLUMES) X if [ -e ${WRKDIR}/fifo.${1} ]; then X ( X for vol in ${MOUNTABLE}; do X eval "status=\$STATUS_${vol}" X eval "fs=\$FS_${vol}" X eval "size=\$SIZE_${vol}" X eval "label=\"\$LABEL_${vol}\"" X case "${status}" in X umounted) X echo "VOLUME LIST u ${vol} ${fs} ${size} ${label}" >${WRKDIR}/fifo.${1} X ;; X mounted) X echo "VOLUME LIST m ${vol} ${fs} ${size} ${label}" >${WRKDIR}/fifo.${1} X ;; X esac X done X echo "VOLUME LIST END" >${WRKDIR}/fifo.${1} X ) & X fi X ;; X MOUNT) X if [ -e ${WRKDIR}/fifo.${1} ]; then X ( X eval "status=\$STATUS_${3}" X case "${status}" in X umounted) X eval "fs=\$FS_${3}" X eval "label=\"\$LABEL_${3}\"" X eval "mntcmd=\"\$MNTCMD_${3}\"" X if [ -n "${label}" -a "${DEVMPOINT}" = "NO" ]; then X mdev="/dev/${fs}/${label}" X mpoint="/media/${label}" X else X mdev="/dev/${3}" X mpoint="/media/${3}" X fi X if [ -n "${mdev}" -a -n "${mpoint}" ]; then X log notice mounting ${mdev} to ${mpoint} X if mkdir -p "${mpoint}" && ${mntcmd} "${mdev}" "${mpoint}"; then X echo "!system=VOLMAND _mounter STATUS ${3} mounted ${mpoint}" >${WRKDIR}/internal X else X echo "ERROR ${3} mount error occured" >${WRKDIR}/fifo.${1} X fi X fi X ;; X mounted) X echo "ERROR ${3} volume already mounted" >${WRKDIR}/fifo.${1} X ;; X *) X echo "ERROR ${3} volume unmountable" >${WRKDIR}/fifo.${1} X ;; X esac X ) & X fi X ;; X UMOUNT) X if [ -e ${WRKDIR}/fifo.${1} ]; then X ( X eval "status=\$STATUS_${3}" X case "${status}" in X mounted) X eval "fs=\$FS_${3}" X eval "label=\"\$LABEL_${3}\"" X if [ -n "${label}" -a "${DEVMPOINT}" = "NO" ]; then X mdev="/dev/${fs}/${label}" X mpoint="/media/${label}" X else X mdev="/dev/${3}" X mpoint="/media/${3}" X fi X if [ -n "${mdev}" ]; then X log notice umounting ${mdev} from ${mpoint} X if umount "${mpoint}"; then X rmdir "${mpoint}" X echo "!system=VOLMAND _mounter STATUS ${3} umounted ${mpoint}" >${WRKDIR}/internal X else X echo "ERROR ${3} umount error occured" >${WRKDIR}/fifo.${1} X fi X fi X ;; X *) X echo "ERROR ${3} volume not mounted" >${WRKDIR}/fifo.${1} X ;; X esac X ) & X fi X ;; X PONG) X eval "pings=\$PINGS_${1}" X if [ -n "${pings}" ]; then X eval "PINGS_${1}=0" X fi X ;; X ENDPOLL) X if [ "${1}" = "_poller" ]; then X eval "unset POLLPID_${3}" X fi X ;; X STATUS) X if [ "${1}" = "_mounter" ]; then X vol=${3} X status=${4} X case "${4}" in X mounted) X shift 4 X mntcmd="MOUNT ${vol} ${*}" X ;; X umounted) X shift 4 X mntcmd="UMOUNT ${vol} ${*}" X ;; X esac X eval "STATUS_${vol}=${status}" X for subscriber in ${SUBSCRIBERS}; do X if [ -e ${WRKDIR}/fifo.${subscriber} ]; then X echo ${mntcmd} >${WRKDIR}/fifo.${subscriber} & X fi X done X fi X ;; X esac X} X XMASTERPID=$$ XMNTCMD_msdosfs="mount_msdosfs -m 666 -M 777" XMNTCMD_ext2fs="mount -t ext2fs" XMNTCMD_ufs="mount -t ufs" Xif kldstat -q -m fuse && test -x /usr/local/bin/ntfs-3g; then X MNTCMD_ntfs="/usr/local/bin/ntfs-3g" Xelse X MNTCMD_ntfs="mount_ntfs -o ro -m 555" Xfi XOSREL=$(sysctl -n kern.osreldate) XMNTFILE=mountable Xtrap cleanup 1 2 13 14 15 EXIT Xtest -d ${WRKDIR} && rm -rf ${WRKDIR} Xmkdir ${WRKDIR} || ( log err unable to create WRKDIR at ${WRKDIR} && exit 1 ) Xmkfifo -m 666 ${WRKDIR}/fifo.volmand || ( log err unable to create FIFO at ${WRKDIR}/fifo.volmand && exit 1 ) Xmkfifo -m 600 ${WRKDIR}/internal || ( log err unable to create FIFO at ${WRKDIR}/internal && exit 1 ) Xmkfifo -m 600 ${WRKDIR}/block || ( log err unable to create FIFO at ${WRKDIR}/block && exit 1 ) Xif [ -S /var/run/devd.pipe -a -r /var/run/devd.pipe ]; then X cat /var/run/devd.pipe >${WRKDIR}/internal 2>/dev/null & X DEVDCATPID=$! Xelse X log err devd domain socket non-existant or unreadable X exit 1 Xfi X XgetInput & XGETINPUTPID=$! X XMOUNTABLE="" XSUBSCRIBERS="" XLASTPING=$(date +%s) X:>${WRKDIR}/mountable X Xwhile read SYSTEM SUBSYS TYPE EXTRA <&3; do X case "${SYSTEM#*=}" in X DEVFS) X if [ "${SUBSYS#*=}" = "CDEV" ]; then X msgDevfs "${TYPE#*=}" "${EXTRA#cdev=}" X fi X ;; X VOLMAND) X msgVolmand "${SUBSYS}" "${TYPE}" ${EXTRA} X ;; X esac X if [ $(date +%s) -gt $((${LASTPING}+10)) ]; then X pinger X fi Xdone 3<${WRKDIR}/internal f28555958277b552f6e4c1a317e9ab89 echo x - volman/files/dist/volman.conf sed 's/^X//' >volman/files/dist/volman.conf << 'f2f1858a3eb3e87f1977b3302f8dea48' X# What device names amountd must look for. X#DEVMATCH="^(da|mmcsd)" X X# What label names amountd must look for. X#LABELMATCH="^(msdosfs|ntfs|ufs)/" X X# Base directory into which volumes will be mounted. X#MNTPREFIX=/media X X# If YES, subdirectories below MNTPREFIX will always match the device name. X# Otherwise the volume's label will be used if it exists. X#DEVMPOINT=NO X X# Where amount keeps all its working data and FIFOs. X#WRKDIR=/tmp/volman f2f1858a3eb3e87f1977b3302f8dea48 echo x - volman/files/volmand.in sed 's/^X//' >volman/files/volmand.in << '176101677fb39c3f3d2fb42c2c7fec49' X#!/bin/sh X X# PROVIDE: volmand X# REQUIRE: DAEMON%%RCFUSEFS%% X# KEYWORD: shutdown nojail X X. /etc/rc.subr X Xname="volmand" Xrcvar=`set_rcvar` Xcommand="%%PREFIX%%/sbin/volmand" Xload_rc_config $name Xpidfile="/var/run/volmand.pid" Xcommand_interpreter=/bin/sh X Xrun_rc_command "$1" 176101677fb39c3f3d2fb42c2c7fec49 echo x - volman/Makefile sed 's/^X//' >volman/Makefile << 'abfc7d8c56087f9b9852f092b0260e77' X# New ports collection makefile for: volman X# Date created: 24 October 2011 X# Whom: Aragon Gouveia <aragon@phat.za.net> X# X# $FreeBSD$ X# X XPORTNAME= volman XPORTVERSION= 0.7 XCATEGORIES= sysutils XMASTER_SITES= # empty XDISTFILES= # none XEXTRACT_ONLY= # empty X XMAINTAINER= aragon@phat.za.net XCOMMENT= FreeBSD specific volume manager X XSUB_FILES= dist/vmount dist/volmand XUSE_RC_SUBR= volmand XNO_BUILD= yes X XOPTIONS= OPENBOX "Install Openbox pipemenu script" off \ X NTFS3G "Use fusefs-ntfs extensions" off X X.include <bsd.port.options.mk> X X.if defined(WITH_OPENBOX) XSUB_FILES+= dist/obvolman XRUN_DEPENDS+= ${LOCALBASE}/bin/xmessage:${PORTSDIR}/x11/xmessage XPLIST_SUB+= OPENBOX="" X.else XPLIST_SUB+= OPENBOX="@comment " X.endif X X.if defined(WITH_NTFS3G) XRUN_DEPENDS+= ${LOCALBASE}/bin/ntfs-3g:${PORTSDIR}/sysutils/fusefs-ntfs XSUB_LIST+= RCFUSEFS=" fusefs" X.else XSUB_LIST+= RCFUSEFS="" X.endif X Xdo-extract: X @${MKDIR} ${WRKDIR}/dist X Xdo-install: X ${INSTALL_SCRIPT} ${WRKDIR}/dist/volmand ${PREFIX}/sbin X ${INSTALL_SCRIPT} ${WRKDIR}/dist/vmount ${PREFIX}/bin X.if defined(WITH_OPENBOX) X ${INSTALL_SCRIPT} ${WRKDIR}/dist/obvolman ${PREFIX}/bin X.endif X ${INSTALL_DATA} ${FILESDIR}/dist/volman.conf ${PREFIX}/etc/volman.conf.sample X X.include <bsd.port.mk> abfc7d8c56087f9b9852f092b0260e77 echo x - volman/pkg-plist sed 's/^X//' >volman/pkg-plist << '0e14d6a002ec56ebcdd9da429ce217f5' Xetc/volman.conf.sample Xsbin/volmand Xbin/vmount X%%OPENBOX%%bin/obvolman 0e14d6a002ec56ebcdd9da429ce217f5 echo x - volman/pkg-descr sed 's/^X//' >volman/pkg-descr << 'dcfffd20bc23fe8b4ec7bf65c3b123e3' Xvolman is a FreeBSD specific volume manager. It acts Xas a translator of devd(8) events, probing storage Xdevices for their file system information, and serving Xthis over a FIFO based API to which clients can Xsubscribe. In addition to notifying clients of new Xor lost volumes, it will mount and unmount such Xvolumes at the command of subscribing clients. X XIt runs as root and allows any local clients the Xability to mount and unmount volumes which are Xdetected, regardless of any user privileges. This Xis intended for single user X11 systems needing Xan easy way of accessing USB flash disks on the fly. X XWWW: http://forums.freebsd.org/showthread.php?t=27233 dcfffd20bc23fe8b4ec7bf65c3b123e3 exit >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201110241909.p9OJ9quU085152>