diff --git a/texlive_update.sh b/texlive_update.sh index f0d9235..9e5d752 100755 --- a/texlive_update.sh +++ b/texlive_update.sh @@ -12,20 +12,72 @@ TEXHASH=$(which texhash) echo "=== Starte optimierte LaTeX-Konfiguration ===" -# 1. Optionale Updates (NUR aktivieren wenn zwingend nötig, sonst auskommentieren) +# ============================================================================== +# AUTOMATISCHE SERVER-FALLBACK LOGIK +# ============================================================================== +# Liste von zuverlässigen Spiegelservern (Der zweite ist der automatische CTAN-Verteiler) +DOMAINS=( + "at.ctan.niranjan.co" + "mirror.ctan.org" + "tu-chemnitz.de" + "netcologne.de" + "mirror.netcologne.de/tex-archive" +) + +# Das ist der exakte Pfad, den TeX Live zwingend benötigt +PATH_SUFFIX="/systems/texlive/tlnet" + +UPDATE_SUCCESS=false +ACTIVE_SERVER="" + echo "Aktualisiere tlmgr und alle installierten Pakete..." -$TLMGR update --self --all + +for DOMAIN in "${DOMAINS[@]}"; do + # Hier bauen wir das Protokoll und den Pflichtpfad fehlerfrei zusammen + SERVER="https://${DOMAIN}${PATH_SUFFIX}" + + # Sonderfall für den Haupt-CTAN-Server, da dieser manchmal kein https erzwingt + if [[ "$DOMAIN" == "mirror.ctan.org" ]]; then + SERVER="http://${DOMAIN}${PATH_SUFFIX}" + fi + + echo "Versuche Verbindung zu Spiegelserver: $SERVER" + + # Sende eine schnelle Anfrage an die MD5-Datenbank des Servers. + # --connect-timeout 3: Bricht nach 3 Sekunden ab, falls der Server nicht reagiert. + # --max-time 5: Der gesamte Check darf maximal 5 Sekunden dauern. + if curl --output /dev/null --silent --head --fail --connect-timeout 3 --max-time 5 "${SERVER}/tlpkg/texlive.tlpdb.md5"; then + echo "--> Server online. Starte TeX Live Update über $SERVER..." + + # Da wir wissen, dass der Server da ist, führen wir das eigentliche Update aus + if $TLMGR update --repository "$SERVER" --self --all; then + echo "--> Update erfolgreich durchgeführt!" + UPDATE_SUCCESS=true + ACTIVE_SERVER="$SERVER" + break + fi + else + echo "⚠️ Warnung: Server reagiert nicht schnell genug (Timeout) oder ist offline. Versuche nächsten..." + fi +done + +if [ "$UPDATE_SUCCESS" = false ]; then + echo "❌ ERROR: Alle TeX Live Spiegelserver sind offline oder es gibt keine Internetverbindung." >&2 + exit 1 +fi +# ============================================================================== # 2. Nur deinstallieren, falls überhaupt vorhanden -if $TLMGR info texliveonfly | grep -q "installed: Yes"; then +# Nutzen den ermittelten ACTIVE_SERVER, um erneute Verbindungsfehler zu vermeiden +if $TLMGR info --repository "$ACTIVE_SERVER" texliveonfly | grep -q "installed: Yes"; then echo "Deinstalliere veraltetes texliveonfly..." - $TLMGR remove texliveonfly + $TLMGR remove --repository "$ACTIVE_SERVER" texliveonfly fi # 3. ALLE Pakete gebündelt in EINEM Rutsch installieren (only scheme-minimal installed) # Hinweis: scheme-basic beinhaltet bereits scheme-infraonly sowie scheme-minimal echo "Installiere alle benötigten LaTeX-Pakete parallel/gebündelt..." -$TLMGR install \ +$TLMGR install --repository "$ACTIVE_SERVER" \ background \ beamer \ biblatex \ diff --git a/texlive_update_.sh b/texlive_update_.sh new file mode 100644 index 0000000..65b4f2c --- /dev/null +++ b/texlive_update_.sh @@ -0,0 +1,216 @@ +#!/bin/bash +set -e # Bricht bei Fehlern sofort ab +# spell:ignore tlmgr texhash texliveonfly beamer biblatex ieee booktabs bigdelim ccicons circuitikz +# spell:ignore Ghostscript biber cleveref concmath csquotes currfile enumitem everypage extdash +# spell:ignore filehook fmtcount fontawesome fontaxes fontmfizz fontspec fontsrecommended ghostscript +# spell:ignore gitea imakeidx infraonly isbn koma latexmk ltablex luatexbase marginnote mathtools +# spell:ignore microtype ncctools newpx newtx newunicodechar nextpage parskip pdfcol pdflscape pdfpages +# spell:ignore pgfplots pict setspace sidecap siunitx stix subfigure tcolorbox tikzfill titlesec +# spell:ignore trimspaces unicode upquote vmargin wrapfig xcharter xltabular xpatch xstring +TLMGR=$(which tlmgr) +TEXHASH=$(which texhash) + +echo "=== Starte optimierte LaTeX-Konfiguration ===" + +# ============================================================================== +# AUTOMATISCHE SERVER-FALLBACK LOGIK +# ============================================================================== +# Liste von zuverlässigen Spiegelservern (Der erste ist der automatische CTAN-Verteiler) +SERVERS=( + "http://ctan.org" + "https://tu-chemnitz.de" + "https://netcologne.de" +) + +UPDATE_SUCCESS=false +ACTIVE_SERVER="" + +echo "Aktualisiere tlmgr und alle installierten Pakete..." + +for SERVER in "${SERVERS[@]}"; do + echo "Versuche Verbindung zu Spiegelserver: $SERVER" + + # Durch die Verwendung in der if-Bedingung wird 'set -e' für diesen Befehl ausgesetzt. + # So fangen wir Offline-Server ab, ohne dass das Skript abstürzt. + if $TLMGR update --repository "$SERVER" --self --all; then + echo "--> Update erfolgreich über $SERVER durchgeführt!" + UPDATE_SUCCESS=true + ACTIVE_SERVER="$SERVER" # Speichert den funktionierenden Server für spätere Befehle + break + else + echo "⚠️ Warnung: Server $SERVER war nicht erreichbar. Versuche nächsten Spiegelserver..." + fi +done + +# Wenn kein einziger Server funktionierte, bricht das Skript kontrolliert ab +if [ "$UPDATE_SUCCESS" = false ]; then + echo "❌ ERROR: Alle TeX Live Spiegelserver sind offline oder es gibt keine Internetverbindung." >&2 + exit 1 +fi +# ============================================================================== + + +# 2. Nur deinstallieren, falls überhaupt vorhanden +# Nutzen den ermittelten ACTIVE_SERVER, um erneute Verbindungsfehler zu vermeiden +if $TLMGR info --repository "$ACTIVE_SERVER" texliveonfly | grep -q "installed: Yes"; then + echo "Deinstalliere veraltetes texliveonfly..." + $TLMGR remove --repository "$ACTIVE_SERVER" texliveonfly +fi + +# 3. ALLE Pakete gebündelt in EINEM Rutsch installieren (only scheme-minimal installed) +# Hinweis: scheme-basic beinhaltet bereits scheme-infraonly sowie scheme-minimal +echo "Installiere alle benötigten LaTeX-Pakete parallel/gebündelt..." +$TLMGR install --repository "$ACTIVE_SERVER" \ + background \ + beamer \ + biblatex \ + biblatex-ieee \ + booktabs \ + cancel \ + caption \ + ccicons \ + circuitikz \ + cleveref \ + cm-unicode \ + collection-fontsrecommended \ + concmath-otf \ + contour \ + csquotes \ + currfile \ + datetime2 \ + datetime2-english \ + datetime2-german \ + ean \ + ean13isbn \ + enumitem \ + epigraph \ + everypage \ + filehook \ + fmtcount \ + fontawesome5 \ + fontaxes \ + fontmfizz \ + fontspec \ + imakeidx \ + koma-script \ + latexmk \ + lastpage \ + lineno \ + listings \ + ltablex \ + luatexbase \ + marginnote \ + mathtools \ + microtype \ + minted \ + multirow \ + ncctools \ + newpx \ + newtx \ + newunicodechar \ + nextpage \ + ocr-b \ + parskip \ + pdfcol \ + pdflscape \ + pdfpages \ + pgf \ + pgfplots \ + physics \ + pict2e \ + ragged2e \ + scheme-basic \ + setspace \ + sidecap \ + siunitx \ + steinmetz \ + stix2-otf \ + subfigure \ + tcolorbox \ + tikzfill \ + titlesec \ + translations \ + trimspaces \ + unicode-math \ + upquote \ + vmargin \ + wrapfig \ + xcharter \ + xltabular \ + xpatch \ + xstring + +echo "Deinstalliere unerwünschte LaTeX-Pakete..." +# 'ae' und 't1enc' wurden entfernt, da sie geschützte Systempakete sind. +# Liste der Pakete, die deinstalliert werden sollen (einfach mit Leerzeichen trennen) +PACKETS=("truncate") + +for packet in "${PACKETS[@]}"; do + if tlmgr info "$packet" --only-installed >/dev/null 2>&1; then + echo "Lösche Paket: $packet..." + tlmgr remove "$packet" || true + else + echo "Paket '$packet' ist nicht installiert oder wurde bereits gelöscht." + fi +done + +# extdash (in ncctools) \ + +# 4. Datenbank-Refresh (tlmgr install macht das oft automatisch, sicherheitshalber am Ende einmal) +echo "Aktualisiere LaTeX-Dateidatenbank..." +$TEXHASH + +# 5. System-Abhängigkeiten prüfen und installieren (Biber & Ghostscript) +echo "Überprüfe Linux-Systemkomponenten..." + +# Liste der zu installierenden Apt-Pakete +SYSTEM_PACKAGES="" +INSTALLED_PACKAGES="" + +if ! command -v biber >/dev/null 2>&1; then + echo " -> biber fehlt und wird vorgemerkt." + SYSTEM_PACKAGES="$SYSTEM_PACKAGES biber" +else + echo " -> biber ist bereits installiert ($(biber --version | head -n 1))." + INSTALLED_PACKAGES="$INSTALLED_PACKAGES biber" +fi + +if ! command -v gs >/dev/null 2>&1; then + echo " -> ghostscript (gs) fehlt und wird vorgemerkt." + SYSTEM_PACKAGES="$SYSTEM_PACKAGES ghostscript" +else + echo " -> ghostscript (gs) ist bereits installiert ($(gs --version | head -n 1))." + INSTALLED_PACKAGES="$INSTALLED_PACKAGES ghostscript" +fi + +# Paket-Installation basierend auf dem verfügbaren Paketmanager +if [ -n "$SYSTEM_PACKAGES" ]; then + if command -v apt-get >/dev/null 2>&1; then + echo "Debian/Ubuntu-System erkannt. Installiere:$SYSTEM_PACKAGES..." + sudo apt-get update && sudo apt-get install -y $SYSTEM_PACKAGES + elif command -v pacman >/dev/null 2>&1; then + echo "Arch Linux erkannt. Installiere:$SYSTEM_PACKAGES..." + # Arch nutzt andere Paketnamen für ghostscript (ghostscript) und biber (biber) + sudo pacman -Sy --noconfirm $SYSTEM_PACKAGES + else + echo "⚠️ Unbekanntes System (kein apt oder pacman gefunden)." + echo "Bitte installiere die folgenden Pakete manuell: $SYSTEM_PACKAGES" + fi +else + # Formatierung: Entfernt führende Leerzeichen und ersetzt verbleibende durch Kommata + CLEAN_LIST=$(echo $INSTALLED_PACKAGES | sed 's/ /, /g') + echo " -> Alle notwendigen Systemkomponenten ($CLEAN_LIST) sind bereits installiert!" +fi + +echo "" +echo "=== Speicherplatz-Optimierung ===" +read -p "Möchtest du alle alten tlmgr-Paktebackups unwiderruflich löschen? (j/N): " response +if [[ "$response" =~ ^[jJ][aA]?$ || "$response" = "j" ]]; then + echo "Lösche alte Backups..." + $TLMGR backup --clean=0 --all +else + echo "Backups wurden beibehalten." +fi + +echo "=== Fertig! ===" +echo "Reminder: Please update pull/push the ~/gitea/scripts : scripts.git repository!"