#!/usr/bin/sh
#
# /usr/bin/eldric-aios — auto-selecting wrapper.
#
# Picks the CUDA variant when:
#   - eldric-aios-cuda RPM is installed (binary exists)
#   - an NVIDIA device is visible (/dev/nvidia0)
# Otherwise falls back to the CPU binary. This lets the same
# `eldric-aios.service` systemd unit (and the same /usr/bin path)
# deploy unchanged on CPU edge nodes and GPU inference nodes —
# the host's hardware picks which binary actually runs.
#
# CUDA bundled libs live under /usr/lib64/eldric-aios/cuda/ in the
# eldric-aios-cuda RPM. That directory is prepended to LD_LIBRARY_PATH
# only when we're about to exec the CUDA binary, so CPU-only hosts
# never load them.

set -eu

CUDA_BIN=/usr/libexec/eldric-aios/cuda
CPU_BIN=/usr/libexec/eldric-aios/cpu
CUDA_LIB_DIR=/usr/lib64/eldric-aios/cuda

# ── /dev/nvidia0 KANN BEIM KALTSTART NOCH FEHLEN ────────────────────────────
#
# Gemessen am 2026-09-07 auf .47, nach dem Umzug ins Rechenzentrum: der Dienst
# lief 507-mal in einen Neustart mit "no runnable binary found". Der Binaer war
# da, 246 MB, ausfuehrbar, lief von Hand. Treiber geladen, Karte am Bus,
# nvidia-smi meldete die RTX 4070 Ti. Es fehlten allein die GERAETEKNOTEN.
#
# Die entstehen TRAEGE, bei der ersten Benutzung der GPU. Nach einem Kaltstart
# hat sie noch niemand angefasst — und wer als Erster kommt, findet nichts. Ein
# einziges `nvidia-smi` legte sie an, danach startete der Dienst sofort. Das ist
# ein Wettlauf beim Hochfahren, kein Einzelfall: er trifft jeden Kaltstart, bei
# dem der Dienst schneller ist als irgendein GPU-Zugriff.
#
# nvidia-modprobe ist genau dafuer da und liegt beim Treiber bei. Fehlt es oder
# schlaegt es fehl, geht es unten ehrlich weiter — `|| true`, weil `set -e`
# sonst hier abbricht.
if [ -x "${CUDA_BIN}" ] && [ ! -e /dev/nvidia0 ]; then
    if command -v nvidia-modprobe >/dev/null 2>&1; then
        nvidia-modprobe -c 0 -u >/dev/null 2>&1 || true
    fi
fi

if [ -x "${CUDA_BIN}" ] && [ -e /dev/nvidia0 ]; then
    if [ -d "${CUDA_LIB_DIR}" ]; then
        LD_LIBRARY_PATH="${CUDA_LIB_DIR}${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}"
        export LD_LIBRARY_PATH
    fi
    exec "${CUDA_BIN}" "$@"
fi

if [ ! -x "${CPU_BIN}" ]; then
    # DIE ALTE MELDUNG ZEIGTE IN DIE FALSCHE RICHTUNG. Sie sagte "no runnable
    # binary found" und nannte beide Pfade — waehrend der CUDA-Binaer vorhanden
    # und ausfuehrbar war. Wer das liest, sucht ein fehlendes Paket. Der Fehler
    # lag an der GPU-Seite. Eine Meldung, die die haeufigste Ursache verschweigt
    # und stattdessen eine falsche nennt, kostet genau die Suche, die sie
    # ersparen soll.
    if [ -x "${CUDA_BIN}" ]; then
        echo "eldric-aios: CUDA binary is present and executable" \
             "(${CUDA_BIN}), but /dev/nvidia0 does not exist, so this host" \
             "cannot be treated as a GPU host — and this package ships no CPU" \
             "binary (${CPU_BIN} missing)." >&2
        echo "eldric-aios: the device nodes are created on first GPU use." \
             "Check: nvidia-smi ; nvidia-modprobe -c 0 -u ; ls /dev/nvidia*" >&2
        echo "eldric-aios: if nvidia-smi works but /dev/nvidia0 stays absent," \
             "the driver is loaded but the nodes were never created." >&2
    else
        echo "eldric-aios: no runnable binary found" \
             "(looked for ${CUDA_BIN} and ${CPU_BIN})" >&2
    fi
    exit 127
fi

exec "${CPU_BIN}" "$@"
