From b38d74a59dc9f7fc9d33885cc099706e2bdfdfba Mon Sep 17 00:00:00 2001 From: Colin Adler Date: Mon, 11 Jul 2022 16:09:43 -0400 Subject: [PATCH 1/5] feat: force legacy tunnels to new version --- coderd/devtunnel/servers.go | 4 +++- coderd/devtunnel/tunnel.go | 36 ++++++++++++++++++++++++++++++------ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/coderd/devtunnel/servers.go b/coderd/devtunnel/servers.go index 6fc347a2db06e..092638fc36a1f 100644 --- a/coderd/devtunnel/servers.go +++ b/coderd/devtunnel/servers.go @@ -20,6 +20,7 @@ type Region struct { type Node struct { ID int `json:"id"` + RegionID int `json:"region_id"` HostnameHTTPS string `json:"hostname_https"` HostnameWireguard string `json:"hostname_wireguard"` WireguardPort uint16 `json:"wireguard_port"` @@ -29,11 +30,12 @@ type Node struct { var Regions = []Region{ { - ID: 1, + ID: 0, LocationName: "US East Pittsburgh", Nodes: []Node{ { ID: 1, + RegionID: 0, HostnameHTTPS: "pit-1.try.coder.app", HostnameWireguard: "pit-1.try.coder.app", WireguardPort: 55551, diff --git a/coderd/devtunnel/tunnel.go b/coderd/devtunnel/tunnel.go index 6a2b4e1c45fb0..d0f20854a4387 100644 --- a/coderd/devtunnel/tunnel.go +++ b/coderd/devtunnel/tunnel.go @@ -15,6 +15,7 @@ import ( "path/filepath" "time" + "github.com/briandowns/spinner" "github.com/google/uuid" "golang.org/x/xerrors" "golang.zx2c4.com/wireguard/conn" @@ -23,6 +24,7 @@ import ( "golang.zx2c4.com/wireguard/wgctrl/wgtypes" "cdr.dev/slog" + "github.com/coder/coder/cli/cliui" "github.com/coder/coder/cryptorand" ) @@ -146,7 +148,7 @@ func startUpdateRoutine(ctx context.Context, logger slog.Logger, cfg Config) (Se endCh := make(chan struct{}) go func() { defer close(endCh) - ticker := time.NewTicker(30 * time.Second) + ticker := time.NewTicker(10 * time.Second) defer ticker.Stop() for { @@ -273,12 +275,22 @@ func readOrGenerateConfig() (Config, error) { } if cfg.Version == 0 { - cfg.Tunnel = Node{ - ID: 0, - HostnameHTTPS: "wg-tunnel.coder.app", - HostnameWireguard: "wg-tunnel-udp.coder.app", - WireguardPort: 55555, + _, _ = fmt.Println() + _, _ = fmt.Println(cliui.Styles.Error.Render("You're running a deprecated tunnel version!")) + _, _ = fmt.Println(cliui.Styles.Error.Render("Upgrading you to the new version now. You may need to rebuild running workspaces.")) + _, _ = fmt.Println() + + cfg, err := GenerateConfig() + if err != nil { + return Config{}, xerrors.Errorf("generate config: %w", err) + } + + err = writeConfig(cfg) + if err != nil { + return Config{}, xerrors.Errorf("write config: %w", err) } + + return cfg, nil } return cfg, nil @@ -291,15 +303,27 @@ func GenerateConfig() (Config, error) { } pub := priv.PublicKey() + spin := spinner.New(spinner.CharSets[39], 350*time.Millisecond) + spin.Suffix = " Finding the closest tunnel region..." + spin.Start() + node, err := FindClosestNode() if err != nil { + // If we fail to find the closest node, default to US East. region := Regions[0] n, _ := cryptorand.Intn(len(region.Nodes)) node = region.Nodes[n] + spin.Stop() _, _ = fmt.Println("Error picking closest dev tunnel:", err) _, _ = fmt.Println("Defaulting to", Regions[0].LocationName) } + spin.Stop() + _, _ = fmt.Printf("Found closest tunnel region %s with latency %s.\n", + cliui.Styles.Keyword.Render(Regions[node.RegionID].LocationName), + cliui.Styles.Code.Render(node.AvgLatency.String()), + ) + return Config{ Version: 1, PrivateKey: device.NoisePrivateKey(priv), From 04a962a729869d60036a8d6c498332ade883973f Mon Sep 17 00:00:00 2001 From: Colin Adler Date: Mon, 11 Jul 2022 16:18:07 -0400 Subject: [PATCH 2/5] may -> will --- coderd/devtunnel/tunnel.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coderd/devtunnel/tunnel.go b/coderd/devtunnel/tunnel.go index d0f20854a4387..450cbae54f4f1 100644 --- a/coderd/devtunnel/tunnel.go +++ b/coderd/devtunnel/tunnel.go @@ -277,7 +277,7 @@ func readOrGenerateConfig() (Config, error) { if cfg.Version == 0 { _, _ = fmt.Println() _, _ = fmt.Println(cliui.Styles.Error.Render("You're running a deprecated tunnel version!")) - _, _ = fmt.Println(cliui.Styles.Error.Render("Upgrading you to the new version now. You may need to rebuild running workspaces.")) + _, _ = fmt.Println(cliui.Styles.Error.Render("Upgrading you to the new version now. You will need to rebuild running workspaces.")) _, _ = fmt.Println() cfg, err := GenerateConfig() From 2cc657b92da2eca045a7e5ffddef56126f1bd43f Mon Sep 17 00:00:00 2001 From: Colin Adler Date: Mon, 11 Jul 2022 16:55:40 -0400 Subject: [PATCH 3/5] remove all legacy tunnel code --- coderd/devtunnel/tunnel.go | 50 +++++--------------------------------- 1 file changed, 6 insertions(+), 44 deletions(-) diff --git a/coderd/devtunnel/tunnel.go b/coderd/devtunnel/tunnel.go index 450cbae54f4f1..caa553adce9b4 100644 --- a/coderd/devtunnel/tunnel.go +++ b/coderd/devtunnel/tunnel.go @@ -7,7 +7,6 @@ import ( "encoding/hex" "encoding/json" "fmt" - "io" "net" "net/http" "net/netip" @@ -16,7 +15,6 @@ import ( "time" "github.com/briandowns/spinner" - "github.com/google/uuid" "golang.org/x/xerrors" "golang.zx2c4.com/wireguard/conn" "golang.zx2c4.com/wireguard/device" @@ -28,13 +26,6 @@ import ( "github.com/coder/coder/cryptorand" ) -var ( - v0EndpointHTTPS = "wg-tunnel.coder.app" - - v0ServerPublicKey = "+KNSMwed/IlqoesvTMSBNsHFaKVLrmmaCkn0bxIhUg0=" - v0ServerIP = netip.AddrFrom16(uuid.MustParse("fcad0000-0000-4000-8000-000000000001")) -) - type Tunnel struct { URL string Listener net.Listener @@ -42,7 +33,6 @@ type Tunnel struct { type Config struct { Version int `json:"version"` - ID uuid.UUID `json:"id"` PrivateKey device.NoisePrivateKey `json:"private_key"` PublicKey device.NoisePublicKey `json:"public_key"` @@ -50,7 +40,6 @@ type Config struct { } type configExt struct { Version int `json:"-"` - ID uuid.UUID `json:"id"` PrivateKey device.NoisePrivateKey `json:"-"` PublicKey device.NoisePublicKey `json:"public_key"` @@ -181,22 +170,9 @@ func sendConfigToServer(ctx context.Context, cfg Config) (ServerResponse, error) return ServerResponse{}, xerrors.Errorf("marshal config: %w", err) } - var req *http.Request - switch cfg.Version { - case 0: - req, err = http.NewRequestWithContext(ctx, "POST", "https://"+v0EndpointHTTPS+"/tun", bytes.NewReader(raw)) - if err != nil { - return ServerResponse{}, xerrors.Errorf("new request: %w", err) - } - - case 1: - req, err = http.NewRequestWithContext(ctx, "POST", "https://"+cfg.Tunnel.HostnameHTTPS+"/tun", bytes.NewReader(raw)) - if err != nil { - return ServerResponse{}, xerrors.Errorf("new request: %w", err) - } - - default: - return ServerResponse{}, xerrors.Errorf("unknown config version: %d", cfg.Version) + req, err := http.NewRequestWithContext(ctx, "POST", "https://"+cfg.Tunnel.HostnameHTTPS+"/tun", bytes.NewReader(raw)) + if err != nil { + return ServerResponse{}, xerrors.Errorf("new request: %w", err) } res, err := http.DefaultClient.Do(req) @@ -206,23 +182,9 @@ func sendConfigToServer(ctx context.Context, cfg Config) (ServerResponse, error) defer res.Body.Close() var resp ServerResponse - switch cfg.Version { - case 0: - _, _ = io.Copy(io.Discard, res.Body) - resp.Hostname = fmt.Sprintf("%s.%s", cfg.ID, v0EndpointHTTPS) - resp.ServerIP = v0ServerIP - resp.ServerPublicKey = encodeBase64ToHex(v0ServerPublicKey) - resp.ClientIP = netip.AddrFrom16(cfg.ID) - - case 1: - err := json.NewDecoder(res.Body).Decode(&resp) - if err != nil { - return ServerResponse{}, xerrors.Errorf("decode response: %w", err) - } - - default: - _, _ = io.Copy(io.Discard, res.Body) - return ServerResponse{}, xerrors.Errorf("unknown config version: %d", cfg.Version) + err = json.NewDecoder(res.Body).Decode(&resp) + if err != nil { + return ServerResponse{}, xerrors.Errorf("decode response: %w", err) } return resp, nil From 755b0bce4255bf8da430f6300e50fe7e9a6d88ab Mon Sep 17 00:00:00 2001 From: Colin Adler Date: Mon, 11 Jul 2022 16:57:44 -0400 Subject: [PATCH 4/5] fixup! remove all legacy tunnel code --- coderd/devtunnel/tunnel.go | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/coderd/devtunnel/tunnel.go b/coderd/devtunnel/tunnel.go index caa553adce9b4..fb8fa23eeeed3 100644 --- a/coderd/devtunnel/tunnel.go +++ b/coderd/devtunnel/tunnel.go @@ -3,7 +3,6 @@ package devtunnel import ( "bytes" "context" - "encoding/base64" "encoding/hex" "encoding/json" "fmt" @@ -312,16 +311,3 @@ func writeConfig(cfg Config) error { return nil } - -func encodeBase64ToHex(key string) string { - decoded, err := base64.StdEncoding.DecodeString(key) - if err != nil { - panic(err) - } - - if len(decoded) != 32 { - panic((xerrors.New("key should be 32 bytes: " + key))) - } - - return hex.EncodeToString(decoded) -} From f636d682ef29365bb84282471b40fae1dee0e5c6 Mon Sep 17 00:00:00 2001 From: Colin Adler Date: Mon, 11 Jul 2022 20:19:04 -0400 Subject: [PATCH 5/5] update wording --- coderd/devtunnel/tunnel.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coderd/devtunnel/tunnel.go b/coderd/devtunnel/tunnel.go index fb8fa23eeeed3..bdcd66f266625 100644 --- a/coderd/devtunnel/tunnel.go +++ b/coderd/devtunnel/tunnel.go @@ -280,7 +280,7 @@ func GenerateConfig() (Config, error) { } spin.Stop() - _, _ = fmt.Printf("Found closest tunnel region %s with latency %s.\n", + _, _ = fmt.Printf("Using tunnel in %s with latency %s.\n", cliui.Styles.Keyword.Render(Regions[node.RegionID].LocationName), cliui.Styles.Code.Render(node.AvgLatency.String()), )