|
|
|
|
@ -20,7 +20,6 @@ import (
|
|
|
|
|
"tailscale.com/ipn/ipnauth"
|
|
|
|
|
"tailscale.com/ipn/ipnext"
|
|
|
|
|
"tailscale.com/tailcfg"
|
|
|
|
|
"tailscale.com/tsd"
|
|
|
|
|
"tailscale.com/types/logger"
|
|
|
|
|
"tailscale.com/util/execqueue"
|
|
|
|
|
"tailscale.com/util/testenv"
|
|
|
|
|
@ -131,15 +130,32 @@ type Backend interface {
|
|
|
|
|
// SwitchToBestProfile switches to the best profile for the current state of the system.
|
|
|
|
|
// The reason indicates why the profile is being switched.
|
|
|
|
|
SwitchToBestProfile(reason string)
|
|
|
|
|
|
|
|
|
|
SendNotify(ipn.Notify)
|
|
|
|
|
ipnext.SafeBackend
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// NewExtensionHost returns a new [ExtensionHost] which manages registered extensions for the given backend.
|
|
|
|
|
// The extensions are instantiated, but are not initialized until [ExtensionHost.Init] is called.
|
|
|
|
|
// It returns an error if instantiating any extension fails.
|
|
|
|
|
func NewExtensionHost(logf logger.Logf, b Backend) (*ExtensionHost, error) {
|
|
|
|
|
return newExtensionHost(logf, b)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewExtensionHostForTest(logf logger.Logf, b Backend, overrideExts ...*ipnext.Definition) (*ExtensionHost, error) {
|
|
|
|
|
if !testenv.InTest() {
|
|
|
|
|
panic("use outside of test")
|
|
|
|
|
}
|
|
|
|
|
return newExtensionHost(logf, b, overrideExts...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// newExtensionHost is the shared implementation of [NewExtensionHost] and
|
|
|
|
|
// [NewExtensionHostForTest].
|
|
|
|
|
//
|
|
|
|
|
// If overrideExts is non-nil, the registered extensions are ignored and the provided extensions are used instead.
|
|
|
|
|
// Overriding extensions is primarily used for testing.
|
|
|
|
|
func NewExtensionHost(logf logger.Logf, sys *tsd.System, b Backend, overrideExts ...*ipnext.Definition) (_ *ExtensionHost, err error) {
|
|
|
|
|
// If overrideExts is non-nil, the registered extensions are ignored and the
|
|
|
|
|
// provided extensions are used instead. Overriding extensions is primarily used
|
|
|
|
|
// for testing.
|
|
|
|
|
func newExtensionHost(logf logger.Logf, b Backend, overrideExts ...*ipnext.Definition) (_ *ExtensionHost, err error) {
|
|
|
|
|
host := &ExtensionHost{
|
|
|
|
|
b: b,
|
|
|
|
|
logf: logger.WithPrefix(logf, "ipnext: "),
|
|
|
|
|
@ -172,7 +188,7 @@ func NewExtensionHost(logf logger.Logf, sys *tsd.System, b Backend, overrideExts
|
|
|
|
|
|
|
|
|
|
host.allExtensions = make([]ipnext.Extension, 0, numExts)
|
|
|
|
|
for _, d := range exts {
|
|
|
|
|
ext, err := d.MakeExtension(logf, sys)
|
|
|
|
|
ext, err := d.MakeExtension(logf, b)
|
|
|
|
|
if errors.Is(err, ipnext.SkipExtension) {
|
|
|
|
|
// The extension wants to be skipped.
|
|
|
|
|
host.logf("%q: %v", d.Name(), err)
|
|
|
|
|
@ -334,12 +350,14 @@ func (h *ExtensionHost) SwitchToBestProfileAsync(reason string) {
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Backend returns the [Backend] used by the extension host.
|
|
|
|
|
func (h *ExtensionHost) Backend() Backend {
|
|
|
|
|
// SendNotifyAsync implements [ipnext.Host].
|
|
|
|
|
func (h *ExtensionHost) SendNotifyAsync(n ipn.Notify) {
|
|
|
|
|
if h == nil {
|
|
|
|
|
return nil
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
return h.b
|
|
|
|
|
h.enqueueBackendOperation(func(b Backend) {
|
|
|
|
|
b.SendNotify(n)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// addFuncHook appends non-nil fn to hooks.
|
|
|
|
|
|