Skip to content

podnet v0.4.0-beta.3

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 11 Nov 03:21
· 232 commits to main since this release

A prerelease of podnet, for tests. It follows v0.4.0-beta.2.

A user of cfrs reads the notes of v0.4.0-beta.1 first. They give the
rename and the move from cfrs.

Binaries

File System
podnet-x86_64-unknown-linux-musl Linux x86-64
podnet-aarch64-unknown-linux-musl Linux ARM64
podnet-armv7-unknown-linux-musleabihf Linux ARMv7 (32-bit, hard float)
podnet-arm-unknown-linux-musleabihf Linux ARMv6 (32-bit, hard float)
podnet-i686-unknown-linux-musl Linux x86 (32-bit)
podnet-riscv64gc-unknown-linux-musl Linux RISC-V 64
podnet-loongarch64-unknown-linux-musl Linux LoongArch64
podnet-powerpc64le-unknown-linux-musl Linux POWER, little-endian

Each binary is static (musl). It needs no C library on the host.
podnet.1 is the manual page. SHA256SUMS lists each file.

The image is ghcr.io/podutils/podnet:v0.4.0-beta.3 (also :beta).

Check a download

sha256sum -c SHA256SUMS --ignore-missing
gh attestation verify podnet-x86_64-unknown-linux-musl --repo PodUtils/podnet
cosign verify-blob --bundle SHA256SUMS.sigstore.json \
  --certificate-identity https://github.com/PodUtils/podnet/.github/workflows/release.yml@refs/tags/v0.4.0-beta.3 \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com SHA256SUMS
sh scripts/rebuild.sh v0.4.0-beta.3   # rebuild and compare (x86_64, aarch64)

podnet update does the first three checks itself.

Breaking

A command or a script written for v0.4.0-beta.2 must change for each item
below.

  1. warp exec and warp shell try the netns backend first, then seccomp
    (was seccomp first). The line of the backend ends with Choice: REASON.
    Give --backend seccomp for the old choice (T-113).
  2. The netns backend refuses a TCP connect to the gateway 10.66.255.254 at
    once (a RST), and drops a datagram to it (not port 53). Before, the flow
    went to the proxy. podnet pod --host-gateway sends them to the loopback
    of the host (T-112).
  3. A pod with the seccomp backend stops at its start with exit status 3 when
    the pod cannot read the memory of a program (/proc/<pid>/mem). Before,
    the program ran and each connect was refused (T-231).
  4. A dual-stack socket that connects to the IPv4-mapped form of a fake
    address (::ffff:198.18.x.y, as .NET and Java do) goes to the proxy with
    the name. Before, the proxy got the fake address and the dial failed
    (T-233).
  5. The netns router does not take a packet with an IP header under 20 bytes,
    or a fragment past the first, as a SYN (T-234).

podnet pod doctor --json has the new object hold and the new row
read program memory (T-230, T-231). The other keys do not change.

Changes for a tester

The way out:

  • --egress SPEC on each command: direct (as --no-proxy), a proxy URL (as
    --proxy), relay or relay:URL (as --transport relay and --relay).
    With podnet pod, each --egress is one -x hop of the chain, in its
    order. The old flags stay (T-060).
  • podnet pod -x takes socks5h+unix:/PATH and http+unix:/PATH (T-060).
  • serve --ingress relay --detach and git serve --ingress relay --detach
    return when the node of the pair is connected to the relay. Before, a
    client at once got HTTP 503: reverse: node offline (T-236).

The file server and git:

  • podnet serve DIR: --list (a listing in HTML and JSON), --users FILE
    with the roles read and write, --pin, --anon-read, --hash-password,
    --upload (PUT and a form, --max-upload), more than one --local, and
    --ingress tunnel|relay|none (the road to the visitors) with --pair
    (T-088 to T-091).
  • podnet share --local and a directory in share (T-091).
  • podnet git serve --root DIR: smart HTTP through a quick tunnel, SSH with
    --authorized-keys, --ingress relay through a relay pair, git init
    and git urls (T-092 to T-094).

Pod backends (podnet pod, warp exec, warp shell):

  • warp exec --detach --name N keeps a pod under the supervisor: podnet ps, logs, stop (T-109). warp exec --join N -- CMD runs a command in
    that pod (T-110). podnet pod --session DIR shares the inbound listeners
    and the fake DNS table.
  • podnet pod --host-gateway (T-112).
  • pod doctor prints hold netns and hold seccomp: the level
    (enforced, advisory or none) and what the backend does not hold
    (T-230).
  • scripts/pod-runner-measure.sh measures the pod with the runner of
    actions/runner v2.338.2, a Node fetch, actions/checkout and
    actions/setup-node (docs/reports/pod-runner.md, T-229).

WARP:

  • Each sender that waits on the WARP QUIC socket gets its wake-up (T-228).
  • podnet uses noq through pod-quic (no quinn in the tree) (T-137).

Library and crates:

  • podnet-core has the network types (Target, Dial, Datagrams,
    Network, Link; T-055), the dialers (T-056), the combinators Chain,
    Rules, Race and Failover (T-058). podnet::networks is the registry
    of the networks and the parser of their specs (T-059).
  • podnet::road and podnet::roads: the trait Road, the table of services
    and the roads local, tunnel, relay and vnet (T-062); guard puts the users,
    the roles and the PIN on any service (T-084).
  • Balance: a group of ways with weights and a kill switch, and the health of
    each member (Up, Cooldown, Probation, Down) with its probe and its
    status document (T-096, T-097). No command uses them yet (T-099, T-100).
  • podnet takes pod-quic and pod-hold of PodUtils/podcrates v0.15.0: the
    generic core of the hold of the pod backends is in pod-hold (T-137,
    T-232).

What to report

Open an issue in PodUtils/podnet with the output of podnet doctor --json
and podnet pod doctor --json, the command, and the stderr of the command
with -v.

Limits

  • This is a beta. Each item of Breaking can change again before the stable
    release.
  • No crates.io release of podnet exists.
  • The Rekor inclusion proof is not checked by podnet update.
  • T-060: a chain of --egress works with podnet pod only. The registry has
    no WARP network yet (T-057).
  • T-229: run.sh of the runner is not measured to its long poll.
  • T-231: the rules of podnet pod do not apply to loopback TCP under the
    seccomp backend yet.

The licenses of the crates in the binaries, with their texts: THIRD-PARTY-LICENSES.md.

The commits of this release

Documents

  • docs: the hand-off of the session of 2026-11-11 (d366131)
  • docs: the hand-off names T-062 to T-097 and the release step (f677751)
  • docs: the hand-off: the notes are current (5f3c8c0)

Build, tests and CI

  • secrets: allow the test URLs of T-056 and T-092 (8a0feda)
  • live: the agent step skips when the quick-tunnel service limits the address (649c8e3)

Other

  • T-113: warp exec and warp shell try the netns backend first (44e323a)
  • T-113: done (44e323a) (80c09a4)
  • T-109: warp exec --detach --name N keeps a pod under the supervisor (6992453)
  • T-109: done (6992453) (be6dc34)
  • T-110: warp exec --join N runs a command in a detached pod (101d6e2)
  • T-110: done (101d6e2) (24f227a)
  • T-112: netns: the gateway address reaches the loopback of the host, when the user asks (af529c1)
  • T-112: done (af529c1) (025be76)
  • Merge main into wt-m7c (8eeaa8b)
  • T-088: the file server gives a listing of a directory in HTML and JSON (c1d4daf)
  • T-088: done (c1d4daf) (c0d3f29)
  • T-089: the file server has users with read and write roles, and a PIN (73e250e)
  • T-089: done (73e250e) (bdbc30e)
  • T-090: the file server takes uploads into the tree with PUT and a form (03bae2f)
  • T-090: done (03bae2f) (d402cd7)
  • T-091: serve DIR with --via, more than one --local, share --local and a directory in share (3d9e225)
  • record: T-091: partial; the live run of the file server steps waits for a live host (38dbfb3)
  • Merge T-088, T-089, T-090, T-091 (file server: listing, users and PIN, uploads, serve DIR) (50e8c7f)
  • T-228: each sender that waits on the WARP QUIC socket gets its wake-up (1d556fb)
  • T-228: done (1d556fb) (1384736)
  • T-137: take pod-quic of podcrates v0.14.0 (b7b0aef)
  • T-137: record the take of pod-quic (b7b0aef) (f163815)
  • T-227: done (v0.4.0-beta.2 at 5465007; release 42833480545, release-proofs 42836050242) (31d040f)
  • record: T-229 to T-232 from PodUtils/podvm#228 (podrunner asks; the pod-hold hand-off) (8a3ca7b)
  • T-055: add the network types to podnet-core (d9ac293)
  • T-055: done (d9ac293) (b63f656)
  • T-056: add dialers for direct, the proxy, the relay, the upstream chains, the tailnet and the vnet (03a3b49)
  • T-056: done (03a3b49) (c66997a)
  • Merge T-055, T-056 (the network types in podnet-core and the dialers) (456834e)
  • record: the calls on the start conditions (T-055, T-056, T-092) and on pod-hold (T-232) (8f7233a)
  • T-091: the live step of the file server over the relay uses a free port (7221d6b)
  • T-092: a CGI runner for git http-backend and the smart HTTP router (60a1d80)
  • T-092: done (60a1d80) (d3679f4)
  • T-094: podnet git serve, git init, git urls, the doctor line and the live steps (84b5c5e)
  • record: T-094: partial (84b5c5e); the live steps have not run (fac01ae)
  • Merge T-092 (git smart HTTP) and T-094 (podnet git serve) (b573e4d)
  • T-094: the live step of git over the relay stops its gitrelay instance (9e8d177)
  • T-094: the live git steps clone the branch main (8383095)
  • record: map #420 to #423 (#423: the live steps of T-091 and T-094) (4e81cc8)
  • record: T-091 and T-094 done (live 42851836974); the hand-off of the pause of 2026-11-10 (423bd19)
  • T-137, T-232: take pod-hold of podcrates v0.15.0 (b759937)
  • record: T-232 done (b759937); the call on podcrates T-169 and T-170 (a6ef7ef)
  • T-058: the combinators Chain, Rules, Race and Failover (8d85f9f)
  • record: T-058 done (8d85f9f) (5599012)
  • record: T-229 to T-231 open (DR-1 and DR-2 are yes, PodUtils/podcrates#55); map #424; #422 closed (291cc61)
  • T-059: the registry of networks and the parser of network specs (851a7ea)
  • record: T-059 done (851a7ea) (520b307)
  • T-233: map the IPv4-mapped form of a fake address back to its name (17da8c3)
  • T-229: measure podnet pod with the runner of actions/runner and CI payloads (bb9dd91)
  • record: T-229 (bb9dd91) and T-233 (17da8c3) done (6bc9631)
  • T-230, T-231: the hold of each backend in pod doctor; refuse seccomp with no read of the memory (ae5d1e3)
  • record: T-230 done (ae5d1e3); T-231 partial (item 2 waits for the take of connect.rs) (6e05cc3)
  • T-231: the child of a memory probe waits on a pipe (c0180cc)
  • record: map #425 (COORD-016 to podrunner); T-231 names c0180cc (7864676)
  • T-060: --egress SPEC on each command; the road of serve and git serve is --ingress (6784d84)
  • record: T-060 done (6784d84); the ruling on --egress and --ingress (8ef8b46)
  • T-234: parse_tcp_syn refuses a header under 20 bytes and a later fragment (2efa720)
  • record: T-234 done (2efa720) (f9da9e6)
  • T-235: v0.4.0-beta.3: the version and the notes (05bcf44)
  • T-062: the roads to the visitors: a trait, a table of services and four roads (cad2b33)
  • record: T-062 done (cad2b33) (46cf8d8)
  • T-236: serve and git serve on the relay road report ready when the node is connected (e6eda36)
  • T-084: one layer of users, roles and the PIN for each road (700e2b6)
  • record: T-084 done (1506e9b)
  • T-096: the group of ways with weights and a kill switch (07c21b4)
  • record: T-096 done (ce0a36b)
  • T-097: the health of the members of a group (4669f9c)
  • record: T-097 partial (4669f9c): the generic health; the WARP parts and the command wait (9a6d2a2)
  • T-235: the notes of v0.4.0-beta.3 name T-062, T-084, T-096, T-097 and T-236 (f79d3f4)
  • T-061: one front door over a dialer (5c275ed)
  • record: T-061 partial (the door over a dialer) (a3e25a6)
  • T-062: the TCP test of the local road skips on a host that refuses bind(AF_INET) (0c8fee1)