initial commit
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
#!/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.')
|
||||
Reference in New Issue
Block a user