Files
Installer/Batocera/MeshCentral/install-meshagent.sh
2025-09-28 18:00:55 +02:00

188 lines
5.5 KiB
Bash
Raw Permalink 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
# 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
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 || true; printf '%s' "$REPLY"; }
need_root() {
if [ "$(id -u)" != "0" ]; then
err "Bitte als root ausführen (auf Batocera üblich)."
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() {
MESH_URL="$1" # z. B. https://meshcentral.example.com/meshagents?script=1
say "Lade meshinstall.sh von: ${MESH_URL}"
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
curl -fsSL "$MESH_URL" -o meshinstall.sh
else
err "Weder wget noch curl verfügbar."
exit 2
fi
fi
chmod 755 meshinstall.sh
}
run_install_script() {
MC_URL="$1"
MC_TOKEN="$2"
say "Starte meshinstall.sh …"
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
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
cd "$BASE"
# Mini-Logrotate
if [ -f "$LOG" ] && [ "$(wc -c <"$LOG")" -gt 5242880 ]; then
mv "$LOG" "$LOG.1" 2>/dev/null || true
fi
# -noinstall: keine Systemintegration, alles lokal
./meshagent start >>"$LOG" 2>&1 &
EOF
chmod +x "${MESH_BASE}/start.sh"
}
enable_autostart() {
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
}
# ---- 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
parse_url_token "$@"
download_install_script "$M_PARSED_INSTALL_URL"
run_install_script "$M_PARSED_MC_URL" "$M_PARSED_TOKEN"
write_start_script
enable_autostart
start_now
say ""
say "Fertig! Der MeshAgent startet künftig automatisch (custom.sh)."
say "Log-Datei: ${MESH_LOG}"