diff --git a/.pi/skills/demo/init.sh b/.pi/skills/demo/init.sh new file mode 100755 index 0000000..1207548 --- /dev/null +++ b/.pi/skills/demo/init.sh @@ -0,0 +1,132 @@ +#!/usr/bin/env bash +set -euo pipefail + +# init.sh — Set up the demo skill's headless Chrome container +# +# Prerequisites: +# - go (for installing showboat & rodney) +# - docker +# +# This script: +# 1. Installs showboat and rodney if missing +# 2. Downloads Chromium for the host (macOS, via rodney) +# 3. Downloads Chromium for the Docker image (Linux_x64, from GCS) +# 4. Copies Linux binary into chrome/ (the Docker build context) +# 5. Builds the demo-chrome image + +SKILL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +CHROME_DIR="$SKILL_DIR/chrome" +IMAGE_NAME="${1:-demo-chrome}" + +echo "==> Checking prerequisites..." + +# ------------------------------------------------------------------ +# 1. Install CLI tools +# ------------------------------------------------------------------ +GO_BIN_DIR="$(go env GOBIN 2>/dev/null || echo "$HOME/go/bin")" +export PATH="$GO_BIN_DIR:$PATH" + +if ! command -v showboat &>/dev/null; then + echo "==> Installing showboat..." + go install github.com/simonw/showboat@latest +else + echo " showboat: ok" +fi + +if ! command -v rodney &>/dev/null; then + echo "==> Installing rodney..." + go install github.com/simonw/rodney@latest +else + echo " rodney: ok" +fi + +# ------------------------------------------------------------------ +# 2. Download macOS Chromium for local rodney +# ------------------------------------------------------------------ +echo "==> Downloading macOS Chromium via rodney..." +rodney start 2>/dev/null || true +rodney stop 2>/dev/null || true + +ROD_CACHE="$HOME/.cache/rod/browser" +if [ -d "$ROD_CACHE" ]; then + CHROMIUM_DIR=$(ls -d "$ROD_CACHE"/chromium-* 2>/dev/null | head -1) +else + echo "ERROR: rod cache not found at $ROD_CACHE" + exit 1 +fi + +if [ -z "$CHROMIUM_DIR" ]; then + echo "ERROR: No chromium-* directory found in $ROD_CACHE" + exit 1 +fi + +echo " macOS Chromium at: $CHROMIUM_DIR" + +# Extract revision number from directory name (e.g. chromium-1321438) +REVISION=$(basename "$CHROMIUM_DIR" | sed 's/chromium-//') +echo " Revision: $REVISION" + +# ------------------------------------------------------------------ +# 3. Download Linux Chromium for the Docker image +# ------------------------------------------------------------------ +LINUX_ZIP="/tmp/chrome-linux-$REVISION.zip" +LINUX_EXTRACT="/tmp/chrome-linux-extract" + +echo "==> Downloading Linux_x64 Chromium (revision $REVISION)..." + +if [ ! -f "$LINUX_ZIP" ]; then + curl -fSL \ + "https://storage.googleapis.com/chromium-browser-snapshots/Linux_x64/$REVISION/chrome-linux.zip" \ + -o "$LINUX_ZIP" + echo " Downloaded: $LINUX_ZIP" +else + echo " Already cached: $LINUX_ZIP" +fi + +# ------------------------------------------------------------------ +# 4. Extract and copy into build context +# ------------------------------------------------------------------ +echo "==> Extracting Linux Chromium into $CHROME_DIR ..." +rm -rf "$LINUX_EXTRACT" "$CHROME_DIR" +mkdir -p "$LINUX_EXTRACT" +unzip -q "$LINUX_ZIP" -d "$LINUX_EXTRACT" + +# chrome-linux.zip contains a single chrome-linux/ directory +mv "$LINUX_EXTRACT/chrome-linux" "$CHROME_DIR" + +# IMPORTANT: set suid on the sandbox binary so Chrome can sandbox child processes +if [ -f "$CHROME_DIR/chrome_sandbox" ]; then + chmod 4755 "$CHROME_DIR/chrome_sandbox" +fi + +echo "==> Files in $CHROME_DIR:" +ls -lh "$CHROME_DIR/" | head -15 + +# Clean up extraction temp +rm -rf "$LINUX_EXTRACT" + +# ------------------------------------------------------------------ +# 5. Build Docker image +# ------------------------------------------------------------------ +echo "==> Building Docker image '$IMAGE_NAME' ..." +docker build --tag "$IMAGE_NAME" "$SKILL_DIR" + +# ------------------------------------------------------------------ +# 6. Verify +# ------------------------------------------------------------------ +echo "" +echo "==> Success!" +echo " Image: $IMAGE_NAME" +echo "" +echo " Run the container:" +echo " docker run -d --name demo-chrome \\" +echo " --cap-add=SYS_ADMIN --cap-drop=ALL \\" +echo " --security-opt=no-new-privileges:false \\" +echo " -p 9222:9222 \\" +echo " $IMAGE_NAME" +echo "" +echo " Connect rodney to it:" +echo " rodney connect localhost:9222" +echo "" +echo " Stop the container:" +echo " docker stop demo-chrome && docker rm demo-chrome" \ No newline at end of file