netbirdio/netbird · error
wait for extend session: %v
Error message
wait for extend session: %v
What it means
Wraps a failure of client.WaitExtendAuthSession, a long-poll gRPC call to the NetBird daemon (unix socket /var/run/netbird.sock or Windows named pipe) that blocks until the user finishes device-code auth in a browser. The error is either a transport failure (daemon stopped, connection dropped mid-wait, ctx cancelled via Ctrl+C) or a daemon-side error propagated from management while extending the login session (peer not connected, management unreachable).
Source
Thrown at client/cmd/login.go:219
}
startResp, err := client.RequestExtendAuthSession(ctx, req)
if err != nil {
return fmt.Errorf("start extend session: %v", err)
}
uri := startResp.GetVerificationURIComplete()
if uri == "" {
uri = startResp.GetVerificationURI()
}
openURL(cmd, uri, startResp.GetUserCode(), noBrowser, showQR)
waitResp, err := client.WaitExtendAuthSession(ctx, &proto.WaitExtendAuthSessionRequest{
DeviceCode: startResp.GetDeviceCode(),
UserCode: startResp.GetUserCode(),
})
if err != nil {
return fmt.Errorf("wait for extend session: %v", err)
}
if ts := waitResp.GetSessionExpiresAt(); ts.IsValid() && !ts.AsTime().IsZero() {
deadline := ts.AsTime().Local()
cmd.Printf("Session extended. New expiry: %s\n", deadline.Format("2006-01-02 15:04:05 MST"))
} else {
// Management reported the peer is not eligible (e.g. login
// expiration disabled on the account). Surface that fact
// instead of pretending the call succeeded.
cmd.Println("Session extension call completed, but the management server did not return a new deadline (peer may not be SSO-tracked or login expiration is disabled).")
}
return nil
}
func getActiveProfile(ctx context.Context, pm *profilemanager.ProfileManager, profileName string, username string) (*profilemanager.Profile, error) {
// switch profile if provided
if profileName != "" {View on GitHub (pinned to 93e97f4bf1)
Solutions
- Check the daemon is running: 'netbird service status' (or systemctl status netbird) and 'netbird service start' if not; then rerun the command
- Inspect daemon logs (journalctl -u netbird or the daemon log file) for the underlying management error surfaced by the RPC
- Verify the daemon can reach the management URL (network, firewall, DNS) and that the peer shows Connected in 'netbird status'
- If the code expired or auth was aborted, rerun and complete the browser step promptly
Example fix
// before
waitResp, err := client.WaitExtendAuthSession(ctx, &proto.WaitExtendAuthSessionRequest{...})
if err != nil {
return fmt.Errorf("wait for extend session: %v", err)
}
// after: distinguish user cancel / daemon down from server-side denial
waitResp, err := client.WaitExtendAuthSession(ctx, &proto.WaitExtendAuthSessionRequest{...})
if err != nil {
switch status.Code(err) {
case codes.Canceled:
return fmt.Errorf("extend session canceled: %w", err)
case codes.Unavailable:
return fmt.Errorf("daemon unreachable, run 'netbird service start': %w", err)
default:
return fmt.Errorf("wait for extend session: %w", err)
}
} Defensive patterns
Strategy: try-catch
Validate before calling
// Probe the daemon before starting the extend flow
conn, err := DialClientGRPCServer(ctx, daemonAddr)
if err != nil {
return fmt.Errorf("daemon not reachable: %w", err)
}
client := proto.NewDaemonServiceClient(conn)
if _, err := client.Status(ctx, &proto.StatusRequest{}); err != nil {
return fmt.Errorf("daemon not ready: %w", err)
} Try / catch
if err := waitExtend(ctx); err != nil {
switch status.Code(err) {
case codes.Canceled, codes.DeadlineExceeded:
// user abort or expiry: safe to retry the whole flow
return retryExtend(ctx)
case codes.Unavailable:
return fmt.Errorf("daemon down, run 'netbird service start': %w", err)
default:
return fmt.Errorf("wait for extend session: %w", err)
}
} Prevention
- Run 'netbird service status' before any login/extend command
- Avoid Ctrl+C during the browser-wait phase; let it finish or expire cleanly
- Keep the daemon and management versions compatible when upgrading
When it happens
Trigger: Calling 'netbird login --extend-session' (or the extend flow) and: cancelling the command before completing browser auth; daemon restarted or crashed while the CLI was blocked in WaitExtendAuthSession; device code expiring server-side; daemon not connected to management so the extension request fails.
Common situations: Daemon stopped mid-wait (netbird service stop, OOM kill, package upgrade restarting the service); management server unreachable from the daemon host; slow browser auth in SSH sessions where the code expires; running the CLI as a user without access to the daemon socket.
Related errors
AI-assisted analysis of netbirdio/netbird@93e97f4bf1 (2026-08-16).
Data as JSON: /api/errors/3ab1f6e5b03b69dc.
Report an issue: GitHub.