Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
0655bdc
Centralise vsock frame proto
isbm Aug 1, 2026
e5dfb11
Add centralised vsock proto UT
isbm Aug 1, 2026
2122221
Validate guest working directories and workspace paths
isbm Aug 1, 2026
c238907
Add workspace unit tests
isbm Aug 1, 2026
52aff66
Lints
isbm Aug 1, 2026
2caa623
Define the versioned remote operation proto
isbm Aug 1, 2026
537bddb
Add remote operation proto UT
isbm Aug 1, 2026
4b2ace8
Add remote auth and backend interfaces
isbm Aug 2, 2026
ffecebc
Add Unit tests for the remote auth
isbm Aug 2, 2026
e2c0813
Add fake remote backend and tests
isbm Aug 2, 2026
bc1f3a8
Add concurrent backend streaming
isbm Aug 2, 2026
d36d567
Add unit tests for loopback remote harness
isbm Aug 2, 2026
b9c97f9
Implement remote loopback harness
isbm Aug 2, 2026
a32c90d
Fix regression: TUI rendering on a wrong channel before the first boo…
isbm Aug 2, 2026
d0080db
Add UT for TUI rendering
isbm Aug 2, 2026
93eb8e7
ADd unit tests for strict remote env and configurable policies
isbm Aug 2, 2026
8c866fd
Add strict remote env and configurable policies
isbm Aug 2, 2026
07f5477
Add remote build policy
isbm Aug 3, 2026
04b1c3c
Add remote build policy unit tests
isbm Aug 3, 2026
932dbda
Implement transparency wrapper on one build command
isbm Aug 3, 2026
e589956
Update images
isbm Aug 3, 2026
77e050b
Add unit tests for transparency layer
isbm Aug 3, 2026
7321c3c
Implement shared remote-make ownership and diagnostic sync cleanup wi…
isbm Aug 3, 2026
4e2d7ae
Add regression tests for installers, cleanup, bounds, and preserved b…
isbm Aug 3, 2026
842f420
Linters
isbm Aug 4, 2026
a453d81
Add project data exclusion paths
isbm Aug 17, 2026
4a56e23
Add data exclusion UT
isbm Aug 17, 2026
f3d7cb6
Implement SSH worker transport
isbm Aug 17, 2026
ee6a06e
Add SSH worker transport unit tests
isbm Aug 17, 2026
d385b56
Implement remote worker for other platforms
isbm Aug 17, 2026
8848005
Implement artefact manifests and controlled retrieval
isbm Aug 17, 2026
b7a7b9d
Add artefact retrieval unit tests
isbm Aug 17, 2026
ef5aa82
Anchor ArtifactPublication workspace publication through opened direc…
isbm Aug 17, 2026
7fee20d
Add unit tests for artifacts anchoring
isbm Aug 17, 2026
b41d9fc
Refactor remote worker
isbm Aug 17, 2026
6f88630
Add integration test fixtures
isbm Aug 17, 2026
377af09
Wire remote proto
isbm Aug 17, 2026
8932240
Add unit tests
isbm Aug 17, 2026
8c46b89
Refactor generic remote client
isbm Aug 18, 2026
09ae61e
Update unit tests
isbm Aug 18, 2026
0b35a49
Update worker protocol to change targets
isbm Aug 18, 2026
cbd0ad4
Update config docs on configuring remote targets
isbm Aug 18, 2026
2851cc2
Add TUI to switch remote targets
isbm Aug 18, 2026
eecb69d
Update config docs
isbm Aug 18, 2026
503d3b6
Add TUI for remote setup
isbm Aug 18, 2026
524abc4
Add unit tests for TUI setup
isbm Aug 18, 2026
8352875
Fix remote regression
isbm Aug 18, 2026
ad985f1
Add mxrun
isbm Aug 19, 2026
b1bbc7d
Split mxrun for the remote worker
isbm Aug 19, 2026
cd7bd84
Add worker remote builds
isbm Aug 19, 2026
7737fab
Worker snapshotting
isbm Aug 19, 2026
f173ca6
Fix absolute paths of the workspace
isbm Aug 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 10 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,18 @@ name = "bunkerbox"
version = "0.4.1"
edition = "2021"

[workspace]
members = [
".",
"crates/bunkerbox-worker-protocol",
"crates/bunkerbox-worker",
]
resolver = "2"

[dependencies]
aes-gcm = "0.10"
base64 = "0.22"
bunkerbox-worker-protocol = { path = "crates/bunkerbox-worker-protocol", features = ["async"] }
clap = "4"
colored = "3"
glob = "0.3"
Expand All @@ -16,7 +25,7 @@ serde = { version = "1", features = ["derive"] }
serde_json = "1"
serde_yaml = "0.9"
sha2 = "0.10"
tokio = { version = "1", features = ["rt-multi-thread", "net", "macros", "sync", "io-util", "process"] }
tokio = { version = "1", features = ["rt-multi-thread", "net", "macros", "sync", "io-util", "process", "time"] }
tokio-vsock = "0.7"
ratatui = "0.30"
crossterm = "0.28"
Expand Down
158 changes: 122 additions & 36 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,91 +1,177 @@
.DEFAULT_GOAL := help
.PHONY: help ensure-toolchain dev release check test integration-test setup image install-image prepare config docs docs-dev docs-clean musl-vscomm clean
.PHONY: help ensure-toolchain mxrun mxrun-init mxrun-toggle set-local-builds set-remote-builds dev worker-dev release worker check test integration-test setup image install-image prepare config docs docs-dev docs-clean musl-vscomm worker-netbsd clean
.PHONY: _dev _worker-dev _release _worker _check _test _integration-test

DOCS_VENV := .venv-docs
DOCS_MKDOCS := $(DOCS_VENV)/bin/mkdocs
VSCOMM_TARGET := x86_64-unknown-linux-musl
WORKER_TARGET ?= x86_64-unknown-netbsd
IMAGE ?=
OCI ?=
MXRUN_BIN ?= mxrun
MXRUN_ARGS ?=
C_TITLE := \033[1;38;2;215;0;175m
C_COMMAND := \033[38;2;175;255;215m
C_DESCRIPTION := \033[38;2;128;128;128m
C_OFF := \033[0m

help:
@printf " %-24s %s\n" "Development" ""
@printf " %-24s %s\n" " dev" "Build all binaries (host + musl-static vscomm)"
@printf " %-24s %s\n" " release" "Build optimized release binaries"
@printf " %-24s %s\n" " check" "Format and lint"
@printf " %-24s %s\n" " test" "Run tests (requires cargo-nextest)"
@printf " %-24s %s\n" " integration-test" "Run sandbox integration tests"
@printf " %-24s %s\n" "" ""
@printf " %-24s %s\n" "Toolchain" ""
@printf " %-24s %s\n" " ensure-toolchain" "Install/update Rust stable and musl target"
@printf " %-24s %s\n" " musl-vscomm" "Build static vscomm binary only"
@printf " %-24s %s\n" "" ""
@printf " %-24s %s\n" "Image" ""
@printf " %-24s %s\n" " image" "Build OCI agent image (requires IMAGE=)"
@printf " %-24s %s\n" " install-image" "Install OCI archive (requires OCI=)"
@printf " %-24s %s\n" "" ""
@printf " %-24s %s\n" "Setup" ""
@printf " %-24s %s\n" " setup" "Install containerd, CNI, Kata dependencies"
@printf " %-24s %s\n" " prepare" "Prepare workspace overlay layers"
@printf " %-24s %s\n" " config" "Configure project interactively"
@printf " %-24s %s\n" "" ""
@printf " %-24s %s\n" "Documentation" ""
@printf " %-24s %s\n" " docs" "Build documentation site"
@printf " %-24s %s\n" " docs-dev" "Serve docs locally with live reload"
@printf " %-24s %s\n" " docs-clean" "Remove docs build artifacts"
@printf " %-24s %s\n" "" ""
@printf " %-24s %s\n" "Cleanup" ""
@printf " %-24s %s\n" " clean" "Remove build artifacts (cargo clean)"
@printf '$(C_TITLE)%s$(C_OFF)\n' "Development"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "dev" "Build all binaries (host + musl-static vscomm)"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "worker-dev" "Build only the remote worker (development)"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "check" "Format and lint"
@printf '\n'
@printf '$(C_TITLE)%s$(C_OFF)\n' "Release"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "release" "Build optimized release binaries"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "worker" "Build only the remote worker (release)"
@printf '\n'
@printf '$(C_TITLE)%s$(C_OFF)\n' "Testing"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "test" "Run tests (requires cargo-nextest)"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "integration-test" "Run sandbox integration tests"
@printf '\n'
@printf '$(C_TITLE)%s$(C_OFF)\n' "Toolchain"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "ensure-toolchain" "Install/update Rust stable and musl target"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "musl-vscomm" "Build static vscomm binary only"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "worker-netbsd" "Build the portable worker for NetBSD"
@printf '\n'
@printf '$(C_TITLE)%s$(C_OFF)\n' "Image"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "image" "Build OCI agent image (requires IMAGE=)"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "install-image" "Install OCI archive (requires OCI=)"
@printf '\n'
@printf '$(C_TITLE)%s$(C_OFF)\n' "Setup"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "setup" "Install containerd, CNI, Kata dependencies"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "prepare" "Prepare workspace overlay layers"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "config" "Configure project interactively"
@printf '\n'
@printf '$(C_TITLE)%s$(C_OFF)\n' "Documentation"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "docs" "Build documentation site"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "docs-dev" "Serve docs locally with live reload"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "docs-clean" "Remove docs build artifacts"
@printf '\n'
@printf '$(C_TITLE)%s$(C_OFF)\n' "Cleanup"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "clean" "Remove build artifacts (cargo clean)"
@printf '\n'
@printf '$(C_TITLE)%s$(C_OFF)\n' "Utils"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "help" "Show this help"
@printf '\n'
@printf '$(C_TITLE)%s$(C_OFF)\n' "mxrun"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "mxrun" "Show mxrun status"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "mxrun-init" "Initialise mxrun with a local target"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "mxrun-toggle" "Toggle mxrun delegation"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "set-local-builds" "Disable mxrun delegation"
@printf ' $(C_COMMAND)%-20s$(C_OFF) $(C_DESCRIPTION)%s$(C_OFF)\n' "set-remote-builds" "Enable mxrun delegation"
@printf '\n'
@if [ "$$(awk -F= '/^active=/ {print $$2}' .mxrun-env 2>/dev/null)" = "yes" ]; then \
printf "$(C_OFF)mxrun enabled; builds use the configured target matrix.$(C_OFF)\n"; \
else \
printf "$(C_OFF)mxrun disabled; builds run through local targets.$(C_OFF)\n"; \
fi

ensure-toolchain:
@command -v rustup >/dev/null 2>&1 || { echo "rustup is required: https://rustup.rs" >&2; exit 1; }
rustup update stable
rustup target add $(VSCOMM_TARGET)

dev: ensure-toolchain
dev:
@if [ -n "$$SSH_CONNECTION" ]; then $(MAKE) _dev; else MXRUN_BIN="$(MXRUN_BIN)" MXRUN_ARGS="$(MXRUN_ARGS)" scripts/maybe-mxrun.sh dev || $(MAKE) _dev; fi

_dev: ensure-toolchain
cargo build --bin bunkerbox --bin bunkerbox-image
cargo build --bin bunkerbox-netrelay --target $(VSCOMM_TARGET)
cargo build --bin bunkerbox-vscomm --target $(VSCOMM_TARGET)
cargo build -p bunkerbox-worker
cargo build --bin bunkerbox-netrelay --bin bunkerbox-vscomm --bin bunkerbox-remote --target $(VSCOMM_TARGET)
cargo build --bin bunkerbox-status --target $(VSCOMM_TARGET)
rm -rf target/dist
mkdir -p target/dist
cp target/debug/bunkerbox target/dist/
cp target/debug/bunkerbox-image target/dist/
cp target/$(VSCOMM_TARGET)/debug/bunkerbox-netrelay target/dist/
cp target/$(VSCOMM_TARGET)/debug/bunkerbox-vscomm target/dist/
cp target/$(VSCOMM_TARGET)/debug/bunkerbox-remote target/dist/
cp target/$(VSCOMM_TARGET)/debug/bunkerbox-status target/dist/
cp target/$(VSCOMM_TARGET)/debug/bunkerbox-netrelay target/debug/bunkerbox-netrelay

release: ensure-toolchain
worker-dev:
@if [ -n "$$SSH_CONNECTION" ]; then $(MAKE) _worker-dev; else MXRUN_BIN="$(MXRUN_BIN)" MXRUN_ARGS="$(MXRUN_ARGS)" scripts/maybe-mxrun.sh worker-dev || $(MAKE) _worker-dev; fi

_worker-dev:
scripts/worker.sh worker-dev

release:
@if [ -n "$$SSH_CONNECTION" ]; then $(MAKE) _release; else MXRUN_BIN="$(MXRUN_BIN)" MXRUN_ARGS="$(MXRUN_ARGS)" scripts/maybe-mxrun.sh release || $(MAKE) _release; fi

_release: ensure-toolchain
cargo build --bin bunkerbox --bin bunkerbox-image --release
cargo build --bin bunkerbox-netrelay --target $(VSCOMM_TARGET) --release
cargo build --bin bunkerbox-vscomm --target $(VSCOMM_TARGET) --release
cargo build --bin bunkerbox-netrelay --bin bunkerbox-vscomm --bin bunkerbox-remote --target $(VSCOMM_TARGET) --release
cargo build --bin bunkerbox-status --target $(VSCOMM_TARGET) --release
rm -rf target/dist
mkdir -p target/dist
cp target/release/bunkerbox target/dist/
cp target/release/bunkerbox-image target/dist/
cp target/$(VSCOMM_TARGET)/release/bunkerbox-netrelay target/dist/
cp target/$(VSCOMM_TARGET)/release/bunkerbox-vscomm target/dist/
cp target/$(VSCOMM_TARGET)/release/bunkerbox-remote target/dist/
cp target/$(VSCOMM_TARGET)/release/bunkerbox-status target/dist/
cp target/$(VSCOMM_TARGET)/release/bunkerbox-netrelay target/release/bunkerbox-netrelay

worker:
@if [ -n "$$SSH_CONNECTION" ]; then $(MAKE) _worker; else MXRUN_BIN="$(MXRUN_BIN)" MXRUN_ARGS="$(MXRUN_ARGS)" scripts/maybe-mxrun.sh worker || $(MAKE) _worker; fi

_worker:
scripts/worker.sh worker

check:
@if [ -n "$$SSH_CONNECTION" ]; then $(MAKE) _check; else MXRUN_BIN="$(MXRUN_BIN)" MXRUN_ARGS="$(MXRUN_ARGS)" scripts/maybe-mxrun.sh check || $(MAKE) _check; fi

_check:
cargo fmt --all
cargo clippy --all-targets --all-features -- -D warnings || cargo clippy --fix --all-targets --all-features --allow-dirty --allow-staged -- -D warnings

test:
@if [ -n "$$SSH_CONNECTION" ]; then $(MAKE) _test; else MXRUN_BIN="$(MXRUN_BIN)" MXRUN_ARGS="$(MXRUN_ARGS)" scripts/maybe-mxrun.sh test || $(MAKE) _test; fi

_test:
cargo nextest run

integration-test: dev
integration-test:
@if [ -n "$$SSH_CONNECTION" ]; then $(MAKE) _integration-test; else MXRUN_BIN="$(MXRUN_BIN)" MXRUN_ARGS="$(MXRUN_ARGS)" scripts/maybe-mxrun.sh integration-test || $(MAKE) _integration-test; fi

_integration-test: _dev
cargo nextest run --test test_base --test test_sandbox

mxrun-toggle:
@if [ -f .mxrun-env ] && grep -q '^active=yes' .mxrun-env 2>/dev/null; then \
MXRUN_BIN="$(MXRUN_BIN)" sh scripts/mxrun-set-local.sh; \
else \
MXRUN_BIN="$(MXRUN_BIN)" sh scripts/mxrun-set-remote.sh; \
fi

set-local-builds:
MXRUN_BIN="$(MXRUN_BIN)" sh scripts/mxrun-set-local.sh

set-remote-builds:
MXRUN_BIN="$(MXRUN_BIN)" sh scripts/mxrun-set-remote.sh

mxrun-init:
@command -v $(MXRUN_BIN) >/dev/null 2>&1 || { echo "Missing $(MXRUN_BIN). Install it first." >&2; exit 1; }
@if [ ! -f mxrun.conf ]; then printf 'local\n' > mxrun.conf; fi
@printf 'active=yes\n' > .mxrun-env
@MXRUN_CONFIG=mxrun.conf MXRUN_LOCAL_MAKE='$(MAKE)' $(MXRUN_BIN) init || true

mxrun:
@command -v $(MXRUN_BIN) >/dev/null 2>&1 || { echo "Missing $(MXRUN_BIN). Install it first." >&2; exit 1; }
@if [ ! -f mxrun.conf ] && [ ! -f .mxrun-env ]; then printf 'active=no\n' > .mxrun-env; fi
@sh scripts/mxrun-status.sh

setup: dev
target/debug/bunkerbox setup

musl-vscomm: ensure-toolchain
cargo build --bin bunkerbox-vscomm --target $(VSCOMM_TARGET)
cargo build --bin bunkerbox-vscomm --bin bunkerbox-remote --target $(VSCOMM_TARGET)
cargo build --bin bunkerbox-status --target $(VSCOMM_TARGET)

worker-netbsd:
cargo build -p bunkerbox-worker --target $(WORKER_TARGET) --release

image: dev
@if [ -z "$(IMAGE)" ]; then echo "usage: make image IMAGE=images/name.conf" >&2; exit 1; fi
target/debug/bunkerbox-image $(IMAGE)
Expand Down
14 changes: 14 additions & 0 deletions crates/bunkerbox-worker-protocol/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[package]
name = "bunkerbox-worker-protocol"
version = "0.1.0"
edition = "2021"

[features]
default = ["async"]
async = ["dep:tokio"]

[dependencies]
tokio = { version = "1", features = ["io-util"], optional = true }

[dev-dependencies]
tokio = { version = "1", features = ["io-util", "macros", "rt"] }
Loading
Loading