#! /bin/zsh setopt extendedglob function die() { echo "!!! $1" exit 1 } ### read the config file source /etc/btv/config ### verify keyfile sanity if [[ ! -a "${KEYFILE}" ]]; then echo "The keyfile (${KEYFILE}) does not exist." exit 2 fi KEYFILE_OWNER=$(stat -c "%u" $KEYFILE) KEYFILE_ACCESS=$(stat -c "%a" $KEYFILE) if [[ ${KEYFILE_OWNER} -ne 0 ]]; then echo "The keyfile (${KEYFILE}) is owned by UID ${KEYFILE_OWNER}, it should be 0 (root)." exit 2 fi if [[ ${KEYFILE_ACCESS} -ne 600 ]]; then echo "The keyfile (${KEYFILE}) has permissions ${KEYFILE_ACCESS}, it should be 600 (rw-------)." exit 2 fi VERB="$1" shift function drop_snap { SNAP="${1}" for S in "${SNAP}/"* do btrfs subvolume delete "$S" done rmdir "${SNAP}" } case "$VERB" in (snap*) T="$(date +%Y-%m-%d.%H%M%S)" SNAP="${SNAP_DIR}/${T}" echo "Creating snapshot ${SNAP}" mkdir "${SNAP}" || die "failed to mkdir ${SNAP}" cd "${SUBVOL_DIR}" || die "failed to cd ${SUBVOL_DIR}" for SUB in ^${SUBVOL_IGNORE_PREFIX}* do btrfs subvolume snapshot -r "${SUB}" "${SNAP}/${SUB}" || die "failed to btrfs snap ${SUB}" done ;; (list) cd "${SNAP_DIR}" for SNAP in * do if [[ -f "${SNAP}/streamed" ]]; then printf "S" else printf " " fi done echo echo "S = streamed to storage" echo "R = scheduled for removal" ;; (drop) SNAP="${SNAP_DIR}/${1}" if [[ ! -d ${SNAP} ]]; then echo "Snapshot ${1} does not exist" exit 3 fi echo "Dropping $SNAP" drop_snap "$SNAP" ;; (clean*) echo ">>> gc" ;; (stream) echo ">>> stream $1" ;; (*) echo "Unknown verb: ${VERB}" exit 3 ;; esac