59 lines
2.6 KiB
Bash
Executable File
59 lines
2.6 KiB
Bash
Executable File
#!/bin/sh
|
|
# Chromium kiosk window pointed at pantry-vision's frontend (pantry-web). Installed
|
|
# to /usr/local/bin/pantry-kiosk. Called both at session start and by
|
|
# kitchen-display-agent when a "Show scan/inventory/recipes" MQTT command arrives.
|
|
#
|
|
# Kill-and-relaunch, not focus-and-navigate — same reasoning as hosts/thin-client's
|
|
# digest-browser: Chromium's --kiosk window has no address bar to drive remotely, and
|
|
# the page underneath (pantry-vision/frontend/) is cheap to reload. Camera capture is
|
|
# momentary (hold item up, tap Capture) so losing an in-progress scan to a "Show
|
|
# inventory" command is an acceptable, rare edge case, not a design flaw to solve here.
|
|
set -eu
|
|
|
|
PROFILE_DIR="${HOME:-/home/$(id -un)}/.config/kitchen-display-chromium"
|
|
|
|
BASE_URL="${PANTRY_WEB_URL:-}"
|
|
[ -n "$BASE_URL" ] || { echo "pantry-kiosk: PANTRY_WEB_URL is unset" >&2; exit 1; }
|
|
[ -n "${PANTRY_VISION_URL:-}" ] || { echo "pantry-kiosk: PANTRY_VISION_URL is unset" >&2; exit 1; }
|
|
[ -n "${PANTRY_VISION_TOKEN:-}" ] || { echo "pantry-kiosk: PANTRY_VISION_TOKEN is unset" >&2; exit 1; }
|
|
|
|
# api=/token= are read by frontend/app.js — see that file's top comment for why
|
|
# config travels this way instead of being baked into the served static files.
|
|
FRAGMENT="${1:-}"
|
|
URL="${BASE_URL%/}/index.html?api=$(printf '%s' "$PANTRY_VISION_URL" | sed 's/\//%2F/g; s/:/%3A/g')&token=${PANTRY_VISION_TOKEN}"
|
|
[ -n "$FRAGMENT" ] && URL="${URL}#${FRAGMENT}"
|
|
|
|
if command -v chromium >/dev/null 2>&1; then
|
|
CHROMIUM=chromium
|
|
elif command -v chromium-browser >/dev/null 2>&1; then
|
|
CHROMIUM=chromium-browser
|
|
else
|
|
echo "pantry-kiosk: no chromium/chromium-browser binary found" >&2
|
|
exit 1
|
|
fi
|
|
|
|
mkdir -p "$PROFILE_DIR"
|
|
|
|
pkill -u "$(id -u)" -f "$CHROMIUM .*--user-data-dir=$PROFILE_DIR" 2>/dev/null || true
|
|
i=0
|
|
while pgrep -u "$(id -u)" -f "$CHROMIUM .*--user-data-dir=$PROFILE_DIR" >/dev/null 2>&1 && [ "$i" -lt 20 ]; do
|
|
sleep 0.25
|
|
i=$((i + 1))
|
|
done
|
|
|
|
# --use-fake-ui-for-media-stream auto-accepts the getUserMedia camera prompt instead
|
|
# of leaving it sitting unanswered on a screen nobody is there to click "Allow" on —
|
|
# VERIFY: the simplest documented way to do this: the alternative,
|
|
# VideoCaptureAllowedUrls enterprise policy, needs a policies.json this image doesn't
|
|
# currently ship, so start with the flag and only add that if it proves insufficient.
|
|
exec "$CHROMIUM" \
|
|
--user-data-dir="$PROFILE_DIR" \
|
|
--ozone-platform=wayland \
|
|
--kiosk --app="$URL" \
|
|
--use-fake-ui-for-media-stream \
|
|
--start-fullscreen \
|
|
--noerrdialogs --disable-infobars --disable-session-crashed-bubble \
|
|
--overscroll-history-navigation=0 \
|
|
--touch-events=enabled \
|
|
--check-for-update-interval=31536000
|