Files
docview/tests/ubuntu_vm/probe_guest.py
T
2026-09-21 13:41:40 +09:00

15 lines
2.0 KiB
Python

#!/usr/bin/env python3
"""Disposable local Ubuntu validation VM helper; no host package installation."""
import os
from pathlib import Path
import subprocess,json,time
r=Path(os.environ.get('DOCVIEW_VM_WORK', 'build-ubuntu-vm')).resolve()
ssh=['ssh','-i',str(r/'private/id_ed25519'),'-p','22224','-o','IdentitiesOnly=yes','-o','BatchMode=yes','-o','PasswordAuthentication=no','-o','StrictHostKeyChecking=accept-new','-o','UserKnownHostsFile='+str(r/'private/known_hosts'),'-o','ConnectTimeout=3','[email protected]']
probe='import subprocess,json,pathlib,ctypes,platform,os\nlibc=ctypes.CDLL(None,use_errno=True);abi=libc.syscall(444,0,0,1)\nresult={\'osRelease\':pathlib.Path(\'/etc/os-release\').read_text(),\'uname\':platform.uname()._asdict(),\'uid\':os.getuid(),\'landlockABI\':abi,\'landlockErrno\':ctypes.get_errno()}\ncommands={\'lsm\':[\'sudo\',\'cat\',\'/sys/kernel/security/lsm\'],\'kernelConfig\':[\'bash\',\'-c\',\'grep -E "^CONFIG_(SECURITY_LANDLOCK|SECCOMP|SECCOMP_FILTER|USER_NS|SECURITY_APPARMOR)=" /boot/config-$(uname -r)\'],\'apparmor\':[\'sudo\',\'aa-status\',\'--json\'],\'sysctls\':[\'sysctl\',\'kernel.unprivileged_userns_clone\',\'kernel.apparmor_restrict_unprivileged_userns\'],\'unprivilegedUserNamespace\':[\'unshare\',\'--user\',\'--map-root-user\',\'true\'],\'disk\':[\'df\',\'-h\',\'/\'],\'cloudInit\':[\'cloud-init\',\'status\']}\nfor k,v in commands.items():\n p=subprocess.run(v,capture_output=True,text=True);result[k]={\'command\':v,\'exitCode\':p.returncode,\'stdout\':p.stdout,\'stderr\':p.stderr}\nprint(json.dumps(result,indent=2))\n'
for attempt in range(10):
p=subprocess.run(ssh+['python3','-'],input=probe,capture_output=True,text=True)
if p.returncode==0:
(r/'metadata/guest-probe.json').write_text(p.stdout);(r/'logs/ssh-probe.txt').write_text(p.stderr);j=json.loads(p.stdout);print('Guest ready:',j['uname']['release'],'Landlock ABI',j['landlockABI'],'unprivileged namespace exit',j['unprivilegedUserNamespace']['exitCode']);break
time.sleep(2)
else:print(p.stderr);raise SystemExit(p.returncode)