mirror of
https://github.com/6091528/kioskmonitor.git
synced 2026-08-08 03:52:34 +02:00
Compare commits
3 Commits
449eda1a41
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| c31df8e1b4 | |||
| 2e793aca72 | |||
| 8dea1f0db2 |
@@ -1,52 +1,73 @@
|
|||||||
# 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
|
## Architektura
|
||||||
|
|
||||||
```
|
```
|
||||||
┌──────────────────────────────────────────────────────────────────┐
|
+-----------------------------------------------------------------------+
|
||||||
│ kiosk.service │
|
| Kiosk 1-ekranowy / X11 na tty7 |
|
||||||
│ (xinit + openbox — tty7) │
|
| |
|
||||||
│ │
|
| +----------------------+ +--------------------------------------+ |
|
||||||
│ Wirtualny desktop 3840×1080 (xrandr --right-of) │
|
| | kiosk.service | | presentation-manager.sh | |
|
||||||
│ ┌──────────────────────────────┐ │
|
| | xinit + openbox | | - montuje SMB | |
|
||||||
│ │ LibreOffice Impress --show │ │
|
| | | | - synchronizuje czcionki | |
|
||||||
│ │ HDMI-1 (1920,0–3840×1080) │ │
|
| | | | - uruchamia LibreOffice Impress | |
|
||||||
│ │ terminal_live.pptx │ │
|
| +----------+-----------+ +------------------+-------------------+ |
|
||||||
│ └──────────────────────────────┘ │
|
| | | |
|
||||||
│ ▲ above (wmctrl) ▲ │
|
| | v |
|
||||||
│ kiosk-manager.sh presentation-manager.sh │
|
| | +-------------------------------+ |
|
||||||
└──────────────────────────────────────────────────────────────────┘
|
| | | LibreOffice Impress | |
|
||||||
▲
|
| | | terminal_live.pptx | |
|
||||||
/mnt/presentation (CIFS/SMB)
|
| | +----------------+--------------+ |
|
||||||
montowany przez skrypt (fstab user)
|
| | | |
|
||||||
▲
|
| | v |
|
||||||
//192.168.40.201/DatyFirmowe/ALS
|
| +----------------------+ +--------------------------------+ |
|
||||||
|
| | Chromium | | /mnt/presentation | |
|
||||||
|
| | waiting.html | | (CIFS/SMB) | |
|
||||||
|
| | fullscreen | +----------------+---------------+ |
|
||||||
|
| +----------------------+ | |
|
||||||
|
| v |
|
||||||
|
| //192.168.40.201/DatyFirmowe |
|
||||||
|
+-----------------------------------------------------------------------+
|
||||||
```
|
```
|
||||||
|
|
||||||
**Przepływ — lewy ekran (kiosk-manager.sh):**
|
## Pliki projektu
|
||||||
1. Konfiguruje X11: xrandr dual-screen, wyłącza DPMS, uruchamia openbox
|
|
||||||
|
- `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
|
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
|
4. Uruchamia `presentation-manager.sh` w tle
|
||||||
5. Otwiera `waiting.html` fullscreen + always-on-top
|
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`)
|
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
|
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
|
1. Montuje udział SMB (`mount /mnt/presentation`) z retry co 5 s
|
||||||
2. Synchronizuje czcionki z `$SMB_MOUNT/fonts/` do `~/.local/share/fonts/smb/`
|
2. Synchronizuje czcionki z `$SMB_MOUNT/fonts/` do `~/.local/share/fonts/smb/`
|
||||||
3. Tworzy plik `/tmp/kiosk-smb-ready` — sygnał dla `kiosk-manager.sh`
|
3. Tworzy plik `/tmp/kiosk-smb-ready` — sygnał dla `kiosk-manager.sh`
|
||||||
4. Czeka na plik `terminal_live.pptx`
|
4. Czeka na plik `terminal_live.pptx`
|
||||||
5. Uruchamia persistentny watchdog konsoli (co 0.3 s)
|
5. Uruchamia persistentny watchdog konsoli (co 0.3 s)
|
||||||
6. Uruchamia `soffice --show terminal_live.pptx`
|
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
|
8. Co 5 s: sprawdza mtime pliku i restartuje po zmianie
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -93,15 +114,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.
|
`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
|
```powershell
|
||||||
# Calibri (C:\Windows\Fonts\ lub %LOCALAPPDATA%\Microsoft\Windows\Fonts\)
|
# 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:
|
# Aptos — zazwyczaj w cache czcionek chmurowych Microsoft 365:
|
||||||
$src = "$env:LOCALAPPDATA\Microsoft\FontCache\4\CloudFonts\Aptos"
|
$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.
|
> Nazwy plików Aptos w cache mogą być numeryczne — to normalne, fontconfig czyta metadane wewnętrzne, nie nazwę pliku.
|
||||||
@@ -156,19 +177,21 @@ mkdir -p /mnt/presentation
|
|||||||
#### 3c. Dodaj wpis w /etc/fstab (montowanie przez użytkownika kiosk)
|
#### 3c. Dodaj wpis w /etc/fstab (montowanie przez użytkownika kiosk)
|
||||||
|
|
||||||
```bash
|
```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.
|
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
|
```bash
|
||||||
systemctl disable mnt-presentation.mount
|
systemctl disable mnt-presentation.mount
|
||||||
systemctl stop mnt-presentation.mount
|
systemctl stop mnt-presentation.mount
|
||||||
```
|
```
|
||||||
|
|
||||||
### 4. Wykryj nazwy wyjść wideo
|
### 4. Sprawdź nazwę wyjścia wideo dla pojedynczego ekranu
|
||||||
|
|
||||||
|
W przypadku jednego monitora nadal musisz znać jego X11-ową nazwę wyjścia, aby ustawić go jako `OUTPUT_LEFT` w `kiosk-manager.sh`.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
for p in /sys/class/drm/card*-*; do
|
for p in /sys/class/drm/card*-*; do
|
||||||
@@ -182,22 +205,124 @@ DP-1: connected
|
|||||||
HDMI-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
|
```bash
|
||||||
OUTPUT_LEFT="DP-1" # lewy ekran — primary
|
OUTPUT_LEFT="HDMI-1" # główny monitor HDMI
|
||||||
OUTPUT_RIGHT="HDMI-1" # prawy ekran
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 5. Skopiuj pliki konfiguracyjne
|
To nie jest wykrywanie wielu ekranów — to potwierdzenie, że pojedynczy monitor jest widoczny jako `HDMI-1` (lub inna nazwa) w X11, zanim zostanie skonfigurowany i użyta jego rozdzielczość.
|
||||||
|
|
||||||
|
### 5. Skopiuj pliki konfiguracyjne i uruchom serwisy
|
||||||
|
|
||||||
|
Skopiuj skrypty i zasoby do katalogu użytkownika `kiosk`:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cp kiosk-manager.sh /home/kiosk/kiosk-manager.sh
|
cp kiosk-manager.sh presentation-manager.sh waiting.html logo.png /home/kiosk/
|
||||||
cp presentation-manager.sh /home/kiosk/presentation-manager.sh
|
|
||||||
cp waiting.html /home/kiosk/waiting.html
|
|
||||||
chmod +x /home/kiosk/kiosk-manager.sh /home/kiosk/presentation-manager.sh
|
chmod +x /home/kiosk/kiosk-manager.sh /home/kiosk/presentation-manager.sh
|
||||||
chown -R kiosk:kiosk /home/kiosk/
|
chown -R kiosk:kiosk /home/kiosk/
|
||||||
|
```
|
||||||
|
|
||||||
cp kiosk.service /etc/systemd/system/kiosk.service
|
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 terminal / lokalnie — jak skopiować pliki do kiosku
|
||||||
|
|
||||||
|
Jeśli jesteś już zalogowany na kiosku przez terminal (np. Terminus), użyj `cp` lub `mv` do przeniesienia plików lokalnie.
|
||||||
|
|
||||||
|
Jeżeli pliki znajdują się w katalogu `/tmp/` na kiosku, możesz użyć tego przykładu:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo cp /tmp/kiosk-manager.sh /home/kiosk/
|
||||||
|
sudo cp /tmp/presentation-manager.sh /home/kiosk/
|
||||||
|
sudo cp /tmp/waiting.html /home/kiosk/
|
||||||
|
sudo cp /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 cp /tmp/kiosk.service /etc/systemd/system/kiosk.service
|
||||||
|
sudo cp /tmp/wol-enable.service /etc/systemd/system/wol-enable.service
|
||||||
|
sudo cp /tmp/kiosk-schedule /etc/cron.d/kiosk-schedule
|
||||||
|
sudo chmod 644 /etc/cron.d/kiosk-schedule
|
||||||
|
```
|
||||||
|
|
||||||
|
Jeżeli masz pliki w innym katalogu na kiosku, użyj zamiast `/tmp/` odpowiedniej ścieżki do miejsca, w którym je zapisałeś.
|
||||||
|
|
||||||
|
Przykład z bieżącego katalogu:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo cp kiosk-manager.sh presentation-manager.sh waiting.html logo.png /home/kiosk/
|
||||||
|
```
|
||||||
|
|
||||||
|
Jeśli chcesz, możesz też użyć `mv` zamiast `cp` dla plików tymczasowych.
|
||||||
|
|
||||||
|
Jeżeli pliki są na innej maszynie, pozostaje opcja `scp`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
scp kiosk-manager.sh presentation-manager.sh waiting.html logo.png kiosk.service wol-enable.service kiosk-schedule <user>@<kiosk-ip>:/tmp/
|
||||||
|
ssh <user>@<kiosk-ip>
|
||||||
|
```
|
||||||
|
|
||||||
|
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 już działają w konfiguracji jednoekranowej. Krok kopiowania plików wykonaj raz w sekcji 5; ta część opisuje tylko dodatkowe ustawienia środowiska.
|
||||||
|
|
||||||
|
W `kiosk.service` możesz dodać zmienną środowiskową `ONE_SCREEN=1`, aby wymusić obsługę jednego ekranu:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[Service]
|
||||||
|
Environment=ONE_SCREEN=1
|
||||||
|
ExecStart=xinit /home/kiosk/kiosk-manager.sh -- :0 vt7
|
||||||
|
```
|
||||||
|
|
||||||
|
Przeładuj systemd i zrestartuj serwis:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl restart kiosk.service
|
||||||
|
```
|
||||||
|
|
||||||
|
Skrypt wykrywa rozdzielczość ekranu automatycznie; `SCREEN_WIDTH` lub `RES_W` należy ustawiać tylko w razie potrzeby.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
### 6. Rozwiązanie problemu z domenami .local
|
||||||
```
|
```
|
||||||
|
|
||||||
### 6. Rozwiązanie problemu z domenami .local
|
### 6. Rozwiązanie problemu z domenami .local
|
||||||
@@ -231,11 +356,17 @@ GRUB_TIMEOUT=0
|
|||||||
|
|
||||||
## Harmonogram — Automatyczne wyłączanie i Wake on LAN
|
## 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
|
### Na kiosku
|
||||||
|
|
||||||
@@ -285,7 +416,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'
|
cat > /etc/cron.d/kiosk-wol << 'EOF'
|
||||||
SHELL=/bin/sh
|
SHELL=/bin/sh
|
||||||
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
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).
|
# 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 21-23 * * 0 root wakeonlan XX:XX:XX:XX:XX:XX
|
||||||
*/5 * * * 1-5 root wakeonlan XX:XX:XX:XX:XX:XX
|
*/5 * * * 1-5 root wakeonlan XX:XX:XX:XX:XX:XX
|
||||||
@@ -319,14 +450,14 @@ Jednostka systemd uruchamiająca sesję X11 jako użytkownik `kiosk`.
|
|||||||
|
|
||||||
### `kiosk-manager.sh` → `/home/kiosk/kiosk-manager.sh`
|
### `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:**
|
**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
|
2. `xsetroot` + `xset` — czarne tło, wyłączony wygaszacz i DPMS
|
||||||
3. `openbox --sm-disable` — lekki WM wymagany przez `wmctrl fullscreen`
|
3. `openbox --sm-disable` — lekki WM wymagany przez `wmctrl fullscreen`
|
||||||
4. Zapisuje `registrymodifications.xcu` — wyłącza presenter console LO (`StartWithPresenterScreen=false`)
|
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
|
6. Uruchamia `presentation-manager.sh` w tle
|
||||||
7. Chromium otwiera `waiting.html` z `fullscreen` + `above`
|
7. Chromium otwiera `waiting.html` z `fullscreen` + `above`
|
||||||
8. Czeka na sieć (`ping diluals31`) **i** na plik `/tmp/kiosk-smb-ready`
|
8. Czeka na sieć (`ping diluals31`) **i** na plik `/tmp/kiosk-smb-ready`
|
||||||
@@ -338,7 +469,7 @@ Uruchamiany przez xinit. Konfiguruje X11 i obsługuje lewy ekran.
|
|||||||
| Flaga | Opis |
|
| Flaga | Opis |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `--app=URL` | Tryb aplikacji — brak paska adresu, brak kart |
|
| `--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 |
|
| `--no-first-run` | Pomija ekran powitalny |
|
||||||
| `--noerrdialogs` | Ukrywa okna dialogowe błędów |
|
| `--noerrdialogs` | Ukrywa okna dialogowe błędów |
|
||||||
| `--disable-gpu-suspend` | Zapobiega zawieszaniu GPU przy wygaszaniu |
|
| `--disable-gpu-suspend` | Zapobiega zawieszaniu GPU przy wygaszaniu |
|
||||||
@@ -349,7 +480,7 @@ Uruchamiany przez xinit. Konfiguruje X11 i obsługuje lewy ekran.
|
|||||||
| `--password-store=basic` | Nie używa systemowego portfela haseł |
|
| `--password-store=basic` | Nie używa systemowego portfela haseł |
|
||||||
| `--disable-pinch` | Wyłącza pinch-to-zoom |
|
| `--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:**
|
**Zmiana hosta / URL kiosku:**
|
||||||
```bash
|
```bash
|
||||||
@@ -362,7 +493,7 @@ KIOSK_URL="http://diluals31/terminal/ift/5/DE/index"
|
|||||||
|
|
||||||
### `presentation-manager.sh` → `/home/kiosk/presentation-manager.sh`
|
### `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:**
|
**Montowanie SMB:**
|
||||||
```bash
|
```bash
|
||||||
@@ -376,35 +507,45 @@ Przy zakończeniu skryptu (trap EXIT/INT/TERM): `umount /mnt/presentation`.
|
|||||||
**Ustawianie okien LibreOffice (`start_lo`):**
|
**Ustawianie okien LibreOffice (`start_lo`):**
|
||||||
|
|
||||||
Iteruje wszystkie widoczne okna `soffice` wg pozycji X:
|
Iteruje wszystkie widoczne okna `soffice` wg pozycji X:
|
||||||
- `x ≥ 1920` → okno pokazu slajdów → `wmctrl fullscreen`
|
- `x ≥ SCREEN_WIDTH` → okno pokazu slajdów → `wmctrl fullscreen`
|
||||||
- `x < 1920` → konsola prezentacji → przesunięcie na `x=3840` (poza desktop) + `wmctrl below`
|
- `x < SCREEN_WIDTH` → konsola prezentacji → przeniesienie poza obszar widoczny ekranu + `wmctrl below`
|
||||||
- Fallback po 5 s: jeśli nadal brak okna na prawym ekranie → przeniesienie pierwszego znalezionego
|
- 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):**
|
**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 `mtime` pliku PPTX — po zmianie restartuje pokaz
|
||||||
- Sprawdza czy `soffice` żyje — jeśli zakończył (koniec pokazu), restartuje
|
- Sprawdza czy `soffice` żyje — jeśli zakończył (koniec pokazu), restartuje
|
||||||
|
|
||||||
**Konfiguracja:**
|
**Konfiguracja:**
|
||||||
```bash
|
```bash
|
||||||
SMB_MOUNT="/mnt/presentation"
|
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"
|
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`
|
### `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`
|
### `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 +633,14 @@ systemctl start kiosk.service
|
|||||||
| Prezentacja się nie wyświetla | SMB nie zamontowany | `journalctl -u kiosk.service -b \| grep mount` — sprawdź błędy |
|
| 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: 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 |
|
| `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`) |
|
| 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 oba ekrany | Użyto `--kiosk` zamiast `--app` | Sprawdź `kiosk-manager.sh` — nie używamy `--kiosk` |
|
| Chromium rozciągnięty na cały wirtualny desktop | 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 |
|
| 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` |
|
| `openbox: command not found` | Brak pakietu | `apt install openbox` |
|
||||||
| `wmctrl: command not found` | Brak pakietu | `apt install wmctrl` |
|
| `wmctrl: command not found` | Brak pakietu | `apt install wmctrl` |
|
||||||
| `xdotool: command not found` | Brak pakietu | `apt install xdotool` |
|
| `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ć |
|
| 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` |
|
| 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` |
|
| 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` |
|
| X11 nie startuje (`cannot open display`) | Brak pakietu xorg | `apt install xorg` |
|
||||||
|
|||||||
+31
-21
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# kiosk-manager.sh — konfiguracja X11 + lewy ekran: Chromium
|
# kiosk-manager.sh — konfiguracja X11 + Chromium
|
||||||
# Plik docelowy: /home/kiosk/kiosk-manager.sh
|
# Plik docelowy: /home/kiosk/kiosk-manager.sh
|
||||||
|
|
||||||
# Jawnie ustawiamy HOME — serwis może startować jako root (xinit bez User=kiosk),
|
# 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"
|
KIOSK_URL="http://diluals31/terminal/ift/5/DE/index"
|
||||||
WAITING_PAGE="file:///home/kiosk/waiting.html"
|
WAITING_PAGE="file:///home/kiosk/waiting.html"
|
||||||
|
|
||||||
OUTPUT_LEFT="DP-1"
|
OUTPUT_LEFT="HDMI-1"
|
||||||
OUTPUT_RIGHT="HDMI-1"
|
|
||||||
RES_W=1920
|
RES_W=1920
|
||||||
RES_H=1080
|
RES_H=1080
|
||||||
|
# Domyślnie tryb jednokanałowy (jeden monitor)
|
||||||
|
ONE_SCREEN=${ONE_SCREEN:-1}
|
||||||
|
|
||||||
# ─── Niewidoczny kursor ──────────────────────────────────────────────────────
|
# ─── Niewidoczny kursor ──────────────────────────────────────────────────────
|
||||||
# Tworzymy motyw XCursor (1x1 px, ARGB 0x00000000) i eksportujemy XCURSOR_THEME
|
# 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)
|
# --auto wykrywa tryb automatycznie (bezpieczniejsze niż --mode 1920x1080)
|
||||||
xrandr --output "$OUTPUT_LEFT" --auto --primary --pos 0x0
|
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
|
# Wykryj aktualną rozdzielczość ekranu dla wyjścia HDMI-1
|
||||||
# i nie będzie widoczny na żadnym fizycznym monitorze (bez potrzeby dodatkowych pakietów)
|
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))"
|
xrandr --fb "$((RES_W * 2))x$((RES_H + 200))"
|
||||||
echo "[kiosk-manager] Konfiguracja xrandr:"
|
echo "[kiosk-manager] Konfiguracja xrandr:"
|
||||||
xrandr | grep -E "connected|[0-9]+x[0-9]+\+"
|
xrandr | grep -E "connected|[0-9]+x[0-9]+\+"
|
||||||
@@ -78,7 +90,7 @@ XCUEOF
|
|||||||
|
|
||||||
# ─── Start aplikacji ─────────────────────────────────────────────────────────
|
# ─── Start aplikacji ─────────────────────────────────────────────────────────
|
||||||
|
|
||||||
# Uruchom menedżera prezentacji w tle (prawy ekran)
|
# Uruchom menedżera prezentacji w tle
|
||||||
/home/kiosk/presentation-manager.sh &
|
/home/kiosk/presentation-manager.sh &
|
||||||
|
|
||||||
# Watchdog sesji: ukrywa okna konsoli LibreOffice przez cały czas trwania sesji X.
|
# Watchdog sesji: ukrywa okna konsoli LibreOffice przez cały czas trwania sesji X.
|
||||||
@@ -86,21 +98,19 @@ XCUEOF
|
|||||||
(
|
(
|
||||||
while sleep 0.4; do
|
while sleep 0.4; do
|
||||||
for _wid in $(xdotool search --class soffice --onlyvisible 2>/dev/null); do
|
for _wid in $(xdotool search --class soffice --onlyvisible 2>/dev/null); do
|
||||||
_wx=$(xdotool getwindowgeometry "$_wid" 2>/dev/null \
|
_wx=$(xdotool getwindowgeometry "$_wid" 2>/dev/null \
|
||||||
| awk '/Position:/{split($2,a,","); print a[1]+0}')
|
| awk '/Position:/{split($2,a,","); print a[1]+0}')
|
||||||
if [ "${_wx:-0}" -lt 1920 ]; then
|
# ukryj konsolę jeśli znajduje się na lewym ekranie
|
||||||
wmctrl -i -r "$_wid" -b remove,above 2>/dev/null
|
if [ "${_wx:-0}" -lt "$RES_W" ]; then
|
||||||
wmctrl -i -r "$_wid" -b add,below 2>/dev/null
|
wmctrl -i -r "$_wid" -b remove,above 2>/dev/null
|
||||||
xdotool windowmove --sync "$_wid" 4000 0 2>/dev/null
|
wmctrl -i -r "$_wid" -b add,below 2>/dev/null
|
||||||
echo "[kiosk-manager/watchdog] Konsola LO ukryta (WID=$_wid, x=${_wx:-?})"
|
xdotool windowmove --sync "$_wid" $((RES_W * 2)) 0 2>/dev/null
|
||||||
fi
|
echo "[kiosk-manager/watchdog] Konsola LO ukryta (WID=$_wid, x=${_wx:-?})"
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
done
|
done
|
||||||
) &
|
) &
|
||||||
|
|
||||||
# ─── START PREZENTACJI ───────────────────────────────────────────────────────
|
|
||||||
/home/kiosk/presentation-manager.sh &
|
|
||||||
|
|
||||||
# ─── WAITING SCREEN ──────────────────────────────────────────────────────────
|
# ─── WAITING SCREEN ──────────────────────────────────────────────────────────
|
||||||
chromium --app="$WAITING_PAGE" \
|
chromium --app="$WAITING_PAGE" \
|
||||||
--window-position=0,0 \
|
--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
|
for _wid in $(xdotool search --class soffice --onlyvisible 2>/dev/null); do
|
||||||
_wx=$(xdotool getwindowgeometry "$_wid" 2>/dev/null \
|
_wx=$(xdotool getwindowgeometry "$_wid" 2>/dev/null \
|
||||||
| awk '/Position:/{split($2,a,","); print a[1]+0}')
|
| 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 remove,above 2>/dev/null
|
||||||
wmctrl -i -r "$_wid" -b add,below 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
|
fi
|
||||||
done
|
done
|
||||||
done
|
done
|
||||||
|
|||||||
+2
-2
@@ -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)
|
# Wyłącz kiosk w piątek o 22:00 (planowe wyłączenie)
|
||||||
0 22 * * * root /sbin/shutdown -h now
|
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 ),
|
# Jeśli kiosk uruchomi się po utracie prądu, wpisy cron nadal będą wymuszać wyłączenie
|
||||||
# wyłącz go w ciągu max. 5 minut. Gdy kiosk jest normalnie wyłączony, wpisy nie działają.
|
# 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,6 root /sbin/shutdown -h now
|
||||||
*/5 0-5 * * 1-5 root /sbin/shutdown -h now
|
*/5 0-5 * * 1-5 root /sbin/shutdown -h now
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=Kiosk Dwuekranowy — Instrukcje + Prezentacja
|
Description=Kiosk Jednoekranowy — Instrukcje + Prezentacja
|
||||||
After=systemd-user-sessions.service
|
After=systemd-user-sessions.service
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
|
|||||||
+23
-14
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/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:
|
# Działanie:
|
||||||
# 1. Czeka na zamontowanie udziału SMB
|
# 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
|
# 5. Co 5 sekund sprawdza, czy plik się zmienił — jeśli tak, restartuje pokaz
|
||||||
|
|
||||||
SMB_MOUNT="/mnt/presentation"
|
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"
|
SMB_OPTS="credentials=/etc/samba/kiosk-credentials,uid=kiosk,gid=kiosk,vers=3.0"
|
||||||
PRESENTATION_FILE="$SMB_MOUNT/terminal_live.pptx"
|
PRESENTATION_FILE="$SMB_MOUNT/terminal_live.pptx"
|
||||||
# Lokalna kopia PPTX — LibreOffice otwiera ten plik zamiast pliku z SMB.
|
# 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).
|
# w dowolnej chwili z innego komputera (Windows/macOS/Linux).
|
||||||
LOCAL_PRESENTATION="/tmp/kiosk-live.pptx"
|
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=""
|
CURRENT_MTIME=""
|
||||||
LO_PID=""
|
LO_PID=""
|
||||||
WATCHDOG_PID=""
|
WATCHDOG_PID=""
|
||||||
@@ -44,10 +51,10 @@ console_watchdog() {
|
|||||||
for _wid in $(xdotool search --class soffice --onlyvisible 2>/dev/null); do
|
for _wid in $(xdotool search --class soffice --onlyvisible 2>/dev/null); do
|
||||||
_wx=$(xdotool getwindowgeometry "$_wid" 2>/dev/null \
|
_wx=$(xdotool getwindowgeometry "$_wid" 2>/dev/null \
|
||||||
| awk '/Position:/{split($2,a,","); print a[1]+0}')
|
| 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 remove,above 2>/dev/null
|
||||||
wmctrl -i -r "$_wid" -b add,below 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:-?})"
|
echo "[watchdog] Konsola ukryta (WID=$_wid, x=${_wx:-?})"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@@ -92,9 +99,9 @@ XCUEOF
|
|||||||
echo "[presentation-manager] LibreOffice Impress uruchomiony (PID=$LO_PID)"
|
echo "[presentation-manager] LibreOffice Impress uruchomiony (PID=$LO_PID)"
|
||||||
|
|
||||||
# Obsłuż wszystkie okna LO wg pozycji:
|
# Obsłuż wszystkie okna LO wg pozycji:
|
||||||
# x >= 1920 (prawy ekran) → okno pokazu slajdów → fullscreen
|
# x >= SCREEN_WIDTH → okno pokazu slajdów → fullscreen
|
||||||
# x < 1920 (lewy ekran) → konsola prezentacji → zminimalizuj
|
# x < SCREEN_WIDTH → konsola prezentacji → przeniesienie poza obszar widoczny
|
||||||
# Fallback po 5s: przenieś pierwsze znalezione okno na prawy ekran
|
# Fallback po 5s: przenieś pierwsze znalezione okno do widocznego obszaru
|
||||||
(
|
(
|
||||||
for _i in $(seq 1 30); do
|
for _i in $(seq 1 30); do
|
||||||
sleep 1
|
sleep 1
|
||||||
@@ -106,7 +113,7 @@ XCUEOF
|
|||||||
for WID in $WIDS; do
|
for WID in $WIDS; do
|
||||||
WIN_X=$(xdotool getwindowgeometry "$WID" 2>/dev/null \
|
WIN_X=$(xdotool getwindowgeometry "$WID" 2>/dev/null \
|
||||||
| awk '/Position:/{split($2,a,","); print a[1]+0}')
|
| 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
|
PRES_WID=$WID
|
||||||
fi
|
fi
|
||||||
# Konsola (x<1920) obsługiwana przez console_watchdog()
|
# Konsola (x<1920) obsługiwana przez console_watchdog()
|
||||||
@@ -114,20 +121,22 @@ XCUEOF
|
|||||||
|
|
||||||
if [ -n "$PRES_WID" ]; then
|
if [ -n "$PRES_WID" ]; then
|
||||||
wmctrl -i -r "$PRES_WID" -b add,fullscreen 2>/dev/null
|
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
|
break
|
||||||
fi
|
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
|
if [ "$_i" -ge 5 ]; then
|
||||||
FIRST_WID=$(echo "$WIDS" | head -1)
|
FIRST_WID=$(echo "$WIDS" | head -1)
|
||||||
if [ -n "$FIRST_WID" ]; then
|
if [ -n "$FIRST_WID" ]; then
|
||||||
wmctrl -i -r "$FIRST_WID" -b remove,fullscreen 2>/dev/null
|
wmctrl -i -r "$FIRST_WID" -b remove,fullscreen 2>/dev/null
|
||||||
sleep 0.3
|
sleep 0.3
|
||||||
xdotool windowmove --sync "$FIRST_WID" 1920 0
|
# Jeśli tryb jednokanałowy — ustaw na 0,0
|
||||||
xdotool windowsize --sync "$FIRST_WID" 1920 1080
|
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
|
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
|
break
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -206,7 +215,7 @@ while true; do
|
|||||||
CURRENT_MTIME="$NEW_MTIME"
|
CURRENT_MTIME="$NEW_MTIME"
|
||||||
start_lo
|
start_lo
|
||||||
# Po 5 s wyślij sygnał do kiosk-manager.sh — restartuje Chromium po tym jak 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
|
( sleep 5
|
||||||
touch /tmp/kiosk-chromium-restart
|
touch /tmp/kiosk-chromium-restart
|
||||||
echo "[presentation-manager] Sygnał restart Chromium wysłany"
|
echo "[presentation-manager] Sygnał restart Chromium wysłany"
|
||||||
|
|||||||
+14
-21
@@ -1,39 +1,32 @@
|
|||||||
# Konfiguracja sway dla kiosku dwuekranowego
|
# Konfiguracja sway dla kiosku jednoekranowego
|
||||||
# Plik docelowy: /home/kiosk/.config/sway/config
|
# 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
|
# 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:
|
# lub gdy sway/kiosk JUŻ działa:
|
||||||
# WAYLAND_DISPLAY=wayland-0 XDG_RUNTIME_DIR=/run/kiosk wlr-randr
|
# 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 HDMI-1
|
||||||
set $OUTPUT_RIGHT HDMI-1
|
|
||||||
|
|
||||||
# --- Wyjścia wideo ---
|
# --- Wyjście wideo ---
|
||||||
output * bg #000000 solid_color
|
output * bg #000000 solid_color
|
||||||
|
|
||||||
# Opcjonalnie: rotacja per-wyjście (odkomentuj jeśli wymagana)
|
# Opcjonalnie: rotacja per-wyjście (odkomentuj jeśli wymagana)
|
||||||
# output $OUTPUT_LEFT transform 270
|
# output $OUTPUT transform 270
|
||||||
# output $OUTPUT_RIGHT transform 270
|
|
||||||
|
|
||||||
# Przypisanie workspace do ekranów
|
# Przypisanie workspace do ekranu
|
||||||
workspace 1 output $OUTPUT_LEFT
|
workspace 1 output $OUTPUT
|
||||||
workspace 2 output $OUTPUT_RIGHT
|
|
||||||
|
|
||||||
# --- Przypisanie aplikacji do workspaces ---
|
# --- Przypisanie aplikacji do workspace 1 ---
|
||||||
# Chromium (prawy ekran — workspace 2)
|
# Wszystkie aplikacje będą działać na jednym ekranie.
|
||||||
# --app=URL generuje app_id: "chrome-<hash>-Default" — używamy regex
|
assign [app_id="~^chrome"] workspace 1
|
||||||
assign [app_id="~^chrome"] workspace 2
|
assign [app_id="soffice"] workspace 1
|
||||||
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
|
|
||||||
assign [class="libreoffice-impress"] 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
|
for_window [class="libreoffice-impress"] fullscreen enable
|
||||||
# Jeśli powyższe nie działają, sprawdź rzeczywistą klasę:
|
# 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'
|
# WAYLAND_DISPLAY=wayland-0 XDG_RUNTIME_DIR=/run/kiosk swaymsg -t get_tree | grep -E 'app_id|class'
|
||||||
|
|||||||
Reference in New Issue
Block a user