install-meshagent.sh hinzugefügt
This commit is contained in:
194
install-meshagent.sh
Normal file
194
install-meshagent.sh
Normal 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"
|
||||
Reference in New Issue
Block a user