Files
LEDMatrix/scripts
ChuckandClaude Opus 5.5 da5937da3d fix: six bugs found testing main on a real Pi (#641)
* fix: six bugs found testing main on a real Pi (ledpi)

- Stopping the service now runs cleanup. systemd stops ledmatrix.service
  with SIGTERM, whose default action ended Python before run()'s finally
  block, so the update worker, Vegas and the panel were never torn down.
  main() now turns SIGTERM into KeyboardInterrupt, the Ctrl-C path.
- "Now showing" no longer turns into "unknown". display_current_state was
  only written on a mode change and the web UI reads it with max_age=120,
  so a live game or a single plugin on screen for longer read as unknown.
  It is republished every 30 s while unchanged.
- Switching Vegas on in the web UI works when it was off at startup. The
  coordinator was only created at startup; the config watcher now flags it
  and the render thread creates it.
- configure_web_sudo.sh finds reboot and poweroff in /usr/sbin. Run as the
  web user it could not, silently dropped their rules and still said it
  granted them, so the web UI's Reboot/Shutdown stopped working.
- check_system_compatibility.sh reports installed packages as installed.
  `dpkg -l | grep -q` under pipefail failed when grep exited early.
- A network failure fetching GitHub repo info logs a WARNING, not ERROR.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs(changelog): fixes found testing on a Pi

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test: run the Linux-only script tests correctly

The sbin-lookup test set PATH=/nonexistent and then could not find bash
itself; call it by absolute path. The dpkg-query stub read $4, but the
package name is the third (last) argument. Both now pass on a Pi.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(display): cover the follower, long-render and startup cases

Review follow-ups on the ledpi fixes:
- The pending Vegas start is applied before the sync-follower branch too
  (_apply_pending_vegas_init), which skips _is_vegas_mode_active() while a
  follower is connected but needs the coordinator for the leader's image.
- _service_pending_changes(), which runs inside Vegas iterations and long
  screens, republishes a stale display_current_state as well; the main
  loop alone could be away for a 240 s Vegas iteration.
- The SIGTERM handler is installed after DisplayController() is built, so a
  stop during parallel plugin loading keeps the default immediate exit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 18:13:49 -04:00
..
2025-12-27 14:15:49 -05:00
2025-12-27 14:15:49 -05:00
2025-12-27 14:15:49 -05:00
2025-12-27 14:15:49 -05:00

Scripts

Helper scripts for installing, repairing, diagnosing and developing LEDMatrix. Most users only ever run the one-shot installer (see the project README); everything else here is for troubleshooting or development.

Status key: keep — part of install/runtime or referenced by docs, CI, tests or code; dev-only — for plugin/core development, not needed on a display; diagnostic — run by hand on a Pi when something is wrong.

Directories

Directory Status What it holds
install/ keep The installers: one-shot, services, sudoers/WiFi permissions, cache setup, and the shared lib_*.sh helpers first_time_install.sh sources
fix_perms/ keep Permission repair scripts, plus the two root helpers the web interface runs through sudo (safe_plugin_rm.sh, safe_pip_install.sh)
utils/ keep Scripts run by systemd units or the web interface (conditional web start, WiFi monitor, update verify, DNS fix, Pixlet config editor, cache clearing)
dev/ dev-only Plugin linking, emulator runner, Vegas density audit, Pillow smoke test
templates/ dev-only dev_preview.html, the page dev_server.py serves

Top-level scripts

Script Status What it does
build_rgbmatrix_nogil.sh keep Rebuilds the rgbmatrix Python binding so SwapOnVSync releases the GIL (docs/SCROLL_PERFORMANCE.md)
check_plugin.py dev-only Renders a plugin across every mode and matrix size and fails on crashes, overflow or golden-image drift
check_release_version.py keep Checks a release tag, CHANGELOG and src.__version__ agree (release-version-check workflow)
check_system_compatibility.sh diagnostic Pre-install check of hardware, OS (Trixie only), kernel, Python, packages, disk and network
dev_server.py dev-only Browser preview server for plugins without the display loop (http://localhost:5001)
diagnose_dependencies.sh diagnostic Investigates pip installs stuck on "Preparing metadata"
diagnose_web_interface.sh diagnostic Checks why the web interface is not reachable
download_pixlet.sh keep Downloads the bundled Pixlet binaries for Starlark apps (also run from the web UI)
emergency_reconnect.sh diagnostic Reconnects to your WiFi network if captive-portal testing leaves the Pi offline
install_dependencies_apt.py keep Dependency installer that tries apt packages first, then pip (installer Step 7, plugin loader)
install_plugin_dependencies.sh diagnostic Installs plugin requirements by hand when the automatic install fails
prove_security.py keep Security property checks run by pre-commit
render_plugin.py dev-only Runs a plugin's update() + display() and saves the frame as a PNG
run_plugin_tests.py dev-only Discovers and runs plugin test suites
scroll_speeds.py keep Shows and tries the scroll speeds your panel can display cleanly
troubleshoot_captive_portal.sh diagnostic Troubleshoots captive-portal WiFi setup after you can SSH back in
update_plugin_repos.py dev-only Pulls the latest ledmatrix-plugins monorepo
verify_installation.sh diagnostic Checks that an installation completed correctly
verify_wifi_setup.sh diagnostic Health check of the WiFi management setup

Candidates for removal

Nothing in the repo (docs, CI, tests, other scripts or code) refers to these. They are kept for now; each one needs an owner decision before it goes.

Script What it does
add_defaults_to_schemas.py One-off: adds missing default values to plugin config schemas
analyze_plugin_schemas.py One-off: reports duplicate/inconsistent fields across plugin schemas
audit_plugins.py AST security audit of plugin code; says it is "designed to run in CI" but no workflow runs it
audit_render_path.py Finds blocking calls reachable from a plugin's display()
sports_scroll_check.py Drives a sports scoreboard scroll on the panel and reports its pacing
test_captive_portal.sh Tests the captive portal from a device connected to the AP
verify_wifi_before_testing.sh Pre-flight check before unplugging Ethernet to test WiFi
dev/test_pillow_compat.py Pillow API smoke test to run after upgrading Pillow