cat <<'SH' > ~/setup-signage.sh
#!/usr/bin/env bash
set -euo pipefail
# === Basisinstellingen ===
TARGET_USER="${SUDO_USER:-$USER}"
TARGET_HOME="$(eval echo "~$TARGET_USER")"
KIOSK_DIR="$TARGET_HOME/kiosk"
AUTOSTART_DIR="$TARGET_HOME/.config/autostart"
ENV_FILE="$KIOSK_DIR/kiosk.env"
# Jouw default /edit-link (realtime weergave)
SHEET_URL_DEFAULT='https://docs.google.com/spreadsheets/d/1zVMa6gGbGdJjblgK7Uw6Dh4YEKDfx1djdFRlgzmylSY/edit?gid=0'
# --- Helpers ---
have() { command -v "$1" >/dev/null 2>&1; }
ask_tty() { # usage: ask_tty "Vraag" "default"
local q="$1" d="${2:-}"
read -rp "$q ${d:+[$d]}: " ans || true
echo "${ans:-$d}"
}
whip_ask() { # usage: whip_ask "Titel" "Vraag" "default"
local title="$1" text="$2" def="${3:-}"
if have whiptail; then
whiptail --title "$title" --inputbox "$text" 0 70 "$def" 3>&1 1>&2 2>&3 || true
else
ask_tty "$text" "$def"
fi
}
whip_yesno() { # returns 0=Yes 1=No
local title="$1" text="$2"
if have whiptail; then
whiptail --title "$title" --yesno "$text" 10 70
return $?
else
read -rp "$text [y/N]: " yn || true
[[ "${yn,,}" =~ ^y ]] && return 0 || return 1
fi
}
echo "== Raspberry Pi infoscherm: installatie =="
# --- Updates & pakketten ---
sudo apt-get update
sudo apt-get install -y --no-install-recommends chromium-browser || true
if ! have chromium-browser; then
sudo apt-get install -y --no-install-recommends chromium
fi
sudo apt-get install -y --no-install-recommends \
unclutter xdotool realvnc-vnc-server fonts-noto fonts-noto-cjk fonts-noto-color-emoji \
whiptail
# Tijdzone
sudo timedatectl set-timezone Europe/Brussels || true
# --- Mappen & basisconfig ---
mkdir -p "$KIOSK_DIR" "$AUTOSTART_DIR"
if [ ! -f "$ENV_FILE" ]; then
cat > "$ENV_FILE" <<EOF
# ==== KIOSK INSTELLINGEN ====
# Google Sheet URL:
SHEET_URL="$SHEET_URL_DEFAULT"
# Rotatie: normal | left | right | inverted
ROTATE="normal"
# Resolutie (leeg = automatisch), bv: "1920x1080"
RESOLUTION=""
# Automatische refresh (seconden). 0 = uit
REFRESH_SECS=0
# Spoof user-agent om "browser niet ondersteund" te vermijden
USER_AGENT_SPOOF=1
USER_AGENT_STRING='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
EOF
chown "$TARGET_USER":"$TARGET_USER" "$ENV_FILE"
fi
# --- URL bevestigen/aanpassen ---
CUR_URL="$(. "$ENV_FILE"; echo "${SHEET_URL:-}")"
NEW_URL="$(whip_ask "Google Sheet" "Plak je Google Sheet-link (enter om huidig te behouden)" "$CUR_URL")"
if [ -n "$NEW_URL" ]; then
sed -i "s|^SHEET_URL=.*$|SHEET_URL=\"$NEW_URL\"|" "$ENV_FILE"
CUR_URL="$NEW_URL"
fi
# --- Auto-refresh keuze ---
# Richtlijn: /edit => realtime (geen refresh nodig), /preview of publish => wรฉl refresh
DEFAULT_REFRESH=0
case "$CUR_URL" in
*"/preview"*|*"pubhtml"* ) DEFAULT_REFRESH=300 ;;
*"/edit"* ) DEFAULT_REFRESH=0 ;;
esac
if whip_yesno "Auto-refresh" "Auto-refresh inschakelen? (Aanrader bij /preview of 'Publiceren op het web')"; then
REFRESH_SET="$(whip_ask "Auto-refresh" "Geef interval in seconden (bv. 300 = 5 min)" "$DEFAULT_REFRESH")"
REFRESH_SET="${REFRESH_SET:-0}"
else
REFRESH_SET=0
fi
sed -i "s|^REFRESH_SECS=.*$|REFRESH_SECS=$REFRESH_SET|" "$ENV_FILE"
# --- Launcher script ---
LAUNCHER="$KIOSK_DIR/kiosk-launcher.sh"
cat > "$LAUNCHER" <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
# Laad instellingen
source "$(dirname "$0")/kiosk.env"
# Wacht tot X/desktop klaar is
export DISPLAY=:0
for i in {1..60}; do
if xset q >/dev/null 2>&1; then break; fi
sleep 1
done
# Verberg cursor en voorkom blanks (X11/XWayland; harmless op Wayland)
unclutter -idle 0 -root >/dev/null 2>&1 &
xset s off || true
xset -dpms || true
xset s noblank || true
# Resolutie/rotatie proberen
OUT="$(xrandr --query 2>/dev/null | awk '/ connected/{print $1; exit}')"
if [ -n "${RESOLUTION:-}" ] && [ -n "$OUT" ]; then
xrandr --output "$OUT" --mode "$RESOLUTION" || true
fi
if [ -n "${ROTATE:-}" ] && [ "$ROTATE" != "normal" ] && [ -n "$OUT" ]; then
xrandr --output "$OUT" --rotate "$ROTATE" || true
fi
# Bepaal Chromium-binary
CHROME_BIN="$(command -v chromium-browser || true)"
[ -z "$CHROME_BIN" ] && CHROME_BIN="$(command -v chromium || true)"
[ -z "$CHROME_BIN" ] && { echo "Chromium niet gevonden"; exit 1; }
# Flags
FLAGS=(--kiosk --incognito
--noerrdialogs --disable-session-crashed-bubble
--check-for-update-interval=31536000
--disable-translate --disable-features=Translate,AutofillServerCommunication)
# User-agent spoof om 'browser niet ondersteund' te vermijden
if [ "${USER_AGENT_SPOOF:-0}" -eq 1 ] && [ -n "${USER_AGENT_STRING:-}" ]; then
FLAGS+=(--user-agent="$USER_AGENT_STRING")
fi
URL="${SHEET_URL:-}"
if [ -z "$URL" ]; then
echo "โ ๏ธ Geen URL ingesteld in $(dirname "$0")/kiosk.env"
exit 1
fi
# Optionele auto-refresh (Ctrl+R via xdotool)
if [ "${REFRESH_SECS:-0}" -gt 0 ]; then
(
while true; do
sleep "$REFRESH_SECS"
CHWIN="$(xdotool search --onlyvisible --class chromium 2>/dev/null | head -n1 || true)"
[ -n "$CHWIN" ] && xdotool key --window "$CHWIN" ctrl+r || true
done
) &
fi
# Herstart Chromium indien afgesloten
while true; do
"$CHROME_BIN" "${FLAGS[@]}" "$URL" || true
sleep 2
done
EOF
chmod +x "$LAUNCHER"
chown "$TARGET_USER":"$TARGET_USER" "$LAUNCHER"
# --- Autostart na login ---
DESKTOP_FILE="$AUTOSTART_DIR/kiosk.desktop"
cat > "$DESKTOP_FILE" <<EOF
[Desktop Entry]
Type=Application
Name=Kiosk
Exec=bash -lc '$LAUNCHER'
X-GNOME-Autostart-enabled=true
EOF
chown "$TARGET_USER":"$TARGET_USER" "$DESKTOP_FILE"
# --- VNC inschakelen ---
sudo systemctl enable --now vncserver-x11-serviced.service || true
# --- Screen blanking via raspi-config uitzetten (indien ondersteund) ---
if have raspi-config; then
sudo raspi-config nonint do_blanking 1 || sudo raspi-config nonint do_blanking 0 || true
fi
# --- Statisch IP (optioneel) ---
if whip_yesno "Vast IP instellen" "Wil je nu een vast IP-adres configureren?"; then
IFACE="$(whip_ask "Netwerkinterface" "Op welke interface (bv. eth0 of wlan0)?" "eth0")"
IPADDR="$(whip_ask "IP-adres" "IP-adres (bv. 172.16.0.60)" "")"
PREFIX="$(whip_ask "Subnet prefix" "Subnet-prefix (bv. 16 voor /16, 24 voor /24)" "16")"
GATEWAY="$(whip_ask "Gateway" "Standaardgateway (bv. 172.16.0.1)" "")"
DNSVAL="$(whip_ask "DNS" "DNS-server(s) gescheiden door komma (bv. 172.16.0.4,8.8.8.8)" "8.8.8.8,8.8.4.4")"
if [ -z "$IFACE" ] || [ -z "$IPADDR" ] || [ -z "$PREFIX" ]; then
echo "โ ๏ธ Onvolledige IP-config. Overgeslagen."
else
if systemctl is-active --quiet NetworkManager && have nmcli; then
CONN="$(nmcli -t -f NAME,DEVICE con show --active | awk -F: -v d="$IFACE" '$2==d{print $1;exit}')"
if [ -z "$CONN" ]; then
CONN="$(nmcli -t -f NAME,DEVICE con show | awk -F: -v d="$IFACE" '$2==d{print $1;exit}')"
[ -z "$CONN" ] && CONN="signage-$IFACE-static"
nmcli con add type ethernet ifname "$IFACE" con-name "$CONN" autoconnect yes || true
fi
nmcli con mod "$CONN" ipv4.method manual ipv4.addresses "$IPADDR/$PREFIX" ipv4.gateway "$GATEWAY" ipv4.dns "${DNSVAL// /,}" ipv6.method ignore || true
nmcli con down "$CONN" >/dev/null 2>&1 || true
nmcli con up "$CONN" || true
echo "โ
Vast IP via NetworkManager ingesteld op $IFACE: $IPADDR/$PREFIX"
else
sudo cp /etc/dhcpcd.conf /etc/dhcpcd.conf.bak.$(date +%s) || true
sudo sed -i "/^interface $IFACE$/,/^$/d" /etc/dhcpcd.conf
sudo bash -lc "cat >> /etc/dhcpcd.conf" <<EOC
interface $IFACE
static ip_address=$IPADDR/$PREFIX
static routers=$GATEWAY
static domain_name_servers=${DNSVAL//,/ }
EOC
sudo systemctl restart dhcpcd || true
echo "โ
Vast IP via dhcpcd ingesteld op $IFACE: $IPADDR/$PREFIX"
fi
fi
fi
echo
echo "โ
Setup rond. Kiosk start automatisch na inloggen."
echo " VNC is geactiveerd (RealVNC), en scherm-blanking is uit."
echo
echo "โน๏ธ Tip voor beste VNC-ervaring: zet desnoods Wayland uit:"
echo " Menu โ Preferences โ Raspberry Pi Configuration โ Advanced โ Wayland: Disable"
echo " en zet Auto Login aan (System-tab). Dit is 1x handmatig instellen."
echo
echo "Je kunt instellingen later wijzigen in: $ENV_FILE"
echo "Reboot nu? (y/N)"
read -r rb
if [[ "${rb,,}" =~ ^y ]]; then sudo reboot; fi
SH
chmod +x ~/setup-signage.sh