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