Files
small-packages/luci-theme-footstrap/owlab.yaml
T
2026-09-20 01:22:33 +08:00

281 lines
14 KiB
YAML

# Dev routers for this theme, via owlab (https://github.com/owfeed/owlab).
#
# owlab up build and start every router
# owlab sync --watch rebuild the CSS and push it on every edit
# owlab open owrt2512 open LuCI in a browser
# owlab doctor what this machine supports
#
# Four routers rather than one, because the three axes that change how this theme renders are the
# package manager (apk on 25.12, opkg on 24.10), the LuCI feed (upstream vs a fork's patched one)
# and the release. Only all four boxes cover every pairing.
version: 1
project:
name: luci-theme-footstrap
theme: footstrap
# The package lives in a subdirectory, so the install mapping is stated rather than defaulted.
install:
luci-theme-footstrap/htdocs: /www
luci-theme-footstrap/ucode: /usr/share/ucode/luci
luci-theme-footstrap/root: /
# cascade.css is concatenated from styles/ and is not in the tree. Without this a sync copies
# everything except the file LuCI asks for, and the router serves a 404 for its own stylesheet.
build: ./luci-theme-footstrap/build-css.sh luci-theme-footstrap/htdocs/luci-static/footstrap/cascade.css --dev
# Runs on the router after every sync: the half of an install that copying files does not cover.
# The package's own uci-defaults registers the theme, and owlab's `theme:` above then selects it.
#
# Registration is written out rather than sourced from root/etc/uci-defaults/30_luci-theme-footstrap,
# because sync deliberately never overwrites /etc/uci-defaults — that directory is router state.
post_sync: |
uci -q set luci.themes.Footstrap=/luci-static/footstrap
uci -q commit luci
# Every asset is served as `?v=<PKG_VERSION>-<pkgs_update_time>`, the mtime of the package
# database, which a sync never touches — so the browser keeps the modules it has and the page
# runs a mixture of old and new. Both paths, because which one exists depends on the release
# (docs/development.md, "Caches while iterating").
for db in /lib/apk/db/installed /usr/lib/opkg/status; do [ -f "$db" ] && touch "$db"; done
rm -rf /www/luci-static/footstrap-top /usr/share/ucode/luci/template/themes/footstrap-top
defaults:
fidelity: basic
arch: auto
# Everything, including the seeded wireless config: this theme has to style the wireless pages
# too, and they render from UCI with no radios present.
fixtures: [all]
# Added ON TOP of owlab's stock set, which is already what a shipping OpenWrt router has. Every
# entry is prefixed with +, so this list adds rather than replacing — an unprefixed list would
# define the router outright and drop everything owlab installs by default.
#
# Entries the stock set also contains are kept rather than trimmed: this file is the theme's test
# surface, and each name here is something the theme is checked against.
#
# It is long on purpose. A stock router renders a handful of menus, and the sections, tabs, tables
# and widgets that need styling live in the apps.
#
# curl is deliberately absent: it is not in OpenWrt's default set, and the uclient-fetch fallback
# exists precisely because of that. Installing it here would hide that bug class on the dev box.
packages:
- +luci
- +luci-app-firewall
- +luci-app-package-manager
- +luci-app-opkg
- +luci-app-banip
- +luci-app-adblock
- +luci-app-ddns
- +luci-app-upnp
- +luci-app-statistics
- +luci-app-nlbwmon
- +luci-app-sqm
- +luci-app-vnstat2
- +luci-app-wol
- +luci-app-watchcat
- +luci-app-filemanager
- +luci-app-ttyd
- +luci-app-https-dns-proxy
- +luci-app-mwan3
- +luci-app-acme
- +luci-app-samba4
- +luci-app-openvpn
- +luci-proto-wireguard
- +luci-proto-openconnect
- +luci-mod-dashboard
- +luci-app-attendedsysupgrade
- +wpad-basic-mbedtls
- +wifi-scripts
- +iw
- +iwinfo
- +hostapd-utils
# dropbear ships no sftp-server and OpenSSH 9+ scp speaks SFTP by default, so without this every
# scp against the box fails. The one package here that is not about fidelity.
- +openssh-sftp-server
# The Russian catalogues, one per app above, pinned here after the first RU sweep found three
# overflow faults English never showed: RU strings run longer, and this theme's gates rendered
# English only until 2026-09-06, so a caption that clips at a Cyrillic length went unmeasured.
# The sweep installed these by hand; without a pin here the next `owlab up` would wipe them and
# the next sweep would start over. One entry per luci-app-* above that ships a translation —
# `luci-i18n-opkg-ru`, `-wireguard-ru` and `-openconnect-ru` are deliberately ABSENT: neither
# feed (25.12/apk, 24.10/opkg) publishes them, and `owlab up` fails resolving a name neither has.
- +luci-i18n-base-ru
- +luci-i18n-firewall-ru
- +luci-i18n-package-manager-ru
- +luci-i18n-banip-ru
- +luci-i18n-adblock-ru
- +luci-i18n-ddns-ru
- +luci-i18n-upnp-ru
- +luci-i18n-statistics-ru
- +luci-i18n-nlbwmon-ru
- +luci-i18n-sqm-ru
- +luci-i18n-vnstat2-ru
- +luci-i18n-wol-ru
- +luci-i18n-watchcat-ru
- +luci-i18n-filemanager-ru
- +luci-i18n-ttyd-ru
- +luci-i18n-https-dns-proxy-ru
- +luci-i18n-mwan3-ru
- +luci-i18n-acme-ru
- +luci-i18n-samba4-ru
- +luci-i18n-openvpn-ru
- +luci-i18n-dashboard-ru
- +luci-i18n-attendedsysupgrade-ru
routers:
- id: owrt2512
# 25.12.4, NOT .5: the stand builds from openwrt/rootfs:x86_64-<release> and that tag has to
# EXIST in the registry — 25.12.5 publishes none, so `owlab up` cannot resolve it. CI's build.yml
# pins the same number for the same reason and the two must not drift. Check
# `docker manifest inspect openwrt/rootfs:x86_64-<release>` before bumping either.
release: "25.12.4"
ports: { http: 8025, ssh: 2225 }
# Third-party apps whose stylesheets this theme has to share a document with. They are the
# hardest case the theme handles, and no text file can reason about them: justclash ships no
# .css at all — every rule is built from its view JS at runtime.
#
# Unsigned dev fixtures: pinned to exact releases and installed without signature verification.
# Nothing here ships.
#
# Anchored here and aliased onto the other three RELEASE routers, not `defaults:` — owlab's
# `extra_packages` merge is additive only (append(default, router), no subtraction syntax,
# internal/config/config.go), so a router-scoped list has to start from a router, not from a
# default every router inherits. `owrtsnap` below carries no alias: these three are pinned
# builds against release branches (openclash/ssclash need kmod-tun, which resolves through a
# kmods index keyed to the box's exact kernel git hash) and the snapshot box's baked kernel is
# never the one downloads.openwrt.org/snapshots is currently publishing kmods for — confirmed
# 2026-09-07: `apk add` 404s the kmods packages.adb for the running 6.18.33 hash and both apps
# fail to resolve `kmod-tun`, while justclash (no kernel module) installs cleanly on the same
# box. `owlab up` reported that partial result as its own exit 1 (by design — see
# `reportMissingExtras` in owlab's own source), which the fix is to stop asking for.
extra_packages: &third_party_apps
- name: luci-app-openclash
apk: https://github.com/vernesong/OpenClash/releases/download/v0.47.116/luci-app-openclash-0.47.116.apk
ipk: https://github.com/vernesong/OpenClash/releases/download/v0.47.116/luci-app-openclash_0.47.116_all.ipk
- name: luci-app-justclash
apk: https://github.com/SaltyMonkey/justclash/releases/download/v0.73.0/luci-app-justclash-0.73.0-r1.apk
ipk: https://github.com/SaltyMonkey/justclash/releases/download/v0.73.0/luci-app-justclash-0.73.0-r1-all.ipk
# ssclash embeds the Ace editor, which inserts its stylesheets as the FIRST child of <head>,
# and lazily, adding more on first hover. That is the one adversary that can invert the
# cascade layer order (docs/css.md), and neither of the two above can produce it: a sheet
# that lands ahead of cascade.css is a different attack on the chrome from one that outranks
# it.
- name: luci-app-ssclash
apk: https://github.com/zerolabnet/ssclash/releases/download/v4.7.0/luci-app-ssclash-4.7.0-r1.apk
ipk: https://github.com/zerolabnet/ssclash/releases/download/v4.7.0/luci-app-ssclash_4.7.0-r1_all.ipk
- id: owrt2410
release: "24.10.8"
ports: { http: 8024, ssh: 2224 }
extra_packages: *third_party_apps
- id: imm2512
distro: immortalwrt
release: "25.12.1"
ports: { http: 8026, ssh: 2226 }
extra_packages: *third_party_apps
- id: imm2410
distro: immortalwrt
release: "24.10.6"
ports: { http: 8027, ssh: 2227 }
extra_packages: *third_party_apps
# A SNAPSHOT box, because the installer has a path only it takes: `SNAPSHOT` parses to no feed
# branch, so the script asks the feed for the newest one its package manager can read, and
# everything about that path is unreachable on a release router. It is also the userland the theme
# is least tested against, since it tracks luci-base's master rather than a release branch.
#
# No `extra_packages` here, on purpose: see the comment on owrt2512's `&third_party_apps` for the
# kmod-tun / kmods-index mismatch that makes openclash and ssclash permanently unresolvable on
# this box. The theme still installs and every other gate this leg runs still runs.
#
# THE ORDINARY `packages:` LIST ABOVE CAN ALSO INSTALL SHORT HERE, and unlike the kmod-tun case
# this is not permanent and carries no fix to pin against: `feeds/luci` and `feeds/packages` are
# two git repos built into the snapshot index independently, and a `luci-app-*`/binary pair can
# briefly disagree while one side has moved and the other has not yet mirrored. Task 0177 caught
# this from a scroll-anchor finding (owrtsnap @1440 side compact, Overview showing 12
# `.cbi-section` against owrt2512's 13) and named `luci-app-https-dns-proxy` as the absentee. By
# task 0178 that package installed clean on every stand and the absentee was `luci-app-mwan3`
# instead — no `90_mwan3.js`, and `/var/log/apk.log` on the same boot showed `ERROR: unable to
# select packages` for `mwan3`, `nlbwmon`, `openvpn` and `sqm` together. Two different names in
# two sessions is the finding: THE SET DRIFTS, so neither name belongs in this comment as if it
# were fixed. To check what is missing TODAY: `apk info -e <pkg>` for a `+luci-app-*` above
# against `owrtsnap`, or `grep 'unable to select' /var/log/apk.log` on that box, or just compare
# the Overview's `.cbi-section` count (or DOM count) against a release stand before treating a
# snapshot-only difference as a theme finding. Not pinned: `packages:` here has no version syntax,
# and a hard pin would go stale as the snapshot feed prunes old builds (unlike a release branch,
# which keeps them for the branch's life).
- id: owrtsnap
release: "snapshot"
# ssh 2228, NOT 2222: 2222 is the port a developer machine's own sshd usually listens on, and
# docker refuses the bind with "address already in use" — which is why this stand had never come
# up, and why every gate that claimed the snapshot line was measuring two routers instead of
# three. docs/development.md, "The stand's own traps".
ports: { http: 8022, ssh: 2228 }
# ---- second instances of the three OpenWrt lines, for parallel measurement ----
#
# Not more coverage — the SAME three lines a second time. Added 2026-09-09, when a day of
# concurrent anchor work kept colliding on five stands: one agent held owrt2512/owrt2410/owrtsnap
# for a full three-engine sweep, a second was told to use the ImmortalWrt boxes because nothing
# else was free, and a measurement about the theme was very nearly made on the wrong distro. The
# maintainer's rule is that a behaviour claim needs 24.10, 25.12 and snapshot; imm* answers a
# question about the brand instead. So the answer to contention is more OpenWrt, never a
# substitute.
#
# Same releases and the same third-party fixtures as their originals, so a finding on `-b`
# carries exactly as much weight as one on the original. Ports: http 8045/8034/8032, ssh
# 2245/2234/2232 — each an original's port plus 20 (2512b) or 10 (2410b, snapb), clear of 2222 for
# the reason owrtsnap's comment gives.
- id: owrt2512b
release: "25.12.4"
ports: { http: 8045, ssh: 2245 }
extra_packages: *third_party_apps
- id: owrt2410b
release: "24.10.8"
ports: { http: 8034, ssh: 2234 }
extra_packages: *third_party_apps
- id: owrtsnapb
release: "snapshot"
ports: { http: 8032, ssh: 2232 }
# ---- third and fourth instances, one set per browser engine ----
#
# Added 2026-09-12. `-b` answered contention between two people; this answers contention inside
# ONE sweep. `tools/scroll-anchor.mjs --full` is 276 runs per engine, and running the three
# engines in one process against one set of stands takes chromium's zygote down about two minutes
# in (docs/development.md, "The stand's own traps") — so the sweep was being run one engine at a
# time, ~25 min each, three quarters of a 20-core machine idle throughout. Three sets means three
# separate node processes, each with its own engine AND its own routers: no shared browser server
# to lose, and no two contexts hitting one uhttpd.
#
# Same releases and the same third-party fixtures as their originals, so a finding on `-c` or
# `-d` carries exactly as much weight as one on the original. Ports: `-c` is `-b` plus 10
# (8055/8044/8042, ssh 2255/2244/2242), `-d` is `-c` plus 10 (8065/8054/8052, ssh 2265/2254/2252),
# all clear of 2222.
- id: owrt2512c
release: "25.12.4"
ports: { http: 8055, ssh: 2255 }
extra_packages: *third_party_apps
- id: owrt2410c
release: "24.10.8"
ports: { http: 8044, ssh: 2244 }
extra_packages: *third_party_apps
- id: owrtsnapc
release: "snapshot"
ports: { http: 8042, ssh: 2242 }
- id: owrt2512d
release: "25.12.4"
ports: { http: 8065, ssh: 2265 }
extra_packages: *third_party_apps
- id: owrt2410d
release: "24.10.8"
ports: { http: 8054, ssh: 2254 }
extra_packages: *third_party_apps
- id: owrtsnapd
release: "snapshot"
ports: { http: 8052, ssh: 2252 }