install-meshagent.sh hinzugefügt

This commit is contained in:
2025-09-28 16:47:54 +02:00
parent afdbe74abc
commit b2a8269b53

194
install-meshagent.sh Normal file
View File

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