Repository navigation
List executors with RIPE Atlas-style addresses (API 1.16) - #396
Merged
Merged
Conversation
API 1.16 adds is_public, the last dispatcher-observed address_v4 and address_v6, their prefix and ASN from the existing offline ASN lookup, and address_observations (via control or reflection, observed_at and the lookup source) to GET /executors, and records the same fields in the result's admission snapshot. Only addresses the dispatcher saw on the executor's authenticated connections are listed: the control connection's peer, preferred for its family, and the peer of the existing ReflectAddress call for the other family. Executors now make that call over each family every ten minutes, resolving dispatcher.addr and verifying the dispatcher's certificate for its name; [connectivity] observe_addresses turns it off, and a family with a configured reflector is not called twice. Observations end with the control session, like connectivity proof. [metadata] address_opt_out makes an executor private, as a RIPE Atlas host can: the public listing withholds its addresses and nothing else. It is independent of location_opt_out. Executors are public by default, including older ones, so the privacy note and changelog say how to stay private before the dispatcher is upgraded. dbl nodes adds ADDRESS_V4 and ADDRESS_V6 columns. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The compatibility canary pins the exact JSON shape of dbl nodes and refused the new is_public, address, prefix, ASN and address_observations fields. Allow them, null for an older dispatcher, and check the observation records' shape. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vincent10400094
force-pushed
the
feat/public-probe-addresses
branch
from
October 6, 2026 04:21
60d71b9 to
2624bf9
Compare
vincent10400094
commented
Oct 6, 2026
vincent10400094
left a comment
Member
Author
There was a problem hiding this comment.
Reviewed rebased head 2624bf9. Address observations are authenticated dispatcher-peer observations, never executor-provided values; the public listing has an explicit address opt-out; and the API/CLI/docs cover the resulting visibility and operator access. All required CI checks pass on this head. GitHub does not permit author self-approval, so this comment records the completed review before the authorized administrator merge.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The public executor listing follows the RIPE Atlas probe model for addresses and privacy (API 1.16).
GET /executorsaddsis_public,address_v4,address_v6,prefix_v4,prefix_v6,asn_v4,asn_v6andaddress_observations. The result admission snapshot records the same fields asprovenance.vantage_point.addressing(result format 1.1, schema 1, additive).via: control, preferred for its family,observed_at= last heartbeat of that session) or the existingReflectAddresscall (via: reflection,observed_at= receipt). The dispatcher records the TCP peer, never a request value;public_hostand the hello source IP stay operator-only claims. Observations end with the control session, as connectivity proof already does, so a moved executor does not keep its old address.ReflectAddressover each family every 10 minutes, resolving the host ofdispatcher.addrand verifying the dispatcher certificate for that name (a resolved address that is not the dispatcher fails TLS). Families with a configured reflector are skipped, since their 30 s check already reflects.[connectivity] observe_addresses = falseturns it off. It feeds the listing only, never the connectivity report or admission.ip_metadata.observed.asn, the reflected family is looked up on receipt. No change to the lookup source, sofeat/ris-asn-databaseslots in unchanged.[metadata] address_opt_out = true(protocol fieldVantagePointReport.address_opt_out = 13, read at registration likelocation_opt_out) makes the executor private: the public listing withholds both addresses and nothing else. Established operators still see them; the run owner sees them in provenance.is_publicandlocation_opt_outare independent, as in RIPE Atlas (a private probe keeps its location public; location is the host's own choice). Rationale is indocs/vantage-points.md#privacy.address_opt_outfirst to stay private./executors/by-ipand/attribution/candidatesare unchanged.dbl nodesaddsADDRESS_V4andADDRESS_V6columns (privatewhen withheld,-when unknown, invalid values are not printed);--output jsoncarries every field.Example entry (other fields elided):
{ "id": "eth-zurich-1", "is_public": true, "address_v4": "192.0.2.10", "address_v6": "2001:db8:10::7", "prefix_v4": "192.0.2.0/24", "prefix_v6": "2001:db8::/32", "asn_v4": 64500, "asn_v6": 64500, "address_observations": { "v4": {"source": "dispatcher-observed", "via": "control", "observed_at": 1791250000, "lookup_source": "database:GeoLite2-ASN@1790000000", "lookup_reason": ""}, "v6": {"source": "dispatcher-observed", "via": "reflection", "observed_at": 1791249700, "lookup_source": "database:GeoLite2-ASN@1790000000", "lookup_reason": ""} } }Coordination
VantagePointReport(13), one line incapabilityReportbesideLocationOptOut, one struct field each inExecutor/RegisteredExecutor, and one line inRegisterExecutor. The rest is new files (internal/dispatcher/probe_addresses.go,internal/executor/address_observation.go,pkg/wire/probe.go).Testing
go testforinternal/dispatcher/...,internal/executor/...,pkg/...,cmd/dbl(macOS-only failures incmd/dblexecutor-join,internal/executor/debugletlistener quota and the canary driver also fail onmainlocally; CI runs them on Linux).internal/dispatcher/probe_addresses_test.go); real IPv6 reflection over[::1]throughReflectAddressAsand no carry-over to a replacement session; HTTP listing public/private/operator views validated against the OpenAPI contract (internal/dispatcher/transport/api/probe_addresses_test.go); config defaults; reflection targets;dbl nodescolumns.scripts/ci-generate.sh write-proto, gofmt,go vet.🤖 Generated with Claude Code