|
|
|
|
@ -73,8 +73,28 @@ def _upstream_peer_block(name: str, cfg: dict[str, Any]) -> dict[str, Any]:
|
|
|
|
|
return block
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _openbridge_block(name: str, cfg: dict[str, Any], topology_row: dict[str, Any] | None) -> dict[str, Any]:
|
|
|
|
|
def _obp_ka_connected(cfg: dict[str, Any], now: float) -> bool | None:
|
|
|
|
|
"""BCKA keepalive status for ENHANCED OBP legs; ``None`` when KA gating does not apply."""
|
|
|
|
|
if not cfg.get("ENHANCED_OBP"):
|
|
|
|
|
return None
|
|
|
|
|
bcka = cfg.get("_bcka")
|
|
|
|
|
if bcka is None:
|
|
|
|
|
return False
|
|
|
|
|
try:
|
|
|
|
|
return float(bcka) >= now - 60
|
|
|
|
|
except (TypeError, ValueError):
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _openbridge_block(
|
|
|
|
|
name: str,
|
|
|
|
|
cfg: dict[str, Any],
|
|
|
|
|
topology_row: dict[str, Any] | None,
|
|
|
|
|
*,
|
|
|
|
|
now: float,
|
|
|
|
|
) -> dict[str, Any]:
|
|
|
|
|
"""Enabled OPENBRIDGE legs (``CTABLE.OPENBRIDGES``); STREAMS stay empty here (live chips = monitor/voice)."""
|
|
|
|
|
del name
|
|
|
|
|
block: dict[str, Any] = {"mode": "OPENBRIDGE", "streams": {}}
|
|
|
|
|
network_id = cfg.get("NETWORK_ID")
|
|
|
|
|
if network_id is not None:
|
|
|
|
|
@ -86,6 +106,9 @@ def _openbridge_block(name: str, cfg: dict[str, Any], topology_row: dict[str, An
|
|
|
|
|
block["port"] = int(row["port"])
|
|
|
|
|
if row.get("enhanced_obp") or cfg.get("ENHANCED_OBP"):
|
|
|
|
|
block["enhanced_obp"] = True
|
|
|
|
|
connected = _obp_ka_connected(cfg, now)
|
|
|
|
|
if connected is not None:
|
|
|
|
|
block["connected"] = connected
|
|
|
|
|
return block
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -137,7 +160,7 @@ def build_dashboard_state(
|
|
|
|
|
block["port"] = int(topo["port"])
|
|
|
|
|
masters[name] = block
|
|
|
|
|
elif mode == "OPENBRIDGE":
|
|
|
|
|
openbridges[name] = _openbridge_block(name, cfg, topo)
|
|
|
|
|
openbridges[name] = _openbridge_block(name, cfg, topo, now=epoch)
|
|
|
|
|
elif mode in ("PEER", "XLXPEER") and _upstream_peer_connected(cfg):
|
|
|
|
|
peers[name] = _upstream_peer_block(name, cfg)
|
|
|
|
|
|
|
|
|
|
|