#!/usr/bin/env python3 """Restore a backup to an isolated temporary database and verify its integrity.""" import argparse import shutil import sqlite3 import sys import tempfile from pathlib import Path def main(): parser = argparse.ArgumentParser(description="Test an Eternity Project database backup by restoring it safely.") parser.add_argument("backup", type=Path, help="Path to a .db backup created by backup-database.py") args = parser.parse_args() source = args.backup.resolve() if not source.is_file(): print(f"BACKUP_VERIFY_FAILED: Backup does not exist: {source}", file=sys.stderr) return 2 with tempfile.TemporaryDirectory(prefix="eternity-restore-") as directory: restored = Path(directory) / "eternity-restored.db" shutil.copy2(source, restored) try: database = sqlite3.connect(f"file:{restored}?mode=ro", uri=True) integrity = database.execute("PRAGMA integrity_check").fetchone()[0] users = database.execute("SELECT COUNT(*) FROM users").fetchone()[0] posts = database.execute("SELECT COUNT(*) FROM posts").fetchone()[0] database.close() except sqlite3.DatabaseError as error: print(f"BACKUP_VERIFY_FAILED: {error}", file=sys.stderr) return 1 if integrity != "ok": print(f"BACKUP_VERIFY_FAILED: integrity_check returned {integrity}", file=sys.stderr) return 1 print(f"BACKUP_RESTORE_VERIFIED: users={users} posts={posts} source={source}") return 0 if __name__ == "__main__": raise SystemExit(main())