#!/bin/sh set -eu repo_root=${PROJECT_ROOT:-$(pwd)} os_template=${OS_TEMPLATE:-$repo_root/tests/system/phase14-native-split-pid1-operating-system.scm.in} system_name=${SYSTEM_NAME:-phase14-operating-system} disk_capacity=${DISK_CAPACITY:-8g} root_size=${ROOT_SIZE:-6g} metadata_target=${METADATA_OUT:-} cleanup=0 if [ -n "${WORKDIR:-}" ]; then workdir=$WORKDIR mkdir -p "$workdir" else workdir=$(mktemp -d /tmp/fruix-phase14-native-split-qemu.XXXXXX) cleanup=1 fi if [ "${KEEP_WORKDIR:-0}" -eq 1 ]; then cleanup=0 fi inner_metadata=$workdir/phase14-native-split-qemu-inner-metadata.txt metadata_file=$workdir/phase14-native-split-qemu-metadata.txt cleanup_workdir() { if [ "$cleanup" -eq 1 ]; then rm -rf "$workdir" 2>/dev/null || sudo rm -rf "$workdir" fi } trap cleanup_workdir EXIT INT TERM KEEP_WORKDIR=1 WORKDIR="$workdir/inner" METADATA_OUT="$inner_metadata" \ OS_TEMPLATE="$os_template" SYSTEM_NAME="$system_name" DISK_CAPACITY="$disk_capacity" ROOT_SIZE="$root_size" \ "$repo_root/tests/system/run-phase11-shepherd-pid1-qemu.sh" phase8_metadata=$(sed -n 's/^phase8_metadata=//p' "$inner_metadata") closure_path=$(sed -n 's/^closure_path=//p' "$inner_metadata") closure_base=$(sed -n 's/^closure_base=//p' "$inner_metadata") serial_log=$(sed -n 's/^serial_log=//p' "$inner_metadata") ssh_port=$(sed -n 's/^ssh_port=//p' "$inner_metadata") shepherd_pid=$(sed -n 's/^shepherd_pid=//p' "$inner_metadata") sshd_status=$(sed -n 's/^sshd_status=//p' "$inner_metadata") activate_log=$(sed -n 's/^activate_log=//p' "$inner_metadata") native_base_store_count=$(sed -n 's/^native_base_store_count=//p' "$phase8_metadata") native_base_stores=$(sed -n 's/^native_base_stores=//p' "$phase8_metadata") host_base_store_count=$(sed -n 's/^host_base_store_count=//p' "$phase8_metadata") host_base_stores=$(sed -n 's/^host_base_stores=//p' "$phase8_metadata") [ "$native_base_store_count" = 3 ] || { echo "expected 3 native base stores, got: $native_base_store_count" >&2; exit 1; } [ "$host_base_store_count" = 0 ] || { echo "expected 0 host base stores, got: $host_base_store_count" >&2; exit 1; } [ -z "$host_base_stores" ] || { echo "host base stores are not empty: $host_base_stores" >&2; exit 1; } printf '%s\n' "$native_base_stores" | tr ',' '\n' | grep 'freebsd-native-kernel-15.0-STABLE$' >/dev/null || { echo "native base stores do not include the native kernel" >&2 exit 1 } bootloader_store=$(printf '%s\n' "$native_base_stores" | tr ',' '\n' | grep 'freebsd-native-bootloader-15.0-STABLE$' | head -n 1) runtime_store=$(printf '%s\n' "$native_base_stores" | tr ',' '\n' | grep 'freebsd-native-runtime-15.0-STABLE$' | head -n 1) [ -n "$bootloader_store" ] || { echo "native base stores do not include the native bootloader slice" >&2; exit 1; } [ -n "$runtime_store" ] || { echo "native base stores do not include the native runtime slice" >&2; exit 1; } printf '%s\n' "$native_base_stores" | tr ',' '\n' | grep 'freebsd-native-world-15.0-STABLE$' >/dev/null && { echo "broad native world artifact should no longer be part of the validated split-system closure" >&2 exit 1 } for path in \ "$bootloader_store/boot/loader" \ "$bootloader_store/boot/loader.efi" \ "$bootloader_store/boot/device.hints" \ "$bootloader_store/boot/defaults/loader.conf" \ "$bootloader_store/boot/lua/loader.lua" \ "$runtime_store/bin/sh" \ "$runtime_store/sbin/init" \ "$runtime_store/etc/rc" \ "$runtime_store/usr/sbin/sshd" \ "$runtime_store/sbin/dhclient" \ "$runtime_store/usr/bin/ssh-keygen" \ "$runtime_store/usr/share/locale/C.UTF-8/LC_CTYPE" do [ -e "$path" ] || { echo "required native split path missing: $path" >&2 exit 1 } done [ ! -e "$runtime_store/boot" ] || { echo "native runtime still contains /boot" >&2; exit 1; } [ ! -e "$runtime_store/usr/include" ] || { echo "native runtime still contains /usr/include" >&2; exit 1; } [ "$shepherd_pid" = 1 ] || { echo "shepherd was not PID 1" >&2; exit 1; } [ "$sshd_status" = running ] || { echo "sshd is not running" >&2; exit 1; } case "$activate_log" in *fruix-activate:done*) : ;; *) echo "activation log does not show success" >&2; exit 1 ;; esac cat >"$metadata_file" <