During the last weeks I’ve been continuously working on the “image-on-demand” server and the Luci interface. The packages have been split and renamed to be as modular as possible. Developing has been split in the following four packages:
luci-app-attended-sysupgrade
The web interface. Uses JavasScripts XMLHttpRequest
to communicate with ubus
and the upgrade server. Shows basic information to the user.
rpcd-mod-attended-sysupgrade
Has a single sysupgrade function called sysupgrade. It’s a copy of to the Luci sysupgrade function but callable by ubus
. This package may be replaced by a native ubus
call like ubuscall system sysupgrade
rpcd-mod-packagelist
Returns all currently installed packages, ignoring packages that has been installed as a dependency. It works without the need of opkg
installed using /usr/lib/opkg/status
. The packages hence requires t to unset CLEAN_IPKG
on image build. This module is important for routers with less than 4MB of flash storage. The standard package selection does not install opkg
for such small flash devices.
sysupgrade-image-server
The package will install the upgrade server with all dependencies. This especially useful for the planed setup of a single web server and a dynamic amount of workers building the requested images.
In the current implementation a single queue builds one requested image after another. A new approach will separate the we main sever from the building workers. The database is reachable by every worker and they setup ImageBuilders automatically depended on requested images. This could make the service easily scale able distributing the load to zero-conf clients.
The server handles the following tasks:
- Receiving update requests
- Validate request
- Check if new release exists
- If not, check if packages got updates
- Receive image requests
- Validate request
- Check if image already exists
- If not, add image to build queue
- Return status information for the router to show in Luci
- Forward download requests to a file server
- Manage workers
- Starts and stop workers
- Receive created images
- Count downloads
The workers handle the following tasks:
- Request needed Imagebuilders from the main server
- Download, validate and setup Imagebuilder
- Build images and upload to main server
Requesting Images
Do demonstrate how the image requests work I setup a few small scripts. Once called they request the image specified in the json
file. Don’t hesitate to modify the files to perform whatever request you’re interested in.
Depending on the request you receive different status codes:
201 imagebuilder is setting up, retry in a few seconds 206 image is currently building, retry in a few seconds 200 image created
The requests repetitions are handled by the luci-app-attended-sysupgrade
but must be manually retried by the current demo scripts. Eventually a CLI will follow.
Currently the distributions LEDE and LibreMesh are supported.
Future
Soon I’ll create a Pull Request for all three router packages to merge into the OpenWrt community package repo. At that point current installations could install the packages for further testing. All three packages are tested with a virtual x86 machine and a wr841 router.
Currently Secure HTTP is used for image distribution, to improve the security I’ll look into usign to create signatures for all images.
To enable reproducible builds I’ll create an auto generated info page with all information about the image, especially include the Imagebuilders manifest file listing all installed packages with versions.
The Luci view should be more verbose and also able to notify on updates directly after login (opt-in). Currently a simple “update successful” message will notify the user after an update. This could be expanded to a report function to let the update server know which images fail and which work. All gathered information would be helpful to create different release channels.