Files
2026-09-21 13:41:40 +09:00

29 lines
2.2 KiB
Python

#!/usr/bin/env python3
"""Disposable local Ubuntu validation VM helper; no host package installation."""
import os
from pathlib import Path
import os,sys,subprocess,shutil,io,json
r=Path(os.environ.get('DOCVIEW_VM_WORK', 'build-ubuntu-vm')).resolve()
sys.path.insert(0,str(r/'tools/python'))
import pycdlib
key=r/'private/id_ed25519'
if not key.exists():subprocess.run(['ssh-keygen','-q','-t','ed25519','-N','','-C','docview-ubuntu-vm-local','-f',str(key)],check=True)
os.chmod(key,0o600)
public=key.with_suffix('.pub').read_text().strip()
userdata='#cloud-config\nhostname: docview-ubuntu2404\nmanage_etc_hosts: true\nssh_pwauth: false\ndisable_root: true\nssh_quiet_keygen: true\nno_ssh_fingerprints: true\nssh_publish_hostkeys:\n enabled: false\nusers:\n - name: docview\n groups: [adm, sudo]\n shell: /bin/bash\n lock_passwd: true\n sudo: ALL=(ALL) NOPASSWD:ALL\n ssh_authorized_keys:\n - '+public+'\n'
userdata += '\nssh:\n emit_keys_to_console: false\nruncmd:\n - [sh, -c, \"systemctl restart ssh.service; echo DOCVIEW_SSH_DIAG; ip -4 addr show; ss -ltn; systemctl --no-pager status ssh.service; journalctl -u ssh.service -n 20 --no-pager\"]\n'
metadata='instance-id: docview-ubuntu2404-20260919b\nlocal-hostname: docview-ubuntu2404\n'
iso=pycdlib.PyCdlib();iso.new(interchange_level=3,joliet=3,rock_ridge='1.09',vol_ident='CIDATA')
for data,short,long in [(userdata,'USER_DAT.;1','user-data'),(metadata,'META_DAT.;1','meta-data')]:
b=data.encode();iso.add_fp(io.BytesIO(b),len(b),iso_path='/'+short,rr_name=long,joliet_path='/'+long)
iso.write(str(r/'private/seed.iso'));iso.close();os.chmod(r/'private/seed.iso',0o600)
qimg=str(r/'tools/usr/bin/qemu-img')
subprocess.run([qimg,'--version'],check=True)
base=r/'downloads/noble-server-cloudimg-amd64.img';base.chmod(0o444)
overlay=r/'guest.qcow2'
if not overlay.exists():subprocess.run([qimg,'create','-f','qcow2','-F','qcow2','-b',str(base),str(overlay),'24G'],check=True)
subprocess.run([qimg,'check',str(overlay)],check=True)
vars=r/'OVMF_VARS.4m.fd'
if not vars.exists():shutil.copyfile('/usr/share/edk2-ovmf/x64/OVMF_VARS.4m.fd',vars)
print('Created dedicated SSH key, seed ISO and 24 GiB qcow2 overlay; no key contents logged.')