diff --git a/CHANGELOG.md b/CHANGELOG.md index 03b16ef..0cf1ae9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,10 @@ - connections to the workspace are no longer established automatically after agent started with error. +### Fixed + +- SSH connection will no longer fail with newer Coder deployments due to misconfiguration of hostname and proxy command. + ## 0.1.5 - 2025-04-14 ### Fixed diff --git a/src/main/kotlin/com/coder/toolbox/CoderRemoteEnvironment.kt b/src/main/kotlin/com/coder/toolbox/CoderRemoteEnvironment.kt index fe5f039..69ee6cd 100644 --- a/src/main/kotlin/com/coder/toolbox/CoderRemoteEnvironment.kt +++ b/src/main/kotlin/com/coder/toolbox/CoderRemoteEnvironment.kt @@ -1,6 +1,7 @@ package com.coder.toolbox import com.coder.toolbox.browser.BrowserUtil +import com.coder.toolbox.cli.CoderCLIManager import com.coder.toolbox.models.WorkspaceAndAgentStatus import com.coder.toolbox.sdk.CoderRestClient import com.coder.toolbox.sdk.ex.APIResponseException @@ -35,6 +36,7 @@ import kotlin.time.Duration.Companion.seconds class CoderRemoteEnvironment( private val context: CoderToolboxContext, private val client: CoderRestClient, + private val cli: CoderCLIManager, private var workspace: Workspace, private var agent: WorkspaceAgent, ) : RemoteProviderEnvironment("${workspace.name}.${agent.name}"), BeforeConnectionHook, AfterDisconnectHook { @@ -48,6 +50,8 @@ class CoderRemoteEnvironment( override val actionsList: MutableStateFlow<List<ActionDescription>> = MutableStateFlow(getAvailableActions()) + fun asPairOfWorkspaceAndAgent(): Pair<Workspace, WorkspaceAgent> = Pair(workspace, agent) + private fun getAvailableActions(): List<ActionDescription> { val actions = mutableListOf( Action(context.i18n.ptrl("Open web terminal")) { @@ -151,8 +155,8 @@ class CoderRemoteEnvironment( */ override suspend fun getContentsView(): EnvironmentContentsView = EnvironmentView( - context.settingsStore.readOnly(), client.url, + cli, workspace, agent ) diff --git a/src/main/kotlin/com/coder/toolbox/CoderRemoteProvider.kt b/src/main/kotlin/com/coder/toolbox/CoderRemoteProvider.kt index 186b023..4ccce7e 100644 --- a/src/main/kotlin/com/coder/toolbox/CoderRemoteProvider.kt +++ b/src/main/kotlin/com/coder/toolbox/CoderRemoteProvider.kt @@ -91,7 +91,7 @@ class CoderRemoteProvider( it.name }?.map { agent -> // If we have an environment already, update that. - val env = CoderRemoteEnvironment(context, client, ws, agent) + val env = CoderRemoteEnvironment(context, client, cli, ws, agent) lastEnvironments.firstOrNull { it == env }?.let { it.update(ws, agent) it @@ -109,7 +109,7 @@ class CoderRemoteProvider( // Reconfigure if environments changed. if (lastEnvironments.size != resolvedEnvironments.size || lastEnvironments != resolvedEnvironments) { context.logger.info("Workspaces have changed, reconfiguring CLI: $resolvedEnvironments") - cli.configSsh(resolvedEnvironments.map { it.name }.toSet()) + cli.configSsh(resolvedEnvironments.map { it.asPairOfWorkspaceAndAgent() }.toSet()) } environments.update { @@ -149,7 +149,7 @@ class CoderRemoteProvider( triggerSshConfig.onReceive { shouldTrigger -> if (shouldTrigger) { context.logger.trace("workspace poller waked up because it should reconfigure the ssh configurations") - cli.configSsh(lastEnvironments.map { it.name }.toSet()) + cli.configSsh(lastEnvironments.map { it.asPairOfWorkspaceAndAgent() }.toSet()) } } } diff --git a/src/main/kotlin/com/coder/toolbox/cli/CoderCLIManager.kt b/src/main/kotlin/com/coder/toolbox/cli/CoderCLIManager.kt index d97caf8..c7e4297 100644 --- a/src/main/kotlin/com/coder/toolbox/cli/CoderCLIManager.kt +++ b/src/main/kotlin/com/coder/toolbox/cli/CoderCLIManager.kt @@ -223,11 +223,11 @@ class CoderCLIManager( * This can take supported features for testing purposes only. */ fun configSsh( - workspaceNames: Set<String>, + wsWithAgents: Set<Pair<Workspace, WorkspaceAgent>>, feats: Features = features, ) { logger.info("Configuring SSH config at ${settings.sshConfigPath}") - writeSSHConfig(modifySSHConfig(readSSHConfig(), workspaceNames, feats)) + writeSSHConfig(modifySSHConfig(readSSHConfig(), wsWithAgents, feats)) } /** @@ -249,13 +249,13 @@ class CoderCLIManager( */ private fun modifySSHConfig( contents: String?, - workspaceNames: Set<String>, + wsWithAgents: Set<Pair<Workspace, WorkspaceAgent>>, feats: Features, ): String? { val host = deploymentURL.safeHost() val startBlock = "# --- START CODER JETBRAINS TOOLBOX $host" val endBlock = "# --- END CODER JETBRAINS TOOLBOX $host" - val isRemoving = workspaceNames.isEmpty() + val isRemoving = wsWithAgents.isEmpty() val baseArgs = listOfNotNull( escape(localBinaryPath.toString()), @@ -304,34 +304,39 @@ class CoderCLIManager( .plus("\n\n") .plus( """ - Host ${getHostnamePrefix(deploymentURL)}-bg--* + Host ${getBackgroundHostnamePrefix(deploymentURL)}--* ProxyCommand ${backgroundProxyArgs.joinToString(" ")} --ssh-host-prefix ${ - getHostnamePrefix( + getBackgroundHostnamePrefix( deploymentURL ) - }-bg-- %h + }-- %h """.trimIndent() .plus("\n" + options.prependIndent(" ")) .plus(extraConfig), ).replace("\n", System.lineSeparator()) + System.lineSeparator() + endBlock } else { - workspaceNames.joinToString( + wsWithAgents.joinToString( System.lineSeparator(), startBlock + System.lineSeparator(), System.lineSeparator() + endBlock, transform = { """ - Host ${getHostName(deploymentURL, it)} - ProxyCommand ${proxyArgs.joinToString(" ")} $it + Host ${getHostname(deploymentURL, it.workspace(), it.agent())} + ProxyCommand ${proxyArgs.joinToString(" ")} ${getWsByOwner(it.workspace(), it.agent())} """.trimIndent() .plus("\n" + options.prependIndent(" ")) .plus(extraConfig) .plus("\n") .plus( """ - Host ${getBackgroundHostName(deploymentURL, it)} - ProxyCommand ${backgroundProxyArgs.joinToString(" ")} $it + Host ${getBackgroundHostname(deploymentURL, it.workspace(), it.agent())} + ProxyCommand ${backgroundProxyArgs.joinToString(" ")} ${ + getWsByOwner( + it.workspace(), + it.agent() + ) + } """.trimIndent() .plus("\n" + options.prependIndent(" ")) .plus(extraConfig), @@ -506,25 +511,30 @@ class CoderCLIManager( } } + fun getHostname(url: URL, ws: Workspace, agent: WorkspaceAgent): String { + return if (settings.isSshWildcardConfigEnabled && features.wildcardSsh) { + "${getHostnamePrefix(url)}--${ws.ownerName}--${ws.name}.${agent.name}" + } else { + "coder-jetbrains-toolbox--${ws.ownerName}--${ws.name}.${agent.name}--${url.safeHost()}" + } + } + + fun getBackgroundHostname(url: URL, ws: Workspace, agent: WorkspaceAgent): String { + return "${getHostname(url, ws, agent)}--bg" + } + companion object { private val tokenRegex = "--token [^ ]+".toRegex() - fun getHostnamePrefix(url: URL): String = "coder-jetbrains-toolbox-${url.safeHost()}" + private fun getHostnamePrefix(url: URL): String = "coder-jetbrains-toolbox-${url.safeHost()}" - fun getWildcardHostname(url: URL, workspace: Workspace, agent: WorkspaceAgent): String = - "${getHostnamePrefix(url)}-bg--${workspace.name}.${agent.name}" + private fun getBackgroundHostnamePrefix(url: URL): String = "coder-jetbrains-toolbox-${url.safeHost()}-bg" - fun getHostname(url: URL, workspace: Workspace, agent: WorkspaceAgent) = - getHostName(url, "${workspace.name}.${agent.name}") + private fun getWsByOwner(ws: Workspace, agent: WorkspaceAgent): String = + "${ws.ownerName}/${ws.name}.${agent.name}" - fun getHostName( - url: URL, - workspaceName: String, - ): String = "coder-jetbrains-toolbox-$workspaceName--${url.safeHost()}" + private fun Pair<Workspace, WorkspaceAgent>.workspace() = this.first - fun getBackgroundHostName( - url: URL, - workspaceName: String, - ): String = getHostName(url, workspaceName) + "--bg" + private fun Pair<Workspace, WorkspaceAgent>.agent() = this.second } } diff --git a/src/main/kotlin/com/coder/toolbox/sdk/CoderRestClient.kt b/src/main/kotlin/com/coder/toolbox/sdk/CoderRestClient.kt index b4eadaf..6785675 100644 --- a/src/main/kotlin/com/coder/toolbox/sdk/CoderRestClient.kt +++ b/src/main/kotlin/com/coder/toolbox/sdk/CoderRestClient.kt @@ -13,8 +13,10 @@ import com.coder.toolbox.sdk.v2.models.CreateWorkspaceBuildRequest import com.coder.toolbox.sdk.v2.models.Template import com.coder.toolbox.sdk.v2.models.User import com.coder.toolbox.sdk.v2.models.Workspace +import com.coder.toolbox.sdk.v2.models.WorkspaceAgent import com.coder.toolbox.sdk.v2.models.WorkspaceBuild import com.coder.toolbox.sdk.v2.models.WorkspaceResource +import com.coder.toolbox.sdk.v2.models.WorkspaceStatus import com.coder.toolbox.sdk.v2.models.WorkspaceTransition import com.coder.toolbox.util.CoderHostnameVerifier import com.coder.toolbox.util.coderSocketFactory @@ -190,15 +192,17 @@ open class CoderRestClient( } /** - * Retrieves all the agent names for all workspaces, including those that - * are off. Meant to be used when configuring SSH. + * Maps the list of workspaces to the associated agents. */ - suspend fun agentNames(workspaces: List<Workspace>): Set<String> { + suspend fun groupByAgents(workspaces: List<Workspace>): Set<Pair<Workspace, WorkspaceAgent>> { // It is possible for there to be resources with duplicate names so we // need to use a set. return workspaces.flatMap { ws -> - resources(ws).filter { it.agents != null }.flatMap { it.agents!! }.map { - "${ws.name}.${it.name}" + when (ws.latestBuild.status) { + WorkspaceStatus.RUNNING -> ws.latestBuild.resources + else -> resources(ws) + }.filter { it.agents != null }.flatMap { it.agents!! }.map { + ws to it } }.toSet() } diff --git a/src/main/kotlin/com/coder/toolbox/util/CoderProtocolHandler.kt b/src/main/kotlin/com/coder/toolbox/util/CoderProtocolHandler.kt index 84b033a..aca2464 100644 --- a/src/main/kotlin/com/coder/toolbox/util/CoderProtocolHandler.kt +++ b/src/main/kotlin/com/coder/toolbox/util/CoderProtocolHandler.kt @@ -162,7 +162,7 @@ open class CoderProtocolHandler( } context.logger.info("Configuring Coder CLI...") - cli.configSsh(restClient.agentNames(workspaces)) + cli.configSsh(restClient.groupByAgents(workspaces)) if (shouldWaitForAutoLogin) { isInitialized.waitForTrue() diff --git a/src/main/kotlin/com/coder/toolbox/views/EnvironmentView.kt b/src/main/kotlin/com/coder/toolbox/views/EnvironmentView.kt index 89ef3dd..020ed8a 100644 --- a/src/main/kotlin/com/coder/toolbox/views/EnvironmentView.kt +++ b/src/main/kotlin/com/coder/toolbox/views/EnvironmentView.kt @@ -3,7 +3,6 @@ package com.coder.toolbox.views import com.coder.toolbox.cli.CoderCLIManager import com.coder.toolbox.sdk.v2.models.Workspace import com.coder.toolbox.sdk.v2.models.WorkspaceAgent -import com.coder.toolbox.settings.ReadOnlyCoderSettings import com.jetbrains.toolbox.api.remoteDev.environments.SshEnvironmentContentsView import com.jetbrains.toolbox.api.remoteDev.ssh.SshConnectionInfo import java.net.URL @@ -17,8 +16,8 @@ import java.net.URL * SSH must be configured before this will work. */ class EnvironmentView( - private val settings: ReadOnlyCoderSettings, private val url: URL, + private val cli: CoderCLIManager, private val workspace: Workspace, private val agent: WorkspaceAgent, ) : SshEnvironmentContentsView { @@ -26,7 +25,7 @@ class EnvironmentView( /** * The host name generated by the cli manager for this workspace. */ - override val host: String = resolveHost() + override val host: String = cli.getHostname(url, workspace, agent) /** * The port is ignored by the Coder proxy command. @@ -36,12 +35,6 @@ class EnvironmentView( /** * The username is ignored by the Coder proxy command. */ - override val userName: String? = "coder" - + override val userName: String? = null } - - private fun resolveHost(): String = - if (settings.isSshWildcardConfigEnabled) - CoderCLIManager.getWildcardHostname(url, workspace, agent) - else CoderCLIManager.getHostname(url, workspace, agent) -} +} \ No newline at end of file diff --git a/src/test/kotlin/com/coder/toolbox/cli/CoderCLIManagerTest.kt b/src/test/kotlin/com/coder/toolbox/cli/CoderCLIManagerTest.kt index 9a32ded..d612000 100644 --- a/src/test/kotlin/com/coder/toolbox/cli/CoderCLIManagerTest.kt +++ b/src/test/kotlin/com/coder/toolbox/cli/CoderCLIManagerTest.kt @@ -4,6 +4,8 @@ import com.coder.toolbox.CoderToolboxContext import com.coder.toolbox.cli.ex.MissingVersionException import com.coder.toolbox.cli.ex.ResponseException import com.coder.toolbox.cli.ex.SSHConfigFormatException +import com.coder.toolbox.sdk.DataGen.Companion.workspace +import com.coder.toolbox.sdk.v2.models.Workspace import com.coder.toolbox.settings.Environment import com.coder.toolbox.store.BINARY_DIRECTORY import com.coder.toolbox.store.BINARY_NAME @@ -44,9 +46,11 @@ import org.zeroturnaround.exec.InvalidExitValueException import org.zeroturnaround.exec.ProcessInitException import java.net.HttpURLConnection import java.net.InetSocketAddress +import java.net.URI import java.net.URL import java.nio.file.AccessDeniedException import java.nio.file.Path +import java.util.UUID import kotlin.test.Test import kotlin.test.assertContains import kotlin.test.assertEquals @@ -350,7 +354,7 @@ internal class CoderCLIManagerTest { } data class SSHTest( - val workspaces: List<String>, + val workspaces: List<Workspace>, val input: String?, val output: String, val remove: String, @@ -364,10 +368,19 @@ internal class CoderCLIManagerTest { val extraConfig: String = "", val env: Environment = Environment(), val sshLogDirectory: Path? = null, + val url: URL? = null, ) @Test fun testConfigureSSH() { + val workspace = workspace("foo", agents = mapOf("agent1" to UUID.randomUUID().toString())) + val workspace2 = workspace("bar", agents = mapOf("agent1" to UUID.randomUUID().toString())) + val betterWorkspace = workspace("foo", agents = mapOf("agent1" to UUID.randomUUID().toString())) + val workspaceWithMultipleAgents = workspace( + "foo", + agents = mapOf("agent1" to UUID.randomUUID().toString(), "agent2" to UUID.randomUUID().toString()) + ) + val extraConfig = listOf( "ServerAliveInterval 5", @@ -375,27 +388,27 @@ internal class CoderCLIManagerTest { ).joinToString(System.lineSeparator()) val tests = listOf( - SSHTest(listOf("foo", "bar"), null, "multiple-workspaces", "blank"), - SSHTest(listOf("foo", "bar"), null, "multiple-workspaces", "blank"), - SSHTest(listOf("foo-bar"), "blank", "append-blank", "blank"), - SSHTest(listOf("foo-bar"), "blank-newlines", "append-blank-newlines", "blank"), - SSHTest(listOf("foo-bar"), "existing-end", "replace-end", "no-blocks"), - SSHTest(listOf("foo-bar"), "existing-end-no-newline", "replace-end-no-newline", "no-blocks"), - SSHTest(listOf("foo-bar"), "existing-middle", "replace-middle", "no-blocks"), + SSHTest(listOf(workspace, workspace2), null, "multiple-workspaces", "blank"), + SSHTest(listOf(workspace, workspace2), null, "multiple-workspaces", "blank"), + SSHTest(listOf(workspace), "blank", "append-blank", "blank"), + SSHTest(listOf(workspace), "blank-newlines", "append-blank-newlines", "blank"), + SSHTest(listOf(workspace), "existing-end", "replace-end", "no-blocks"), + SSHTest(listOf(workspace), "existing-end-no-newline", "replace-end-no-newline", "no-blocks"), + SSHTest(listOf(workspace), "existing-middle", "replace-middle", "no-blocks"), SSHTest( - listOf("foo-bar"), + listOf(workspace), "existing-middle-and-unrelated", "replace-middle-ignore-unrelated", "no-related-blocks" ), - SSHTest(listOf("foo-bar"), "existing-only", "replace-only", "blank"), - SSHTest(listOf("foo-bar"), "existing-start", "replace-start", "no-blocks"), - SSHTest(listOf("foo-bar"), "no-blocks", "append-no-blocks", "no-blocks"), - SSHTest(listOf("foo-bar"), "no-related-blocks", "append-no-related-blocks", "no-related-blocks"), - SSHTest(listOf("foo-bar"), "no-newline", "append-no-newline", "no-blocks"), + SSHTest(listOf(workspace), "existing-only", "replace-only", "blank"), + SSHTest(listOf(workspace), "existing-start", "replace-start", "no-blocks"), + SSHTest(listOf(workspace), "no-blocks", "append-no-blocks", "no-blocks"), + SSHTest(listOf(workspace), "no-related-blocks", "append-no-related-blocks", "no-related-blocks"), + SSHTest(listOf(workspace), "no-newline", "append-no-newline", "no-blocks"), if (getOS() == OS.WINDOWS) { SSHTest( - listOf("header"), + listOf(workspace), null, "header-command-windows", "blank", @@ -403,7 +416,7 @@ internal class CoderCLIManagerTest { ) } else { SSHTest( - listOf("header"), + listOf(workspace), null, "header-command", "blank", @@ -411,7 +424,7 @@ internal class CoderCLIManagerTest { ) }, SSHTest( - listOf("foo"), + listOf(workspace), null, "disable-autostart", "blank", @@ -422,9 +435,9 @@ internal class CoderCLIManagerTest { reportWorkspaceUsage = true, ), ), - SSHTest(listOf("foo"), null, "no-disable-autostart", "blank", ""), + SSHTest(listOf(workspace), null, "no-disable-autostart", "blank", ""), SSHTest( - listOf("foo"), + listOf(workspace), null, "no-report-usage", "blank", @@ -436,26 +449,54 @@ internal class CoderCLIManagerTest { ), ), SSHTest( - listOf("extra"), + listOf(workspace), null, "extra-config", "blank", extraConfig = extraConfig, ), SSHTest( - listOf("extra"), + listOf(workspace), null, "extra-config", "blank", env = Environment(mapOf(CODER_SSH_CONFIG_OPTIONS to extraConfig)), ), SSHTest( - listOf("foo"), + listOf(workspace), null, "log-dir", "blank", sshLogDirectory = tmpdir.resolve("ssh-logs"), ), + SSHTest( + listOf(workspace), + input = null, + output = "url", + remove = "blank", + url = URI.create("https://test.coder.invalid?foo=bar&baz=qux").toURL(), + ), + SSHTest( + listOf(workspace, betterWorkspace), + input = null, + output = "multiple-users", + remove = "blank", + ), + SSHTest( + listOf(workspaceWithMultipleAgents), + input = null, + output = "multiple-agents", + remove = "blank", + ), + SSHTest( + listOf(workspace), + input = null, + output = "wildcard", + remove = "blank", + features = Features( + wildcardSsh = true, + ), + ), ) val newlineRe = "\r?\n".toRegex() @@ -475,7 +516,8 @@ internal class CoderCLIManagerTest { context.logger, ).readOnly() - val ccm = CoderCLIManager(URL("https://test.coder.invalid"), context.logger, settings) + val ccm = + CoderCLIManager(it.url ?: URI.create("https://test.coder.invalid").toURL(), context.logger, settings) val sshConfigPath = Path.of(settings.sshConfigPath) // Input is the configuration that we start with, if any. @@ -506,7 +548,14 @@ internal class CoderCLIManagerTest { } // Add workspaces. - ccm.configSsh(it.workspaces.toSet(), it.features) + ccm.configSsh( + it.workspaces.flatMap { ws -> + ws.latestBuild.resources.filter { r -> r.agents != null }.flatMap { r -> r.agents!! }.map { a -> + ws to a + } + }.toSet(), + it.features, + ) assertEquals(expectedConf, sshConfigPath.toFile().readText()) @@ -568,9 +617,18 @@ internal class CoderCLIManagerTest { "new\nline", ) + + val workspace = workspace( + "foo", + agents = mapOf("agentid1" to UUID.randomUUID().toString(), "agentid2" to UUID.randomUUID().toString()) + ) + val withAgents = workspace.latestBuild.resources.filter { it.agents != null }.flatMap { it.agents!! }.map { + workspace to it + } + tests.forEach { val ccm = CoderCLIManager( - URL("https://test.coder.invalid"), + URI.create("https://test.coder.invalid").toURL(), context.logger, CoderSettingsStore( pluginTestSettingsStore( @@ -583,7 +641,7 @@ internal class CoderCLIManagerTest { assertFailsWith( exceptionClass = Exception::class, - block = { ccm.configSsh(setOf("foo", "bar")) }, + block = { ccm.configSsh(withAgents.toSet()) }, ) } } diff --git a/src/test/resources/fixtures/outputs/append-blank-newlines.conf b/src/test/resources/fixtures/outputs/append-blank-newlines.conf index 7124556..c73e3a2 100644 --- a/src/test/resources/fixtures/outputs/append-blank-newlines.conf +++ b/src/test/resources/fixtures/outputs/append-blank-newlines.conf @@ -3,15 +3,15 @@ # --- START CODER JETBRAINS TOOLBOX test.coder.invalid -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null diff --git a/src/test/resources/fixtures/outputs/append-blank.conf b/src/test/resources/fixtures/outputs/append-blank.conf index d884838..7c9df80 100644 --- a/src/test/resources/fixtures/outputs/append-blank.conf +++ b/src/test/resources/fixtures/outputs/append-blank.conf @@ -1,13 +1,13 @@ # --- START CODER JETBRAINS TOOLBOX test.coder.invalid -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null diff --git a/src/test/resources/fixtures/outputs/append-no-blocks.conf b/src/test/resources/fixtures/outputs/append-no-blocks.conf index e4c161b..8db68d4 100644 --- a/src/test/resources/fixtures/outputs/append-no-blocks.conf +++ b/src/test/resources/fixtures/outputs/append-no-blocks.conf @@ -4,15 +4,15 @@ Host test2 Port 443 # --- START CODER JETBRAINS TOOLBOX test.coder.invalid -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null diff --git a/src/test/resources/fixtures/outputs/append-no-newline.conf b/src/test/resources/fixtures/outputs/append-no-newline.conf index b5b9d2c..0a48b7e 100644 --- a/src/test/resources/fixtures/outputs/append-no-newline.conf +++ b/src/test/resources/fixtures/outputs/append-no-newline.conf @@ -3,15 +3,15 @@ Host test Host test2 Port 443 # --- START CODER JETBRAINS TOOLBOX test.coder.invalid -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null diff --git a/src/test/resources/fixtures/outputs/append-no-related-blocks.conf b/src/test/resources/fixtures/outputs/append-no-related-blocks.conf index 87446f5..73ebf8d 100644 --- a/src/test/resources/fixtures/outputs/append-no-related-blocks.conf +++ b/src/test/resources/fixtures/outputs/append-no-related-blocks.conf @@ -10,15 +10,15 @@ some jetbrains config # --- END CODER JETBRAINS TOOLBOX test.coder.unrelated # --- START CODER JETBRAINS TOOLBOX test.coder.invalid -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null diff --git a/src/test/resources/fixtures/outputs/disable-autostart.conf b/src/test/resources/fixtures/outputs/disable-autostart.conf index cf993f8..916aa9f 100644 --- a/src/test/resources/fixtures/outputs/disable-autostart.conf +++ b/src/test/resources/fixtures/outputs/disable-autostart.conf @@ -1,13 +1,13 @@ # --- START CODER JETBRAINS TOOLBOX test.coder.invalid -Host coder-jetbrains-toolbox-foo--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --disable-autostart --usage-app=jetbrains foo +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --disable-autostart --usage-app=jetbrains owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-foo--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --disable-autostart --usage-app=disable foo +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --disable-autostart --usage-app=disable owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null diff --git a/src/test/resources/fixtures/outputs/extra-config.conf b/src/test/resources/fixtures/outputs/extra-config.conf index 3acb86d..9a7900c 100644 --- a/src/test/resources/fixtures/outputs/extra-config.conf +++ b/src/test/resources/fixtures/outputs/extra-config.conf @@ -1,6 +1,6 @@ # --- START CODER JETBRAINS TOOLBOX test.coder.invalid -Host coder-jetbrains-toolbox-extra--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains extra +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null @@ -8,8 +8,8 @@ Host coder-jetbrains-toolbox-extra--test.coder.invalid SetEnv CODER_SSH_SESSION_TYPE=JetBrains ServerAliveInterval 5 ServerAliveCountMax 3 -Host coder-jetbrains-toolbox-extra--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable extra +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null diff --git a/src/test/resources/fixtures/outputs/header-command-windows.conf b/src/test/resources/fixtures/outputs/header-command-windows.conf index 84d0529..a27f0ab 100644 --- a/src/test/resources/fixtures/outputs/header-command-windows.conf +++ b/src/test/resources/fixtures/outputs/header-command-windows.conf @@ -1,13 +1,13 @@ # --- START CODER JETBRAINS TOOLBOX test.coder.invalid -Host coder-jetbrains-toolbox-header--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid --header-command "\"C:\Program Files\My Header Command\HeaderCommand.exe\" --url=\"%%CODER_URL%%\" --test=\"foo bar\"" ssh --stdio --usage-app=jetbrains header +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid --header-command "\"C:\Program Files\My Header Command\HeaderCommand.exe\" --url=\"%%CODER_URL%%\" --test=\"foo bar\"" ssh --stdio --usage-app=jetbrains owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-header--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid --header-command "\"C:\Program Files\My Header Command\HeaderCommand.exe\" --url=\"%%CODER_URL%%\" --test=\"foo bar\"" ssh --stdio --usage-app=disable header +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid --header-command "\"C:\Program Files\My Header Command\HeaderCommand.exe\" --url=\"%%CODER_URL%%\" --test=\"foo bar\"" ssh --stdio --usage-app=disable owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null diff --git a/src/test/resources/fixtures/outputs/header-command.conf b/src/test/resources/fixtures/outputs/header-command.conf index c8ee5cd..61b5d74 100644 --- a/src/test/resources/fixtures/outputs/header-command.conf +++ b/src/test/resources/fixtures/outputs/header-command.conf @@ -1,13 +1,13 @@ # --- START CODER JETBRAINS TOOLBOX test.coder.invalid -Host coder-jetbrains-toolbox-header--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid --header-command 'my-header-command --url="$CODER_URL" --test="foo bar" --literal='\''$CODER_URL'\''' ssh --stdio --usage-app=jetbrains header +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid --header-command 'my-header-command --url="$CODER_URL" --test="foo bar" --literal='\''$CODER_URL'\''' ssh --stdio --usage-app=jetbrains owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-header--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid --header-command 'my-header-command --url="$CODER_URL" --test="foo bar" --literal='\''$CODER_URL'\''' ssh --stdio --usage-app=disable header +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid --header-command 'my-header-command --url="$CODER_URL" --test="foo bar" --literal='\''$CODER_URL'\''' ssh --stdio --usage-app=disable owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null diff --git a/src/test/resources/fixtures/outputs/log-dir.conf b/src/test/resources/fixtures/outputs/log-dir.conf index a0be236..84d7549 100644 --- a/src/test/resources/fixtures/outputs/log-dir.conf +++ b/src/test/resources/fixtures/outputs/log-dir.conf @@ -1,13 +1,13 @@ # --- START CODER JETBRAINS TOOLBOX test.coder.invalid -Host coder-jetbrains-toolbox-foo--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --log-dir /tmp/coder-toolbox/test.coder.invalid/logs --usage-app=jetbrains foo +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --log-dir /tmp/coder-toolbox/test.coder.invalid/logs --usage-app=jetbrains owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-foo--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable foo +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null diff --git a/src/test/resources/fixtures/outputs/multiple-agents.conf b/src/test/resources/fixtures/outputs/multiple-agents.conf new file mode 100644 index 0000000..a81a8be --- /dev/null +++ b/src/test/resources/fixtures/outputs/multiple-agents.conf @@ -0,0 +1,30 @@ +# --- START CODER JETBRAINS TOOLBOX test.coder.invalid +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains owner/foo.agent1 + ConnectTimeout 0 + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR + SetEnv CODER_SSH_SESSION_TYPE=JetBrains +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/foo.agent1 + ConnectTimeout 0 + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR + SetEnv CODER_SSH_SESSION_TYPE=JetBrains +Host coder-jetbrains-toolbox--owner--foo.agent2--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains owner/foo.agent2 + ConnectTimeout 0 + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR + SetEnv CODER_SSH_SESSION_TYPE=JetBrains +Host coder-jetbrains-toolbox--owner--foo.agent2--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/foo.agent2 + ConnectTimeout 0 + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR + SetEnv CODER_SSH_SESSION_TYPE=JetBrains +# --- END CODER JETBRAINS TOOLBOX test.coder.invalid diff --git a/src/test/resources/fixtures/outputs/multiple-users.conf b/src/test/resources/fixtures/outputs/multiple-users.conf new file mode 100644 index 0000000..c8cd03d --- /dev/null +++ b/src/test/resources/fixtures/outputs/multiple-users.conf @@ -0,0 +1,30 @@ +# --- START CODER JETBRAINS TOOLBOX test.coder.invalid +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains owner/foo.agent1 + ConnectTimeout 0 + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR + SetEnv CODER_SSH_SESSION_TYPE=JetBrains +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/foo.agent1 + ConnectTimeout 0 + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR + SetEnv CODER_SSH_SESSION_TYPE=JetBrains +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains owner/foo.agent1 + ConnectTimeout 0 + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR + SetEnv CODER_SSH_SESSION_TYPE=JetBrains +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/foo.agent1 + ConnectTimeout 0 + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR + SetEnv CODER_SSH_SESSION_TYPE=JetBrains +# --- END CODER JETBRAINS TOOLBOX test.coder.invalid diff --git a/src/test/resources/fixtures/outputs/multiple-workspaces.conf b/src/test/resources/fixtures/outputs/multiple-workspaces.conf index e54e00c..8629ce3 100644 --- a/src/test/resources/fixtures/outputs/multiple-workspaces.conf +++ b/src/test/resources/fixtures/outputs/multiple-workspaces.conf @@ -1,27 +1,27 @@ # --- START CODER JETBRAINS TOOLBOX test.coder.invalid -Host coder-jetbrains-toolbox-foo--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains foo +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-foo--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable foo +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-bar--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains bar +Host coder-jetbrains-toolbox--owner--bar.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains owner/bar.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-bar--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable bar +Host coder-jetbrains-toolbox--owner--bar.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/bar.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null diff --git a/src/test/resources/fixtures/outputs/no-disable-autostart.conf b/src/test/resources/fixtures/outputs/no-disable-autostart.conf index cd9e3ad..7c9df80 100644 --- a/src/test/resources/fixtures/outputs/no-disable-autostart.conf +++ b/src/test/resources/fixtures/outputs/no-disable-autostart.conf @@ -1,13 +1,13 @@ # --- START CODER JETBRAINS TOOLBOX test.coder.invalid -Host coder-jetbrains-toolbox-foo--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains foo +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-foo--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable foo +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null diff --git a/src/test/resources/fixtures/outputs/no-report-usage.conf b/src/test/resources/fixtures/outputs/no-report-usage.conf index 03a8d81..7c971e5 100644 --- a/src/test/resources/fixtures/outputs/no-report-usage.conf +++ b/src/test/resources/fixtures/outputs/no-report-usage.conf @@ -1,13 +1,13 @@ # --- START CODER JETBRAINS TOOLBOX test.coder.invalid -Host coder-jetbrains-toolbox-foo--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio foo +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-foo--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio foo +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null diff --git a/src/test/resources/fixtures/outputs/replace-end-no-newline.conf b/src/test/resources/fixtures/outputs/replace-end-no-newline.conf index 4d4e958..77a7cbb 100644 --- a/src/test/resources/fixtures/outputs/replace-end-no-newline.conf +++ b/src/test/resources/fixtures/outputs/replace-end-no-newline.conf @@ -2,15 +2,15 @@ Host test Port 80 Host test2 Port 443 # --- START CODER JETBRAINS TOOLBOX test.coder.invalid -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null diff --git a/src/test/resources/fixtures/outputs/replace-end.conf b/src/test/resources/fixtures/outputs/replace-end.conf index b5b9d2c..0a48b7e 100644 --- a/src/test/resources/fixtures/outputs/replace-end.conf +++ b/src/test/resources/fixtures/outputs/replace-end.conf @@ -3,15 +3,15 @@ Host test Host test2 Port 443 # --- START CODER JETBRAINS TOOLBOX test.coder.invalid -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null diff --git a/src/test/resources/fixtures/outputs/replace-middle-ignore-unrelated.conf b/src/test/resources/fixtures/outputs/replace-middle-ignore-unrelated.conf index 36b03f3..ce23062 100644 --- a/src/test/resources/fixtures/outputs/replace-middle-ignore-unrelated.conf +++ b/src/test/resources/fixtures/outputs/replace-middle-ignore-unrelated.conf @@ -4,15 +4,15 @@ Host test some coder config # ------------END-CODER------------ # --- START CODER JETBRAINS TOOLBOX test.coder.invalid -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null diff --git a/src/test/resources/fixtures/outputs/replace-middle.conf b/src/test/resources/fixtures/outputs/replace-middle.conf index 437404c..9125cd8 100644 --- a/src/test/resources/fixtures/outputs/replace-middle.conf +++ b/src/test/resources/fixtures/outputs/replace-middle.conf @@ -1,15 +1,15 @@ Host test Port 80 # --- START CODER JETBRAINS TOOLBOX test.coder.invalid -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null diff --git a/src/test/resources/fixtures/outputs/replace-only.conf b/src/test/resources/fixtures/outputs/replace-only.conf index d884838..7c9df80 100644 --- a/src/test/resources/fixtures/outputs/replace-only.conf +++ b/src/test/resources/fixtures/outputs/replace-only.conf @@ -1,13 +1,13 @@ # --- START CODER JETBRAINS TOOLBOX test.coder.invalid -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null diff --git a/src/test/resources/fixtures/outputs/replace-start.conf b/src/test/resources/fixtures/outputs/replace-start.conf index aeb47d4..060582d 100644 --- a/src/test/resources/fixtures/outputs/replace-start.conf +++ b/src/test/resources/fixtures/outputs/replace-start.conf @@ -1,13 +1,13 @@ # --- START CODER JETBRAINS TOOLBOX test.coder.invalid -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=jetbrains owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR SetEnv CODER_SSH_SESSION_TYPE=JetBrains -Host coder-jetbrains-toolbox-foo-bar--test.coder.invalid--bg - ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable foo-bar +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --usage-app=disable owner/foo.agent1 ConnectTimeout 0 StrictHostKeyChecking no UserKnownHostsFile /dev/null diff --git a/src/test/resources/fixtures/outputs/url.conf b/src/test/resources/fixtures/outputs/url.conf new file mode 100644 index 0000000..dd3b17b --- /dev/null +++ b/src/test/resources/fixtures/outputs/url.conf @@ -0,0 +1,16 @@ +# --- START CODER JETBRAINS TOOLBOX test.coder.invalid +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid?foo=bar&baz=qux ssh --stdio --usage-app=jetbrains owner/foo.agent1 + ConnectTimeout 0 + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR + SetEnv CODER_SSH_SESSION_TYPE=JetBrains +Host coder-jetbrains-toolbox--owner--foo.agent1--test.coder.invalid--bg + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid?foo=bar&baz=qux ssh --stdio --usage-app=disable owner/foo.agent1 + ConnectTimeout 0 + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR + SetEnv CODER_SSH_SESSION_TYPE=JetBrains +# --- END CODER JETBRAINS TOOLBOX test.coder.invalid diff --git a/src/test/resources/fixtures/outputs/wildcard.conf b/src/test/resources/fixtures/outputs/wildcard.conf new file mode 100644 index 0000000..b3fd6b8 --- /dev/null +++ b/src/test/resources/fixtures/outputs/wildcard.conf @@ -0,0 +1,17 @@ +# --- START CODER JETBRAINS TOOLBOX test.coder.invalid +Host coder-jetbrains-toolbox-test.coder.invalid--* + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --ssh-host-prefix coder-jetbrains-toolbox-test.coder.invalid-- %h + ConnectTimeout 0 + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR + SetEnv CODER_SSH_SESSION_TYPE=JetBrains + +Host coder-jetbrains-toolbox-test.coder.invalid-bg--* + ProxyCommand /tmp/coder-toolbox/test.coder.invalid/coder-linux-amd64 --global-config /tmp/coder-toolbox/test.coder.invalid/config --url https://test.coder.invalid ssh --stdio --ssh-host-prefix coder-jetbrains-toolbox-test.coder.invalid-bg-- %h + ConnectTimeout 0 + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR + SetEnv CODER_SSH_SESSION_TYPE=JetBrains +# --- END CODER JETBRAINS TOOLBOX test.coder.invalid