From befa393b84d3a1fd4be7b9f01e7653af0bb37055 Mon Sep 17 00:00:00 2001 From: D4rkst3r Date: Thu, 13 Aug 2026 10:27:38 +0200 Subject: [PATCH] fix: das Alter kommt aus dem NAMEN, nicht aus dem Zeitstempel Der erste echte Lauf auf dem Heimrechner sagte: d4rk_media-2026-08-11-2307.tar.gz, 0 Tage alt Ein Archiv vom 11. August, an einem 13. August, mit "0 Tage alt" -- und ausserdem war es gar nicht das neueste. Beides derselbe Fehler: ich habe nach LastWriteTime sortiert und gerechnet, und die setzt der Nextcloud-Client auf den Zeitpunkt des HERUNTERLADENS. Damit war der Alarm wertlos. Er haette nie ausgeloest, weil frisch geholte Archive immer taufrisch aussehen -- also genau in dem Fall geschwiegen, fuer den er gebaut ist. Jetzt wird das Datum aus dem Dateinamen gelesen (d4rk_media-2026-08-13-0929, d4rkbot-2026-08-12). Das ist das Datum der SICHERUNG, und es ueberlebt jedes Kopieren. Faellt der Name aus dem Muster, bleibt der Zeitstempel als Notnagel. Nachgemessen mit Dateien, die ALLE den heutigen Zeitstempel tragen: neuestes erkannt: d4rk_media-2026-08-13-0929 0 Tage dieses entfernt -> d4rkbot-2026-08-12 1.4 Tage Ausserdem sagt die Zeile jetzt, wieviel in der QUELLE liegt: "0 neu, 3 in der Ablage, 5 in der Quelle" beantwortet die Frage, ob der Client ueberhaupt schon durch ist -- "3 insgesamt" allein tat das nicht. Co-Authored-By: Claude Opus 5 --- tools/heim-abholen.ps1 | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/tools/heim-abholen.ps1 b/tools/heim-abholen.ps1 index 951e2a8..8531c5d 100644 --- a/tools/heim-abholen.ps1 +++ b/tools/heim-abholen.ps1 @@ -49,6 +49,31 @@ function Schlecht($t) { Write-Host " $t" -ForegroundColor Red } $MUSTER = @('*.tar.gz', '*.db.gz') +# Das Datum aus dem NAMEN lesen, nicht aus dem Zeitstempel der Datei. +# +# WARUM: der Nextcloud-Client setzt LastWriteTime auf den Zeitpunkt des +# HERUNTERLADENS. Ein Archiv vom 11. August, das heute ankommt, sieht damit +# taufrisch aus -- und der Alarm "es kommt nichts mehr an" würde nie +# auslösen, weil alles immer neu wirkt. Genau das ist beim ersten echten Lauf +# passiert: "d4rk_media-2026-08-11-2307.tar.gz, 0 Tage alt". +# +# Der Name trägt das Datum der SICHERUNG, und der überlebt jedes Kopieren: +# d4rk_media-2026-08-13-0929.tar.gz +# d4rkbot-2026-08-13.db.gz +function ArchivDatum($datei) { + if ($datei.Name -match '(\d{4})-(\d{2})-(\d{2})(?:-(\d{2})(\d{2}))?') { + $std = if ($Matches[4]) { [int]$Matches[4] } else { 0 } + $min = if ($Matches[5]) { [int]$Matches[5] } else { 0 } + try { + return Get-Date -Year ([int]$Matches[1]) -Month ([int]$Matches[2]) -Day ([int]$Matches[3]) ` + -Hour $std -Minute $min -Second 0 + } catch { } + } + # Kein Datum im Namen -- dann bleibt nur der Zeitstempel, mit allen + # Nachteilen. Besser als gar keine Reihenfolge. + return $datei.LastWriteTime +} + # -- Als Aufgabe eintragen ------------------------------------------------------ if ($Einrichten) { @@ -172,12 +197,13 @@ robocopy $qVoll $zVoll @MUSTER /XO /R:2 /W:5 /NP /NJH /NJS /NDL /NC /NS | Out-Nu # robocopy meldet ueber den Rueckgabewert: alles unter 8 ist Erfolg. if ($LASTEXITCODE -ge 8) { Schlecht "robocopy meldet Fehler ($LASTEXITCODE)"; exit 1 } $nachher = & $zaehlen -Gut "$($nachher - $vorher) neu, $nachher insgesamt" +$inQuelle = @(Get-ChildItem $qVoll -File | Where-Object { $_.Name -match '\.(tar|db)\.gz$' }).Count +Gut "$($nachher - $vorher) neu, $nachher in der Ablage, $inQuelle in der Quelle" # -- Ausdünnen ------------------------------------------------------------------ $alle = @(Get-ChildItem $zVoll -File | Where-Object { $_.Name -match '\.(tar|db)\.gz$' } | - Sort-Object LastWriteTime -Descending) + Sort-Object @{ Expression = { ArchivDatum $_ } } -Descending) if ($alle.Count -gt $Behalten) { Schritt "Alte Staende entfernen (mehr als $Behalten)" $alle | Select-Object -Skip $Behalten | ForEach-Object { @@ -194,7 +220,7 @@ if (-not $neuestes) { $text = 'In der Ablage liegt KEINE einzige Sicherung.' Schlecht $text } else { - $tage = [math]::Round(((Get-Date) - $neuestes.LastWriteTime).TotalDays, 1) + $tage = [math]::Round(((Get-Date) - (ArchivDatum $neuestes)).TotalDays, 1) if ($tage -gt $AlarmNachTagen) { $text = "Die neueste Sicherung ist $tage Tage alt ($($neuestes.Name)). Es kommt nichts mehr an." Schlecht $text