From e4513d149ec851bfc4abeee5907abbb472e2873e Mon Sep 17 00:00:00 2001 From: "Slawomir Wojciech Wojtczak (vermaden)" Date: Wed, 9 May 2012 22:40:59 +0200 Subject: [PATCH] fix remove beName@snapshot, fix create beName@snapshot, fix create -e beName@snapshot beName, implement rename origBeName newBeName --- beadm | 52 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/beadm b/beadm index 7bedd88..9f15c9b 100755 --- a/beadm +++ b/beadm @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/sh -e # Copyright 2012 Slawomir Wojciech Wojtczak (vermaden). All rights reserved. # Copyright 2012 Bryan Drewery (bdrewery). All rights reserved. @@ -32,7 +32,7 @@ then fi __usage() { - NAME=${0##*/} + local NAME=${0##*/} echo "usage:" echo " ${NAME} subcommand cmd_options" echo @@ -44,6 +44,7 @@ __usage() { echo " ${NAME} destroy beName" echo " ${NAME} destroy beName@snapshot" echo " ${NAME} list" + echo " ${NAME} rename origBeName newBeName" exit 1 } @@ -60,13 +61,23 @@ __be_snapshot() { # 1=DATASET/SNAPSHOT } __be_new() { # 1=SOURCE 2=TARGET + local SOURCE=$( echo ${1} | cut -d '@' -f 1 ) if __be_snapshot ${1} then - zfs clone ${1} ${2} + local SNAPSHOT=$( echo ${1} | cut -d '@' -f 2 ) + zfs list -r -H -t filesystem -o name ${SOURCE} \ + | while read FS + do + if ! zfs list -H -o name ${FS}@${SNAPSHOT} 1> /dev/null 2> /dev/null + then + echo "ERROR: Child snapshot '${FS}@${SNAPSHOT}' does not exists" + exit 1 + fi + done else if zfs list -H -o name ${1}@${2##*/} 1> /dev/null 2> /dev/null then - echo "ERROR: Snapshot '${1}@${2##*/}' exists" + echo "ERROR: Snapshot '${1}@${2##*/}' already exists" exit 1 fi if ! zfs snapshot -r ${1}@${2##*/} 1> /dev/null 2> /dev/null @@ -75,24 +86,22 @@ __be_new() { # 1=SOURCE 2=TARGET exit 1 fi fi - zfs list -H -o name -t filesystem -r ${1} \ + zfs list -H -o name -r ${SOURCE} \ | while read FS do - OPTS="" - while read NAME PROPERTY VALUE SOURCE + local OPTS="" + while read NAME PROPERTY VALUE do - OPTS="-o ${PROPERTY}=${VALUE} ${OPTS}" + local OPTS="-o ${PROPERTY}=${VALUE} ${OPTS}" done << EOF -$( zfs get -s local -H all ${FS} | grep -v -E "(canmount)" ) +$( zfs get -o name,property,value -s local -H all ${FS} | grep -v -E "(canmount)" ) EOF - SOURCE=${1##*/} - TARGET=${2##*/} - DATASET=$( echo ${FS} | awk '{print $1}' | sed -E s/"^${POOL}\/ROOT\/${SOURCE}"/"${POOL}\/ROOT\/${TARGET}"/g ) + DATASET=$( echo ${FS} | awk '{print $1}' | sed -E s/"^${POOL}\/ROOT\/${SOURCE##*/}"/"${POOL}\/ROOT\/${2##*/}"/g ) if [ "${OPTS}" = "-o = " ] then - OPTS="" + local OPTS="" fi - zfs clone -o canmount=off ${OPTS} ${FS}@${2##*/} ${DATASET} + zfs clone -o canmount=off ${OPTS} ${FS}@${SNAPSHOT} ${DATASET} done echo "Created successfully" } @@ -170,7 +179,7 @@ case ${1} in (2) if __be_snapshot ${2} then - if zfs snapshot ${POOL}/ROOT/${2} 2> /dev/null + if ! zfs snapshot -r ${POOL}/ROOT/${2} 2> /dev/null then echo "ERROR: Cannot create '${2}' snapshot" exit 1 @@ -269,7 +278,7 @@ EOF (Y|y|[Yy][Ee][Ss]) if __be_snapshot ${POOL}/ROOT/${2} then - if ! zfs destroy ${POOL}/ROOT/${2} 1> /dev/null 2> /dev/null + if ! zfs destroy -r ${POOL}/ROOT/${2} 1> /dev/null 2> /dev/null then echo "ERROR: Snapshot '${2}' is origin for other boot environment(s)" exit 1 @@ -303,6 +312,17 @@ EOF esac ;; + (rename) # ------------------------------------------------------------------ + __be_exist ${POOL}/ROOT/${2} + if zfs list -H -o name ${POOL}/ROOT/${3} 2> /dev/null + then + echo "ERROR: Boot environment '${3}' already exists" + exit 1 + fi + zfs rename ${POOL}/ROOT/${2} ${POOL}/ROOT/${3} + echo "Renamed successfully" + ;; + (*) # ----------------------------------------------------------------------- __usage ;;