Files
cis/script/host/zfs/sync/synccontainer-sender.sh
2025-06-21 01:04:31 +02:00

54 lines
1.7 KiB
Bash

#!/bin/bash
BACKUPHOST=${1:?"BACKUPHOST missing"}
CONTAINER=${2:?"CONTAINER missing"}
BACKUPHOST=$(echo $1 | sed -E 's|[^a-zA-Z0-9._-]*||g')
CONTAINER=$(echo $2 | sed -E 's|[^a-zA-Z0-9_-]*||g')
LAST_SNAPSHOT=$(echo $3 | sed -E 's|[^a-zA-Z0-9._:-]*||g')
NEW_SNAPSHOT=$(date -u "+%Y-%m-%d_%H:%M:%S")
if [[ "${LAST_SNAPSHOT}" == "RESUME" ]]; then
RESUME_TOKEN=$(echo $4 | sed -E 's|[^a-zA-Z0-9._:-]*||g')
zfs send -t "${RESUME_TOKEN}"
exit
fi
DATASET="zpool1/persistent/$CONTAINER"
SNAPSHOT_PREFIX="${DATASET}@SYNC_${BACKUPHOST}_"
LAST_SNAPSHOT_NAME="${SNAPSHOT_PREFIX}${LAST_SNAPSHOT}"
NEW_SNAPSHOT_NAME="${SNAPSHOT_PREFIX}${NEW_SNAPSHOT}"
SNAPSHOT_FOUND=""
# Existiert der Snapshot?
while read -r ZEILE
do
if [[ "$ZEILE" == "$LAST_SNAPSHOT_NAME" ]]; then
SNAPSHOT_FOUND="1"
continue
fi
done < <(zfs list -H -o name -s name -t snapshot "${DATASET}" | grep -E "^${SNAPSHOT_PREFIX}")
# Falls ja, alle anderen Snapshots wegräumen - eine frühere Version des Skripts hat hier nur die Älteren weggeräumt. Das führt allerdings zum Vollmüllen
# mit neueren Snapshots, wenn der Sync immer wieder fehlschlägt - im Einzelfall bis zur Unbenutzbarkeit des Senders
if [[ "${SNAPSHOT_FOUND}x" == "1x" ]]; then
while read -r ZEILE
do
if [[ "$ZEILE" == "$LAST_SNAPSHOT_NAME" ]]; then
continue
fi
zfs destroy "$ZEILE"
done < <(zfs list -H -o name -s name -t snapshot "${DATASET}" | grep -E "^${SNAPSHOT_PREFIX}")
fi
zfs snapshot "$NEW_SNAPSHOT_NAME"
if [[ "$LAST_SNAPSHOT" != "" ]]; then
if [[ "$SNAPSHOT_FOUND" == "" ]]; then
echo "Angeforderter Snapshot '${LAST_SNAPSHOT}' nicht vorhanden"
exit 1;
fi
zfs send -I "${LAST_SNAPSHOT_NAME}" "${NEW_SNAPSHOT_NAME}"
else
zfs send "${NEW_SNAPSHOT_NAME}"
fi