#!/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 '' … 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 '' 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}"