From 4d0461f7215244d807a749e7cdd1bb81e607948c Mon Sep 17 00:00:00 2001 From: Maisem Ali Date: Mon, 18 Jul 2022 20:36:14 -0700 Subject: [PATCH] ipn/ipnlocal: logout ephemeral nodes on shutdown Signed-off-by: Maisem Ali --- cmd/tailscaled/tailscaled.go | 2 +- ipn/ipnlocal/local.go | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/cmd/tailscaled/tailscaled.go b/cmd/tailscaled/tailscaled.go index 596152f48..58709a231 100644 --- a/cmd/tailscaled/tailscaled.go +++ b/cmd/tailscaled/tailscaled.go @@ -404,7 +404,6 @@ func run() error { // want to keep running. signal.Ignore(syscall.SIGPIPE) go func() { - defer dialer.Close() select { case s := <-interrupt: logf("tailscaled got signal %v; shutting down", s) @@ -437,6 +436,7 @@ func run() error { if err != nil { return fmt.Errorf("safesocket.Listen: %v", err) } + defer dialer.Close() err = srv.Run(ctx, ln) // Cancelation is not an error: it is the only way to stop ipnserver. diff --git a/ipn/ipnlocal/local.go b/ipn/ipnlocal/local.go index cabda6f47..10cc0cf8e 100644 --- a/ipn/ipnlocal/local.go +++ b/ipn/ipnlocal/local.go @@ -342,7 +342,19 @@ func (b *LocalBackend) onHealthChange(sys health.Subsystem, err error) { // can no longer be used after Shutdown returns. func (b *LocalBackend) Shutdown() { b.mu.Lock() + if b.shutdownCalled { + b.mu.Unlock() + return + } b.shutdownCalled = true + + if b.loginFlags&controlclient.LoginEphemeral != 0 { + b.mu.Unlock() + ctx, cancel := context.WithTimeout(b.ctx, 5*time.Second) + defer cancel() + b.LogoutSync(ctx) // best effort + b.mu.Lock() + } cc := b.cc if b.sshServer != nil { b.sshServer.Shutdown()