52 lines
1.6 KiB
Bash
Executable File
52 lines
1.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Archive exactly three legacy filesystem sessions before optionally deleting them.
|
|
# This helper is deliberately inert unless --delete is supplied after archive verification.
|
|
set -euo pipefail
|
|
|
|
usage() {
|
|
echo "usage: $0 [--delete] SOURCE_SESSIONS_DIR BACKUP.tar SESSION_ID SESSION_ID SESSION_ID" >&2
|
|
exit 2
|
|
}
|
|
|
|
delete_after_backup=false
|
|
if [[ ${1:-} == "--delete" ]]; then
|
|
delete_after_backup=true
|
|
shift
|
|
fi
|
|
[[ $# -eq 5 ]] || usage
|
|
|
|
source_dir=$1
|
|
backup=$2
|
|
shift 2
|
|
ids=("$@")
|
|
|
|
[[ -d $source_dir ]] || { echo "legacy session root is not a directory" >&2; exit 1; }
|
|
[[ ! -e $backup ]] || { echo "backup already exists; refusing to overwrite it" >&2; exit 1; }
|
|
[[ ${ids[0]} != "${ids[1]}" && ${ids[0]} != "${ids[2]}" && ${ids[1]} != "${ids[2]}" ]] \
|
|
|| { echo "exactly three distinct legacy session IDs are required" >&2; exit 1; }
|
|
|
|
paths=()
|
|
for id in "${ids[@]}"; do
|
|
[[ $id =~ ^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$ ]] \
|
|
|| { echo "invalid legacy session ID: $id" >&2; exit 1; }
|
|
[[ -f "$source_dir/$id/session_manifest.yaml" ]] \
|
|
|| { echo "legacy session manifest is missing: $id" >&2; exit 1; }
|
|
paths+=("$id")
|
|
done
|
|
|
|
tar --create --file "$backup" --directory "$source_dir" -- "${paths[@]}"
|
|
tar --list --file "$backup" >/dev/null
|
|
sha256sum "$backup" >"$backup.sha256"
|
|
echo "verified backup: $backup"
|
|
echo "checksum: $backup.sha256"
|
|
|
|
if ! $delete_after_backup; then
|
|
echo "no legacy sessions deleted; review the archive, then rerun with --delete during maintenance" >&2
|
|
exit 0
|
|
fi
|
|
|
|
for id in "${ids[@]}"; do
|
|
rm -rf -- "$source_dir/$id"
|
|
done
|
|
echo "deleted exactly three archived legacy sessions"
|