Files
zerto-ai-rewind/src/zerto_rewind_mcp/config.py
T
claude 38ba9c1b50 feat(poc): rewind MCP, skill, and recover-ladder docs
Initial PoC: find_protection, tagged checkpoints, FLR, mutating catalog.
Lab 10.9 status enums (0=Initializing, 1=MeetingSLA). Credentials stay in gitignored config.json.
2026-09-21 12:09:11 -04:00

43 lines
1.5 KiB
Python

"""Load config from JSON and/or environment."""
from __future__ import annotations
import json
import os
from pathlib import Path
from typing import Any
from zerto_rewind_mcp.catalog import MutatingCatalog
def _env(name: str, default: str | None = None) -> str | None:
value = os.environ.get(name)
if value is None or value == "":
return default
return value
def load_config(path: str | Path | None = None) -> dict[str, Any]:
config_path = Path(path or _env("ZERTO_REWIND_CONFIG") or "config.json")
data: dict[str, Any] = {}
if config_path.exists():
data = json.loads(config_path.read_text(encoding="utf-8"))
data["_config_path"] = str(config_path.resolve())
data.setdefault("zerto_url", _env("ZERTO_URL", ""))
data.setdefault("username", _env("ZERTO_USERNAME", ""))
data.setdefault("password", _env("ZERTO_PASSWORD", ""))
data.setdefault("client_id", _env("ZERTO_CLIENT_ID", "zerto-client"))
verify = _env("ZERTO_VERIFY_TLS")
if verify is not None:
data["verify_tls"] = verify.lower() not in {"0", "false", "no"}
else:
data.setdefault("verify_tls", False)
data.setdefault("recovery_dir", _env("ZERTO_RECOVERY_DIR", "./recovered"))
data.setdefault("mutating_tools", data.get("mutating_tools") or [])
return data
def load_catalog(data: dict[str, Any]) -> MutatingCatalog:
path = Path(data["_config_path"]) if data.get("_config_path") else None
return MutatingCatalog.from_config(data, path=path)