Files
lg_update_blocker/docs/description.html
T
Rene KievitsandClaude Opus 5 80e2d7e5fa
Build / build (push) Successful in 48s
feat: stop the updater being launched at all
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>
2026-09-06 02:18:01 +02:00

40 lines
2.2 KiB
HTML

<p><b>LG Update Blocker</b> stops the "a new software version is available" popup
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 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 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> - 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
over it so nothing can be staged again.</li>
<li><b>Turn off auto-update settings</b> - switches off every update related
key that com.webos.settingsservice exposes on your firmware, remembering
the original values.</li>
</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,
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>