# Selbst-Update — Prüfung und Umbau

Marker **SELFUPD-V2** (24.08.2026) · `Stream-Tools-Updater.ps1` Fassung **17.9**

## Befund: es lief überhaupt nicht

Der wichtigste Punkt zuerst — das Selbst-Update konnte in Fassung 17.8 und
davor **nie** durchlaufen:

```powershell
$confirm = [void][System.Windows.Forms.MessageBox]::Show(...)
if ($confirm -ne 'Yes') { return }
```

`[void]` verwirft das Ergebnis. `$confirm` war **immer `$null`**, die Prüfung
damit immer wahr — es kehrte nach dem Versionsvergleich jedes Mal zurück.
Zweimal im Code (vor dem Download und vor dem Einspielen). Nachgestellt und
bestätigt.

Deshalb ist auch nie aufgefallen, was danach kam:

| # | Befund | Folge |
|---|---|---|
| 1 | `$confirm=[void]…` (2×) | Update bricht immer ab |
| 2 | **`MainModule.FileName` als Zielordner** | Beim Lauf als `.ps1` ist das **powershell.exe** → Zielordner wäre `C:\Windows\System32\WindowsPowerShell\v1.0` gewesen |
| 3 | `timeout /t 2` und hoffen | Läuft das Programm noch, schlägt `xcopy` fehl — still, niemand prüft den Rückgabewert |
| 4 | `xcopy /Y /E /I *.*` über alles | **`setup.json` wird überschrieben** — die gesamte örtliche Einrichtung weg |
| 5 | Keine Sicherung, kein Rückweg | Ein kaputtes ZIP und der Rechner hat kein laufendes Werkzeug mehr |
| 6 | ZIP wird nicht geprüft | Ein leeres oder falsches ZIP wird trotzdem kopiert |
| 7 | Batch in ASCII geschrieben | Pfade mit Umlauten zerbrechen |

## Warum es überhaupt einen Batch braucht

Ein laufendes Programm kann sich nicht selbst überschreiben — die Datei ist in
Benutzung. Deshalb: das Programm schreibt eine Batchdatei, startet sie und
beendet sich; der Batch kopiert und startet neu. Das Prinzip war richtig, die
Ausführung nicht.

## Der neue Ablauf

```
1. Quelle auflösen    → steht im Setup ein ORDNER, werden version.txt
                        und das neueste *.zip darin selbst gefunden
2. Version vergleichen → version.txt gegen $Script:AppVersion
3. ZIP holen und entpacken
4. Inhalt PRÜFEN      → sind Stream-Tools-Updater.* und Update-Worker.ps1 drin?
                        wenn nein: Abbruch, nichts angefasst
5. Zielordner bestimmen → aus $PSCommandPath (Skript) oder der EXE,
                          Systemordner sind gesperrt
6. Einrichtung schützen → setup.json und *_config.json aus dem Neu-Ordner
                          nehmen, sie landen als *.neu daneben
7. SICHERN            → alles, was überschrieben wird, PLUS jede örtliche
                        JSON nach Backup\vor_update_<Fassung>_<Zeitstempel>\
8. Batch schreiben, beenden
9. Batch: auf das Prozessende WARTEN (über die Prozessnummer, max. 60 s),
   kopieren, Rückgabewert prüfen, bei Fehler die Sicherung zurückspielen,
   alles protokollieren, neu starten
10. Nach dem Neustart: enthält das Protokoll "FEHLER", wird es angezeigt
```

## Was im Setup einzutragen ist

Es reicht **ein Feld**. Unter *Selbst-Update* → *Lokal (UNC)* den **Ordner**
eintragen, zum Beispiel:

```
\\stream-space\Stream-Tools\StreamToolBox\Ausgabe
```

Darin:

| Datei | Inhalt |
|---|---|
| `version.txt` | nur die Zahl, z. B. `17.9` |
| `*.zip` | das Paket; das **neueste** wird genommen |

Zeigt der Eintrag auf eine Datei statt einen Ordner, gilt weiter der alte Weg
(Datei = version.txt, ZIP-Pfad separat). Dropbox und Webserver bleiben
unverändert als zweite und dritte Quelle.

## Geschützte Dateien

Diese werden **nie** überschrieben — sie unterscheiden sich von Rechner zu
Rechner:

`setup.json` · `glpi_installer_config.json` · `gpu_downloader_config.json` ·
`docker_guardian_config.json` · `netzverbindungen.json` · `api.json`

Bringt das ZIP eine davon mit, liegt sie danach als `<name>.neu` daneben — zum
Vergleichen, ohne dass etwas verloren geht.

## Was gesichert wird

Nach `<Programmordner>\Backup\vor_update_<alteFassung>_<Zeitstempel>\`:

1. **jede Datei, die das Update mitbringt und die es hier schon gibt** — das
   ist der Rückweg, falls das Kopieren scheitert
2. **jede `*.json` im Programmordner** — auch die, die das Update gar nicht
   anfasst

Findet die Sicherung nichts zu sichern, sagt die Rückfrage das ausdrücklich,
bevor du bestätigst.

## Test

1. Auf der Freigabe einen Ordner anlegen, `version.txt` mit `17.9` hineinlegen
   und ein ZIP mit den neuen Dateien.
2. Im Setup unter *Selbst-Update* → *Lokal* diesen **Ordner** eintragen und
   *Lokal aktiv* setzen.
3. Menü → *Update*. Erwartung: „Neue Version verfuegbar" — **das kam vorher nie.**
4. Bestätigen. Die zweite Rückfrage zeigt: Dateiliste, Zielordner,
   Sicherungspfad und welche Dateien unangetastet bleiben.
5. Nach dem Neustart prüfen: `Backup\vor_update_…\` enthält die alten Dateien
   und alle JSON, `Backup\letztes_update.log` sagt „Kopieren erfolgreich",
   und `setup.json` hat noch deine Pfade.
6. **Gegenprobe:** ein ZIP mit einer Textdatei darin anbieten. Erwartung:
   „Im ZIP fehlen Stream-Tools-Updater und Update-Worker.ps1" — und es wird
   nichts kopiert.

## Ungeprüft

Windows kann ich hier nicht ausführen. Geprüft sind Syntax, Variablen, der
`[void]`-Effekt (nachgestellt), die Zielordner-Ermittlung für beide Startarten
und der erzeugte Batch im Klartext. Ob `tasklist`, `xcopy` und der Neustart auf
deinen Rechnern durchlaufen, zeigt der erste echte Lauf — deshalb schreibt der
Batch jeden Schritt in `Backup\letztes_update.log`.
