43 lines
1.6 KiB
Python
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())
|