#!/bin/bash set -e # Post-install script for SeniorNet Kiosk ISO # Runs after Debian installation completes echo "==> SeniorNet Kiosk Post-Install" echo REPO_DIR="/home/jgitta/kiosk-browser" HOME_DIR="/home/jgitta/kiosk-home" CHROMIUM_PROFILE="/home/jgitta/chromium-kiosk" # Ensure jgitta user exists if ! id "jgitta" &>/dev/null; then useradd -m -s /bin/bash jgitta fi # Install packages echo "==> Installing dependencies..." apt-get update apt-get install -y python3 python3-pip chromium openbox xserver-xorg xserver-xorg-video-dummy xinit xdotool xprop git sqlite3 xvfb 2>&1 | grep -v "^Reading" # Install Python packages echo "==> Installing Python packages..." pip3 install --break-system-packages PyQt5 websocket-client 2>&1 | tail -5 # Clone repo echo "==> Cloning repository..." if [ ! -d "$REPO_DIR" ]; then git clone https://gitea.jgitta.com/jgitta/senior-kiosk.git "$REPO_DIR" fi cd "$REPO_DIR" # Deploy home screen with config echo "==> Deploying home screen..." mkdir -p "$HOME_DIR" if [ -f config.json ] && [ -f home-screen-index.html ]; then config_json=$(cat config.json | sed 's/\\/\\\\/g' | sed 's/"/\\"/g' | tr '\n' ' ') sed "s|const config = {};|const config = $config_json;|" home-screen-index.html > "$HOME_DIR/index.html" chown jgitta:jgitta "$HOME_DIR/index.html" fi # Create Chromium profile directory mkdir -p "$CHROMIUM_PROFILE" chown -R jgitta:jgitta "$CHROMIUM_PROFILE" # Systemd units echo "==> Installing systemd units..." cat > /etc/systemd/system/kiosk-display.service << 'UNIT1' [Unit] Description=SeniorNet Kiosk Display Before=kiosk.service After=network.target [Service] Type=forking User=jgitta ExecStart=/bin/bash -c 'Xvfb :0 -screen 0 1920x1080x24 -ac &' ExecStartPost=/bin/sleep 2 ExecStartPost=/bin/bash -c 'DISPLAY=:0 su - jgitta -c "openbox &"' ExecStartPost=/bin/sleep 1 [Install] WantedBy=multi-user.target UNIT1 cat > /etc/systemd/system/kiosk.service << 'UNIT2' [Unit] Description=SeniorNet Kiosk After=network.target kiosk-display.service Wants=kiosk-display.service [Service] Type=simple User=jgitta Environment="DISPLAY=:0" WorkingDirectory=/home/jgitta/kiosk-browser ExecStart=/usr/bin/python3 /home/jgitta/kiosk-browser/browser.py Restart=always RestartSec=5 [Install] WantedBy=multi-user.target UNIT2 systemctl daemon-reload systemctl enable kiosk-display.service kiosk.service # kiosk-restart helper cat > /usr/local/bin/kiosk-restart << 'HELPER' #!/bin/bash pkill -f "remote-debugging-port=9222" || true pkill -f "python3.*browser" || true sleep 1 systemctl restart kiosk.service HELPER chmod +x /usr/local/bin/kiosk-restart # Openbox config echo "==> Configuring Openbox..." mkdir -p /home/jgitta/.config/openbox cat > /home/jgitta/.config/openbox/rc.xml << 'OPENBOX' OPENBOX cat > /home/jgitta/.xinitrc << 'XINITRC' #!/bin/bash exec openbox XINITRC chmod +x /home/jgitta/.xinitrc # X11 hardening echo "==> Configuring X11..." cat > /etc/X11/xorg.conf.d/50-kiosk.conf << 'XORG' Section "Device" Identifier "Dummy0" Driver "dummy" EndSection Section "Monitor" Identifier "Monitor0" HorizSync 30-80 VertRefresh 30-75 EndSection Section "Screen" Identifier "Screen0" Device "Dummy0" Monitor "Monitor0" DefaultDepth 24 SubSection "Display" Depth 24 Modes "1920x1080" EndSubSection EndSection Section "ServerFlags" Option "DontVTSwitch" "true" Option "BlankTime" "0" Option "StandbyTime" "0" EndSection XORG # Permissions echo "==> Setting permissions..." chown -R jgitta:jgitta /home/jgitta/.config /home/jgitta/.xinitrc "$REPO_DIR" "$HOME_DIR" # Enable getty on ttys for troubleshooting (optional, comment out for full lockdown) systemctl set-default multi-user.target echo echo "==> Post-install complete" echo " Machine will auto-start kiosk on next boot" echo