Files
kiosk-prod-screens/kiosk-manager.sh
T
2026-05-27 22:00:48 +02:00

176 lines
6.7 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# kiosk-manager.sh — konfiguracja X11 + lewy ekran: Chromium
# Plik docelowy: /home/kiosk/kiosk-manager.sh
# Jawnie ustawiamy HOME — serwis może startować jako root (xinit bez User=kiosk),
# a LibreOffice szuka profilu w $HOME/.config/libreoffice/ (nie w /home/kiosk/).
# Wszystkie procesy potomne (soffice, chromium) dziedziczą tę wartość.
export HOME=/home/kiosk
KIOSK_HOST="diluals31"
KIOSK_URL="http://diluals31/terminal/ift/5/DE/index"
WAITING_PAGE="file:///home/kiosk/waiting.html"
OUTPUT_LEFT="DP-1"
OUTPUT_RIGHT="HDMI-1"
RES_W=1920
RES_H=1080
# ─── Niewidoczny kursor ──────────────────────────────────────────────────────
# Tworzymy motyw XCursor (1×1 px, ARGB 0x00000000) i eksportujemy XCURSOR_THEME
# zanim uruchomią się Chromium i LibreOffice — dziedziczą środowisko procesu.
# Brak myszy w kiosku nie usuwa kursora X11; bez tego wskaźnik jest widoczny
# w środku między ekranami (domyślna pozycja X11 = centrum wirtualnego desktopa).
_BLANK_DIR="/home/kiosk/.icons/blank/cursors"
mkdir -p "$_BLANK_DIR"
# printf pisze binarnie bezpośrednio do pliku — nie przez zmienną (bash $() ucina null-byte'y)
for _n in left_ptr default pointer crosshair text watch wait move size_all fleur; do
printf '\x58\x63\x75\x72\x10\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x02\x00\xfd\xff\x01\x00\x00\x00\x1c\x00\x00\x00\x24\x00\x00\x00\x02\x00\xfd\xff\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00' > "$_BLANK_DIR/$_n"
done
printf '[Icon Theme]\nName=blank\n' > /home/kiosk/.icons/blank/index.theme
export XCURSOR_THEME=blank
export XCURSOR_SIZE=1
# Dual-screen rozszerzony: lewy ekran primary, prawy po prawej
# --auto wykrywa tryb automatycznie (bezpieczniejsze niż --mode 1920x1080)
xrandr --output "$OUTPUT_LEFT" --auto --primary --pos 0x0
xrandr --output "$OUTPUT_RIGHT" --auto --right-of "$OUTPUT_LEFT"
# Rozszerz wirtualny framebuffer 200 px poniżej ekranów — kursor trafi w ten obszar
# i nie będzie widoczny na żadnym fizycznym monitorze (bez potrzeby dodatkowych pakietów)
xrandr --fb "$((RES_W * 2))x$((RES_H + 200))"
echo "[kiosk-manager] Konfiguracja xrandr:"
xrandr | grep -E "connected|[0-9]+x[0-9]+\+"
# Czarne tło na obu ekranach
xsetroot -solid black
# Wyłącz wygaszacz ekranu i DPMS (kiosk działa non-stop)
xset s off
xset -dpms
xset s noblank
# Przesuń kursor poniżej fizycznych ekranów — w obszar framebuffera bez outputu
# Kursor istnieje w X11, ale nie jest wyświetlany na żadnym monitorze
xdotool mousemove "$RES_W" "$((RES_H + 100))"
# Uruchom lekki WM — wymagany do per-screen fullscreen przez wmctrl
openbox --sm-disable &
sleep 0.5
# ─── Start aplikacji ─────────────────────────────────────────────────────────
# Konfiguracja LO (wyłączenie konsoli prezentera) jest zarządzana przez
# presentation-manager.sh → start_lo() via -env:UserInstallation=/tmp/lo-kiosk-profile
# Uruchom menedżera prezentacji w tle (prawy ekran)
/home/kiosk/presentation-manager.sh &
# Watchdog sesji: ukrywa okna konsoli LibreOffice przez cały czas trwania sesji X.
# Uruchomiony tu — nie czeka na SMB, działa od startu X niezależnie od timing'u LO.
(
while sleep 0.4; do
for _wid in $(xdotool search --class soffice --onlyvisible 2>/dev/null); do
_wx=$(xdotool getwindowgeometry "$_wid" 2>/dev/null \
| awk '/Position:/{split($2,a,","); print a[1]+0}')
if [ "${_wx:-0}" -lt 1920 ]; then
wmctrl -i -r "$_wid" -b remove,above 2>/dev/null
wmctrl -i -r "$_wid" -b add,below 2>/dev/null
xdotool windowmove --sync "$_wid" 4000 0 2>/dev/null
echo "[kiosk-manager/watchdog] Konsola LO ukryta (WID=$_wid, x=${_wx:-?})"
fi
done
done
) &
CHROMIUM_OPTS=(
--no-first-run
--noerrdialogs
--disable-infobars
--disable-gpu-suspend
--force-device-scale-factor=1
--user-data-dir=/home/kiosk/.cache/chromium
--disable-features=AutofillServerCommunication,AutofillKeyValueService,Translate,MediaRouter
--disable-save-password-bubble
--disable-sync
--disable-extensions
--disable-background-networking
--disable-notifications
--disable-component-update
--password-store=basic
--disable-pinch
--window-position=0,0
--window-size=${RES_W},${RES_H}
)
# Strona oczekiwania — lewy ekran
# Bez --kiosk: na X11 --kiosk rozciąga okno na cały wirtualny desktop (oba ekrany)
chromium --app="$WAITING_PAGE" "${CHROMIUM_OPTS[@]}" &
CHROMIUM_PID=$!
# Czekaj na okno i zastosuj fullscreen (synchronicznie)
for _i in $(seq 1 40); do
sleep 0.5
WID=$(xdotool search --pid "$CHROMIUM_PID" --onlyvisible 2>/dev/null | head -1)
if [ -n "$WID" ]; then
wmctrl -i -r "$WID" -b add,fullscreen
wmctrl -i -r "$WID" -b add,above
break
fi
done
sleep 2 # Minimalny czas wyświetlania strony oczekiwania
# Czekaj na dostępność serwera kiosku
while ! ping -c 1 -W 1 "$KIOSK_HOST" > /dev/null 2>&1; do
sleep 1
done
# Czekaj na zamontowanie SMB (sygnał od presentation-manager.sh).
# waiting.html zostaje do czasu gdy oba ekrany są gotowe do startu.
while [ ! -f /tmp/kiosk-smb-ready ]; do
sleep 1
done
sleep 5
# Zamknij ekran oczekiwania i uruchom właściwy kiosk
kill "$CHROMIUM_PID"
wait "$CHROMIUM_PID" 2>/dev/null
rm -f /tmp/kiosk-chromium-restart
launch_chromium() {
rm -f /tmp/kiosk-chromium-restart
chromium --app="$KIOSK_URL" "${CHROMIUM_OPTS[@]}" &
CHROMIUM_PID=$!
echo "[kiosk-manager] Chromium uruchomiony (PID=$CHROMIUM_PID)"
(
for _i in $(seq 1 30); do
sleep 1
WID=$(xdotool search --pid "$CHROMIUM_PID" --onlyvisible 2>/dev/null | head -1)
if [ -n "$WID" ]; then
wmctrl -i -r "$WID" -b add,fullscreen
wmctrl -i -r "$WID" -b add,above
echo "[kiosk-manager] Chromium na lewym ekranie (próba $_i)"
break
fi
done
) &
}
launch_chromium
# Pętla: reaguje na sygnał restartu od presentation-manager.sh
# (zmiana pliku prezentacji) lub na awarię Chromium
while true; do
sleep 1
if [ -f /tmp/kiosk-chromium-restart ]; then
echo "[kiosk-manager] Sygnał restart Chromium — restartuje"
kill "$CHROMIUM_PID" 2>/dev/null
wait "$CHROMIUM_PID" 2>/dev/null
launch_chromium
elif ! kill -0 "${CHROMIUM_PID:-0}" 2>/dev/null; then
echo "[kiosk-manager] Chromium zakończył się — restartuje"
launch_chromium
fi
done