@ -160,25 +160,26 @@ type Server struct {
getCertForTesting func ( * tls . ClientHelloInfo ) ( * tls . Certificate , error )
initOnce sync . Once
initErr error
lb * ipnlocal . LocalBackend
sys * tsd . System
netstack * netstack . Impl
netMon * netmon . Monitor
rootPath string // the state directory
hostname string
shutdownCtx context . Context
shutdownCancel context . CancelFunc
proxyCred string // SOCKS5 proxy auth for loopbackListener
localAPICred string // basic auth password for loopbackListener
loopbackListener net . Listener // optional loopback for localapi and proxies
localAPIListener net . Listener // in-memory, used by localClient
localClient * local . Client // in-memory
localAPIServer * http . Server
logbuffer * filch . Filch
logtail * logtail . Logger
logid logid . PublicID
initOnce sync . Once
initErr error
lb * ipnlocal . LocalBackend
sys * tsd . System
netstack * netstack . Impl
netMon * netmon . Monitor
rootPath string // the state directory
hostname string
shutdownCtx context . Context
shutdownCancel context . CancelFunc
proxyCred string // SOCKS5 proxy auth for loopbackListener
localAPICred string // basic auth password for loopbackListener
loopbackListener net . Listener // optional loopback for localapi and proxies
localAPIListener net . Listener // in-memory, used by localClient
localClient * local . Client // in-memory
localAPIServer * http . Server
resetServeConfigOnce sync . Once
logbuffer * filch . Filch
logtail * logtail . Logger
logid logid . PublicID
mu sync . Mutex
listeners map [ listenKey ] * listener
@ -388,8 +389,8 @@ func (s *Server) Up(ctx context.Context) (*ipnstate.Status, error) {
if n . ErrMessage != nil {
return nil , fmt . Errorf ( "tsnet.Up: backend: %s" , * n . ErrMessage )
}
if s := n . State ; s != nil {
if * s == ipn . Running {
if s t := n . State ; s t != nil {
if * s t == ipn . Running {
status , err := lc . Status ( ctx )
if err != nil {
return nil , fmt . Errorf ( "tsnet.Up: %w" , err )
@ -398,11 +399,15 @@ func (s *Server) Up(ctx context.Context) (*ipnstate.Status, error) {
return nil , errors . New ( "tsnet.Up: running, but no ip" )
}
// Clear the persisted serve config state to prevent stale configuration
// from code changes. This is a temporary workaround until we have a better
// way to handle this. (2023-03-11)
if err := lc . SetServeConfig ( ctx , new ( ipn . ServeConfig ) ) ; err != nil {
return nil , fmt . Errorf ( "tsnet.Up: %w" , err )
// The first time Up is run, clear the persisted serve config.
// We do this to prevent messy interactions with stale config in
// the face of code changes.
var srvResetErr error
s . resetServeConfigOnce . Do ( func ( ) {
srvResetErr = lc . SetServeConfig ( ctx , new ( ipn . ServeConfig ) )
} )
if srvResetErr != nil {
return nil , fmt . Errorf ( "tsnet.Up: clearing serve config: %w" , err )
}
return status , nil