mirror of
https://github.com/karl0ss/AnotterKiosk.git
synced 2025-04-28 18:43:41 +01:00
Initial commit
This commit is contained in:
commit
85decda2a1
39
.github/workflows/main.yml
vendored
Normal file
39
.github/workflows/main.yml
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
name: CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
create: { }
|
||||||
|
push: { }
|
||||||
|
pull_request: { }
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: [self-hosted, hetzner-cax21]
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
pkgfile: ${{ steps.pkgname.outputs.pkgfile }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Check out repo
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt update -qq
|
||||||
|
sudo apt install -yqq libguestfs-tools qemu-utils rsync sudo wget xz pigz
|
||||||
|
|
||||||
|
- name: Build firmware
|
||||||
|
run: |
|
||||||
|
./build_raspberry_pi.sh
|
||||||
|
|
||||||
|
- name: Compress firmware
|
||||||
|
run: |
|
||||||
|
pigz -9 raspikiosk.img
|
||||||
|
|
||||||
|
- name: Release build artifacts
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
|
with:
|
||||||
|
files: |
|
||||||
|
./raspikiosk.img.gz
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
raspikiosk.img
|
||||||
|
raspios.img.xz
|
||||||
|
work/
|
31
README.md
Normal file
31
README.md
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
Another kiosk browser OS?
|
||||||
|
|
||||||
|
Yes, this one is a little bit opinionated :)
|
||||||
|
The author ran several similar setups in production for years and has seen a lot of problems and strange failure modes.
|
||||||
|
This project aims to solve a lot of those (at least for the author), it might also be useful for others :)
|
||||||
|
|
||||||
|
Key features:
|
||||||
|
- Images built via CI
|
||||||
|
- WiFi connection support
|
||||||
|
- Raspberry Pi (Arm64) compatibility
|
||||||
|
- USB flash drive, USB SSD, etc. compatible
|
||||||
|
- aarch64 mode for Raspberry Pis (_significant_ performance improvements over armv7/32bit ARM)
|
||||||
|
- Read-only filesystem handling (no more broken SD cards)
|
||||||
|
- Configurable cache clear functionality
|
||||||
|
- HTTP watchdog (website needs to send heartbeat messages via XHR/AJAX to localhost)
|
||||||
|
- Force specific resolution (1080p on 4k screens, broken EDID, etc.)
|
||||||
|
- Hard NTP handling (will wait for NTP at boot)
|
||||||
|
- SSH support
|
||||||
|
- VNC support
|
||||||
|
- SSH tunneling support (for remote-access without port-forwarding, etc.)
|
||||||
|
|
||||||
|
Planned features:
|
||||||
|
- PC (x86) compatibility
|
||||||
|
- Raspberry Pi PXE/network boot support
|
||||||
|
- Network connectivity watchdog (configurable ping, etc. timeout)
|
||||||
|
- Automatic reboot at specified time
|
||||||
|
|
||||||
|
Security considerations:
|
||||||
|
- Autossh does not check SSH host keys. This is okay-ish as long as the target server only allows tunneling, nothing else.
|
||||||
|
- nginx/PHP are allowed to use sudo/NOPASSWD (because it needs to query the VideoCore, manage service, etc.), more priviledge seperation would be nice
|
||||||
|
- due to the skeleton mechanism, the system has some ... creative permissions. some cleanup required.
|
66
build_raspberry_pi.sh
Executable file
66
build_raspberry_pi.sh
Executable file
@ -0,0 +1,66 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(dirname "$(realpath "$0")")"
|
||||||
|
BUILD_DIR="${SCRIPT_DIR}/work/root/"
|
||||||
|
|
||||||
|
umount -fl "${BUILD_DIR}" || true
|
||||||
|
losetup -D /dev/loop0 || true
|
||||||
|
rm -rf "${BUILD_DIR}" || true
|
||||||
|
mkdir -p "${BUILD_DIR}"
|
||||||
|
|
||||||
|
if [ ! -f raspios.img.xz ]
|
||||||
|
then
|
||||||
|
wget -O raspios.img.xz "https://downloads.raspberrypi.org/raspios_lite_arm64/images/raspios_lite_arm64-2023-05-03/2023-05-03-raspios-bullseye-arm64-lite.img.xz"
|
||||||
|
echo "bf982e56b0374712d93e185780d121e3f5c3d5e33052a95f72f9aed468d58fa7 raspios.img.xz" | sha256sum --check --status
|
||||||
|
if [ $? -ne 0 ];
|
||||||
|
echo "downloaded raspios does not match checksum";
|
||||||
|
return -1;
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -f raspios.img
|
||||||
|
xz -kd raspios.img.xz
|
||||||
|
|
||||||
|
# Repartition image
|
||||||
|
virt-filesystems --long -h --all -a raspios.img
|
||||||
|
|
||||||
|
truncate -r raspios.img raspikiosk.img
|
||||||
|
truncate -s +3G raspikiosk.img
|
||||||
|
|
||||||
|
virt-resize --expand /dev/sda2 raspios.img raspikiosk.img
|
||||||
|
rm -f raspios.img
|
||||||
|
|
||||||
|
# Setup loop device for Raspberry Pi image (with partition scanning)
|
||||||
|
sudo losetup -P /dev/loop0 raspikiosk.img
|
||||||
|
|
||||||
|
# Mount partitions
|
||||||
|
sudo mount /dev/loop0p2 "${BUILD_DIR}"
|
||||||
|
sudo mount /dev/loop0p1 "${BUILD_DIR}/boot"
|
||||||
|
|
||||||
|
# Copy the (raspberry pi-specific) skeleton files
|
||||||
|
rsync -a "${SCRIPT_DIR}/raspberry_pi_skeleton/." "${BUILD_DIR}"
|
||||||
|
rsync -a "${SCRIPT_DIR}/kiosk_skeleton/." "${BUILD_DIR}/kiosk_skeleton"
|
||||||
|
|
||||||
|
# Mount system partitions (from the build host)
|
||||||
|
sudo mount -t proc /proc "${BUILD_DIR}/proc/"
|
||||||
|
sudo mount --rbind /sys "${BUILD_DIR}/sys/"
|
||||||
|
sudo mount --rbind /dev "${BUILD_DIR}/dev/"
|
||||||
|
|
||||||
|
sudo chroot "${BUILD_DIR}" /raspberry_pi_bullseye.sh
|
||||||
|
sudo chroot "${BUILD_DIR}" /kiosk_skeleton/build.sh
|
||||||
|
|
||||||
|
sudo rm -r "${BUILD_DIR}/kiosk_skeleton"
|
||||||
|
sudo rm "${BUILD_DIR}/raspberry_pi_bullseye.sh"
|
||||||
|
|
||||||
|
sudo umount -fl "${BUILD_DIR}/proc"
|
||||||
|
sudo umount -fl "${BUILD_DIR}/sys"
|
||||||
|
sudo umount -fl "${BUILD_DIR}/dev"
|
||||||
|
|
||||||
|
sudo umount "${BUILD_DIR}/proc"
|
||||||
|
sudo umount "${BUILD_DIR}/sys"
|
||||||
|
sudo umount "${BUILD_DIR}/dev"
|
||||||
|
|
||||||
|
sudo umount "${BUILD_DIR}/boot"
|
||||||
|
sudo umount "${BUILD_DIR}"
|
||||||
|
|
||||||
|
sudo losetup -D /dev/loop0
|
61
kiosk_skeleton/build.sh
Executable file
61
kiosk_skeleton/build.sh
Executable file
@ -0,0 +1,61 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# This script is being run on the target debian platform
|
||||||
|
|
||||||
|
apt update
|
||||||
|
APT_LISTCHANGES_FRONTEND=none DEBIAN_FRONTEND=noninteractive apt dist-upgrade -y
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt install -y lightdm openbox nginx php-fpm php-cli chromium autossh unclutter x11-xserver-utils xdotool htop nano openssh-server rsync x11vnc lm-sensors ntpdate scrot
|
||||||
|
|
||||||
|
rsync -a --chown=root:root "/kiosk_skeleton/." "/"
|
||||||
|
chown -hR pi:pi /home/pi
|
||||||
|
|
||||||
|
# Raspberry Pi specific modifications
|
||||||
|
# raspberrypi-net-mods does things like copying /boot/wpa_supplicant.conf to the root FS
|
||||||
|
apt remove -y raspberrypi-net-mods || true
|
||||||
|
# userconf-pi prevents lightdm from starting unless the default "pi" user is changed
|
||||||
|
apt remove -y userconf-pi || true
|
||||||
|
# RF emissions are blocked by default
|
||||||
|
rfkill unblock wlan || true
|
||||||
|
|
||||||
|
# fix file system permissions
|
||||||
|
chown -hR 0:0 /etc/sudoers.d/
|
||||||
|
chown -hR www-data:www-data /var/www/html/
|
||||||
|
|
||||||
|
mkdir -p /home/pi/.config/chromium/
|
||||||
|
chown -hR 1000:1000 /home/pi/.config/chromium/
|
||||||
|
|
||||||
|
mkdir -p /home/pi/.pki/
|
||||||
|
chown -hR 1000:1000 /home/pi/.pki/
|
||||||
|
|
||||||
|
# FIXME: readonly in /etc/fstab
|
||||||
|
echo "tmpfs /dev/shm tmpfs mode=0777 0 0" >> /etc/fstab
|
||||||
|
echo "tmpfs /tmp tmpfs mode=1777 0 0" >> /etc/fstab
|
||||||
|
echo "tmpfs /run tmpfs mode=0755,nosuid,nodev 0 0" >> /etc/fstab
|
||||||
|
echo "tmpfs /var/log tmpfs defaults,noatime,nosuid,mode=0755,size=100m 0 0" >> /etc/fstab
|
||||||
|
echo "tmpfs /var/lib/lightdm tmpfs defaults,noatime,nosuid,size=30m 0 0" >> /etc/fstab
|
||||||
|
echo "tmpfs /home/pi/.cache tmpfs mode=0755,nosuid,nodev,uid=1000,gid=1000 0 0" >> /etc/fstab
|
||||||
|
echo "tmpfs /home/pi/.config/chromium/ tmpfs mode=0755,nosuid,nodev,uid=1000,gid=1000 0 0" >> /etc/fstab
|
||||||
|
echo "tmpfs /home/pi/.pki/ tmpfs mode=0755,nosuid,nodev,uid=1000,gid=1000 0 0" >> /etc/fstab
|
||||||
|
|
||||||
|
# Create symlinks for configuration files which will later get created at runtime (in /tmp)
|
||||||
|
rm /etc/hosts
|
||||||
|
rm /etc/hostname
|
||||||
|
mkdir -p /etc/wpa_supplicant/
|
||||||
|
ln -sf /tmp/hosts /etc/hosts
|
||||||
|
ln -sf /tmp/hostname /etc/hostname
|
||||||
|
ln -sf /tmp/wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant.conf
|
||||||
|
|
||||||
|
systemctl daemon-reload
|
||||||
|
|
||||||
|
# remove unneccessary clutter
|
||||||
|
systemctl disable dphys-swapfile
|
||||||
|
systemctl disable ModemManager
|
||||||
|
systemctl disable avahi-daemon
|
||||||
|
systemctl disable bluetooth
|
||||||
|
|
||||||
|
systemctl enable kiosk-wifi
|
||||||
|
systemctl enable kiosk-autossh
|
||||||
|
systemctl enable kiosk-watchdog
|
||||||
|
systemctl enable kiosk-set-hostname
|
||||||
|
systemctl enable ntpdate
|
||||||
|
systemctl enable lightdm
|
||||||
|
systemctl enable nginx
|
169
kiosk_skeleton/etc/lightdm/lightdm.conf
Normal file
169
kiosk_skeleton/etc/lightdm/lightdm.conf
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
#
|
||||||
|
# General configuration
|
||||||
|
#
|
||||||
|
# start-default-seat = True to always start one seat if none are defined in the configuration
|
||||||
|
# greeter-user = User to run greeter as
|
||||||
|
# minimum-display-number = Minimum display number to use for X servers
|
||||||
|
# minimum-vt = First VT to run displays on
|
||||||
|
# lock-memory = True to prevent memory from being paged to disk
|
||||||
|
# user-authority-in-system-dir = True if session authority should be in the system location
|
||||||
|
# guest-account-script = Script to be run to setup guest account
|
||||||
|
# logind-check-graphical = True to on start seats that are marked as graphical by logind
|
||||||
|
# log-directory = Directory to log information to
|
||||||
|
# run-directory = Directory to put running state in
|
||||||
|
# cache-directory = Directory to cache to
|
||||||
|
# sessions-directory = Directory to find sessions
|
||||||
|
# remote-sessions-directory = Directory to find remote sessions
|
||||||
|
# greeters-directory = Directory to find greeters
|
||||||
|
# backup-logs = True to move add a .old suffix to old log files when opening new ones
|
||||||
|
# dbus-service = True if LightDM provides a D-Bus service to control it
|
||||||
|
#
|
||||||
|
[LightDM]
|
||||||
|
#start-default-seat=true
|
||||||
|
#greeter-user=lightdm
|
||||||
|
#minimum-display-number=0
|
||||||
|
#minimum-vt=7
|
||||||
|
#lock-memory=true
|
||||||
|
user-authority-in-system-dir=true
|
||||||
|
#guest-account-script=guest-account
|
||||||
|
#logind-check-graphical=false
|
||||||
|
#log-directory=/var/log/lightdm
|
||||||
|
#run-directory=/var/run/lightdm
|
||||||
|
#cache-directory=/var/cache/lightdm
|
||||||
|
#sessions-directory=/usr/share/lightdm/sessions:/usr/share/xsessions:/usr/share/wayland-sessions
|
||||||
|
#remote-sessions-directory=/usr/share/lightdm/remote-sessions
|
||||||
|
#greeters-directory=$XDG_DATA_DIRS/lightdm/greeters:$XDG_DATA_DIRS/xgreeters
|
||||||
|
#backup-logs=true
|
||||||
|
#dbus-service=true
|
||||||
|
|
||||||
|
#
|
||||||
|
# Seat configuration
|
||||||
|
#
|
||||||
|
# Seat configuration is matched against the seat name glob in the section, for example:
|
||||||
|
# [Seat:*] matches all seats and is applied first.
|
||||||
|
# [Seat:seat0] matches the seat named "seat0".
|
||||||
|
# [Seat:seat-thin-client*] matches all seats that have names that start with "seat-thin-client".
|
||||||
|
#
|
||||||
|
# type = Seat type (local, xremote, unity)
|
||||||
|
# pam-service = PAM service to use for login
|
||||||
|
# pam-autologin-service = PAM service to use for autologin
|
||||||
|
# pam-greeter-service = PAM service to use for greeters
|
||||||
|
# xserver-backend = X backend to use (mir)
|
||||||
|
# xserver-command = X server command to run (can also contain arguments e.g. X -special-option)
|
||||||
|
# xmir-command = Xmir server command to run (can also contain arguments e.g. Xmir -special-option)
|
||||||
|
# xserver-config = Config file to pass to X server
|
||||||
|
# xserver-layout = Layout to pass to X server
|
||||||
|
# xserver-allow-tcp = True if TCP/IP connections are allowed to this X server
|
||||||
|
# xserver-share = True if the X server is shared for both greeter and session
|
||||||
|
# xserver-hostname = Hostname of X server (only for type=xremote)
|
||||||
|
# xserver-display-number = Display number of X server (only for type=xremote)
|
||||||
|
# xdmcp-manager = XDMCP manager to connect to (implies xserver-allow-tcp=true)
|
||||||
|
# xdmcp-port = XDMCP UDP/IP port to communicate on
|
||||||
|
# xdmcp-key = Authentication key to use for XDM-AUTHENTICATION-1 (stored in keys.conf)
|
||||||
|
# unity-compositor-command = Unity compositor command to run (can also contain arguments e.g. unity-system-compositor -special-option)
|
||||||
|
# unity-compositor-timeout = Number of seconds to wait for compositor to start
|
||||||
|
# greeter-session = Session to load for greeter
|
||||||
|
# greeter-hide-users = True to hide the user list
|
||||||
|
# greeter-allow-guest = True if the greeter should show a guest login option
|
||||||
|
# greeter-show-manual-login = True if the greeter should offer a manual login option
|
||||||
|
# greeter-show-remote-login = True if the greeter should offer a remote login option
|
||||||
|
# user-session = Session to load for users
|
||||||
|
# allow-user-switching = True if allowed to switch users
|
||||||
|
# allow-guest = True if guest login is allowed
|
||||||
|
# guest-session = Session to load for guests (overrides user-session)
|
||||||
|
# session-wrapper = Wrapper script to run session with
|
||||||
|
# greeter-wrapper = Wrapper script to run greeter with
|
||||||
|
# guest-wrapper = Wrapper script to run guest sessions with
|
||||||
|
# display-setup-script = Script to run when starting a greeter session (runs as root)
|
||||||
|
# display-stopped-script = Script to run after stopping the display server (runs as root)
|
||||||
|
# greeter-setup-script = Script to run when starting a greeter (runs as root)
|
||||||
|
# session-setup-script = Script to run when starting a user session (runs as root)
|
||||||
|
# session-cleanup-script = Script to run when quitting a user session (runs as root)
|
||||||
|
# autologin-guest = True to log in as guest by default
|
||||||
|
# autologin-user = User to log in with by default (overrides autologin-guest)
|
||||||
|
# autologin-user-timeout = Number of seconds to wait before loading default user
|
||||||
|
# autologin-session = Session to load for automatic login (overrides user-session)
|
||||||
|
# autologin-in-background = True if autologin session should not be immediately activated
|
||||||
|
# exit-on-failure = True if the daemon should exit if this seat fails
|
||||||
|
#
|
||||||
|
[Seat:*]
|
||||||
|
#type=local
|
||||||
|
#pam-service=lightdm
|
||||||
|
#pam-autologin-service=lightdm-autologin
|
||||||
|
#pam-greeter-service=lightdm-greeter
|
||||||
|
#xserver-backend=
|
||||||
|
#xserver-command=X
|
||||||
|
#xmir-command=Xmir
|
||||||
|
#xserver-config=
|
||||||
|
#xserver-layout=
|
||||||
|
#xserver-allow-tcp=false
|
||||||
|
#xserver-share=true
|
||||||
|
#xserver-hostname=
|
||||||
|
#xserver-display-number=
|
||||||
|
#xdmcp-manager=
|
||||||
|
#xdmcp-port=177
|
||||||
|
#xdmcp-key=
|
||||||
|
#unity-compositor-command=unity-system-compositor
|
||||||
|
#unity-compositor-timeout=60
|
||||||
|
#greeter-session=example-gtk-gnome
|
||||||
|
#greeter-hide-users=false
|
||||||
|
#greeter-allow-guest=true
|
||||||
|
#greeter-show-manual-login=false
|
||||||
|
#greeter-show-remote-login=true
|
||||||
|
#user-session=default
|
||||||
|
#allow-user-switching=true
|
||||||
|
#allow-guest=true
|
||||||
|
#guest-session=
|
||||||
|
#session-wrapper=lightdm-session
|
||||||
|
#greeter-wrapper=
|
||||||
|
#guest-wrapper=
|
||||||
|
#display-setup-script=
|
||||||
|
#display-stopped-script=
|
||||||
|
#greeter-setup-script=
|
||||||
|
#session-setup-script=
|
||||||
|
#session-cleanup-script=
|
||||||
|
#autologin-guest=false
|
||||||
|
autologin-user=pi
|
||||||
|
#autologin-user-timeout=0
|
||||||
|
#autologin-in-background=false
|
||||||
|
#autologin-session=
|
||||||
|
#exit-on-failure=false
|
||||||
|
|
||||||
|
#
|
||||||
|
# XDMCP Server configuration
|
||||||
|
#
|
||||||
|
# enabled = True if XDMCP connections should be allowed
|
||||||
|
# port = UDP/IP port to listen for connections on
|
||||||
|
# listen-address = Host/address to listen for XDMCP connections (use all addresses if not present)
|
||||||
|
# key = Authentication key to use for XDM-AUTHENTICATION-1 or blank to not use authentication (stored in keys.conf)
|
||||||
|
# hostname = Hostname to report to XDMCP clients (defaults to system hostname if unset)
|
||||||
|
#
|
||||||
|
# The authentication key is a 56 bit DES key specified in hex as 0xnnnnnnnnnnnnnn. Alternatively
|
||||||
|
# it can be a word and the first 7 characters are used as the key.
|
||||||
|
#
|
||||||
|
[XDMCPServer]
|
||||||
|
#enabled=false
|
||||||
|
#port=177
|
||||||
|
#listen-address=
|
||||||
|
#key=
|
||||||
|
#hostname=
|
||||||
|
|
||||||
|
#
|
||||||
|
# VNC Server configuration
|
||||||
|
#
|
||||||
|
# enabled = True if VNC connections should be allowed
|
||||||
|
# command = Command to run Xvnc server with
|
||||||
|
# port = TCP/IP port to listen for connections on
|
||||||
|
# listen-address = Host/address to listen for VNC connections (use all addresses if not present)
|
||||||
|
# width = Width of display to use
|
||||||
|
# height = Height of display to use
|
||||||
|
# depth = Color depth of display to use
|
||||||
|
#
|
||||||
|
[VNCServer]
|
||||||
|
#enabled=false
|
||||||
|
#command=Xvnc
|
||||||
|
#port=5900
|
||||||
|
#listen-address=
|
||||||
|
#width=1024
|
||||||
|
#height=768
|
||||||
|
#depth=8
|
61
kiosk_skeleton/etc/nginx/nginx.conf
Normal file
61
kiosk_skeleton/etc/nginx/nginx.conf
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
user www-data;
|
||||||
|
worker_processes auto;
|
||||||
|
pid /run/nginx.pid;
|
||||||
|
include /etc/nginx/modules-enabled/*.conf;
|
||||||
|
|
||||||
|
events {
|
||||||
|
worker_connections 768;
|
||||||
|
# multi_accept on;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
|
||||||
|
##
|
||||||
|
# Basic Settings
|
||||||
|
##
|
||||||
|
|
||||||
|
sendfile on;
|
||||||
|
tcp_nopush on;
|
||||||
|
types_hash_max_size 2048;
|
||||||
|
# server_tokens off;
|
||||||
|
|
||||||
|
# server_names_hash_bucket_size 64;
|
||||||
|
# server_name_in_redirect off;
|
||||||
|
|
||||||
|
include /etc/nginx/mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
|
||||||
|
##
|
||||||
|
# SSL Settings
|
||||||
|
##
|
||||||
|
|
||||||
|
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
|
||||||
|
ssl_prefer_server_ciphers on;
|
||||||
|
|
||||||
|
##
|
||||||
|
# Logging Settings
|
||||||
|
##
|
||||||
|
|
||||||
|
access_log /dev/null;
|
||||||
|
error_log /dev/null;
|
||||||
|
|
||||||
|
##
|
||||||
|
# Gzip Settings
|
||||||
|
##
|
||||||
|
|
||||||
|
gzip on;
|
||||||
|
|
||||||
|
# gzip_vary on;
|
||||||
|
# gzip_proxied any;
|
||||||
|
# gzip_comp_level 6;
|
||||||
|
# gzip_buffers 16 8k;
|
||||||
|
# gzip_http_version 1.1;
|
||||||
|
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
|
||||||
|
|
||||||
|
##
|
||||||
|
# Virtual Host Configs
|
||||||
|
##
|
||||||
|
|
||||||
|
include /etc/nginx/conf.d/*.conf;
|
||||||
|
include /etc/nginx/sites-enabled/*;
|
||||||
|
}
|
19
kiosk_skeleton/etc/nginx/sites-enabled/default
Normal file
19
kiosk_skeleton/etc/nginx/sites-enabled/default
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
server {
|
||||||
|
listen 80 default_server;
|
||||||
|
listen [::]:80 default_server;
|
||||||
|
|
||||||
|
root /var/www/html;
|
||||||
|
|
||||||
|
index index.php;
|
||||||
|
|
||||||
|
server_name _;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ =404;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ \.php$ {
|
||||||
|
include snippets/fastcgi-php.conf;
|
||||||
|
fastcgi_pass unix:/run/php-fpm.sock;
|
||||||
|
}
|
||||||
|
}
|
145
kiosk_skeleton/etc/php/8.2/fpm/php-fpm.conf
Normal file
145
kiosk_skeleton/etc/php/8.2/fpm/php-fpm.conf
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
; FPM Configuration ;
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
; All relative paths in this configuration file are relative to PHP's install
|
||||||
|
; prefix (/usr). This prefix can be dynamically changed by using the
|
||||||
|
; '-p' argument from the command line.
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;
|
||||||
|
; Global Options ;
|
||||||
|
;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
[global]
|
||||||
|
; Pid file
|
||||||
|
; Note: the default prefix is /var
|
||||||
|
; Default Value: none
|
||||||
|
; Warning: if you change the value here, you need to modify systemd
|
||||||
|
; service PIDFile= setting to match the value here.
|
||||||
|
pid = /run/php8.2-fpm.pid
|
||||||
|
|
||||||
|
; Error log file
|
||||||
|
; If it's set to "syslog", log is sent to syslogd instead of being written
|
||||||
|
; into a local file.
|
||||||
|
; Note: the default prefix is /var
|
||||||
|
; Default Value: log/php-fpm.log
|
||||||
|
error_log = syslog
|
||||||
|
|
||||||
|
; syslog_facility is used to specify what type of program is logging the
|
||||||
|
; message. This lets syslogd specify that messages from different facilities
|
||||||
|
; will be handled differently.
|
||||||
|
; See syslog(3) for possible values (ex daemon equiv LOG_DAEMON)
|
||||||
|
; Default Value: daemon
|
||||||
|
;syslog.facility = daemon
|
||||||
|
|
||||||
|
; syslog_ident is prepended to every message. If you have multiple FPM
|
||||||
|
; instances running on the same server, you can change the default value
|
||||||
|
; which must suit common needs.
|
||||||
|
; Default Value: php-fpm
|
||||||
|
;syslog.ident = php-fpm
|
||||||
|
|
||||||
|
; Log level
|
||||||
|
; Possible Values: alert, error, warning, notice, debug
|
||||||
|
; Default Value: notice
|
||||||
|
;log_level = notice
|
||||||
|
|
||||||
|
; Log limit on number of characters in the single line (log entry). If the
|
||||||
|
; line is over the limit, it is wrapped on multiple lines. The limit is for
|
||||||
|
; all logged characters including message prefix and suffix if present. However
|
||||||
|
; the new line character does not count into it as it is present only when
|
||||||
|
; logging to a file descriptor. It means the new line character is not present
|
||||||
|
; when logging to syslog.
|
||||||
|
; Default Value: 1024
|
||||||
|
;log_limit = 4096
|
||||||
|
|
||||||
|
; Log buffering specifies if the log line is buffered which means that the
|
||||||
|
; line is written in a single write operation. If the value is false, then the
|
||||||
|
; data is written directly into the file descriptor. It is an experimental
|
||||||
|
; option that can potentially improve logging performance and memory usage
|
||||||
|
; for some heavy logging scenarios. This option is ignored if logging to syslog
|
||||||
|
; as it has to be always buffered.
|
||||||
|
; Default value: yes
|
||||||
|
;log_buffering = no
|
||||||
|
|
||||||
|
; If this number of child processes exit with SIGSEGV or SIGBUS within the time
|
||||||
|
; interval set by emergency_restart_interval then FPM will restart. A value
|
||||||
|
; of '0' means 'Off'.
|
||||||
|
; Default Value: 0
|
||||||
|
;emergency_restart_threshold = 0
|
||||||
|
|
||||||
|
; Interval of time used by emergency_restart_interval to determine when
|
||||||
|
; a graceful restart will be initiated. This can be useful to work around
|
||||||
|
; accidental corruptions in an accelerator's shared memory.
|
||||||
|
; Available Units: s(econds), m(inutes), h(ours), or d(ays)
|
||||||
|
; Default Unit: seconds
|
||||||
|
; Default Value: 0
|
||||||
|
;emergency_restart_interval = 0
|
||||||
|
|
||||||
|
; Time limit for child processes to wait for a reaction on signals from master.
|
||||||
|
; Available units: s(econds), m(inutes), h(ours), or d(ays)
|
||||||
|
; Default Unit: seconds
|
||||||
|
; Default Value: 0
|
||||||
|
;process_control_timeout = 0
|
||||||
|
|
||||||
|
; The maximum number of processes FPM will fork. This has been designed to control
|
||||||
|
; the global number of processes when using dynamic PM within a lot of pools.
|
||||||
|
; Use it with caution.
|
||||||
|
; Note: A value of 0 indicates no limit
|
||||||
|
; Default Value: 0
|
||||||
|
; process.max = 128
|
||||||
|
|
||||||
|
; Specify the nice(2) priority to apply to the master process (only if set)
|
||||||
|
; The value can vary from -19 (highest priority) to 20 (lowest priority)
|
||||||
|
; Note: - It will only work if the FPM master process is launched as root
|
||||||
|
; - The pool process will inherit the master process priority
|
||||||
|
; unless specified otherwise
|
||||||
|
; Default Value: no set
|
||||||
|
; process.priority = -19
|
||||||
|
|
||||||
|
; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging.
|
||||||
|
; Default Value: yes
|
||||||
|
;daemonize = yes
|
||||||
|
|
||||||
|
; Set open file descriptor rlimit for the master process.
|
||||||
|
; Default Value: system defined value
|
||||||
|
;rlimit_files = 1024
|
||||||
|
|
||||||
|
; Set max core size rlimit for the master process.
|
||||||
|
; Possible Values: 'unlimited' or an integer greater or equal to 0
|
||||||
|
; Default Value: system defined value
|
||||||
|
;rlimit_core = 0
|
||||||
|
|
||||||
|
; Specify the event mechanism FPM will use. The following is available:
|
||||||
|
; - select (any POSIX os)
|
||||||
|
; - poll (any POSIX os)
|
||||||
|
; - epoll (linux >= 2.5.44)
|
||||||
|
; - kqueue (FreeBSD >= 4.1, OpenBSD >= 2.9, NetBSD >= 2.0)
|
||||||
|
; - /dev/poll (Solaris >= 7)
|
||||||
|
; - port (Solaris >= 10)
|
||||||
|
; Default Value: not set (auto detection)
|
||||||
|
;events.mechanism = epoll
|
||||||
|
|
||||||
|
; When FPM is built with systemd integration, specify the interval,
|
||||||
|
; in seconds, between health report notification to systemd.
|
||||||
|
; Set to 0 to disable.
|
||||||
|
; Available Units: s(econds), m(inutes), h(ours)
|
||||||
|
; Default Unit: seconds
|
||||||
|
; Default value: 10
|
||||||
|
;systemd_interval = 10
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;
|
||||||
|
; Pool Definitions ;
|
||||||
|
;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
; Multiple pools of child processes may be started with different listening
|
||||||
|
; ports and different management options. The name of the pool will be
|
||||||
|
; used in logs and stats. There is no limitation on the number of pools which
|
||||||
|
; FPM can handle. Your system will tell you anyway :)
|
||||||
|
|
||||||
|
; Include one or more files. If glob(3) exists, it is used to include a bunch of
|
||||||
|
; files from a glob(3) pattern. This directive can be used everywhere in the
|
||||||
|
; file.
|
||||||
|
; Relative path can also be used. They will be prefixed by:
|
||||||
|
; - the global prefix if it's been set (-p argument)
|
||||||
|
; - /usr otherwise
|
||||||
|
include=/etc/php/8.2/fpm/pool.d/*.conf
|
14
kiosk_skeleton/etc/php/8.2/fpm/pool.d/www.conf
Normal file
14
kiosk_skeleton/etc/php/8.2/fpm/pool.d/www.conf
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
[www]
|
||||||
|
user = www-data
|
||||||
|
group = www-data
|
||||||
|
|
||||||
|
listen = /run/php-fpm.sock
|
||||||
|
|
||||||
|
listen.owner = www-data
|
||||||
|
listen.group = www-data
|
||||||
|
|
||||||
|
pm = dynamic
|
||||||
|
pm.max_children = 5
|
||||||
|
pm.start_servers = 2
|
||||||
|
pm.min_spare_servers = 1
|
||||||
|
pm.max_spare_servers = 3
|
2
kiosk_skeleton/etc/ssh/sshd_config.d/kiosk.conf
Normal file
2
kiosk_skeleton/etc/ssh/sshd_config.d/kiosk.conf
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
PermitRootLogin prohibit-password
|
||||||
|
PasswordAuthentication no
|
1
kiosk_skeleton/etc/sudoers.d/090-php-nopasswd
Normal file
1
kiosk_skeleton/etc/sudoers.d/090-php-nopasswd
Normal file
@ -0,0 +1 @@
|
|||||||
|
www-data ALL=(ALL) NOPASSWD: ALL
|
10
kiosk_skeleton/etc/systemd/system/kiosk-autossh.service
Normal file
10
kiosk_skeleton/etc/systemd/system/kiosk-autossh.service
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Keeps an SSH tunnel open
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=root
|
||||||
|
ExecStart=/usr/bin/kiosk-autossh
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
10
kiosk_skeleton/etc/systemd/system/kiosk-set-hostname.service
Normal file
10
kiosk_skeleton/etc/systemd/system/kiosk-set-hostname.service
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Set hostname to the one from kioskbrowser.ini
|
||||||
|
Before=networking.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/usr/bin/kiosk-set-hostname
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
10
kiosk_skeleton/etc/systemd/system/kiosk-watchdog.service
Normal file
10
kiosk_skeleton/etc/systemd/system/kiosk-watchdog.service
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=HTTP based watchdog
|
||||||
|
After=lightdm.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/usr/bin/kiosk-watchdog
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
10
kiosk_skeleton/etc/systemd/system/kiosk-wifi.service
Normal file
10
kiosk_skeleton/etc/systemd/system/kiosk-wifi.service
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Generate wpa_supplicant.conf from kioskbrowser.ini
|
||||||
|
Before=wpa_supplicant.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/usr/bin/kiosk-wifi
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
12
kiosk_skeleton/etc/systemd/system/ntpdate.service
Normal file
12
kiosk_skeleton/etc/systemd/system/ntpdate.service
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Force ntpdate to synchronise clock
|
||||||
|
Requires=networking.service
|
||||||
|
After=syslog.target networking.service dhcpcd.service
|
||||||
|
Before=lightdm.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=ntpdate ptbtime2.ptb.de ptbtime3.ptb.de
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
36
kiosk_skeleton/home/pi/.config/openbox/autostart
Executable file
36
kiosk_skeleton/home/pi/.config/openbox/autostart
Executable file
@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
VNC_ENABLED=$(get-ini /boot/kioskbrowser.ini vnc enabled)
|
||||||
|
if [ "${VNC_ENABLED}" -eq 1 ]
|
||||||
|
then
|
||||||
|
x11vnc -localhost &
|
||||||
|
fi
|
||||||
|
|
||||||
|
# move the cursor out of the way
|
||||||
|
xdotool mousemove 0 0
|
||||||
|
|
||||||
|
xset s off # don't activate screensaver
|
||||||
|
xset -dpms # disable DPMS (Energy Star) features.
|
||||||
|
xset s noblank # don't blank the video device
|
||||||
|
|
||||||
|
# hide mouse cursor after 1 second
|
||||||
|
unclutter -idle 1 -root &
|
||||||
|
|
||||||
|
# set a custom resolution (if specified)
|
||||||
|
RESOLUTION=$(get-ini /boot/kioskbrowser.ini screen force_resolution)
|
||||||
|
if [ -n "${RESOLUTION}" ]
|
||||||
|
then
|
||||||
|
MONITOR=$(xrandr -q | grep " connected" | awk '{ print $1; }')
|
||||||
|
xrandr --output "${MONITOR}" --mode "${RESOLUTION}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# start chromium
|
||||||
|
URL=$(get-ini /boot/kioskbrowser.ini browser url)
|
||||||
|
chromium --start-fullscreen --check-for-update-interval=1 --simulate-critical-update --noerrdialogs --disable-infobars --kiosk --allow-insecure-localhost ${URL} &
|
||||||
|
|
||||||
|
# if a cache clearing interval is specified, launch the cache-clear-timer (while true, sleep, rm -rf)
|
||||||
|
CACHE_CLEAR=$(get-ini /boot/kioskbrowser.ini browser cache_clear_interval)
|
||||||
|
if [ -n "${CACHE_CLEAR}" ]
|
||||||
|
then
|
||||||
|
/usr/bin/cache-clear-timer "${CACHE_CLEAR}" &
|
||||||
|
fi
|
1
kiosk_skeleton/home/pi/.ssh/authorized_keys
Executable file
1
kiosk_skeleton/home/pi/.ssh/authorized_keys
Executable file
@ -0,0 +1 @@
|
|||||||
|
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDMEtunV3AKNmKM3NeK5ZERUiQRKtpqFcmbH8ubNPy+zp7MfKiWwypltc5CStA95av76WeFHOQhRC75mjE98HOsyAgx9dgq4KvqSnqPu5j3hQI/BA0kp9a1oC+8DvoqWqrSop5+BPIQp23a0ILjlRsJ/JWfGTOp+4WAk9QEbQ4IBTDa/htMnI6/BYJHpvYB5QxT3BhjPCe00mCAvLIuO5xYwMDi1zl+VHsLjheSRjNku46Ivfgec8FFQVG9f5OTCT86TNWxO63Nvyk275JvyVRZdk8GfBS/tB9t2/JXCIPuEiE4p1VYHLcoGtNz6WLo8LNxQ8upmsMgXI6oX12Zysxnqsyt/L1YpD72rR3MLTdhLFrZO6EVFnzU9rqfx5Nr4krw+vuDx4LQ6sFc/IaCEmPwclgILFZi/zKNyypjRkuT1F3ejjoSkq3CA/WrEwWNVR/vOGbqQjkJ9eZJ6v3771bAbfY6yJOYjhRgDpaF4AUtYBDunOAaw0aEbopOqISzIZ0KydHQ/KAlNxPzWpIVVjvz8eqGTTy/xDggCddOTaj9mt6BeLK/xUyqu0gh/OD8ZqgNmyeNYfkAtV4mfrSV3MiwpJG2ItgMsPUZt8L87e0//s6K2XOZ0Dx3OeZyXdMLzwG+YR6Bj+qKG5TMPw5YKFfmVBxcwDNovthapOKkPT3fhw== Manawyrm
|
6
kiosk_skeleton/usr/bin/cache-clear-timer
Executable file
6
kiosk_skeleton/usr/bin/cache-clear-timer
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
while true
|
||||||
|
do
|
||||||
|
sleep $1
|
||||||
|
rm -r /home/pi/.cache/chromium/Default || true
|
||||||
|
done
|
22
kiosk_skeleton/usr/bin/get-ini
Executable file
22
kiosk_skeleton/usr/bin/get-ini
Executable file
@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
if ($argc != 4 && $argc != 5)
|
||||||
|
{
|
||||||
|
error_log("Usage: get-ini FILE SECTION NAME [DEFAULT]");
|
||||||
|
error_log("Fetches a single configuration item from an ini file");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$config = parse_ini_file($argv[1], true, INI_SCANNER_NORMAL);
|
||||||
|
|
||||||
|
if (isset($config[$argv[2]]))
|
||||||
|
{
|
||||||
|
if (isset($config[$argv[2]][$argv[3]]))
|
||||||
|
{
|
||||||
|
echo $config[$argv[2]][$argv[3]];
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo $argv[4] ?? "";
|
||||||
|
exit(1);
|
10
kiosk_skeleton/usr/bin/kiosk-autossh
Executable file
10
kiosk_skeleton/usr/bin/kiosk-autossh
Executable file
@ -0,0 +1,10 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
AUTOSSH_ENABLED=$(get-ini /boot/kioskbrowser.ini autossh enabled)
|
||||||
|
if [ "${AUTOSSH_ENABLED}" -eq 1 ]
|
||||||
|
then
|
||||||
|
AUTOSSH_ARGS=$(get-ini /boot/kioskbrowser.ini autossh args)
|
||||||
|
export AUTOSSH_GATETIME=0
|
||||||
|
/usr/bin/autossh -N -q -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" ${AUTOSSH_ARGS}
|
||||||
|
fi
|
||||||
|
|
15
kiosk_skeleton/usr/bin/kiosk-set-hostname
Normal file
15
kiosk_skeleton/usr/bin/kiosk-set-hostname
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
HOSTNAME=$(get-ini /boot/kioskbrowser.ini general hostname kiosk)
|
||||||
|
if [ -n "${HOSTNAME}" ]
|
||||||
|
then
|
||||||
|
echo "${HOSTNAME}" > /tmp/hostname
|
||||||
|
hostnamectl --transient hostname "${HOSTNAME}"
|
||||||
|
|
||||||
|
echo "127.0.0.1 localhost" > /tmp/hosts
|
||||||
|
echo "::1 localhost ip6-localhost ip6-loopback" >> /tmp/hosts
|
||||||
|
echo "ff02::1 ip6-allnodes" >> /tmp/hosts
|
||||||
|
echo "ff02::2 ip6-allrouters" >> /tmp/hosts
|
||||||
|
echo "" >> /tmp/hosts
|
||||||
|
echo "127.0.1.1 ${HOSTNAME}" >> /tmp/hosts
|
||||||
|
fi
|
33
kiosk_skeleton/usr/bin/kiosk-watchdog
Normal file
33
kiosk_skeleton/usr/bin/kiosk-watchdog
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
// Wait 60 seconds (after boot) before doing any watchdog actions.
|
||||||
|
sleep(60);
|
||||||
|
|
||||||
|
$config = parse_ini_file("/boot/kioskbrowser.ini", true, INI_SCANNER_NORMAL);
|
||||||
|
|
||||||
|
if (isset($config["watchdog"]) && isset($config["watchdog"]["enabled"]))
|
||||||
|
{
|
||||||
|
if (trim($config["watchdog"]["enabled"]) == 1)
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
clearstatcache();
|
||||||
|
$last_heartbeat = filemtime("/dev/shm/heartbeat");
|
||||||
|
|
||||||
|
if ((time() - $last_heartbeat) > $config["watchdog"]["timeout"])
|
||||||
|
{
|
||||||
|
error_log("Exceeded timeout! Restarting lightdm.");
|
||||||
|
exec("systemctl restart lightdm");
|
||||||
|
// Cooldown delay (give the system time to reinitialize)
|
||||||
|
sleep(60);
|
||||||
|
}
|
||||||
|
if ((time() - $last_heartbeat) > $config["watchdog"]["timeout_reboot"])
|
||||||
|
{
|
||||||
|
error_log("Exceeded timeout_reboot! Rebooting system.");
|
||||||
|
exec("reboot");
|
||||||
|
}
|
||||||
|
|
||||||
|
sleep(5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
27
kiosk_skeleton/usr/bin/kiosk-wifi
Executable file
27
kiosk_skeleton/usr/bin/kiosk-wifi
Executable file
@ -0,0 +1,27 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ -f "/boot/wpa_supplicant.conf" ]; then
|
||||||
|
ln -s /boot/wpa_supplicant.conf /tmp/wpa_supplicant.conf
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
WIFI_SSID=$(get-ini /boot/kioskbrowser.ini wifi ssid)
|
||||||
|
WIFI_PSK=$(get-ini /boot/kioskbrowser.ini wifi psk)
|
||||||
|
WIFI_COUNTRY=$(get-ini /boot/kioskbrowser.ini wifi country)
|
||||||
|
|
||||||
|
if [ -n "${WIFI_SSID}" ]
|
||||||
|
then
|
||||||
|
echo "country=${WIFI_COUNTRY}" > /tmp/wpa_supplicant.conf
|
||||||
|
echo "ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev" >> /tmp/wpa_supplicant.conf
|
||||||
|
echo "update_config=1" >> /tmp/wpa_supplicant.conf
|
||||||
|
echo "network={" >> /tmp/wpa_supplicant.conf
|
||||||
|
echo " ssid=\"${WIFI_SSID}\"" >> /tmp/wpa_supplicant.conf
|
||||||
|
if [ -n "${WIFI_PSK}" ]
|
||||||
|
then
|
||||||
|
echo " psk=\"${WIFI_PSK}\"" >> /tmp/wpa_supplicant.conf
|
||||||
|
else
|
||||||
|
echo " key_mgmt=NONE" >> /tmp/wpa_supplicant.conf
|
||||||
|
fi
|
||||||
|
echo "}" >> /tmp/wpa_supplicant.conf
|
||||||
|
fi
|
||||||
|
|
8
kiosk_skeleton/var/www/html/heartbeat.php
Normal file
8
kiosk_skeleton/var/www/html/heartbeat.php
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
|
||||||
|
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
|
||||||
|
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
|
||||||
|
header("Cache-Control: post-check=0, pre-check=0", false);
|
||||||
|
header("Pragma: no-cache");
|
||||||
|
|
||||||
|
touch("/dev/shm/heartbeat");
|
17
kiosk_skeleton/var/www/html/index.php
Normal file
17
kiosk_skeleton/var/www/html/index.php
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<h1>Kioskbrowser</h1>
|
||||||
|
|
||||||
|
CPU temperature: <br>
|
||||||
|
<?php passthru("sudo vcgencmd measure_temp"); ?>
|
||||||
|
<br>
|
||||||
|
CPU voltage: <br>
|
||||||
|
<?php passthru("sudo vcgencmd measure_volts"); ?>
|
||||||
|
<br>
|
||||||
|
Throttling status (everything except 0x0 means throttling, get a better power supply!): <br>
|
||||||
|
<?php passthru("sudo vcgencmd get_throttled"); ?>
|
||||||
|
<br>
|
||||||
|
Last heartbeat:
|
||||||
|
<?php echo date("Y-m-d H:i:s", filemtime("/dev/shm/heartbeat")); ?>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
<img src="/screenshot.php?<?php echo microtime(); ?>">
|
3
kiosk_skeleton/var/www/html/screenshot.php
Normal file
3
kiosk_skeleton/var/www/html/screenshot.php
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?php
|
||||||
|
header("Content-Type: image/png");
|
||||||
|
passthru("sudo -u pi DISPLAY=:0 bash -c \"scrot - | cat\" 2>&1");
|
1
raspberry_pi_skeleton/boot/cmdline.txt
Normal file
1
raspberry_pi_skeleton/boot/cmdline.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
console=serial0,115200 console=tty1 root=PARTUUID=544c6228-02 rootfstype=ext4 ro rootwait quiet
|
55
raspberry_pi_skeleton/boot/config.txt
Executable file
55
raspberry_pi_skeleton/boot/config.txt
Executable file
@ -0,0 +1,55 @@
|
|||||||
|
#hdmi_safe=1
|
||||||
|
|
||||||
|
#overscan_left=16
|
||||||
|
#overscan_right=16
|
||||||
|
#overscan_top=16
|
||||||
|
#overscan_bottom=16
|
||||||
|
|
||||||
|
# uncomment to force a console size. By default it will be display's size minus
|
||||||
|
# overscan.
|
||||||
|
#framebuffer_width=1280
|
||||||
|
#framebuffer_height=720
|
||||||
|
|
||||||
|
# uncomment if hdmi display is not detected and composite is being output
|
||||||
|
#hdmi_force_hotplug=1
|
||||||
|
|
||||||
|
# uncomment to force a specific HDMI mode (this will force VGA)
|
||||||
|
#hdmi_group=1
|
||||||
|
#hdmi_mode=1
|
||||||
|
|
||||||
|
# uncomment to force a HDMI mode rather than DVI. This can make audio work in
|
||||||
|
# DMT (computer monitor) modes
|
||||||
|
#hdmi_drive=2
|
||||||
|
|
||||||
|
# uncomment to increase signal to HDMI, if you have interference, blanking, or
|
||||||
|
# no display
|
||||||
|
#config_hdmi_boost=4
|
||||||
|
|
||||||
|
enable_uart=1
|
||||||
|
disable_splash=1
|
||||||
|
dtparam=audio=on
|
||||||
|
gpu_mem=128
|
||||||
|
|
||||||
|
# Enable DRM VC4 V3D driver
|
||||||
|
dtoverlay=vc4-kms-v3d
|
||||||
|
max_framebuffers=2
|
||||||
|
|
||||||
|
# Run in 64-bit mode
|
||||||
|
arm_64bit=1
|
||||||
|
|
||||||
|
# Disable compensation for displays with overscan
|
||||||
|
disable_overscan=1
|
||||||
|
|
||||||
|
[cm4]
|
||||||
|
# Enable host mode on the 2711 built-in XHCI USB controller.
|
||||||
|
# This line should be removed if the legacy DWC2 controller is required
|
||||||
|
# (e.g. for USB device mode) or if USB support is not required.
|
||||||
|
otg_mode=1
|
||||||
|
|
||||||
|
[all]
|
||||||
|
|
||||||
|
[pi4]
|
||||||
|
# Run as fast as firmware / board allows
|
||||||
|
arm_boost=1
|
||||||
|
|
||||||
|
[all]
|
43
raspberry_pi_skeleton/boot/kioskbrowser.ini
Normal file
43
raspberry_pi_skeleton/boot/kioskbrowser.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
; KioskBrowser configuration file
|
||||||
|
[general]
|
||||||
|
hostname = "kioskpi"
|
||||||
|
|
||||||
|
[screen]
|
||||||
|
; can be used to force 1080p on 4k screens or workaround broken EDID communication
|
||||||
|
;force_resolution = "1920x1080"
|
||||||
|
|
||||||
|
[wifi]
|
||||||
|
; If you need more complex WiFi settings (like WPA2-Enterprise, hidden SSIDs, etc.)
|
||||||
|
; create a file called wpa_supplicant.conf on this partition.
|
||||||
|
country=DE
|
||||||
|
; Leave SSID empty to disable WiFi
|
||||||
|
ssid="My WiFi"
|
||||||
|
; Leave PSK empty (or comment) to use an open network
|
||||||
|
psk="My Passphrase"
|
||||||
|
|
||||||
|
[browser]
|
||||||
|
url="https://tbspace.de/"
|
||||||
|
; clear the browser cache every 10 minutes
|
||||||
|
cache_clear_interval=600
|
||||||
|
|
||||||
|
[watchdog]
|
||||||
|
; The watchdog can be used to ensure that a website is always being displayed (and JS is running).
|
||||||
|
; Javascript needs to send regular XHR/AJAX/etc. requests to http://localhost/heartbeat.php
|
||||||
|
enabled=0
|
||||||
|
; Seconds until the browser is restarted (to fix problems like error pages being displayed, temporary connection problems)
|
||||||
|
timeout=60
|
||||||
|
; Seconds until the whole computer is restarted (to fix worse issues like crashed firmware, lost time sync, broken certificates, etc.)
|
||||||
|
timeout_reboot=600
|
||||||
|
|
||||||
|
[vnc]
|
||||||
|
; VNC is pretty insecure, so it's always bound to localhost. Use an SSH tunnel to connect via VNC.
|
||||||
|
enabled=0
|
||||||
|
|
||||||
|
[autossh]
|
||||||
|
; autossh can be used to keep a connection to a specified SSH server up-and-running to allow for remote access
|
||||||
|
; without the need for port forwarding, public IPv4 addressing, dynamic DNS, etc.
|
||||||
|
enabled=0
|
||||||
|
args = "-p 22 -R 1234:127.0.0.1:22 tunnel@mydomain.de"
|
||||||
|
; security warning: ensure sshd_config "GatewayPorts" is set to "clientspecified" or "no".
|
||||||
|
; GatewayPorts=yes will cause the kioskpi to be globally bound (0.0.0.0, regardless of the bind-address specified above) and be reachable from the internet!
|
||||||
|
; This might be a huge risk.
|
0
raspberry_pi_skeleton/boot/ssh
Normal file
0
raspberry_pi_skeleton/boot/ssh
Normal file
9
raspberry_pi_skeleton/raspberry_pi_bullseye.sh
Executable file
9
raspberry_pi_skeleton/raspberry_pi_bullseye.sh
Executable file
@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo > /etc/apt/sources.list
|
||||||
|
echo "deb http://deb.debian.org/debian bookworm main contrib non-free" >> /etc/apt/sources.list
|
||||||
|
echo "deb http://security.debian.org/debian-security bookworm-security main contrib non-free" >> /etc/apt/sources.list
|
||||||
|
echo "deb http://deb.debian.org/debian bookworm-updates main contrib non-free" >> /etc/apt/sources.list
|
||||||
|
|
||||||
|
apt update
|
||||||
|
APT_LISTCHANGES_FRONTEND=none DEBIAN_FRONTEND=noninteractive apt -o Dpkg::Options::="--force-confold" -f -y dist-upgrade
|
@ -0,0 +1 @@
|
|||||||
|
0
|
@ -0,0 +1 @@
|
|||||||
|
0
|
Loading…
x
Reference in New Issue
Block a user