feat: stop the updater being launched at all
Build / build (push) Successful in 48s

Closing the popup after the fact left it on screen for the 15-20 seconds
between the updater's version check and the Homebrew Channel running its
init.d hooks. That race cannot be won, so remove it.

/usr/sbin/update is launched on demand by ls-hubd via a manifest, and
ls-hubd.conf lists ManifestsVolatileDirectories under /var - writable,
persistent, and how webOS itself ships manifest updates. A manifest there
with the same id and a higher version replaces the read-only one, so drop
in a copy that keeps every role and permission file and only empties
serviceFiles. Nothing on the bus can start the updater after that: no
version check, no alert, nothing to dismiss. Callers get an immediate
"Service does not exist" rather than a hang, and deleting the file undoes it.

Verified on a CX (webOS 5, 04.60.65) across reboots: no update process,
/tmp/var/log/update.log never created, no alert. Previously that log was
55 kB with two server checks and an _gAlertWindowId per boot. Revert puts
the updater back on the bus.

The manifest, its D-Bus service file and the updater binary are all
discovered from ls-hubd.conf rather than hardcoded. The popup-closing
layer stays as a fallback for when this one is off.

Also tried and rejected, now documented in the README: update-related
settings, masking update.service (no writable unit directory), and
breaking its ping through /var/systemd/system/env/update.env - the ping
does fail, but something else on the bus activates the updater anyway.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Rene Kievits
2026-09-06 02:18:01 +02:00
co-authored by Claude Opus 5
parent ef8b6b96c4
commit 80e2d7e5fa
5 changed files with 374 additions and 67 deletions
+16 -7
View File
@@ -4,19 +4,24 @@ that webOS shows on every boot, without touching the firmware itself.</p>
<p>Blocking the update servers alone does not do it: the updater asks LG about
new firmware around 20 seconds before the Homebrew Channel gets to run its boot
hooks, so on a CX the check succeeds every time and the popup is already up.
Nothing running that late can win the race, so this app closes the popup as
well as blocking the servers.</p>
Nothing running that late can win that race, so this app removes it instead -
it takes the updater off the bus entirely, and the check never happens.</p>
<p>It applies up to five reversible layers and re-applies them on every boot
<p>It applies up to six reversible layers and re-applies them on every boot
through a Homebrew Channel startup hook:</p>
<ul>
<li><b>Stop the updater running</b> - webOS launches /usr/sbin/update on
demand from an ls-hubd manifest. This drops a higher-version manifest into
the writable directory ls-hubd already scans, identical to LG's except
that it lists no service files, so the updater can no longer be launched:
no version check, no popup, nothing to dismiss.</li>
<li><b>Block LG update servers</b> - points snu/su/nsu.lge.com and their TLS
and CDN aliases at 127.0.0.1 in /etc/hosts, which stops the download and
every later check in the session.</li>
<li><b>Close the update popup</b> - closes the alert raised during boot, then
stays subscribed to the notification manager and closes any later one as
it opens.</li>
<li><b>Close the update popup</b> - fallback for a popup that appears anyway:
closes the alert raised during boot, then stays subscribed to the
notification manager and closes any later one as it opens.</li>
<li><b>Delete staged firmware</b> - wipes /mnt/lg/cmn_data/swupdate should the
TV ever manage to download an image.</li>
<li><b>Lock the staging folder</b> - bind-mounts an empty read-only directory
@@ -27,4 +32,8 @@ through a Homebrew Channel startup hook:</p>
</ul>
<p>Requires root and the Homebrew Channel: the app asks the Homebrew Channel to
elevate its own service on first launch. "Remove protection" undoes everything.</p>
elevate its own service on first launch. "Remove protection" undoes everything,
including putting the updater back on the bus.</p>
<p>While the updater layer is on, expect the Software Update screen in Settings
to show an error - it queries the service that is now gone.</p>