|
|
|
@ -595,7 +595,7 @@ func (b *LocalBackend) Start(opts ipn.Options) error {
|
|
|
|
|
b.hostinfo = hostinfo
|
|
|
|
|
b.state = ipn.NoState
|
|
|
|
|
|
|
|
|
|
if err := b.loadStateLocked(opts.StateKey, opts.Prefs, opts.LegacyConfigPath); err != nil {
|
|
|
|
|
if err := b.loadStateLocked(opts.StateKey, opts.Prefs); err != nil {
|
|
|
|
|
b.mu.Unlock()
|
|
|
|
|
return fmt.Errorf("loading requested state: %v", err)
|
|
|
|
|
}
|
|
|
|
@ -1078,7 +1078,7 @@ func (b *LocalBackend) writeServerModeStartState(userID string, prefs *ipn.Prefs
|
|
|
|
|
// loadStateLocked sets b.prefs and b.stateKey based on a complex
|
|
|
|
|
// combination of key, prefs, and legacyPath. b.mu must be held when
|
|
|
|
|
// calling.
|
|
|
|
|
func (b *LocalBackend) loadStateLocked(key ipn.StateKey, prefs *ipn.Prefs, legacyPath string) (err error) {
|
|
|
|
|
func (b *LocalBackend) loadStateLocked(key ipn.StateKey, prefs *ipn.Prefs) (err error) {
|
|
|
|
|
if prefs == nil && key == "" {
|
|
|
|
|
panic("state key and prefs are both unset")
|
|
|
|
|
}
|
|
|
|
@ -1118,24 +1118,9 @@ func (b *LocalBackend) loadStateLocked(key ipn.StateKey, prefs *ipn.Prefs, legac
|
|
|
|
|
bs, err := b.store.ReadState(key)
|
|
|
|
|
switch {
|
|
|
|
|
case errors.Is(err, ipn.ErrStateNotExist):
|
|
|
|
|
loaded := false
|
|
|
|
|
if legacyPath != "" {
|
|
|
|
|
b.prefs, err = ipn.LoadPrefs(legacyPath)
|
|
|
|
|
switch {
|
|
|
|
|
case errors.Is(err, os.ErrNotExist):
|
|
|
|
|
// Quiet. Normal case.
|
|
|
|
|
case err != nil:
|
|
|
|
|
b.logf("failed to load legacy prefs: %v", err)
|
|
|
|
|
default:
|
|
|
|
|
loaded = true
|
|
|
|
|
b.logf("imported prefs from relaynode for %q: %v", key, b.prefs.Pretty())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if !loaded {
|
|
|
|
|
b.prefs = ipn.NewPrefs()
|
|
|
|
|
b.prefs.WantRunning = false
|
|
|
|
|
b.logf("created empty state for %q: %s", key, b.prefs.Pretty())
|
|
|
|
|
}
|
|
|
|
|
b.prefs = ipn.NewPrefs()
|
|
|
|
|
b.prefs.WantRunning = false
|
|
|
|
|
b.logf("created empty state for %q: %s", key, b.prefs.Pretty())
|
|
|
|
|
return nil
|
|
|
|
|
case err != nil:
|
|
|
|
|
return fmt.Errorf("store.ReadState(%q): %v", key, err)
|
|
|
|
|