@@ -112,6 +112,7 @@ fun ensureCLI(
112
112
data class Features (
113
113
val disableAutostart : Boolean = false ,
114
114
val reportWorkspaceUsage : Boolean = false ,
115
+ val wildcardSsh : Boolean = false ,
115
116
)
116
117
117
118
/* *
@@ -282,7 +283,37 @@ class CoderCLIManager(
282
283
} else {
283
284
" "
284
285
}
285
- val blockContent =
286
+ val options = """
287
+ ConnectTimeout 0
288
+ StrictHostKeyChecking no
289
+ UserKnownHostsFile /dev/null
290
+ LogLevel ERROR
291
+ SetEnv CODER_SSH_SESSION_TYPE=JetBrains
292
+ """ .trimIndent()
293
+
294
+ val blockContent = if (settings.isSshWildcardConfigEnabled && feats.wildcardSsh) {
295
+ startBlock + System .lineSeparator() +
296
+ """
297
+ Host ${getWildcardHost(deploymentURL)} --*
298
+ ProxyCommand ${proxyArgs.joinToString(" " )} --ssh-host-prefix ${getWildcardHost(deploymentURL)} -- %h
299
+ """ .trimIndent()
300
+ .plus(" \n " + options.prependIndent(" " ))
301
+ .plus(extraConfig)
302
+ .plus(" \n\n " )
303
+ .plus(
304
+ """
305
+ Host ${getWildcardHost(deploymentURL)} -bg--*
306
+ ProxyCommand ${backgroundProxyArgs.joinToString(" " )} --ssh-host-prefix ${
307
+ getWildcardHost(
308
+ deploymentURL
309
+ )
310
+ } -bg-- %h
311
+ """ .trimIndent()
312
+ .plus(" \n " + options.prependIndent(" " ))
313
+ .plus(extraConfig),
314
+ ).replace(" \n " , System .lineSeparator()) +
315
+ System .lineSeparator() + endBlock
316
+ } else {
286
317
workspaceNames.joinToString(
287
318
System .lineSeparator(),
288
319
startBlock + System .lineSeparator(),
@@ -291,28 +322,21 @@ class CoderCLIManager(
291
322
"""
292
323
Host ${getHostName(deploymentURL, it)}
293
324
ProxyCommand ${proxyArgs.joinToString(" " )} $it
294
- ConnectTimeout 0
295
- StrictHostKeyChecking no
296
- UserKnownHostsFile /dev/null
297
- LogLevel ERROR
298
- SetEnv CODER_SSH_SESSION_TYPE=JetBrains
299
325
""" .trimIndent()
326
+ .plus(" \n " + options.prependIndent(" " ))
300
327
.plus(extraConfig)
301
328
.plus(" \n " )
302
329
.plus(
303
330
"""
304
331
Host ${getBackgroundHostName(deploymentURL, it)}
305
332
ProxyCommand ${backgroundProxyArgs.joinToString(" " )} $it
306
- ConnectTimeout 0
307
- StrictHostKeyChecking no
308
- UserKnownHostsFile /dev/null
309
- LogLevel ERROR
310
- SetEnv CODER_SSH_SESSION_TYPE=JetBrains
311
333
""" .trimIndent()
334
+ .plus(" \n " + options.prependIndent(" " ))
312
335
.plus(extraConfig),
313
336
).replace(" \n " , System .lineSeparator())
314
337
},
315
338
)
339
+ }
316
340
317
341
if (contents == null ) {
318
342
logger.info(" No existing SSH config to modify" )
@@ -475,13 +499,16 @@ class CoderCLIManager(
475
499
Features (
476
500
disableAutostart = version >= SemVer (2 , 5 , 0 ),
477
501
reportWorkspaceUsage = version >= SemVer (2 , 13 , 0 ),
502
+ version >= SemVer (2 , 19 , 0 ),
478
503
)
479
504
}
480
505
}
481
506
482
507
companion object {
483
508
private val tokenRegex = " --token [^ ]+" .toRegex()
484
509
510
+ fun getWildcardHost (url : URL ): String = " coder-jetbrains-toolbox--${url.safeHost()} "
511
+
485
512
@JvmStatic
486
513
fun getHostName (
487
514
url : URL ,
0 commit comments