blob: 1286b93c20e2fff9c5b3aa4ef97516814c3ea377 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
#!/usr/bin/env bash
set -euo pipefail
KEYFILE="/root/.ssh/backup"
DATASET="{{ backup_zfs_dataset }}"
USER="{{ backup_ssh_user }}"
HOST="{{ backup_ssh_host }}"
KEEP=10
# END OF CONFIG
HOST_DIR=backup
DATE="$(date +%Y-%m-%d-%H-%M-%S%z | tr '+' '-')"
SNAPSHOT="${DATASET}@${DATE}"
TARGET="${HOST}/${HOST_DIR}/${SNAPSHOT}.enc"
echo "Taking snapshot \"$SNAPSHOT\""
(set -x; zfs snapshot "$SNAPSHOT")
echo "Snapshot created"
echo "Encrypting snapshot and backing up to target \"${TARGET}\""
(set -x; zfs send "$SNAPSHOT" | age -e -i "$KEYFILE" | curl --key "$KEYFILE" -u ${USER}: -T - "sftp://${TARGET}")
echo "Getting listing of existing backups"
# Note: sorting only produces a time-ordered list inside one timezone
# This is fine because we're only taking a snapshot every day, so the timezone issue is not relevant
BACKUPS=$(set -x; echo "ls ${HOST_DIR}" | sftp -i "${KEYFILE}" "${USER}@${HOST}" 2>/dev/null | tail -n +2 | sort)
COUNT=$(set -x; echo $BACKUPS | wc -w | awk '{print $1}')
if [ ! "$COUNT" -gt "$KEEP" ]; then
echo "Acceptable number of backups on remote, no need to prune"
echo "Done"
exit 0
fi
echo "Pruning old backups, keeping latest ${KEEP}"
for BACKUP in $BACKUPS; do
if [ ! "$COUNT" -gt "$KEEP" ]; then
echo "Acceptable number of backups on remote, no need to prune"
break
fi
(set -x; echo "rm ${BACKUP}" | sftp -i "${KEYFILE}" "${USER}@${HOST}")
COUNT=$((COUNT - 1))
done
echo "Done"
|