|
|
|
@ -85,17 +85,17 @@ type Direct struct {
|
|
|
|
|
persist Persist
|
|
|
|
|
tryingNewKey wgcfg.PrivateKey
|
|
|
|
|
expiry *time.Time
|
|
|
|
|
hostinfo tailcfg.Hostinfo
|
|
|
|
|
hostinfo *tailcfg.Hostinfo // always non-nil
|
|
|
|
|
endpoints []string
|
|
|
|
|
localPort uint16 // or zero to mean auto
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
@ -120,9 +120,9 @@ func NewDirect(opts Options) (*Direct, error) {
|
|
|
|
|
}
|
|
|
|
|
if opts.Logf == nil {
|
|
|
|
|
// TODO(apenwarr): remove this default and fail instead.
|
|
|
|
|
// TODO(bradfitz): ... but then it shouldn't be in Options.
|
|
|
|
|
opts.Logf = log.Printf
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
c := &Direct{
|
|
|
|
|
httpc: opts.HTTPC,
|
|
|
|
|
serverURL: opts.ServerURL,
|
|
|
|
@ -135,38 +135,46 @@ func NewDirect(opts Options) (*Direct, error) {
|
|
|
|
|
if opts.Hostinfo == nil {
|
|
|
|
|
c.SetHostinfo(NewHostinfo())
|
|
|
|
|
} else {
|
|
|
|
|
c.SetHostinfo(*opts.Hostinfo)
|
|
|
|
|
c.SetHostinfo(opts.Hostinfo)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return c, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewHostinfo() tailcfg.Hostinfo {
|
|
|
|
|
hostname, _ := os.Hostname()
|
|
|
|
|
func hostinfoOS() string {
|
|
|
|
|
os := runtime.GOOS
|
|
|
|
|
switch os {
|
|
|
|
|
case "darwin":
|
|
|
|
|
switch runtime.GOARCH {
|
|
|
|
|
case "arm", "arm64":
|
|
|
|
|
os = "iOS"
|
|
|
|
|
return "iOS"
|
|
|
|
|
default:
|
|
|
|
|
os = "macOS"
|
|
|
|
|
return "macOS"
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
|
return os
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return tailcfg.Hostinfo{
|
|
|
|
|
func NewHostinfo() *tailcfg.Hostinfo {
|
|
|
|
|
hostname, _ := os.Hostname()
|
|
|
|
|
return &tailcfg.Hostinfo{
|
|
|
|
|
IPNVersion: version.LONG,
|
|
|
|
|
Hostname: hostname,
|
|
|
|
|
OS: os,
|
|
|
|
|
OS: hostinfoOS(),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *Direct) SetHostinfo(hi tailcfg.Hostinfo) {
|
|
|
|
|
// SetHostinfo clones the provided Hostinfo and remembers it for the
|
|
|
|
|
// next update.
|
|
|
|
|
func (c *Direct) SetHostinfo(hi *tailcfg.Hostinfo) {
|
|
|
|
|
if hi == nil {
|
|
|
|
|
panic("nil Hostinfo")
|
|
|
|
|
}
|
|
|
|
|
c.mu.Lock()
|
|
|
|
|
defer c.mu.Unlock()
|
|
|
|
|
|
|
|
|
|
c.logf("Hostinfo: %v\n", hi)
|
|
|
|
|
c.hostinfo = hi
|
|
|
|
|
c.hostinfo = hi.Copy()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *Direct) GetPersist() Persist {
|
|
|
|
|