From 1486289d45b0b7e1d0e888b8f1ec2be8d9f98969 Mon Sep 17 00:00:00 2001 From: Rhino <1+rhino@noreply.gitea.rhino.nrw> Date: Sat, 20 Jun 2026 20:22:46 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20DistBase=20=E2=86=92=20updates.rhino.nrw?= =?UTF-8?q?=20+=20erweitertes=20Backup=20(data/)=20+=20Checksum-Pr=C3=BCfu?= =?UTF-8?q?ng?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/update.ps1 | 78 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 70 insertions(+), 8 deletions(-) diff --git a/scripts/update.ps1 b/scripts/update.ps1 index 62c057b..f53e44d 100644 --- a/scripts/update.ps1 +++ b/scripts/update.ps1 @@ -8,7 +8,7 @@ # $startBat - (optional) Dateiname des Start-Skripts, z.B. 'DRIVE_Start.bat'. # Nicht gesetzt = Fallback auf 'dgl.bat'. $ErrorActionPreference = 'Stop' -$DistBase = "https://gitea.rhino.nrw/Rhino/StatusQuo_Updates/raw/branch/main/$proj" +$DistBase = "https://updates.rhino.nrw/rhino/StatusQuo_Updates/raw/branch/main/$proj" # Stop/Start-Namen VOR jeder Ueberschreibung aus dem aufrufenden Scope lesen $_stopName = if ($null -ne $stopBat) { $stopBat } else { 'stop.bat' } @@ -24,7 +24,7 @@ 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 + Write-Host "FEHLER: Update-Server nicht erreichbar. Netzverbindung prüfen." -ForegroundColor Red return } @@ -57,6 +57,41 @@ foreach ($b in $bundles) { Write-Host " sync-entpacken.bat ..." Invoke-WebRequest -Uri "$DistBase/sync-entpacken.bat" -OutFile (Join-Path $tmp 'sync-entpacken.bat') -UseBasicParsing -TimeoutSec 30 +# --- CHECKSUMMEN VERIFIZIEREN (optional — wird übersprungen wenn keine CHECKSUMS.txt vorhanden) --- +Write-Host "Verifiziere Checksummen ..." +try { + $chkContent = (Invoke-WebRequest -Uri "$DistBase/CHECKSUMS.txt" -UseBasicParsing -TimeoutSec 15).Content + $allOk = $true + foreach ($line in ($chkContent -split "`n")) { + $line = $line.Trim() + if ($line -eq '' -or $line.StartsWith('#')) { continue } + # Format: SHA256HASH filename + $parts = $line -split '\s+', 2 + if ($parts.Count -lt 2) { continue } + $expected = $parts[0].ToLower() + $filename = $parts[1].Trim() + $localPath = Join-Path $tmp $filename + if (-not (Test-Path -LiteralPath $localPath)) { continue } + $actual = (Get-FileHash -LiteralPath $localPath -Algorithm SHA256).Hash.ToLower() + if ($actual -ne $expected) { + Write-Host "FEHLER: Checksumme stimmt nicht für $filename!" -ForegroundColor Red + Write-Host " Erwartet: $expected" -ForegroundColor Red + Write-Host " Erhalten: $actual" -ForegroundColor Red + $allOk = $false + } + } + if (-not $allOk) { + Remove-Item $tmp -Recurse -Force -ErrorAction SilentlyContinue + Write-Host "Update abgebrochen — keine Dateien verändert. Bitte Support kontaktieren." -ForegroundColor Red + return + } + Write-Host " Alle Checksummen OK." -ForegroundColor Green +} catch { + # CHECKSUMS.txt nicht vorhanden — Prüfung überspringen (abwärtskompatibel) + Write-Host " (Keine CHECKSUMS.txt — Prüfung übersprungen)" -ForegroundColor DarkGray +} +# --- END CHECKSUMMEN --- + # Server stoppen Write-Host "Stoppe Server ..." if ($_stopName -ne '') { @@ -71,18 +106,42 @@ if ($_stopName -ne '') { Write-Host " (Kein Stop-Skript konfiguriert — übersprungen)" -ForegroundColor DarkYellow } -# Backup +# --- BACKUP (vor jeder Dateiänderung) --- $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 + +# 1. Nutzerdaten sichern (kritisch!) +$_dataPath = Join-Path $root 'data' +if (Test-Path -LiteralPath $_dataPath) { + Copy-Item -Path $_dataPath -Destination (Join-Path $bkDir 'data') -Recurse -Force + $dataCount = (Get-ChildItem -LiteralPath $_dataPath -Recurse -File -ErrorAction SilentlyContinue).Count + Write-Host " Nutzerdaten gesichert ($dataCount Dateien)" -ForegroundColor Cyan +} else { + Write-Host " (Kein data/-Ordner gefunden — übersprungen)" -ForegroundColor DarkGray } -Write-Host "Backup: $bkDir" + +# 2. Code-Dateien sichern +foreach ($ext in '*.ps1','*.html','*.js','*.css','*.bat','VERSION') { + Get-ChildItem -LiteralPath $root -File -Filter $ext -ErrorAction SilentlyContinue | + Copy-Item -Destination $bkDir -Force +} +Write-Host "Backup erstellt: $bkDir" -ForegroundColor Cyan + +# 3. Alte Backups bereinigen (max. 5 behalten) +$_backupBase = Join-Path $root '.backup' +$_allBackups = Get-ChildItem -LiteralPath $_backupBase -Directory -ErrorAction SilentlyContinue | + Where-Object { $_.Name -match '^\d{8}-\d{6}$' } | Sort-Object Name -Descending +if ($_allBackups.Count -gt 5) { + $_allBackups | Select-Object -Skip 5 | ForEach-Object { + Remove-Item -Path $_.FullName -Recurse -Force -ErrorAction SilentlyContinue + } + Write-Host " (Nur 5 neueste Backups behalten)" -ForegroundColor DarkGray +} +# --- END BACKUP --- # Entpacken (sync-entpacken.bat aus TempUpdate → schreibt in Root eine Ebene hoeher) -Write-Host "Entpacke ..." +Write-Host "Entpacke Update-Dateien ..." & cmd /c "`"$(Join-Path $tmp 'sync-entpacken.bat')`"" # VERSION lokal aktualisieren @@ -100,5 +159,8 @@ if (Test-Path -LiteralPath $_startPath) { } else { Write-Host "Start-Skript '$_startName' nicht gefunden — bitte Server manuell starten." -ForegroundColor Yellow } + Write-Host "" Write-Host "=== Update abgeschlossen ===" -ForegroundColor Green +Write-Host " Backup liegt unter: $bkDir" -ForegroundColor DarkGray +Write-Host " Bei Problemen: rollback.bat doppelklicken!" -ForegroundColor DarkGray