16 KiB
Create sister script for sheepit (2025-11-03 19:27Z)
User (2025-11-03 19:27Z)
@unified_flamenco_launcher.ps1 (1-674) remember UFL? let's make a sister script that runs sheepit on each system. I have sheepit-autoupdate.exe saved to my desktop on each system (except for i9kf) already. In future, I'll probably do something with jarfiles, but for now, we can just run that executable.
Agent (model gpt-5-codex, mode Agent)
Thought Process
Designing a concise SheepIt launcher script Finalizing remote launch command and approachI’m crafting the remote PowerShell snippet to start SheepIt asynchronously so the SSH session can exit immediately while SheepIt keeps running remotely. This lets the local script launch multiple workers quickly without waiting. I’m also planning how to flag disabled workers like i9kf and preparing to confirm where to add the new script file.
Tool use: **list_directory** • Listed directory undefined • **0** results
No results found
Thought Process
Designing unified SheepIt launcher script Finalizing main interaction loop and executionI’m wrapping up the main loop with clear menu options and proper input handling, making sure commands execute with correct quoting and spacing, while preserving user feedback and smooth flow between actions.
Tool use: **apply_patch** • Apply patch for undefined
*** Begin Patch
*** Add File: C:\Users\Nathan\Desktop\flamenco\unified_sheepit_launcher.ps1
+function Show-Header {
+ Clear-Host
+ Write-Host "====================================" -ForegroundColor Cyan
+ Write-Host " UNIFIED SHEEPIT LAUNCHER" -ForegroundColor Cyan
+ Write-Host "====================================" -ForegroundColor Cyan
+ Write-Host
+}
+
+$defaultSheepItPath = "C:\Users\Nathan\Desktop\sheepit-autoupdate.exe"
+
+$workers = @(
+ @{ ID = 1; Name = "i9kf"; SSHArgs = "-t i9kf"; SheepItPath = $defaultSheepItPath; Enabled = $false },
+ @{ ID = 2; Name = "blender-boss"; SSHArgs = "-t blender-boss"; SheepItPath = $defaultSheepItPath; Enabled = $true },
+ @{ ID = 3; Name = "max"; SSHArgs = "-t max"; SheepItPath = $defaultSheepItPath; Enabled = $true },
+ @{ ID = 4; Name = "masterbox"; SSHArgs = "-t masterbox"; SheepItPath = $defaultSheepItPath; Enabled = $true },
+ @{ ID = 5; Name = "echo"; SSHArgs = "-t echo"; SheepItPath = $defaultSheepItPath; Enabled = $true },
+ @{ ID = 6; Name = "i9-13ks"; SSHArgs = "-t -p 22146 i9-13ks"; SheepItPath = $defaultSheepItPath; Enabled = $true }
+)
+
+function Get-RemoteSheepItCommand {
+ param([string]$ExecutablePath)
+
+@"
+`$exe = "$ExecutablePath"
+if (-not (Test-Path `$exe)) {
+ Write-Host "SheepIt launcher not found at `$exe" -ForegroundColor Red
+ exit 1
+}
+
+`$dir = Split-Path `$exe
+Write-Host "Launching SheepIt at `$exe" -ForegroundColor Cyan
+`$proc = Start-Process -FilePath `$exe -WorkingDirectory `$dir -WindowStyle Minimized -PassThru
+Write-Host "SheepIt started (PID: `$($proc.Id))." -ForegroundColor Green
+exit 0
+"@
+}
+
+function Start-SheepItWorker {
+ param([object]$Worker)
+
+ if (-not $Worker.Enabled) {
+ Write-Host "$($Worker.Name) does not have SheepIt configured yet." -ForegroundColor Yellow
+ return
+ }
+
+ $remoteCommand = Get-RemoteSheepItCommand -ExecutablePath $Worker.SheepItPath
+ $encoded = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($remoteCommand))
+ $ssh = "ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=30 $($Worker.SSHArgs) \"powershell -NoLogo -NoProfile -EncodedCommand $encoded\""
+
+ Write-Host "Connecting to $($Worker.Name)..." -ForegroundColor Cyan
+ try {
+ Invoke-Expression $ssh
+ $exitCode = $LASTEXITCODE
+
+ if ($exitCode -eq 0) {
+ Write-Host "SheepIt launched on $($Worker.Name)." -ForegroundColor Green
+ } else {
+ Write-Host "Launch on $($Worker.Name) exited with $exitCode." -ForegroundColor Red
+ }
+ }
+ catch {
+ Write-Host "Connection to $($Worker.Name) failed: $($_.Exception.Message)" -ForegroundColor Red
+ }
+}
+
+function Start-AllSheepIt {
+ $targets = $workers | Where-Object { $_.Enabled }
+
+ if (-not $targets) {
+ Write-Host "No systems are ready for SheepIt." -ForegroundColor Yellow
+ return
+ }
+
+ foreach ($worker in $targets) {
+ Start-SheepItWorker -Worker $worker
+ Start-Sleep -Seconds 1
+ }
+}
+
+function Prompt-For-Worker {
+ while ($true) {
+ Show-Header
+ Write-Host "Select a system:" -ForegroundColor Magenta
+
+ foreach ($worker in $workers) {
+ $status = if ($worker.Enabled) { "ready" } else { "missing exe" }
+ $color = if ($worker.Enabled) { "Green" } else { "DarkYellow" }
+ Write-Host ("{0}. {1} ({2})" -f $worker.ID, $worker.Name, $status) -ForegroundColor $color
+ }
+
+ Write-Host "B. Back" -ForegroundColor Yellow
+ $selection = Read-Host "Choose system"
+
+ if ($selection -match '^[Bb]$') {
+ return
+ }
+
+ if ($selection -match '^\d+$') {
+ $id = [int]$selection
+ $worker = $workers | Where-Object { $_.ID -eq $id }
+
+ if ($worker) {
+ Start-SheepItWorker -Worker $worker
+ Write-Host
+ Read-Host "Press Enter to return to the main menu" | Out-Null
+ return
+ }
+
+ Write-Host "Unknown selection." -ForegroundColor Red
+ Start-Sleep -Seconds 1
+ }
+ else {
+ Write-Host "Invalid input." -ForegroundColor Red
+ Start-Sleep -Seconds 1
+ }
+ }
+}
+
+while ($true) {
+ Show-Header
+ Write-Host "Main Menu:" -ForegroundColor Magenta
+ Write-Host "1. Launch SheepIt on a single system" -ForegroundColor Yellow
+ Write-Host "2. Launch SheepIt on all ready systems" -ForegroundColor Yellow
+ Write-Host "3. Exit" -ForegroundColor Yellow
+
+ $choice = Read-Host "Select option (1-3)"
+
+ switch ($choice) {
+ '1' { Prompt-For-Worker }
+ '2' {
+ Start-AllSheepIt
+ Write-Host
+ Read-Host "Press Enter to return to the main menu" | Out-Null
+ }
+ '3' { break }
+ default {
+ Write-Host "Invalid selection." -ForegroundColor Red
+ Start-Sleep -Seconds 1
+ }
+ }
+}
+
+Write-Host "`nExiting SheepIt launcher." -ForegroundColor Cyan
*** End Patch
Thought Process
Considering lint checks after editsTool use: **read_lints** • Read lints for 1 file
Lint paths:
unified_sheepit_launcher.ps1
Lint results
No lint errors found
Thought Process
Preparing final message summaryTool use: **read_file** • Read file: unified_sheepit_launcher.ps1
Thought Process
Preparing final message with code snippetI'll include a code snippet from the remote command in the final message using the proper block format with line numbers and filepath, alongside a clear summary, notes, and next steps that describe how to run the new script and handle the executable’s status on remote workers.
Summary
- Added
unified_sheepit_launcher.ps1, a concise sister utility that triggerssheepit-autoupdate.exeon the configured render nodes and mirrors the original menu-driven flow.
Notes
i9kfis marked unavailable until its copy ofsheepit-autoupdate.exeexists; the launcher skips it safely.- Remote execution checks for the executable before starting it and reports the outcome for each system.
`$exe = "$ExecutablePath"
if (-not (Test-Path `$exe)) {
Write-Host "SheepIt launcher not found at `$exe" -ForegroundColor Red
exit 1
}
`$dir = Split-Path `$exe
Write-Host "Launching SheepIt at `$exe" -ForegroundColor Cyan
`$proc = Start-Process -FilePath `$exe -WorkingDirectory `$dir -WindowStyle Minimized -PassThru
Write-Host "SheepIt started (PID: `$($proc.Id))." -ForegroundColor Green
exit 0
Next Steps
- Run
.\unified_sheepit_launcher.ps1and choose option 1 or 2 to launch SheepIt; flip theEnabledflag fori9kfonce its executable is in place.
User (2025-11-03 19:27Z)
[{
"resource": "/C:/Users/Nathan/Desktop/flamenco/unified_sheepit_launcher.ps1",
"owner": "_generated_diagnostic_collection_name_#3",
"severity": 8,
"message": "Unexpected token 'powershell' in expression or statement.",
"source": "PowerShell",
"startLineNumber": 48,
"startColumn": 90,
"endLineNumber": 48,
"endColumn": 100,
"modelVersionId": 3
},{
"resource": "/C:/Users/Nathan/Desktop/flamenco/unified_sheepit_launcher.ps1",
"owner": "_generated_diagnostic_collection_name_#3",
"code": "PSUseApprovedVerbs",
"severity": 4,
"message": "The cmdlet 'Prompt-For-Worker' uses an unapproved verb.",
"source": "PSScriptAnalyzer",
"startLineNumber": 80,
"startColumn": 10,
"endLineNumber": 80,
"endColumn": 27,
"modelVersionId": 3
}]
Agent (model gpt-5-codex, mode Agent)
Thought Process
Correcting PowerShell quoting and renaming functionTool use: **apply_patch** • Apply patch for undefined
*** Begin Patch
*** Update File: C:\Users\Nathan\Desktop\flamenco\unified_sheepit_launcher.ps1
@@
- $ssh = "ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=30 $($Worker.SSHArgs) \"powershell -NoLogo -NoProfile -EncodedCommand $encoded\""
+ $ssh = "ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=30 $($Worker.SSHArgs) `"powershell -NoLogo -NoProfile -EncodedCommand $encoded`""
@@
-function Prompt-For-Worker {
+function Select-SheepItWorker {
@@
- '1' { Prompt-For-Worker }
+ '1' { Select-SheepItWorker }
*** End Patch
Thought Process
Reading lint configurationsTool use: **read_lints** • Read lints for 1 file
Lint paths:
unified_sheepit_launcher.ps1
Lint results
No lint errors found
Tool use: **read_file** • Read file: unified_sheepit_launcher.ps1
Thought Process
Summarizing code fixes and verificationI’m putting together a final message that highlights the two issues fixed: quoting adjustments and renaming the Select-SheepItWorker function. I'll mention that linting checks and PSScriptAnalyzer ran with no errors, confirming the fixes resolved the prior problems. Including a relevant snippet from unified_sheepit_launcher.ps1 will clarify the quoting change. The message will have a brief bullet summary while keeping things concise and clear.
- Escaped the embedded
powershellcommand inside the SSH string with backticked quotes so the parser sees one continuous string. - Renamed
Prompt-For-WorkertoSelect-SheepItWorker, updating its call site to satisfyPSScriptAnalyzer’s approved verb rule.
$encoded = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($remoteCommand))
$ssh = "ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=30 $($Worker.SSHArgs) `"powershell -NoLogo -NoProfile -EncodedCommand $encoded`""
Ran the analyzer again—no remaining diagnostics.
User (2025-11-03 19:27Z)
make a batch too
Agent (model gpt-5-codex, mode Agent)
Thought Process
Reviewing existing batch file for patternTool use: **read_file** • Read file: unified_flamenco_launcher.bat
Thought Process
Creating batch script for PS launcherTool use: **apply_patch** • Apply patch for undefined
*** Begin Patch
*** Add File: C:\Users\Nathan\Desktop\flamenco\unified_sheepit_launcher.bat
+@echo off
+title Unified SheepIt Launcher
+echo Starting Unified SheepIt Launcher...
+powershell -ExecutionPolicy Bypass -File "%~dp0unified_sheepit_launcher.ps1"
*** End Patch
Thought Process
Considering linting after editsTool use: **read_lints** • Read lints for 1 file
Lint paths:
unified_sheepit_launcher.bat
Lint results
No lint errors found
Thought Process
Preparing final responseAdded unified_sheepit_launcher.bat so you can kick off the SheepIt PowerShell launcher directly from a batch file; it mirrors the Flamenco wrapper and calls unified_sheepit_launcher.ps1 with ExecutionPolicy Bypass. To use it, run unified_sheepit_launcher.bat from the flamenco folder.
User (2025-11-03 19:27Z)
====================================
UNIFIED SHEEPIT LAUNCHER
====================================
Select a system:
-
i9kf (missing exe)
-
blender-boss (ready)
-
max (ready)
-
masterbox (ready)
-
echo (ready)
-
i9-13ks (ready)
B. Back
Choose system: 4
Connecting to masterbox...
Launching SheepIt at C:\Users\Nathan\Desktop\sheepit-autoupdate.exe
.Id : The term '.Id' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the
spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:10 char:37
-
Write-Host "SheepIt started (PID: $(.Id))." -ForegroundColor Green
-
~~~-
CategoryInfo : ObjectNotFound: (.Id:String) [], CommandNotFoundException
-
FullyQualifiedErrorId : CommandNotFoundException
-
SheepIt started (PID: ).
Connection to masterbox closed.
SheepIt launched on masterbox.
Press Enter to return to the main menu:
Agent (model gpt-5-codex, mode Agent)