e719dd51c1
The single auto-refreshing zero-JS status page gave operators a 25-column wall and no way to drill into one connection. This adds a Bootstrap fleet dashboard (filterable/sortable KPI table) and a per-PLC detail page with a real-time debug view of raw PLC-side BCD vs. decoded client-side values, streamed live over a SignalR feed. The debug view is fed by an on-demand per-tag value capture, armed only while a detail page is open. All assets (Bootstrap, SignalR client, fonts) are embedded so the UI works unchanged on firewalled networks; GET /status.json is untouched for scrapers. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
72 lines
2.1 KiB
JSON
72 lines
2.1 KiB
JSON
// mbproxy smoke-test configuration — used by the Phase 4/5 web-UI browser smoke
|
|
// tests (see plans/2026-05-15-webui-dashboard.md). NOT a deployment config.
|
|
//
|
|
// Topology:
|
|
// * line-a / line-b → the dl205 simulator on 127.0.0.1:5020 (run-dl205-sim.ps1).
|
|
// line-a carries a 16-bit BCD tag, line-b a 32-bit BCD tag,
|
|
// so the connection-detail debug view has content in both
|
|
// widths. Both listeners bind and reach a live backend.
|
|
// * line-dead → an unreachable backend (192.0.2.1, TEST-NET-1, RFC 5737).
|
|
// The listener binds fine but every backend connect fails,
|
|
// so the row surfaces connect failures / heartbeat failures
|
|
// and exercises the dashboard's "problems only" filter.
|
|
{
|
|
"Mbproxy": {
|
|
"BcdTags": {
|
|
"Global": []
|
|
},
|
|
"Plcs": [
|
|
{
|
|
"Name": "line-a",
|
|
"ListenPort": 6020,
|
|
"Host": "127.0.0.1",
|
|
"Port": 5020,
|
|
"BcdTags": {
|
|
"Add": [
|
|
{ "Address": 1072, "Width": 16 }
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"Name": "line-b",
|
|
"ListenPort": 6021,
|
|
"Host": "127.0.0.1",
|
|
"Port": 5020,
|
|
"BcdTags": {
|
|
"Add": [
|
|
{ "Address": 1072, "Width": 32 }
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"Name": "line-dead",
|
|
"ListenPort": 6022,
|
|
"Host": "192.0.2.1",
|
|
"Port": 502
|
|
}
|
|
],
|
|
"AdminPort": 8080,
|
|
"AdminPushIntervalMs": 1000,
|
|
"Connection": {
|
|
"BackendConnectTimeoutMs": 2000,
|
|
"BackendRequestTimeoutMs": 2000,
|
|
"GracefulShutdownTimeoutMs": 5000,
|
|
"Keepalive": {
|
|
"Enabled": true,
|
|
"TcpIdleTimeMs": 30000,
|
|
"TcpProbeIntervalMs": 5000,
|
|
"TcpProbeCount": 4,
|
|
"BackendHeartbeatIdleMs": 10000,
|
|
"BackendHeartbeatProbeAddress": 0
|
|
}
|
|
}
|
|
},
|
|
"Serilog": {
|
|
"Using": [ "Serilog.Sinks.Console" ],
|
|
"MinimumLevel": { "Default": "Information" },
|
|
"WriteTo": [
|
|
{ "Name": "Console" }
|
|
]
|
|
}
|
|
}
|