ansible/roles/zfs-prune/files/zfs-remove-old-snapshot
2025-08-08 00:28:34 +02:00

66 lines
1.4 KiB
Bash
Executable file

#!/usr/bin/env bash
if [ $# -ne 1 ]
then
echo "USAGE: $0 <tank>"
exit 1
fi
TANK="$1"
IS_TANK_EXIST=$(zfs list | grep -c "tank/${TANK} ")
if [ "${IS_TANK_EXIST}" -ne 1 ]
then
echo "${TANK} n'existe pas. Arrêt."
exit 1
fi
TODAY=$(date "+%Y-%m-%d")
# On ne garde que les 365 dernières snapshots ZFS
LIMIT=$(date -d "${TODAY} -1year" "+%Y-%m-%d")
LIMIT_EPOCH=$(date -d "${LIMIT}" "+%s")
while true
do
# On vérifie qu'il existe au moins 365 backups
COUNT=$(zfs list -t snapshot \
| grep -c "tank/${TANK}")
if [ "${COUNT}" -le 365 ]
then
echo "Il y a moins de 366 backups. Fin."
break
fi
# On récupère la plus vieille snapshot
OLDEST_SNAPSHOT=$(zfs list -t snapshot \
| grep "tank/${TANK}" \
| cut -d' ' -f1 | cut -d'@' -f2 \
| sort | head -n1)
OLDEST_SNAPSHOT_EPOCH=$(date -d "${OLDEST_SNAPSHOT}" "+%s")
# Sanity-check: Si la plus vieille backup est celle d'il y a moins d'un an: On sort.
if [ "${OLDEST_SNAPSHOT_EPOCH}" -ge "${LIMIT_EPOCH}" ]
then
echo "La backup locale ${TANK} ${OLDEST_SNAPSHOT} est suffisament récente. Fin."
break
fi
# Sinon, on supprime la plus vieille snapshot.
echo "Suppression de la backup ${TANK} ${OLDEST_SNAPSHOT}."
sleep 2
zfs destroy "tank/${TANK}@${OLDEST_SNAPSHOT}"
if [ $? -ne 0 ]
then
echo "La suppression s'est mal déroulée. Arrêt."
exit 1
fi
done