Upgrade Notes
-
The
lager-cli[mcp]extra is gone. Nothing in the CLI imports the MCP SDK. The MCP server is box-side code, and the wheel does not ship it. Remove[mcp]from your requirements.pip install lager-cli[mcp]still installs the CLI, and pip warns that the extra does not exist. The MCP service on a Lager Box is unaffected. -
lager execstarts a container in a CI job that declares no container. It ran the command in place in every GitHub Actions, GitLab CI, Drone and Bitbucket job. On a job with nocontainer:, that meant the toolchain of the runner and not the devenv image. Hosted runners have Docker, so the container path works there. On a runner that has no Docker, setLAGER_EXEC_IN_PLACE=1to keep the old behavior. -
lager usb NET cycleexits1when the device does not come back. It printed[OK]and exited0for every result. A script that checks the exit code now sees the failure. The/usb/commandresponse of the box also names the result in a newoutcomefield. -
Every command refuses
--box "".lager update,ssh,binaries,nets,box-config,arm,spi,i2candlogsread an empty--boxas no--box. A script with--box "$BOX"andBOXunset therefore ran against the default box. These commands now printBox name cannot be empty. Set the variable, or remove the option. -
lager dacrefuses a voltage above 5 V. It accepted up to 10 V, which no supported DAC can output, and the error came from the box. -
The trigger options of
lager scopeandlager logicmatch the MSO5000.lager scope NET trigger uartno longer offersstop, which the MSO5000 does not have.trigger i2creads--dataand--addressas hex, and its--data-widthis 1 to 5 bytes.lager logic NET trigger i2c --addr-widthno longer offers9, andtrigger uart --data-widthrefuses9. Change a script that passes one of these values. -
The next
lager installon each Lager Box asks for the sudo password one time. That install writes the new sudo grants and a root-owned helper script. Later installs on that box ask for no password.lager updateasks for no password, as before.
Features
lager box-config mcp-tokenadds an optional bearer token to the MCP server of a Lager Box.enablemakes port 8100 answer only a request that carriesAuthorization: Bearer <token>. It shows the token one time, with a client entry that carries it.rotate,disableandstatusmanage the token, and each change takes effect with no restart. The token is off by default, so a box that does not enable it behaves as before. Seelager box-configand MCP Server.
Bug Fixes
-
lager debug NET flash --bin FILE,0programs at address 0. Both debug service clients replaced an address of 0 with0x08000000. The CLI programmed a target whose flash starts at 0 at the wrong address. -
lager ssh-setupandlager updateno longer report a registered key as unregistered. On a box whose key directory a control plane owns, the write that files the key there cannot succeed. Both commands read that failure as proof that the key was unmanaged. They now ask the box whether the key is already in its key directory. -
lager scope NET trigger i2c,uartandspiaccept their defaults and every value they offer. The I2C trigger refused its default--direction read_writeandack_miss.--clk-slopenow sets the clock edge, and the UARTerrorandcerrorconditions reach the scope. -
lager logic NET trigger pulseacceptsgt,ltandgtlt. The command refused every value that it offered. -
lager ssh,lager updateandlager logslog in as the saved user of the box.sshandupdatelooked the user up by box name only, so an IP or the default box gotlagerdata.logsalways usedlagerdata.lager logs dockernow says when it needs passwordlesssudoto read a log size. -
lager nets addaccepts the Rigol DP832, Keysight E36312A, MCC USB-202, J-Link Base Compact and Phidget.lager instrumentslisted their channels, butnets addrefused every net on them. -
lager nets add-batchsaves theparamsof a record and refuses keys that it does not read. It dropped custom LabJack pins and an FTDI channel without a word. It now checks them, the role and the address asnets adddoes. It saves nothing if one record fails. -
lager nets tuiedits the pins of a LabJack U3 net. The pin editor offered only T7 pins and defaults.nets addalso refuses FIO0-FIO3 of a U3 as custom pins, which the box refused only at the first transfer. -
lager boxesasks a gateway auth server for a token one time, not one time per box. A gated fleet shares one auth server. A server that did not answer charged the full timeout again for each box before the table appeared. -
lager boxesreports a box whose stored session cannot be read aserror. An unreadable~/.lager_gateway_authended the command with a traceback, or listed the box asno response. A slow auth server also no longer blocks unrelated boxes. -
lager boxesno longer ends a login session when it stops waiting on a box. The command sometimes exited before it stored a new refresh cookie. The next command then sent the old cookie, and the server asked for a newlager login. -
lager execchecks for a real container, not only for CI variables. It reads/.dockerenv,/run/.containerenv, thecontainervariable and the cgroup of process 1.LAGER_EXEC_IN_PLACEaffectslager execalone.LAGER_CI_OVERRIDEstill works, but it also turns off CI detection for every other command. -
The caller now sees the warning for a clamped LabJack U3 clock.
lager spi NET configandlager i2c NET configwrote the warning to the log of the box, which no user reads. The box now returns it, and the CLI prints it. -
lager spi NET configandlager i2c NET configstop naming a request that nobody made. A net with no stored frequency took a default that a U3 cannot reach, so the output read(requested 1000000Hz). The clause now appears only for a frequency that you passed or stored. -
lager dac NETreads back the last value written after alager pythonrun. The box releases its direct-USB drivers before every script, and the U3 DAC lost the record of its output. A read failed with “has no readback” on a pin that still held its voltage. -
An install as a second login user no longer fails at the SSH key sync.
start_box.shkept its key-poller PID in one fixed path under/tmp. The script was not able to remove a file that another login user wrote there, and it exited after it removed the old containers. The path is now per user, and a failure there is a warning. -
LOCAL_ADDRESSnames an address that the box has. It was fixed at172.18.0.10, the address of the container on lagernet. Underlager box-config network-mode host, a script that used it bound to an address on no interface. The box now reads the address from the routing table, and an explicitLOCAL_ADDRESSin the box config still wins. -
lager box-config applyallows a box that freed port 9000 withLAGER_DISABLE_UART_SERVICE. The host-network check tested both control ports, whether or not the box published them. A listener on 9000 that was never part of Lager refused the apply. -
Several messages are corrected.
lager debug eraseprintsErase failed:one time, and a failed pre-erase inflashprints the error from the box.gdbserveranddisconnectname OpenOCD on an OpenOCD net.lager boxessays “1 box needs updating”, andnets statenames 0.34.0 for an old box.
Improvements
-
lager installasks for the sudo password one time on a fresh Lager Box, and not at all on a box that is already installed. It wrote its two sudoers files in separate sessions, and two later steps ran commands that no sudoers rule granted. One session now does all of it, and install skips that session when the grants on the box are current. Seelager install. -
lager installsets the owner of/etc/lagerwith a root-owned script./usr/local/lib/lager/etc_lager_perms.shreplaces asudo findand a recursivesudo chown. For a symbolic link under/etc/lager, the script changes the owner of the link and never of the file that the link names.lager uninstall --allremoves the script. -
The
lager-clisdist no longer contains test files. The CLI tests moved out of the package, so the copy ofcli/on a box no longer carries them. -
Contributor notes are no longer published on the docs site.
STYLE.md,TRANSLATION.mdand the files underdocs/reference/were live atdocs.lagerdata.com.
Known Limitations
- The MCP token does not encrypt the connection. Port 8100 is plain HTTP, so the token crosses the network in clear text. Keep the box on a network that you trust. The token is off by default. Without it, anything that can reach port 8100 can use the MCP server, including the control and exec tools when you enable them.
- A fresh Lager Box without Docker asks for the sudo password two times. The Docker install is a second session, and no grant covers its commands.

