feat(installer): Verknuepfung auf dem Desktop - mit Rippy-Icon
Ampel / ampel (push) Successful in 30s
Ampel / ampel (push) Successful in 30s
Commander: "Und wenn man den worker installiert braucht man auch eine exe auf dem
Desktop abgelegt wird zum starten you know?"
Berechtigt: Die Startdateien lagen nur im Programmordner. Wer den Worker von Hand
starten wollte, musste erst "C:\Program Files\Rippy Worker" suchen - und genau
das war heute noetig, als der Worker stand.
Jetzt legen beide Installer eine Verknuepfung "Rippy Worker" auf den Desktop
(GUI mit Haekchen, Kommandozeile per -KeineDesktopVerknuepfung abschaltbar). Drei
Details, die den Unterschied machen:
* Das ICON wird mit ausgeliefert. rippy.ico lag im Repo, ging aber nie an die
Zielmaschine - die Verknuepfung haette das Batch-Standardsymbol getragen und
waere zwischen den anderen Icons unfindbar gewesen. Jetzt im Worker-Paket.
* WindowStyle 7 (minimiert): start-tray.bat startet pythonw, also ohne
Konsolenfenster - aber die .bat selbst blitzt sonst kurz auf. Gilt jetzt auch
fuer die Autostart-Verknuepfung, wo derselbe Blitz war.
* Der DEINSTALLER nimmt sie mit, an beiden moeglichen Orten (eigener Desktop
und Desktop aller Benutzer). "Rueckstandsfrei entfernbar" ist ein
MUSS-Kriterium; ein totes Symbol auf dem Desktop waere genau so ein Rueckstand.
Dieselbe Rechte-Ueberlegung wie beim Autostart: bei einer Installation unter
"Programme" auf den Desktop ALLER Benutzer, sonst auf den eigenen - bei einer
UAC-Erhoehung ueber ein fremdes Admin-Konto waere der eigene der falsche.
Layout headless gerendert und angesehen (Fenster 648 -> 672 px, nichts
ueberlappt), beide .ps1 mit echtem PowerShell 5.1 geprueft, .exe neu gebaut.
Und die CRLF-Falle aus dem Savepoint hat prompt wieder zugeschlagen: Mein
Python-Rewrite machte aus install-gui.ps1 LF - zurueckgedreht, `file` bestaetigt
BOM und CRLF fuer beide.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Binary file not shown.
@@ -47,7 +47,7 @@ $cPurple = [System.Drawing.Color]::FromArgb(126, 34, 206)
|
|||||||
# --- Fenster ---------------------------------------------------------------
|
# --- Fenster ---------------------------------------------------------------
|
||||||
$form = New-Object System.Windows.Forms.Form
|
$form = New-Object System.Windows.Forms.Form
|
||||||
$form.Text = "Rippy Encoding-Worker - Installation"
|
$form.Text = "Rippy Encoding-Worker - Installation"
|
||||||
$form.ClientSize = New-Object System.Drawing.Size(560, 648)
|
$form.ClientSize = New-Object System.Drawing.Size(560, 672)
|
||||||
$form.StartPosition = "CenterScreen"
|
$form.StartPosition = "CenterScreen"
|
||||||
$form.FormBorderStyle = "FixedDialog"
|
$form.FormBorderStyle = "FixedDialog"
|
||||||
$form.MaximizeBox = $false
|
$form.MaximizeBox = $false
|
||||||
@@ -260,9 +260,20 @@ $chkAuto.Checked = $true
|
|||||||
$chkAuto.ForeColor = $cText
|
$chkAuto.ForeColor = $cText
|
||||||
$form.Controls.Add($chkAuto)
|
$form.Controls.Add($chkAuto)
|
||||||
|
|
||||||
|
# Verknuepfung auf dem Desktop (Commander-Wunsch 26.07.2026). Vorher lagen die
|
||||||
|
# Startdateien nur im Programmordner - wer den Worker von Hand starten wollte,
|
||||||
|
# musste erst "C:\Program Files\Rippy Worker" suchen.
|
||||||
|
$chkDesktop = New-Object System.Windows.Forms.CheckBox
|
||||||
|
$chkDesktop.Text = "Verknüpfung auf dem Desktop anlegen"
|
||||||
|
$chkDesktop.Location = New-Object System.Drawing.Point(24, 388)
|
||||||
|
$chkDesktop.Size = New-Object System.Drawing.Size(400, 22)
|
||||||
|
$chkDesktop.Checked = $true
|
||||||
|
$chkDesktop.ForeColor = $cText
|
||||||
|
$form.Controls.Add($chkDesktop)
|
||||||
|
|
||||||
# Log-Bereich
|
# Log-Bereich
|
||||||
$log = New-Object System.Windows.Forms.TextBox
|
$log = New-Object System.Windows.Forms.TextBox
|
||||||
$log.Location = New-Object System.Drawing.Point(24, 396)
|
$log.Location = New-Object System.Drawing.Point(24, 420)
|
||||||
$log.Size = New-Object System.Drawing.Size(500, 174)
|
$log.Size = New-Object System.Drawing.Size(500, 174)
|
||||||
$log.Multiline = $true
|
$log.Multiline = $true
|
||||||
$log.ReadOnly = $true
|
$log.ReadOnly = $true
|
||||||
@@ -276,7 +287,7 @@ $form.Controls.Add($log)
|
|||||||
# Knöpfe
|
# Knöpfe
|
||||||
$btnInstall = New-Object System.Windows.Forms.Button
|
$btnInstall = New-Object System.Windows.Forms.Button
|
||||||
$btnInstall.Text = "Installieren"
|
$btnInstall.Text = "Installieren"
|
||||||
$btnInstall.Location = New-Object System.Drawing.Point(24, 584)
|
$btnInstall.Location = New-Object System.Drawing.Point(24, 608)
|
||||||
$btnInstall.Size = New-Object System.Drawing.Size(150, 40)
|
$btnInstall.Size = New-Object System.Drawing.Size(150, 40)
|
||||||
$btnInstall.BackColor = $cAmber
|
$btnInstall.BackColor = $cAmber
|
||||||
$btnInstall.ForeColor = $cBg
|
$btnInstall.ForeColor = $cBg
|
||||||
@@ -286,7 +297,7 @@ $form.Controls.Add($btnInstall)
|
|||||||
|
|
||||||
$btnStart = New-Object System.Windows.Forms.Button
|
$btnStart = New-Object System.Windows.Forms.Button
|
||||||
$btnStart.Text = "Worker starten"
|
$btnStart.Text = "Worker starten"
|
||||||
$btnStart.Location = New-Object System.Drawing.Point(190, 584)
|
$btnStart.Location = New-Object System.Drawing.Point(190, 608)
|
||||||
$btnStart.Size = New-Object System.Drawing.Size(150, 40)
|
$btnStart.Size = New-Object System.Drawing.Size(150, 40)
|
||||||
$btnStart.BackColor = $cEmerald
|
$btnStart.BackColor = $cEmerald
|
||||||
$btnStart.ForeColor = [System.Drawing.Color]::White
|
$btnStart.ForeColor = [System.Drawing.Color]::White
|
||||||
@@ -520,12 +531,18 @@ Get-CimInstance Win32_Process | Where-Object {
|
|||||||
} | ForEach-Object { Stop-Process -Id `$_.ProcessId -Force -ErrorAction SilentlyContinue }
|
} | ForEach-Object { Stop-Process -Id `$_.ProcessId -Force -ErrorAction SilentlyContinue }
|
||||||
Start-Sleep 3
|
Start-Sleep 3
|
||||||
|
|
||||||
# 2. Autostart entfernen — BEIDE möglichen Orte, weil die Installation je nach
|
# 2. Verknüpfungen entfernen — Autostart UND Desktop, jeweils an BEIDEN möglichen
|
||||||
# Zielverzeichnis persönlich oder maschinenweit war.
|
# Orten, weil die Installation je nach Zielverzeichnis persönlich oder
|
||||||
|
# maschinenweit war. „Rückstandsfrei entfernbar" ist ein MUSS-Kriterium; eine
|
||||||
|
# tote Verknüpfung auf dem Desktop wäre genau so ein Rückstand.
|
||||||
foreach (`$ort in @("Startup", "CommonStartup")) {
|
foreach (`$ort in @("Startup", "CommonStartup")) {
|
||||||
`$lnk = Join-Path ([Environment]::GetFolderPath(`$ort)) "RippyWorker.lnk"
|
`$lnk = Join-Path ([Environment]::GetFolderPath(`$ort)) "RippyWorker.lnk"
|
||||||
if (Test-Path `$lnk) { Remove-Item -Force `$lnk -ErrorAction SilentlyContinue }
|
if (Test-Path `$lnk) { Remove-Item -Force `$lnk -ErrorAction SilentlyContinue }
|
||||||
}
|
}
|
||||||
|
foreach (`$ort in @("Desktop", "CommonDesktopDirectory")) {
|
||||||
|
`$lnk = Join-Path ([Environment]::GetFolderPath(`$ort)) "Rippy Worker.lnk"
|
||||||
|
if (Test-Path `$lnk) { Remove-Item -Force `$lnk -ErrorAction SilentlyContinue }
|
||||||
|
}
|
||||||
# ... und die geplante Aufgabe aus älteren Installationen, falls vorhanden.
|
# ... und die geplante Aufgabe aus älteren Installationen, falls vorhanden.
|
||||||
schtasks /delete /tn "RippyWorker" /f 2>`$null | Out-Null
|
schtasks /delete /tn "RippyWorker" /f 2>`$null | Out-Null
|
||||||
|
|
||||||
@@ -588,6 +605,11 @@ Start-Process cmd.exe -ArgumentList '/c timeout /t 4 /nobreak >nul & rd /s /q "'
|
|||||||
$lnk.TargetPath = (Join-Path $InstallDir "start-tray.bat")
|
$lnk.TargetPath = (Join-Path $InstallDir "start-tray.bat")
|
||||||
$lnk.WorkingDirectory = $InstallDir
|
$lnk.WorkingDirectory = $InstallDir
|
||||||
$lnk.Description = "Rippy Encoding-Worker"
|
$lnk.Description = "Rippy Encoding-Worker"
|
||||||
|
# WindowStyle 7 = minimiert. start-tray.bat startet pythonw (kein
|
||||||
|
# Konsolenfenster), aber die .bat selbst blitzt sonst kurz auf.
|
||||||
|
$lnk.WindowStyle = 7
|
||||||
|
$ico = Join-Path $InstallDir "rippy.ico"
|
||||||
|
if (Test-Path $ico) { $lnk.IconLocation = $ico }
|
||||||
$lnk.Save()
|
$lnk.Save()
|
||||||
if ($maschinenweit) {
|
if ($maschinenweit) {
|
||||||
Log "Autostart eingerichtet (für alle Benutzer dieser Maschine)."
|
Log "Autostart eingerichtet (für alle Benutzer dieser Maschine)."
|
||||||
@@ -603,6 +625,44 @@ Start-Process cmd.exe -ArgumentList '/c timeout /t 4 /nobreak >nul & rd /s /q "'
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# 8. Verknüpfung auf dem Desktop (Commander-Wunsch 26.07.2026: „wenn man
|
||||||
|
# den Worker installiert braucht man auch eine exe auf dem Desktop
|
||||||
|
# zum Starten"). Vorher lagen die Startdateien nur im Programmordner —
|
||||||
|
# wer den Worker von Hand starten wollte, musste erst
|
||||||
|
# "C:\Program Files\Rippy Worker" suchen.
|
||||||
|
#
|
||||||
|
# Dieselbe Rechte-Überlegung wie beim Autostart: bei einer Installation
|
||||||
|
# unter "Programme" auf den Desktop ALLER Benutzer, sonst auf den
|
||||||
|
# eigenen. Und ein Fehlschlag hier ist nur eine Warnung — der Worker
|
||||||
|
# läuft davon unberührt.
|
||||||
|
if ($chkDesktop.Checked) {
|
||||||
|
try {
|
||||||
|
$programme = [Environment]::GetFolderPath("ProgramFiles")
|
||||||
|
$programmeX86 = [Environment]::GetFolderPath("ProgramFilesX86")
|
||||||
|
$maschinenweit = $InstallDir.StartsWith($programme, "OrdinalIgnoreCase") `
|
||||||
|
-or ($programmeX86 -and $InstallDir.StartsWith($programmeX86, "OrdinalIgnoreCase"))
|
||||||
|
$desktopDir = if ($maschinenweit) {
|
||||||
|
[Environment]::GetFolderPath("CommonDesktopDirectory")
|
||||||
|
} else {
|
||||||
|
[Environment]::GetFolderPath("Desktop")
|
||||||
|
}
|
||||||
|
$wsh = New-Object -ComObject WScript.Shell
|
||||||
|
$lnk = $wsh.CreateShortcut((Join-Path $desktopDir "Rippy Worker.lnk"))
|
||||||
|
$lnk.TargetPath = (Join-Path $InstallDir "start-tray.bat")
|
||||||
|
$lnk.WorkingDirectory = $InstallDir
|
||||||
|
$lnk.Description = "Rippy Encoding-Worker starten (Symbol neben der Uhr)"
|
||||||
|
$lnk.WindowStyle = 7 # minimiert, damit die .bat nicht aufblitzt
|
||||||
|
$ico = Join-Path $InstallDir "rippy.ico"
|
||||||
|
if (Test-Path $ico) { $lnk.IconLocation = $ico }
|
||||||
|
$lnk.Save()
|
||||||
|
Log "Verknüpfung 'Rippy Worker' auf dem Desktop angelegt."
|
||||||
|
} catch {
|
||||||
|
Log "HINWEIS: Desktop-Verknüpfung ging nicht ($($_.Exception.Message))."
|
||||||
|
Log " Der Worker ist trotzdem fertig — starten über"
|
||||||
|
Log " $InstallDir\start-tray.bat"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Log ""
|
Log ""
|
||||||
Log "FERTIG! Ordner: $InstallDir"
|
Log "FERTIG! Ordner: $InstallDir"
|
||||||
Log "Klick 'Worker starten' - er erscheint dann in Rippy unter Einstellungen -> Worker."
|
Log "Klick 'Worker starten' - er erscheint dann in Rippy unter Einstellungen -> Worker."
|
||||||
|
|||||||
@@ -22,6 +22,9 @@ param(
|
|||||||
[Parameter(Mandatory = $true)] [string]$RippyHost,
|
[Parameter(Mandatory = $true)] [string]$RippyHost,
|
||||||
[string]$WorkerName = $env:COMPUTERNAME.ToLower(),
|
[string]$WorkerName = $env:COMPUTERNAME.ToLower(),
|
||||||
[switch]$Autostart,
|
[switch]$Autostart,
|
||||||
|
# Verknüpfung auf dem Desktop. Standard AN (Commander-Wunsch 26.07.2026) —
|
||||||
|
# mit -KeineDesktopVerknuepfung abschaltbar.
|
||||||
|
[switch]$KeineDesktopVerknuepfung,
|
||||||
# Übersetzung der Rippy-Container-Pfade auf Freigaben, die DIESER PC sieht.
|
# Übersetzung der Rippy-Container-Pfade auf Freigaben, die DIESER PC sieht.
|
||||||
# Leer lassen: dann holt der Installer den Wert von Rippy selbst
|
# Leer lassen: dann holt der Installer den Wert von Rippy selbst
|
||||||
# (GET /worker-setup/pfad-map, abgeleitet aus dessen eigenen Mounts).
|
# (GET /worker-setup/pfad-map, abgeleitet aus dessen eigenen Mounts).
|
||||||
@@ -221,6 +224,11 @@ Start-Sleep 2
|
|||||||
foreach (`$ordner in @("Startup", "CommonStartup")) {
|
foreach (`$ordner in @("Startup", "CommonStartup")) {
|
||||||
try { Remove-Item -Force (Join-Path ([Environment]::GetFolderPath(`$ordner)) "RippyWorker.lnk") -ErrorAction Stop } catch {}
|
try { Remove-Item -Force (Join-Path ([Environment]::GetFolderPath(`$ordner)) "RippyWorker.lnk") -ErrorAction Stop } catch {}
|
||||||
}
|
}
|
||||||
|
# ... und die Desktop-Verknüpfung. „Rückstandsfrei entfernbar" ist ein
|
||||||
|
# MUSS-Kriterium; ein totes Symbol auf dem Desktop wäre genau so ein Rückstand.
|
||||||
|
foreach (`$ordner in @("Desktop", "CommonDesktopDirectory")) {
|
||||||
|
try { Remove-Item -Force (Join-Path ([Environment]::GetFolderPath(`$ordner)) "Rippy Worker.lnk") -ErrorAction Stop } catch {}
|
||||||
|
}
|
||||||
# ... und die geplante Aufgabe aus älteren Installationen, falls vorhanden.
|
# ... und die geplante Aufgabe aus älteren Installationen, falls vorhanden.
|
||||||
schtasks /delete /tn "RippyWorker" /f 2>`$null | Out-Null
|
schtasks /delete /tn "RippyWorker" /f 2>`$null | Out-Null
|
||||||
try {
|
try {
|
||||||
@@ -267,6 +275,11 @@ if ($Autostart) {
|
|||||||
$lnk.TargetPath = (Join-Path $ziel "start-tray.bat")
|
$lnk.TargetPath = (Join-Path $ziel "start-tray.bat")
|
||||||
$lnk.WorkingDirectory = $ziel
|
$lnk.WorkingDirectory = $ziel
|
||||||
$lnk.Description = "Rippy Encoding-Worker"
|
$lnk.Description = "Rippy Encoding-Worker"
|
||||||
|
# WindowStyle 7 = minimiert: start-tray.bat startet pythonw (kein
|
||||||
|
# Konsolenfenster), aber die .bat selbst blitzt sonst kurz auf.
|
||||||
|
$lnk.WindowStyle = 7
|
||||||
|
$ico = Join-Path $ziel "rippy.ico"
|
||||||
|
if (Test-Path $ico) { $lnk.IconLocation = $ico }
|
||||||
$lnk.Save()
|
$lnk.Save()
|
||||||
Write-Host "Autostart eingerichtet (Verknüpfung im Autostart-Ordner)."
|
Write-Host "Autostart eingerichtet (Verknüpfung im Autostart-Ordner)."
|
||||||
} catch {
|
} catch {
|
||||||
@@ -276,8 +289,37 @@ if ($Autostart) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# 10. Verknüpfung auf dem Desktop (Commander-Wunsch 26.07.2026). Vorher lagen die
|
||||||
|
# Startdateien nur im Programmordner — wer den Worker von Hand starten wollte,
|
||||||
|
# musste erst "C:\Program Files\Rippy Worker" suchen. Ein Fehlschlag hier ist nur
|
||||||
|
# eine Warnung; der Worker läuft davon unberührt.
|
||||||
|
if (-not $KeineDesktopVerknuepfung) {
|
||||||
|
try {
|
||||||
|
$programme = [Environment]::GetFolderPath("ProgramFiles")
|
||||||
|
$maschinenweit = $ziel.StartsWith($programme, "OrdinalIgnoreCase")
|
||||||
|
$desktopDir = if ($maschinenweit) {
|
||||||
|
[Environment]::GetFolderPath("CommonDesktopDirectory")
|
||||||
|
} else {
|
||||||
|
[Environment]::GetFolderPath("Desktop")
|
||||||
|
}
|
||||||
|
$wsh = New-Object -ComObject WScript.Shell
|
||||||
|
$lnk = $wsh.CreateShortcut((Join-Path $desktopDir "Rippy Worker.lnk"))
|
||||||
|
$lnk.TargetPath = (Join-Path $ziel "start-tray.bat")
|
||||||
|
$lnk.WorkingDirectory = $ziel
|
||||||
|
$lnk.Description = "Rippy Encoding-Worker starten (Symbol neben der Uhr)"
|
||||||
|
$lnk.WindowStyle = 7
|
||||||
|
$ico = Join-Path $ziel "rippy.ico"
|
||||||
|
if (Test-Path $ico) { $lnk.IconLocation = $ico }
|
||||||
|
$lnk.Save()
|
||||||
|
Write-Host "Verknüpfung 'Rippy Worker' auf dem Desktop angelegt."
|
||||||
|
} catch {
|
||||||
|
Write-Host "HINWEIS: Desktop-Verknüpfung ging nicht ($($_.Exception.Message))." -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
Write-Host "FERTIG." -ForegroundColor Green
|
Write-Host "FERTIG." -ForegroundColor Green
|
||||||
|
Write-Host " Auf dem Desktop: Rippy Worker"
|
||||||
Write-Host " Starten (mit Tray-Symbol): $ziel\start-tray.bat"
|
Write-Host " Starten (mit Tray-Symbol): $ziel\start-tray.bat"
|
||||||
Write-Host " Starten (Konsole/Debug): $ziel\start-worker.bat"
|
Write-Host " Starten (Konsole/Debug): $ziel\start-worker.bat"
|
||||||
Write-Host " Deinstallieren: $ziel\uninstall.ps1"
|
Write-Host " Deinstallieren: $ziel\uninstall.ps1"
|
||||||
|
|||||||
@@ -22,6 +22,11 @@ COPY docker/api/ .
|
|||||||
# die Zielmaschine braucht weder git noch Docker.
|
# die Zielmaschine braucht weder git noch Docker.
|
||||||
COPY docker/worker/*.py docker/worker/requirements.txt worker_dist/
|
COPY docker/worker/*.py docker/worker/requirements.txt worker_dist/
|
||||||
COPY deploy/worker-windows/install.ps1 deploy/worker-windows/install-gui.ps1 worker_dist/
|
COPY deploy/worker-windows/install.ps1 deploy/worker-windows/install-gui.ps1 worker_dist/
|
||||||
|
# Rippy-Icon: Der Installer legt damit eine Verknüpfung auf den Desktop
|
||||||
|
# (Commander-Wunsch 26.07.2026). Ohne die Datei auf der Zielmaschine trüge die
|
||||||
|
# Verknüpfung das Standard-Batch-Symbol — und niemand fände sie zwischen den
|
||||||
|
# anderen Icons wieder.
|
||||||
|
COPY deploy/worker-windows/rippy.ico worker_dist/
|
||||||
# Vorgebaute .exe (Rippy-Icon, kein Konsolenfenster) — auf Windows via
|
# Vorgebaute .exe (Rippy-Icon, kein Konsolenfenster) — auf Windows via
|
||||||
# deploy/worker-windows/build-exe.ps1 erzeugt (Windows-.exe geht nicht von
|
# deploy/worker-windows/build-exe.ps1 erzeugt (Windows-.exe geht nicht von
|
||||||
# Linux). Nur bei GUI-Aenderungen neu bauen, nicht bei Tool-Updates.
|
# Linux). Nur bei GUI-Aenderungen neu bauen, nicht bei Tool-Updates.
|
||||||
|
|||||||
+3
-1
@@ -1608,7 +1608,9 @@ async def worker_setup_paket():
|
|||||||
for name in sorted(os.listdir("worker_dist")):
|
for name in sorted(os.listdir("worker_dist")):
|
||||||
if name.endswith(".py") and not name.startswith(("test_", "conftest")):
|
if name.endswith(".py") and not name.startswith(("test_", "conftest")):
|
||||||
z.write(os.path.join("worker_dist", name), name)
|
z.write(os.path.join("worker_dist", name), name)
|
||||||
elif name == "requirements.txt":
|
# requirements.txt für die venv, rippy.ico für die Verknüpfung
|
||||||
|
# auf dem Desktop (sonst trägt sie das Batch-Standardsymbol).
|
||||||
|
elif name in ("requirements.txt", "rippy.ico"):
|
||||||
z.write(os.path.join("worker_dist", name), name)
|
z.write(os.path.join("worker_dist", name), name)
|
||||||
return puffer.getvalue()
|
return puffer.getvalue()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user