From b2a8269b533bb0cce3fca5d211ae56c5f74378f0 Mon Sep 17 00:00:00 2001 From: matthiasberner Date: Sun, 28 Sep 2025 16:47:54 +0200 Subject: [PATCH] =?UTF-8?q?install-meshagent.sh=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install-meshagent.sh | 194 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 install-meshagent.sh diff --git a/install-meshagent.sh b/install-meshagent.sh new file mode 100644 index 0000000..2a1a4be --- /dev/null +++ b/install-meshagent.sh @@ -0,0 +1,194 @@ +#!/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 -noinstall >>"$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"