fix: Deinstaller, Verwaltungsfenster, Dashboard-Widerspruch, Mount-Tempo
Ampel / ampel (push) Successful in 30s

Vier Meldungen des Commanders, alle nachgemessen.

1. DEINSTALLER LIEF NICHT MEHR - reproduziert mit echtem PowerShell:

     Der Typ [System.Windows.Forms.MessageBox] wurde nicht gefunden.

   `Add-Type -AssemblyName System.Windows.Forms` stand EINE ZEILE ZU SPAET, die
   MessageBox wurde davor benutzt. Der Deinstaller starb also in seiner ersten
   Arbeitszeile, jedes Mal. Zwei weitere Maengel gleich mit:
   Kodierung war ASCII trotz Umlauten, und `Remove-Item -Recurse -Force
   $PSScriptRoot` loescht den Ordner, in dem das laufende Skript liegt - das
   klappt auf Windows nicht zuverlaessig (venv-DLLs sind geladen). Jetzt raeumt
   ein losgeloestes cmd nach, sobald PowerShell weg ist. Der erzeugte Deinstaller
   ist gegengeprueft: parst, BOM da, Umlaute intakt.

2. VERWALTUNGSFENSTER (Doppelklick aufs Tray). Zeigt Status, Aufgaben und Log,
   plus Knoepfe fuer Rippy, Log-in-Rippy und Deinstallieren - Deinstallieren geht
   damit auch aus dem Tray-Menue. Eigener PROZESS statt Fenster im Tray, weil
   pystray und tkinter beide den Haupt-Thread wollen; tkinter statt WinForms,
   weil es bei jeder Windows-Python-Installation dabei ist. Headless gerendert
   und angesehen. Alles Fachliche kommt von Rippy (/capabilities, /jobs), damit
   dort nicht eine zweite, abweichende Wahrheit steht.

3. DASHBOARD-WIDERSPRUCH. Oben stand "Akira im Laufwerk erkannt", die
   Server-Status-Karte gleichzeitig "Bereit - keine Disc in Arbeit / Disc
   einlegen". Zwei Aussagen, ein Blick. Die Karte fragt jetzt /devices und sagt
   "Disc erkannt - wartet auf Rippen starten" samt Titel.

4. MOUNT-TEMPO. Der Commander: "150 Sekunden? Das ist verrueckt langsam." Recht
   hat er. Gemessen ging die Zeit fast komplett in einen FEHLVERSUCH: `umount -l`
   ist lazy, der Abbau passiert spaeter, und wer direkt danach mountet, riskiert
   dass der Abbau hinter dem neuen Mount landet. Der erste Reparaturversuch
   scheiterte dadurch regelmaessig - und der zweite kostete 30 s mount-Timeout
   plus Pruefungen. Jetzt werden 1,5 s auf den Abbau gewartet, bevor neu
   gemountet wird; die Wache prueft erstmals nach 3 s statt 10 s und benutzt zum
   ERKENNEN die einfache schnelle Probe (die Doppelprobe steckt dort, wo der
   Wettlauf lauert: direkt nach dem Mount).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-07-26 14:52:53 +02:00
parent 4c2331563c
commit 2a90538473
9 changed files with 619 additions and 28 deletions
+65 -12
View File
@@ -477,25 +477,78 @@ function Do-Install {
$workBat = "@echo off`r`ncd /d `"%~dp0`"`r`nset REDIS_URL=redis://${rHost}:6379/0`r`nset DATABASE_URL=postgresql://rippy:rippy@${rHost}:5432/rippy`r`nset API_URL=http://${rHost}:8000`r`nset WORKER_NAME=$wName`r`nset RIPPY_SLOTS=$slots`r`n${mapZeile}set PATH=%~dp0;%PATH%`r`nvenv\Scripts\celery.exe -A celery_app worker --loglevel=info -Q transcode $poolArg -n ${wName}@%%h"
Set-Content -Path "start-worker.bat" -Value $workBat -Encoding ASCII
# --- Deinstaller ---------------------------------------------------
#
# ⚠️ REPARIERT 26.07.2026. Der Commander meldete: „Der Uninstaller vom
# Worker funktioniert nicht mehr." Reproduziert mit echtem PowerShell:
#
# Der Typ [System.Windows.Forms.MessageBox] wurde nicht gefunden.
#
# Ursache: `Add-Type -AssemblyName System.Windows.Forms` stand EINE ZEILE
# ZU SPÄT — die MessageBox wurde davor benutzt. Der Deinstaller starb also
# in seiner ersten Arbeitszeile, jedes Mal.
#
# Zwei weitere Mängel gleich mit erledigt:
# - Kodierung war ASCII, obwohl Umlaute drin stehen (Kauderwelsch).
# - `Remove-Item -Recurse -Force $PSScriptRoot` löscht den Ordner, in dem
# das laufende Skript selbst liegt. Das klappt auf Windows nicht
# zuverlässig (die venv-DLLs sind noch geladen). Jetzt räumt ein
# losgelöstes cmd den Ordner ab, nachdem PowerShell beendet ist.
$uninstall = @"
# Rippy-Worker DEINSTALLIEREN rückstandsfrei (MUSS-Kriterium).
# Aufruf ohne Parameter fragt nach; -Force fragt nicht (so ruft das Tray auf).
param([switch]`$Force)
if (-not `$Force) { if ([System.Windows.Forms.MessageBox]::Show("Rippy-Worker '$wName' deinstallieren?","Rippy",4) -ne "Yes") { exit } }
# ZUERST die Assembly laden, DANN die MessageBox benutzen. Genau daran ist der
# alte Deinstaller gescheitert.
Add-Type -AssemblyName System.Windows.Forms
Get-CimInstance Win32_Process | Where-Object { `$_.ExecutablePath -like "`$PSScriptRoot*" } | ForEach-Object { Stop-Process -Id `$_.ProcessId -Force -ErrorAction SilentlyContinue }
Start-Sleep 2
# Autostart-Verknüpfung entfernen - BEIDE möglichen Orte, weil die
# Installation je nach Zielverzeichnis persönlich oder maschinenweit war.
foreach (`$ordner in @("Startup", "CommonStartup")) {
try { Remove-Item -Force (Join-Path ([Environment]::GetFolderPath(`$ordner)) "RippyWorker.lnk") -ErrorAction Stop } catch {}
if (-not `$Force) {
`$antwort = [System.Windows.Forms.MessageBox]::Show(
"Den Rippy-Worker '$wName' von diesem PC entfernen?",
"Rippy Worker deinstallieren",
[System.Windows.Forms.MessageBoxButtons]::YesNo,
[System.Windows.Forms.MessageBoxIcon]::Warning)
if (`$antwort -ne [System.Windows.Forms.DialogResult]::Yes) { exit }
}
`$ordner = `$PSScriptRoot
# 1. Alles beenden, was aus diesem Ordner läuft (Tray, celery, HandBrake).
Get-CimInstance Win32_Process | Where-Object {
`$_.ExecutablePath -like "`$ordner*"
} | ForEach-Object { Stop-Process -Id `$_.ProcessId -Force -ErrorAction SilentlyContinue }
Start-Sleep 3
# 2. Autostart entfernen BEIDE möglichen Orte, weil die Installation je nach
# Zielverzeichnis persönlich oder maschinenweit war.
foreach (`$ort in @("Startup", "CommonStartup")) {
`$lnk = Join-Path ([Environment]::GetFolderPath(`$ort)) "RippyWorker.lnk"
if (Test-Path `$lnk) { Remove-Item -Force `$lnk -ErrorAction SilentlyContinue }
}
# ... und die geplante Aufgabe aus älteren Installationen, falls vorhanden.
schtasks /delete /tn "RippyWorker" /f 2>`$null | Out-Null
try { Invoke-RestMethod -Method Delete "http://$rHost/api/workers/$wName" -TimeoutSec 5 | Out-Null } catch {}
Set-Location (Split-Path `$PSScriptRoot -Parent)
Remove-Item -Recurse -Force `$PSScriptRoot
[System.Windows.Forms.MessageBox]::Show("Rippy-Worker deinstalliert.","Rippy")
# 3. In Rippy abmelden, damit dort keine Worker-Leiche stehen bleibt.
try {
Invoke-RestMethod -Method Delete "http://$rHost/api/workers/$wName" -TimeoutSec 5 | Out-Null
} catch { }
# 4. Ordner abräumen. NICHT von hier aus: Dieses Skript liegt darin, und die
# venv-DLLs sind noch geladen. Ein losgelöstes cmd wartet, bis PowerShell
# weg ist, und räumt dann auf.
Set-Location `$env:TEMP
Start-Process cmd.exe -ArgumentList '/c timeout /t 4 /nobreak >nul & rd /s /q "'"`$ordner"'"' -WindowStyle Hidden
[System.Windows.Forms.MessageBox]::Show(
"Rippy-Worker entfernt. Der Ordner verschwindet in wenigen Sekunden.",
"Rippy Worker") | Out-Null
"@
Set-Content -Path "uninstall.ps1" -Value $uninstall -Encoding ASCII
# UTF-8 MIT BOM, nicht ASCII: Die Datei enthält Umlaute, und PowerShell
# 5.1 liest .ps1 ohne BOM als ANSI (dokumentiert im Kopf dieser Datei).
[System.IO.File]::WriteAllText(
(Join-Path $InstallDir "uninstall.ps1"), $uninstall,
(New-Object System.Text.UTF8Encoding $true))
# 7. Autostart über den Autostart-ORDNER, nicht über schtasks.
#
+12 -4
View File
@@ -226,11 +226,19 @@ try {
Invoke-RestMethod -Method Delete "http://$RippyHost/api/workers/$WorkerName" -TimeoutSec 5 | Out-Null
Write-Host "Worker-Eintrag in Rippy entfernt."
} catch { Write-Host "Hinweis: Eintrag in Rippy ggf. von Hand löschen (Einstellungen -> Worker)." }
Set-Location (Split-Path `$PSScriptRoot -Parent)
Remove-Item -Recurse -Force `$PSScriptRoot
Write-Host "Rippy-Worker deinstalliert." -ForegroundColor Green
# Ordner abräumen NICHT von hier aus: Dieses Skript liegt darin, und die
# venv-DLLs sind noch geladen. `Remove-Item -Recurse -Force` auf den eigenen
# Ordner klappt auf Windows nicht zuverlässig (Befund 26.07.2026). Ein
# losgelöstes cmd wartet, bis PowerShell weg ist, und räumt dann auf.
Set-Location `$env:TEMP
Start-Process cmd.exe -ArgumentList '/c timeout /t 4 /nobreak >nul & rd /s /q "'"`$PSScriptRoot"'"' -WindowStyle Hidden
Write-Host "Rippy-Worker deinstalliert (Ordner verschwindet in wenigen Sekunden)." -ForegroundColor Green
"@
Set-Content -Path "uninstall.ps1" -Value $uninstall -Encoding ASCII
# UTF-8 MIT BOM statt ASCII: die Datei enthält Umlaute, und PowerShell 5.1 liest
# .ps1 ohne BOM als ANSI.
[System.IO.File]::WriteAllText(
(Join-Path $ziel "uninstall.ps1"), $uninstall,
(New-Object System.Text.UTF8Encoding $true))
Write-Host "uninstall.ps1 erzeugt."
# 9. Optional: Autostart bei Anmeldung (mit Tray)