b222362ce0
Fixes every finding from the codereviews/2026-05-16 multi-agent review (2 Critical, 20 Major, 38 Minor) and adds that review to the repo. Highlights: dashboard XSS escape; response cache invalidated on the write request (not just the response); ReloadValidator now runs at startup so port collisions / duplicate names / malformed Resilience profiles fail fast; AdminPort 0 genuinely disables the admin endpoint; PlcListener accept-loop faults propagate to the supervisor's faulted path; reconciler Restart builds before removing; Resilience pipelines are restart-only from a frozen snapshot; multiplexer connect-race leak, watchdog party-list snapshot, backend-response and FC16 framing validation; frontend reconnect retry and util.js load guard; plus the log-event/doc drift sweep and test-port hygiene. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
49 lines
1.8 KiB
Desktop File
49 lines
1.8 KiB
Desktop File
# systemd unit for mbproxy — the Modbus TCP BCD proxy.
|
|
#
|
|
# Installed to /etc/systemd/system/mbproxy.service by install.sh.
|
|
# The Linux counterpart of the Windows Service registered by install.ps1.
|
|
#
|
|
# Type=exec (not Type=notify): mbproxy is a leaf service that nothing orders
|
|
# against, so systemd's readiness signal is unnecessary. Type=exec marks the
|
|
# unit active once the binary is exec'd; graceful stop still works because the
|
|
# .NET generic host handles SIGTERM directly (drains in-flight requests within
|
|
# Connection.GracefulShutdownTimeoutMs).
|
|
|
|
[Unit]
|
|
Description=mbproxy — Modbus TCP BCD proxy
|
|
After=network-online.target
|
|
Wants=network-online.target
|
|
|
|
[Service]
|
|
Type=exec
|
|
ExecStart=/opt/mbproxy/Mbproxy
|
|
WorkingDirectory=/etc/mbproxy
|
|
User=mbproxy
|
|
Group=mbproxy
|
|
|
|
# Restart on crash, but not on a clean SIGTERM stop.
|
|
Restart=on-failure
|
|
RestartSec=5
|
|
# Keep above Connection.GracefulShutdownTimeoutMs (default 10 s) so the drain
|
|
# completes before systemd escalates to SIGKILL.
|
|
TimeoutStopSec=30
|
|
|
|
# Self-contained single-file publish: pin native-library extraction to a stable,
|
|
# writable directory (install.sh creates it and grants the mbproxy account access).
|
|
Environment=DOTNET_BUNDLE_EXTRACT_BASE_DIR=/var/cache/mbproxy
|
|
|
|
# Hardening. The service only needs to write its log and bundle-cache directories.
|
|
NoNewPrivileges=true
|
|
ProtectSystem=strict
|
|
ProtectHome=true
|
|
PrivateTmp=true
|
|
ReadWritePaths=/var/log/mbproxy /var/cache/mbproxy
|
|
# /etc/mbproxy is intentionally absent from ReadWritePaths: the service only READS its
|
|
# config (ProtectSystem=strict still allows reads), and config changes are an admin
|
|
# operation. Editing appsettings.json must be done as root, not by the service account.
|
|
# If any configured ListenPort is below 1024, also add:
|
|
# AmbientCapabilities=CAP_NET_BIND_SERVICE
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|