Documentation ¶
Overview ¶
Package controlclient implements the client for the Tailscale control plane.
It handles authentication, port picking, and collects the local network configuration.
Index ¶
- Constants
- func NewHostinfo() *tailcfg.Hostinfo
- func UFlagsHelper(uroutes, rroutes, droutes bool) int
- type Client
- func (c *Client) AuthCantContinue() bool
- func (c *Client) Direct() *Direct
- func (c *Client) Expiry() *time.Time
- func (c *Client) Login(t *oauth2.Token, flags LoginFlags)
- func (c *Client) Logout()
- func (c *Client) SetHostinfo(hi *tailcfg.Hostinfo)
- func (c *Client) SetNetInfo(ni *tailcfg.NetInfo)
- func (c *Client) SetStatusFunc(fn func(Status))
- func (c *Client) Shutdown()
- func (c *Client) Start()
- func (c *Client) TestOnlyNodePublicKey() wgcfg.Key
- func (c *Client) TestOnlySetAuthKey(authkey string)
- func (c *Client) TestOnlyTimeNow() time.Time
- func (c *Client) UpdateEndpoints(localPort uint16, endpoints []string)
- type Decompressor
- type Direct
- func (c *Direct) GetPersist() Persist
- func (c *Direct) PollNetMap(ctx context.Context, maxPolls int, cb func(*NetworkMap)) error
- func (c *Direct) SetEndpoints(localPort uint16, endpoints []string) (changed bool)
- func (c *Direct) SetHostinfo(hi *tailcfg.Hostinfo) bool
- func (c *Direct) SetNetInfo(ni *tailcfg.NetInfo) bool
- func (c *Direct) TryLogin(ctx context.Context, t *oauth2.Token, flags LoginFlags) (url string, err error)
- func (c *Direct) TryLogout(ctx context.Context) error
- func (c *Direct) WaitLoginURL(ctx context.Context, url string) (newUrl string, err error)
- type LoginFlags
- type LoginGoal
- type NetworkMap
- func (nm *NetworkMap) Concise() string
- func (b *NetworkMap) ConciseDiffFrom(a *NetworkMap) string
- func (n *NetworkMap) Equal(n2 *NetworkMap) bool
- func (nm *NetworkMap) JSON() string
- func (nm NetworkMap) String() string
- func (nm *NetworkMap) UAPI(uflags int, dnsOverride []wgcfg.IP) string
- func (nm *NetworkMap) WGCfg(uflags int, dnsOverride []wgcfg.IP) (*wgcfg.Config, error)
- func (nm *NetworkMap) WireGuardConfigOneEndpoint(uflags int, dnsOverride []wgcfg.IP) string
- type Options
- type Persist
- type State
- type Status
Constants ¶
const ( StateNew = State(iota) StateNotAuthenticated StateAuthenticating StateURLVisitRequired StateAuthenticated StateSynchronized // connected and received map update )
const ( LoginDefault = LoginFlags(0) LoginInteractive = LoginFlags(1 << iota) // force user login and key refresh )
const ( UAllowSingleHosts = 1 << iota UAllowSubnetRoutes UAllowDefaultRoute UHackDefaultRoute UDefault = 0 )
Variables ¶
This section is empty.
Functions ¶
func NewHostinfo ¶
func UFlagsHelper ¶
Several programs need to parse these arguments into uflags, so let's centralize it here.
Types ¶
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client connects to a tailcontrol server for a node.
func NewNoStart ¶
NewNoStart creates a new Client, but without calling Start on it.
func (*Client) AuthCantContinue ¶
func (*Client) Direct ¶ added in v0.98.1
Direct returns the underlying direct client object. Used in tests only.
func (*Client) Expiry ¶ added in v0.98.1
Expiry returns the credential expiration time, or the zero time if the expiration time isn't known. Used in tests only.
func (*Client) SetHostinfo ¶
func (*Client) SetNetInfo ¶
func (*Client) SetStatusFunc ¶
func (*Client) Start ¶
func (c *Client) Start()
Start starts the client's goroutines.
It should only be called for clients created by NewNoStart.
func (*Client) TestOnlyNodePublicKey ¶ added in v0.98.1
NodePublicKey returns the node public key currently in use. This is used exclusively in tests.
func (*Client) TestOnlySetAuthKey ¶ added in v0.98.1
func (*Client) TestOnlyTimeNow ¶ added in v0.98.1
func (*Client) UpdateEndpoints ¶
type Decompressor ¶
type Direct ¶
type Direct struct {
// contains filtered or unexported fields
}
Direct is the client that connects to a tailcontrol server for a node.
func (*Direct) GetPersist ¶
func (*Direct) PollNetMap ¶
func (*Direct) SetEndpoints ¶
SetEndpoints updates the list of locally advertised endpoints. It won't be replicated to the server until a *fresh* call to PollNetMap(). You don't need to restart PollNetMap if we return changed==false.
func (*Direct) SetHostinfo ¶
SetHostinfo clones the provided Hostinfo and remembers it for the next update. It reports whether the Hostinfo has changed.
func (*Direct) SetNetInfo ¶
SetNetInfo clones the provided NetInfo and remembers it for the next update. It reports whether the NetInfo has changed.
type LoginFlags ¶
type LoginFlags int
type NetworkMap ¶
type NetworkMap struct { NodeKey tailcfg.NodeKey PrivateKey wgcfg.PrivateKey Expiry time.Time Addresses []wgcfg.CIDR LocalPort uint16 // used for debugging MachineStatus tailcfg.MachineStatus Peers []*tailcfg.Node DNS []wgcfg.IP DNSDomains []string Hostinfo tailcfg.Hostinfo PacketFilter filter.Matches // DERPMap is the last DERP server map received. It's reused // between updates and should not be modified. DERPMap *tailcfg.DERPMap User tailcfg.UserID Domain string // TODO(crawshaw): reduce UserProfiles to []tailcfg.UserProfile? // There are lots of ways to slice this data, leave it up to users. UserProfiles map[tailcfg.UserID]tailcfg.UserProfile Roles []tailcfg.Role }
func (*NetworkMap) Concise ¶
func (nm *NetworkMap) Concise() string
func (*NetworkMap) ConciseDiffFrom ¶
func (b *NetworkMap) ConciseDiffFrom(a *NetworkMap) string
func (*NetworkMap) Equal ¶
func (n *NetworkMap) Equal(n2 *NetworkMap) bool
func (*NetworkMap) JSON ¶
func (nm *NetworkMap) JSON() string
func (NetworkMap) String ¶
func (nm NetworkMap) String() string
func (*NetworkMap) UAPI ¶
func (nm *NetworkMap) UAPI(uflags int, dnsOverride []wgcfg.IP) string
TODO(bradfitz): UAPI seems to only be used by the old confnode and pingnode; delete this when those are deleted/rewritten?
func (*NetworkMap) WireGuardConfigOneEndpoint ¶
func (nm *NetworkMap) WireGuardConfigOneEndpoint(uflags int, dnsOverride []wgcfg.IP) string
TODO(apenwarr): This mode is dangerous. Discarding the extra endpoints is almost universally the wrong choice. Except that plain wireguard can't handle a peer with multiple endpoints. (Yet?)
type Options ¶
type Options struct { Persist Persist // initial persistent data ServerURL string // URL of the tailcontrol server AuthKey string // optional node auth key for auto registration TimeNow func() time.Time // time.Now implementation used by Client Hostinfo *tailcfg.Hostinfo // non-nil passes ownership, nil means to use default using os.Hostname, etc NewDecompressor func() (Decompressor, error) KeepAlive bool Logf logger.Logf HTTPTestClient *http.Client // optional HTTP client to use (for tests only) }
type Persist ¶
type Persist struct { PrivateMachineKey wgcfg.PrivateKey PrivateNodeKey wgcfg.PrivateKey OldPrivateNodeKey wgcfg.PrivateKey // needed to request key rotation Provider string LoginName string // contains filtered or unexported fields }
type State ¶ added in v0.98.1
type State int
State is the high-level state of the client. It is used only in unit tests for proper sequencing, don't depend on it anywhere else. TODO(apenwarr): eliminate 'state', as it's now obsolete.
func (State) MarshalText ¶ added in v0.98.1
type Status ¶
type Status struct { LoginFinished *empty.Message Err string URL string Persist *Persist // locally persisted configuration NetMap *NetworkMap // server-pushed configuration Hostinfo *tailcfg.Hostinfo // current Hostinfo data State State // contains filtered or unexported fields }