mirror of
https://github.com/jamesstringer90/appsandbox.git
synced 2026-10-22 11:03:15 -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).
29 lines
1.0 KiB
Python
29 lines
1.0 KiB
Python
"""
|
|
Overview: connect to the daemon and print the version, host capacity, the VM
|
|
list, and the templates. Read-only -- safe to run anytime.
|
|
|
|
python examples/list_vms.py
|
|
"""
|
|
import sys, os
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
import asb
|
|
|
|
c = asb.connect() # reads %ProgramData%\AppSandbox\host.json
|
|
|
|
v = c.version()
|
|
print("daemon: %s %s (api %s)" % (v.get("product"), v.get("version"), v.get("apiVersion")))
|
|
|
|
h = c.host()
|
|
print("host: %d cores, %d MB RAM, %d GB free | VMs using: %d cores, %d MB, %d GB"
|
|
% (h["hostCores"], h["hostRamMb"], h["freeGb"], h["vmCores"], h["vmRamMb"], h["vmHddGb"]))
|
|
|
|
print("\nVMs:")
|
|
for vm in c.list():
|
|
extra = "agent" if vm.get("agentOnline") else ""
|
|
if vm.get("sshState") == 2:
|
|
extra += " ssh:127.0.0.1:%d" % vm["sshPort"]
|
|
print(" %-16s %-8s %-11s %s" % (vm["name"], vm["osType"], vm["state"], extra))
|
|
|
|
tpls = c.templates()
|
|
print("\ntemplates:", ", ".join("%s (%s)" % (t["name"], t["osType"]) for t in tpls) or "(none)")
|