diff --git a/README.md b/README.md index 7b16a39..71de9ed 100644 --- a/README.md +++ b/README.md @@ -1,52 +1,64 @@ -# Kiosk Dwuekranowy — Chromium + Prezentacja PowerPoint — Debian 13 +# Kiosk Jednoekranowy — Chromium + Prezentacja PowerPoint — Debian 13 -Kiosk na 1 monitor.w Chromium tylko strona oczekiwania na sieć, prawy ekran wyświetla w pętli prezentację PowerPoint z zamontowanego udziału SMB. Używa **X11** (xinit + openbox) i **LibreOffice Impress** w trybie pokazu (`--show`) — bez konwersji, z zachowanymi animacjami i przejściami. +Kiosk na 1 monitor. Chromium wyświetla stronę oczekiwania na sieć, a LibreOffice Impress uruchamia prezentację z zamontowanego udziału SMB w trybie pokazu (`--show`). Skrypt automatycznie wykrywa rozdzielczość ekranu. Używa **X11** (xinit + openbox) i zachowuje animacje oraz przejścia. --- ## Architektura ``` -┌──────────────────────────────────────────────────────────────────┐ -│ kiosk.service │ -│ (xinit + openbox — tty7) │ -│ │ -│ Wirtualny desktop 3840×1080 (xrandr --right-of) │ -│ ┌──────────────────────────────┐ │ -│ │ LibreOffice Impress --show │ │ -│ │ HDMI-1 (1920,0–3840×1080) │ │ -│ │ terminal_live.pptx │ │ -│ └──────────────────────────────┘ │ -│ ▲ above (wmctrl) ▲ │ -│ kiosk-manager.sh presentation-manager.sh │ -└──────────────────────────────────────────────────────────────────┘ - ▲ - /mnt/presentation (CIFS/SMB) - montowany przez skrypt (fstab user) - ▲ - //192.168.40.201/DatyFirmowe/ALS +┌──────────────────────────────────────────────────────────────┐ +│ kiosk.service │ +│ (xinit + openbox — tty7) │ +│ │ +│ Jeden monitor 1920×1080, bez rozszerzonego pulpitu │ +│ ┌───────────────────────────────────┐ │ +│ │ LibreOffice Impress --show │ │ +│ │ terminal_live.pptx │ │ +│ └───────────────────────────────────┘ │ +│ ▲ ▲ │ +│ kiosk-manager.sh presentation-manager.sh │ +└──────────────────────────────────────────────────────────────┘ + ▲ + /mnt/presentation (CIFS/SMB) mounted by script + ▲ + //192.168.40.201/DatyFirmowe ``` -**Przepływ — lewy ekran (kiosk-manager.sh):** -1. Konfiguruje X11: xrandr dual-screen, wyłącza DPMS, uruchamia openbox +## Pliki projektu + +- `README.md` — instrukcja instalacji i uruchomienia +- `kiosk-manager.sh` — główny skrypt X11 + Chromium +- `presentation-manager.sh` — montowanie SMB, synchronizacja czcionek i uruchomienie LibreOffice +- `kiosk.service` — systemd service uruchamiający kiosk jako użytkownik `kiosk` +- `mnt-presentation.mount` — alternatywna jednostka systemd do montowania SMB +- `smb-credentials.template` — wzór pliku poświadczeń SMB +- `waiting.html` — lokalna strona oczekiwania dla Chromium +- `logo.png` — logo wyświetlane w `waiting.html` +- `wol-enable.service` — usługa utrzymująca Wake on LAN włączone po restarcie +- `kiosk-schedule` — cron wymuszający wyłączenie kiosku w nocnych i weekendowych oknach nieaktywności +- `sway-config` — wzór konfiguracji Wayland/sway (zachowany w repo) + +**Przepływ — kiosk-manager.sh:** +1. Konfiguruje X11: jeden monitor, wyłącza DPMS, uruchamia openbox 2. Zapisuje `registrymodifications.xcu` — wyłącza presenter console LO -3. Uruchamia watchdog sesji (co 0.4 s chowa okna LO z lewego ekranu) +3. Uruchamia watchdog sesji (co 0.4 s ukrywa okna LO poza widoczny obszar) 4. Uruchamia `presentation-manager.sh` w tle 5. Otwiera `waiting.html` fullscreen + always-on-top 6. Czeka na: sieć (`ping diluals31`) **oraz** sygnał od `presentation-manager.sh` (plik `/tmp/kiosk-smb-ready`) -7. Po otrzymaniu obu sygnałów: `sleep 10` — daje LO czas na otwarcie i pozycjonowanie okna na prawym ekranie +7. Po otrzymaniu obu sygnałów: `sleep 10` — daje LO czas na uruchomienie i pozycjonowanie okna 8. Przełącza Chromium na docelowy URL -> `sleep 10` jest kluczowe: zapewnia, że LibreOffice zdąży otworzyć i ustawić okno pokazu zanim Chromium wejdzie w tryb fullscreen+above na lewym ekranie. Bez tego opóźnienia konsola prezentacji była widoczna po reboot. +> `sleep 10` jest kluczowe: zapewnia, że LibreOffice zdąży uruchomić i ustawić okno pokazu zanim Chromium wejdzie w tryb fullscreen+above. Bez tego opóźnienia konsola prezentacji była widoczna po reboot. -**Przepływ — prawy ekran (presentation-manager.sh):** +**Przepływ — presentation-manager.sh:** 1. Montuje udział SMB (`mount /mnt/presentation`) z retry co 5 s 2. Synchronizuje czcionki z `$SMB_MOUNT/fonts/` do `~/.local/share/fonts/smb/` 3. Tworzy plik `/tmp/kiosk-smb-ready` — sygnał dla `kiosk-manager.sh` 4. Czeka na plik `terminal_live.pptx` 5. Uruchamia persistentny watchdog konsoli (co 0.3 s) 6. Uruchamia `soffice --show terminal_live.pptx` -7. Przesuwa okno pokazu na prawy ekran i stosuje fullscreen +7. Przenosi okna konsoli poza widoczny obszar i fullscreenuje pokaz 8. Co 5 s: sprawdza mtime pliku i restartuje po zmianie --- @@ -93,15 +105,15 @@ LibreOffice podstawia czcionkę zastępczą gdy oryginalna nie jest zainstalowan `presentation-manager.sh` automatycznie synchronizuje czcionki z folderu `fonts/` na udziale SMB do `/home/kiosk/.local/share/fonts/smb/`. Wystarczy wrzucić pliki `.ttf`/`.otf` na udział — zostaną zainstalowane przy najbliższym restarcie kiosku. -**Na maszynie Windows** — skopiuj pliki czcionek do `\\192.168.40.201\DatyFirmowe\ALS\fonts\`: +**Na maszynie Windows** — skopiuj pliki czcionek do `\\serwer\\DatyFirmowe\\ALS\\fonts\\`: ```powershell # Calibri (C:\Windows\Fonts\ lub %LOCALAPPDATA%\Microsoft\Windows\Fonts\) -Copy-Item C:\Windows\Fonts\calibri*.ttf \\192.168.40.201\DatyFirmowe\ALS\fonts\ +Copy-Item C:\Windows\Fonts\calibri*.ttf \\\\serwer\\DatyFirmowe\\ALS\\fonts\\ # Aptos — zazwyczaj w cache czcionek chmurowych Microsoft 365: $src = "$env:LOCALAPPDATA\Microsoft\FontCache\4\CloudFonts\Aptos" -Copy-Item "$src\*" \\192.168.40.201\DatyFirmowe\ALS\fonts\ +Copy-Item "$src\*" \\\\serwer\\DatyFirmowe\\ALS\\fonts\\ ``` > Nazwy plików Aptos w cache mogą być numeryczne — to normalne, fontconfig czyta metadane wewnętrzne, nie nazwę pliku. @@ -156,12 +168,12 @@ mkdir -p /mnt/presentation #### 3c. Dodaj wpis w /etc/fstab (montowanie przez użytkownika kiosk) ```bash -echo '//192.168.40.201/DatyFirmowe/ALS /mnt/presentation cifs credentials=/etc/samba/kiosk-credentials,uid=kiosk,gid=kiosk,vers=3.0,user,noauto,_netdev 0 0' >> /etc/fstab +echo '//192.168.40.201/DatyFirmowe /mnt/presentation cifs credentials=/etc/samba/kiosk-credentials,uid=kiosk,gid=kiosk,vers=3.0,user,noauto,_netdev 0 0' >> /etc/fstab ``` Opcja `user` pozwala użytkownikowi `kiosk` wykonać `mount /mnt/presentation` bez uprawnień roota. Opcja `noauto` wyłącza automatyczne montowanie przy starcie — skrypt sam zarządza montem z retry. -> **Uwaga:** Systemd unit `mnt-presentation.mount` jest **wyłączony** — skrypt `presentation-manager.sh` przejął odpowiedzialność za montowanie. +> **Uwaga:** Plik `mnt-presentation.mount` jest zachowany jako opcja systemd do montowania SMB. W obecnym trybie to `presentation-manager.sh` wykonuje `mount /mnt/presentation`, ale jednostka pozostaje w repo jako alternatywna opcja montowania. ```bash systemctl disable mnt-presentation.mount @@ -182,22 +194,154 @@ DP-1: connected HDMI-1: connected ``` -Ustaw właściwe nazwy w `kiosk-manager.sh`: +Ustaw właściwą nazwę wyjścia w `kiosk-manager.sh`: ```bash -OUTPUT_LEFT="DP-1" # lewy ekran — primary -OUTPUT_RIGHT="HDMI-1" # prawy ekran +OUTPUT_LEFT="HDMI-1" # główny monitor HDMI ``` -### 5. Skopiuj pliki konfiguracyjne +### 5. Skopiuj pliki konfiguracyjne i uruchom serwisy + +Skopiuj skrypty i zasoby do katalogu użytkownika `kiosk`: + +```bash +cp kiosk-manager.sh presentation-manager.sh waiting.html logo.png /home/kiosk/ +chmod +x /home/kiosk/kiosk-manager.sh /home/kiosk/presentation-manager.sh +chown -R kiosk:kiosk /home/kiosk/ +``` + +Skopiuj jednostki systemd: + +```bash +cp kiosk.service wol-enable.service /etc/systemd/system/ +cp mnt-presentation.mount /etc/systemd/system/mnt-presentation.mount +``` + +Skopiuj plik cron: + +```bash +cp kiosk-schedule /etc/cron.d/kiosk-schedule +chmod 644 /etc/cron.d/kiosk-schedule +``` + +Przeładuj systemd i uruchom serwisy: + +```bash +systemctl daemon-reload +systemctl enable --now kiosk.service +systemctl enable --now wol-enable.service +``` + +Jeżeli chcesz, aby montowanie SMB było wykonywane tylko przez `presentation-manager.sh`, wyłącz jednostkę `mnt-presentation.mount`: + +```bash +systemctl disable --now mnt-presentation.mount +``` + +### 5a. Przez SSH — jak skopiować pliki do kiosku + +Jeśli kopiujesz pliki z innej maszyny przez SSH, użyj `scp` i przenieś je na kiosk: + +```bash +scp kiosk-manager.sh presentation-manager.sh waiting.html logo.png kiosk.service wol-enable.service kiosk-schedule @:/tmp/ +ssh @ +``` + +Następnie na kiosk wykonaj: + +```bash +sudo mv /tmp/kiosk-manager.sh /home/kiosk/ +sudo mv /tmp/presentation-manager.sh /home/kiosk/ +sudo mv /tmp/waiting.html /home/kiosk/ +sudo mv /tmp/logo.png /home/kiosk/ +sudo chmod +x /home/kiosk/kiosk-manager.sh /home/kiosk/presentation-manager.sh +sudo chown -R kiosk:kiosk /home/kiosk/ + +sudo mv /tmp/kiosk.service /etc/systemd/system/kiosk.service +sudo mv /tmp/wol-enable.service /etc/systemd/system/wol-enable.service +sudo mv /tmp/kiosk-schedule /etc/cron.d/kiosk-schedule +sudo chmod 644 /etc/cron.d/kiosk-schedule +``` + +Po skopiowaniu i ustawieniu uprawnień uruchom: + +```bash +sudo systemctl daemon-reload +sudo systemctl enable --now kiosk.service +sudo systemctl enable --now wol-enable.service +sudo systemctl disable --now mnt-presentation.mount +``` + +--- + +## Tryb 1-ekranowy + +Istniejące skrypty obsługują tryb jednokanałowy bez dodatkowych plików. Ustaw `ONE_SCREEN=1` w `kiosk.service` lub przed uruchomieniem `/home/kiosk/kiosk-manager.sh`. + +Skopiuj pliki: ```bash cp kiosk-manager.sh /home/kiosk/kiosk-manager.sh cp presentation-manager.sh /home/kiosk/presentation-manager.sh cp waiting.html /home/kiosk/waiting.html +cp logo.png /home/kiosk/logo.png chmod +x /home/kiosk/kiosk-manager.sh /home/kiosk/presentation-manager.sh chown -R kiosk:kiosk /home/kiosk/ +``` -cp kiosk.service /etc/systemd/system/kiosk.service +W `kiosk.service` dodaj: + +```ini +[Service] +Environment=ONE_SCREEN=1 +ExecStart=xinit /home/kiosk/kiosk-manager.sh -- :0 vt7 +``` + +Przeładuj systemd i uruchom serwis: + +```bash +systemctl daemon-reload +systemctl restart kiosk.service +``` + +Skrypt wykrywa rozdzielczość ekranu automatycznie; `SCREEN_WIDTH` lub `RES_W` można ustawić tylko w razie potrzeby. + +--- + +## SSH i `sway-config` + +SSH: + +```bash +apt install -y openssh-server +systemctl enable --now ssh +``` + +Dodaj swój klucz do `/home/kiosk/.ssh/authorized_keys` i ustaw uprawnienia. + +Sway: + +Plik `sway-config` jest dostępny, ale obecne skrypty działają na X11. Użycie `sway` wymaga portu skryptów na Wayland. + +--- + +## Szybkie polecenia — drop-in systemd dla `ONE_SCREEN=1` + +Utwórz drop-in, przeładuj systemd i zrestartuj serwis: + +```bash +mkdir -p /etc/systemd/system/kiosk.service.d +cat > /etc/systemd/system/kiosk.service.d/one-screen.conf <<'EOF' +[Service] +Environment=ONE_SCREEN=1 +Environment=SCREEN_WIDTH=1920 +EOF +systemctl daemon-reload +systemctl restart kiosk.service +``` + +W normalnym trybie skrypt wykrywa szerokość ekranu automatycznie; zmiana `SCREEN_WIDTH` jest potrzebna tylko przy problemach. + +### 6. Rozwiązanie problemu z domenami .local ``` ### 6. Rozwiązanie problemu z domenami .local @@ -231,11 +375,17 @@ GRUB_TIMEOUT=0 ## Harmonogram — Automatyczne wyłączanie i Wake on LAN -Kiosk wyłącza się automatycznie w **sobotę o 7:00** i jest budzony przez Magic Packet (Wake on LAN) co 5 minut przez całe okno aktywności (**niedziela 21:00 – sobota 7:00**). Pakiet WoL jest ignorowany gdy kiosk jest już włączony — cykliczne wysyłanie nie powoduje restartów. +Plik `kiosk-schedule` wymusza wyłączenie kiosku w godzinach nocnych i podczas weekendów. Harmonogram ma trzy cele: -> **Utrata prądu:** WoL nie zadziała gdy karta sieciowa nie ma zasilania. Aby kiosk sam wstał po powrocie prądu, wejdź w ustawienia BIOS/UEFI i ustaw opcję **Restore on AC Power Loss** (lub **After Power Failure**) na **Power On**. W połączeniu z cyklicznym WoL zapewnia to pełne pokrycie: brak prądu → BIOS bootuje automatycznie; awaria software → WoL obudzi po max. 5 min. +- codziennie o 22:00 wywołuje `shutdown -h now` +- w dni robocze dodatkowo co 5 minut wyłącza kiosk między 22:00 a 23:59 oraz między 00:00 a 05:59 +- w sobotę i niedzielę raz na 5 minut wywołuje `shutdown -h now` przez całą dobę + +Dzięki temu kiosk jest aktywny przede wszystkim w godzinach dziennych w dni robocze, a w oknach nieaktywności system jest pewnie wyłączany. + +> **Utrata prądu:** WoL nie zadziała, gdy karta sieciowa nie ma zasilania. Aby kiosk sam wstał po powrocie prądu, ustaw w BIOS/UEFI opcję **Restore on AC Power Loss** (lub **After Power Failure**) na **Power On**. W połączeniu z cyklicznym WoL zapewnia to pełne pokrycie: brak prądu → BIOS bootuje automatycznie; awaria software → WoL obudzi po max. 5 min. > -> Jeśli prąd wróci w oknie wyłączenia (sobota 7:00 – niedziela 20:59), kiosk uruchomi się przez BIOS, ale `kiosk-schedule` wyłączy go ponownie w ciągu max. 5 minut. +> Jeśli prąd wróci w oknie wyłączenia, kiosk może włączyć się przez BIOS, ale `kiosk-schedule` wyłączy go ponownie w ciągu kilku minut. ### Na kiosku @@ -285,7 +435,7 @@ Utwórz plik crona wysyłającego WoL co 5 minut przez całe okno aktywności ki cat > /etc/cron.d/kiosk-wol << 'EOF' SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin -# Budź kiosk WS-VK016 co 5 min w oknie aktywności: nd 21:00 – sb 7:00 +# Budź kiosk WS-FM035 co 5 min w oknie aktywności: nd 21:00 – sb 7:00 # Jeśli kiosk jest już włączony, pakiet WoL jest ignorowany (bezpieczne). */5 21-23 * * 0 root wakeonlan XX:XX:XX:XX:XX:XX */5 * * * 1-5 root wakeonlan XX:XX:XX:XX:XX:XX @@ -319,14 +469,14 @@ Jednostka systemd uruchamiająca sesję X11 jako użytkownik `kiosk`. ### `kiosk-manager.sh` → `/home/kiosk/kiosk-manager.sh` -Uruchamiany przez xinit. Konfiguruje X11 i obsługuje lewy ekran. +Uruchamiany przez xinit. Konfiguruje X11 dla pojedynczego ekranu. **Co robi:** -1. `xrandr` — tryb rozszerzony: `DP-1` primary (0,0), `HDMI-1` po prawej (1920,0) +1. `xrandr` — pojedynczy ekran: `HDMI-1` primary (0,0) 2. `xsetroot` + `xset` — czarne tło, wyłączony wygaszacz i DPMS 3. `openbox --sm-disable` — lekki WM wymagany przez `wmctrl fullscreen` 4. Zapisuje `registrymodifications.xcu` — wyłącza presenter console LO (`StartWithPresenterScreen=false`) -5. Uruchamia watchdog sesji w tle — co 0.4 s chowa okna soffice z lewego ekranu (x < 1920) +5. Uruchamia watchdog sesji w tle — co 0.4 s chowa okna soffice poza obszarem widocznym ekranu 6. Uruchamia `presentation-manager.sh` w tle 7. Chromium otwiera `waiting.html` z `fullscreen` + `above` 8. Czeka na sieć (`ping diluals31`) **i** na plik `/tmp/kiosk-smb-ready` @@ -338,7 +488,7 @@ Uruchamiany przez xinit. Konfiguruje X11 i obsługuje lewy ekran. | Flaga | Opis | |---|---| | `--app=URL` | Tryb aplikacji — brak paska adresu, brak kart | -| `--window-position=0,0 --window-size=1920,1080` | Pozycja na lewym ekranie (X11: bez `--kiosk`, który rozciąga na cały wirtualny desktop) | +| `--window-position=0,0 --window-size=1920,1080` | Pozycja na głównym ekranie (X11: bez `--kiosk`, który rozciąga na cały wirtualny desktop) | | `--no-first-run` | Pomija ekran powitalny | | `--noerrdialogs` | Ukrywa okna dialogowe błędów | | `--disable-gpu-suspend` | Zapobiega zawieszaniu GPU przy wygaszaniu | @@ -349,7 +499,7 @@ Uruchamiany przez xinit. Konfiguruje X11 i obsługuje lewy ekran. | `--password-store=basic` | Nie używa systemowego portfela haseł | | `--disable-pinch` | Wyłącza pinch-to-zoom | -> **Uwaga:** `--kiosk` na X11 rozciąga okno na cały wirtualny desktop 3840×1080 (oba ekrany). Używamy `--app` + `--window-position/size` + `wmctrl fullscreen`. +> **Uwaga:** `--kiosk` na X11 rozciąga okno na cały wirtualny desktop. Używamy `--app` + `--window-position/size` + `wmctrl fullscreen`. **Zmiana hosta / URL kiosku:** ```bash @@ -362,7 +512,7 @@ KIOSK_URL="http://diluals31/terminal/ift/5/DE/index" ### `presentation-manager.sh` → `/home/kiosk/presentation-manager.sh` -Obsługuje prawy ekran — montowanie SMB i wyświetlanie prezentacji. +Obsługuje montowanie SMB i wyświetlanie prezentacji. **Montowanie SMB:** ```bash @@ -376,35 +526,45 @@ Przy zakończeniu skryptu (trap EXIT/INT/TERM): `umount /mnt/presentation`. **Ustawianie okien LibreOffice (`start_lo`):** Iteruje wszystkie widoczne okna `soffice` wg pozycji X: -- `x ≥ 1920` → okno pokazu slajdów → `wmctrl fullscreen` -- `x < 1920` → konsola prezentacji → przesunięcie na `x=3840` (poza desktop) + `wmctrl below` -- Fallback po 5 s: jeśli nadal brak okna na prawym ekranie → przeniesienie pierwszego znalezionego +- `x ≥ SCREEN_WIDTH` → okno pokazu slajdów → `wmctrl fullscreen` +- `x < SCREEN_WIDTH` → konsola prezentacji → przeniesienie poza obszar widoczny ekranu + `wmctrl below` +- Fallback po 5 s: jeśli nie znajdzie okna do fullscreen, przenosi pierwsze znalezione i ustawia je jako fullscreen -Po ustawieniu LO: Chromium podniesiony jako `above` (always-on-top na lewym ekranie). +Po ustawieniu LO: Chromium podniesiony jako `above` (always-on-top). **Watchdog (co 5 s w głównej pętli):** -- Sprawdza wszystkie widoczne okna `soffice` — jeśli któreś wróciło na `x < 1920`, wysyła je z powrotem na `x=3840` +- Sprawdza wszystkie widoczne okna `soffice` — jeśli któreś wróciło na ekran (x < SCREEN_WIDTH), wysyła je z powrotem poza obszar X11 - Sprawdza `mtime` pliku PPTX — po zmianie restartuje pokaz - Sprawdza czy `soffice` żyje — jeśli zakończył (koniec pokazu), restartuje **Konfiguracja:** ```bash SMB_MOUNT="/mnt/presentation" -SMB_SOURCE="//192.168.40.201/DatyFirmowe/ALS" +SMB_SOURCE="//192.168.40.201/DatyFirmowe" PRESENTATION_FILE="$SMB_MOUNT/terminal_live.pptx" ``` +**Jak wyświetlana jest prezentacja:** +1. `presentation-manager.sh` montuje udział SMB na `/mnt/presentation`. +2. Skrypt synchronizuje czcionki z katalogu `fonts/` na udziale SMB do `/home/kiosk/.local/share/fonts/smb/`. +3. Czeka na plik `terminal_live.pptx`. +4. Uruchamia `soffice --show terminal_live.pptx`. +5. `xdotool` i `wmctrl` ustawiają okno pokazu na pełny ekran i przesuwają ewentualną konsolę poza widoczny obszar. +6. `kiosk-manager.sh` uruchamia jednocześnie Chromium z `waiting.html` i przełącza się na docelowy URL dopiero po gotowości prezentacji i sieci. + --- ### `kiosk.service` (wyłączone) `mnt-presentation.mount` -Systemd unit do montowania SMB jest **wyłączony**. Skrypt `presentation-manager.sh` przejął montowanie przez `mount /mnt/presentation` (wpis fstab z opcją `user,noauto`). +Plik `mnt-presentation.mount` jest zachowany jako opcja systemd do montowania SMB. Obecna konfiguracja domyślnie używa `presentation-manager.sh` do montowania `/mnt/presentation`, ale jednostka w repo może być włączona jako alternatywa. --- ### `sway-config` -Nieużywany — zachowany jako archiwum poprzedniej architektury (Wayland/sway). +Plik `sway-config` jest zachowany w repo jako opcja/wzór dla środowiska Wayland/sway. Obecne skrypty domyślnie działają na X11, jednak `sway-config` pozostaje do użytku lub dalszego portowania. + +`mnt-presentation.mount` także pozostaje w repo jako opcja montowania SMB; nie usuwamy go, bo może być przydatny jako alternatywne rozwiązanie. --- @@ -492,14 +652,14 @@ systemctl start kiosk.service | Prezentacja się nie wyświetla | SMB nie zamontowany | `journalctl -u kiosk.service -b \| grep mount` — sprawdź błędy | | `mount: Permission denied` | Opcja `user` brak w fstab lub kiosk nie jest właścicielem | Sprawdź wpis fstab: `grep presentation /etc/fstab` | | `mount: not found in /etc/fstab` | Brak wpisu fstab | Dodaj wpis zgodnie z sekcją 3c | -| Konsola LibreOffice widoczna na lewym ekranie po reboot | LibreOffice startuje przed Chromium (kiosk URL) i konsola zdąży się pokazać | Zwiększ `sleep 10` w `kiosk-manager.sh` (linia po pętli `kiosk-smb-ready`) | -| Chromium rozciągnięty na oba ekrany | Użyto `--kiosk` zamiast `--app` | Sprawdź `kiosk-manager.sh` — nie używamy `--kiosk` | -| Lewy ekran czarny, tylko prawy działa | Chromium nie znalazł okna w 30 s | `journalctl \| grep "kiosk-manager"` — sprawdź błędy Chromium | +| Konsola LibreOffice widoczna na ekranie po reboot | LibreOffice startuje przed Chromium (kiosk URL) i konsola zdąży się pokazać | Zwiększ `sleep 10` w `kiosk-manager.sh` (linia po pętli `kiosk-smb-ready`) | +| Chromium rozciągnięty na cały wirtualny desktop | Użyto `--kiosk` zamiast `--app` | Sprawdź `kiosk-manager.sh` — nie używamy `--kiosk` | +| Wyświetlacz czarny lub niepoprawny układ | Chromium nie znalazł okna w 30 s | `journalctl \| grep "kiosk-manager"` — sprawdź błędy Chromium | | `openbox: command not found` | Brak pakietu | `apt install openbox` | | `wmctrl: command not found` | Brak pakietu | `apt install wmctrl` | | `xdotool: command not found` | Brak pakietu | `apt install xdotool` | | Animacje nie działają | LO konwertuje do PNG/PDF (stare podejście) | Aktualna wersja używa `soffice --show` bezpośrednio — animacje powinny działać | -| Tekst źle wyświetlany (zła czcionka, zły układ) | Brak czcionki | Skopiuj pliki `.ttf`/`.otf` do `\\serwer\DatyFirmowe\ALS\fonts\` i zrestartuj kiosk — skrypt zainstaluje je automatycznie | +| Tekst źle wyświetlany (zła czcionka, zły układ) | Brak czcionki | Skopiuj pliki `.ttf`/`.otf` do `\\serwer\DatyFirmowe\fonts\` i zrestartuj kiosk — skrypt zainstaluje je automatycznie | | Udział SMB z protokołem SMB 1.0 | `vers=3.0` nieobsługiwany | Zmień na `vers=2.1` lub `vers=1.0` w `/etc/fstab` | | Czarny ekran po restarcie | Chromium trzyma zablokowany profil | `rm -rf /home/kiosk/.cache/chromium` | | X11 nie startuje (`cannot open display`) | Brak pakietu xorg | `apt install xorg` | diff --git a/kiosk-manager.sh b/kiosk-manager.sh index 328663d..4fd410e 100644 --- a/kiosk-manager.sh +++ b/kiosk-manager.sh @@ -1,5 +1,5 @@ #!/bin/bash -# kiosk-manager.sh — konfiguracja X11 + lewy ekran: Chromium +# kiosk-manager.sh — konfiguracja X11 + Chromium # Plik docelowy: /home/kiosk/kiosk-manager.sh # Jawnie ustawiamy HOME — serwis może startować jako root (xinit bez User=kiosk), @@ -11,10 +11,11 @@ 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" +OUTPUT_LEFT="HDMI-1" RES_W=1920 RES_H=1080 +# Domyślnie tryb jednokanałowy (jeden monitor) +ONE_SCREEN=${ONE_SCREEN:-1} # ─── Niewidoczny kursor ────────────────────────────────────────────────────── # Tworzymy motyw XCursor (1x1 px, ARGB 0x00000000) i eksportujemy XCURSOR_THEME @@ -33,12 +34,23 @@ export XCURSOR_SIZE=1 -# Dual-screen rozszerzony: lewy ekran primary, prawy po prawej +# Pojedynczy ekran: ustawiamy monitor główny jako primary # --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) + +# Wykryj aktualną rozdzielczość ekranu dla wyjścia HDMI-1 +read RES_W RES_H < <(xrandr | awk -v out="$OUTPUT_LEFT" '$1==out && / connected/ { if (match($0, /([0-9]+)x([0-9]+)\+[0-9]+\+[0-9]+/, a)) print a[1], a[2]; exit }') +if [ -z "$RES_W" ] || [ -z "$RES_H" ]; then + RES_W=1920 + RES_H=1080 + echo "[kiosk-manager] Nie wykryto rozdzielczości, używam domyślnej ${RES_W}x${RES_H}" +else + echo "[kiosk-manager] Wykryto rozdzielczość wyjścia $OUTPUT_LEFT: ${RES_W}x${RES_H}" +fi +export RES_W RES_H + +# Ustaw bufor X11 większy niż rzeczywista szerokość ekranu, +# aby można było przenieść ukryte okna poza obszar widoczny. xrandr --fb "$((RES_W * 2))x$((RES_H + 200))" echo "[kiosk-manager] Konfiguracja xrandr:" xrandr | grep -E "connected|[0-9]+x[0-9]+\+" @@ -78,7 +90,7 @@ XCUEOF # ─── Start aplikacji ───────────────────────────────────────────────────────── -# Uruchom menedżera prezentacji w tle (prawy ekran) +# Uruchom menedżera prezentacji w tle /home/kiosk/presentation-manager.sh & # Watchdog sesji: ukrywa okna konsoli LibreOffice przez cały czas trwania sesji X. @@ -86,21 +98,19 @@ XCUEOF ( 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 + _wx=$(xdotool getwindowgeometry "$_wid" 2>/dev/null \ + | awk '/Position:/{split($2,a,","); print a[1]+0}') + # ukryj konsolę jeśli znajduje się na lewym ekranie + if [ "${_wx:-0}" -lt "$RES_W" ]; 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" $((RES_W * 2)) 0 2>/dev/null + echo "[kiosk-manager/watchdog] Konsola LO ukryta (WID=$_wid, x=${_wx:-?})" + fi done done ) & -# ─── START PREZENTACJI ─────────────────────────────────────────────────────── -/home/kiosk/presentation-manager.sh & - # ─── WAITING SCREEN ────────────────────────────────────────────────────────── chromium --app="$WAITING_PAGE" \ --window-position=0,0 \ @@ -141,10 +151,10 @@ wait "$CHROMIUM_PID" 2>/dev/null 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 + if [ "${_wx:-0}" -lt "$RES_W" ]; 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 + xdotool windowmove --sync "$_wid" $((RES_W * 2)) 0 2>/dev/null fi done done diff --git a/kiosk-schedule b/kiosk-schedule index 3271c39..7f81f21 100644 --- a/kiosk-schedule +++ b/kiosk-schedule @@ -7,8 +7,8 @@ PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # Wyłącz kiosk w piątek o 22:00 (planowe wyłączenie) 0 22 * * * root /sbin/shutdown -h now -# Jeśli kiosk uruchomi się po utracie prądu w oknie wyłączenia (sob 06:00 - pod 6:00 ), -# wyłącz go w ciągu max. 5 minut. Gdy kiosk jest normalnie wyłączony, wpisy nie działają. +# Jeśli kiosk uruchomi się po utracie prądu, wpisy cron nadal będą wymuszać wyłączenie +# zgodnie z harmonogramem: w weekendy co 5 minut przez całą dobę, w dni robocze od 22:00 do 05:59. */5 * * * 0,6 root /sbin/shutdown -h now */5 0-5 * * 1-5 root /sbin/shutdown -h now diff --git a/kiosk.service b/kiosk.service index fc7ab22..c315490 100644 --- a/kiosk.service +++ b/kiosk.service @@ -1,5 +1,5 @@ [Unit] -Description=Kiosk Dwuekranowy — Instrukcje + Prezentacja +Description=Kiosk Jednoekranowy — Instrukcje + Prezentacja After=systemd-user-sessions.service [Service] diff --git a/presentation-manager.sh b/presentation-manager.sh index 1b4e789..a08107f 100644 --- a/presentation-manager.sh +++ b/presentation-manager.sh @@ -1,5 +1,5 @@ #!/bin/bash -# presentation-manager.sh — prawy ekran: prezentacja PowerPoint z udziału SMB +# presentation-manager.sh — obsługa prezentacji PowerPoint z udziału SMB # # Działanie: # 1. Czeka na zamontowanie udziału SMB @@ -10,7 +10,7 @@ # 5. Co 5 sekund sprawdza, czy plik się zmienił — jeśli tak, restartuje pokaz SMB_MOUNT="/mnt/presentation" -SMB_SOURCE="//192.168.40.201/DatyFirmowe/ALS" +SMB_SOURCE="//192.168.40.201/DatyFirmowe" SMB_OPTS="credentials=/etc/samba/kiosk-credentials,uid=kiosk,gid=kiosk,vers=3.0" PRESENTATION_FILE="$SMB_MOUNT/terminal_live.pptx" # Lokalna kopia PPTX — LibreOffice otwiera ten plik zamiast pliku z SMB. @@ -18,6 +18,13 @@ PRESENTATION_FILE="$SMB_MOUNT/terminal_live.pptx" # w dowolnej chwili z innego komputera (Windows/macOS/Linux). LOCAL_PRESENTATION="/tmp/kiosk-live.pptx" +# Konfiguracja ekranu: szerokość używana do rozróżnienia widocznego obszaru od obszaru ukrytego +ONE_SCREEN=${ONE_SCREEN:-1} +SCREEN_WIDTH=${SCREEN_WIDTH:-${RES_W:-1920}} +RES_W=${RES_W:-$SCREEN_WIDTH} +RES_H=${RES_H:-1080} +OFFSCREEN_X=$((SCREEN_WIDTH * 2)) + CURRENT_MTIME="" LO_PID="" WATCHDOG_PID="" @@ -44,10 +51,10 @@ console_watchdog() { 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 + if [ "${_wx:-0}" -lt "$SCREEN_WIDTH" ]; 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 + xdotool windowmove --sync "$_wid" "$OFFSCREEN_X" 0 2>/dev/null echo "[watchdog] Konsola ukryta (WID=$_wid, x=${_wx:-?})" fi done @@ -92,9 +99,9 @@ XCUEOF echo "[presentation-manager] LibreOffice Impress uruchomiony (PID=$LO_PID)" # Obsłuż wszystkie okna LO wg pozycji: - # x >= 1920 (prawy ekran) → okno pokazu slajdów → fullscreen - # x < 1920 (lewy ekran) → konsola prezentacji → zminimalizuj - # Fallback po 5s: przenieś pierwsze znalezione okno na prawy ekran + # x >= SCREEN_WIDTH → okno pokazu slajdów → fullscreen + # x < SCREEN_WIDTH → konsola prezentacji → przeniesienie poza obszar widoczny + # Fallback po 5s: przenieś pierwsze znalezione okno do widocznego obszaru ( for _i in $(seq 1 30); do sleep 1 @@ -106,7 +113,7 @@ XCUEOF for WID in $WIDS; do WIN_X=$(xdotool getwindowgeometry "$WID" 2>/dev/null \ | awk '/Position:/{split($2,a,","); print a[1]+0}') - if [ "${WIN_X:-0}" -ge 1920 ]; then + if [ "${WIN_X:-0}" -ge "$SCREEN_WIDTH" ]; then PRES_WID=$WID fi # Konsola (x<1920) obsługiwana przez console_watchdog() @@ -114,20 +121,22 @@ XCUEOF if [ -n "$PRES_WID" ]; then wmctrl -i -r "$PRES_WID" -b add,fullscreen 2>/dev/null - echo "[presentation-manager] Pokaz fullscreen na prawym ekranie (próba $_i)" + echo "[presentation-manager] Pokaz fullscreen (próba $_i)" break fi - # Fallback: po 5s nadal brak okna na prawym ekranie → przenieś pierwsze + # Fallback: po 5s nadal brak okna do fullscreen → przenieś pierwsze if [ "$_i" -ge 5 ]; then FIRST_WID=$(echo "$WIDS" | head -1) if [ -n "$FIRST_WID" ]; then wmctrl -i -r "$FIRST_WID" -b remove,fullscreen 2>/dev/null sleep 0.3 - xdotool windowmove --sync "$FIRST_WID" 1920 0 - xdotool windowsize --sync "$FIRST_WID" 1920 1080 + # Jeśli tryb jednokanałowy — ustaw na 0,0 + TARGET_X=0 + xdotool windowmove --sync "$FIRST_WID" "$TARGET_X" 0 + xdotool windowsize --sync "$FIRST_WID" "$RES_W" "$RES_H" wmctrl -i -r "$FIRST_WID" -b add,fullscreen 2>/dev/null - echo "[presentation-manager] Fallback: przeniesiono na prawy ekran (próba $_i)" + echo "[presentation-manager] Fallback: przeniesiono okno (próba $_i, x=$TARGET_X)" break fi fi @@ -206,7 +215,7 @@ while true; do CURRENT_MTIME="$NEW_MTIME" start_lo # Po 5 s wyślij sygnał do kiosk-manager.sh — restartuje Chromium po tym jak LO - # zakończy ładowanie i ustawi okno pokazu na prawym ekranie + # zakończy ładowanie i ustawi okno pokazu ( sleep 5 touch /tmp/kiosk-chromium-restart echo "[presentation-manager] Sygnał restart Chromium wysłany" diff --git a/sway-config b/sway-config index 8760b59..ab7c39d 100644 --- a/sway-config +++ b/sway-config @@ -1,39 +1,32 @@ -# Konfiguracja sway dla kiosku dwuekranowego +# Konfiguracja sway dla kiosku jednoekranowego # Plik docelowy: /home/kiosk/.config/sway/config # -# Nazwy wyjść wideo wykryj BEZ uruchomionego sway (działa zawsze jako root): +# Nazwę wyjścia wideo wykryj BEZ uruchomionego sway (działa zawsze jako root): # for p in /sys/class/drm/card*-*; do echo "$(basename $p | sed 's/card[0-9]*-//'): $(cat $p/status)"; done # # lub gdy sway/kiosk JUŻ działa: # WAYLAND_DISPLAY=wayland-0 XDG_RUNTIME_DIR=/run/kiosk wlr-randr # -# Wpisz właściwe nazwy poniżej: +# Wpisz właściwą nazwę wyjścia HDMI poniżej: -set $OUTPUT_LEFT DP-1 -set $OUTPUT_RIGHT HDMI-1 +set $OUTPUT HDMI-1 -# --- Wyjścia wideo --- +# --- Wyjście wideo --- output * bg #000000 solid_color # Opcjonalnie: rotacja per-wyjście (odkomentuj jeśli wymagana) -# output $OUTPUT_LEFT transform 270 -# output $OUTPUT_RIGHT transform 270 +# output $OUTPUT transform 270 -# Przypisanie workspace do ekranów -workspace 1 output $OUTPUT_LEFT -workspace 2 output $OUTPUT_RIGHT +# Przypisanie workspace do ekranu +workspace 1 output $OUTPUT -# --- Przypisanie aplikacji do workspaces --- -# Chromium (prawy ekran — workspace 2) -# --app=URL generuje app_id: "chrome--Default" — używamy regex -assign [app_id="~^chrome"] workspace 2 -for_window [app_id="~^chrome"] move to workspace 2, fullscreen enable - -# Prezentacja LibreOffice Impress (lewy ekran — workspace 1) -# LO zawsze otwiera się na workspace 1 — assign to potwierdza -assign [app_id="soffice"] workspace 1 +# --- Przypisanie aplikacji do workspace 1 --- +# Wszystkie aplikacje będą działać na jednym ekranie. +assign [app_id="~^chrome"] workspace 1 +assign [app_id="soffice"] workspace 1 assign [class="libreoffice-impress"] workspace 1 -for_window [app_id="soffice"] fullscreen enable +for_window [app_id="~^chrome"] fullscreen enable +for_window [app_id="soffice"] fullscreen enable for_window [class="libreoffice-impress"] fullscreen enable # Jeśli powyższe nie działają, sprawdź rzeczywistą klasę: # WAYLAND_DISPLAY=wayland-0 XDG_RUNTIME_DIR=/run/kiosk swaymsg -t get_tree | grep -E 'app_id|class'