Service: pick up app updates by self-restarting onto the new binary
Local checkpoint - NOT for public release. Ed: an update should tear down the service, update it, and restart it. It didn't - the updater has no service awareness. Current (unchanged, verified correct): the auto-updater renames the install files aside and copies the new ones in, which a running service TOLERATES (no failed swap). The old version keeps streaming; the new files sit in place. New: the service now adopts the update itself. Because it runs as SYSTEM (which has the rights the non-elevated updater lacks), a 45s timer notices when a strictly-newer RemSound.exe has landed next to it and restarts itself onto the new binary (detached PowerShell Stop-Service+Start-Service). Loop-safe: only fires on a strictly-newer on-disk version; any uncertainty (file mid-swap, unparseable version) means don't restart, and after the restart on-disk == running so it never re-triggers. Test "Service registration args" now also covers the version-comparison logic (newer => restart; same/older/missing => no restart). Gate 27/27. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
941e0df99f
commit
56dbd0b80f
@@ -682,7 +682,16 @@ internal static class SelfTest
|
||||
var fail = ServiceControl.BuildFailureArgs();
|
||||
Check(fail.StartsWith($"failure {ServiceControl.ServiceName} ") && fail.Contains("actions= restart/"),
|
||||
$"failure args must configure auto-restart (got: {fail})");
|
||||
return "sc create + failure args are well-formed";
|
||||
|
||||
// Self-update version comparison — the service restarts itself ONLY on a strictly-newer on-disk
|
||||
// version; any other case must be false so it can never loop.
|
||||
var v = new Version(5, 2, 0, 0);
|
||||
Check(ServiceUpdate.IsNewer(v, "5.3.0.0"), "a strictly-newer on-disk version must trigger a self-update");
|
||||
Check(!ServiceUpdate.IsNewer(v, "5.2.0.0"), "the same version must NOT trigger a restart (loop-safe)");
|
||||
Check(!ServiceUpdate.IsNewer(v, "5.1.0.0"), "an older on-disk version must NOT trigger a restart");
|
||||
Check(!ServiceUpdate.IsNewer(v, null) && !ServiceUpdate.IsNewer(v, "garbage") && !ServiceUpdate.IsNewer(null, "5.3"),
|
||||
"missing/unparseable versions must NOT trigger a restart");
|
||||
return "sc create + failure args well-formed; self-update comparison loop-safe";
|
||||
}
|
||||
|
||||
/// <summary>The service profile is fully isolated from the normal profile machinery: it lives in a
|
||||
|
||||
Reference in New Issue
Block a user