mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-06-12 10:35:14 +02:00
Implement backup and restore functions (#15067)
Added create_backup and restore_backup functions for standardized data backup and restoration.
This commit is contained in:
committed by
GitHub
parent
4cdb2b88f5
commit
a38da170da
@@ -1123,6 +1123,94 @@ create_temp_dir() {
|
|||||||
echo "$tmp_dir"
|
echo "$tmp_dir"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# create_backup <path> [<path> ...] / restore_backup
|
||||||
|
#
|
||||||
|
# Standardized data backup helpers for update_script(). They replace the
|
||||||
|
# hand-rolled "cp/mv to a sibling dir, update, copy back, rm" dance that is
|
||||||
|
# duplicated across the ct/*.sh update functions.
|
||||||
|
#
|
||||||
|
# create_backup <path> [<path> ...]
|
||||||
|
# - Copies each given file/directory into a persistent store at
|
||||||
|
# /opt/<NSAPP>.backup, mirroring its absolute path inside the store, and
|
||||||
|
# records it in a manifest so restore_backup needs no arguments.
|
||||||
|
# - Idempotent: if a store from a previous (failed) run already exists, it is
|
||||||
|
# left untouched and no new backup is taken. This keeps the last-known-good
|
||||||
|
# data instead of overwriting it with now-partially-updated data on retry.
|
||||||
|
# - Missing source paths are skipped with a warning (not fatal).
|
||||||
|
# - Aborts the update on copy failure: if any file/dir cannot be backed up,
|
||||||
|
# the half-written store is removed and the script exits, so the update
|
||||||
|
# never runs against unprotected data (and a retry re-attempts a clean
|
||||||
|
# backup rather than skipping it).
|
||||||
|
#
|
||||||
|
# restore_backup
|
||||||
|
# - Copies every path recorded in the manifest back to its origin (replacing
|
||||||
|
# whatever the update left there), then deletes the store.
|
||||||
|
# - No-op (with a warning) if no store exists.
|
||||||
|
#
|
||||||
|
# Override the store location with BACKUP_DIR if the default does not fit.
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
create_backup() {
|
||||||
|
local store manifest path dest
|
||||||
|
store="${BACKUP_DIR:-/opt/${NSAPP:-app}.backup}"
|
||||||
|
manifest="${store}/.manifest"
|
||||||
|
|
||||||
|
[[ $# -eq 0 ]] && {
|
||||||
|
msg_warn "create_backup called without any paths"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ -f "$manifest" ]]; then
|
||||||
|
msg_ok "Existing backup found at ${store}, skipping backup"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Backing up data"
|
||||||
|
if ! mkdir -p "$store" || ! : >"$manifest"; then
|
||||||
|
msg_error "Backup failed: could not create store at ${store} - aborting update"
|
||||||
|
rm -rf "$store"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
for path in "$@"; do
|
||||||
|
path="${path%/}"
|
||||||
|
if [[ ! -e "$path" ]]; then
|
||||||
|
msg_warn "Skipping backup of '${path}' (not found)"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
dest="${store}/files${path}"
|
||||||
|
if ! mkdir -p "$(dirname "$dest")" || ! cp -a "$path" "$dest"; then
|
||||||
|
msg_error "Backup of '${path}' failed - aborting update"
|
||||||
|
rm -rf "$store"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "$path" >>"$manifest"
|
||||||
|
done
|
||||||
|
msg_ok "Backed up data to ${store}"
|
||||||
|
}
|
||||||
|
|
||||||
|
restore_backup() {
|
||||||
|
local store manifest path src
|
||||||
|
store="${BACKUP_DIR:-/opt/${NSAPP:-app}.backup}"
|
||||||
|
manifest="${store}/.manifest"
|
||||||
|
|
||||||
|
if [[ ! -f "$manifest" ]]; then
|
||||||
|
msg_warn "No backup found to restore"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Restoring data"
|
||||||
|
while IFS= read -r path; do
|
||||||
|
[[ -z "$path" ]] && continue
|
||||||
|
src="${store}/files${path}"
|
||||||
|
[[ -e "$src" ]] || continue
|
||||||
|
mkdir -p "$(dirname "$path")"
|
||||||
|
rm -rf "$path"
|
||||||
|
cp -a "$src" "$path"
|
||||||
|
done <"$manifest"
|
||||||
|
rm -rf "$store"
|
||||||
|
msg_ok "Restored data"
|
||||||
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# Check if package is installed (supports both Debian and Alpine)
|
# Check if package is installed (supports both Debian and Alpine)
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user