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) 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) 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)
- func (c *Direct) SetNetInfo(ni *tailcfg.NetInfo)
- 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) UserMap() map[string][]filter.IP
- 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 Status
Constants ¶
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) 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) 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.
func (*Direct) SetNetInfo ¶
SetNetInfo clones the provided NetInfo and remembers it for the next update.
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 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) UserMap ¶
func (nm *NetworkMap) UserMap() map[string][]filter.IP
TODO(apenwarr): delete me once relaynode doesn't need this anymore. control.go:userMap() supercedes it. This does not belong in the client.
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 HTTPC *http.Client // HTTP client used to talk to tailcontrol ServerURL string // URL of the tailcontrol server 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 }
type Persist ¶
type Persist struct { PrivateMachineKey wgcfg.PrivateKey PrivateNodeKey wgcfg.PrivateKey OldPrivateNodeKey wgcfg.PrivateKey // needed to request key rotation Provider string LoginName string }
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 // contains filtered or unexported fields }