Commit Graph

903 Commits

Author SHA1 Message Date
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