#!/usr/bin/env bash
set -Eeuo pipefail
umask 077
[[ $EUID -eq 0 ]] || { echo 'Run with sudo.' >&2; exit 1; }
[[ $# -eq 1 && -f "$1" ]] || { echo "Usage: sudo $0 /var/backups/archforge-status/backup-....tar.gz"; exit 1; }
FILE=$(realpath -- "$1")
[[ "$FILE" == /var/backups/archforge-status/backup-*.tar.gz ]] || { echo 'Backups must be from the managed backup directory' >&2; exit 1; }
TMP=$(mktemp -d)
trap 'rm -rf "$TMP"' EXIT
# Reject unexpected entries, symlinks and paths before extracting as root.
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")
while IFS= read -r type; do [[ "$type" == '-' || "$type" == 'd' ]] || { echo 'Unsupported archive file type' >&2;exit 1;}; done < <(tar -tvzf "$FILE" | cut -c1)
tar -xzf "$FILE" -C "$TMP" --no-same-owner --no-same-permissions
[[ -s "$TMP/status.env" ]] || { echo 'Backup does not contain status.env'; exit 1; }
echo 'This will replace the live database and configuration.'
read -rp "Type RESTORE to continue: " OK
[[ "$OK" == RESTORE ]] || exit 1
systemctl stop archforge-status
rm -f /var/lib/archforge-status/status.db-wal /var/lib/archforge-status/status.db-shm
if [[ -f "$TMP/status.db" ]]; then install -o archforge-status -g archforge-status -m 600 "$TMP/status.db" /var/lib/archforge-status/status.db; fi
install -o root -g archforge-status -m 640 "$TMP/status.env" /etc/archforge-status/status.env
if [[ -f "$TMP/msmtprc" ]]; then install -o archforge-status -g archforge-status -m 600 "$TMP/msmtprc" /etc/archforge-status/msmtprc; fi
systemctl start archforge-status
systemctl --no-pager --full status archforge-status
