controlclient

package
v1.0.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 7, 2020 License: BSD-3-Clause Imports: 37 Imported by: 26

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

View Source
const (
	StateNew = State(iota)
	StateNotAuthenticated
	StateAuthenticating
	StateURLVisitRequired
	StateAuthenticated
	StateSynchronized // connected and received map update
)
View Source
const (
	LoginDefault     = LoginFlags(0)
	LoginInteractive = LoginFlags(1 << iota) // force user login and key refresh
)
View Source
const EndpointDiscoSuffix = ".disco.tailscale:12345"

EndpointDiscoSuffix is appended to the hex representation of a peer's discovery key and is then the sole wireguard endpoint for peers with a non-zero discovery key. This form is then recognize by magicsock's CreateEndpoint.

Variables

View Source
var Debug = initDebug()

Debug contains temporary internal-only debug knobs. They're unexported to not draw attention to them.

Functions

func NewHostinfo

func NewHostinfo() *tailcfg.Hostinfo

Types

type Client

type Client struct {
	// contains filtered or unexported fields
}

Client connects to a tailcontrol server for a node.

func New

func New(opts Options) (*Client, error)

New creates and starts a new Client.

func NewNoStart

func NewNoStart(opts Options) (*Client, error)

NewNoStart creates a new Client, but without calling Start on it.

func (*Client) AuthCantContinue

func (c *Client) AuthCantContinue() bool

func (*Client) Direct added in v0.98.1

func (c *Client) Direct() *Direct

Direct returns the underlying direct client object. Used in tests only.

func (*Client) Expiry added in v0.98.1

func (c *Client) Expiry() *time.Time

Expiry returns the credential expiration time, or the zero time if the expiration time isn't known. Used in tests only.

func (*Client) Login

func (c *Client) Login(t *oauth2.Token, flags LoginFlags)

func (*Client) Logout

func (c *Client) Logout()

func (*Client) SetHostinfo

func (c *Client) SetHostinfo(hi *tailcfg.Hostinfo)

func (*Client) SetNetInfo

func (c *Client) SetNetInfo(ni *tailcfg.NetInfo)

func (*Client) SetStatusFunc

func (c *Client) SetStatusFunc(fn func(Status))

func (*Client) Shutdown

func (c *Client) Shutdown()

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

func (c *Client) TestOnlyNodePublicKey() wgcfg.Key

NodePublicKey returns the node public key currently in use. This is used exclusively in tests.

func (*Client) TestOnlySetAuthKey added in v0.98.1

func (c *Client) TestOnlySetAuthKey(authkey string)

func (*Client) TestOnlyTimeNow added in v0.98.1

func (c *Client) TestOnlyTimeNow() time.Time

func (*Client) UpdateEndpoints

func (c *Client) UpdateEndpoints(localPort uint16, endpoints []string)

type Decompressor

type Decompressor interface {
	DecodeAll(input, dst []byte) ([]byte, error)
	Close()
}

type Direct

type Direct struct {
	// contains filtered or unexported fields
}

Direct is the client that connects to a tailcontrol server for a node.

func NewDirect

func NewDirect(opts Options) (*Direct, error)

NewDirect returns a new Direct client.

func (*Direct) GetPersist

func (c *Direct) GetPersist() Persist

func (*Direct) PollNetMap

func (c *Direct) PollNetMap(ctx context.Context, maxPolls int, cb func(*NetworkMap)) error

func (*Direct) SetEndpoints

func (c *Direct) SetEndpoints(localPort uint16, endpoints []string) (changed bool)

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

func (c *Direct) SetHostinfo(hi *tailcfg.Hostinfo) bool

SetHostinfo clones the provided Hostinfo and remembers it for the next update. It reports whether the Hostinfo has changed.

func (*Direct) SetNetInfo

func (c *Direct) SetNetInfo(ni *tailcfg.NetInfo) bool

SetNetInfo clones the provided NetInfo and remembers it for the next update. It reports whether the NetInfo has changed.

func (*Direct) TryLogin

func (c *Direct) TryLogin(ctx context.Context, t *oauth2.Token, flags LoginFlags) (url string, err error)

func (*Direct) TryLogout

func (c *Direct) TryLogout(ctx context.Context) error

func (*Direct) WaitLoginURL

func (c *Direct) WaitLoginURL(ctx context.Context, url string) (newUrl string, err error)

type LoginFlags

type LoginFlags int

type LoginGoal

type LoginGoal struct {
	// contains filtered or unexported fields
}

type NetworkMap

type NetworkMap struct {
	NodeKey    tailcfg.NodeKey
	PrivateKey wgcfg.PrivateKey
	Expiry     time.Time
	// Name is the DNS name assigned to this node.
	Name          string
	Addresses     []wgcfg.CIDR
	LocalPort     uint16 // used for debugging
	MachineStatus tailcfg.MachineStatus
	Peers         []*tailcfg.Node // sorted by Node.ID
	DNS           tailcfg.DNSConfig
	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

	// Debug knobs from control server for debug or feature gating.
	Debug *tailcfg.Debug

	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) JSON

func (nm *NetworkMap) JSON() string

func (NetworkMap) String

func (nm NetworkMap) String() string

func (*NetworkMap) WGCfg

func (nm *NetworkMap) WGCfg(logf logger.Logf, flags WGConfigFlags) (*wgcfg.Config, error)

WGCfg returns the NetworkMaps's Wireguard configuration.

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
	DiscoPublicKey  tailcfg.DiscoKey
	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
}

func (*Persist) Clone added in v1.0.0

func (src *Persist) Clone() *Persist

Clone makes a deep copy of Persist. The result aliases no memory with the original.

func (*Persist) Equals

func (p *Persist) Equals(p2 *Persist) bool

func (*Persist) Pretty

func (p *Persist) Pretty() string

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

func (s State) MarshalText() ([]byte, error)

func (State) String added in v0.98.1

func (s State) String() 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
	State         State
	// contains filtered or unexported fields
}

func (*Status) Equal

func (s *Status) Equal(s2 *Status) bool

Equal reports whether s and s2 are equal.

func (Status) String

func (s Status) String() string

type WGConfigFlags added in v1.0.0

type WGConfigFlags int

WGConfigFlags is a bitmask of flags to control the behavior of the wireguard configuration generation done by NetMap.WGCfg.

const (
	AllowSingleHosts WGConfigFlags = 1 << iota
	AllowSubnetRoutes
	AllowDefaultRoute
	HackDefaultRoute
)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL