Scripts/incus/backup_incus_volumes.sh

70 lines
1.8 KiB
Bash
Raw Normal View History

2024-09-27 22:54:43 +09:00
#!/usr/bin/env bash
# vim: set tabstop=2 softtabstop=2 shiftwidth=2 expandtab:
#
# Script Name: backup_incus_volumes.sh
# Description: This script backs up all Incus storage volumes
# listed in the 'default' storage pool to a specified
# backup directory. It is designed to be invoked by
# Borgmatic hooks.
# Author: Benoit <forgejo@benoit.jp.net>
# Website: benoit.jp.net
# License: MIT
#
# Dependencies: incus
# Written with the help of ChatGPT
#
# Strict mode
set -euo pipefail
# Set the backup directory
BACKUP_DIR="/var/backups/incus"
# Create the backup directory if it doesn't exist
mkdir -p "$BACKUP_DIR"
# Get the list of volumes and check for errors
volumes=$(incus storage volume list default -f csv -c t,n,u 2>/dev/null)
if [ $? -ne 0 ]; then
echo "Error: Failed to list storage volumes." >&2
exit 1
fi
# Check if there are any volumes to back up
if [ -z "$volumes" ]; then
echo "No volumes found to back up."
exit 0
fi
# Initialize a success flag
all_backups_successful=true
# Loop through each volume and back it up
while IFS=, read -r type name used; do
# Ignore images, containers, and unused volumes
if [[ "$type" == "image" || "$type" == "container" \
|| "$type" == "virtual-machine" || "$used" -eq 0 ]]; then
continue
fi
echo "Backing up volume: $name"
if incus storage volume export default "$name" \
--compression=none --volume-only \
2024-09-27 22:54:43 +09:00
"$BACKUP_DIR/${name}.tar" &> /dev/null; then
echo "Successfully backed up: $name"
else
echo "Error backing up volume: $name" >&2
all_backups_successful=false
fi
done <<< "$volumes"
# Final message based on backup success
if $all_backups_successful; then
echo "Backup completed successfully. All volumes have been backed up to $BACKUP_DIR."
else
echo "Backup completed with errors. Some volumes may not have been backed up."
fi