feat: generic user, dynamic paths, simplified ISO build pipeline
This commit is contained in:
+124
-122
@@ -1,161 +1,163 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Post-install script for SeniorNet Kiosk ISO
|
||||
# Runs after Debian installation completes
|
||||
# SeniorNet Kiosk setup script.
|
||||
# Runs on first boot via kiosk-firstboot.service (which gives it a real TTY).
|
||||
# Can also be run manually: sudo bash install-kiosk.sh
|
||||
|
||||
echo "==> SeniorNet Kiosk Post-Install"
|
||||
REPO_BASE="https://gitea.jgitta.com/jgitta/senior-kiosk/raw/branch/master"
|
||||
|
||||
clear
|
||||
echo "============================================"
|
||||
echo " SeniorNet Kiosk — First-Boot Setup"
|
||||
echo "============================================"
|
||||
echo
|
||||
|
||||
REPO_DIR="/home/jgitta/kiosk-browser"
|
||||
HOME_DIR="/home/jgitta/kiosk-home"
|
||||
CHROMIUM_PROFILE="/home/jgitta/chromium-kiosk"
|
||||
# ── Prompt for user details ────────────────────────────────────────
|
||||
while true; do
|
||||
read -rp "Enter a username for this kiosk (e.g. mary): " KIOSK_USER
|
||||
KIOSK_USER=$(echo "$KIOSK_USER" | tr '[:upper:]' '[:lower:]' | tr -cd 'a-z0-9_-')
|
||||
if [ -n "$KIOSK_USER" ]; then break; fi
|
||||
echo " Invalid — use only letters, numbers, hyphens, underscores."
|
||||
done
|
||||
|
||||
# Ensure jgitta user exists
|
||||
if ! id "jgitta" &>/dev/null; then
|
||||
useradd -m -s /bin/bash jgitta
|
||||
while true; do
|
||||
read -rp "Enter the senior's display name (e.g. Mary Smith): " KIOSK_NAME
|
||||
if [ -n "$KIOSK_NAME" ]; then break; fi
|
||||
echo " Name cannot be empty."
|
||||
done
|
||||
|
||||
echo
|
||||
echo " Username : $KIOSK_USER"
|
||||
echo " Name : $KIOSK_NAME"
|
||||
echo
|
||||
read -rp "Proceed with setup? [Y/n] " CONFIRM
|
||||
if [[ "$CONFIRM" =~ ^[Nn] ]]; then echo "Aborted."; exit 1; fi
|
||||
echo
|
||||
|
||||
# ── Paths ──────────────────────────────────────────────────────────
|
||||
KIOSK_HOME="/home/$KIOSK_USER"
|
||||
REPO_DIR="$KIOSK_HOME/kiosk-browser"
|
||||
HOME_DIR="$KIOSK_HOME/kiosk-home"
|
||||
CHROMIUM_PROFILE="$KIOSK_HOME/chromium-kiosk"
|
||||
|
||||
# ── User ───────────────────────────────────────────────────────────
|
||||
echo "==> Creating user $KIOSK_USER..."
|
||||
if ! id "$KIOSK_USER" &>/dev/null; then
|
||||
useradd -m -s /bin/bash -c "$KIOSK_NAME" "$KIOSK_USER"
|
||||
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"
|
||||
# ── Packages ───────────────────────────────────────────────────────
|
||||
echo "==> Installing packages..."
|
||||
apt-get update -qq
|
||||
apt-get install -y \
|
||||
chromium \
|
||||
openbox \
|
||||
lightdm \
|
||||
xserver-xorg \
|
||||
xdotool \
|
||||
xprop \
|
||||
python3 \
|
||||
python3-pyqt5 \
|
||||
python3-pip \
|
||||
sqlite3 \
|
||||
git \
|
||||
curl \
|
||||
openssh-server \
|
||||
2>&1 | grep -Ev "^(Reading|Selecting|Preparing|Unpacking|Setting|Processing|Triggers|Get)"
|
||||
|
||||
# Install Python packages
|
||||
echo "==> Installing Python packages..."
|
||||
pip3 install --break-system-packages PyQt5 websocket-client 2>&1 | tail -5
|
||||
echo "==> Installing websocket-client..."
|
||||
pip3 install --break-system-packages websocket-client 2>&1 | tail -2
|
||||
|
||||
# Clone repo
|
||||
echo "==> Cloning repository..."
|
||||
# ── Kiosk repo ─────────────────────────────────────────────────────
|
||||
echo "==> Cloning kiosk repo..."
|
||||
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
|
||||
# ── Home screen ────────────────────────────────────────────────────
|
||||
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
|
||||
config_json=$(cat "$REPO_DIR/config.json" | tr '\n' ' ')
|
||||
sed "s|const config = {};|const config = $config_json;|" \
|
||||
"$REPO_DIR/home-screen-index.html" > "$HOME_DIR/index.html"
|
||||
|
||||
# Create Chromium profile directory
|
||||
# ── Chromium profile ───────────────────────────────────────────────
|
||||
mkdir -p "$CHROMIUM_PROFILE"
|
||||
chown -R jgitta:jgitta "$CHROMIUM_PROFILE"
|
||||
|
||||
# Systemd units
|
||||
echo "==> Installing systemd units..."
|
||||
# ── LightDM auto-login ─────────────────────────────────────────────
|
||||
echo "==> Configuring LightDM auto-login..."
|
||||
mkdir -p /etc/lightdm/lightdm.conf.d
|
||||
cat > /etc/lightdm/lightdm.conf.d/50-kiosk.conf << EOF
|
||||
[Seat:*]
|
||||
autologin-user=$KIOSK_USER
|
||||
autologin-user-timeout=0
|
||||
user-session=openbox
|
||||
EOF
|
||||
|
||||
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
|
||||
# ── Openbox ────────────────────────────────────────────────────────
|
||||
echo "==> Configuring Openbox..."
|
||||
mkdir -p /home/jgitta/.config/openbox
|
||||
mkdir -p "$KIOSK_HOME/.config/openbox"
|
||||
|
||||
cat > /home/jgitta/.config/openbox/rc.xml << 'OPENBOX'
|
||||
cat > "$KIOSK_HOME/.config/openbox/rc.xml" << 'EOF'
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<openbox_config xmlns="http://openbox.org/3.4/rc">
|
||||
<startup/>
|
||||
</openbox_config>
|
||||
OPENBOX
|
||||
EOF
|
||||
|
||||
cat > /home/jgitta/.xinitrc << 'XINITRC'
|
||||
cat > "$KIOSK_HOME/.config/openbox/autostart" << 'EOF'
|
||||
(while true; do
|
||||
python3 ~/kiosk-browser/browser.py
|
||||
sleep 2
|
||||
done) &
|
||||
EOF
|
||||
|
||||
# ── kiosk-restart helper ───────────────────────────────────────────
|
||||
cat > /usr/local/bin/kiosk-restart << 'EOF'
|
||||
#!/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
|
||||
pkill -f "remote-debugging-port=9222" || true
|
||||
pkill -f "python3.*browser" || true
|
||||
sleep 1
|
||||
echo "Kiosk restarted — new code is live"
|
||||
EOF
|
||||
chmod +x /usr/local/bin/kiosk-restart
|
||||
|
||||
# ── X11 hardening ──────────────────────────────────────────────────
|
||||
echo "==> Hardening X11..."
|
||||
mkdir -p /etc/X11/xorg.conf.d
|
||||
cat > /etc/X11/xorg.conf.d/50-kiosk.conf << 'EOF'
|
||||
Section "ServerFlags"
|
||||
Option "DontVTSwitch" "true"
|
||||
Option "BlankTime" "0"
|
||||
Option "StandbyTime" "0"
|
||||
Option "DontZap" "true"
|
||||
Option "BlankTime" "0"
|
||||
Option "StandbyTime" "0"
|
||||
EndSection
|
||||
XORG
|
||||
EOF
|
||||
|
||||
# Permissions
|
||||
# ── SSH: allow root login for admin ───────────────────────────────
|
||||
sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
|
||||
|
||||
# ── Permissions ────────────────────────────────────────────────────
|
||||
echo "==> Setting permissions..."
|
||||
chown -R jgitta:jgitta /home/jgitta/.config /home/jgitta/.xinitrc "$REPO_DIR" "$HOME_DIR"
|
||||
chown -R "$KIOSK_USER:$KIOSK_USER" \
|
||||
"$KIOSK_HOME/.config" \
|
||||
"$REPO_DIR" \
|
||||
"$HOME_DIR" \
|
||||
"$CHROMIUM_PROFILE"
|
||||
|
||||
# Enable getty on ttys for troubleshooting (optional, comment out for full lockdown)
|
||||
systemctl set-default multi-user.target
|
||||
# ── Enable LightDM, remove first-boot service ─────────────────────
|
||||
systemctl enable lightdm
|
||||
systemctl set-default graphical.target
|
||||
systemctl disable kiosk-firstboot 2>/dev/null || true
|
||||
rm -f /etc/systemd/system/kiosk-firstboot.service
|
||||
systemctl daemon-reload
|
||||
|
||||
echo
|
||||
echo "==> Post-install complete"
|
||||
echo " Machine will auto-start kiosk on next boot"
|
||||
echo "============================================"
|
||||
echo " Setup complete!"
|
||||
echo " Kiosk will start after reboot as: $KIOSK_NAME ($KIOSK_USER)"
|
||||
echo "============================================"
|
||||
echo
|
||||
read -rp "Press Enter to reboot..."
|
||||
reboot
|
||||
|
||||
Reference in New Issue
Block a user