Joseph Doherty
5dfb797817
refactor(adminui): strip alias/relay machinery from UnsTreeService + EquipmentPage; Galaxy tags use standard TagModal
2026-06-12 21:28:13 -04:00
Joseph Doherty
ca2698949b
refactor(adminui): delete alias-tag/relay-converter files (build red until spine stripped)
2026-06-12 21:20:41 -04:00
Joseph Doherty
e2c6c15ae0
feat(opcua): remove SystemPlatform mirror producer + Galaxy exception from Phase7Composer
2026-06-12 21:17:39 -04:00
Joseph Doherty
499c9b9165
feat(validation): allow GalaxyMxGateway under Equipment; rename Galaxy-tag FullName check
2026-06-12 21:11:06 -04:00
Joseph Doherty
db2e4777dd
fix(historian-sidecar): close active TCP client on cancel so RunAsync unwinds
...
v2-ci / build (push) Failing after 33s
v2-ci / unit-tests (tests/Core/ZB.MOM.WW.OtOpcUa.Cluster.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.ControlPlane.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Runtime.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Security.Tests) (push) Has been skipped
v2-ci / integration (tests/Server/ZB.MOM.WW.OtOpcUa.Host.IntegrationTests) (push) Has been skipped
v2-ci / integration (tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests) (push) Has been skipped
The net48 sidecar's TcpFrameServer.RunOneConnectionAsync registered the
cancellation token to Stop() only the listener (to unblock a parked
AcceptTcpClientAsync), but never closed the active client. On net48
NetworkStream.ReadAsync ignores the CancellationToken, so while the frame
loop is parked reading an idle connected client, cancelling the token cannot
unblock it — only closing the socket can. RunAsync therefore never returned
on Ctrl-C/service-stop while a connection was open (Program.Main's
RunAsync().GetAwaiter().GetResult() would hang until NSSM force-killed).
Register the cancel to Close() the active client, and convert the resulting
cancel-time read/handshake exception to OperationCanceledException so RunAsync
unwinds cleanly without logging it as a connection failure or counting it
toward MaxConsecutiveFailures.
Caught by the first-ever net48 execution of TcpRoundTripTests on the Windows
VM (these only compile on macOS): SingleActive_SecondClientHelloCompletesOnly
AfterFirstCloses deadlocked in teardown. Full net48 historian suite now green
(122 passed, 0 failed, 2 skipped); all 6 TcpRoundTrip tests pass.
2026-06-12 13:34:45 -04:00
Joseph Doherty
6218512365
fix(historian-sidecar): don't wedge the TCP listener when Start() bind fails
...
v2-ci / build (push) Failing after 46s
v2-ci / unit-tests (tests/Core/ZB.MOM.WW.OtOpcUa.Cluster.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.ControlPlane.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Runtime.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Security.Tests) (push) Has been skipped
v2-ci / integration (tests/Server/ZB.MOM.WW.OtOpcUa.Host.IntegrationTests) (push) Has been skipped
v2-ci / integration (tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests) (push) Has been skipped
Live verification on a Windows VM surfaced a crash loop: TcpFrameServer.EnsureListening
assigned _listener = new TcpListener(...) BEFORE calling Start(). When Start() throws —
e.g. the port is in a Windows excluded/reserved range (WSAEACCES) or already in use — the
field was left non-null-but-unstarted, so the `if (_listener is not null) return` guard
permanently skipped re-Start() and every subsequent AcceptTcpClientAsync() threw the
misleading InvalidOperationException "Not listening" → 20 failures → exit 2 → NSSM restart
→ loop. Now _listener is assigned only after Start() succeeds, so a transient bind failure
is retried and a permanent one surfaces the real bind error each iteration. Adds a
regression test that forces a bind conflict and asserts the SocketException persists.
2026-06-12 13:02:22 -04:00
Joseph Doherty
1be06502c7
fix(historian): correct AlarmHistorian config-key refs in docs + install (review)
v2-ci / build (push) Failing after 43s
v2-ci / unit-tests (tests/Core/ZB.MOM.WW.OtOpcUa.Cluster.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.ControlPlane.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Runtime.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Security.Tests) (push) Has been skipped
v2-ci / integration (tests/Server/ZB.MOM.WW.OtOpcUa.Host.IntegrationTests) (push) Has been skipped
v2-ci / integration (tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests) (push) Has been skipped
2026-06-12 12:25:13 -04:00
Joseph Doherty
fcf84adbad
fix(historian-client): cancellable TLS client handshake + default-fields test (review)
2026-06-12 12:13:04 -04:00
Joseph Doherty
d4ecc9138f
feat(adminui): historian TCP-connect probe + TLS form fields
2026-06-12 12:07:06 -04:00
Joseph Doherty
e2960515cf
chore(historian): drop dead pipe package ref + stale pipe strings (review)
2026-06-12 12:02:05 -04:00
Joseph Doherty
72f32045a4
refactor(historian): remove named-pipe transport
2026-06-12 11:51:53 -04:00
Joseph Doherty
ac12633087
feat(historian-client): default ctor dials TCP
2026-06-12 11:37:42 -04:00
Joseph Doherty
706077f02f
feat(historian-sidecar): TCP bootstrap + env, drop allowed-SID
2026-06-12 11:34:06 -04:00
Joseph Doherty
999e58c605
fix(historian-sidecar): cancel SocketException guard + version-reject log + TLS test (review)
2026-06-12 11:31:04 -04:00
Joseph Doherty
fd4d05534e
fix(historian-client): dispose TcpClient/SslStream on connect+TLS failure (review)
2026-06-12 11:30:39 -04:00
Joseph Doherty
6e152047eb
feat(historian-client): TCP connect factory + FrameChannel rename
2026-06-12 11:21:28 -04:00
Joseph Doherty
7ce7505a36
feat(historian-host): bind TCP host/port/tls config
2026-06-12 11:19:46 -04:00
Joseph Doherty
3528702185
feat(historian-sidecar): TcpFrameServer (TCP + optional TLS)
2026-06-12 11:16:28 -04:00
Joseph Doherty
35ac0b8c4e
feat(historian-client): add TCP/TLS options fields
2026-06-12 11:14:36 -04:00
Joseph Doherty
57355405a6
chore(security): drop dead audit suppressions; patch OpenTelemetry + Tmds.DBus CVEs
...
All five suppressed advisories are now resolved at baseline/resolved versions,
so every NuGetAuditSuppress is removed repo-wide:
- System.Security.Cryptography.Xml (GHSA-37gx-xxp4-5rgx / GHSA-w3x6-4m5h-cxqf)
-> fixed by the .NET 10 baseline (10.0.6)
- OPCFoundation Opc.Ua.Core (GHSA-h958-fxgg-g7w3) -> fixed at resolved 1.5.378.106
Two were still live and are now patched via direct security pins:
- OpenTelemetry.Api 1.9.0 -> 1.15.3 (GHSA-g94r-2vxg-569j) pinned in Cluster;
Runtime/ControlPlane/AdminUI + tests inherit via project reference
- Tmds.DBus.Protocol 0.20.0 -> 0.21.3 (GHSA-xrw6-gwf8-vvr9) pinned in Client.UI
Also correct the Historian sidecar runtime comments (x86 -> x64, matching the
csproj PlatformTarget). Solution audit: 0 vulnerable packages; full build clean.
2026-06-12 09:03:42 -04:00
Joseph Doherty
e77fd3eec0
fix(adminui): converter UI — try/catch + confirm + FleetAdmin gate on per-equipment convert (review)
2026-06-11 21:54:21 -04:00
Joseph Doherty
7682d185fb
feat(adminui): relay->alias converter UI (per-equipment + fleet-wide /uns/convert-relays)
2026-06-11 21:49:43 -04:00
Joseph Doherty
299eaa461c
fix(adminui): gate Galaxy picker so it doesn't clobber alias FullName on edit; refresh gateways (review)
2026-06-11 21:45:55 -04:00
Joseph Doherty
d19271fff8
fix(adminui): converter skips name-collisions + disabled relays (review)
2026-06-11 21:44:19 -04:00
Joseph Doherty
4af27ea173
feat(adminui): AliasTagModal + Tags-tab Add-alias (Galaxy picker)
2026-06-11 21:37:04 -04:00
Joseph Doherty
943bc5f709
feat(adminui): ConvertRelayVirtualTagsToAliasesAsync (relay VTag -> alias Tag)
2026-06-11 21:32:43 -04:00
Joseph Doherty
fe068652b3
fix(adminui): alias update pins invariants + LoadAliasTagAsync + null-driver guard (review)
2026-06-11 21:25:06 -04:00
Joseph Doherty
9f13101896
feat(validation): require TagConfig.FullName on Galaxy alias tags; reframe Tag doc
2026-06-11 21:21:32 -04:00
Joseph Doherty
53116bdd83
feat(adminui): CreateAliasTagAsync/UpdateAliasTagAsync + Galaxy-gateway guard
2026-06-11 21:17:45 -04:00
Joseph Doherty
fcc73ccd2d
fix(adminui): null Source for alias rows without a FullName (review nits)
2026-06-11 21:12:52 -04:00
Joseph Doherty
bc9e83ed9f
feat(composer): admit GalaxyMxGateway-backed equipment alias tags (+byte-parity)
2026-06-11 21:10:21 -04:00
Joseph Doherty
4b4738a891
feat(adminui): alias DTO + Galaxy gateway lookup + Source/IsAlias on tag rows
2026-06-11 21:05:02 -04:00
Joseph Doherty
2ba2f8a899
feat(commons): TryParseRelayBody — detect pure ctx.GetTag relay scripts
2026-06-11 20:59:10 -04:00
Joseph Doherty
80b19d6fc8
chore(uns): create-redirect null guard + alarm isolation test + alarm-authoring doc (final review)
2026-06-11 15:23:06 -04:00
Joseph Doherty
f1c4392b0d
refactor(uns): drop dead LoadEquipmentChildrenAsync + LinesForCluster; fix stale comment
2026-06-11 15:11:28 -04:00
Joseph Doherty
6e7127c396
feat(uns): remove standalone scripted-alarm pages + nav link (alarms now per-equipment)
2026-06-11 15:06:13 -04:00
Joseph Doherty
f1b9e7116b
fix(uns): guard ScriptedAlarmModal form rebuild against stray re-renders (code-review)
2026-06-11 15:03:43 -04:00
Joseph Doherty
826ffdc1a0
feat(uns): equipment is a tree leaf linking to the detail page; drop EquipmentModal
2026-06-11 15:01:10 -04:00
Joseph Doherty
773c073d0e
feat(uns): Alarms tab + ScriptedAlarmModal on the equipment page
2026-06-11 14:53:03 -04:00
Joseph Doherty
1294fb6ee5
fix(uns): surface stale-row edits + dismiss modal on delete + @key rows (code-review)
2026-06-11 14:49:23 -04:00
Joseph Doherty
61ad5ab8cc
feat(uns): wire Tags + Virtual Tags tabs on the equipment page (reuse modals)
2026-06-11 14:44:35 -04:00
Joseph Doherty
7fbfeca451
feat(uns): equipment detail page shell + Details tab + create-redirect
2026-06-11 14:36:48 -04:00
Joseph Doherty
5cae3c5b96
fix(uns): guard scripted-alarm name uniqueness on create/update (code-review)
2026-06-11 14:31:35 -04:00
Joseph Doherty
705ed6234f
feat(uns): scripted-alarm CRUD in IUnsTreeService for the equipment Alarms tab
2026-06-11 14:25:59 -04:00
Joseph Doherty
7c22861598
feat(uns): per-equipment tag/virtual-tag list service methods
2026-06-11 14:19:46 -04:00
Joseph Doherty
7d91737dac
feat(uns): carry created id on UnsMutationResult for equipment create
2026-06-11 14:16:21 -04:00
Joseph Doherty
56750e110f
fix(alarms): historize the real operator for shelve/unshelve/enable/disable transitions
2026-06-11 13:14:00 -04:00
Joseph Doherty
5ea6e9d7d9
fix(historian): validate non-positive drain/capacity/retention knobs (review) + log prefix
2026-06-11 13:09:13 -04:00
Joseph Doherty
f215982b93
feat(historian): drain/capacity/retention config knobs + startup config-warning validation
2026-06-11 13:04:16 -04:00
Joseph Doherty
61b230d79a
harden(historian): nullable HistorizeToAveva (missing→historize) for rolling-restart-safe deserialize + middle-link test
2026-06-11 13:00:57 -04:00