|
|
@ -503,6 +503,34 @@ func Run(ctx context.Context, logf logger.Logf, logid string, getEngine func() (
|
|
|
|
}()
|
|
|
|
}()
|
|
|
|
logf("Listening on %v", listen.Addr())
|
|
|
|
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)
|
|
|
|
bo := backoff.NewBackoff("ipnserver", logf, 30*time.Second)
|
|
|
|
var unservedConn net.Conn // if non-nil, accepted, but hasn't served yet
|
|
|
|
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)
|
|
|
|
b, err := ipn.NewLocalBackend(logf, logid, store, eng)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("NewLocalBackend: %v", err)
|
|
|
|
return fmt.Errorf("NewLocalBackend: %v", err)
|
|
|
|