From 9b9838612fb6fe87a470ef5ee6334ddb02e9a703 Mon Sep 17 00:00:00 2001 From: Rhino <1+rhino@noreply.gitea.rhino.nrw> Date: Sat, 20 Jun 2026 10:25:22 +0200 Subject: [PATCH] feat: zentraler Updater fuer alle Projekte --- scripts/update.ps1 | 88 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 scripts/update.ps1 diff --git a/scripts/update.ps1 b/scripts/update.ps1 new file mode 100644 index 0000000..e77fb8f --- /dev/null +++ b/scripts/update.ps1 @@ -0,0 +1,88 @@ +# StatusQuo_Updates/scripts/update.ps1 +# Zentraler Updater - wird von update.bat per Invoke-Expression geladen. +# Erwartet im aufrufenden Scope: $proj (Projektname z.B. 'VI3DGL'), $root (Installationspfad) +$ErrorActionPreference = 'Stop' +$DistBase = "https://gitea.rhino.nrw/Rhino/StatusQuo_Updates/raw/branch/main/$proj" + +# Lokale Version lesen +$localVer = '0.0.0' +$verFile = Join-Path $root 'VERSION' +if (Test-Path -LiteralPath $verFile) { $localVer = (Get-Content $verFile -Raw).Trim() } + +# Remote-Version abfragen +Write-Host "Prüfe Update für $proj ..." +try { + $remoteVer = (Invoke-WebRequest -Uri "$DistBase/VERSION" -UseBasicParsing -TimeoutSec 15).Content.Trim() +} catch { + Write-Host "FEHLER: Dist-Repo nicht erreichbar. Netzverbindung prüfen." -ForegroundColor Red + return +} + +Write-Host "Lokal: v$localVer" +Write-Host "Remote: v$remoteVer" + +if ($localVer -eq $remoteVer) { + Write-Host "Bereits auf aktuellem Stand. Kein Update nötig." -ForegroundColor Green + return +} + +$yn = Read-Host "Update von v$localVer auf v$remoteVer installieren? [j/N]" +if ($yn -notin 'j','J','y','Y') { Write-Host "Abgebrochen."; return } + +# Temp-Ordner +$tmp = Join-Path $root 'TempUpdate' +Remove-Item $tmp -Recurse -Force -ErrorAction SilentlyContinue +New-Item -ItemType Directory -Path $tmp | Out-Null + +# Bundles laden +Write-Host "Lade Manifest ..." +$manifest = (Invoke-WebRequest -Uri "$DistBase/MANIFEST.txt" -UseBasicParsing -TimeoutSec 30).Content +$bundles = ($manifest -split "`n" | Where-Object { $_ -match '^sync-bundle-' } | + ForEach-Object { ($_ -split ' ')[0] } | Sort-Object -Unique) + +foreach ($b in $bundles) { + Write-Host " $b ..." + Invoke-WebRequest -Uri "$DistBase/$b" -OutFile (Join-Path $tmp $b) -UseBasicParsing -TimeoutSec 120 +} +Write-Host " sync-entpacken.bat ..." +Invoke-WebRequest -Uri "$DistBase/sync-entpacken.bat" -OutFile (Join-Path $tmp 'sync-entpacken.bat') -UseBasicParsing -TimeoutSec 30 + +# Server stoppen +Write-Host "Stoppe Server ..." +$stopBat = Join-Path $root 'stop.bat' +if (Test-Path -LiteralPath $stopBat) { + & cmd /c "`"$stopBat`"" + Start-Sleep -Seconds 2 +} + +# Backup +$ts = Get-Date -Format 'yyyyMMdd-HHmmss' +$bkDir = Join-Path $root ".backup\$ts" +New-Item -ItemType Directory -Path $bkDir -Force | Out-Null +foreach ($ext in '*.ps1','*.html','*.js','*.css','*.bat') { + Get-ChildItem -LiteralPath $root -File -Filter $ext -ErrorAction SilentlyContinue | + Copy-Item -Destination $bkDir +} +Write-Host "Backup: $bkDir" + +# Entpacken (sync-entpacken.bat aus TempUpdate → schreibt in Root eine Ebene hoeher) +Write-Host "Entpacke ..." +& cmd /c "`"$(Join-Path $tmp 'sync-entpacken.bat')`"" + +# VERSION lokal aktualisieren +[System.IO.File]::WriteAllText($verFile, ($remoteVer + "`r`n"), [System.Text.Encoding]::UTF8) +Write-Host "Version auf v$remoteVer aktualisiert." -ForegroundColor Green + +# Aufräumen +Remove-Item $tmp -Recurse -Force -ErrorAction SilentlyContinue + +# Server neu starten +$dglBat = Join-Path $root 'dgl.bat' +if (Test-Path -LiteralPath $dglBat) { + Start-Process -FilePath 'cmd.exe' -ArgumentList "/c `"$dglBat`"" -WindowStyle Hidden + Write-Host "Server gestartet." -ForegroundColor Green +} else { + Write-Host "dgl.bat nicht gefunden — bitte Server manuell starten." -ForegroundColor Yellow +} +Write-Host "" +Write-Host "=== Update abgeschlossen ===" -ForegroundColor Green