Files
Installer/install-meshagent.sh

195 lines
5.9 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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"