This commit is contained in:
2025-09-28 17:58:48 +02:00
parent edc6fd46b7
commit 25852788c4
2 changed files with 82 additions and 81 deletions

View File

@@ -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

View File

@@ -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 <URL> '<TOKEN>' …
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 <URL> '<TOKEN>'
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 <ENTER> <TOKEN>
# - kompletter Befehl … ./meshinstall.sh https://meshcentral.example.com '<TOKEN>'
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"