#!/bin/bash # # install-kiosk.sh # # Installatiescript voor de kiosk-laptop (geluidssysteem gemeenschapshal). # Voert stap 2 t/m 9 uit van de "Kiosk Laptop Setup Guide". # Voer dit script uit NA installatie van Linux Mint Cinnamon, ingelogd # op het av-admin-account (stap 1 van de handleiding). # # Gebruik: # 1. Pas hieronder de INSTELLINGEN aan (goedgekeurde URL's en pop-upbeleid) # 2. chmod +x install-kiosk.sh # 3. sudo ./install-kiosk.sh (vraagt bevestiging) # of: sudo ./install-kiosk.sh --yes (slaat bevestiging over) # # Het script kan in principe veilig opnieuw worden uitgevoerd, maar # controleer telkens de uitvoer. set -euo pipefail # ============================================================================= # INSTELLINGEN — pas dit gedeelte aan naar wens vóórdat je het script draait # ============================================================================= # --- 1. Lijst van goedgekeurde URL's ----------------------------------------- # Dit zijn de tabbladen die automatisch geopend worden wanneer de kiosk # opstart. Voeg zoveel regels toe als nodig. APPROVED_URLS=( "http://vida-24q-a9f0.local/#/panels" "https://www.radiozenders.fm" "https://www.spotify.com" ) # --- 2. Pop-upbeleid ---------------------------------------------------------- # Kies één van de volgende waarden voor POPUP_MODE: # "alle" -> alle pop-ups worden toegestaan (niet aanbevolen) # "geen" -> alle pop-ups worden geblokkeerd (standaard, veiligst) # "sommige" -> pop-ups worden standaard geblokkeerd, behalve voor de # sites die genoemd worden in POPUP_ALLOWED_URLS hieronder POPUP_MODE="sommige" # Alleen relevant wanneer POPUP_MODE="sommige". Gebruik het formaat # "https://voorbeeld.nl/*" (met wildcard) zodat alle pagina's binnen dat # domein zijn toegestaan. POPUP_ALLOWED_URLS=( "https://open.spotify.com/*" "https://accounts.google.com/*" "https://www.facebook.com/*" "https://m.facebook.com/*" ) # ============================================================================= # Vanaf hier hoeft er normaal gesproken niets aangepast te worden. # ============================================================================= # Kleine helperfunctie: zet een bash-array om in een JSON-array (string). json_array() { local arr=("$@") local out="[" local first=true for item in "${arr[@]}"; do if $first; then first=false else out+=", " fi out+="\"${item}\"" done out+="]" echo "$out" } # Zet een volledige URL om naar een "bare origin" (schema://host, zonder pad). # LET OP: Chromium's URLBlocklist/URLAllowlist-filtersyntax werkt NIET zoals # extensie-matchpatterns — een expliciet toegevoegd "/*" pad wordt daar # gelezen als "pad moet letterlijk beginnen met het teken *", wat nooit # matcht met echte URL's. Een kale origin (zonder pad) matcht in die syntax # juist automatisch elk pad binnen dat domein. Voeg hier dus GEEN "/*" toe. url_to_origin_wildcard() { local url="$1" if [[ "$url" =~ ^([a-zA-Z]+://[^/]+) ]]; then echo "${BASH_REMATCH[1]}" else echo "$url" fi } # Bepaal de Chromium-instellingen op basis van POPUP_MODE. case "$POPUP_MODE" in alle) POPUP_SETTING_VALUE=1 POPUP_ALLOWED_JSON="[]" ;; geen) POPUP_SETTING_VALUE=2 POPUP_ALLOWED_JSON="[]" ;; sommige) POPUP_SETTING_VALUE=2 POPUP_ALLOWED_JSON="$(json_array "${POPUP_ALLOWED_URLS[@]}")" ;; *) echo "FOUT: POPUP_MODE moet 'alle', 'geen' of 'sommige' zijn (huidige waarde: '$POPUP_MODE')." >&2 exit 1 ;; esac if [ "${#APPROVED_URLS[@]}" -eq 0 ]; then echo "FOUT: APPROVED_URLS mag niet leeg zijn — voeg minstens één URL toe." >&2 exit 1 fi # Navigatie-toegestane lijst (URLAllowlist): het domein van elke goedgekeurde # starttab, plus de domeinen die nodig zijn voor pop-ups (bv. inloggen bij # Google/Facebook, of de Spotify-webspeler). Zonder deze lijst kan de kiosk # naar willekeurige sites navigeren, ook al staan die niet in APPROVED_URLS. # POPUP_ALLOWED_URLS bevat een "/*"-suffix (nodig voor PopupsAllowedForUrls, # dat WEL matchpattern-syntax gebruikt) — die wordt hier gestript, omdat # URLAllowlist die syntax juist niet gebruikt (zie url_to_origin_wildcard). ALLOWLIST_URLS=() for u in "${APPROVED_URLS[@]}"; do ALLOWLIST_URLS+=("$(url_to_origin_wildcard "$u")") done for u in "${POPUP_ALLOWED_URLS[@]}"; do ALLOWLIST_URLS+=("${u%/\*}") done ALLOWLIST_JSON="$(json_array "${ALLOWLIST_URLS[@]}")" # ----------------------------------------------------------------------------- # 0. Voorafgaande controles # ----------------------------------------------------------------------------- if [ "$(id -u)" -ne 0 ]; then echo "Voer dit script uit met sudo: sudo ./install-kiosk.sh" >&2 exit 1 fi echo "==============================================" echo " Installatie kiosk-laptop" echo "==============================================" echo echo "Goedgekeurde URL's die geopend worden:" for u in "${APPROVED_URLS[@]}"; do echo " - $u" done echo echo "Pop-upbeleid: $POPUP_MODE" if [ "$POPUP_MODE" = "sommige" ]; then echo " Toegestaan voor:" for u in "${POPUP_ALLOWED_URLS[@]}"; do echo " - $u" done fi echo echo "Navigatie is beperkt tot de volgende domeinen (URLAllowlist):" for u in "${ALLOWLIST_URLS[@]}"; do echo " - $u" done echo # Zet AUTO_YES=1 (of geef -y/--yes mee) om de bevestigingsvraag over te slaan AUTO_YES="${AUTO_YES:-0}" for arg in "$@"; do case "$arg" in -y|--yes) AUTO_YES=1 ;; esac done if [ "$AUTO_YES" -ne 1 ]; then read -rp "Dit script maakt een 'kiosk'-gebruiker aan en past LightDM/X11 op deze machine aan. Doorgaan? [j/N] " CONFIRM if [[ ! "$CONFIRM" =~ ^[jJ]$ ]]; then echo "Afgebroken." exit 0 fi else echo "Bevestiging overgeslagen (--yes)." fi # ----------------------------------------------------------------------------- # 1. Systeem bijwerken (onderdeel van handleidingstap 1) # ----------------------------------------------------------------------------- echo echo "--> Systeempakketten bijwerken..." apt update apt full-upgrade -y # ----------------------------------------------------------------------------- # 2. Kiosk-gebruiker aanmaken (vóór het instellen van het wachtwoord — zie # hieronder waarom dit die volgorde moet hebben) # ----------------------------------------------------------------------------- echo echo "--> Gebruiker 'kiosk' aanmaken..." if id "kiosk" &>/dev/null; then echo " Gebruiker 'kiosk' bestaat al, aanmaken wordt overgeslagen." else adduser --disabled-password --gecos "" kiosk fi usermod -aG audio,video,netdev,plugdev kiosk # Wachtwoord voor het 'kiosk'-account is vastgesteld op 'kiosk'. # We schrijven de hash direct weg met usermod -p in plaats van chpasswd, # omdat chpasswd via PAM loopt en de wachtwoordkwaliteitscontrole # (bv. wachtwoord == gebruikersnaam) ook voor root kan blokkeren, # wat dit script niet-interactief zou laten vastlopen. echo echo "--> Wachtwoord voor 'kiosk' instellen..." KIOSK_PASSWORD="kiosk" KIOSK_HASH="$(openssl passwd -6 "${KIOSK_PASSWORD}")" usermod -p "${KIOSK_HASH}" kiosk unset KIOSK_PASSWORD KIOSK_HASH # ----------------------------------------------------------------------------- # 3. Openbox en Chromium installeren # ----------------------------------------------------------------------------- echo echo "--> Openbox, LightDM GTK-greeter en hulpprogramma's installeren..." apt install -y openbox lightdm-gtk-greeter unclutter xdotool pulseaudio-utils echo echo "--> Chromium installeren (deb-pakket, geen snap)..." # Verwijder de snap-versie van Chromium indien aanwezig: deze leest # /etc/chromium/policies/ niet betrouwbaar uit. if snap list chromium &>/dev/null; then echo " Snap-versie van Chromium wordt verwijderd..." snap remove chromium fi apt install -y chromium || apt install -y chromium-browser BROWSER_BIN="$(command -v chromium || command -v chromium-browser || true)" if [ -z "$BROWSER_BIN" ]; then echo "FOUT: geen chromium-programma gevonden na installatie." >&2 exit 1 fi echo " Gebruikte browser: $BROWSER_BIN" # ----------------------------------------------------------------------------- # 4. Chromium-beleid (extensies, pop-ups, incognito etc. blokkeren) # ----------------------------------------------------------------------------- # Let op: de sleutelnamen in dit JSON-bestand (bv. "ExtensionInstallBlocklist") # zijn vaste namen die Chromium herkent en kunnen niet vertaald worden zonder # de werking te breken. JSON ondersteunt bovendien geen commentaarregels. echo echo "--> Chromium-beheerbeleid wegschrijven..." mkdir -p /etc/chromium/policies/managed cat > /etc/chromium/policies/managed/kiosk_policy.json < /etc/kiosk/urls.txt aanmaken op basis van APPROVED_URLS..." mkdir -p /etc/kiosk { echo "# Goedgekeurde kiosk-tabbladen — één URL per regel." echo "# Regels die beginnen met # zijn commentaar en worden genegeerd." for u in "${APPROVED_URLS[@]}"; do echo "$u" done } > /etc/kiosk/urls.txt AV_ADMIN_HOME="/home/av-admin" ADMIN_KIOSK_DIR="${AV_ADMIN_HOME}/kiosk" mkdir -p "$ADMIN_KIOSK_DIR" usermod -aG kiosk av-admin chown root:kiosk /etc/kiosk/urls.txt chmod 664 /etc/kiosk/urls.txt ln -sf /etc/kiosk/urls.txt "${AV_ADMIN_HOME}/urls.txt" chown -h av-admin:av-admin "${AV_ADMIN_HOME}/urls.txt" SCRIPT_PATH="$(readlink -f "$0")" cp "$SCRIPT_PATH" "${AV_ADMIN_HOME}/re-install-kiosk.sh" chmod +x "${AV_ADMIN_HOME}/re-install-kiosk.sh" rm -rf "${AV_ADMIN_HOME}/install-kiosk.sh" chown -R av-admin:admin "$AV_ADMIN_HOME" 2>/dev/null || true # ----------------------------------------------------------------------------- # 6. Opstartscript voor de browser # ----------------------------------------------------------------------------- echo echo "--> /usr/local/bin/kiosk-launch.sh wegschrijven..." cat > /usr/local/bin/kiosk-launch.sh <<'EOF' #!/bin/bash # Start Chromium gemaximaliseerd (niet fullscreen) met de goedgekeurde tabbladen. URL_LIST="/etc/kiosk/urls.txt" BROWSER_BIN="$(command -v chromium || command -v chromium-browser)" if [ -z "$BROWSER_BIN" ]; then echo "Geen chromium-programma gevonden." >&2 exit 1 fi # Lees alle regels die geen commentaar of leeg zijn in een array mapfile -t URLS < <(grep -vE '^\s*#' "$URL_LIST" | grep -vE '^\s*$') if [ ${#URLS[@]} -eq 0 ]; then URLS=("http://localhost/kiosk-home") fi exec "$BROWSER_BIN" \ --start-maximized \ --noerrdialogs \ --disable-infobars \ --disable-session-crashed-bubble \ --disable-translate \ --no-first-run \ --fast \ --fast-start \ --disable-pinch \ --overscroll-history-navigation=0 \ --password-store=basic \ "${URLS[@]}" EOF chmod +x /usr/local/bin/kiosk-launch.sh # ----------------------------------------------------------------------------- # 7. Openbox-sessie voor de kiosk-gebruiker # ----------------------------------------------------------------------------- echo echo "--> Openbox configureren voor 'kiosk'..." sudo -u kiosk mkdir -p /home/kiosk/.config/openbox cat > /home/kiosk/.config/openbox/autostart <<'EOF' # Schermbeveiliging/energiebeheer uitschakelen — deze laptop mag nooit slapen xset s off xset -dpms xset s noblank # Muisaanwijzer verbergen bij inactiviteit unclutter -idle 2 & # Volume bij elke start terugzetten naar 90% en dempen uitschakelen pactl set-sink-volume @DEFAULT_SINK@ 90% & pactl set-sink-mute @DEFAULT_SINK@ 0 & # Bewakingslus: herstart de browser als deze ooit gesloten wordt of vastloopt ( while true; do /usr/local/bin/kiosk-launch.sh sleep 2 done ) & EOF cat > /home/kiosk/.config/openbox/rc.xml <<'EOF' dm-tool switch-to-greeter pactl set-sink-volume @DEFAULT_SINK@ +5% pactl set-sink-volume @DEFAULT_SINK@ -5% pactl set-sink-mute @DEFAULT_SINK@ toggle EOF chown -R kiosk:kiosk /home/kiosk/.config # ----------------------------------------------------------------------------- # 8. LightDM: automatisch inloggen + av-admin-account verbergen # ----------------------------------------------------------------------------- # Let op: de sleutelnamen hieronder (bv. "autologin-user") zijn vaste # LightDM-configuratienamen en kunnen niet vertaald worden. echo echo "--> LightDM automatisch inloggen configureren..." mkdir -p /etc/lightdm/lightdm.conf.d cat > /etc/lightdm/lightdm.conf.d/50-kiosk.conf <<'EOF' [Seat:*] autologin-user=kiosk autologin-user-timeout=0 autologin-session=openbox greeter-hide-users=true allow-guest=false EOF # ----------------------------------------------------------------------------- # 9. Extra beveiliging — virtuele-terminalwissel uitschakelen # ----------------------------------------------------------------------------- echo echo "--> Virtuele-terminalwissel (Ctrl+Alt+F1-F7) en Zap uitschakelen..." mkdir -p /etc/X11/xorg.conf.d cat > /etc/X11/xorg.conf.d/10-no-vtswitch.conf <<'EOF' Section "ServerFlags" Option "DontVTSwitch" "true" Option "DontZap" "true" EndSection EOF # ----------------------------------------------------------------------------- # 10. Script maken waarmee av-admin het Chromium-beleid kan verversen na het # aanpassen van /etc/kiosk/urls.txt, zonder het hele installatiescript # opnieuw te hoeven draaien. # ----------------------------------------------------------------------------- echo echo "--> /etc/kiosk/refresh_policies.sh wegschrijven..." cat > "/etc/kiosk/refresh_policies.sh" <<'REFRESH_EOF' #!/bin/bash # Herstart Chromium op de kiosk zodat gewijzigde /etc/kiosk/urls.txt en # beleidsinstellingen opnieuw ingelezen worden. Voer uit met: sudo ./refresh_policies.sh set -euo pipefail if [ "$(id -u)" -ne 0 ]; then echo "Voer dit script uit met sudo: sudo ./refresh_policies.sh" >&2 exit 1 fi echo "--> Chromium op de kiosk wordt herstart om wijzigingen door te voeren..." pkill -u kiosk chromium 2>/dev/null || pkill -u kiosk chromium-browser 2>/dev/null || true echo " Klaar. De bewakingslus in de kiosk-sessie start de browser automatisch opnieuw." REFRESH_EOF chmod +x "/etc/kiosk/refresh_policies.sh" chown av-admin:av-admin "/etc/kiosk/refresh_policies.sh" ln -sf /etc/kiosk/refresh_policies.sh "${ADMIN_KIOSK_DIR}/refresh_policies.sh" chown -h av-admin:av-admin "${ADMIN_KIOSK_DIR}/refresh_policies.sh" # ----------------------------------------------------------------------------- # Klaar # ----------------------------------------------------------------------------- echo echo "==============================================" echo " Installatie voltooid." echo "==============================================" echo echo "Resterende handmatige stappen:" echo " 1. Controleer /etc/kiosk/urls.txt (of pas APPROVED_URLS hierboven aan" echo " en voer het commando 'sudo ${ADMIN_KIOSK_DIR}/refresh_policies.sh' uit om wijzigingen door te voeren)." echo " 2. Herstart om te testen: sudo reboot" echo " -> zou automatisch moeten inloggen op de schermvullende kiosk-browser." echo " 3. Druk op Ctrl+Alt+L op het kiosk-scherm om het inlogscherm te" echo " bereiken en log in als beheerder om te controleren of het gewone" echo " bureaublad nog werkt." echo echo "LightDM is NIET automatisch herstart, omdat dit je huidige grafische" echo "sessie zou beëindigen. Herstart wanneer je klaar bent:" echo " sudo reboot"