fix: push monitor state on config reload and preserve runtime static TGs

Notify report clients immediately after SIGHUP reload, emit END events when
removing systems, and keep OPTIONS/TS1_STATIC/TS2_STATIC when merging YAML.
pull/4/head
Rodrigo Pérez 4 months ago
parent c1bdbf6a12
commit fdf45d3246

@ -587,6 +587,57 @@ class BridgeUseCases:
return
tstatus.pop(stream_id, None)
def flush_monitor_events_for_system(self, system_name: str, protocol: Any) -> None:
report = self._report_factory
if not report or not hasattr(report, "send_bridge_event"):
return
if not self._config.get("REPORTS", {}).get("REPORT", True):
return
status = getattr(protocol, "STATUS", None)
if not isinstance(status, dict):
return
mode = self._config.get("SYSTEMS", {}).get(system_name, {}).get("MODE")
now = time.time()
if mode == "OPENBRIDGE":
for stream_id, st in list(status.items()):
if not isinstance(stream_id, (bytes, bytearray)) or not isinstance(st, dict):
continue
trx = "TX" if "H_LC" in st else "RX"
start = st.get("START", now)
report.send_bridge_event(
"GROUP VOICE,END,{},{},{},{},{},{},{:.2f}".format(
trx, system_name, int_id(stream_id),
int_id(st.get("RX_PEER", b"\x00\x00\x00\x00")),
int_id(st.get("RFS", b"\x00\x00\x00")), 1,
int_id(st.get("TGID", b"\x00\x00\x00")), max(0.0, now - start),
)
)
if trx == "RX":
self._obp_emit_end_tx_for_forward_legs(stream_id, system_name, now)
return
for slot in (1, 2):
slot_st = status.get(slot)
if not isinstance(slot_st, dict):
continue
for trx, sid_key, peer_key, rfs_key, tgid_key, start_key, type_key in (
("RX", "RX_STREAM_ID", "RX_PEER", "RX_RFS", "RX_TGID", "RX_START", "RX_TYPE"),
("TX", "TX_STREAM_ID", "TX_PEER", "TX_RFS", "TX_TGID", "TX_START", "TX_TYPE"),
):
sid = slot_st.get(sid_key, b"\x00")
if sid in (b"\x00", b"") or slot_st.get(type_key) == HBPF_SLT_VTERM:
continue
report.send_bridge_event(
"GROUP VOICE,END,{},{},{},{},{},{},{:.2f}".format(
trx, system_name, int_id(sid),
int_id(slot_st.get(peer_key, b"\x00\x00\x00\x00")),
int_id(slot_st.get(rfs_key, b"\x00\x00\x00")), slot,
int_id(slot_st.get(tgid_key, b"\x00\x00\x00")),
max(0.0, now - slot_st.get(start_key, now)),
)
)
def stream_trimmer_loop(self) -> None:
"""Trim old stream state (legacy stream_trimmer_loop, 5s). RX/TX timeout per system/slot; OBP streams (legacy bridge.py 181-240)."""
logger.debug("(ROUTER) Trimming inactive stream IDs from system lists")

@ -69,11 +69,21 @@ def prepare_incoming_config(
def merge_system_config(old_cfg: dict[str, Any], new_cfg: dict[str, Any]) -> dict[str, Any]:
"""Apply new system settings while keeping live runtime state (PEERS, STATS)."""
"""Apply new system settings while keeping live runtime state (PEERS, STATS, options/static TGs)."""
merged = copy.deepcopy(new_cfg)
mode = merged.get("MODE")
if mode == "MASTER":
merged["PEERS"] = old_cfg.get("PEERS", {})
for key in (
"OPTIONS",
"TS1_STATIC",
"TS2_STATIC",
"DEFAULT_UA_TIMER",
"_options_static_apply_fp",
"_default_options",
):
if key in old_cfg:
merged[key] = old_cfg[key]
elif mode == "PEER":
stats = old_cfg.get("STATS")
if isinstance(stats, dict):
@ -116,6 +126,7 @@ def reload_server_config(
listen_udp: Callable[[str, BindSpec, Any], Any],
stop_listener: Callable[[Any], None],
on_systems_changed: Callable[[], None] | None = None,
on_system_removed: Callable[[str, Any], None] | None = None,
log: logging.Logger | None = None,
) -> ReloadResult:
"""
@ -149,6 +160,8 @@ def reload_server_config(
for name in sorted(old_enabled - new_enabled):
port = transports.pop(name, None)
proto = protocols.pop(name, None)
if proto is not None and on_system_removed:
on_system_removed(name, proto)
if proto is not None:
try:
proto.dereg()

@ -474,6 +474,9 @@ def main() -> None:
def _on_config_systems_changed() -> None:
report_factory.set_systems(config.get("SYSTEMS", {}))
report_factory.set_bridges(bridge_router.get_bridges())
report_factory.send_config()
report_factory.send_bridge()
user_passwords_loader.load(config)
def _do_config_reload() -> None:
@ -488,6 +491,7 @@ def main() -> None:
listen_udp=lambda n, b, p: _listen_system(n, b, p),
stop_listener=_stop_udp_port,
on_systems_changed=_on_config_systems_changed,
on_system_removed=bridge_use_cases.flush_monitor_events_for_system,
log=logger,
)
except Exception as e:

Loading…
Cancel
Save

Powered by TurnKey Linux.