#!/usr/bin/env bash # Real xterm and transport, isolated synthetic service; never creates a real shell. set -euo pipefail [[ $# == 3 ]] || { echo 'usage: run-terminal-browser.sh EMPTY_OUTPUT_DIRECTORY BROWSER_IMAGE_SHA256 LOCKED_FRONTEND_DIRECTORY' >&2; exit 2; } out=$(realpath "$1"); image=$2; deps=$(realpath "$3") [[ "$image" =~ ^sha256:[0-9a-f]{64}$ && -d "$deps/node_modules" ]] || exit 2 [[ -d "$out" && -z "$(ls -A "$out")" ]] || exit 2 root=$(cd "$(dirname "$0")/../.." && pwd) cmp "$root/neode-ui/package.json" "$deps/package.json" cmp "$root/neode-ui/package-lock.json" "$deps/package-lock.json" mkdir -p "$out/input/src/components" "$out/input/src/stores" cp "$root/neode-ui/src/components/CLIPopup.vue" "$out/input/src/components/" cp "$root/neode-ui/src/stores/cli.ts" "$out/input/src/stores/" cp "$root/neode-ui/src/style.css" "$out/input/src/" cp "$root/neode-ui/"{tailwind.config.js,postcss.config.js,package.json,package-lock.json} "$out/input/" cp -R "$root/tests/apps/terminal-browser" "$out/input/fixture" mkdir -p "$out/input/fixture/public/assets/fonts/Montserrat" "$out/input/fixture/public/assets/img" cp "$root/neode-ui/public/assets/fonts/Montserrat/"{Montserrat-Bold,Montserrat-ExtraBold}.ttf "$out/input/fixture/public/assets/fonts/Montserrat/" cp "$root/neode-ui/public/assets/img/bg.jpg" "$out/input/fixture/public/assets/img/" (cd "$out/input" && find . -type f -print0 | sort -z | xargs -0 sha256sum) > "$out/SHA256SUMS" git -C "$root" rev-parse HEAD > "$out/base-commit" printf '%s\n' "$image" > "$out/browser-image" date -u +%FT%TZ > "$out/start" name="archy-terminal-browser-$(date +%s)-$$" trap 'podman rm -f "$name" >/dev/null 2>&1 || true' EXIT set +e timeout 90 podman run --rm --name "$name" --pull never --user 0:0 --network none --read-only --cap-drop all --security-opt no-new-privileges --memory 1g --memory-swap 1g --cpus 1 --pids-limit 256 --tmpfs /tmp:rw,size=256m --tmpfs /work:rw,size=128m -e HOME=/tmp -e XDG_CONFIG_HOME=/tmp/config -e NODE_PATH=/browser/node_modules -v "$out/input:/input:ro" -v "$out:/out:rw" -v "$deps/node_modules:/deps/node_modules:ro" -w /work --entrypoint /bin/sh "$image" -ec ' cp -R /input/. /work/ mkdir node_modules for dep in /deps/node_modules/*; do ln -s "$dep" node_modules/; done node /deps/node_modules/vite/bin/vite.js build --config fixture/vite.config.mjs node fixture/check.cjs ' > "$out/run.log" 2>&1 result=$? printf '%s\n' "$result" > "$out/exit" date -u +%FT%TZ > "$out/end" exit "$result"