From 25852788c4c5b80cb8ae9232df64a80784c79282 Mon Sep 17 00:00:00 2001 From: Matthias Berner Date: Sun, 28 Sep 2025 17:58:48 +0200 Subject: [PATCH] upd --- Batocera/MeshCentral/README.md | 12 +- Batocera/MeshCentral/install-meshagent.sh | 151 +++++++++++----------- 2 files changed, 82 insertions(+), 81 deletions(-) diff --git a/Batocera/MeshCentral/README.md b/Batocera/MeshCentral/README.md index e8d1043..fab7b4a 100644 --- a/Batocera/MeshCentral/README.md +++ b/Batocera/MeshCentral/README.md @@ -1,12 +1,20 @@ -# MeshCentral +# MeshCentral (Batocera) -Nachfolgend zwei **Copy-&-Paste Einzeiler** für Batocera, um den MeshAgent-Installer aus diesem Repo herunterzuladen und zu starten. +Dieser Installer unterstützt **Copy & Paste** des **Linux/BSD-Einzeilers** aus MeshCentral (_Devices → Add Agent → **Linux / BSD**_). +Du kannst also den kompletten Befehl aus dem MeshCentral-Fenster hier einfügen – URL & Token werden automatisch geparst. **RAW-URL des Installers:** `https://git.familie-berner.de/Open/Installer/raw/branch/main/Batocera/MeshCentral/install-meshagent.sh` --- +## Option 1: Interaktiv (URL/Token werden abgefragt ODER aus deinem Linux/BSD-Einzeiler geparst) + +```bash +U=https://git.familie-berner.de/Open/Installer/raw/branch/main/Batocera/MeshCentral/nstall-meshagent.sh ; (wget -qO /tmp/ima.sh "$U" || wget --no-proxy -qO /tmp/ima.sh "$U" || curl -fsSL "$U" -o /tmp/ima.sh) && sh /tmp/ima.sh + +--- + ## Option 1: Interaktiv (fragt URL & Token ab) ```bash diff --git a/Batocera/MeshCentral/install-meshagent.sh b/Batocera/MeshCentral/install-meshagent.sh index 6ffd4a1..b75c2fe 100644 --- a/Batocera/MeshCentral/install-meshagent.sh +++ b/Batocera/MeshCentral/install-meshagent.sh @@ -1,10 +1,8 @@ #!/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) +# Batocera-/BusyBox-kompatibel. Installiert den MeshCentral-Agent im /userdata-Bereich, +# richtet Autostart ein und kann URL/Token entweder interaktiv abfragen +# ODER direkt aus dem MeshCentral-Linux/BSD-Einzeiler heraus PARSEN. set -eu @@ -15,11 +13,11 @@ 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"; } +ask() { printf '%s' "$1" >&2; read -r REPLY || true; 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)." + err "Bitte als root ausführen (auf Batocera üblich)." exit 1 fi } @@ -28,8 +26,7 @@ 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 + i=$((i+1)); [ $i -ge 30 ] && break sleep 2 done } @@ -40,16 +37,11 @@ mk_layout() { } download_install_script() { - # lädt den generischen MeshCentral-Install-Skript (script=1) vom eigenen Server - MESH_URL="$1" + MESH_URL="$1" # z. B. https://meshcentral.example.com/meshagents?script=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 ! (wget -qO meshinstall.sh "$MESH_URL" 2>/dev/null || wget --no-proxy -qO meshinstall.sh "$MESH_URL" 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 + curl -fsSL "$MESH_URL" -o meshinstall.sh else err "Weder wget noch curl verfügbar." exit 2 @@ -59,13 +51,11 @@ download_install_script() { } 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 + say "Starte meshinstall.sh …" if ! ./meshinstall.sh "$MC_URL" "$MC_TOKEN"; then - say "Zweiter Versuch…" + say "Zweiter Versuch …" ./meshinstall.sh "$MC_URL" "$MC_TOKEN" fi if [ ! -x "${MESH_BASE}/meshagent" ]; then @@ -77,7 +67,6 @@ run_install_script() { 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" @@ -94,19 +83,19 @@ while ! ping -c1 -W1 1.1.1.1 >/dev/null 2>&1; do sleep 2 done -# Agent im Userverzeichnis starten; -noinstall erzwingt lokalen State/kein Systemdienst cd "$BASE" -# logrotate-light: wenn >5MB, alte Datei weg +# Mini-Logrotate if [ -f "$LOG" ] && [ "$(wc -c <"$LOG")" -gt 5242880 ]; then mv "$LOG" "$LOG.1" 2>/dev/null || true fi -./meshagent start >>"$LOG" 2>&1 & + +# -noinstall: keine Systemintegration, alles lokal +./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" @@ -117,7 +106,7 @@ enable_autostart() { } start_now() { - say "Starte MeshAgent jetzt…" + say "Starte MeshAgent jetzt …" /userdata/system/meshagent/start.sh sleep 1 if pidof meshagent >/dev/null 2>&1; then @@ -128,67 +117,71 @@ start_now() { fi } -### --- main --------------------------------------------------------------- +# ---- Parser: URL/Token aus MeshCentral-Linux/BSD-Einzeiler oder Variablen/Args ---- +# Unterstützte Eingaben: +# - Interaktiv: erst URL, dann Token +# - Env: MC_URL / MC_TOKEN +# - Args: alles, was du eingibst, wird zusammengesetzt und geparst (z. B. kompletter Einzeiler) +parse_url_token() { + ENTRY_ALL="$*" + + # ENV hat Vorrang + MC_URL="${MC_URL:-}" + MC_TOKEN="${MC_TOKEN:-}" + + # Falls Args übergeben wurden, übernehme sie als ENTRY + if [ -n "$ENTRY_ALL" ]; then + ENTRY="$ENTRY_ALL" + else + # Interaktive Abfrage – hier kann man ENTWEDER die URL/Token einzeln eingeben + # ODER den kompletten MeshCentral-Linux/BSD-Einzeiler paste'n. + ENTRY="$(ask "Füge hier den Linux/BSD-Einzeiler aus MeshCentral ein\nODER gib die Server-URL ein und drücke ENTER:\n> ")" + fi + + # Wenn MC_URL leer ist, versuche aus ENTRY zu parsen: + if [ -z "${MC_URL}" ]; then + # 1) Exakte Form: … meshinstall.sh '' … + MC_URL="$(printf '%s' "$ENTRY" | sed -nE 's/.*meshinstall\.sh[[:space:]]+(https?:\/\/[^[:space:]]+).*/\1/p' | head -n1)" + # 2) Fallback: erster https://… im Text + [ -n "$MC_URL" ] || MC_URL="$(printf '%s' "$ENTRY" | sed -nE 's/.*(https?:\/\/[^"'"'"'[:space:]]+).*/\1/p' | head -n1)" + fi + + # Wenn MC_TOKEN leer ist, aus ENTRY extrahieren: + if [ -z "${MC_TOKEN}" ]; then + # 1) Vorzugsweise das token in einfachen Anführungszeichen nach meshinstall.sh '' + MC_TOKEN="$(printf '%s' "$ENTRY" | sed -nE "s/.*meshinstall\.sh[[:space:]]+https?:\/\/[^[:space:]]+[[:space:]]+'([^']+)'.*/\1/p" | head -n1)" + # 2) Wenn nicht in Quotes: nimm das Wort NACH der URL im Aufruf + [ -n "$MC_TOKEN" ] || MC_TOKEN="$(printf '%s' "$ENTRY" | sed -nE 's/.*meshinstall\.sh[[:space:]]+https?:\/\/[^[:space:]]+[[:space:]]+([^[:space:]]+).*/\1/p' | head -n1)" + fi + + # Wenn immer noch leer: einzeln abfragen + [ -n "$MC_URL" ] || MC_URL="$(ask "MeshCentral-Server-URL (z.B. https://meshcentral.familie-berner.de): ")" + [ -n "$MC_TOKEN" ] || MC_TOKEN="$(ask "Enrollment-Token: ")" + + # Aufräumen der URL: Basis + /meshagents?script=1 für den Installer + BASE_URL="${MC_URL%/}" + INSTALL_URL="${BASE_URL}/meshagents?script=1" + + # Rückgabe via globale Variablen + M_PARSED_INSTALL_URL="$INSTALL_URL" + M_PARSED_MC_URL="$BASE_URL" + M_PARSED_TOKEN="$MC_TOKEN" +} + +### --- main --- need_root wait_net mk_layout -say "=== MeshCentral-Agent Installer (Batocera) ===" +parse_url_token "$@" -# 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 +download_install_script "$M_PARSED_INSTALL_URL" +run_install_script "$M_PARSED_MC_URL" "$M_PARSED_TOKEN" 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 "Fertig! Der MeshAgent startet künftig automatisch (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"