diff --git a/go.mod b/go.mod index 678a602..6253a72 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,6 @@ module github.com/sr/tsproxy go 1.20 require ( - github.com/cenkalti/backoff/v4 v4.1.3 github.com/google/go-cmp v0.5.9 github.com/oklog/run v1.1.0 github.com/prometheus/client_golang v1.14.0 diff --git a/go.sum b/go.sum index f3a3835..97490a8 100644 --- a/go.sum +++ b/go.sum @@ -36,8 +36,6 @@ github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cilium/ebpf v0.9.3 h1:5KtxXZU+scyERvkJMEm16TbScVvuuMrlhPly78ZMbSc= diff --git a/main.go b/main.go index 282d09a..7abe954 100644 --- a/main.go +++ b/main.go @@ -138,10 +138,10 @@ func tsproxy(ctx context.Context) error { state = &dir } - logger := slog.New(slog.NewJSONHandler(os.Stderr)) + logger := slog.New((slog.HandlerOptions{}).NewJSONHandler(os.Stderr)) slog.SetDefault(logger) - st, err := tsWaitStatusReady(ctx, &tailscale.LocalClient{}) + st, err := tsWaitStatusReady(ctx, logger, &tailscale.LocalClient{}) if err != nil { return fmt.Errorf("tailscale: wait for node to be ready: %w", err) } @@ -225,7 +225,7 @@ func tsproxy(ctx context.Context) error { } g.Add(func() error { - st, err := tsWaitStatusReady(ctx, lc) + st, err := tsWaitStatusReady(ctx, log, lc) if err != nil { return fmt.Errorf("tailscale: wait for node %s to be ready: %w", upstream.name, err) } @@ -244,7 +244,7 @@ func tsproxy(ctx context.Context) error { } }) g.Add(func() error { - _, err := tsWaitStatusReady(ctx, lc) + _, err := tsWaitStatusReady(ctx, log, lc) if err != nil { return fmt.Errorf("tailscale: wait for node %s to be ready: %w", upstream.name, err) } diff --git a/tsproxy.go b/tsproxy.go index 190d5ae..443b5bf 100644 --- a/tsproxy.go +++ b/tsproxy.go @@ -4,14 +4,12 @@ import ( "context" "encoding/json" "errors" - "fmt" "net/http" "net/http/httputil" "net/url" "sort" "time" - "github.com/cenkalti/backoff/v4" "golang.org/x/exp/slog" "tailscale.com/client/tailscale" "tailscale.com/client/tailscale/apitype" @@ -22,34 +20,26 @@ type tailscaleLocalClient interface { WhoIs(context.Context, string) (*apitype.WhoIsResponse, error) } -func tsWaitStatusReady(ctx context.Context, lc *tailscale.LocalClient) (*ipnstate.Status, error) { - var st *ipnstate.Status - - err := backoff.Retry(func() error { +func tsWaitStatusReady(ctx context.Context, logger *slog.Logger, lc *tailscale.LocalClient) (*ipnstate.Status, error) { + for { if err := ctx.Err(); err != nil { - return err + return nil, err } loopCtx, cancel := context.WithTimeout(ctx, time.Second) - var err error - st, err = lc.Status(loopCtx) + st, err := lc.Status(loopCtx) cancel() if err != nil { - return fmt.Errorf("get status: %w", err) + logger.Error("get tailscale status", err) + continue } - if st.BackendState != "Running" { - return fmt.Errorf("backend not running: %s", st.BackendState) - } - if len(st.TailscaleIPs) != 2 { - return fmt.Errorf("IPs not yet assigned") + if st.BackendState == "Running" && len(st.TailscaleIPs) == 2 { + return st, nil } - return nil - }, backoff.WithContext(backoff.NewExponentialBackOff(), ctx)) - if err != nil { - return nil, err + logger.Info("waiting for tailscale backend to be ready", slog.String("state", st.BackendState), slog.Int("IPs", len(st.TailscaleIPs)), slog.String("authURL", st.AuthURL)) + time.Sleep(time.Second) } - return st, nil } func newReverseProxy(logger *slog.Logger, lc tailscaleLocalClient, url *url.URL) http.HandlerFunc {