diff --git a/roles/borg_client/templates/borg-backup.sh.j2 b/roles/borg_client/templates/borg-backup.sh.j2 index 4a333b9780fe9335875abe840151e306ac186599..bfd62ce2add03b367416910b0a58b8abb52179ef 100644 --- a/roles/borg_client/templates/borg-backup.sh.j2 +++ b/roles/borg_client/templates/borg-backup.sh.j2 @@ -6,6 +6,8 @@ src="/" snapshotdir="backup-snapshot" backup_mountdir="/backup" +declare -a list_of_btrfs_submounts + ## # usage : is_btrfs( $path ) # return : whether $path is on a btrfs @@ -22,6 +24,21 @@ delete_snapshot() { btrfs subvolume delete --commit-after "$1" } +## +# exit cleanup handler +## +cleanup() { + if is_btrfs "$src"; then + umount -R "$backup_mountdir" + for vol in $list_of_btrfs_submounts; do + delete_snapshot "$vol/$snapshotdir" + done + rmdir "$backup_mountdir" + fi +} + +trap cleanup EXIT + if is_btrfs "$src"; then # List all btrfs submounts we want to backup, e.g. homedir.archlinux.org with "/ /home" list_of_btrfs_submounts=$(findmnt -Rl -o target,fstype,options / | grep btrfs | grep -v docker | grep -v "subvol=\/[[:alnum:]]" | cut -d ' ' -f1) @@ -75,11 +92,3 @@ borg create -v --stats -C zstd \ -e "$backup_mountdir/var/lib/docker" \ {{ item['host'] }}/{{ item['dir'] }}::$(date "+%Y%m%d-%H%M%S") "$backup_mountdir" borg prune -v {{ item['host'] }}/{{ item['dir'] }} --keep-daily=7 --keep-weekly=4 --keep-monthly=6 - -if is_btrfs "$src"; then - umount -R "$backup_mountdir" - for vol in $list_of_btrfs_submounts; do - delete_snapshot "$vol/$snapshotdir" - done - rmdir "$backup_mountdir" -fi diff --git a/roles/prometheus_exporters/templates/prometheus-borg-textcollector.service.j2 b/roles/prometheus_exporters/templates/prometheus-borg-textcollector.service.j2 index 593a774eef4860048b1bc2049752d69cdb443531..117b1b4ad5b3922b9a75bf9d9bb19bb1f6260d14 100644 --- a/roles/prometheus_exporters/templates/prometheus-borg-textcollector.service.j2 +++ b/roles/prometheus_exporters/templates/prometheus-borg-textcollector.service.j2 @@ -1,7 +1,9 @@ [Unit] Description=Prometheus Borg Exporter TextCollector After=network.target -ConditionPathExistsGlob=!/root/.cache/borg/*/lock.roster +# If the backup snapshot path exists, the backup script runs and a borg +# lockfile exists and we can't run borg list +ConditionPathExists=!/backup [Service] Type=oneshot