fix opt 6 exit not working

also continue fix attempt on sheepit not starting
This commit is contained in:
Nathan
2025-12-02 12:07:26 -07:00
parent 18683b4ad0
commit e568e02cdf
4 changed files with 5209 additions and 1532 deletions

File diff suppressed because one or more lines are too long

View File

@@ -88,7 +88,16 @@ try {
continue continue
} }
if ($input.Trim().ToLower() -eq 'detach') { $normalized = $input.Trim()
if ($normalized.StartsWith(':')) {
$normalized = $normalized.TrimStart(':').Trim()
}
if ($normalized.Length -eq 0) {
continue
}
if ($normalized.ToLowerInvariant() -eq 'detach') {
break break
} }
@@ -97,9 +106,9 @@ try {
} }
finally { finally {
if ($logJob) { if ($logJob) {
Stop-Job -Job $logJob -Force -ErrorAction SilentlyContinue Stop-Job -Job $logJob -ErrorAction SilentlyContinue
Receive-Job -Job $logJob -ErrorAction SilentlyContinue | Out-Null Receive-Job -Job $logJob -ErrorAction SilentlyContinue | Out-Null
Remove-Job -Job $logJob -Force -ErrorAction SilentlyContinue Remove-Job -Job $logJob -ErrorAction SilentlyContinue
} }
Write-Host "Detached from worker $WorkerName." -ForegroundColor Cyan Write-Host "Detached from worker $WorkerName." -ForegroundColor Cyan

View File

@@ -5,9 +5,10 @@ param(
[Parameter(Mandatory = $true)] [Parameter(Mandatory = $true)]
[string]$WorkerType, [string]$WorkerType,
[Parameter(Mandatory = $true)]
[string]$PayloadBase64, [string]$PayloadBase64,
[string]$PayloadBase64Path,
[string]$DataRoot = (Join-Path ([Environment]::GetFolderPath('LocalApplicationData')) 'UnifiedWorkers'), [string]$DataRoot = (Join-Path ([Environment]::GetFolderPath('LocalApplicationData')) 'UnifiedWorkers'),
[int]$MaxRestarts = 5, [int]$MaxRestarts = 5,
@@ -16,6 +17,7 @@ param(
) )
$ErrorActionPreference = 'Stop' $ErrorActionPreference = 'Stop'
[System.Management.Automation.Runspaces.Runspace]::DefaultRunspace = $Host.Runspace
# region Path setup # region Path setup
$workerRoot = Join-Path -Path $DataRoot -ChildPath $WorkerType $workerRoot = Join-Path -Path $DataRoot -ChildPath $WorkerType
@@ -33,11 +35,95 @@ $commandPath = Join-Path -Path $stateRoot -ChildPath 'commands.txt'
$payloadPath = Join-Path -Path $stateRoot -ChildPath "payload.ps1" $payloadPath = Join-Path -Path $stateRoot -ChildPath "payload.ps1"
# endregion # endregion
# region Helpers # region Logging
$logStream = [System.IO.FileStream]::new(
$logPath,
[System.IO.FileMode]::Append,
[System.IO.FileAccess]::Write,
[System.IO.FileShare]::ReadWrite
)
$logWriter = [System.IO.StreamWriter]::new($logStream, [System.Text.Encoding]::UTF8)
$logWriter.AutoFlush = $true
if (-not ("UnifiedWorkers.WorkerLogSink" -as [type])) {
Add-Type -Namespace UnifiedWorkers -Name WorkerLogSink -MemberDefinition @"
using System;
using System.Diagnostics;
using System.IO;
public sealed class WorkerLogSink
{
private readonly TextWriter _writer;
private readonly string _prefix;
private readonly object _sync = new object();
public WorkerLogSink(TextWriter writer, string prefix)
{
if (writer == null)
{
throw new ArgumentNullException(\"writer\");
}
if (prefix == null)
{
throw new ArgumentNullException(\"prefix\");
}
_writer = writer;
_prefix = prefix;
}
public void OnData(object sender, DataReceivedEventArgs e)
{
if (e == null || string.IsNullOrEmpty(e.Data))
{
return;
}
lock (_sync)
{
var timestamp = DateTime.UtcNow.ToString("u");
var line = string.Format("[{0} {1}] {2}", _prefix, timestamp, e.Data);
_writer.WriteLine(line);
_writer.Flush();
}
}
}
"@
}
function Write-LogLine {
param(
[string]$Prefix,
[string]$Message
)
if (-not $logWriter) { return }
$timestamp = (Get-Date).ToString('u')
$logWriter.WriteLine("[{0} {1}] {2}" -f $Prefix, $timestamp, $Message)
}
function Write-ControllerLog { function Write-ControllerLog {
param([string]$Message) param([string]$Message)
$timestamp = (Get-Date).ToString('u') Write-LogLine -Prefix 'CTRL' -Message $Message
Add-Content -Path $logPath -Value "[CTRL $timestamp] $Message" -Encoding UTF8 }
# endregion
# region Helpers
function Resolve-PayloadBase64 {
if ($PayloadBase64) {
return $PayloadBase64
}
if ($PayloadBase64Path) {
if (-not (Test-Path $PayloadBase64Path)) {
throw "Payload file '$PayloadBase64Path' not found."
}
return (Get-Content -Path $PayloadBase64Path -Raw)
}
throw "No payload data provided to controller."
} }
function Write-Metadata { function Write-Metadata {
@@ -85,9 +171,12 @@ function Get-PendingCommands {
# record initial state before launching worker # record initial state before launching worker
Write-Metadata -Status 'initializing' -WorkerPid $null -ControllerPid $PID -Restarts 0 Write-Metadata -Status 'initializing' -WorkerPid $null -ControllerPid $PID -Restarts 0
$resolvedPayloadBase64 = Resolve-PayloadBase64
$PayloadBase64 = $resolvedPayloadBase64
try { try {
# Write payload script to disk # Write payload script to disk
$payloadBytes = [Convert]::FromBase64String($PayloadBase64) $payloadBytes = [Convert]::FromBase64String($resolvedPayloadBase64)
[IO.File]::WriteAllBytes($payloadPath, $payloadBytes) [IO.File]::WriteAllBytes($payloadPath, $payloadBytes)
Write-ControllerLog "Payload written to $payloadPath" Write-ControllerLog "Payload written to $payloadPath"
} }
@@ -128,23 +217,10 @@ while ($restartCount -le $MaxRestarts) {
Write-ControllerLog "Worker process started with PID $($workerProcess.Id)" Write-ControllerLog "Worker process started with PID $($workerProcess.Id)"
Write-Metadata -Status 'running' -WorkerPid $workerProcess.Id -ControllerPid $controllerPid -Restarts $restartCount Write-Metadata -Status 'running' -WorkerPid $workerProcess.Id -ControllerPid $controllerPid -Restarts $restartCount
$logWriter = [System.IO.StreamWriter]::new($logPath, $true, [System.Text.Encoding]::UTF8) $stdoutSink = [UnifiedWorkers.WorkerLogSink]::new($logWriter, 'OUT')
$logWriter.AutoFlush = $true $stderrSink = [UnifiedWorkers.WorkerLogSink]::new($logWriter, 'ERR')
$outputHandler = [System.Diagnostics.DataReceivedEventHandler]$stdoutSink.OnData
$outputHandler = [System.Diagnostics.DataReceivedEventHandler]{ $errorHandler = [System.Diagnostics.DataReceivedEventHandler]$stderrSink.OnData
param($s, $e)
if ($e.Data) {
$ts = (Get-Date).ToString('u')
$logWriter.WriteLine("[OUT $ts] $($e.Data)")
}
}
$errorHandler = [System.Diagnostics.DataReceivedEventHandler]{
param($s, $e)
if ($e.Data) {
$ts = (Get-Date).ToString('u')
$logWriter.WriteLine("[ERR $ts] $($e.Data)")
}
}
$workerProcess.add_OutputDataReceived($outputHandler) $workerProcess.add_OutputDataReceived($outputHandler)
$workerProcess.add_ErrorDataReceived($errorHandler) $workerProcess.add_ErrorDataReceived($errorHandler)
@@ -199,3 +275,10 @@ while ($restartCount -le $MaxRestarts) {
Write-Metadata -Status 'inactive' -WorkerPid $null -ControllerPid $controllerPid -Restarts $restartCount Write-Metadata -Status 'inactive' -WorkerPid $null -ControllerPid $controllerPid -Restarts $restartCount
Write-ControllerLog "Controller exiting." Write-ControllerLog "Controller exiting."
if ($logWriter) {
$logWriter.Dispose()
}
if ($logStream) {
$logStream.Dispose()
}

View File

@@ -402,8 +402,11 @@ New-Item -ItemType Directory -Path `$logsRoot -Force | Out-Null
New-Item -ItemType Directory -Path `$stateRoot -Force | Out-Null New-Item -ItemType Directory -Path `$stateRoot -Force | Out-Null
`$logPath = Join-Path `$logsRoot 'worker.log' `$logPath = Join-Path `$logsRoot 'worker.log'
`$commandPath = Join-Path `$stateRoot 'commands.txt' `$commandPath = Join-Path `$stateRoot 'commands.txt'
`$payloadPath = Join-Path `$stateRoot 'payload.ps1'
`$payloadBase64Path = Join-Path `$stateRoot 'payload.b64'
if (-not (Test-Path `$logPath)) { New-Item -Path `$logPath -ItemType File -Force | Out-Null } if (-not (Test-Path `$logPath)) { New-Item -Path `$logPath -ItemType File -Force | Out-Null }
if (-not (Test-Path `$commandPath)) { New-Item -Path `$commandPath -ItemType File -Force | Out-Null } if (-not (Test-Path `$commandPath)) { New-Item -Path `$commandPath -ItemType File -Force | Out-Null }
[IO.File]::WriteAllText(`$payloadBase64Path, `$payloadBase64, [System.Text.Encoding]::UTF8)
`$metaPath = Join-Path `$instanceRoot 'state\worker-info.json' `$metaPath = Join-Path `$instanceRoot 'state\worker-info.json'
`$controllerPath = Join-Path `$dataRoot 'controller.ps1' `$controllerPath = Join-Path `$dataRoot 'controller.ps1'
@@ -437,7 +440,7 @@ if (`$shouldStart) {
LastExitCode = `$null LastExitCode = `$null
LogPath = `$logPath LogPath = `$logPath
CommandPath = `$commandPath CommandPath = `$commandPath
PayloadPath = `$null PayloadPath = `$payloadPath
UpdatedAtUtc = (Get-Date).ToUniversalTime() UpdatedAtUtc = (Get-Date).ToUniversalTime()
} | ConvertTo-Json -Depth 5 } | ConvertTo-Json -Depth 5
`$initialMeta | Set-Content -Path `$metaPath -Encoding UTF8 `$initialMeta | Set-Content -Path `$metaPath -Encoding UTF8
@@ -455,7 +458,7 @@ if (`$shouldStart) {
'-File',"`$controllerPath", '-File',"`$controllerPath",
'-WorkerName',"`$workerName", '-WorkerName',"`$workerName",
'-WorkerType',"`$workerType", '-WorkerType',"`$workerType",
'-PayloadBase64',"`$payloadBase64" '-PayloadBase64Path',"`$payloadBase64Path"
) )
Start-Process -FilePath `$psExe -ArgumentList `$controllerArgs -WindowStyle Hidden | Out-Null Start-Process -FilePath `$psExe -ArgumentList `$controllerArgs -WindowStyle Hidden | Out-Null
@@ -767,7 +770,11 @@ while ($true) {
Write-Host "5. Quit all workers" -ForegroundColor Yellow Write-Host "5. Quit all workers" -ForegroundColor Yellow
Write-Host "6. Exit" -ForegroundColor Yellow Write-Host "6. Exit" -ForegroundColor Yellow
$choice = Read-Host "Select option (1-3)" $choice = Read-Host "Select option (1-6)"
if ($choice -eq '6') {
break
}
switch ($choice) { switch ($choice) {
'1' { Select-SheepItWorker } '1' { Select-SheepItWorker }
@@ -775,7 +782,6 @@ while ($true) {
'3' { Send-SheepItCommandAll -CommandText 'pause' } '3' { Send-SheepItCommandAll -CommandText 'pause' }
'4' { Send-SheepItCommandAll -CommandText 'resume' } '4' { Send-SheepItCommandAll -CommandText 'resume' }
'5' { Send-SheepItCommandAll -CommandText 'quit' } '5' { Send-SheepItCommandAll -CommandText 'quit' }
'6' { break }
default { default {
Write-Host "Invalid selection." -ForegroundColor Red Write-Host "Invalid selection." -ForegroundColor Red
Start-Sleep -Seconds 1 Start-Sleep -Seconds 1