fix: shared install_electron_binary() covers both fresh install and upgrade

The upgrade_kiosk() path deleted node_modules then ran npm install but
never checked the binary or set chrome-sandbox permissions — so every
upgrade produced a blank screen.

Changes:
- Extract electron binary verification, fallback downloads, and
  chrome-sandbox chmod 4755 into a shared install_electron_binary()
  function called by both step 17/27 (fresh install) and step 5/6
  (upgrade_kiosk) so neither path can silently skip the permission fix
- Add repair_electron() function: stops display, re-runs
  install_electron_binary, restarts lightdm — no SSH needed
- Wire repair_electron as Advanced menu option 12 "Fix Blank Screen"

https://claude.ai/code/session_01EyjEQLWbTXcZgbMDarf7NU
This commit is contained in:
Claude
2026-06-15 23:38:37 +00:00
parent bd4d4cadc8
commit 0b52ec27fb
+98 -43
View File
@@ -7270,48 +7270,7 @@ PKGJSON
"
sudo -u "$KIOSK_USER" bash -lc "cd '$KIOSK_DIR' && npm install --unsafe-perm"
# Verify electron binary downloaded (npm install succeeds even if the binary download fails)
local electron_bin="$KIOSK_DIR/node_modules/electron/dist/electron"
if [[ ! -f "$electron_bin" ]]; then
log_warning "Electron binary not found after npm install — retrying via install.js..."
sudo -u "$KIOSK_USER" bash -lc "cd '$KIOSK_DIR' && ELECTRON_FORCE_DOWNLOAD=true node node_modules/electron/install.js" || true
fi
# Last resort: direct wget download of the binary zip
if [[ ! -f "$electron_bin" ]]; then
log_warning "Attempting direct wget download of Electron binary..."
local electron_ver
electron_ver=$(sudo -u "$KIOSK_USER" node -e \
"try{console.log(require('$KIOSK_DIR/node_modules/electron/package.json').version)}catch(e){}" 2>/dev/null)
if [[ -n "$electron_ver" ]]; then
local electron_url="https://github.com/electron/electron/releases/download/v${electron_ver}/electron-v${electron_ver}-linux-x64.zip"
log_info "Downloading Electron v${electron_ver} directly (~120MB)..."
local tmp_zip
tmp_zip=$(mktemp --suffix=.zip)
if wget --timeout=300 --tries=3 --show-progress -O "$tmp_zip" "$electron_url" 2>&1; then
sudo -u "$KIOSK_USER" mkdir -p "$KIOSK_DIR/node_modules/electron/dist"
sudo -u "$KIOSK_USER" unzip -o "$tmp_zip" -d "$KIOSK_DIR/node_modules/electron/dist/"
sudo -u "$KIOSK_USER" chmod +x "$electron_bin"
fi
rm -f "$tmp_zip"
fi
fi
if [[ ! -f "$electron_bin" ]]; then
log_error "Electron binary download failed after all attempts."
log_error "Check your internet connection and re-run the installer."
log_error "The binary is downloaded from: https://github.com/electron/electron/releases"
exit 1
fi
log_success "Electron binary verified"
local sandbox="$KIOSK_DIR/node_modules/electron/dist/chrome-sandbox"
if [[ -f "$sandbox" ]]; then
sudo chown root:root "$sandbox"
sudo chmod 4755 "$sandbox"
log_success "Chrome sandbox permissions set"
fi
install_electron_binary || exit 1
sudo -u "$KIOSK_USER" tee "$KIOSK_DIR/start.sh" > /dev/null <<'LAUNCHER'
#!/bin/bash
@@ -10956,6 +10915,91 @@ import_settings() {
pause
}
# Shared helper: verify Electron binary exists, download if missing, fix sandbox perms.
# Called from both fresh install (step 17/27) and upgrade (step 5/6).
install_electron_binary() {
local electron_bin="$KIOSK_DIR/node_modules/electron/dist/electron"
if [[ ! -f "$electron_bin" ]]; then
log_warning "Electron binary missing — retrying via install.js..."
sudo -u "$KIOSK_USER" bash -lc "cd '$KIOSK_DIR' && ELECTRON_FORCE_DOWNLOAD=true node node_modules/electron/install.js" || true
fi
if [[ ! -f "$electron_bin" ]]; then
log_warning "Attempting direct wget download of Electron binary (~120MB)..."
local electron_ver
electron_ver=$(sudo -u "$KIOSK_USER" node -e \
"try{console.log(require('$KIOSK_DIR/node_modules/electron/package.json').version)}catch(e){}" 2>/dev/null)
if [[ -n "$electron_ver" ]]; then
local electron_url="https://github.com/electron/electron/releases/download/v${electron_ver}/electron-v${electron_ver}-linux-x64.zip"
log_info "Downloading Electron v${electron_ver} directly..."
local tmp_zip
tmp_zip=$(mktemp --suffix=.zip)
if wget --timeout=300 --tries=3 --show-progress -O "$tmp_zip" "$electron_url" 2>&1; then
sudo -u "$KIOSK_USER" mkdir -p "$KIOSK_DIR/node_modules/electron/dist"
sudo -u "$KIOSK_USER" unzip -o "$tmp_zip" -d "$KIOSK_DIR/node_modules/electron/dist/"
sudo -u "$KIOSK_USER" chmod +x "$electron_bin"
fi
rm -f "$tmp_zip"
fi
fi
if [[ ! -f "$electron_bin" ]]; then
log_error "Electron binary download failed after all attempts."
log_error "Check your internet connection and re-run the installer."
return 1
fi
log_success "Electron binary verified"
# chrome-sandbox MUST be owned by root and setuid — without this Electron shows a blank screen
local sandbox="$KIOSK_DIR/node_modules/electron/dist/chrome-sandbox"
if [[ -f "$sandbox" ]]; then
sudo chown root:root "$sandbox"
sudo chmod 4755 "$sandbox"
log_success "Chrome sandbox permissions set (required for display)"
fi
}
# Repair option: re-verify/download electron binary and fix sandbox perms without full reinstall
repair_electron() {
clear
echo "════════════════════════════════════════════════════════════"
echo " Fix Blank Screen / Electron Repair"
echo "════════════════════════════════════════════════════════════"
echo
echo "This will:"
echo " 1. Check if Electron binary is present"
echo " 2. Download it if missing (~120MB)"
echo " 3. Fix chrome-sandbox permissions (setuid root)"
echo " 4. Restart the kiosk display"
echo
read -r -p "Continue? [y/N]: " confirm
[[ "$confirm" != "y" && "$confirm" != "Y" ]] && return
echo
sudo systemctl stop lightdm 2>/dev/null || true
sleep 1
if ! install_electron_binary; then
echo
log_error "Could not install Electron. Check internet and retry."
read -r -p "Press Enter..." _; return
fi
echo
log_info "Restarting kiosk display..."
sudo systemctl restart lightdm
sleep 3
if systemctl is-active --quiet lightdm && pgrep -f "electron.*main.js" >/dev/null 2>&1; then
log_success "Kiosk display is running."
else
log_warning "LightDM started but Electron may still be loading."
echo " Check: sudo tail -20 $KIOSK_DIR/../electron.log"
fi
echo
read -r -p "Press Enter to return..." _
}
upgrade_kiosk() {
clear
echo "══════════════════════════════════════════════════════════"
@@ -11075,12 +11119,21 @@ upgrade_kiosk() {
sudo chown -R "$KIOSK_USER:$KIOSK_USER" "$KIOSK_DIR"
echo "[5/6] Installing npm dependencies..."
sudo -u "$KIOSK_USER" bash -lc "
npm config set fetch-timeout 600000
npm config set fetch-retries 5
npm config set fetch-retry-mintimeout 30000
npm config set fetch-retry-maxtimeout 300000
"
if sudo -u "$KIOSK_USER" bash -lc "cd '$KIOSK_DIR' && npm install --unsafe-perm" 2>&1 | tail -5; then
log_success "npm install complete"
else
log_warning "npm install may have had issues"
fi
# Verify and fix Electron binary + chrome-sandbox (same logic as fresh install)
install_electron_binary
# Restore config
if [[ -f "$config_backup" ]]; then
sudo cp "$config_backup" "$CONFIG_PATH"
@@ -11549,9 +11602,10 @@ advanced_menu() {
echo " 9. Import Settings"
echo " 10. Emergency Hotspot"
echo " 11. Network Test"
echo " 12. Fix Blank Screen (Electron repair)"
echo " 0. Return"
echo
read -r -p "Choose [0-11]: " choice
read -r -p "Choose [0-12]: " choice
case "$choice" in
1) manual_electron_update ;;
@@ -11565,6 +11619,7 @@ advanced_menu() {
9) import_settings ;;
10) configure_emergency_hotspot ;;
11) network_test ;;
12) repair_electron ;;
0) return ;;
esac
done