test(e2e): Debian QEMU build+boot+unlock harness and deterministic direct transport
Extend the QEMU e2e to cover the initramfs-tools backend and add a deterministic unlock transport that avoids the flaky public-Tor onion round-trip inside QEMU. - build_image_debian.sh: debootstrap Bookworm, install the real lim/configuration/initramfs-tools hooks, LUKS + cryptsetup-initramfs + dropbear-initramfs, offline onion keys, boot-ok marker; same image.env contract as build_image.sh. - config.py: QemuSpec gains os_family / unlock_command / direct_ssh_port; Debian cmdline uses root=/dev/mapper (crypttab-baked, no cryptdevice=); direct_ssh_port adds hostfwd to guest dropbear and a plain-SSH target. - harness.py: unlock_transport="direct" default, _NullNet, per-OS build script + unlock command, up-front sudo priming with keepalive. - boot_unlock.py: background delivery worker holds the SSH session open; direct vs tor target and initial delay. - test_qemu_harness_unit.py: always-on guards for the Debian/direct branches; test_qemu_unlock_e2e.py parameterized by ARCH/OS/TRANSPORT env. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -17,7 +17,7 @@ import subprocess
|
||||
import time
|
||||
from pathlib import Path
|
||||
|
||||
BOOTSTRAP_TIMEOUT = 180
|
||||
BOOTSTRAP_TIMEOUT = 300 # public Tor bootstrap can stall on slow guards
|
||||
_GUEST_HOST_ALIAS = "10.0.2.2" # QEMU user-net alias for the host's 127.0.0.1
|
||||
|
||||
|
||||
@@ -41,12 +41,21 @@ class PublicTorClient:
|
||||
empty_torrc.write_text("")
|
||||
self._process = subprocess.Popen(
|
||||
[
|
||||
"tor", "-f", str(empty_torrc),
|
||||
"--SocksPort", str(self.socks_port),
|
||||
"--DataDirectory", str(self._data),
|
||||
"--Log", f"notice file {self._log}",
|
||||
"tor",
|
||||
"-f",
|
||||
str(empty_torrc),
|
||||
"--SocksPort",
|
||||
str(self.socks_port),
|
||||
"--DataDirectory",
|
||||
str(self._data),
|
||||
"--Log",
|
||||
f"notice file {self._log}",
|
||||
# HS-level log so onion descriptor fetch / rendezvous is visible.
|
||||
"--Log",
|
||||
f"[rend]info file {self._work_dir / 'tor-client-hs.log'}",
|
||||
],
|
||||
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
|
||||
stdout=subprocess.DEVNULL,
|
||||
stderr=subprocess.DEVNULL,
|
||||
)
|
||||
_wait_for_bootstrap(self._log, self._process)
|
||||
|
||||
@@ -75,7 +84,8 @@ class ChutneyNetwork:
|
||||
def _run(self, *args: str) -> None:
|
||||
subprocess.run(
|
||||
[str(self._chutney / "chutney"), *args, self._network],
|
||||
cwd=self._chutney, check=True,
|
||||
cwd=self._chutney,
|
||||
check=True,
|
||||
)
|
||||
|
||||
def start(self) -> None:
|
||||
|
||||
Reference in New Issue
Block a user