113 lines
2.7 KiB
Bash
Executable file
113 lines
2.7 KiB
Bash
Executable file
#!/bin/sh
|
|
# Read-only preflight checks for bhyve readiness and host baseline.
|
|
|
|
set -eu
|
|
|
|
PASS=0
|
|
WARN=0
|
|
FAIL=0
|
|
|
|
mark_pass() { PASS=$((PASS + 1)); echo "PASS: $1"; }
|
|
mark_warn() { WARN=$((WARN + 1)); echo "WARN: $1"; }
|
|
mark_fail() { FAIL=$((FAIL + 1)); echo "FAIL: $1"; }
|
|
|
|
have_cmd() { command -v "$1" >/dev/null 2>&1; }
|
|
|
|
check_cmd() {
|
|
if have_cmd "$1"; then
|
|
mark_pass "command available: $1"
|
|
else
|
|
mark_warn "command missing: $1"
|
|
fi
|
|
}
|
|
|
|
check_file_contains() {
|
|
_file="$1"
|
|
_pattern="$2"
|
|
_label="$3"
|
|
|
|
if [ ! -f "$_file" ]; then
|
|
mark_warn "$_label: missing $_file"
|
|
return 0
|
|
fi
|
|
|
|
if grep -Eq "$_pattern" "$_file"; then
|
|
mark_pass "$_label: $_file has $_pattern"
|
|
else
|
|
mark_warn "$_label: $_file missing $_pattern"
|
|
fi
|
|
}
|
|
|
|
echo "==> Clawdie ISO host preflight (read-only)"
|
|
|
|
# Core command availability
|
|
check_cmd bhyve
|
|
check_cmd bhyvectl
|
|
check_cmd ifconfig
|
|
check_cmd sysctl
|
|
check_cmd kldstat
|
|
|
|
# vmm module and device nodes
|
|
if have_cmd kldstat && kldstat | grep -q 'vmm'; then
|
|
mark_pass "vmm module loaded"
|
|
else
|
|
mark_warn "vmm module not loaded (kldstat)"
|
|
fi
|
|
|
|
if [ -c /dev/vmmctl ]; then
|
|
mark_pass "/dev/vmmctl exists"
|
|
else
|
|
mark_warn "/dev/vmmctl missing"
|
|
fi
|
|
|
|
if [ -d /dev/vmm ]; then
|
|
mark_pass "/dev/vmm directory exists (VM nodes)"
|
|
else
|
|
mark_warn "/dev/vmm directory missing (no VMs created yet)"
|
|
fi
|
|
|
|
# Optional modules for bhyve tooling
|
|
if have_cmd kldstat && kldstat | grep -q 'if_tap'; then
|
|
mark_pass "if_tap module loaded"
|
|
else
|
|
mark_warn "if_tap module not loaded"
|
|
fi
|
|
|
|
if have_cmd kldstat && kldstat | grep -q 'nmdm'; then
|
|
mark_pass "nmdm module loaded"
|
|
else
|
|
mark_warn "nmdm module not loaded"
|
|
fi
|
|
|
|
# Loader config checks
|
|
check_file_contains /boot/loader.conf 'vmm_load="YES"' "loader"
|
|
check_file_contains /boot/loader.conf.local 'vmm_load="YES"' "loader.local"
|
|
check_file_contains /boot/loader.conf 'if_tap_load="YES"' "loader"
|
|
check_file_contains /boot/loader.conf.local 'if_tap_load="YES"' "loader.local"
|
|
check_file_contains /boot/loader.conf 'nmdm_load="YES"' "loader"
|
|
check_file_contains /boot/loader.conf.local 'nmdm_load="YES"' "loader.local"
|
|
|
|
# rc.conf checks
|
|
check_file_contains /etc/rc.conf 'cloned_interfaces=".*"' "rc.conf"
|
|
check_file_contains /etc/rc.conf 'ifconfig_warden0=' "rc.conf"
|
|
|
|
# Bridge state
|
|
if have_cmd ifconfig && ifconfig -l | grep -qw warden0; then
|
|
mark_pass "warden0 bridge present"
|
|
ifconfig warden0 >/dev/null 2>&1 || mark_warn "warden0 exists but could not query"
|
|
else
|
|
mark_warn "warden0 bridge missing"
|
|
fi
|
|
|
|
# CPU virtualization capabilities
|
|
if have_cmd sysctl && sysctl -n hw.vmm >/dev/null 2>&1; then
|
|
mark_pass "hw.vmm sysctl present"
|
|
else
|
|
mark_warn "hw.vmm sysctl missing"
|
|
fi
|
|
|
|
echo "==> Summary: ${PASS} pass, ${WARN} warn, ${FAIL} fail"
|
|
|
|
if [ "$FAIL" -gt 0 ]; then
|
|
exit 1
|
|
fi
|