banger/internal
Thales Maciel f0668ee598
Phase 4: remote catalog + banger kernel pull
Introduces the headline feature of the kernel catalog: pulling a kernel
bundle over HTTP without any local build step.

Catalog format (internal/kernelcat/catalog.go):
 - Catalog { Version, Entries } + CatEntry { Name, Distro, Arch,
   KernelVersion, TarballURL, TarballSHA256, SizeBytes, Description }.
 - catalog.json is embedded via go:embed and ships with each banger
   binary. It starts empty (Phase 5's CI pipeline will populate it).
 - Lookup(name) returns the matching entry or os.ErrNotExist.

Fetch (internal/kernelcat/fetch.go):
 - HTTP GET with streaming SHA256 over the response body.
 - zstd-decode (github.com/klauspost/compress/zstd) -> tar extract into
   <kernelsDir>/<name>/.
 - Hardens against path-traversal tarball entries (members whose
   normalised path escapes the target dir, and unsafe symlink
   targets) and sha256-mismatch downloads; any failure removes the
   partially-populated target dir.
 - Regular files, directories, and safe symlinks are supported; other
   tar types (hardlinks, devices, fifos) are silently skipped.
 - After extraction, recomputes sha256 over the on-disk vmlinux and
   writes the manifest with Source="pull:<url>".

Daemon methods (internal/daemon/kernels.go):
 - KernelPull(ctx, {Name, Force}) - lookup in embedded catalog, refuse
   overwrite unless Force, delegate to kernelcat.Fetch.
 - KernelCatalog(ctx) - return the embedded catalog annotated per-entry
   with whether it has been pulled locally.

RPC: kernel.pull, kernel.catalog dispatch cases.

CLI:
 - `banger kernel pull <name> [--force]`.
 - `banger kernel list --available` prints the catalog with a
   pulled/available STATE column and a human-readable size.

Tests: fetch round-trip (extract + manifest + sha256), sha256 mismatch
rejection with cleanup, missing-vmlinux rejection, path-traversal
rejection, HTTP error propagation, catalog parsing, lookup,
pulled-status reconciliation. All 20 packages green.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 15:05:42 -03:00
..
api Phase 4: remote catalog + banger kernel pull 2026-04-16 15:05:42 -03:00
buildinfo Stamp shared build metadata into banger binaries 2026-03-22 17:14:06 -03:00
cli Phase 4: remote catalog + banger kernel pull 2026-04-16 15:05:42 -03:00
config Rename experimental Void image to void 2026-04-01 20:15:28 -03:00
daemon Phase 4: remote catalog + banger kernel pull 2026-04-16 15:05:42 -03:00
firecracker Add experimental Void guest workflow and vsock agent 2026-03-19 14:51:25 -03:00
guest Add guest.session.send and vm.workspace.export RPCs 2026-04-14 15:21:50 -03:00
guestconfig Refactor VM lifecycle around capabilities 2026-03-18 19:28:26 -03:00
guestnet Stop using kernel IP autoconfig for runtime VMs 2026-03-21 21:54:18 -03:00
hostnat Move helper NAT management into Go 2026-03-17 15:07:49 -03:00
imagepreset Add an experimental Alpine image flow 2026-03-21 20:25:55 -03:00
kernelcat Phase 4: remote catalog + banger kernel pull 2026-04-16 15:05:42 -03:00
model Add guest sessions and agent VM defaults 2026-04-12 23:48:42 -03:00
namegen Remove runtime-bundle image dependencies 2026-03-21 18:34:53 -03:00
opencode Wait for real guest vsock health before opencode 2026-03-21 21:14:22 -03:00
paths Phase 1: local kernel catalog scaffolding 2026-04-16 14:21:10 -03:00
policy Add vsock-backed VM port inspection 2026-03-19 15:52:11 -03:00
rpc Propagate RPC cancellation to daemon requests 2026-03-16 18:28:33 -03:00
sessionstream Add guest sessions and agent VM defaults 2026-04-12 23:48:42 -03:00
store Add guest sessions and agent VM defaults 2026-04-12 23:48:42 -03:00
system Phase 3: banger kernel import bridges make-*-kernel.sh output 2026-04-16 14:53:49 -03:00
toolingplan Bootstrap vm run tooling before attach 2026-03-29 11:38:05 -03:00
vmdns Replace mapdns with daemon DNS 2026-03-17 15:49:35 -03:00
vsockagent Add vsock-backed VM port inspection 2026-03-19 15:52:11 -03:00
webui Rename experimental Void image to void 2026-04-01 20:15:28 -03:00