DF-5720 / ab_cycle.sh
#!/bin/sh # DF-5720 — one A/B experiment cycle: boot socket-serial guest, enter ddb # via root sysctl, run experiment.py <delay> <battery>, then probe whether # userland resumed (ssh + serial echo). Prints VERDICT line. # usage: ab_cycle.sh <delay_seconds> <battery> <tag> set -eu cd "$(dirname "$0")" DELAY="$1"; BATTERY="$2"; TAG="$3" ./serial_vm.sh down >/dev/null 2>&1 || true ./serial_vm.sh up >/dev/null : > /tmp/opencode/df-5720-drain.log ssh -F ../../../dfbsd-qemu/config -o BatchMode=yes dfbsd \ 'sysctl debug.enter_debugger=ddb' >/dev/null 2>&1 & SSHPID=$! sleep 6 python3 experiment.py "$DELAY" "$BATTERY" kill $SSHPID 2>/dev/null || true # probe userland: serial echo first (getty), then ssh sleep 4 python3 - <<'EOF' import socket, time s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) try: s.connect("/tmp/opencode/df-5720-ser.sock") s.sendall(b"\r\n") time.sleep(3) s.setblocking(False) try: b = s.recv(4096) print("SERIAL_ECHO=YES") except BlockingIOError: print("SERIAL_ECHO=NO") except OSError: print("SERIAL_ECHO=NOCONN") EOF if timeout 25 ssh -F ../../../dfbsd-qemu/config -o ConnectTimeout=20 \ -o BatchMode=yes dfbsd 'echo SSH_OK' 2>/dev/null | grep -q SSH_OK; then echo "SSH_OK=YES" else echo "SSH_OK=NO" fi cp /tmp/opencode/df-5720-drain.log "exp.$TAG.drain.log" 2>/dev/null || true tail -n 8 "exp.$TAG.drain.log" || true |