Repository navigation
podnet v0.4.0-beta.3
Pre-releaseA 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.
warp execandwarp shelltry the netns backend first, then seccomp
(was seccomp first). The line of the backend ends withChoice: REASON.
Give--backend seccompfor the old choice (T-113).- The netns backend refuses a TCP connect to the gateway
10.66.255.254at
once (a RST), and drops a datagram to it (not port 53). Before, the flow
went to the proxy.podnet pod --host-gatewaysends them to the loopback
of the host (T-112). - 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 eachconnectwas refused (T-231). - 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). - 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 SPECon each command:direct(as--no-proxy), a proxy URL (as
--proxy),relayorrelay:URL(as--transport relayand--relay).
Withpodnet pod, each--egressis one-xhop of the chain, in its
order. The old flags stay (T-060).podnet pod -xtakessocks5h+unix:/PATHandhttp+unix:/PATH(T-060).serve --ingress relay --detachandgit serve --ingress relay --detach
return when the node of the pair is connected to the relay. Before, a
client at once gotHTTP 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 --localand a directory inshare(T-091).podnet git serve --root DIR: smart HTTP through a quick tunnel, SSH with
--authorized-keys,--ingress relaythrough a relay pair,git init
andgit urls(T-092 to T-094).
Pod backends (podnet pod, warp exec, warp shell):
warp exec --detach --name Nkeeps a pod under the supervisor:podnet ps,logs,stop(T-109).warp exec --join N -- CMDruns a command in
that pod (T-110).podnet pod --session DIRshares the inbound listeners
and the fake DNS table.podnet pod --host-gateway(T-112).pod doctorprintshold netnsandhold seccomp: the level
(enforced,advisoryornone) and what the backend does not hold
(T-230).scripts/pod-runner-measure.shmeasures the pod with the runner of
actions/runnerv2.338.2, a Nodefetch,actions/checkoutand
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-corehas the network types (Target,Dial,Datagrams,
Network,Link; T-055), the dialers (T-056), the combinatorsChain,
Rules,RaceandFailover(T-058).podnet::networksis the registry
of the networks and the parser of their specs (T-059).podnet::roadandpodnet::roads: the traitRoad, the table of services
and the roads local, tunnel, relay and vnet (T-062);guardputs 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-quicandpod-holdofPodUtils/podcratesv0.15.0: the
generic core of the hold of the pod backends is inpod-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
podnetexists. - The Rekor inclusion proof is not checked by
podnet update. - T-060: a chain of
--egressworks withpodnet podonly. The registry has
no WARP network yet (T-057). - T-229:
run.shof the runner is not measured to its long poll. - T-231: the rules of
podnet poddo 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)