Implement mount/umount options

This commit is contained in:
Slawomir Wojciech Wojtczak (vermaden) 2012-06-24 05:44:08 +02:00
parent fde3b39006
commit f69a28f1f9
1 changed files with 115 additions and 1 deletions

116
beadm
View File

@ -44,6 +44,9 @@ __usage() {
echo " ${NAME} create beName@snapshot"
echo " ${NAME} destroy [-F] beName | beName@snapshot"
echo " ${NAME} list"
echo " ${NAME} mount [-p]"
echo " ${NAME} mount beName [mountpoint]"
echo " ${NAME} umount [-f] beName"
echo " ${NAME} rename origBeName newBeName"
exit 1
}
@ -350,7 +353,7 @@ EOF
;;
(rename) # ------------------------------------------------------------------
if [ ${#} -ne 2 ]
if [ ${#} -ne 3 ]
then
__usage
fi
@ -369,7 +372,118 @@ EOF
echo "Renamed successfully"
;;
(mount) # -------------------------------------------------------------------
COMPLETE=1
if [ ${#} -eq 1 -o ${#} -eq 2 ]
then
if [ ${2} ]
then
if [ "${2}" = "-p" ]
then
OPTS="-p"
else
BE=${2}
fi
fi
if ! [ ${BE} ]
then
mount ${OPTS} | grep -E "^${POOL}/ROOT/"
exit 0
fi
elif [ ${#} -eq 3 ]
then
BE=${2}
TARGET=${3}
else
__usage
fi
__be_exist "${POOL}/ROOT/${BE}"
if mount | grep -E "^${POOL}/ROOT/${BE} " 1> /dev/null 2> /dev/null
then
MNT=$( mount | grep -E "^${POOL}/ROOT/${BE} " | awk '{print $3}' )
echo "The '${BE}' is already mounted at '${MNT}'"
exit 1
fi
if ! [ ${3} ]
then
TARGET="/tmp/tmp.$( tr -cd 'A-Za-z' < /dev/random|head -c 6 )"
mkdir -p ${TARGET}
fi
if ! mount -t zfs ${POOL}/ROOT/${BE} ${TARGET}
then
echo "ERROR: Cannot mount '${POOL}/ROOT/${BE}' at '${TARGET}' mountpoint"
exit 1
fi
zfs list -H -o name,mountpoint -r ${POOL}/ROOT/${BE} \
| grep -v " legacy" \
| sort -n \
| grep -E "^${POOL}/ROOT/${BE}/" \
| while read FS MOUNTPOINT
do
if ! mkdir -p ${TARGET}${MOUNTPOINT} 1> /dev/null 2> /dev/null
then
echo "ERROR: Cannot create '${TARGET}${MOUNTPOINT}' mountpoint"
exit 1
fi
if ! mount -t zfs ${FS} ${TARGET}${MOUNTPOINT} 1> /dev/null 2> /dev/null
then
echo "ERROR: Cannot mount '${FS}' at '${TARGET}${MOUNTPOINT}' mountpoint"
COMPLETE=0
fi
done
if [ ${COMPLETE} -eq 0 ]
then
echo "Partially mounted"
else
echo "Mounted successfully on '${TARGET}'"
fi
;;
(umount) # ------------------------------------------------------------------
COMPLETE=1
if [ ${#} -eq 2 ]
then
BE=${2}
elif [ ${#} -eq 3 ]
then
BE=${3}
if [ "${2}" = "-f" ]
then
OPTS="-f"
else
__usage
fi
else
__usage
fi
__be_exist "$POOL/ROOT/$BE"
if ! mount | grep -E "^${POOL}/ROOT/${BE} " 1> /dev/null 2> /dev/null
then
echo "The '${BE}' is not mounted"
exit 1
fi
mount \
| grep "^${POOL}/ROOT/${BE}" \
| awk '{print $1}' \
| sort -n -r \
| while read FS
do
if ! umount ${OPTS} ${FS} 1> /dev/null 2> /dev/null
then
echo "ERROR: Cannot umount '${FS}' dataset"
COMPLETE=0
fi
done
if [ ${COMPLETE} -eq 0 ]
then
echo "Partially unmounted"
else
echo "Unmounted successfully"
fi
;;
(*) # -----------------------------------------------------------------------
__usage
;;
esac