#!/bin/bash set -euo pipefail SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" KIOSK_USER="${KIOSK_USER:-analyzer}" PHOENIX_DIR="${PHOENIX_DIR:-$SCRIPT_DIR}" PHOENIX_BIN="${PHOENIX_BIN:-$PHOENIX_DIR/target/release/phoenix}" SESSION_SCRIPT="${SESSION_SCRIPT:-$PHOENIX_DIR/session.sh}" KIOSK_HOME="$(getent passwd "$KIOSK_USER" | cut -d: -f6)" if [ -z "${KIOSK_HOME:-}" ]; then KIOSK_HOME="/home/$KIOSK_USER" fi PHOENIX_BUILD_LOG="${PHOENIX_BUILD_LOG:-$KIOSK_HOME/phoenix-build.log}" PHOENIX_MIN_RUSTC_VERSION="${PHOENIX_MIN_RUSTC_VERSION:-1.71.0}" export PATH="/root/.cargo/bin:/home/${KIOSK_USER}/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:${PATH:-}" export CARGO_NET_GIT_FETCH_WITH_CLI="${CARGO_NET_GIT_FETCH_WITH_CLI:-true}" mkdir -p "$(dirname "$PHOENIX_BUILD_LOG")" exec 3>&1 4>&2 BUILD_LOG_PIPE="$(mktemp -u /tmp/phoenix-build-log.XXXXXX)" mkfifo "$BUILD_LOG_PIPE" sed -u -E $'s/\x1B\\[[0-9;?]*[ -/]*[@-~]//g' < "$BUILD_LOG_PIPE" >> "$PHOENIX_BUILD_LOG" & BUILD_LOG_FILTER_PID=$! cleanup_logging() { if [ -n "${BUILD_LOG_FILTER_PID:-}" ]; then kill "$BUILD_LOG_FILTER_PID" 2>/dev/null || true wait "$BUILD_LOG_FILTER_PID" 2>/dev/null || true fi if [ -n "${BUILD_LOG_PIPE:-}" ] && [ -p "${BUILD_LOG_PIPE:-}" ]; then rm -f "$BUILD_LOG_PIPE" fi } stop_build_logging() { exec 1>&3 2>&4 cleanup_logging exec 3>&- 4>&- trap - EXIT } trap cleanup_logging EXIT exec > >(tee "$BUILD_LOG_PIPE") 2>&1 echo "=== $(date): kiosk-start.sh START ===" print_banner() { local title="${1:-PHOENIX STARTET}" local detail="${2:-Bitte warten...}" if command -v clear >/dev/null 2>&1; then clear || true fi cat </dev/null 2>&1; then print_banner \ "BUILD-ABHAENGIGKEITEN WERDEN GEPRUEFT" \ "Rust-Toolchain und Systempakete werden bei Bedarf vorbereitet." export DEBIAN_FRONTEND=noninteractive apt-get update apt-get install -y pkg-config libasound2-dev curl ca-certificates git build-essential fi if ! has_supported_rust_toolchain; then install_or_update_rust_toolchain fi if ! has_supported_rust_toolchain; then echo "No supported Rust toolchain found. Need rustc >= ${PHOENIX_MIN_RUSTC_VERSION}." exit 1 fi } has_supported_rust_toolchain() { if ! command -v cargo >/dev/null 2>&1 || ! command -v rustc >/dev/null 2>&1; then return 1 fi local current current="$(rustc_version)" if [ -z "$current" ]; then return 1 fi version_ge "$current" "$PHOENIX_MIN_RUSTC_VERSION" } rustc_version() { if ! command -v rustc >/dev/null 2>&1; then return 1 fi rustc --version 2>/dev/null | awk '{print $2}' } version_ge() { local current="${1:-0}" local minimum="${2:-0}" [ "$(printf '%s\n%s\n' "$minimum" "$current" | sort -V | head -n1)" = "$minimum" ] } install_or_update_rust_toolchain() { local current current="$(rustc_version || true)" if [ -n "$current" ]; then echo "Current rustc ${current} is too old; need >= ${PHOENIX_MIN_RUSTC_VERSION}." else echo "Rust toolchain not found; installing via rustup." fi print_banner \ "AKTUELLE RUST-TOOLCHAIN WIRD INSTALLIERT" \ "Das System-Rust ist zu alt fuer Phoenix. Es wird rustup/stable verwendet." if command -v rustup >/dev/null 2>&1; then rustup toolchain install stable --profile minimal rustup default stable else if ! command -v curl >/dev/null 2>&1; then echo "curl not found; cannot install rustup." return 1 fi curl https://sh.rustup.rs -sSf | sh -s -- -y --profile minimal --default-toolchain stable fi export PATH="/root/.cargo/bin:/home/${KIOSK_USER}/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin" hash -r echo "Using rustc $(rustc_version || echo unknown)" } wait_for_build_network() { if ! command -v getent >/dev/null 2>&1; then return 0 fi local host="${PHOENIX_BUILD_TEST_HOST:-github.com}" local tries="${PHOENIX_BUILD_NET_WAIT_TRIES:-20}" local sleep_s="${PHOENIX_BUILD_NET_WAIT_SLEEP_S:-2}" local i for ((i = 1; i <= tries; i++)); do if getent hosts "$host" >/dev/null 2>&1; then return 0 fi echo "Waiting for DNS/network before build ($i/$tries): $host" sleep "$sleep_s" done echo "DNS/network check did not succeed for $host; continuing with build retries." } build_phoenix_with_retries() { local attempts="${PHOENIX_BUILD_RETRIES:-3}" local sleep_s="${PHOENIX_BUILD_RETRY_SLEEP_S:-5}" local attempt for ((attempt = 1; attempt <= attempts; attempt++)); do echo "Starting Phoenix build (attempt $attempt/$attempts)" if ( cd "$PHOENIX_DIR" CARGO_TERM_COLOR=always cargo build --release ); then return 0 fi if [ "$attempt" -lt "$attempts" ]; then echo "Phoenix build failed; retrying in ${sleep_s}s..." sleep "$sleep_s" fi done echo "Phoenix build failed after $attempts attempts." exit 1 } if [ ! -f "$SESSION_SCRIPT" ]; then echo "Session script missing: $SESSION_SCRIPT" exit 1 fi build_phoenix_if_needed if [ ! -x "$PHOENIX_BIN" ] || [ ! -s "$PHOENIX_BIN" ]; then echo "Phoenix binary missing, empty or not executable: $PHOENIX_BIN" exit 1 fi stop_build_logging exec /usr/bin/xinit /bin/bash "$SESSION_SCRIPT" -- :0 -nolisten tcp -nocursor vt1