mirror of
https://github.com/jamesstringer90/appsandbox.git
synced 2026-10-21 10:40:25 -05:00
Headless mode: `appsandbox.exe --headless` runs a single-owner daemon that hosts the core over a loopback HTTP/JSON API (http.sys) with a host.json discovery file. A dependency-free Python SDK, examples, and a self-contained regression suite live under tools/headless-api/ (PLAN.md = design rationale). The API mirrors the GUI: create/start/shutdown/stop/delete/edit, snapshots and branches (incl. base branches via the new asb_snap_base_branch_count), templates, sshInfo, an SSE /v1/events stream, GUI-mirrored input validation, a startup fail-fast (admin / Win11 build / VirtualMachinePlatform), and a single-instance mutex shared with the GUI so only one of GUI/headless runs at a time. SSH key deploy: sshDeployKey (requires sshEnabled) has the core generate an AppSandbox ed25519 keypair once and the guest agent write the public key into authorized_keys -- Windows administrators_authorized_keys (+ ACL), Linux/macOS ~/.ssh -- reporting a new ssh_key_deployed status (sshState 4). The GUI SSH button and the SDK use the key for password-less login. Verified end-to-end on Windows. The Linux guest builds its agent/driver source from this branch's GitHub repo; asb_core.c points the prefetch at "headless-api" (revert to "main" before merge, see PLAN.md).
26 lines
777 B
Python
26 lines
777 B
Python
"""Stop a VM. Usage: python stop_vm.py <name> [--force]
|
|
|
|
Default is a graceful ACPI shutdown (the guest powers itself off); --force
|
|
hard-stops it (equivalent to pulling the plug).
|
|
"""
|
|
import sys, os
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
import asb
|
|
|
|
args = [a for a in sys.argv[1:] if not a.startswith("-")]
|
|
if not args:
|
|
sys.exit("usage: python stop_vm.py <name> [--force]")
|
|
name = args[0]
|
|
force = "--force" in sys.argv
|
|
c = asb.connect()
|
|
|
|
if force:
|
|
print("force stop ->", c.stop(name))
|
|
timeout = 60
|
|
else:
|
|
print("graceful shutdown ->", c.shutdown(name))
|
|
timeout = 600 # a graceful guest shutdown (esp. Windows) can take minutes
|
|
|
|
s = c.wait(name, "stopped", timeout=timeout, interval=2)
|
|
print("state:", s["state"])
|