Offline CUPS from the normal menu, local-file sites, build-dep install

- CUPS (Addons -> CUPS Printing, from ./install.sh or the Web UI) now
  installs from the offline bundle by itself when the kiosk can't reach
  the Ubuntu archive: lib/config.sh's run_with_offline_fallback switches
  apt to the bundle (kiosk-offline-apt on) around the install and back
  afterwards. No-op on manual installs or when online.
- Fix cups_is_installed reporting "not installed" for an installed CUPS:
  `dpkg -l | grep -q` under install.sh's pipefail fails when grep exits
  early and dpkg takes SIGPIPE. Uses dpkg-query on the one package now.
- Sites: an absolute path (/home/kiosk/docs/menu.pdf) is accepted and
  turned into a percent-encoded file:// URL, identically in the Sites
  menu (sites_parse_url) and the Web UI (parseUrl, with tests). Electron
  42 shows local HTML, PDFs (built-in viewer) and images as-is.
- iso/build-iso.sh checks its build tools (plus the --offline ones) and
  offers to `sudo apt install` what's missing; --install-deps does it
  without asking. --offline now refuses non-amd64 hosts up front.

Tested: offline chroot of the 26.04.1 server filesystem - action_install_cups
installed CUPS + printer-driver-all/hplip/gutenprint from the bundle with
no network and left apt back on normal sources; webui test suite passes;
Electron 42 rendered a file:// PDF and PNG with spaces/# in the path;
build-iso.sh stopped with the install command when apt-utils was missing
and no TTY, and installed it and built the ISO with --install-deps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjz8a58eB5P9sUweqd3NHm
This commit is contained in:
Claude
2026-10-03 13:29:04 +00:00
parent 0b5d958fcc
commit 5792e201b6
9 changed files with 119 additions and 31 deletions
+30
View File
@@ -104,6 +104,36 @@ offline_install_node_modules() {
sudo -u "$KIOSK_USER" tar -xzf "$tarball" -C "$dest"
}
# Quick reachability check for the package mirrors install.sh needs.
have_internet() {
curl -fsS --max-time 8 -o /dev/null http://archive.ubuntu.com/ubuntu/ 2>/dev/null \
|| curl -fsS --max-time 8 -o /dev/null https://deb.nodesource.com/ 2>/dev/null
}
# run_with_offline_fallback CMD [ARGS...]
# Runs CMD normally - but on a kiosk installed from an --offline ISO with
# no internet right now, first points apt at the bundle on this disk
# (kiosk-offline-apt on) and switches it back afterwards, whatever CMD
# returns. Lets apt-based installs (e.g. the CUPS addon) work from the
# normal menus and the Web UI with no extra steps. Everywhere else
# (manual installs, or online) it just runs CMD.
run_with_offline_fallback() {
local restore=0 rc=0
if ! offline_mode_active && [[ -f "$KIOSK_OFFLINE_DIR/apt/Packages" ]] && ! have_internet; then
log_info "No internet - installing from the offline bundle on this disk ($(sed -n 's/^Built: *//p' "$KIOSK_OFFLINE_DIR/bundle-info.txt" 2>/dev/null))"
if sudo kiosk-offline-apt on >/dev/null; then
restore=1
else
log_warning "Couldn't switch apt to the offline bundle - trying normally"
fi
fi
"$@" || rc=$?
if (( restore )); then
sudo kiosk-offline-apt off >/dev/null || true
fi
return "$rc"
}
kiosk_user_exists() {
id "$KIOSK_USER" &>/dev/null
}