diff --git a/ipn/ipnserver/server.go b/ipn/ipnserver/server.go index c4fd95a2b..cfccc2e74 100644 --- a/ipn/ipnserver/server.go +++ b/ipn/ipnserver/server.go @@ -503,6 +503,34 @@ func Run(ctx context.Context, logf logger.Logf, logid string, getEngine func() ( }() logf("Listening on %v", listen.Addr()) + var store ipn.StateStore + if opts.StatePath != "" { + store, err = ipn.NewFileStore(opts.StatePath) + if err != nil { + return fmt.Errorf("ipn.NewFileStore(%q): %v", opts.StatePath, err) + } + if opts.AutostartStateKey == "" { + autoStartKey, err := store.ReadState(ipn.ServerModeStartKey) + if err != nil && err != ipn.ErrStateNotExist { + return fmt.Errorf("calling ReadState on %s: %w", opts.StatePath, err) + } + key := string(autoStartKey) + if strings.HasPrefix(key, "user-") { + uid := strings.TrimPrefix(key, "user-") + u, err := server.lookupUserFromID(uid) + if err != nil { + logf("ipnserver: found server mode auto-start key %q; failed to load user: %v", key, err) + } else { + logf("ipnserver: found server mode auto-start key %q (user %s)", key, u.Username) + server.serverModeUser = u + } + opts.AutostartStateKey = ipn.StateKey(key) + } + } + } else { + store = &ipn.MemoryStore{} + } + bo := backoff.NewBackoff("ipnserver", logf, 30*time.Second) var unservedConn net.Conn // if non-nil, accepted, but hasn't served yet @@ -538,34 +566,6 @@ func Run(ctx context.Context, logf logger.Logf, logid string, getEngine func() ( } } - var store ipn.StateStore - if opts.StatePath != "" { - store, err = ipn.NewFileStore(opts.StatePath) - if err != nil { - return fmt.Errorf("ipn.NewFileStore(%q): %v", opts.StatePath, err) - } - if opts.AutostartStateKey == "" { - autoStartKey, err := store.ReadState(ipn.ServerModeStartKey) - if err != nil && err != ipn.ErrStateNotExist { - return fmt.Errorf("calling ReadState on %s: %w", opts.StatePath, err) - } - key := string(autoStartKey) - if strings.HasPrefix(key, "user-") { - uid := strings.TrimPrefix(key, "user-") - u, err := server.lookupUserFromID(uid) - if err != nil { - logf("ipnserver: found server mode auto-start key %q; failed to load user: %v", key, err) - } else { - logf("ipnserver: found server mode auto-start key %q (user %s)", key, u.Username) - server.serverModeUser = u - } - opts.AutostartStateKey = ipn.StateKey(key) - } - } - } else { - store = &ipn.MemoryStore{} - } - b, err := ipn.NewLocalBackend(logf, logid, store, eng) if err != nil { return fmt.Errorf("NewLocalBackend: %v", err)