#!/bin/sh # install-meshagent.sh # MeshCentral-MeshAgent für Batocera im /userdata-Bereich installieren # - fragt interaktiv nach MeshCentral-URL & Enrollment-Token # - lädt den offiziellen meshinstall.sh vom Server # - richtet Autostart über /userdata/system/custom.sh ein # BusyBox-/ash-kompatibel (Batocera hat read-only rootfs, daher alles in /userdata) set -eu MESH_BASE="/userdata/system/meshagent" MESH_LOG="${MESH_BASE}/meshagent.log" CUSTOM_SH="/userdata/system/custom.sh" SOCKET_TEST_HOST="1.1.1.1" say() { printf '%s\n' "$*"; } err() { printf 'ERROR: %s\n' "$*" >&2; } ask() { printf '%s' "$1" >&2; read -r REPLY; printf '%s' "$REPLY"; } need_root() { if [ "$(id -u)" != "0" ]; then err "Bitte als root ausführen (Batocera läuft i.d.R. sowieso als root)." exit 1 fi } wait_net() { say "Warte auf Netzwerk …" i=0 while ! ping -c1 -W1 "$SOCKET_TEST_HOST" >/dev/null 2>&1; do i=$((i+1)) [ $i -ge 30 ] && break sleep 2 done } mk_layout() { mkdir -p "$MESH_BASE" cd "$MESH_BASE" } download_install_script() { # lädt den generischen MeshCentral-Install-Skript (script=1) vom eigenen Server MESH_URL="$1" say "Lade meshinstall.sh von: ${MESH_URL}" # robust: erst wget, dann wget ohne Proxy, dann curl if ! (wget "${MESH_URL}" -O meshinstall.sh 2>/dev/null || wget "${MESH_URL}" --no-proxy -O meshinstall.sh 2>/dev/null); then if command -v curl >/dev/null 2>&1; then if ! curl -fsSL "${MESH_URL}" -o meshinstall.sh; then err "Konnte meshinstall.sh nicht herunterladen." exit 2 fi else err "Weder wget noch curl verfügbar." exit 2 fi fi chmod 755 meshinstall.sh } run_install_script() { # führt den Agent-Installer aus; auf Batocera fehlen Systemdienste -> wir nutzen später -noinstall MC_URL="$1" MC_TOKEN="$2" say "Starte meshinstall.sh (dies erzeugt u.a. ./meshagent und ./meshagent.msh)…" # ohne sudo; falls der Installer eine zweite Runde braucht, führen wir ihn einfach nochmal aus if ! ./meshinstall.sh "$MC_URL" "$MC_TOKEN"; then say "Zweiter Versuch…" ./meshinstall.sh "$MC_URL" "$MC_TOKEN" fi if [ ! -x "${MESH_BASE}/meshagent" ]; then err "meshagent wurde nicht erzeugt. Prüfe URL/Token und Logs." exit 3 fi } write_start_script() { cat > "${MESH_BASE}/start.sh" <<'EOF' #!/bin/sh # Startskript für MeshAgent unter Batocera (userland, ohne Systemdienst) BASE="/userdata/system/meshagent" LOG="${BASE}/meshagent.log" # vorhandenen Agent beenden, falls aktiv if pidof meshagent >/dev/null 2>&1; then killall meshagent 2>/dev/null || true sleep 1 fi # Netzwerk abwarten i=0 while ! ping -c1 -W1 1.1.1.1 >/dev/null 2>&1; do i=$((i+1)); [ $i -ge 30 ] && break sleep 2 done # Agent im Userverzeichnis starten; -noinstall erzwingt lokalen State/kein Systemdienst cd "$BASE" # logrotate-light: wenn >5MB, alte Datei weg if [ -f "$LOG" ] && [ "$(wc -c <"$LOG")" -gt 5242880 ]; then mv "$LOG" "$LOG.1" 2>/dev/null || true fi ./meshagent start >>"$LOG" 2>&1 & EOF chmod +x "${MESH_BASE}/start.sh" } enable_autostart() { # custom.sh anlegen/ergänzen (idempotent) if [ ! -f "$CUSTOM_SH" ]; then echo '#!/bin/sh' > "$CUSTOM_SH" chmod +x "$CUSTOM_SH" fi if ! grep -q '/userdata/system/meshagent/start.sh' "$CUSTOM_SH"; then printf '\n# MeshAgent Autostart\n/userdata/system/meshagent/start.sh &\n' >> "$CUSTOM_SH" fi } start_now() { say "Starte MeshAgent jetzt…" /userdata/system/meshagent/start.sh sleep 1 if pidof meshagent >/dev/null 2>&1; then say "MeshAgent läuft. Log: ${MESH_LOG}" else err "MeshAgent scheint nicht zu laufen. Sieh in ${MESH_LOG} nach." exit 4 fi } ### --- main --------------------------------------------------------------- need_root wait_net mk_layout say "=== MeshCentral-Agent Installer (Batocera) ===" # 1) Abfrage nach MeshCentral-Server (Basis-URL) & Token # Du kannst hier auch einfach DEINEN Copy&Paste-Command posten – wir extrahieren URL & Token. ENTRY="$(ask "Bitte MeshCentral-URL & Token eingeben\n(z.B. nur URL & Token getrennt durch ENTER, oder füge deinen gesamten Copy&Paste-Befehl ein):\n> ")" # Versuch, URL & Token aus ENTRY zu parsen # Erlaubt Formen wie: # - https://meshcentral.example.com # - kompletter Befehl … ./meshinstall.sh https://meshcentral.example.com '' MC_URL="" MC_TOKEN="" # 1. Wenn ENTRY nur die URL ist, Token separat abfragen case "$ENTRY" in http*://*mesh*|http*://*) MC_URL="$ENTRY" ;; *) # aus kompletten Befehlen URL/Token extrahieren MC_URL="$(printf '%s' "$ENTRY" | sed -n "s/.*\(https\?:\/\/[A-Za-z0-9._~:/?#\[\]@!$&'()*+,;=%-]*\).*/\1/p" | head -n1)" MC_TOKEN="$(printf '%s' "$ENTRY" | sed -n "s/.*meshinstall\.sh[[:space:]]\+https\?:\/\/[^[:space:]]\+[[:space:]]\+'\([^']*\)'.*/\1/p" | head -n1)" if [ -z "$MC_TOKEN" ]; then # Alternative: Token unquoted am Ende MC_TOKEN="$(printf '%s' "$ENTRY" | awk '{print $NF}')" fi ;; esac if [ -z "$MC_URL" ]; then MC_URL="$(ask "MeshCentral-Server-URL (z.B. https://meshcentral.familie-berner.de): ")" fi if [ -z "$MC_TOKEN" ]; then MC_TOKEN="$(ask "Enrollment-Token (von MeshCentral): ")" fi # 2) meshinstall.sh vom Server holen INSTALL_URL="${MC_URL%/}/meshagents?script=1" download_install_script "$INSTALL_URL" # 3) Installer ausführen (legt u.a. ./meshagent & ./meshagent.msh an) run_install_script "$MC_URL" "$MC_TOKEN" # 4) Startskript + Autostart bauen write_start_script enable_autostart # 5) Starten & Abschluss start_now say "" say "Fertig! Der MeshAgent läuft nun und startet künftig automatisch über ${CUSTOM_SH}." say "Log-Datei: ${MESH_LOG}" say "" say "Tipps:" say "- Zum sofortigen Neustart des Agents: /userdata/system/meshagent/start.sh" say "- Log live ansehen: tail -f ${MESH_LOG}" say "- Autostart entfernen: sed -i '/meshagent\\/start\\.sh/d' ${CUSTOM_SH} && killall meshagent"