In order to support a `tailscale routecheck` command, we introduce the `/localapi/v0/routecheck` endpoint to the local API. This endpoint returns the most recent report collected by the routecheck client. If `force=true` is an argument in the query string, then this endpoint will actively probe before returning the report. Updates #17366 Updates tailscale/corp#33033 Signed-off-by: Simon Law <sfllaw@tailscale.com>
33 lines
855 B
Go
33 lines
855 B
Go
// Copyright (c) Tailscale Inc & contributors
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package routecheck
|
|
|
|
import (
|
|
"tailscale.com/ipn/ipnext"
|
|
"tailscale.com/ipn/ipnlocal"
|
|
"tailscale.com/net/routecheck"
|
|
)
|
|
|
|
// ClientFor returns the [routecheck.Client] for a given backend,
|
|
// or nil if route checking is not available for that backend.
|
|
func ClientFor(b *ipnlocal.LocalBackend) *routecheck.Client {
|
|
e, ok := ipnlocal.GetExt[*Extension](b)
|
|
if e == nil || !ok {
|
|
return nil
|
|
}
|
|
return e.Client
|
|
}
|
|
|
|
// Report contains the result of a single routecheck.
|
|
type Report = routecheck.Report
|
|
|
|
// NodeBackender is a shim between [ipnext.Host] and [routecheck.NodeBackender].
|
|
type nodeBackender struct{ ipnext.Host }
|
|
|
|
var _ routecheck.NodeBackender = nodeBackender{}
|
|
|
|
func (nb nodeBackender) NodeBackend() routecheck.NodeBackend {
|
|
return nb.Host.NodeBackend()
|
|
}
|