Thanks to visit codestin.com
Credit goes to github.com

Skip to content
This repository was archived by the owner on Aug 30, 2024. It is now read-only.

Commit 2aabac9

Browse files
kylecarbsdeansheather
authored andcommitted
fix: Networking V2 tunnel on Windows (#356)
(cherry picked from commit dcfd501)
1 parent 2c028cc commit 2aabac9

File tree

2 files changed

+26
-17
lines changed

2 files changed

+26
-17
lines changed

cmd/coder/main.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,21 @@ func main() {
2525
}()
2626
}
2727

28-
stdoutState, err := xterminal.MakeOutputRaw(os.Stdout.Fd())
29-
if err != nil {
30-
clog.Log(clog.Fatal(fmt.Sprintf("set output to raw: %s", err)))
31-
cancel()
32-
os.Exit(1)
33-
}
34-
restoreTerminal := func() {
35-
// Best effort. Would result in broken terminal on window but nothing we can do about it.
36-
_ = xterminal.Restore(os.Stdout.Fd(), stdoutState)
28+
restoreTerminal := func() {}
29+
30+
// Janky, but SSH on windows sets the output to raw.
31+
// If we set it ourselves, SSH fails because the FD isn't found.
32+
if len(os.Args) >= 2 && os.Args[1] != "tunnel" {
33+
state, err := xterminal.MakeOutputRaw(os.Stdout.Fd())
34+
if err != nil {
35+
clog.Log(clog.Fatal(fmt.Sprintf("set output to raw: %s", err)))
36+
cancel()
37+
os.Exit(1)
38+
}
39+
restoreTerminal = func() {
40+
// Best effort. Would result in broken terminal on window but nothing we can do about it.
41+
_ = xterminal.Restore(os.Stdout.Fd(), state)
42+
}
3743
}
3844

3945
app := cmd.Make()

internal/cmd/configssh.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,12 @@ func configSSH(configpath *string, remove *bool, next *bool) func(cmd *cobra.Com
132132
}
133133
}
134134

135-
newConfig := makeNewConfigs(user.Username, envsWithProviders, privateKeyFilepath, p2p)
135+
binPath, err := os.Executable()
136+
if err != nil {
137+
return xerrors.Errorf("Failed to get executable path: %w", err)
138+
}
139+
140+
newConfig := makeNewConfigs(binPath, user.Username, envsWithProviders, privateKeyFilepath, p2p)
136141

137142
err = os.MkdirAll(filepath.Dir(*configpath), os.ModePerm)
138143
if err != nil {
@@ -193,7 +198,7 @@ func writeSSHKey(ctx context.Context, client coder.Client, privateKeyPath string
193198
return ioutil.WriteFile(privateKeyPath, []byte(key.PrivateKey), 0600)
194199
}
195200

196-
func makeNewConfigs(userName string, envs []coderutil.EnvWithWorkspaceProvider, privateKeyFilepath string, p2p bool) string {
201+
func makeNewConfigs(binPath, userName string, envs []coderutil.EnvWithWorkspaceProvider, privateKeyFilepath string, p2p bool) string {
197202
newConfig := fmt.Sprintf("\n%s\n%s\n\n", sshStartToken, sshStartMessage)
198203

199204
sort.Slice(envs, func(i, j int) bool { return envs[i].Env.Name < envs[j].Env.Name })
@@ -213,26 +218,24 @@ func makeNewConfigs(userName string, envs []coderutil.EnvWithWorkspaceProvider,
213218
}
214219

215220
useTunnel := env.WorkspaceProvider.BuiltIn && p2p
216-
newConfig += makeSSHConfig(u.Host, userName, env.Env.Name, privateKeyFilepath, useTunnel)
221+
newConfig += makeSSHConfig(binPath, u.Host, userName, env.Env.Name, privateKeyFilepath, useTunnel)
217222
}
218223
newConfig += fmt.Sprintf("\n%s\n", sshEndToken)
219224

220225
return newConfig
221226
}
222227

223-
func makeSSHConfig(host, userName, envName, privateKeyFilepath string, tunnel bool) string {
228+
func makeSSHConfig(binPath, host, userName, envName, privateKeyFilepath string, tunnel bool) string {
224229
if tunnel {
225230
return fmt.Sprintf(
226231
`Host coder.%s
227232
HostName coder.%s
228-
ProxyCommand coder tunnel %s 12213 stdio
233+
ProxyCommand %s tunnel %s 12213 stdio
229234
StrictHostKeyChecking no
230235
ConnectTimeout=0
231236
IdentitiesOnly yes
232237
IdentityFile="%s"
233-
ServerAliveInterval 60
234-
ServerAliveCountMax 3
235-
`, envName, envName, envName, privateKeyFilepath)
238+
`, envName, envName, binPath, envName, privateKeyFilepath)
236239
}
237240

238241
return fmt.Sprintf(

0 commit comments

Comments
 (0)