diff --git a/install.sh b/install.sh index 1524f24..5e15186 100755 --- a/install.sh +++ b/install.sh @@ -428,16 +428,39 @@ install_native() { # Kein natives trixie-Repo (siehe update.sh für Details) — bookworm-Paket # ist lauffähig. Seit ~v25 ein einziges "manticore"-Paket statt der # früheren manticoresearch_*-Aufteilung; GitHub-Releases liefern keine - # .deb-Assets mehr, daher kein Fallback mehr dorthin. Version pinnen statt - # dynamisch "latest" ermitteln (vorhersagbar, kein Parsing-Risiko) — zum - # Aktualisieren: https://repo.manticoresearch.com/repository/manticoresearch_bookworm/dists/bookworm/main/binary-amd64/Packages - _MANTICORE_VERSION="27.1.5-26061911-5a1cf9399" + # .deb-Assets mehr, daher kein Fallback mehr dorthin. Version wird dynamisch + # aus der Packages-Datei des Repos gelesen (letzter "Package: manticore"- + # Block); _MANTICORE_VERSION_FALLBACK greift nur, wenn die Packages-Datei + # nicht erreichbar/parsbar ist. + _MANTICORE_VERSION_FALLBACK="27.1.5-26061911-5a1cf9399" _mc_installed_version="$(dpkg-query -W -f='${Version}' manticore 2>/dev/null || true)" + _mc_arch="$(dpkg --print-architecture)" + + _mc_latest_from_repo() { + local base="https://repo.manticoresearch.com/repository/manticoresearch_bookworm" + local packages block version filename + packages="$(curl -fsSL --max-time 15 "${base}/dists/bookworm/main/binary-${_mc_arch}/Packages" 2>/dev/null)" || return 1 + [[ -n "$packages" ]] || return 1 + block="$(printf '%s\n' "$packages" | awk 'BEGIN{RS="\n\n"} {n=split($0,l,"\n"); if (l[1]=="Package: manticore") b=$0} END{print b}')" + [[ -n "$block" ]] || return 1 + version="$(printf '%s\n' "$block" | awk -F': ' '/^Version:/{print $2; exit}')" + filename="$(printf '%s\n' "$block" | awk -F': ' '/^Filename:/{print $2; exit}')" + [[ -n "$version" && -n "$filename" ]] || return 1 + printf '%s|%s\n' "$version" "$filename" + } + + _mc_target_version="$_MANTICORE_VERSION_FALLBACK" + _mc_target_url="https://repo.manticoresearch.com/repository/manticoresearch_bookworm/dists/bookworm/main/binary-${_mc_arch}/manticore_${_MANTICORE_VERSION_FALLBACK}_${_mc_arch}.deb" + if _mc_latest="$(_mc_latest_from_repo)"; then + _mc_target_version="${_mc_latest%%|*}" + _mc_target_url="https://repo.manticoresearch.com/repository/manticoresearch_bookworm/${_mc_latest#*|}" + info "Manticore Search: aktuelle Repo-Version ${_mc_target_version} ermittelt" + else + warn "Manticore-Repo-Metadaten nicht abrufbar — falle auf bekannten Stand ${_MANTICORE_VERSION_FALLBACK} zurück" + fi + _mc_fetch_and_install() { - local _mc_arch="$(dpkg --print-architecture)" - wget -q -O /tmp/manticore.deb \ - "https://repo.manticoresearch.com/repository/manticoresearch_bookworm/dists/bookworm/main/binary-${_mc_arch}/manticore_${_MANTICORE_VERSION}_${_mc_arch}.deb" \ - || true + wget -q -O /tmp/manticore.deb "$_mc_target_url" || true if [[ ! -f /tmp/manticore.deb ]]; then return 1 fi @@ -446,20 +469,20 @@ install_native() { return 0 } if [[ -z "$_mc_installed_version" ]]; then - info "Installiere Manticore Search ${_MANTICORE_VERSION}..." + info "Installiere Manticore Search ${_mc_target_version}..." _mc_fetch_and_install && log "Manticore Search installiert" \ || die "Manticore Search konnte nicht installiert werden — siehe: https://manticoresearch.com/install/" - elif dpkg --compare-versions "$_mc_installed_version" lt "$_MANTICORE_VERSION"; then + elif dpkg --compare-versions "$_mc_installed_version" lt "$_mc_target_version"; then # PROJ-67: Upgrade statt Skip, damit auch Bestandsinstallationen beim # nächsten install.sh-/update.sh-Lauf mitgezogen werden. "lt"-Vergleich # schützt gegen versehentliches Downgrade. - info "Manticore Search ${_mc_installed_version} gefunden, aktualisiere auf ${_MANTICORE_VERSION}..." + info "Manticore Search ${_mc_installed_version} gefunden, aktualisiere auf ${_mc_target_version}..." systemctl stop manticore 2>/dev/null || true _mc_fetch_and_install \ - && log "Manticore Search aktualisiert: ${_mc_installed_version} → ${_MANTICORE_VERSION}" \ + && log "Manticore Search aktualisiert: ${_mc_installed_version} → ${_mc_target_version}" \ || warn "Upgrade fehlgeschlagen — vorherige Version bleibt installiert" else - log "Manticore Search ${_mc_installed_version} bereits aktuell (>= ${_MANTICORE_VERSION})" + log "Manticore Search ${_mc_installed_version} bereits aktuell (>= ${_mc_target_version})" fi systemctl enable --now manticore 2>/dev/null || warn "Manticore-Dienst konnte nicht gestartet werden" systemctl is-active --quiet manticore && log "Manticore Search läuft" diff --git a/update.sh b/update.sh index 7716bbd..f1a0e75 100755 --- a/update.sh +++ b/update.sh @@ -87,22 +87,52 @@ command -v npm >/dev/null || die "npm nicht gefunden — apt-get install npm" # liefern seit einiger Zeit keine .deb-Assets mehr (leeres assets[]), daher # kein Fallback mehr dorthin — repo.manticoresearch.com ist der einzige Weg. # -# Version manuell pinnen (wie hier) statt "latest" dynamisch aus der -# Packages-Datei zu parsen: vorhersagbarer, kein Risiko durch Parsing-Format- -# Änderungen im Repo. Zum Aktualisieren: aktuelle Version+Filename unter -# https://repo.manticoresearch.com/repository/manticoresearch_bookworm/dists/bookworm/main/binary-amd64/Packages -# nachschlagen (letzter "Package: manticore"-Block). -_MANTICORE_VERSION="27.1.5-26061911-5a1cf9399" +# Version wird dynamisch aus der Packages-Datei des Repos ermittelt (letzter +# "Package: manticore"-Block, dort steht Version+Filename explizit drin — +# kein Rätselraten über Namensschema). _MANTICORE_VERSION_FALLBACK ist nur +# ein Sicherheitsnetz, falls die Packages-Datei mal nicht erreichbar/nicht +# parsbar ist (Netzwerkfehler, Repo down, Format ändert sich erneut) — dann +# lieber ein bekannter, getesteter Stand als ein komplett fehlgeschlagenes +# Deploy. Bei jedem Update-Lauf ohnehin neu geprüft, kein manuelles Nachpflegen +# nötig, solange das Packages-Format stabil bleibt. +_MANTICORE_VERSION_FALLBACK="27.1.5-26061911-5a1cf9399" _mc_installed_version="$(dpkg-query -W -f='${Version}' manticore 2>/dev/null || true)" +_mc_arch="amd64" +[[ "$(uname -m)" == "aarch64" ]] && _mc_arch="arm64" + +# Liefert bei Erfolg "VERSION|FILENAME" (Filename ist der repo-relative Pfad +# aus der Packages-Datei, z.B. "dists/bookworm/main/binary-amd64/manticore_ +# 27.1.5-...deb") auf stdout, sonst nichts (Exit 1). +_mc_latest_from_repo() { + local base="https://repo.manticoresearch.com/repository/manticoresearch_bookworm" + local packages block version filename + packages="$(curl -fsSL --max-time 15 "${base}/dists/bookworm/main/binary-${_mc_arch}/Packages" 2>/dev/null)" || return 1 + [[ -n "$packages" ]] || return 1 + # Packages-Einträge sind durch Leerzeilen getrennt; mehrere historische + # "Package: manticore"-Blöcke möglich — der letzte ist der aktuellste. + block="$(printf '%s\n' "$packages" | awk 'BEGIN{RS="\n\n"} {n=split($0,l,"\n"); if (l[1]=="Package: manticore") b=$0} END{print b}')" + [[ -n "$block" ]] || return 1 + version="$(printf '%s\n' "$block" | awk -F': ' '/^Version:/{print $2; exit}')" + filename="$(printf '%s\n' "$block" | awk -F': ' '/^Filename:/{print $2; exit}')" + [[ -n "$version" && -n "$filename" ]] || return 1 + printf '%s|%s\n' "$version" "$filename" +} + +_mc_target_version="$_MANTICORE_VERSION_FALLBACK" +_mc_target_url="https://repo.manticoresearch.com/repository/manticoresearch_bookworm/dists/bookworm/main/binary-${_mc_arch}/manticore_${_MANTICORE_VERSION_FALLBACK}_${_mc_arch}.deb" +if _mc_latest="$(_mc_latest_from_repo)"; then + _mc_target_version="${_mc_latest%%|*}" + _mc_target_url="https://repo.manticoresearch.com/repository/manticoresearch_bookworm/${_mc_latest#*|}" + info "Manticore Search: aktuelle Repo-Version ${_mc_target_version} ermittelt" +else + warn "Manticore-Repo-Metadaten nicht abrufbar — falle auf bekannten Stand ${_MANTICORE_VERSION_FALLBACK} zurück" +fi + _mc_fetch_and_install() { - # $1 = human-readable action word for log ("installiere"/"aktualisiere") - local _mc_arch="amd64" - [[ "$(uname -m)" == "aarch64" ]] && _mc_arch="arm64" - wget -q -O /tmp/manticore.deb \ - "https://repo.manticoresearch.com/repository/manticoresearch_bookworm/dists/bookworm/main/binary-${_mc_arch}/manticore_${_MANTICORE_VERSION}_${_mc_arch}.deb" \ - || true + # $1 = human-readable action word for log ("installieren"/"aktualisieren") + wget -q -O /tmp/manticore.deb "$_mc_target_url" || true if [[ ! -f /tmp/manticore.deb ]]; then warn "Manticore Search konnte nicht heruntergeladen werden — bitte manuell $1" warn "Siehe: https://manticoresearch.com/install/" @@ -114,24 +144,24 @@ _mc_fetch_and_install() { } if [[ -z "$_mc_installed_version" ]]; then - info "Manticore Search nicht gefunden — installiere Version ${_MANTICORE_VERSION}..." + info "Manticore Search nicht gefunden — installiere Version ${_mc_target_version}..." _mc_fetch_and_install "installieren" && log "Manticore Search installiert" -elif dpkg --compare-versions "$_mc_installed_version" lt "$_MANTICORE_VERSION"; then - # PROJ-67: bestehende Installation ist älter als der gepinnte Stand — Upgrade - # statt Skip, damit auch Bestandsinstallationen (nicht nur Neuinstallationen) - # beim nächsten Deploy automatisch mitgezogen werden. Downgrade-Schutz durch - # "lt"-Vergleich: eine bereits neuere installierte Version wird nie - # zurückgestuft (z.B. falls _MANTICORE_VERSION versehentlich rückwärts - # editiert wurde). - info "Manticore Search ${_mc_installed_version} gefunden, aktualisiere auf ${_MANTICORE_VERSION}..." +elif dpkg --compare-versions "$_mc_installed_version" lt "$_mc_target_version"; then + # PROJ-67: bestehende Installation ist älter als der ermittelte Repo-Stand — + # Upgrade statt Skip, damit auch Bestandsinstallationen (nicht nur + # Neuinstallationen) beim nächsten Deploy automatisch mitgezogen werden. + # Downgrade-Schutz durch "lt"-Vergleich: eine bereits neuere installierte + # Version wird nie zurückgestuft (z.B. falls die Repo-Abfrage mal einen + # älteren Stand als den Fallback liefern sollte). + info "Manticore Search ${_mc_installed_version} gefunden, aktualisiere auf ${_mc_target_version}..." systemctl stop manticore 2>/dev/null || true if _mc_fetch_and_install "aktualisieren"; then - log "Manticore Search aktualisiert: ${_mc_installed_version} → ${_MANTICORE_VERSION}" + log "Manticore Search aktualisiert: ${_mc_installed_version} → ${_mc_target_version}" else warn "Upgrade fehlgeschlagen — vorherige Version bleibt installiert, Dienst wird trotzdem neu gestartet" fi else - log "Manticore Search ${_mc_installed_version} bereits aktuell (>= ${_MANTICORE_VERSION})" + log "Manticore Search ${_mc_installed_version} bereits aktuell (>= ${_mc_target_version})" fi if systemctl list-unit-files manticore.service >/dev/null 2>&1; then