Initial PoC: find_protection, tagged checkpoints, FLR, mutating catalog. Lab 10.9 status enums (0=Initializing, 1=MeetingSLA). Credentials stay in gitignored config.json.
43 lines
1.5 KiB
Python
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)
|