overgrowth / agent /oob_tools /backup.py
Graham Paasch
Import Overgrowth app
b3d02a4
Raw
History Blame
1.99 kB
import hashlib
import os
from datetime import datetime, timezone
from typing import Dict
from .utils import load_json, save_json
BACKUPS_PATH = os.path.join(os.path.dirname(__file__), "..", "..", "infra", "backups.json")
def _timestamp() -> str:
return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
def _new_hash(device: str, timestamp: str) -> str:
return hashlib.sha256(f"{device}-{timestamp}".encode()).hexdigest()[:8]
def oob_get_last_backup(device: str) -> Dict:
backups = load_json(BACKUPS_PATH)
info = backups.get(device)
if not info:
return {
"device": device,
"last_backup_at": None,
"config_hash": None,
"snapshots": [],
"risk": "high", # no backup means risky
"message": "No backup found.",
}
age_msg = "Backup present"
if info.get("last_backup_at"):
age_msg = f"Last backup at {info['last_backup_at']}"
risk = "low"
# Optionally adjust risk based on recency; for now simple heuristic.
return {
"device": device,
"last_backup_at": info.get("last_backup_at"),
"config_hash": info.get("config_hash"),
"snapshots": info.get("snapshots", []),
"risk": risk,
"message": age_msg,
}
def oob_perform_backup(device: str) -> Dict:
backups = load_json(BACKUPS_PATH)
now = _timestamp()
cfg_hash = _new_hash(device, now)
entry = backups.get(device, {
"last_backup_at": None,
"config_hash": None,
"snapshots": [],
})
entry.update({
"last_backup_at": now,
"config_hash": cfg_hash,
})
entry.setdefault("snapshots", []).append(cfg_hash)
backups[device] = entry
save_json(BACKUPS_PATH, backups)
return {
"device": device,
"last_backup_at": now,
"config_hash": cfg_hash,
"snapshots": entry["snapshots"],
"message": "Backup completed (simulated).",
}