Repository files, collaboration, releases and project activity.
ARCHFORGE HISTORY
Blame · scripts/restore.sh
Branch main · the Commit author is not necessarily a verified ArchForge account.
e59b7f7cc6archadmin2026-10-11
1 #!/usr/bin/env bashe59b7f7cc6archadmin2026-10-11
2 set -Eeuo pipefaile59b7f7cc6archadmin2026-10-11
3 umask 077e59b7f7cc6archadmin2026-10-11
4 [[ $EUID -eq 0 ]] || { echo 'Run with sudo.' >&2; exit 1; }e59b7f7cc6archadmin2026-10-11
5 [[ $# -eq 1 && -f "$1" ]] || { echo "Usage: sudo $0 /var/backups/archforge-status/backup-....tar.gz"; exit 1; }e59b7f7cc6archadmin2026-10-11
6 FILE=$(realpath -- "$1")e59b7f7cc6archadmin2026-10-11
7 [[ "$FILE" == /var/backups/archforge-status/backup-*.tar.gz ]] || { echo 'Backups must be from the managed backup directory' >&2; exit 1; }e59b7f7cc6archadmin2026-10-11
8 TMP=$(mktemp -d)e59b7f7cc6archadmin2026-10-11
9 trap 'rm -rf "$TMP"' EXITe59b7f7cc6archadmin2026-10-11
10 # Reject unexpected entries, symlinks and paths before extracting as root.e59b7f7cc6archadmin2026-10-11
11 while IFS= read -r item; do case "$item" in ./|./status.db|./status.env|./msmtprc) ;; *) echo "Unsafe archive path: $item" >&2; exit 1;; esac; done < <(tar -tzf "$FILE")e59b7f7cc6archadmin2026-10-11
12 while IFS= read -r type; do [[ "$type" == '-' || "$type" == 'd' ]] || { echo 'Unsupported archive file type' >&2;exit 1;}; done < <(tar -tvzf "$FILE" | cut -c1)e59b7f7cc6archadmin2026-10-11
13 tar -xzf "$FILE" -C "$TMP" --no-same-owner --no-same-permissionse59b7f7cc6archadmin2026-10-11
14 [[ -s "$TMP/status.env" ]] || { echo 'Backup does not contain status.env'; exit 1; }e59b7f7cc6archadmin2026-10-11
15 echo 'This will replace the live database and configuration.'e59b7f7cc6archadmin2026-10-11
16 read -rp "Type RESTORE to continue: " OKe59b7f7cc6archadmin2026-10-11
17 [[ "$OK" == RESTORE ]] || exit 1e59b7f7cc6archadmin2026-10-11
18 systemctl stop archforge-statuse59b7f7cc6archadmin2026-10-11
19 rm -f /var/lib/archforge-status/status.db-wal /var/lib/archforge-status/status.db-shme59b7f7cc6archadmin2026-10-11
20 if [[ -f "$TMP/status.db" ]]; then install -o archforge-status -g archforge-status -m 600 "$TMP/status.db" /var/lib/archforge-status/status.db; fie59b7f7cc6archadmin2026-10-11
21 install -o root -g archforge-status -m 640 "$TMP/status.env" /etc/archforge-status/status.enve59b7f7cc6archadmin2026-10-11
22 if [[ -f "$TMP/msmtprc" ]]; then install -o archforge-status -g archforge-status -m 600 "$TMP/msmtprc" /etc/archforge-status/msmtprc; fie59b7f7cc6archadmin2026-10-11
23 systemctl start archforge-statuse59b7f7cc6archadmin2026-10-11
24 systemctl --no-pager --full status archforge-status