Update backup script

This commit is contained in:
albert 2024-12-16 01:41:22 +01:00
parent 5beb3fb9e2
commit a447a20b8c
Signed by: albert
GPG key ID: 3895DD267CA11BA9

View file

@ -1,4 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
#!/bin/bash
# Check for required argument # Check for required argument
if [ $# -ne 1 ]; then if [ $# -ne 1 ]; then
@ -9,11 +10,25 @@ fi
# Configuration # Configuration
SNAPPER_CONFIG="$1" SNAPPER_CONFIG="$1"
SOURCE_PATH="/.snapshots"
# Get the actual snapshot location from snapper config
SOURCE_PATH=$(snapper -c "$SNAPPER_CONFIG" get-config | grep '^SUBVOLUME' | cut -d'=' -f2 | tr -d '"'| awk {'print $3'})
if [ -z "$SOURCE_PATH" ]; then
echo "ERROR: Could not determine snapshot path for config '$SNAPPER_CONFIG'"
exit 1
fi
# Convert subvolume path to snapshot path
SNAPSHOT_PATH="$SOURCE_PATH/.snapshots"
if [ ! -d "$SNAPSHOT_PATH" ]; then
echo "ERROR: Snapshot directory '$SNAPSHOT_PATH' does not exist"
exit 1
fi
REMOTE_HOST="root@synology" REMOTE_HOST="root@synology"
DEST_PATH="/volume1/backups/${SNAPPER_CONFIG}" # Added config name to path DEST_PATH="/volume1/backups/btrfs_`hostname`_${SNAPPER_CONFIG}"
STATE_FILE="/var/lib/snapper-backup-${SNAPPER_CONFIG}.state" # Made state file unique per config STATE_FILE="/var/lib/snapper-backup-${SNAPPER_CONFIG}.state"
LOG_FILE="/var/log/snapper-backup-${SNAPPER_CONFIG}.log" # Made log file unique per config LOG_FILE="/var/log/snapper-backup-${SNAPPER_CONFIG}.log"
KEEP_SNAPSHOTS=5 KEEP_SNAPSHOTS=5
# Ensure we exit on any error # Ensure we exit on any error
@ -33,7 +48,7 @@ log() {
# Function to verify snapshot exists # Function to verify snapshot exists
verify_snapshot() { verify_snapshot() {
local snapshot_num="$1" local snapshot_num="$1"
if [ ! -d "$SOURCE_PATH/$snapshot_num/snapshot" ]; then if [ ! -d "$SNAPSHOT_PATH/$snapshot_num/snapshot" ]; then
log "ERROR: Snapshot $snapshot_num does not exist" log "ERROR: Snapshot $snapshot_num does not exist"
return 1 return 1
fi fi
@ -73,6 +88,7 @@ cleanup_remote_snapshots() {
# Start backup process # Start backup process
log "Starting backup for snapper config: $SNAPPER_CONFIG" log "Starting backup for snapper config: $SNAPPER_CONFIG"
log "Using snapshot path: $SNAPSHOT_PATH"
# Verify remote connectivity first # Verify remote connectivity first
verify_remote verify_remote
@ -102,7 +118,7 @@ ssh "$REMOTE_HOST" "mkdir -p '$DEST_PATH'"
if [ -z "$LAST_TRANSFERRED" ]; then if [ -z "$LAST_TRANSFERRED" ]; then
# First time backup - full send # First time backup - full send
log "Performing full send of snapshot $LATEST_SNAPSHOT" log "Performing full send of snapshot $LATEST_SNAPSHOT"
sudo btrfs send "$SOURCE_PATH/$LATEST_SNAPSHOT/snapshot" | \ sudo btrfs send "$SNAPSHOT_PATH/$LATEST_SNAPSHOT/snapshot" | \
pv -bytes | \ pv -bytes | \
ssh "$REMOTE_HOST" "btrfs receive '$DEST_PATH'" && { ssh "$REMOTE_HOST" "btrfs receive '$DEST_PATH'" && {
echo "$LATEST_SNAPSHOT" > "$STATE_FILE" echo "$LATEST_SNAPSHOT" > "$STATE_FILE"
@ -114,8 +130,8 @@ if [ -z "$LAST_TRANSFERRED" ]; then
else else
# Incremental send # Incremental send
log "Performing incremental send from $LAST_TRANSFERRED to $LATEST_SNAPSHOT" log "Performing incremental send from $LAST_TRANSFERRED to $LATEST_SNAPSHOT"
sudo btrfs send -p "$SOURCE_PATH/$LAST_TRANSFERRED/snapshot" \ sudo btrfs send -p "$SNAPSHOT_PATH/$LAST_TRANSFERRED/snapshot" \
"$SOURCE_PATH/$LATEST_SNAPSHOT/snapshot" | \ "$SNAPSHOT_PATH/$LATEST_SNAPSHOT/snapshot" | \
pv -bytes | \ pv -bytes | \
ssh "$REMOTE_HOST" "btrfs receive '$DEST_PATH'" && { ssh "$REMOTE_HOST" "btrfs receive '$DEST_PATH'" && {
echo "$LATEST_SNAPSHOT" > "$STATE_FILE" echo "$LATEST_SNAPSHOT" > "$STATE_FILE"