54626ceb6a
tests / build-and-test (push) Successful in 2m59s
tests / thread-sanitizer (push) Successful in 3m28s
tests / tshark-dissector (push) Successful in 2m22s
tests / secs4j-interop (push) Successful in 2m6s
tests / python-interop (push) Failing after 3m8s
tests / libfuzzer (push) Successful in 3m44s
Exposure: --grpc default flipped from 0.0.0.0 to 127.0.0.1 (the API is unauthenticated by design; auth belongs to the transport), Unix-domain- socket support (--grpc unix:///run/secs_gemd/api.sock = zero network surface), SECURITY.md documents the contract and ch42 gained a "Running it in production" section (which also documents the HSMS-SS single-session assumption). Graceful shutdown: SIGTERM/SIGINT land on an asio::signal_set on the io thread, which nudges grpc Shutdown with a 2s deadline (cancels open Subscribe/WatchHealth streams); Wait() returns on the MAIN thread, which stops the engine (rt->stop() joins the io thread, so it must not run on it). Exit 0, journal-safe, the in-code TODO is gone. --spool-dir added so host-bound events survive daemon restarts. Observability: --metrics serves Prometheus gauges secsgem_link_selected / secsgem_control_state / secsgem_spool_depth, wired via the Phase-0 add_link_observer/add_control_state_observer hooks + io-thread sampling. Deployment: deploy/secs_gemd.service — hardened systemd unit (DynamicUser, ProtectSystem=strict, StateDirectory for the spool, UDS for the API, TimeoutStopSec aligned with the graceful-shutdown window). Enforcement: tools/check_daemon_ops.sh proves all three operational claims (unix-socket gRPC accepts, all gauges present on /metrics, SIGTERM -> exit 0 + clean-stop log) — green; wired into tools/run_interop.sh (now 11 steps) and CI. CI python-interop lane also gained the pyclient and spool-restart steps, so every harness now runs in CI. TODO sweep: the shutdown TODO is fixed; the four remaining TODOs (nested list formats, C2-as-text, U8>2^63, CONNECTED link state) are deliberate deferred edge cases, each marked in code with context. Daemon suite re-verified green (175 assertions). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
42 lines
1.2 KiB
Desktop File
42 lines
1.2 KiB
Desktop File
# systemd unit for the secs_gemd SECS/GEM daemon.
|
|
#
|
|
# install -m644 deploy/secs_gemd.service /etc/systemd/system/
|
|
# install -m755 build/secs_gemd /usr/local/bin/
|
|
# mkdir -p /etc/secsgem && cp data/*.yaml /etc/secsgem/
|
|
# systemctl enable --now secs_gemd
|
|
#
|
|
# The tool API rides a Unix domain socket (no network exposure at all);
|
|
# point the Python/C++ client at unix:///run/secs_gemd/api.sock. The HSMS
|
|
# port (5000) faces the fab host — firewall it to the host's address (see
|
|
# docs/SECURITY.md for the nftables recipe).
|
|
|
|
[Unit]
|
|
Description=SECS/GEM equipment daemon (secs_gemd)
|
|
After=network-online.target
|
|
Wants=network-online.target
|
|
|
|
[Service]
|
|
Type=exec
|
|
ExecStart=/usr/local/bin/secs_gemd \
|
|
--port 5000 \
|
|
--grpc unix:///run/secs_gemd/api.sock \
|
|
--metrics 9091 \
|
|
--config-dir /etc/secsgem \
|
|
--spool-dir /var/lib/secs_gemd/spool
|
|
RuntimeDirectory=secs_gemd
|
|
StateDirectory=secs_gemd
|
|
# SIGTERM triggers the daemon's graceful shutdown (drains gRPC, stops the
|
|
# engine, exit 0); give it a moment before SIGKILL.
|
|
TimeoutStopSec=10
|
|
Restart=always
|
|
RestartSec=2
|
|
# Hardening
|
|
NoNewPrivileges=true
|
|
ProtectSystem=strict
|
|
ProtectHome=true
|
|
ReadWritePaths=/var/lib/secs_gemd
|
|
DynamicUser=true
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|