188 lines
5.5 KiB
Bash
188 lines
5.5 KiB
Bash
#!/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}"
|