- .NET 10 Migration: Alle .NET-Projekte auf net10.0 umgestellt (#459) - Client-SDK: ResolveAgentPath bereinigt und DLL-Pruefung ergaenzt (#458) - Packager: Commit-Ermittlung aus publishDir / Assembly InformationalVersion (#456) - BuildInfo.targets: ExitCode-Abfang und Regex-Validierung gegen Git-Fehlertexte (#363) - UpdateService: Re-Publish erhaelt bestehende Manifeste und Werte (#457) - Bugtracker API: on_roadmap-Filter in manage?action=list durchgereicht (#349) - Watchdog API: project_slug-Filter in GET /status ergaenzt (#420) - UpdateService API: no_release_for_platform mit verfuegbaren Plattformen (#421) - Bugtracker Core: Fehler-Normalisierung gegen zersplitterte error_hashes (#419) - UpdateAgent: Kopfloser Installationsmodus via --answers (#89) - Installer & Agent: Automatische Selbstaktualisierung beim Start - Tooling: AGENTS.md, CLAUDE.md und Standalone-CLI scripts/dc.py hinzugefuegt
175 lines
5.2 KiB
Bash
175 lines
5.2 KiB
Bash
#!/bin/sh
|
|
#
|
|
# Holt den Deploymentcenter Update-Agent und legt ihn ausfuehrbar ab.
|
|
#
|
|
# wget -qO- https://dc.mhdf.de/installer/install.sh | sh
|
|
#
|
|
# Das Skript fuehrt die Installation NICHT selbst aus. Es laedt das Binary,
|
|
# prueft die Pruefsumme und sagt, wie es weitergeht - was danach passiert,
|
|
# entscheidet der Mensch davor. Ein Skript aus dem Netz, das ungefragt eine
|
|
# Anwendung einrichtet und dabei nach Zugangsdaten fragt, waere genau das
|
|
# Muster, vor dem man Nutzer sonst warnt.
|
|
|
|
set -eu
|
|
|
|
BASE_URL="${DC_BASE_URL:-https://dc.mhdf.de}"
|
|
TARGET_DIR="${DC_INSTALL_DIR:-}"
|
|
CHECK_ONLY=0
|
|
FORCE=0
|
|
|
|
for arg in "$@"; do
|
|
case "$arg" in
|
|
--check|--pruefen) CHECK_ONLY=1 ;;
|
|
--force) FORCE=1 ;;
|
|
esac
|
|
done
|
|
|
|
# --------------------------------------------------- Selbstaktualisierung Skript
|
|
if [ -f "$0" ] && [ "$0" != "sh" ] && [ "$0" != "bash" ]; then
|
|
if command -v curl >/dev/null 2>&1; then
|
|
remote_script="$(curl -fsSL "$BASE_URL/installer/install.sh" 2>/dev/null || true)"
|
|
elif command -v wget >/dev/null 2>&1; then
|
|
remote_script="$(wget -qO- "$BASE_URL/installer/install.sh" 2>/dev/null || true)"
|
|
else
|
|
remote_script=""
|
|
fi
|
|
|
|
if [ -n "$remote_script" ]; then
|
|
current_script="$(cat "$0")"
|
|
if [ "$remote_script" != "$current_script" ]; then
|
|
printf '%s\n' "$remote_script" > "$0"
|
|
chmod +x "$0" 2>/dev/null || true
|
|
echo "Installer-Skript ($0) wurde selbststaendig aktualisiert."
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# ---------------------------------------------------------------- Plattform
|
|
os="$(uname -s)"
|
|
arch="$(uname -m)"
|
|
|
|
case "$os" in
|
|
Linux) ;;
|
|
*)
|
|
echo "Nicht unterstuetzt: $os" >&2
|
|
echo "Fuer Windows: https://dc.mhdf.de/installer/install.ps1" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
case "$arch" in
|
|
x86_64|amd64) rid="linux-x64" ;;
|
|
aarch64|arm64) rid="linux-arm64" ;;
|
|
*)
|
|
echo "Nicht unterstuetzte Architektur: $arch" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
binary="update-agent-$rid"
|
|
|
|
# ------------------------------------------------------------- Zielverzeichnis
|
|
if [ -z "$TARGET_DIR" ]; then
|
|
if [ -w /usr/local/bin ] 2>/dev/null; then
|
|
TARGET_DIR="/usr/local/bin"
|
|
else
|
|
TARGET_DIR="$PWD"
|
|
fi
|
|
fi
|
|
|
|
target="$TARGET_DIR/update-agent"
|
|
|
|
# --------------------------------------------------------------- Werkzeuge
|
|
if command -v curl >/dev/null 2>&1; then
|
|
fetch() { curl -fsSL "$1" -o "$2"; }
|
|
elif command -v wget >/dev/null 2>&1; then
|
|
fetch() { wget -q "$1" -O "$2"; }
|
|
else
|
|
echo "Weder curl noch wget vorhanden." >&2
|
|
exit 1
|
|
fi
|
|
|
|
tmp="$(mktemp -d)"
|
|
# shellcheck disable=SC2064
|
|
trap 'rm -rf "$tmp"' EXIT INT TERM
|
|
|
|
# ------------------------------------------------------------- Pruefsumme abrufen
|
|
fetch "$BASE_URL/installer/$binary.sha256" "$tmp/agent.sha256"
|
|
expected="$(tr -d ' \t\r\n' < "$tmp/agent.sha256")"
|
|
|
|
# ------------------------------------------------------------- Bestandspruefung
|
|
if [ -f "$target" ] && [ "$FORCE" -eq 0 ]; then
|
|
if command -v sha256sum >/dev/null 2>&1; then
|
|
current_hash="$(sha256sum "$target" | cut -d' ' -f1)"
|
|
elif command -v shasum >/dev/null 2>&1; then
|
|
current_hash="$(shasum -a 256 "$target" | cut -d' ' -f1)"
|
|
else
|
|
current_hash=""
|
|
fi
|
|
|
|
if [ -n "$current_hash" ] && [ "$current_hash" = "$expected" ]; then
|
|
echo "Update-Agent ist bereits auf dem neuesten Stand ($target)."
|
|
if [ "$CHECK_ONLY" -eq 1 ]; then
|
|
exit 0
|
|
fi
|
|
echo ""
|
|
echo "Weiter mit:"
|
|
echo " $target --action install"
|
|
echo ""
|
|
echo "Nur diese Maschine ueberwachen, ohne etwas zu installieren:"
|
|
echo " $target --action monitor"
|
|
exit 0
|
|
else
|
|
echo "Aktualisierung fuer Update-Agent verfuegbar. Lade neue Fassung..."
|
|
fi
|
|
fi
|
|
|
|
if [ "$CHECK_ONLY" -eq 1 ]; then
|
|
echo "Neue Version von $binary ist verfuegbar (SHA256: $expected)."
|
|
exit 0
|
|
fi
|
|
|
|
echo "Lade $binary von $BASE_URL ..."
|
|
fetch "$BASE_URL/installer/$binary" "$tmp/agent"
|
|
|
|
# ------------------------------------------------------------- Pruefsumme pruefen
|
|
if command -v sha256sum >/dev/null 2>&1; then
|
|
actual="$(sha256sum "$tmp/agent" | cut -d' ' -f1)"
|
|
elif command -v shasum >/dev/null 2>&1; then
|
|
actual="$(shasum -a 256 "$tmp/agent" | cut -d' ' -f1)"
|
|
else
|
|
actual=""
|
|
fi
|
|
|
|
if [ -z "$actual" ]; then
|
|
echo "WARNUNG: Keine SHA256-Pruefung moeglich (weder sha256sum noch shasum)." >&2
|
|
elif [ "$actual" != "$expected" ]; then
|
|
echo "ABBRUCH: Pruefsumme stimmt nicht ueberein." >&2
|
|
echo " erwartet: $expected" >&2
|
|
echo " erhalten: $actual" >&2
|
|
exit 1
|
|
else
|
|
echo "Pruefsumme in Ordnung."
|
|
fi
|
|
|
|
# ------------------------------------------------------------------ Ablegen
|
|
chmod +x "$tmp/agent"
|
|
|
|
if ! mv "$tmp/agent" "$target" 2>/dev/null; then
|
|
echo "Kein Schreibrecht in $TARGET_DIR - versuche es mit sudo oder setze DC_INSTALL_DIR." >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo ""
|
|
echo "Abgelegt: $target"
|
|
echo ""
|
|
echo "Weiter mit:"
|
|
echo " $target --action install"
|
|
echo ""
|
|
echo "Nur diese Maschine ueberwachen, ohne etwas zu installieren:"
|
|
echo " $target --action monitor"
|
|
echo ""
|
|
echo "Dafuer werden Benutzername und Passwort eines Kontos der Rolle 'installer'"
|
|
echo "gebraucht. Ein Administratorkonto tut es auch, gehoert aber nicht auf ein"
|
|
echo "Zielsystem."
|