176 lines
6.7 KiB
Bash
176 lines
6.7 KiB
Bash
#!/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
|