|
|
|
|
@ -2397,6 +2397,7 @@ func (b *LocalBackend) Start(opts ipn.Options) error {
|
|
|
|
|
|
|
|
|
|
func (b *LocalBackend) startLocked(opts ipn.Options) error {
|
|
|
|
|
b.logf("Start")
|
|
|
|
|
logf := logger.WithPrefix(b.logf, "Start: ")
|
|
|
|
|
b.startOnce.Do(b.initOnce)
|
|
|
|
|
|
|
|
|
|
var clientToShutdown controlclient.Client
|
|
|
|
|
@ -2426,7 +2427,7 @@ func (b *LocalBackend) startLocked(opts ipn.Options) error {
|
|
|
|
|
if b.state != ipn.Running && b.conf == nil && opts.AuthKey == "" {
|
|
|
|
|
sysak, _ := b.polc.GetString(pkey.AuthKey, "")
|
|
|
|
|
if sysak != "" {
|
|
|
|
|
b.logf("Start: setting opts.AuthKey by syspolicy, len=%v", len(sysak))
|
|
|
|
|
logf("setting opts.AuthKey by syspolicy, len=%v", len(sysak))
|
|
|
|
|
opts.AuthKey = strings.TrimSpace(sysak)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -2459,11 +2460,13 @@ func (b *LocalBackend) startLocked(opts ipn.Options) error {
|
|
|
|
|
|
|
|
|
|
cn := b.currentNode()
|
|
|
|
|
|
|
|
|
|
prefsChanged := false
|
|
|
|
|
var prefsChanged bool
|
|
|
|
|
var prefsChangedWhy []string
|
|
|
|
|
newPrefs := b.pm.CurrentPrefs().AsStruct()
|
|
|
|
|
if opts.UpdatePrefs != nil {
|
|
|
|
|
newPrefs = opts.UpdatePrefs.Clone()
|
|
|
|
|
prefsChanged = true
|
|
|
|
|
prefsChangedWhy = append(prefsChangedWhy, "opts.UpdatePrefs")
|
|
|
|
|
}
|
|
|
|
|
// Apply any syspolicy overrides, resolve exit node ID, etc.
|
|
|
|
|
// As of 2025-07-03, this is primarily needed in two cases:
|
|
|
|
|
@ -2471,6 +2474,7 @@ func (b *LocalBackend) startLocked(opts ipn.Options) error {
|
|
|
|
|
// - when Always Mode is enabled and we need to set WantRunning to true
|
|
|
|
|
if b.reconcilePrefsLocked(newPrefs) {
|
|
|
|
|
prefsChanged = true
|
|
|
|
|
prefsChangedWhy = append(prefsChangedWhy, "reconcilePrefsLocked")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// neither UpdatePrefs or reconciliation should change Persist
|
|
|
|
|
@ -2478,19 +2482,21 @@ func (b *LocalBackend) startLocked(opts ipn.Options) error {
|
|
|
|
|
|
|
|
|
|
if buildfeatures.HasTPM {
|
|
|
|
|
if genKey, ok := feature.HookGenerateAttestationKeyIfEmpty.GetOk(); ok {
|
|
|
|
|
newKey, err := genKey(newPrefs.Persist, b.logf)
|
|
|
|
|
newKey, err := genKey(newPrefs.Persist, logf)
|
|
|
|
|
if err != nil {
|
|
|
|
|
b.logf("failed to populate attestation key from TPM: %v", err)
|
|
|
|
|
logf("failed to populate attestation key from TPM: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if newKey {
|
|
|
|
|
prefsChanged = true
|
|
|
|
|
prefsChangedWhy = append(prefsChangedWhy, "newKey")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if prefsChanged {
|
|
|
|
|
logf("updated prefs: %v, reason: %v", newPrefs.Pretty(), prefsChangedWhy)
|
|
|
|
|
if err := b.pm.SetPrefs(newPrefs.View(), cn.NetworkProfile()); err != nil {
|
|
|
|
|
b.logf("failed to save updated and reconciled prefs: %v", err)
|
|
|
|
|
logf("failed to save updated and reconciled prefs (but still using updated prefs in memory): %v", err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
prefs := newPrefs.View()
|
|
|
|
|
@ -2510,7 +2516,7 @@ func (b *LocalBackend) startLocked(opts ipn.Options) error {
|
|
|
|
|
|
|
|
|
|
serverURL := prefs.ControlURLOrDefault(b.polc)
|
|
|
|
|
if inServerMode := prefs.ForceDaemon(); inServerMode || runtime.GOOS == "windows" {
|
|
|
|
|
b.logf("Start: serverMode=%v", inServerMode)
|
|
|
|
|
logf("serverMode=%v", inServerMode)
|
|
|
|
|
}
|
|
|
|
|
b.applyPrefsToHostinfoLocked(hostinfo, prefs)
|
|
|
|
|
|
|
|
|
|
@ -2578,7 +2584,7 @@ func (b *LocalBackend) startLocked(opts ipn.Options) error {
|
|
|
|
|
endpoints := b.endpoints
|
|
|
|
|
|
|
|
|
|
if err := b.initTKALocked(); err != nil {
|
|
|
|
|
b.logf("initTKALocked: %v", err)
|
|
|
|
|
logf("initTKALocked: %v", err)
|
|
|
|
|
}
|
|
|
|
|
var tkaHead string
|
|
|
|
|
if b.tka != nil {
|
|
|
|
|
|