clawdie-iso/firstboot/vps-path-test.sh

223 lines
7.8 KiB
Bash
Executable file

#!/bin/sh
# VPS Firstboot Path Test
# Validates the full module pipeline with TARGET=vps pre-baked vars.
# No root required. Runs in a tmpdir sandbox.
#
# Usage: sh firstboot/vps-path-test.sh
set -eu
SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
TESTDIR="${SCRIPT_DIR}/tmp/vps-path-test-$$"
mkdir -p "$TESTDIR"
# ── Mock filesystem ──
mkdir -p "$TESTDIR/etc/pkg/repos"
mkdir -p "$TESTDIR/etc/profile.d"
mkdir -p "$TESTDIR/var/log"
mkdir -p "$TESTDIR/var/cache/pkg/bastille"
mkdir -p "$TESTDIR/usr/local/share/clawdie-iso/packages"
# Mock Clawdie-AI tarball (matches ISO layout: Clawdie-AI/ → /home/clawdie/clawdie-ai)
mkdir -p "$TESTDIR/Clawdie-AI/node_modules"
cat > "$TESTDIR/Clawdie-AI/package.json" <<'PKG'
{"name":"clawdie-ai","version":"1.0.2","scripts":{"install":"echo '[npm] Services ready'"}}
PKG
# Mock justfile (firstboot deploy runs: just install)
cat > "$TESTDIR/Clawdie-AI/justfile" <<'EOF'
set dotenv-load
install *args="":
@echo "[just] Services ready"
EOF
# Mock tarball
tar -czf "$TESTDIR/clawdie-ai.tar.gz" -C "$TESTDIR" Clawdie-AI 2>/dev/null || true
PASS=0
FAIL=0
check() {
if [ "$1" = "0" ]; then
echo " PASS: $2"
PASS=$((PASS + 1))
else
echo " FAIL: $2"
FAIL=$((FAIL + 1))
fi
}
echo ""
echo "============================================================"
echo " VPS Firstboot Path Test"
echo " Simulates TARGET=vps with pre-baked vars (no wizard)"
echo "============================================================"
echo ""
# ── VPS pre-baked vars (minimum required) ──
export TARGET="vps"
export ASSISTANT_NAME="VpsClawdie"
export AGENT_DOMAIN="clawdie.home.arpa"
export AGENT_GENDER="f"
export TZ="Europe/Ljubljana"
export SYSTEM_LOCALE="sl_SI.UTF-8"
export DISPLAY_LOCALE="sl_SI.UTF-8"
export ASSISTANT_LOCALE="sl_SI.UTF-8"
export KEYMAP="sl.kbd"
# ── Optional VPS vars ──
export FEATURE_TAILSCALE="NO"
export FEATURE_GITEA="NO"
export CODE_HOSTING_MODE="git"
export FEATURE_GIT="YES"
export LOCAL_LLM_PROVIDER="none"
export FEATURE_OLLAMA="NO"
export FEATURE_LLAMA_CPP="NO"
export FEATURE_OLLAMA_HPP="NO"
export DEFAULT_PKG_BRANCH="latest"
export SSH_PUBLIC_KEY=""
export PI_TUI_PROVIDER=""
export PI_TUI_MODEL=""
export FEATURE_TELEGRAM="NO"
export TELEGRAM_BOT_TOKEN=""
export TELEGRAM_ADMIN_IDS=""
export TAILSCALE_AUTHKEY=""
export ZAI_API_KEY=""
export OPENROUTER_API_KEY=""
export ANTHROPIC_API_KEY=""
export EMBED_BASE_URL=""
export EMBED_MODEL=""
export EMBED_API_KEY=""
export EMBED_DIMENSIONS=""
# ── Test guards ──
export SHELL_ENV_TEST=1
export SHELL_PKG_TEST=1
export SHELL_GPU_TEST=1
export SHELL_NVIDIA_TEST=1
export SHELL_SYSTEM_TEST=1
export SHELL_TAILSCALE_TEST=1
export SHELL_DEPLOY_TEST=1
# ── Sandbox overrides ──
export CLAWDIE_HOME="$TESTDIR/home/clawdie"
export CLAWDIE_AI_DIR="$CLAWDIE_HOME/clawdie-ai"
export CLAWDIE_TARBALL="$TESTDIR/clawdie-ai.tar.gz"
export PKG_CONF_DIR="$TESTDIR/etc/pkg/repos"
export FREEBSD_REPO_CONF="$PKG_CONF_DIR/FreeBSD.conf"
export CLAWDIE_USB_REPO_CONF="$PKG_CONF_DIR/Clawdie-USB.conf"
export USB_PKG_PATH="$TESTDIR/usr/local/share/clawdie-iso/packages"
export BASTILLE_PKG_CACHE="$TESTDIR/var/cache/pkg/bastille"
export RC_CONF="$TESTDIR/etc/rc.conf"
export HOSTNAME_FILE="$TESTDIR/etc/hostname"
export PROFILE_DIR="$TESTDIR/etc/profile.d"
export LOG_FILE="$TESTDIR/var/log/cloud-test.log"
export PROGRESS_FILE="$TESTDIR/var/log/cloud-test.progress"
export ENV_FILE="$CLAWDIE_HOME/.env"
touch "$LOG_FILE" "$PROGRESS_FILE" "$RC_CONF"
# ── Source all modules ──
. "$SCRIPT_DIR/firstboot/shell-env.sh" 2>/dev/null
. "$SCRIPT_DIR/firstboot/shell-pkg.sh" 2>/dev/null
. "$SCRIPT_DIR/firstboot/shell-gpu.sh" 2>/dev/null
. "$SCRIPT_DIR/firstboot/shell-nvidia.sh" 2>/dev/null
. "$SCRIPT_DIR/firstboot/shell-system.sh" 2>/dev/null
. "$SCRIPT_DIR/firstboot/shell-tailscale.sh" 2>/dev/null
. "$SCRIPT_DIR/firstboot/shell-deploy.sh" 2>/dev/null
# ──────────────────────────────────────────────────────────────
echo "[1/7] Cloud validation"
_ok=0
[ -n "${ASSISTANT_NAME:-}" ] || _ok=1
[ -n "${AGENT_DOMAIN:-}" ] || _ok=1
[ -n "${TZ:-}" ] || _ok=1
check "$_ok" "Required pre-baked vars present (ASSISTANT_NAME, AGENT_DOMAIN, TZ)"
# ──────────────────────────────────────────────────────────────
echo ""
echo "[2/7] GPU detection (headless — should not crash)"
export DETECTED_GPU=""
clawdie_shell_gpu_detect 2>/dev/null
check "0" "GPU detect completed on headless system"
# ──────────────────────────────────────────────────────────────
echo ""
echo "[3/7] Package config"
clawdie_shell_pkg_setup 2>/dev/null
[ -f "$FREEBSD_REPO_CONF" ]; check "$?" "FreeBSD repo config written"
[ -f "$CLAWDIE_USB_REPO_CONF" ]; check "$?" "USB repo config written"
if grep -q "usr/local/share/clawdie-iso/packages" "$CLAWDIE_USB_REPO_CONF" 2>/dev/null; then
check "0" "USB repo points to SHARE/packages (offline path correct)"
else
check "1" "USB repo points to SHARE/packages (offline path correct)"
fi
# ──────────────────────────────────────────────────────────────
echo ""
echo "[4/7] Env generation"
clawdie_shell_env_generate 2>/dev/null
[ -f "$ENV_FILE" ]; check "$?" ".env file created"
# Check key vars are in .env (quotes included in format)
for var_check in \
'ASSISTANT_NAME="VpsClawdie"' \
'AGENT_DOMAIN="clawdie.home.arpa"' \
'TZ="Europe/Ljubljana"' \
'CODE_HOSTING_MODE="git"' \
'FEATURE_GITEA="NO"' \
'FEATURE_TAILSCALE="NO"' \
'EMBED_API_KEY=""' \
'EMBED_DIMENSIONS="1024"'; do
if grep -qF "$var_check" "$ENV_FILE" 2>/dev/null; then
check "0" "$var_check in .env"
else
check "1" "$var_check in .env"
fi
done
# ──────────────────────────────────────────────────────────────
echo ""
echo "[5/7] System config"
clawdie_shell_system_config >/dev/null 2>&1
[ -f "$HOSTNAME_FILE" ]; check "$?" "Hostname file created"
if [ -f "$HOSTNAME_FILE" ]; then
_hn=$(cat "$HOSTNAME_FILE")
if echo "$_hn" | grep -q "clawdie.home.arpa"; then
check "0" "Hostname = $_hn"
else
check "1" "Hostname = $_hn (expected *clawdie.cloud*)"
fi
fi
# ──────────────────────────────────────────────────────────────
echo ""
echo "[6/7] Tailscale (disabled)"
clawdie_shell_tailscale_setup >/dev/null 2>&1
check "0" "Tailscale skipped (FEATURE_TAILSCALE=NO)"
# ──────────────────────────────────────────────────────────────
echo ""
echo "[7/7] Deploy"
clawdie_shell_deploy 2>/dev/null
[ -f "$CLAWDIE_AI_DIR/package.json" ]; check "$?" "Clawdie-AI deployed"
[ -f "$CLAWDIE_AI_DIR/.env" ]; check "$?" ".env copied into clawdie-ai"
# ──────────────────────────────────────────────────────────────
echo ""
echo "============================================================"
echo " PASS: $PASS FAIL: $FAIL"
echo "============================================================"
# Cleanup
rm -rf "$TESTDIR"
if [ "$FAIL" -eq 0 ]; then
echo ""
echo " All cloud path checks passed."
exit 0
else
echo ""
echo " $FAIL check(s) failed — review output above."
exit 1
fi