Generate go2rtc's config from what the printers report
go2rtc has been supervised since before this commit, with nothing to serve: `CONTINUUM_GO2RTC_CONFIG` pointed at `./go2rtc.yaml`, and that file did not exist in the repository or anywhere else. A watchdog was restarting a process that had no cameras configured. `camera.rs` writes it, from the `rtsp_url` a printer publishes in its own `print.push_status` `ipcam` block rather than from `printers.toml`. The URL is already something the machine tells us, so asking an operator to keep a second copy of it - and to update it by hand when a printer's address changes - would be asking for drift. Two tasks, not one: the builder decides what should be served, the watchdog keeps the thing serving it alive. They meet at one `Notify`, because go2rtc reads its configuration only at startup, so a changed config needs a restart. The watchdog now selects the child's exit against that notification and skips its backoff on a deliberate change. What this does *not* cover is most printers, and that is the honest limit. Only the X1/H2 class publishes an RTSP URL - confirmed against two real machines: the H2C reports `rtsps://192.168.0.21:322/streaming/live/1`, the P1P reports an `ipcam` block with `ipcam_dev: "1"` and no URL at all. "A camera exists" and "a camera you can connect to" are different facts. A P1/A1 needs Bambu's proprietary port-6000 JPEG stream, which this crate does not speak, so those printers report no `camera_stream` and a UI should offer a player only when one is present. Details worth keeping: - The config is rendered sorted so an unchanged fleet is byte-identical, and on the first pass it is compared against the file on disk - without that, every daemon restart rewrites an identical file and drops every live viewer. - Written through a `.tmp` and renamed. The watchdog can restart go2rtc at any moment, and a half-written config fails to parse, which takes every working stream down rather than one. - Never logged, and gitignored: the credentials go in the URL because that is the only place go2rtc takes them for an RTSP source, so the file holds printer access codes. - A reported URL with no scheme is refused rather than repaired. One bad entry makes go2rtc fail to load the whole file. - No `rtsp:` or `webrtc:` block. The API listener is what serves WebRTC to a browser, which is the only consumer here; opening go2rtc's own RTSP server would publish every printer's camera on the LAN unauthenticated. - `stream_base_url` is reported in `hello`, not derived from the listen address: `:1984` is a bind address and not something a browser can open. Unset means "advertise nothing", which is the right default, because a wrong URL makes the UI offer a player that cannot connect. It is a LAN address either way - there is no relay, so this works for an operator in the workshop and not for anyone outside it. 63 tests, clippy unchanged at the two deliberate variant-size warnings, `cargo deny check licenses` ok. go2rtc itself stays operator-installed and is not distributed.
This commit is contained in:
@@ -27,8 +27,15 @@ cloud control plane (`continuum-backend`).
|
||||
- **Cloud uplink** - a WebSocket client to `continuum-backend` that
|
||||
connects, sends a heartbeat on a timer, and reconnects on drop
|
||||
(`src/uplink/`).
|
||||
- **go2rtc watchdog** - restarts the camera-restreaming subprocess if it
|
||||
dies (`src/go2rtc.rs`).
|
||||
- **Camera restreaming** - generates go2rtc's configuration from the camera
|
||||
URLs the printers report, and restarts go2rtc when it changes
|
||||
(`src/camera.rs` + `src/go2rtc.rs`). Only the X1/H2 class publishes an
|
||||
RTSP URL: confirmed against two real machines, an H2C reports
|
||||
`rtsps://<ip>:322/streaming/live/1` and a P1P reports a camera with no URL
|
||||
for it. A P1/A1 camera needs Bambu's proprietary port-6000 JPEG stream,
|
||||
which this crate does not speak, so those printers advertise no stream
|
||||
rather than one that will not play. Note the stream is reachable on the
|
||||
gateway's LAN only - there is no relay.
|
||||
- **Bambu file upload** - implicit FTPS (port 990) into the printer's own
|
||||
`cache/` directory (`src/printer/bambu_ftps.rs`, via
|
||||
`BambuPrinter::upload_file`). **Confirmed live against a P1P on
|
||||
@@ -97,11 +104,12 @@ cargo run --example bambu_commands_demo # round-trips hand-written structs ag
|
||||
|
||||
```
|
||||
src/
|
||||
main.rs Loads+connects the printer fleet, then runs the uplink and go2rtc watchdog side by side
|
||||
main.rs Loads+connects the printer fleet, then runs the uplink, camera config, watchdog and completion watcher side by side
|
||||
config.rs Loads settings from environment variables
|
||||
fleet.rs Loads printers.toml into ready-to-use PrinterHandles
|
||||
uplink/ WebSocket client to continuum-backend: connect, heartbeat, reconnect on drop
|
||||
go2rtc.rs Restarts the go2rtc camera-restreaming process if it dies
|
||||
camera.rs Writes go2rtc's config from the camera URLs the printers report
|
||||
go2rtc.rs Restarts the go2rtc camera-restreaming process if it dies, or when the config changes
|
||||
printer/
|
||||
mod.rs GenericPrinter trait + PrinterBase + PrinterHandle enum - the trait+enum
|
||||
"inheritance" pattern this project uses instead of class inheritance
|
||||
|
||||
Reference in New Issue
Block a user