changelog: neutral box names; ignore the built svxdr binary
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
+14
-14
@@ -25,7 +25,7 @@
|
||||
"repo": "svxdr",
|
||||
"hash": "tglist-sole-source",
|
||||
"type": "change",
|
||||
"summary": "FROZEN: the tglist is now the SOLE source of TG name/Location in Lastheard — all fallback removed (locForTG/systemForTG/bridgeIdentity no longer read live astmeta gateway location or nodes[].system). Every talker on a TG shows exactly the tglist name for that TG (blank if absent), so Lastheard is identical on every box. The master list is edited on speed and every box syncs it."
|
||||
"summary": "FROZEN: the tglist is now the SOLE source of TG name/Location in Lastheard — all fallback removed (locForTG/systemForTG/bridgeIdentity no longer read live astmeta gateway location or nodes[].system). Every talker on a TG shows exactly the tglist name for that TG (blank if absent), so Lastheard is identical on every box. The master list is edited on the hub box and every box syncs it."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-27",
|
||||
@@ -137,21 +137,21 @@
|
||||
"repo": "svx-web",
|
||||
"hash": "svxdr-monitor-nodes-uniform",
|
||||
"type": "fix",
|
||||
"summary": "svxdr Monitor->Nodes: make it behave IDENTICALLY on every box, no per-conf-dialect special case. Bug: the Local-vs-trunk split only happened when the master trunk name could be derived from svxreflector.conf ([ReflectorTrunk] Peers), which only speed s dialect has — so aldmr (dialect [TRUNK_*]) never split and dumped the whole SE hub s 18 nodes into LOCAL. Now the split is decided purely by is the monitored master remote (reflectorURL != monitor_status_url), and the master-section label is derived from the DATA (the Reflector field the master s nodes report, masterReflectorName) instead of the local conf. Both boxes now show LOCAL = only their own nodes and the master s nodes under one identical, data-driven section. Removed dead/special code: the whole trunk_status.go topology-feed dead end, masterTrunkName and uplinkTrunkName (conf-dialect helpers), and the trunk_status config field."
|
||||
"summary": "svxdr Monitor->Nodes: make it behave IDENTICALLY on every box, no per-conf-dialect special case. Bug: the Local-vs-trunk split only happened when the master trunk name could be derived from svxreflector.conf ([ReflectorTrunk] Peers), which only the hub box s dialect has — so the bridge box (dialect [TRUNK_*]) never split and dumped the whole SE hub s 18 nodes into LOCAL. Now the split is decided purely by is the monitored master remote (reflectorURL != monitor_status_url), and the master-section label is derived from the DATA (the Reflector field the master s nodes report, masterReflectorName) instead of the local conf. Both boxes now show LOCAL = only their own nodes and the master s nodes under one identical, data-driven section. Removed dead/special code: the whole trunk_status.go topology-feed dead end, masterTrunkName and uplinkTrunkName (conf-dialect helpers), and the trunk_status config field."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-07",
|
||||
"repo": "svx-web",
|
||||
"hash": "svxdr-topology-crawl-restored",
|
||||
"type": "fix",
|
||||
"summary": "svxdr topology: restore the network crawl (go externalPuller) so the graph shows the connection LINES again, not just nodes. An aggregated hub status (sm2ampr/geu) carries empty trunk host fields, so it can never draw the server-to-server edges; only crawling each reflector s OWN /status yields the real peer hosts topology_view.js resolves into links. The crawl seeds from the local reflector s trunk hosts + the network topology file and BFS-reads each reflector; interval bumped to 60s (EXTERNAL_PULL_INTERVAL) with last-good retention so it is spread out and gentle. aldmr 17 reflectors/34 trunk-links, speed 18/42, local reflector self=true anchored at centre. The per-trunk trunk_status feed added earlier stays dormant (could not produce edges)."
|
||||
"summary": "svxdr topology: restore the network crawl (go externalPuller) so the graph shows the connection LINES again, not just nodes. An aggregated hub status (sm2ampr/geu) carries empty trunk host fields, so it can never draw the server-to-server edges; only crawling each reflector s OWN /status yields the real peer hosts topology_view.js resolves into links. The crawl seeds from the local reflector s trunk hosts + the network topology file and BFS-reads each reflector; interval bumped to 60s (EXTERNAL_PULL_INTERVAL) with last-good retention so it is spread out and gentle. the bridge box 17 reflectors/34 trunk-links, the hub box 18/42, local reflector self=true anchored at centre. The per-trunk trunk_status feed added earlier stays dormant (could not produce edges)."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-07",
|
||||
"repo": "svx-web",
|
||||
"hash": "svxdr-topology-full-net",
|
||||
"type": "fix",
|
||||
"summary": "svxdr topology: show the WHOLE network again, local reflector centred. readTrunkStatuses now reads ALL uplink trunks from svxreflector.conf (default address = the trunk s conf Host; nodelist.trunk_status json is only the exception, e.g. SE hub -> sm2ampr), and unfolds each hub response: every sub-trunk that carries nodes becomes its own reflector entity, so one hub read yields the full aggregated net (no crawl, no recursion beyond parsing the single response). aldmr 19 reflectors/1357 nodes, speed 9/661, each with type=local self=true so topology_view.js anchors it at centre. Read cadence stays local-fast / remote-1-per-min."
|
||||
"summary": "svxdr topology: show the WHOLE network again, local reflector centred. readTrunkStatuses now reads ALL uplink trunks from svxreflector.conf (default address = the trunk s conf Host; nodelist.trunk_status json is only the exception, e.g. SE hub -> sm2ampr), and unfolds each hub response: every sub-trunk that carries nodes becomes its own reflector entity, so one hub read yields the full aggregated net (no crawl, no recursion beyond parsing the single response). the bridge box 19 reflectors/1357 nodes, the hub box 9/661, each with type=local self=true so topology_view.js anchors it at centre. Read cadence stays local-fast / remote-1-per-min."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-07",
|
||||
@@ -172,14 +172,14 @@
|
||||
"repo": "svx-web",
|
||||
"hash": "svxdr-merge-phase1-scaffold",
|
||||
"type": "feat",
|
||||
"summary": "svxdr: start merging astmeta + nodelist + proxy + xlink into ONE process (fewer daemons to track). Phase 1 scaffold: one config /etc/svxlink/svxdr.json (sectioned per subsystem + shared redis/nodes/trunk/lastheard), per-box module toggles so the same binary runs all subsystems on speed/aldmr and only astmeta on the allstar box, and a start/SIGHUP-reload/graceful-stop lifecycle. Subsystems are stubs for now and are folded in one at a time; the existing standalone binaries keep running until cutover (no regression). Builds + vets; verified it parses the example and toggles modules."
|
||||
"summary": "svxdr: start merging astmeta + nodelist + proxy + xlink into ONE process (fewer daemons to track). Phase 1 scaffold: one config /etc/svxlink/svxdr.json (sectioned per subsystem + shared redis/nodes/trunk/lastheard), per-box module toggles so the same binary runs all subsystems on the hub box/the bridge box and only astmeta on the allstar box, and a start/SIGHUP-reload/graceful-stop lifecycle. Subsystems are stubs for now and are folded in one at a time; the existing standalone binaries keep running until cutover (no regression). Builds + vets; verified it parses the example and toggles modules."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-06",
|
||||
"repo": "svx-web",
|
||||
"hash": "aldmr-nodes-json-deploy",
|
||||
"hash": "the bridge box-nodes-json-deploy",
|
||||
"type": "fix",
|
||||
"summary": "aldmr: deployed the nodes.json bridge map (deploy-aldmr/etc/nodes.json) and the new astmeta/nodelist. Fixes the Location regression on TG 3149050: it was mapped in astmeta to the dead node 403872 while the live carrier 1971 was unwatched (also ended a per-second 'no RPT_ALINKS for 403872' reconnect storm). 1971 is a fan-out endpoint whose only keyed alink is our own 48305, so the allstar remap reports the real far node 45225. Verified live: TG 3109050 and 3149050 now pair on node 45225 / East Coast Reflector. callsign KT4ROY-ASL uniform for all; reflector name lives in nodeLocation."
|
||||
"summary": "the bridge box: deployed the nodes.json bridge map (deploy-the bridge box/etc/nodes.json) and the new astmeta/nodelist. Fixes the Location regression on TG 3149050: it was mapped in astmeta to the dead node 403872 while the live carrier 1971 was unwatched (also ended a per-second 'no RPT_ALINKS for 403872' reconnect storm). 1971 is a fan-out endpoint whose only keyed alink is our own 48305, so the allstar remap reports the real far node 45225. Verified live: TG 3109050 and 3149050 now pair on node 45225 / East Coast Reflector. callsign KT4ROY-ASL uniform for all; reflector name lives in nodeLocation."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-06",
|
||||
@@ -193,7 +193,7 @@
|
||||
"repo": "svx-web",
|
||||
"hash": "nodes-json-single-source",
|
||||
"type": "feat",
|
||||
"summary": "nodes.json: one source-of-truth bridge map that astmeta and nodelist both read directly (svx_node/tg/allstar/system/via/callsign per node). astmeta derives watch_nodes/[node.*]/[names] from it; nodelist derives the Location column's reflector_names + format from it -- ending the multi-file drift that broke the Location column. Additive: absent file = old config, no regression. proxy is a pure relay and stays untouched. Tooling: deploy-aldmr/import-live.py bootstraps nodes.json from the live config (derives the AllStar link from rpt startup_macro, flags what it cannot derive instead of guessing); deploy-aldmr/gen-asterisk.py renders the svx_sat.conf node blocks as a managed #include."
|
||||
"summary": "nodes.json: one source-of-truth bridge map that astmeta and nodelist both read directly (svx_node/tg/allstar/system/via/callsign per node). astmeta derives watch_nodes/[node.*]/[names] from it; nodelist derives the Location column's reflector_names + format from it -- ending the multi-file drift that broke the Location column. Additive: absent file = old config, no regression. proxy is a pure relay and stays untouched. Tooling: deploy-the bridge box/import-live.py bootstraps nodes.json from the live config (derives the AllStar link from rpt startup_macro, flags what it cannot derive instead of guessing); deploy-the bridge box/gen-asterisk.py renders the svx_sat.conf node blocks as a managed #include."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-06",
|
||||
@@ -214,7 +214,7 @@
|
||||
"repo": "svx-web",
|
||||
"hash": "monitor-local-vs-trunk",
|
||||
"type": "fix",
|
||||
"summary": "Monitor -> Nodes: Local now means ONLY this server's own reflector nodes. When a box monitors a foreign master (speed reads the HUB SE master status), the master's own nodes used to land under Local -- they are a different server reached over a trunk, not local. They are now grouped under that trunk's section, named from config (the svxreflector.conf trunk whose host matches the monitored master, e.g. SE-AUX -- never hardcoded). Local is read from our OWN reflector (REFLECTOR_STATUS_URL) and self nodes are de-duplicated out of the master section. A box that monitors its own reflector (aldmr) is unaffected: same URL -> no split, top-level stays Local."
|
||||
"summary": "Monitor -> Nodes: Local now means ONLY this server's own reflector nodes. When a box monitors a foreign master (the hub box reads the HUB SE master status), the master's own nodes used to land under Local -- they are a different server reached over a trunk, not local. They are now grouped under that trunk's section, named from config (the svxreflector.conf trunk whose host matches the monitored master, e.g. SE-AUX -- never hardcoded). Local is read from our OWN reflector (REFLECTOR_STATUS_URL) and self nodes are de-duplicated out of the master section. A box that monitors its own reflector (the bridge box) is unaffected: same URL -> no split, top-level stays Local."
|
||||
},
|
||||
{
|
||||
"date": "2026-08-06",
|
||||
@@ -277,21 +277,21 @@
|
||||
"repo": "proxy",
|
||||
"hash": "fa69ae8",
|
||||
"type": "feature",
|
||||
"summary": "svx-web/proxy gained a meta-sync conduit so a box with NO local astmeta (speed) still shows the real talker on Lastheard. It sets UPSTREAM_STATUS_URL to the proxy of the box that HAS the meta (aldmr) and FORWARD_TALKER_URL to its own nodelist: every 2s it fetches the upstream /status ('hämta status'), keeps the talker_meta (so its own /status carries it too) and POSTs each entry to the local nodelist /api/talker-meta ('api') with network left empty. The frozen Lastheard code enriches the existing trunk row IN PLACE — callsign, via, AllStar node, system — while the backend stays 'trunk' (it arrived over the trunk). Only trunk/status/API cross-box; no bridge, no polling of anyone else, no code change to nodelist/web, no dupes. No-op unless UPSTREAM_STATUS_URL is set (aldmr stays fed by its local astmeta)."
|
||||
"summary": "svx-web/proxy gained a meta-sync conduit so a box with NO local astmeta (the hub box) still shows the real talker on Lastheard. It sets UPSTREAM_STATUS_URL to the proxy of the box that HAS the meta (the bridge box) and FORWARD_TALKER_URL to its own nodelist: every 2s it fetches the upstream /status ('hämta status'), keeps the talker_meta (so its own /status carries it too) and POSTs each entry to the local nodelist /api/talker-meta ('api') with network left empty. The frozen Lastheard code enriches the existing trunk row IN PLACE — callsign, via, AllStar node, system — while the backend stays 'trunk' (it arrived over the trunk). Only trunk/status/API cross-box; no bridge, no polling of anyone else, no code change to nodelist/web, no dupes. No-op unless UPSTREAM_STATUS_URL is set (the bridge box stays fed by its local astmeta)."
|
||||
},
|
||||
{
|
||||
"date": "2026-07-31",
|
||||
"repo": "astmeta",
|
||||
"hash": "33607dc",
|
||||
"type": "feature",
|
||||
"summary": "astmeta can now POST talker-meta to SEVERAL reflectors, not just the local one: [nodelist] peers = url|token, url|token. This lets a partner reflector that receives the same talker over the trunk (e.g. speed hearing an East Coast talker relayed from aldmr) enrich its Lastheard IN PLACE with the real source — 'East Coast Reflector via KT4ROY-SAT1', AllStar node, backend AllStar — instead of the bare trunk name 'KT4ROY-SAT1 / trunk'. No dupes: the receiving nodelist already applies talker-meta to trunk-delivered rows (via-gated), so it enriches the existing single row. Backward compatible; no peers = unchanged."
|
||||
"summary": "astmeta can now POST talker-meta to SEVERAL reflectors, not just the local one: [nodelist] peers = url|token, url|token. This lets a partner reflector that receives the same talker over the trunk (e.g. the hub box hearing an East Coast talker relayed from the bridge box) enrich its Lastheard IN PLACE with the real source — 'East Coast Reflector via KT4ROY-SAT1', AllStar node, backend AllStar — instead of the bare trunk name 'KT4ROY-SAT1 / trunk'. No dupes: the receiving nodelist already applies talker-meta to trunk-delivered rows (via-gated), so it enriches the existing single row. Backward compatible; no peers = unchanged."
|
||||
},
|
||||
{
|
||||
"date": "2026-07-31",
|
||||
"repo": "web",
|
||||
"hash": "4f5a617",
|
||||
"type": "feature",
|
||||
"summary": "On the AlabamaLink box (aldmr) the AlabamaLink line is now folded into the SAME federation marquee — 'Part of the reflector-network.com federation … • Powered by Executor — a multi-mode digital voice server, part of the AlabamaLink network.' scrolling together in one bar, matching the DMR site's notice. No second banner. Gated on the local reflector identity (KT4ROY) from the status the page already fetches, so every other box keeps just the federation line."
|
||||
"summary": "On the AlabamaLink box (the bridge box) the AlabamaLink line is now folded into the SAME federation marquee — 'Part of the reflector-network.com federation … • Powered by Executor — a multi-mode digital voice server, part of the AlabamaLink network.' scrolling together in one bar, matching the DMR site's notice. No second banner. Gated on the local reflector identity (KT4ROY) from the status the page already fetches, so every other box keeps just the federation line."
|
||||
},
|
||||
{
|
||||
"date": "2026-07-31",
|
||||
@@ -340,7 +340,7 @@
|
||||
"repo": "deploy",
|
||||
"hash": "8ee1f46",
|
||||
"type": "feature",
|
||||
"summary": "deploy-remote.sh --conf deploys the per-box system config under /etc (deploy/etc for speed, deploy-aldmr/etc for aldmr). Secret-safe: each @@PLACEHOLDER@@ is filled from the CURRENT live file (section+key aware) so real passwords/tokens are never overwritten; a placeholder that can't be resolved skips the file (never writes @@ into a live config). Per-file diff + y/N confirm (or -y), -n dry-run, preserves target owner/mode. Runs before --bin so a following --bin restart picks up the new config. Also reconciled the astmeta.conf template with the live file (added the [nodelist] section) so its diff is clean."
|
||||
"summary": "deploy-remote.sh --conf deploys the per-box system config under /etc (deploy/etc for the hub box, deploy-the bridge box/etc for the bridge box). Secret-safe: each @@PLACEHOLDER@@ is filled from the CURRENT live file (section+key aware) so real passwords/tokens are never overwritten; a placeholder that can't be resolved skips the file (never writes @@ into a live config). Per-file diff + y/N confirm (or -y), -n dry-run, preserves target owner/mode. Runs before --bin so a following --bin restart picks up the new config. Also reconciled the astmeta.conf template with the live file (added the [nodelist] section) so its diff is clean."
|
||||
},
|
||||
{
|
||||
"date": "2026-07-28",
|
||||
@@ -410,7 +410,7 @@
|
||||
"repo": "nodelist",
|
||||
"hash": "174b09d",
|
||||
"type": "change",
|
||||
"summary": "Monitor Nodes rebuilt to read ONE reflector /status (new /api/monitor-nodes) instead of the recursive crawl+aggregate: shows a Local section then one section per trunk with its nodes. Per-box source via MONITOR_STATUS_URL (speed=sm2ampr /geu/status/, aldmr=its own /status). Search + mode toggle kept, borderless."
|
||||
"summary": "Monitor Nodes rebuilt to read ONE reflector /status (new /api/monitor-nodes) instead of the recursive crawl+aggregate: shows a Local section then one section per trunk with its nodes. Per-box source via MONITOR_STATUS_URL (the hub box=sm2ampr /geu/status/, the bridge box=its own /status). Search + mode toggle kept, borderless."
|
||||
},
|
||||
{
|
||||
"date": "2026-07-28",
|
||||
|
||||
Reference in New Issue
Block a user