diff --git a/btrfs-snapshots.sh b/btrfs-snapshots.sh index d54f601..008dfaf 100755 --- a/btrfs-snapshots.sh +++ b/btrfs-snapshots.sh @@ -49,34 +49,46 @@ EOF fi shift done - -BTRFS_VOLUMES=${BTRFS_VOLUMES:-$(awk '!/^#/ && $3=="btrfs" {print $2}' /etc/fstab)} -TMP_MNT=${TMP_MNT:-/var/tmp/btrfs-backup} +if test -n "${vols[*]}"; then + BTRFS_VOLUMES="${vols[*]}" +fi test -d "${TMP_MNT}" || mkdir -p "${TMP_MNT}" for fs in ${BTRFS_VOLUMES}; do device=$(mount | awk '$3=="'$fs'" && $5=="btrfs" {print $1}') subvol=$(mount | awk '$3=="'$fs'" && $5=="btrfs" {split(substr($6, 2, length($6)-2), res, ","); for (r in res) {if (res[r]~/^subvol=/) {sub(/^subvol=/,"" , res[r]); print res[r]}}}') if test -n "$subvol"; then - name=${subvol} + if test "$subvol" = "/@"; then + name=${subvol} + else + name=${subvol}- + fi else if test "$fs" = "/"; then - name="@root" + name="/" else name=${fs#/} name=${name%/} - name=${name//\//-} + name=/${name//\//-}- fi fi - target="${name}-snapshot-$(date +%Y-%m-%d-%H-%M)" - if test $dryrun -eq 1; then - echo btrfs subvolume snapshot "${TMP_MNT}${subvol}" "${TMP_MNT}/${target}" - else - if mount | grep -q " on $TMP_MNT type "; then + target="${name}snapshot-$(date +%Y-%m-%d-%H-%M)" + if test -n "$device"; then + if test $dryrun -eq 1; then + echo -e "→ \e[1mbackup ${subvol:+subvol $subvol of }$fs on $device\e[0m" + echo " " mount "$device" "$TMP_MNT" + echo " " btrfs subvolume snapshot "${TMP_MNT}${subvol}" "${TMP_MNT}${target}" + echo " " umount "$TMP_MNT" + else + if mount | grep -q " on $TMP_MNT type "; then + sudo umount "$TMP_MNT" + fi + sudo mount "$device" "$TMP_MNT" + sudo btrfs subvolume snapshot "${TMP_MNT}${subvol}" "${TMP_MNT}${target}" sudo umount "$TMP_MNT" fi - sudo mount "$device" "$TMP_MNT" - sudo btrfs subvolume snapshot "${TMP_MNT}${subvol}" "${TMP_MNT}/${target}" - sudo umount "$TMP_MNT" + else + echo "ERROR: no device found for $fs" 1>&2 + exit 2 fi done