Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
33ef898fcc | ||
|
|
4e20e358aa |
No files matched your search
@@ -1,4 +1,4 @@
|
|||||||
# VoxIP Kiosk OS
|
# Daynivo Kiosk OS
|
||||||
|
|
||||||
Lichte, onderhoudbare kioskdistributie voor de Raspberry Pi 3 (Model B/B+)
|
Lichte, onderhoudbare kioskdistributie voor de Raspberry Pi 3 (Model B/B+)
|
||||||
op basis van Raspberry Pi OS Lite 32-bit (Bookworm of Trixie). Na het
|
op basis van Raspberry Pi OS Lite 32-bit (Bookworm of Trixie). Na het
|
||||||
@@ -24,7 +24,7 @@ hardware staat in [`docs/HARDWARE-TEST.md`](docs/HARDWARE-TEST.md).
|
|||||||
### Optie A — kant-en-klare image
|
### Optie A — kant-en-klare image
|
||||||
|
|
||||||
1. Bouw de image (zie hieronder) of gebruik een uitgebrachte
|
1. Bouw de image (zie hieronder) of gebruik een uitgebrachte
|
||||||
`*-voxip-kiosk-os-*.img.xz`.
|
`*-daynivo-kiosk-os-*.img.xz`.
|
||||||
2. Schrijf hem met **Raspberry Pi Imager** (*Eigen image gebruiken*) of
|
2. Schrijf hem met **Raspberry Pi Imager** (*Eigen image gebruiken*) of
|
||||||
**balenaEtcher** naar een microSD-kaart van 16 GB of groter.
|
**balenaEtcher** naar een microSD-kaart van 16 GB of groter.
|
||||||
3. Optioneel, in Raspberry Pi Imager → *OS-aanpassingen*: wifi, gebruiker
|
3. Optioneel, in Raspberry Pi Imager → *OS-aanpassingen*: wifi, gebruiker
|
||||||
@@ -45,8 +45,8 @@ standaard sinds Bookworm).
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo apt-get install -y git
|
sudo apt-get install -y git
|
||||||
git clone <url-van-deze-repository> voxip-kiosk-os
|
git clone <url-van-deze-repository> daynivo-kiosk-os
|
||||||
cd voxip-kiosk-os
|
cd daynivo-kiosk-os
|
||||||
sudo ./install.sh --url "https://schermen-ijsselflat.voxip.nl" --name "IJsselflat" --hostname ijsselflat
|
sudo ./install.sh --url "https://schermen-ijsselflat.voxip.nl" --name "IJsselflat" --hostname ijsselflat
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ de Daynivo-repository)? Dan neemt `install.sh` de display-URL (inclusief
|
|||||||
### Updaten
|
### Updaten
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd voxip-kiosk-os
|
cd daynivo-kiosk-os
|
||||||
sudo ./update.sh # git pull --ff-only + back-up van /etc/voxip-kiosk + install.sh --upgrade
|
sudo ./update.sh # git pull --ff-only + back-up van /etc/voxip-kiosk + install.sh --upgrade
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -95,7 +95,7 @@ sudo apt-get install -y qemu-user-static binfmt-support # alleen op x86_64
|
|||||||
sudo ./image/build.sh --native
|
sudo ./image/build.sh --native
|
||||||
```
|
```
|
||||||
|
|
||||||
Resultaat: `image/deploy/<datum>-voxip-kiosk-os-<versie>.img.xz` plus een
|
Resultaat: `image/deploy/<datum>-daynivo-kiosk-os-<versie>.img.xz` plus een
|
||||||
`.sha256` en `BUILD-INFO-<versie>.txt`.
|
`.sha256` en `BUILD-INFO-<versie>.txt`.
|
||||||
|
|
||||||
Instelbaar via omgevingsvariabelen:
|
Instelbaar via omgevingsvariabelen:
|
||||||
@@ -105,7 +105,7 @@ Instelbaar via omgevingsvariabelen:
|
|||||||
| `PI_GEN_REF` | `2024-11-19-raspios-bookworm-armhf` | pi-gen-tag (32-bit) |
|
| `PI_GEN_REF` | `2024-11-19-raspios-bookworm-armhf` | pi-gen-tag (32-bit) |
|
||||||
| `RELEASE` | `bookworm` | `bookworm` of `trixie` (moet bij `PI_GEN_REF` passen) |
|
| `RELEASE` | `bookworm` | `bookworm` of `trixie` (moet bij `PI_GEN_REF` passen) |
|
||||||
| `VOXIP_DEFAULT_URL` | `https://schermen-ijsselflat.voxip.nl` | standaard kiosk-URL |
|
| `VOXIP_DEFAULT_URL` | `https://schermen-ijsselflat.voxip.nl` | standaard kiosk-URL |
|
||||||
| `VOXIP_DEVICE_NAME` | `VoxIP Kiosk` | standaard apparaatnaam |
|
| `VOXIP_DEVICE_NAME` | `Daynivo Kiosk` | standaard apparaatnaam |
|
||||||
| `TARGET_HOSTNAME` | `kiosk` | hostname (`http://<hostname>.local:8080`) |
|
| `TARGET_HOSTNAME` | `kiosk` | hostname (`http://<hostname>.local:8080`) |
|
||||||
| `ALLOW_DIRTY` | `0` | `1` = bouw de werkmap in plaats van de laatste commit |
|
| `ALLOW_DIRTY` | `0` | `1` = bouw de werkmap in plaats van de laatste commit |
|
||||||
|
|
||||||
@@ -151,7 +151,7 @@ journalctl -u voxip-kiosk-browser -u voxip-kiosk-agent -f
|
|||||||
|
|
||||||
| Sleutel | Standaard | Betekenis |
|
| Sleutel | Standaard | Betekenis |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `device_name` | `VoxIP Kiosk` | naam in beheer en op de offlinepagina |
|
| `device_name` | `Daynivo Kiosk` | naam in beheer en op de offlinepagina |
|
||||||
| `url` | `https://schermen-ijsselflat.voxip.nl` | kiosk-URL, alleen HTTPS |
|
| `url` | `https://schermen-ijsselflat.voxip.nl` | kiosk-URL, alleen HTTPS |
|
||||||
| `refresh_interval` | `0` | 0 = uit, anders 30–86400 seconden |
|
| `refresh_interval` | `0` | 0 = uit, anders 30–86400 seconden |
|
||||||
| `screen_always_on` | `true` | geen screensaver/DPMS |
|
| `screen_always_on` | `true` | geen screensaver/DPMS |
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
# VoxIP Kiosk OS: allow the kiosk X server to be started by a system service.
|
# Daynivo Kiosk OS: allow the kiosk X server to be started by a system service.
|
||||||
allowed_users=anybody
|
allowed_users=anybody
|
||||||
needs_root_rights=yes
|
needs_root_rights=yes
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"device_name": "VoxIP Kiosk",
|
"device_name": "Daynivo Kiosk",
|
||||||
"url": "https://schermen-ijsselflat.voxip.nl",
|
"url": "https://schermen-ijsselflat.voxip.nl",
|
||||||
"refresh_interval": 0,
|
"refresh_interval": 0,
|
||||||
"screen_always_on": true,
|
"screen_always_on": true,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# VoxIP Kiosk OS: bounded journal, few SD-card writes.
|
# Daynivo Kiosk OS: bounded journal, few SD-card writes.
|
||||||
[Journal]
|
[Journal]
|
||||||
Storage=persistent
|
Storage=persistent
|
||||||
SystemMaxUse=32M
|
SystemMaxUse=32M
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[Plymouth Theme]
|
[Plymouth Theme]
|
||||||
Name=voxip-kiosk
|
Name=voxip-kiosk
|
||||||
Description=VoxIP Kiosk boot splash (logo on white)
|
Description=Daynivo Kiosk boot splash (logo on white)
|
||||||
ModuleName=script
|
ModuleName=script
|
||||||
|
|
||||||
[script]
|
[script]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# VoxIP Kiosk boot splash: logo.png centred on white, at most half the screen.
|
# Daynivo Kiosk boot splash: logo.png centred on white, at most half the screen.
|
||||||
# Replace logo.png (any size, PNG with transparency) for a different logo.
|
# Replace logo.png (any size, PNG with transparency) for a different logo.
|
||||||
Window.SetBackgroundTopColor(1, 1, 1);
|
Window.SetBackgroundTopColor(1, 1, 1);
|
||||||
Window.SetBackgroundBottomColor(1, 1, 1);
|
Window.SetBackgroundBottomColor(1, 1, 1);
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
# VoxIP Kiosk OS: the web interface (user voxip) may run exactly one program
|
# Daynivo Kiosk OS: the web interface (user voxip) may run exactly one program
|
||||||
# as root: the restricted helper, which validates all of its input itself.
|
# as root: the restricted helper, which validates all of its input itself.
|
||||||
Defaults:voxip !requiretty
|
Defaults:voxip !requiretty
|
||||||
voxip ALL=(root) NOPASSWD: /usr/lib/voxip-kiosk/voxip-kiosk-helper
|
voxip ALL=(root) NOPASSWD: /usr/lib/voxip-kiosk/voxip-kiosk-helper
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# VoxIP Kiosk OS: hardware watchdog. A hung kernel or PID 1 reboots the Pi.
|
# Daynivo Kiosk OS: hardware watchdog. A hung kernel or PID 1 reboots the Pi.
|
||||||
[Manager]
|
[Manager]
|
||||||
RuntimeWatchdogSec=15s
|
RuntimeWatchdogSec=15s
|
||||||
RebootWatchdogSec=2min
|
RebootWatchdogSec=2min
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# VoxIP Kiosk OS: compressed swap in RAM instead of a swap file on the SD card.
|
# Daynivo Kiosk OS: compressed swap in RAM instead of a swap file on the SD card.
|
||||||
[zram0]
|
[zram0]
|
||||||
zram-size = ram / 2
|
zram-size = ram / 2
|
||||||
compression-algorithm = zstd
|
compression-algorithm = zstd
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Architectuur — VoxIP Kiosk OS
|
# Architectuur — Daynivo Kiosk OS
|
||||||
|
|
||||||
Dit document is het architectuurvoorstel waarop de implementatie in deze
|
Dit document is het architectuurvoorstel waarop de implementatie in deze
|
||||||
repository gebaseerd is. Het beschrijft de onderdelen, hun rechten, hoe ze
|
repository gebaseerd is. Het beschrijft de onderdelen, hun rechten, hoe ze
|
||||||
@@ -119,7 +119,7 @@ draait) kan het apparaat dus claimen, iemand anders op het netwerk niet.
|
|||||||
`voxip-network-guard.service` de snapshot terug bij het opstarten, nog
|
`voxip-network-guard.service` de snapshot terug bij het opstarten, nog
|
||||||
vóór NetworkManager start.
|
vóór NetworkManager start.
|
||||||
6. Noodherstel: een leeg bestand `voxip-network-reset` op de bootpartitie
|
6. Noodherstel: een leeg bestand `voxip-network-reset` op de bootpartitie
|
||||||
verwijdert bij de volgende boot alle VoxIP-netwerkprofielen (terug naar
|
verwijdert bij de volgende boot alle Daynivo-netwerkprofielen (terug naar
|
||||||
DHCP).
|
DHCP).
|
||||||
|
|
||||||
### Configuratie
|
### Configuratie
|
||||||
@@ -168,7 +168,7 @@ draait) kan het apparaat dus claimen, iemand anders op het netwerk niet.
|
|||||||
## Directorystructuur
|
## Directorystructuur
|
||||||
|
|
||||||
```
|
```
|
||||||
voxip-kiosk-os/
|
daynivo-kiosk-os/
|
||||||
├── README.md bouw-, flash-, installatie-instructies
|
├── README.md bouw-, flash-, installatie-instructies
|
||||||
├── VERSION
|
├── VERSION
|
||||||
├── Makefile test / lint / image
|
├── Makefile test / lint / image
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ Noteer per stap: ✅ / ❌ + opmerking, de imageversie en het schermtype.
|
|||||||
`voxip-config.error.txt` met de reden. De kiosk start met de standaardconfiguratie.
|
`voxip-config.error.txt` met de reden. De kiosk start met de standaardconfiguratie.
|
||||||
- [ ] `sudo ./update.sh` vanuit een nieuwere checkout: versie in het dashboard
|
- [ ] `sudo ./update.sh` vanuit een nieuwere checkout: versie in het dashboard
|
||||||
verhoogd, configuratie en wachtwoord ongewijzigd, back-up in `/var/backups`.
|
verhoogd, configuratie en wachtwoord ongewijzigd, back-up in `/var/backups`.
|
||||||
- [ ] `sudo ./uninstall.sh --purge` op een testkaart: geen VoxIP-services of
|
- [ ] `sudo ./uninstall.sh --purge` op een testkaart: geen Daynivo-services of
|
||||||
-bestanden meer (`systemctl list-unit-files | grep voxip` is leeg).
|
-bestanden meer (`systemctl list-unit-files | grep voxip` is leeg).
|
||||||
- [ ] Installatie op een bestaande Raspberry Pi OS Lite (Bookworm) met de
|
- [ ] Installatie op een bestaande Raspberry Pi OS Lite (Bookworm) met de
|
||||||
Daynivo-kiosk erop: URL overgenomen, `display-kiosk.service` uitgeschakeld.
|
Daynivo-kiosk erop: URL overgenomen, `display-kiosk.service` uitgeschakeld.
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
VoxIP Kiosk OS — bestanden op deze bootpartitie
|
Daynivo Kiosk OS — bestanden op deze bootpartitie
|
||||||
================================================
|
================================================
|
||||||
|
|
||||||
Je kunt een kiosk vooraf instellen door vóór de eerste start bestanden op
|
Je kunt een kiosk vooraf instellen door vóór de eerste start bestanden op
|
||||||
|
|||||||
+5
-5
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#
|
#
|
||||||
# Build a flashable VoxIP Kiosk OS image (.img.xz) with pi-gen.
|
# Build a flashable Daynivo Kiosk OS image (.img.xz) with pi-gen.
|
||||||
#
|
#
|
||||||
# ./image/build.sh # build in Docker (recommended)
|
# ./image/build.sh # build in Docker (recommended)
|
||||||
# sudo ./image/build.sh --native # build directly on a Debian/Ubuntu host
|
# sudo ./image/build.sh --native # build directly on a Debian/Ubuntu host
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
# TARGET_HOSTNAME default hostname (the admin UI is at http://<hostname>.local:8080).
|
# TARGET_HOSTNAME default hostname (the admin UI is at http://<hostname>.local:8080).
|
||||||
# ALLOW_DIRTY=1 build from the working tree instead of the committed HEAD.
|
# ALLOW_DIRTY=1 build from the working tree instead of the committed HEAD.
|
||||||
#
|
#
|
||||||
# Output: image/deploy/<date>-voxip-kiosk-os-<version>.img.xz (+ .sha256)
|
# Output: image/deploy/<date>-daynivo-kiosk-os-<version>.img.xz (+ .sha256)
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@ PI_GEN_REPO="${PI_GEN_REPO:-https://github.com/RPi-Distro/pi-gen.git}"
|
|||||||
PI_GEN_REF="${PI_GEN_REF:-2024-11-19-raspios-bookworm-armhf}"
|
PI_GEN_REF="${PI_GEN_REF:-2024-11-19-raspios-bookworm-armhf}"
|
||||||
RELEASE="${RELEASE:-bookworm}"
|
RELEASE="${RELEASE:-bookworm}"
|
||||||
VOXIP_DEFAULT_URL="${VOXIP_DEFAULT_URL:-https://schermen-ijsselflat.voxip.nl}"
|
VOXIP_DEFAULT_URL="${VOXIP_DEFAULT_URL:-https://schermen-ijsselflat.voxip.nl}"
|
||||||
VOXIP_DEVICE_NAME="${VOXIP_DEVICE_NAME:-VoxIP Kiosk}"
|
VOXIP_DEVICE_NAME="${VOXIP_DEVICE_NAME:-Daynivo Kiosk}"
|
||||||
TARGET_HOSTNAME="${TARGET_HOSTNAME:-kiosk}"
|
TARGET_HOSTNAME="${TARGET_HOSTNAME:-kiosk}"
|
||||||
NATIVE=0
|
NATIVE=0
|
||||||
[[ ${1:-} == "--native" ]] && NATIVE=1
|
[[ ${1:-} == "--native" ]] && NATIVE=1
|
||||||
@@ -49,7 +49,7 @@ PIGEN="$WORK/pi-gen"
|
|||||||
touch "$PIGEN/stage2/SKIP_IMAGES"
|
touch "$PIGEN/stage2/SKIP_IMAGES"
|
||||||
rm -f "$PIGEN/stage2/EXPORT_NOOBS"
|
rm -f "$PIGEN/stage2/EXPORT_NOOBS"
|
||||||
|
|
||||||
echo "==> VoxIP-stage voorbereiden"
|
echo "==> Daynivo-stage voorbereiden"
|
||||||
cp -a "$ROOT/image/stage-voxip" "$PIGEN/stage-voxip"
|
cp -a "$ROOT/image/stage-voxip" "$PIGEN/stage-voxip"
|
||||||
PAYLOAD="$PIGEN/stage-voxip/00-voxip/files/voxip-kiosk"
|
PAYLOAD="$PIGEN/stage-voxip/00-voxip/files/voxip-kiosk"
|
||||||
mkdir -p "$PAYLOAD"
|
mkdir -p "$PAYLOAD"
|
||||||
@@ -86,7 +86,7 @@ EOF
|
|||||||
FIRST_USER_PASS="$(openssl rand -base64 33 | tr -d '\n/+=')"
|
FIRST_USER_PASS="$(openssl rand -base64 33 | tr -d '\n/+=')"
|
||||||
|
|
||||||
cat > "$PIGEN/config" <<EOF
|
cat > "$PIGEN/config" <<EOF
|
||||||
IMG_NAME=voxip-kiosk-os-$VERSION
|
IMG_NAME=daynivo-kiosk-os-$VERSION
|
||||||
IMG_DATE=$BUILD_DATE
|
IMG_DATE=$BUILD_DATE
|
||||||
RELEASE=$RELEASE
|
RELEASE=$RELEASE
|
||||||
DEPLOY_COMPRESSION=xz
|
DEPLOY_COMPRESSION=xz
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/bash -e
|
#!/bin/bash -e
|
||||||
# Install VoxIP Kiosk OS into the image with the same install.sh that is
|
# Install Daynivo Kiosk OS into the image with the same install.sh that is
|
||||||
# used on existing Raspberry Pi OS installations.
|
# used on existing Raspberry Pi OS installations.
|
||||||
|
|
||||||
# shellcheck disable=SC1091
|
# shellcheck disable=SC1091
|
||||||
|
|||||||
+10
-7
@@ -1,8 +1,8 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#
|
#
|
||||||
# VoxIP Kiosk OS installer.
|
# Daynivo Kiosk OS installer.
|
||||||
#
|
#
|
||||||
# Turns Raspberry Pi OS Lite (Bookworm/Trixie, NetworkManager) into a VoxIP
|
# Turns Raspberry Pi OS Lite (Bookworm/Trixie, NetworkManager) into a Daynivo
|
||||||
# kiosk. Also used by the image builder (inside the pi-gen chroot), so a
|
# kiosk. Also used by the image builder (inside the pi-gen chroot), so a
|
||||||
# flashed image and a manual install are identical.
|
# flashed image and a manual install are identical.
|
||||||
#
|
#
|
||||||
@@ -53,7 +53,7 @@ while [[ $# -gt 0 ]]; do
|
|||||||
done
|
done
|
||||||
|
|
||||||
[[ $EUID -eq 0 ]] || die "Voer dit script uit met sudo."
|
[[ $EUID -eq 0 ]] || die "Voer dit script uit met sudo."
|
||||||
[[ -f "$SRC/src/voxip_kiosk/config.py" ]] || die "Start install.sh vanuit de VoxIP Kiosk OS-repository."
|
[[ -f "$SRC/src/voxip_kiosk/config.py" ]] || die "Start install.sh vanuit de Daynivo Kiosk OS-repository."
|
||||||
|
|
||||||
in_chroot() {
|
in_chroot() {
|
||||||
if command -v systemd-detect-virt >/dev/null 2>&1 && systemd-detect-virt --chroot --quiet; then
|
if command -v systemd-detect-virt >/dev/null 2>&1 && systemd-detect-virt --chroot --quiet; then
|
||||||
@@ -75,12 +75,12 @@ esac
|
|||||||
|
|
||||||
if [[ $LIVE -eq 1 && $MODE == install ]]; then
|
if [[ $LIVE -eq 1 && $MODE == install ]]; then
|
||||||
if ! systemctl is-enabled --quiet NetworkManager.service 2>/dev/null && systemctl is-enabled --quiet dhcpcd.service 2>/dev/null; then
|
if ! systemctl is-enabled --quiet NetworkManager.service 2>/dev/null && systemctl is-enabled --quiet dhcpcd.service 2>/dev/null; then
|
||||||
die "Dit systeem gebruikt dhcpcd. VoxIP Kiosk OS vereist NetworkManager (standaard sinds Bookworm). Schakel om via 'sudo raspi-config' → Advanced Options → Network Config, of gebruik de kant-en-klare image."
|
die "Dit systeem gebruikt dhcpcd. Daynivo Kiosk OS vereist NetworkManager (standaard sinds Bookworm). Schakel om via 'sudo raspi-config' → Advanced Options → Network Config, of gebruik de kant-en-klare image."
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
VERSION="$(tr -d '[:space:]' < "$SRC/VERSION")"
|
VERSION="$(tr -d '[:space:]' < "$SRC/VERSION")"
|
||||||
say "VoxIP Kiosk OS $VERSION installeren (modus: $MODE)"
|
say "Daynivo Kiosk OS $VERSION installeren (modus: $MODE)"
|
||||||
|
|
||||||
# --- packages -----------------------------------------------------------------
|
# --- packages -----------------------------------------------------------------
|
||||||
pkg_available() { apt-cache policy "$1" 2>/dev/null | grep -q 'Candidate: [0-9]'; }
|
pkg_available() { apt-cache policy "$1" 2>/dev/null | grep -q 'Candidate: [0-9]'; }
|
||||||
@@ -109,7 +109,7 @@ pkg_available() { apt-cache policy "$1" 2>/dev/null | grep -q 'Candidate: [0-9]'
|
|||||||
say "Gebruikers aanmaken"
|
say "Gebruikers aanmaken"
|
||||||
getent group kiosk >/dev/null || groupadd --system kiosk
|
getent group kiosk >/dev/null || groupadd --system kiosk
|
||||||
id kiosk >/dev/null 2>&1 || useradd --system --gid kiosk --home-dir /home/kiosk --create-home \
|
id kiosk >/dev/null 2>&1 || useradd --system --gid kiosk --home-dir /home/kiosk --create-home \
|
||||||
--shell /usr/sbin/nologin --comment "VoxIP kiosk display" kiosk
|
--shell /usr/sbin/nologin --comment "Daynivo kiosk display" kiosk
|
||||||
for g in video render input audio; do
|
for g in video render input audio; do
|
||||||
getent group "$g" >/dev/null && usermod -aG "$g" kiosk
|
getent group "$g" >/dev/null && usermod -aG "$g" kiosk
|
||||||
done
|
done
|
||||||
@@ -175,6 +175,9 @@ updates = {}
|
|||||||
if url: updates["url"] = url
|
if url: updates["url"] = url
|
||||||
if name: updates["device_name"] = name
|
if name: updates["device_name"] = name
|
||||||
if os.path.exists(path):
|
if os.path.exists(path):
|
||||||
|
# The old default device name went along with the rename to Daynivo; a chosen name stays.
|
||||||
|
if "device_name" not in updates and c.load_config(c.Path(path)).get("device_name") == "VoxIP Kiosk":
|
||||||
|
updates["device_name"] = "Daynivo Kiosk"
|
||||||
if updates:
|
if updates:
|
||||||
c.save_config(c.Path(path), updates)
|
c.save_config(c.Path(path), updates)
|
||||||
print("Bestaande configuratie bijgewerkt:", ", ".join(updates))
|
print("Bestaande configuratie bijgewerkt:", ", ".join(updates))
|
||||||
@@ -325,7 +328,7 @@ HOST="$(hostname)"
|
|||||||
SCHEME=http
|
SCHEME=http
|
||||||
grep -q '"admin_https": true' "$ETC/config.json" && SCHEME=https
|
grep -q '"admin_https": true' "$ETC/config.json" && SCHEME=https
|
||||||
echo
|
echo
|
||||||
say "VoxIP Kiosk OS $VERSION is geïnstalleerd."
|
say "Daynivo Kiosk OS $VERSION is geïnstalleerd."
|
||||||
echo " Beheerinterface: ${SCHEME}://${HOST}.local:${ADMIN_PORT}"
|
echo " Beheerinterface: ${SCHEME}://${HOST}.local:${ADMIN_PORT}"
|
||||||
for ip in $(hostname -I 2>/dev/null); do
|
for ip in $(hostname -I 2>/dev/null); do
|
||||||
[[ $ip == *:* ]] || echo " ${SCHEME}://${ip}:${ADMIN_PORT}"
|
[[ $ip == *:* ]] || echo " ${SCHEME}://${ip}:${ADMIN_PORT}"
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "voxip-kiosk"
|
name = "voxip-kiosk"
|
||||||
dynamic = ["version"]
|
dynamic = ["version"]
|
||||||
description = "VoxIP Kiosk OS — kiosk runtime and Daynivo Kiosk Manager"
|
description = "Daynivo Kiosk OS — kiosk runtime and Daynivo Kiosk Manager"
|
||||||
requires-python = ">=3.11"
|
requires-python = ">=3.11"
|
||||||
|
|
||||||
[tool.pytest.ini_options]
|
[tool.pytest.ini_options]
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
"""VoxIP Kiosk OS — kiosk runtime and Daynivo Kiosk Manager."""
|
"""Daynivo Kiosk OS — kiosk runtime and Daynivo Kiosk Manager."""
|
||||||
@@ -46,7 +46,7 @@ BLANK_URLS = {"", "about:blank", "chrome://newtab/", "chrome://new-tab-page/"}
|
|||||||
|
|
||||||
def probe(url: str, timeout: float = 8.0) -> tuple[bool, str]:
|
def probe(url: str, timeout: float = 8.0) -> tuple[bool, str]:
|
||||||
"""Is ``url`` reachable over HTTPS with a valid certificate? → (ok, reason)."""
|
"""Is ``url`` reachable over HTTPS with a valid certificate? → (ok, reason)."""
|
||||||
req = urllib.request.Request(url, method="HEAD", headers={"User-Agent": "VoxIP-Kiosk-OS/agent"})
|
req = urllib.request.Request(url, method="HEAD", headers={"User-Agent": "Daynivo-Kiosk-OS/agent"})
|
||||||
try:
|
try:
|
||||||
with urllib.request.urlopen(req, timeout=timeout, context=ssl.create_default_context()):
|
with urllib.request.urlopen(req, timeout=timeout, context=ssl.create_default_context()):
|
||||||
return True, ""
|
return True, ""
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ from . import validation as v
|
|||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
DEFAULTS: dict[str, Any] = {
|
DEFAULTS: dict[str, Any] = {
|
||||||
"device_name": "VoxIP Kiosk",
|
"device_name": "Daynivo Kiosk",
|
||||||
"url": "https://schermen-ijsselflat.voxip.nl",
|
"url": "https://schermen-ijsselflat.voxip.nl",
|
||||||
"refresh_interval": 0,
|
"refresh_interval": 0,
|
||||||
"screen_always_on": True,
|
"screen_always_on": True,
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ def cmd_status(args) -> int:
|
|||||||
paths = default_paths()
|
paths = default_paths()
|
||||||
config = load_config(paths.config_file)
|
config = load_config(paths.config_file)
|
||||||
agent = read_state(paths.agent_state_file)
|
agent = read_state(paths.agent_state_file)
|
||||||
print(f"VoxIP Kiosk OS {read_version(paths)}")
|
print(f"Daynivo Kiosk OS {read_version(paths)}")
|
||||||
print(f"Apparaat: {config['device_name']}")
|
print(f"Apparaat: {config['device_name']}")
|
||||||
print(f"URL: {config['url'] if args.show_secrets else mask_url(config['url'])}")
|
print(f"URL: {config['url'] if args.show_secrets else mask_url(config['url'])}")
|
||||||
print(f"Beheer: {'https' if config['admin_https'] else 'http'}://{os.uname().nodename}.local:{config['admin_port']}")
|
print(f"Beheer: {'https' if config['admin_https'] else 'http'}://{os.uname().nodename}.local:{config['admin_port']}")
|
||||||
@@ -138,7 +138,7 @@ def cmd_version(_args) -> int:
|
|||||||
|
|
||||||
|
|
||||||
def main(argv: list[str] | None = None) -> int:
|
def main(argv: list[str] | None = None) -> int:
|
||||||
parser = argparse.ArgumentParser(prog="voxip-kiosk-ctl", description="Beheer van VoxIP Kiosk OS vanaf de commandoregel.")
|
parser = argparse.ArgumentParser(prog="voxip-kiosk-ctl", description="Beheer van Daynivo Kiosk OS vanaf de commandoregel.")
|
||||||
sub = parser.add_subparsers(dest="command", required=True)
|
sub = parser.add_subparsers(dest="command", required=True)
|
||||||
p = sub.add_parser("status", help="toon de status")
|
p = sub.add_parser("status", help="toon de status")
|
||||||
p.add_argument("--show-secrets", action="store_true", help="toon de volledige URL inclusief token")
|
p.add_argument("--show-secrets", action="store_true", help="toon de volledige URL inclusief token")
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
"""voxip-kiosk-helper — the only privileged entry point of VoxIP Kiosk OS.
|
"""voxip-kiosk-helper — the only privileged entry point of Daynivo Kiosk OS.
|
||||||
|
|
||||||
Runs as root, either through ``sudo -n`` from the web interface (user
|
Runs as root, either through ``sudo -n`` from the web interface (user
|
||||||
``voxip``) or from systemd units. It accepts a fixed set of verbs, validates
|
``voxip``) or from systemd units. It accepts a fixed set of verbs, validates
|
||||||
@@ -296,7 +296,7 @@ class Helper:
|
|||||||
if src.exists():
|
if src.exists():
|
||||||
shutil.move(str(src), str(stash / src.name))
|
shutil.move(str(src), str(stash / src.name))
|
||||||
trigger.unlink()
|
trigger.unlink()
|
||||||
log(syslog.LOG_WARNING, f"Netwerk-reset uitgevoerd; VoxIP-profielen verplaatst naar {stash}")
|
log(syslog.LOG_WARNING, f"Netwerk-reset uitgevoerd; Daynivo-profielen verplaatst naar {stash}")
|
||||||
result["reset"] = True
|
result["reset"] = True
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@@ -367,7 +367,7 @@ class Helper:
|
|||||||
sshd_dir = self.etc / "ssh" / "sshd_config.d"
|
sshd_dir = self.etc / "ssh" / "sshd_config.d"
|
||||||
sshd_dir.mkdir(parents=True, exist_ok=True)
|
sshd_dir.mkdir(parents=True, exist_ok=True)
|
||||||
(sshd_dir / "voxip-kiosk.conf").write_text(
|
(sshd_dir / "voxip-kiosk.conf").write_text(
|
||||||
"# Beheerd door VoxIP Kiosk OS: alleen inloggen met SSH-sleutels.\n"
|
"# Beheerd door Daynivo Kiosk OS: alleen inloggen met SSH-sleutels.\n"
|
||||||
"PasswordAuthentication no\nKbdInteractiveAuthentication no\nPermitRootLogin no\n",
|
"PasswordAuthentication no\nKbdInteractiveAuthentication no\nPermitRootLogin no\n",
|
||||||
encoding="utf-8",
|
encoding="utf-8",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ def ensure_certificate(paths: Paths) -> tuple[Path, Path]:
|
|||||||
log.info("Zelfondertekend certificaat aanmaken voor %s.local", host)
|
log.info("Zelfondertekend certificaat aanmaken voor %s.local", host)
|
||||||
subprocess.run([
|
subprocess.run([
|
||||||
"openssl", "req", "-x509", "-newkey", "rsa:2048", "-nodes", "-days", "3650",
|
"openssl", "req", "-x509", "-newkey", "rsa:2048", "-nodes", "-days", "3650",
|
||||||
"-subj", f"/CN={host}.local/O=VoxIP Kiosk OS",
|
"-subj", f"/CN={host}.local/O=Daynivo Kiosk OS",
|
||||||
"-addext", f"subjectAltName=DNS:{host}.local,DNS:{host},IP:127.0.0.1",
|
"-addext", f"subjectAltName=DNS:{host}.local,DNS:{host},IP:127.0.0.1",
|
||||||
"-keyout", str(key), "-out", str(cert),
|
"-keyout", str(key), "-out", str(cert),
|
||||||
], check=True, capture_output=True, timeout=120)
|
], check=True, capture_output=True, timeout=120)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
"""Filesystem locations used by every VoxIP Kiosk component.
|
"""Filesystem locations used by every Daynivo Kiosk component.
|
||||||
|
|
||||||
The defaults match the installed layout. Unprivileged components may
|
The defaults match the installed layout. Unprivileged components may
|
||||||
override them through ``VOXIP_*`` environment variables (used by the test
|
override them through ``VOXIP_*`` environment variables (used by the test
|
||||||
|
|||||||
@@ -58,7 +58,7 @@
|
|||||||
|
|
||||||
<footer class="footer">
|
<footer class="footer">
|
||||||
<span>{{ device_name }} · {{ hostname }}</span>
|
<span>{{ device_name }} · {{ hostname }}</span>
|
||||||
<span>VoxIP Kiosk OS {{ version }}</span>
|
<span>Daynivo Kiosk OS {{ version }}</span>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<dialog id="confirm-dialog" class="dialog">
|
<dialog id="confirm-dialog" class="dialog">
|
||||||
|
|||||||
@@ -53,7 +53,7 @@
|
|||||||
<h2>Over dit apparaat</h2>
|
<h2>Over dit apparaat</h2>
|
||||||
<dl class="kv">
|
<dl class="kv">
|
||||||
<dt>Naam</dt><dd>{{ device_name }}</dd>
|
<dt>Naam</dt><dd>{{ device_name }}</dd>
|
||||||
<dt>Versie</dt><dd>VoxIP Kiosk OS {{ s.version }}</dd>
|
<dt>Versie</dt><dd>Daynivo Kiosk OS {{ s.version }}</dd>
|
||||||
<dt>Besturingssysteem</dt><dd>{{ s.os }}</dd>
|
<dt>Besturingssysteem</dt><dd>{{ s.os }}</dd>
|
||||||
<dt>Hardware</dt><dd>{{ s.model }}</dd>
|
<dt>Hardware</dt><dd>{{ s.model }}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|||||||
@@ -94,7 +94,7 @@
|
|||||||
<h2>Herstel bij een onbereikbare kiosk</h2>
|
<h2>Herstel bij een onbereikbare kiosk</h2>
|
||||||
<ul class="plain">
|
<ul class="plain">
|
||||||
<li>Iedere wijziging wordt na {{ rollback_seconds // 60 }} minuten automatisch teruggedraaid als je hem niet bevestigt, ook als de stroom tussendoor uitvalt.</li>
|
<li>Iedere wijziging wordt na {{ rollback_seconds // 60 }} minuten automatisch teruggedraaid als je hem niet bevestigt, ook als de stroom tussendoor uitvalt.</li>
|
||||||
<li>Noodherstel: zet een leeg bestand <code>voxip-network-reset</code> op de bootpartitie van de SD-kaart en start de Pi. Alle VoxIP-netwerkprofielen worden dan verwijderd (terug naar DHCP).</li>
|
<li>Noodherstel: zet een leeg bestand <code>voxip-network-reset</code> op de bootpartitie van de SD-kaart en start de Pi. Alle Daynivo-netwerkprofielen worden dan verwijderd (terug naar DHCP).</li>
|
||||||
</ul>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -65,7 +65,7 @@
|
|||||||
<section class="card">
|
<section class="card">
|
||||||
<h2>Systeeminformatie</h2>
|
<h2>Systeeminformatie</h2>
|
||||||
<dl class="kv">
|
<dl class="kv">
|
||||||
<dt>Versie</dt><dd>VoxIP Kiosk OS {{ s.version }}</dd>
|
<dt>Versie</dt><dd>Daynivo Kiosk OS {{ s.version }}</dd>
|
||||||
<dt>Besturingssysteem</dt><dd>{{ s.os }}</dd>
|
<dt>Besturingssysteem</dt><dd>{{ s.os }}</dd>
|
||||||
<dt>Hardware</dt><dd>{{ s.model }}</dd>
|
<dt>Hardware</dt><dd>{{ s.model }}</dd>
|
||||||
<dt>Uptime</dt><dd>{{ s.uptime }}</dd>
|
<dt>Uptime</dt><dd>{{ s.uptime }}</dd>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=VoxIP configuratie en SSH-sleutels importeren vanaf de bootpartitie
|
Description=Daynivo configuratie en SSH-sleutels importeren vanaf de bootpartitie
|
||||||
Documentation=file:///usr/share/doc/voxip-kiosk/README.md
|
Documentation=file:///usr/share/doc/voxip-kiosk/README.md
|
||||||
After=local-fs.target
|
After=local-fs.target
|
||||||
Before=voxip-kiosk-manager.service voxip-kiosk-browser.service ssh.service
|
Before=voxip-kiosk-manager.service voxip-kiosk-browser.service ssh.service
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=VoxIP Kiosk agent (navigatie, offlinepagina, verversen)
|
Description=Daynivo Kiosk agent (navigatie, offlinepagina, verversen)
|
||||||
Documentation=file:///usr/share/doc/voxip-kiosk/README.md
|
Documentation=file:///usr/share/doc/voxip-kiosk/README.md
|
||||||
After=voxip-kiosk-browser.service
|
After=voxip-kiosk-browser.service
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=VoxIP Kiosk Chromium
|
Description=Daynivo Kiosk Chromium
|
||||||
Documentation=file:///usr/share/doc/voxip-kiosk/README.md
|
Documentation=file:///usr/share/doc/voxip-kiosk/README.md
|
||||||
Requires=voxip-kiosk-x.service
|
Requires=voxip-kiosk-x.service
|
||||||
After=voxip-kiosk-x.service voxip-boot-import.service
|
After=voxip-kiosk-x.service voxip-boot-import.service
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=VoxIP Kiosk healthcheck
|
Description=Daynivo Kiosk healthcheck
|
||||||
Documentation=file:///usr/share/doc/voxip-kiosk/README.md
|
Documentation=file:///usr/share/doc/voxip-kiosk/README.md
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=VoxIP Kiosk healthcheck (elke minuut)
|
Description=Daynivo Kiosk healthcheck (elke minuut)
|
||||||
|
|
||||||
[Timer]
|
[Timer]
|
||||||
OnBootSec=2min
|
OnBootSec=2min
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=VoxIP Kiosk X-server (vt7)
|
Description=Daynivo Kiosk X-server (vt7)
|
||||||
Documentation=file:///usr/share/doc/voxip-kiosk/README.md
|
Documentation=file:///usr/share/doc/voxip-kiosk/README.md
|
||||||
After=systemd-user-sessions.service systemd-logind.service
|
After=systemd-user-sessions.service systemd-logind.service
|
||||||
Conflicts=getty@tty7.service
|
Conflicts=getty@tty7.service
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=VoxIP netwerkherstel bij opstarten (rollback en noodreset)
|
Description=Daynivo netwerkherstel bij opstarten (rollback en noodreset)
|
||||||
Documentation=file:///usr/share/doc/voxip-kiosk/README.md
|
Documentation=file:///usr/share/doc/voxip-kiosk/README.md
|
||||||
DefaultDependencies=no
|
DefaultDependencies=no
|
||||||
After=local-fs.target
|
After=local-fs.target
|
||||||
|
|||||||
+3
-3
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#
|
#
|
||||||
# Remove VoxIP Kiosk OS.
|
# Remove Daynivo Kiosk OS.
|
||||||
#
|
#
|
||||||
# sudo ./uninstall.sh # remove programs and services, keep configuration
|
# sudo ./uninstall.sh # remove programs and services, keep configuration
|
||||||
# sudo ./uninstall.sh --purge # also remove configuration, state, logs and users
|
# sudo ./uninstall.sh --purge # also remove configuration, state, logs and users
|
||||||
@@ -65,9 +65,9 @@ if [[ $PURGE -eq 1 ]]; then
|
|||||||
groupdel voxip 2>/dev/null || true
|
groupdel voxip 2>/dev/null || true
|
||||||
else
|
else
|
||||||
echo " Configuratie bewaard in /etc/voxip-kiosk (verwijderen met --purge)."
|
echo " Configuratie bewaard in /etc/voxip-kiosk (verwijderen met --purge)."
|
||||||
echo " VoxIP-netwerkprofielen (voxip-eth0/voxip-wlan0) blijven actief."
|
echo " Daynivo-netwerkprofielen (voxip-eth0/voxip-wlan0) blijven actief."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -n $PREVIOUS_TARGET ]]; then systemctl set-default "$PREVIOUS_TARGET" >/dev/null 2>&1 || true; fi
|
if [[ -n $PREVIOUS_TARGET ]]; then systemctl set-default "$PREVIOUS_TARGET" >/dev/null 2>&1 || true; fi
|
||||||
for dm in "${DISABLED_DMS[@]}"; do systemctl enable "$dm" >/dev/null 2>&1 || true; done
|
for dm in "${DISABLED_DMS[@]}"; do systemctl enable "$dm" >/dev/null 2>&1 || true; done
|
||||||
echo "==> VoxIP Kiosk OS is verwijderd. Herstart de Raspberry Pi om de kiosk te stoppen."
|
echo "==> Daynivo Kiosk OS is verwijderd. Herstart de Raspberry Pi om de kiosk te stoppen."
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#
|
#
|
||||||
# Update VoxIP Kiosk OS from this checkout (or an extracted release).
|
# Update Daynivo Kiosk OS from this checkout (or an extracted release).
|
||||||
#
|
#
|
||||||
# sudo ./update.sh # git pull --ff-only, back up config, install --upgrade
|
# sudo ./update.sh # git pull --ff-only, back up config, install --upgrade
|
||||||
# sudo ./update.sh --no-pull # install the code as it is in this directory
|
# sudo ./update.sh --no-pull # install the code as it is in this directory
|
||||||
|
|||||||
+1
-1
@@ -8,7 +8,7 @@ function setText(id, text) {
|
|||||||
if (el) el.textContent = text;
|
if (el) el.textContent = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
setText("name", params.get("name") || "VoxIP Kiosk");
|
setText("name", params.get("name") || "Daynivo Kiosk");
|
||||||
// The link arrives with its token already masked (…abcd).
|
// The link arrives with its token already masked (…abcd).
|
||||||
const link = (params.get("url") || "").replace(/^https:\/\//, "");
|
const link = (params.get("url") || "").replace(/^https:\/\//, "");
|
||||||
if (link) setText("link-url", link);
|
if (link) setText("link-url", link);
|
||||||
|
|||||||
+1
-1
@@ -24,7 +24,7 @@
|
|||||||
</main>
|
</main>
|
||||||
<footer class="bottom">
|
<footer class="bottom">
|
||||||
<span id="admin"></span>
|
<span id="admin"></span>
|
||||||
<span>VoxIP Kiosk</span>
|
<span>Daynivo Kiosk</span>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
<script src="kiosk.js"></script>
|
<script src="kiosk.js"></script>
|
||||||
|
|||||||
+2
-2
@@ -2,7 +2,7 @@
|
|||||||
<html lang="nl">
|
<html lang="nl">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>VoxIP Kiosk — eerste configuratie</title>
|
<title>Daynivo Kiosk — eerste configuratie</title>
|
||||||
<link rel="stylesheet" href="kiosk.css">
|
<link rel="stylesheet" href="kiosk.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
</main>
|
</main>
|
||||||
<footer class="bottom">
|
<footer class="bottom">
|
||||||
<span></span>
|
<span></span>
|
||||||
<span>VoxIP Kiosk</span>
|
<span>Daynivo Kiosk</span>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
<script src="kiosk.js"></script>
|
<script src="kiosk.js"></script>
|
||||||
|
|||||||
+2
-2
@@ -2,7 +2,7 @@
|
|||||||
<html lang="nl">
|
<html lang="nl">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>VoxIP Kiosk</title>
|
<title>Daynivo Kiosk</title>
|
||||||
<link rel="stylesheet" href="kiosk.css">
|
<link rel="stylesheet" href="kiosk.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
</main>
|
</main>
|
||||||
<footer class="bottom">
|
<footer class="bottom">
|
||||||
<span id="admin"></span>
|
<span id="admin"></span>
|
||||||
<span>VoxIP Kiosk</span>
|
<span>Daynivo Kiosk</span>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
<script src="kiosk.js"></script>
|
<script src="kiosk.js"></script>
|
||||||
|
|||||||
Reference in new issue
Block a user