luci-app-rmm-agent
Current JavaScript/UCI LuCI application for configuring the OpenWrt RMM agent.
It provides:
- enable/disable and service restart;
- HTTPS server URL and polling interval;
- one-time enrollment grant input;
- connectivity targets and tunnel identity path;
- explicit lab-only HTTP override;
- controlled device identity reset for re-enrollment.
The agent package owns /etc/config/rmm-agent and converts UCI values to the existing
/etc/rmm-agent.conf format with mode 0600. Existing enrolled installations are migrated
without replacing their device ID/token. Once enrollment succeeds, the one-time grant is
removed from UCI and is not persisted for reuse.
Place agent/package in an OpenWrt package feed and build/install the LuCI app with either
the shell runtime (rmm-agent) or the production Go runtime (rmm-agent-go-production):
make package/rmm-agent/compile V=s
make package/luci-app-rmm-agent/compile V=s
opkg install rmm-agent_*.ipk luci-app-rmm-agent_*.ipk
On apk-based OpenWrt releases, install the generated .apk packages instead.
Reproducible Docker build
The repository includes a containerized OpenWrt SDK build. By default it uses the
official OpenWrt 25.12.4 ramips/mt7621 SDK for ASUS RT-AX53U and compiles the Go
agent as little-endian MIPS with software floating point. It builds the LuCI
application, the shell agent and the production Go agent together:
docker build \
--file deploy/luci-builder/Dockerfile \
--target artifacts \
--output type=local,dest=dist/rmm-openwrt-25.12.4-ramips-mt7621 \
.
The output directory contains the installable packages and SHA256SUMS.
luci-app-rmm-agent and the shell rmm-agent are architecture-independent. The Go
runtime is architecture-specific and is built as linux/mipsle with
GOMIPS=softfloat by default. Use an SDK from the same OpenWrt release and target as
the router, and set the matching Go architecture when targeting another device. For
example, an x86_64 router needs this additional build argument:
--build-arg RMM_GOARCH=amd64 --build-arg RMM_GOAMD64=v1
Override OPENWRT_SDK_URL and OPENWRT_SDK_SHA256 with --build-arg when building for
another release or target. Install exactly one runtime package: rmm-agent or
rmm-agent-go-production. They intentionally conflict because both own the same service
and executable paths.
Install on OpenWrt 25.12.4
For the ASUS RT-AX53U (ramips/mt7621), copy the production Go runtime and the LuCI
application to the router. Do not copy or install the shell runtime at the same time:
cd dist/rmm-openwrt-25.12.4-ramips-mt7621
sha256sum -c SHA256SUMS
scp \
rmm-agent-go-production-0.5.2-r1.apk \
luci-app-rmm-agent-0.1.0-r1.apk \
root@ROUTER_IP:/tmp/
Then install the locally built, unsigned packages over SSH:
apk add --allow-untrusted \
/tmp/rmm-agent-go-production-0.5.2-r1.apk \
/tmp/luci-app-rmm-agent-0.1.0-r1.apk
/etc/init.d/rpcd restart
/etc/init.d/uhttpd restart
Open LuCI, go to Services → RMM agent, enter the HTTPS server URL and a fresh one-time enrollment grant, enable the agent, save the settings, and start or restart the service. Verify it from SSH with:
/etc/init.d/rmm-agent status
logread -e rmm-agent