Files
docker-ep-web-server/scripts/verify-backup.py
T

43 lines
1.6 KiB
Python

#!/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())