mirror of
https://github.com/m8tin/cis.git
synced 2025-12-06 15:58:26 +01:00
65 lines
2.2 KiB
Bash
65 lines
2.2 KiB
Bash
#!/bin/bash
|
|
CONTAINER=${1:?"CONTAINER missing"}
|
|
CONTAINER=$(echo $1 | sed -E 's|[^a-zA-Z0-9_-]*||g')
|
|
(
|
|
flock -n 9 || exit 1
|
|
|
|
BACKUPHOST=$(hostname)
|
|
HOSTOWNER=$(cat /invra/hostowner)
|
|
SOURCEHOST=$(cat /invra/state/${HOSTOWNER}/containers/${CONTAINER}/current-host)
|
|
|
|
MOUNTPOINT="none"
|
|
DATASET="zpool1/persistent/${CONTAINER}-BACKUP"
|
|
SNAPSHOT_PREFIX="${DATASET}@SYNC_${BACKUPHOST}_"
|
|
|
|
LAST_SNAPSHOT_NAME=""
|
|
RESUME_TOKEN=""
|
|
zfs list -Hr -o name -s name "${DATASET}" | grep -E "^${DATASET}$" > /dev/null
|
|
if [ $? -eq 0 ]; then
|
|
LAST_SNAPSHOT_NAME=$(zfs list -H -o name -S name -t snapshot -r "${DATASET}" | grep -E "^${SNAPSHOT_PREFIX}" | head -n 1)
|
|
RESUME_TOKEN="$(zfs get -o value -H receive_resume_token "${DATASET}")"
|
|
fi
|
|
|
|
if [[ "x$RESUME_TOKEN" != "x" && "x$RESUME_TOKEN" != "x-" ]]; then
|
|
echo "Resume token present trying to resume at $RESUME_TOKEN"
|
|
LAST_SNAPSHOT_NAME="RESUME"
|
|
fi
|
|
|
|
if [[ "x${LAST_SNAPSHOT_NAME}" != "x" && "${LAST_SNAPSHOT_NAME}" != "RESUME" ]]; then
|
|
zfs rollback -r "${LAST_SNAPSHOT_NAME}"
|
|
fi
|
|
|
|
# Beiim zfs receive in der nächsten Zeile fehlt noch das "-s" für resumable streams. Der tzrlxsrv kann das aber momentan nicht. Fehlermeldung: cannot receive resume stream: kernel modules must be upgraded to receive this stream.
|
|
(while sleep 1; do echo; done) | ssh -o ConnectTimeout=20 -C invencom@${SOURCEHOST} "sudo /invra/scripts/hosts/zfs/synccontainer-sender.sh \"${BACKUPHOST}\" \"${CONTAINER}\" \"${LAST_SNAPSHOT_NAME#$SNAPSHOT_PREFIX}\"" \"${RESUME_TOKEN}\" | zfs receive -v "${DATASET}"
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
|
|
# Dataset gegen Veränderungen sichern
|
|
zfs set readonly=on "${DATASET}"
|
|
zfs set "mountpoint=${MOUNTPOINT}" "${DATASET}"
|
|
|
|
# Aufsetzpunkte fremder Synchronisierer wegräumen
|
|
zfs list -t snapshot -o name -r "${DATASET}" | grep -- "${DATASET}@SYNC" | grep -v -i "_${BACKUPHOST}_" | while read SNAP; do
|
|
echo "Destroying $SNAP"
|
|
zfs destroy $SNAP
|
|
done
|
|
|
|
# Alte Snapshots wegräumen
|
|
while read -r ZEILE
|
|
do
|
|
if [ "$ZEILE" = "" ]; then
|
|
break
|
|
fi
|
|
if [[ "$ZEILE" > "$LAST_SNAPSHOT_NAME" ]]; then
|
|
break
|
|
fi
|
|
zfs destroy "$ZEILE"
|
|
done < <(zfs list -Hr -o name -s name -t snapshot "${DATASET}" | grep -E "^${SNAPSHOT_PREFIX}")
|
|
) 9>>/tmp/synccontainer.${CONTAINER}.lock
|
|
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
exit 0
|