Files
Installer/Batocera/MeshCentral/install-meshagent.sh

188 lines
5.5 KiB
Bash
Raw Normal View History

2025-09-28 16:47:54 +02:00
#!/bin/sh
# install-meshagent.sh
2025-09-28 17:58:48 +02:00
# 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.
2025-09-28 16:47:54 +02:00
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; }
2025-09-28 17:58:48 +02:00
ask() { printf '%s' "$1" >&2; read -r REPLY || true; printf '%s' "$REPLY"; }
2025-09-28 16:47:54 +02:00
need_root() {
if [ "$(id -u)" != "0" ]; then
2025-09-28 17:58:48 +02:00
err "Bitte als root ausführen (auf Batocera üblich)."
2025-09-28 16:47:54 +02:00
exit 1
fi
}
wait_net() {
say "Warte auf Netzwerk …"
i=0
while ! ping -c1 -W1 "$SOCKET_TEST_HOST" >/dev/null 2>&1; do
2025-09-28 17:58:48 +02:00
i=$((i+1)); [ $i -ge 30 ] && break
2025-09-28 16:47:54 +02:00
sleep 2
done
}
mk_layout() {
mkdir -p "$MESH_BASE"
cd "$MESH_BASE"
}
download_install_script() {
2025-09-28 17:58:48 +02:00
MESH_URL="$1" # z. B. https://meshcentral.example.com/meshagents?script=1
2025-09-28 16:47:54 +02:00
say "Lade meshinstall.sh von: ${MESH_URL}"
2025-09-28 17:58:48 +02:00
if ! (wget -qO meshinstall.sh "$MESH_URL" 2>/dev/null || wget --no-proxy -qO meshinstall.sh "$MESH_URL" 2>/dev/null); then
2025-09-28 16:47:54 +02:00
if command -v curl >/dev/null 2>&1; then
2025-09-28 17:58:48 +02:00
curl -fsSL "$MESH_URL" -o meshinstall.sh
2025-09-28 16:47:54 +02:00
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"
2025-09-28 17:58:48 +02:00
say "Starte meshinstall.sh …"
2025-09-28 16:47:54 +02:00
if ! ./meshinstall.sh "$MC_URL" "$MC_TOKEN"; then
2025-09-28 17:58:48 +02:00
say "Zweiter Versuch …"
2025-09-28 16:47:54 +02:00
./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"
2025-09-28 17:58:48 +02:00
# Mini-Logrotate
2025-09-28 16:47:54 +02:00
if [ -f "$LOG" ] && [ "$(wc -c <"$LOG")" -gt 5242880 ]; then
mv "$LOG" "$LOG.1" 2>/dev/null || true
fi
2025-09-28 17:58:48 +02:00
# -noinstall: keine Systemintegration, alles lokal
2025-09-28 18:00:55 +02:00
./meshagent start >>"$LOG" 2>&1 &
2025-09-28 16:47:54 +02:00
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() {
2025-09-28 17:58:48 +02:00
say "Starte MeshAgent jetzt …"
2025-09-28 16:47:54 +02:00
/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
}
2025-09-28 17:58:48 +02:00
# ---- 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)
2025-09-28 16:47:54 +02:00
2025-09-28 17:58:48 +02:00
parse_url_token() {
ENTRY_ALL="$*"
2025-09-28 16:47:54 +02:00
2025-09-28 17:58:48 +02:00
# ENV hat Vorrang
MC_URL="${MC_URL:-}"
MC_TOKEN="${MC_TOKEN:-}"
2025-09-28 16:47:54 +02:00
2025-09-28 17:58:48 +02:00
# 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
2025-09-28 16:47:54 +02:00
2025-09-28 17:58:48 +02:00
# 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"
2025-09-28 16:47:54 +02:00
2025-09-28 17:58:48 +02:00
# Rückgabe via globale Variablen
M_PARSED_INSTALL_URL="$INSTALL_URL"
M_PARSED_MC_URL="$BASE_URL"
M_PARSED_TOKEN="$MC_TOKEN"
}
2025-09-28 16:47:54 +02:00
2025-09-28 17:58:48 +02:00
### --- 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"
2025-09-28 16:47:54 +02:00
write_start_script
enable_autostart
start_now
say ""
2025-09-28 17:58:48 +02:00
say "Fertig! Der MeshAgent startet künftig automatisch (custom.sh)."
2025-09-28 16:47:54 +02:00
say "Log-Datei: ${MESH_LOG}"