diff --git a/update.sh b/update.sh index 6fb9db4..754134b 100644 --- a/update.sh +++ b/update.sh @@ -24,11 +24,8 @@ REPO_NAME="${TESM_REPO_NAME:-tesm-license}" RELEASE_TAG="${TESM_RELEASE_TAG:-latest}" GITEA_USER="${TESM_GITEA_USER:-}" GITEA_TOKEN="${TESM_GITEA_TOKEN:-}" -PACKAGE_NAME="tesm-license-${RELEASE_TAG}.tar.gz" -DOWNLOAD_URL="${GITEA_BASE}/${REPO_OWNER}/${REPO_NAME}/releases/download/${RELEASE_TAG}/${PACKAGE_NAME}" WORK_DIR="/tmp/tesm-license-update-$(date +%s)" -PACKAGE_FILE="$WORK_DIR/${PACKAGE_NAME}" RED='\033[0;31m' GREEN='\033[0;32m' @@ -40,6 +37,39 @@ if [ "$(id -u)" -ne 0 ]; then exit 1 fi +CURL_AUTH=() +if [ -n "$GITEA_USER" ] && [ -n "$GITEA_TOKEN" ]; then + CURL_AUTH=(-u "${GITEA_USER}:${GITEA_TOKEN}") +fi + +# ---- "latest" IMMER über die Gitea-API auflösen, nie als Literal in die +# Download-URL einsetzen ---- +# Live reproduziert (im Schwester-Repo tesm, identisches Verhalten hier): +# /releases/download/latest/tesm-license-latest.tar.gz liefert HTTP 200 -- +# aber keinen echten Release-Asset, sondern (weil kein Asset exakt so +# heißt) Giteas automatisch generiertes Quellcode-Archiv des AKTUELLEN +# Default-Branch-Stands, kommentarlos und ohne Fehlermeldung. Ohne diesen +# Auflösungsschritt würde ein einfaches "sudo ./update.sh" (ohne +# explizites TESM_RELEASE_TAG) also lautlos einen unversionierten, +# potenziell halbfertigen Zwischenstand installieren statt des +# tatsächlich neuesten Releases. +if [ "$RELEASE_TAG" == "latest" ]; then + echo -e "${RED}→${NC} Ermittle aktuellsten Release-Tag von ${GITEA_BASE}/${REPO_OWNER}/${REPO_NAME}..." + RESOLVED_TAG="$(curl -fsSL "${CURL_AUTH[@]}" "${GITEA_BASE}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}/releases/latest" \ + | python3 -c "import json,sys; print(json.load(sys.stdin).get('tag_name',''))" 2>/dev/null)" + if [ -z "$RESOLVED_TAG" ]; then + echo "✖ Konnte den aktuellsten Release-Tag nicht über die Gitea-API ermitteln -- Abbruch." >&2 + echo " (Alternative: TESM_RELEASE_TAG=vX.Y.Z explizit setzen.)" >&2 + exit 1 + fi + RELEASE_TAG="$RESOLVED_TAG" + echo -e "${GREEN}✔${NC} Aktuellster Release ist ${RELEASE_TAG}." +fi + +PACKAGE_NAME="tesm-license-${RELEASE_TAG}.tar.gz" +DOWNLOAD_URL="${GITEA_BASE}/${REPO_OWNER}/${REPO_NAME}/releases/download/${RELEASE_TAG}/${PACKAGE_NAME}" +PACKAGE_FILE="$WORK_DIR/${PACKAGE_NAME}" + echo -e "${YELLOW}============================================================================${NC}" echo -e "${YELLOW} TESM-Lizenzserver Update/Reinstall — Release \"${RELEASE_TAG}\"${NC}" echo -e "${YELLOW}============================================================================${NC}" @@ -58,16 +88,22 @@ fi echo -e "${RED}→${NC} Lade Paket von ${DOWNLOAD_URL}..." mkdir -p "$WORK_DIR" -CURL_AUTH=() -if [ -n "$GITEA_USER" ] && [ -n "$GITEA_TOKEN" ]; then - CURL_AUTH=(-u "${GITEA_USER}:${GITEA_TOKEN}") -fi curl -fsSL "${CURL_AUTH[@]}" -o "$PACKAGE_FILE" "$DOWNLOAD_URL" echo -e "${GREEN}✔${NC} Paket heruntergeladen ($(du -h "$PACKAGE_FILE" | cut -f1))." echo -e "${RED}→${NC} Entpacke Paket..." mkdir -p "$WORK_DIR/pkg" tar xzf "$PACKAGE_FILE" -C "$WORK_DIR/pkg" --strip-components=1 + +# Absicherung gegen genau das oben beschriebene Fallback-Verhalten: statt +# eines späten, kryptischen "No such file or directory" beim Aufruf von +# install.sh hier klar benennen, WENN das heruntergeladene Paket nicht das +# erwartete ist (z.B. weil sich Giteas Verhalten wieder ändert). +if [ ! -f "$WORK_DIR/pkg/install.sh" ]; then + echo "✖ Entpacktes Paket enthält kein install.sh -- vermutlich wurde nicht das" >&2 + echo " erwartete Release-Asset heruntergeladen (siehe ${DOWNLOAD_URL})." >&2 + exit 1 +fi echo -e "${GREEN}✔${NC} Paket entpackt." echo -e "${RED}→${NC} Starte install.sh aus dem Paket..."