#!/bin/bash export SOURCE_DIR=${SOURCE_DIR:=root} # Fix basename / showing up as "/" -> change to "root" if [ $(basename $SOURCE_DIR) = / ]; then export SNAPSHOT_PREFIX=${SNAPSHOT_PREFIX:=root} else export SNAPSHOT_PREFIX=${SNAPSHOT_PREFIX:=$(basename $SOURCE_DIR)} fi # Set snapshot prefix based on basename export SNAPSHOT_TIME=$(date +"%y_%m_%d-%H.%M") export SNAPSHOT_NAME=$SNAPSHOT_PREFIX-$SNAPSHOT_TIME export SNAPSHOT_DIR=${SNAPSHOT_DIR:=/.snapshots} export LATEST=$SNAPSHOT_PREFIX-latest export BACKUP_DRIVE_MNT=${BACKUP_DRIVE_MNT:=/mnt/backup0} export BACKUP_DIR=${BACKUP_DIR:=/mnt/backup0/DucoBacktop} # Show snapshot settings echo "SOURCE_DIR: $SOURCE_DIR" echo "SNAPSHOT_PREFIX: $SNAPSHOT_PREFIX" echo "SNAPSHOT_TIME: $SNAPSHOT_TIME" echo "SNAPSHOT_NAME: $SNAPSHOT_NAME" echo "SNAPSHOT_DIR: $SNAPSHOT_DIR" echo "LATEST: $LATEST" echo "BACKUP_DRIVE_MNT: $BACKUP_DRIVE_MNT" echo "BACKUP_DIR: $BACKUP_DIR" # Create readonly snapshot btrfs subvolume snapshot -r $SOURCE_DIR $SNAPSHOT_DIR/$SNAPSHOT_NAME # Check if backup disk is mounted mount $BACKUP_DRIVE_MNT mountpoint $BACKUP_DRIVE_MNT if [ $? = 0 ]; then if [ -d $BACKUP_DIR/$LATEST ]; then btrfs send -p $SNAPSHOT_DIR/$LATEST $SNAPSHOT_DIR/$SNAPSHOT_NAME | btrfs receive $BACKUP_DIR else btrfs send $SNAPSHOT_DIR/$SNAPSHOT_NAME | btrfs receive $BACKUP_DIR fi # Update latest in snapshot dir rm -f $SNAPSHOT_DIR/$LATEST ln -s $SNAPSHOT_DIR/$SNAPSHOT_NAME $SNAPSHOT_DIR/$LATEST # Update latest in backup dir rm -f $BACKUP_DIR/$LATEST ln -s $BACKUP_DIR/$SNAPSHOT_NAME $BACKUP_DIR/$LATEST else echo "Backup location $BACKUP_DRIVE_MNT not mounted. Snapshot $SNAPSHOT_NAME not synced" fi