diff --git a/cmd/agent/agent.go b/cmd/agent/agent.go deleted file mode 100644 index 45bae64f9..000000000 --- a/cmd/agent/agent.go +++ /dev/null @@ -1,69 +0,0 @@ -package agent - -import ( - "os" - - "github.com/devsy-org/devsy/cmd/agent/container" - "github.com/devsy-org/devsy/cmd/agent/workspace" - "github.com/devsy-org/devsy/cmd/flags" - "github.com/devsy-org/devsy/pkg/config" - "github.com/devsy-org/devsy/pkg/envfile" - "github.com/devsy-org/devsy/pkg/log" - "github.com/spf13/cobra" -) - -var AgentExecutedAnnotation = "devsy.sh/agent-executed" - -// NewAgentCmd returns a new root command. -func NewAgentCmd(globalFlags *flags.GlobalFlags) *cobra.Command { - agentCmd := &cobra.Command{ - Use: "agent", - Short: "Devsy Agent", - PersistentPreRunE: func(cobraCmd *cobra.Command, args []string) error { - return AgentPersistentPreRunE(cobraCmd, args, globalFlags) - }, - Hidden: true, - } - - agentCmd.AddCommand(workspace.NewWorkspaceCmd(globalFlags)) - agentCmd.AddCommand(container.NewContainerCmd(globalFlags)) - agentCmd.AddCommand(NewDaemonCmd(globalFlags)) - agentCmd.AddCommand(NewContainerTunnelCmd(globalFlags)) - agentCmd.AddCommand(NewGitCredentialsCmd(globalFlags)) - agentCmd.AddCommand(NewGitSSHSignatureCmd(globalFlags)) - agentCmd.AddCommand(NewGitSSHSignatureHelperCmd(globalFlags)) - agentCmd.AddCommand(NewDockerCredentialsCmd(globalFlags)) - return agentCmd -} - -func AgentPersistentPreRunE( - cobraCmd *cobra.Command, - args []string, - globalFlags *flags.GlobalFlags, -) error { - // get top level parent - parent := cobraCmd - for parent.Parent() != nil { - parent = parent.Parent() - } - if parent.Annotations == nil { - parent.Annotations = map[string]string{} - } - parent.Annotations[AgentExecutedAnnotation] = "true" - - // Initialise the zap logger for the agent subprocess. - // stdout is the binary protocol channel, so all log output goes to stderr. - log.Init(log.Config{ - Quiet: globalFlags.Quiet, - Debug: globalFlags.Debug, - Format: "json", // Agent must use JSON: single-line output is captured by TunnelLogStreamer.lastLines - }) - - if globalFlags.DevsyHome != "" { - _ = os.Setenv(config.EnvHome, globalFlags.DevsyHome) - } - - // apply environment - envfile.Apply() - return nil -} diff --git a/cmd/agent/git_ssh_signature_helper.go b/cmd/agent/git_ssh_signature_helper.go deleted file mode 100644 index 759e2b7ae..000000000 --- a/cmd/agent/git_ssh_signature_helper.go +++ /dev/null @@ -1,59 +0,0 @@ -package agent - -import ( - "fmt" - "os/user" - - "github.com/devsy-org/devsy/cmd/flags" - "github.com/devsy-org/devsy/pkg/gitsshsigning" - "github.com/spf13/cobra" -) - -type GitSSHSignatureHelperCmd struct { - *flags.GlobalFlags - - CertPath string -} - -// NewGitSSHSignatureHelperCmd creates a new git-ssh-signature-helper command -// This agent command can be used to inject the Git SSH signature helper. -// -// This command is used to set up the environment for Git SSH signature verification by configuring -// the necessary helper using a provided signing key path. -// -// Example usage: -// -// git-ssh-signature-helper [signing-key-path] -// -// The signing key path is a required argument for this command. It should be what equal to what you -// would have set as user.signingkey git config. -func NewGitSSHSignatureHelperCmd(flags *flags.GlobalFlags) *cobra.Command { - cmd := &GitSSHSignatureHelperCmd{ - GlobalFlags: flags, - } - - gitSshSignatureHelperCmd := &cobra.Command{ - Use: "git-ssh-signature-helper [signing-key-path]", - Short: "used to inject git ssh signature helper", - RunE: func(_ *cobra.Command, args []string) error { - usr, err := user.Current() - if err != nil { - return err - } - - if len(args) < 1 { - return fmt.Errorf("gitSigningKey argument is required") - } - cmd.CertPath = args[0] - - err = gitsshsigning.ConfigureHelper(usr.Username, cmd.CertPath) - if err != nil { - return err - } - - return nil - }, - } - - return gitSshSignatureHelperCmd -} diff --git a/cmd/helper/helper.go b/cmd/helper/helper.go deleted file mode 100644 index 24a32c1e3..000000000 --- a/cmd/helper/helper.go +++ /dev/null @@ -1,41 +0,0 @@ -package helper - -import ( - "github.com/devsy-org/devsy/cmd/agent" - "github.com/devsy-org/devsy/cmd/flags" - "github.com/devsy-org/devsy/cmd/helper/http" - "github.com/devsy-org/devsy/cmd/helper/json" - "github.com/devsy-org/devsy/cmd/helper/strings" - "github.com/spf13/cobra" -) - -// NewHelperCmd returns a new command. -func NewHelperCmd(globalFlags *flags.GlobalFlags) *cobra.Command { - helperCmd := &cobra.Command{ - Use: "helper", - Short: "Devsy Utility Commands", - PersistentPreRunE: func(cobraCmd *cobra.Command, args []string) error { - return agent.AgentPersistentPreRunE(cobraCmd, args, globalFlags) - }, - Hidden: true, - } - - helperCmd.AddCommand(http.NewHTTPCmd(globalFlags)) - helperCmd.AddCommand(json.NewJSONCmd(globalFlags)) - helperCmd.AddCommand(strings.NewStringsCmd(globalFlags)) - helperCmd.AddCommand(NewSSHServerCmd(globalFlags)) - helperCmd.AddCommand(NewGetWorkspaceNameCmd(globalFlags)) - helperCmd.AddCommand(NewGetWorkspaceUIDCmd(globalFlags)) - helperCmd.AddCommand(NewGetWorkspaceConfigCommand(globalFlags)) - helperCmd.AddCommand(NewGetProviderNameCmd(globalFlags)) - helperCmd.AddCommand(NewCheckProviderUpdateCmd(globalFlags)) - helperCmd.AddCommand(NewSSHClientCmd()) - helperCmd.AddCommand(NewShellCmd()) - helperCmd.AddCommand(NewSSHGitCloneCmd()) - helperCmd.AddCommand(NewFleetServerCmd(globalFlags)) - helperCmd.AddCommand(NewDockerCredentialsHelperCmd(globalFlags)) - helperCmd.AddCommand(NewGetImageCmd(globalFlags)) - helperCmd.AddCommand(NewGetImagePlatformsCmd(globalFlags)) - helperCmd.AddCommand(NewBrowserTunnelCmd(globalFlags)) - return helperCmd -} diff --git a/cmd/internal/agent.go b/cmd/internal/agent.go new file mode 100644 index 000000000..28a805424 --- /dev/null +++ b/cmd/internal/agent.go @@ -0,0 +1,66 @@ +package cmdinternal + +import ( + "os" + + "github.com/devsy-org/devsy/cmd/flags" + "github.com/devsy-org/devsy/cmd/internal/agentcontainer" + "github.com/devsy-org/devsy/cmd/internal/agentworkspace" + "github.com/devsy-org/devsy/pkg/config" + "github.com/devsy-org/devsy/pkg/envfile" + "github.com/devsy-org/devsy/pkg/log" + "github.com/spf13/cobra" +) + +var AgentExecutedAnnotation = "devsy.sh/agent-executed" + +// NewAgentCmd is the hidden parent for commands that run inside a workspace or +// container, invoked by the daemon over the agent tunnel. +func NewAgentCmd(globalFlags *flags.GlobalFlags) *cobra.Command { + agentCmd := &cobra.Command{ + Use: "agent", + Short: "Devsy Agent", + PersistentPreRunE: agentPreRunE(globalFlags), + Hidden: true, + } + + agentCmd.AddCommand(agentworkspace.NewWorkspaceCmd(globalFlags)) + agentCmd.AddCommand(agentcontainer.NewContainerCmd(globalFlags)) + agentCmd.AddCommand(NewDaemonCmd(globalFlags)) + agentCmd.AddCommand(NewContainerTunnelCmd(globalFlags)) + agentCmd.AddCommand(NewGitCredentialsCmd(globalFlags)) + agentCmd.AddCommand(NewGitSSHSignatureCmd(globalFlags)) + agentCmd.AddCommand(NewGitSSHSignatureHelperCmd(globalFlags)) + agentCmd.AddCommand(NewDockerCredentialsCmd(globalFlags)) + return agentCmd +} + +// agentPreRunE builds the PersistentPreRunE shared by the agent command and the +// utility plumbing commands. Logging is forced to JSON because the agent +// subprocess uses stdout as a binary protocol channel, so log output must stay +// on stderr as single-line JSON captured by TunnelLogStreamer.lastLines. +func agentPreRunE(globalFlags *flags.GlobalFlags) func(*cobra.Command, []string) error { + return func(cobraCmd *cobra.Command, _ []string) error { + root := cobraCmd + for root.Parent() != nil { + root = root.Parent() + } + if root.Annotations == nil { + root.Annotations = map[string]string{} + } + root.Annotations[AgentExecutedAnnotation] = "true" + + log.Init(log.Config{ + Quiet: globalFlags.Quiet, + Debug: globalFlags.Debug, + Format: "json", + }) + + if globalFlags.DevsyHome != "" { + _ = os.Setenv(config.EnvHome, globalFlags.DevsyHome) + } + + envfile.Apply() + return nil + } +} diff --git a/cmd/agent/daemon.go b/cmd/internal/agent_daemon.go similarity index 99% rename from cmd/agent/daemon.go rename to cmd/internal/agent_daemon.go index c59d87980..f153cdd8d 100644 --- a/cmd/agent/daemon.go +++ b/cmd/internal/agent_daemon.go @@ -1,4 +1,4 @@ -package agent +package cmdinternal import ( "bytes" diff --git a/cmd/agent/docker_credentials.go b/cmd/internal/agent_docker_credentials.go similarity index 98% rename from cmd/agent/docker_credentials.go rename to cmd/internal/agent_docker_credentials.go index 4959ca005..82898830d 100644 --- a/cmd/agent/docker_credentials.go +++ b/cmd/internal/agent_docker_credentials.go @@ -1,4 +1,4 @@ -package agent +package cmdinternal import ( "context" diff --git a/cmd/agent/container/codeserver_async.go b/cmd/internal/agentcontainer/codeserver_async.go similarity index 98% rename from cmd/agent/container/codeserver_async.go rename to cmd/internal/agentcontainer/codeserver_async.go index 997533a08..a7b5c2e05 100644 --- a/cmd/agent/container/codeserver_async.go +++ b/cmd/internal/agentcontainer/codeserver_async.go @@ -1,4 +1,4 @@ -package container +package agentcontainer import ( "encoding/json" diff --git a/cmd/agent/container/container.go b/cmd/internal/agentcontainer/container.go similarity index 97% rename from cmd/agent/container/container.go rename to cmd/internal/agentcontainer/container.go index ae527e2d5..d750ef01f 100644 --- a/cmd/agent/container/container.go +++ b/cmd/internal/agentcontainer/container.go @@ -1,4 +1,4 @@ -package container +package agentcontainer import ( "github.com/devsy-org/devsy/cmd/flags" diff --git a/cmd/agent/container/credentials_server.go b/cmd/internal/agentcontainer/credentials_server.go similarity index 99% rename from cmd/agent/container/credentials_server.go rename to cmd/internal/agentcontainer/credentials_server.go index d3755b6e3..09b534ae2 100644 --- a/cmd/agent/container/credentials_server.go +++ b/cmd/internal/agentcontainer/credentials_server.go @@ -1,4 +1,4 @@ -package container +package agentcontainer import ( "context" diff --git a/cmd/agent/container/daemon.go b/cmd/internal/agentcontainer/daemon.go similarity index 99% rename from cmd/agent/container/daemon.go rename to cmd/internal/agentcontainer/daemon.go index 537e95fc9..04a420ef7 100644 --- a/cmd/agent/container/daemon.go +++ b/cmd/internal/agentcontainer/daemon.go @@ -1,4 +1,4 @@ -package container +package agentcontainer import ( "context" diff --git a/cmd/agent/container/deferred_hooks.go b/cmd/internal/agentcontainer/deferred_hooks.go similarity index 99% rename from cmd/agent/container/deferred_hooks.go rename to cmd/internal/agentcontainer/deferred_hooks.go index 717ba7235..b47694258 100644 --- a/cmd/agent/container/deferred_hooks.go +++ b/cmd/internal/agentcontainer/deferred_hooks.go @@ -1,6 +1,6 @@ //go:build !windows -package container +package agentcontainer import ( "context" diff --git a/cmd/agent/container/deferred_hooks_windows.go b/cmd/internal/agentcontainer/deferred_hooks_windows.go similarity index 94% rename from cmd/agent/container/deferred_hooks_windows.go rename to cmd/internal/agentcontainer/deferred_hooks_windows.go index c27e73b34..4f13a74a9 100644 --- a/cmd/agent/container/deferred_hooks_windows.go +++ b/cmd/internal/agentcontainer/deferred_hooks_windows.go @@ -1,6 +1,6 @@ //go:build windows -package container +package agentcontainer import ( "fmt" diff --git a/cmd/agent/container/openvscode_async.go b/cmd/internal/agentcontainer/openvscode_async.go similarity index 98% rename from cmd/agent/container/openvscode_async.go rename to cmd/internal/agentcontainer/openvscode_async.go index 11bda33fe..2a8fd68f1 100644 --- a/cmd/agent/container/openvscode_async.go +++ b/cmd/internal/agentcontainer/openvscode_async.go @@ -1,4 +1,4 @@ -package container +package agentcontainer import ( "encoding/json" diff --git a/cmd/agent/container/post_attach.go b/cmd/internal/agentcontainer/post_attach.go similarity index 98% rename from cmd/agent/container/post_attach.go rename to cmd/internal/agentcontainer/post_attach.go index 5ad8533c9..8e6675f2b 100644 --- a/cmd/agent/container/post_attach.go +++ b/cmd/internal/agentcontainer/post_attach.go @@ -1,6 +1,6 @@ //go:build !windows -package container +package agentcontainer import ( "context" diff --git a/cmd/agent/container/post_attach_windows.go b/cmd/internal/agentcontainer/post_attach_windows.go similarity index 94% rename from cmd/agent/container/post_attach_windows.go rename to cmd/internal/agentcontainer/post_attach_windows.go index a95b69454..b67834dcf 100644 --- a/cmd/agent/container/post_attach_windows.go +++ b/cmd/internal/agentcontainer/post_attach_windows.go @@ -1,6 +1,6 @@ //go:build windows -package container +package agentcontainer import ( "fmt" diff --git a/cmd/agent/container/setup.go b/cmd/internal/agentcontainer/setup.go similarity index 99% rename from cmd/agent/container/setup.go rename to cmd/internal/agentcontainer/setup.go index 3e792f378..d54e676aa 100644 --- a/cmd/agent/container/setup.go +++ b/cmd/internal/agentcontainer/setup.go @@ -1,6 +1,6 @@ //go:build !windows -package container +package agentcontainer import ( "context" diff --git a/cmd/agent/container/setup_devsy_platform_access.go b/cmd/internal/agentcontainer/setup_devsy_platform_access.go similarity index 98% rename from cmd/agent/container/setup_devsy_platform_access.go rename to cmd/internal/agentcontainer/setup_devsy_platform_access.go index 58077ddf6..6b1e1bddc 100644 --- a/cmd/agent/container/setup_devsy_platform_access.go +++ b/cmd/internal/agentcontainer/setup_devsy_platform_access.go @@ -1,4 +1,4 @@ -package container +package agentcontainer import ( "fmt" diff --git a/cmd/agent/container/setup_internal_test.go b/cmd/internal/agentcontainer/setup_internal_test.go similarity index 98% rename from cmd/agent/container/setup_internal_test.go rename to cmd/internal/agentcontainer/setup_internal_test.go index f63e89b19..890a9642f 100644 --- a/cmd/agent/container/setup_internal_test.go +++ b/cmd/internal/agentcontainer/setup_internal_test.go @@ -1,6 +1,6 @@ //go:build !windows -package container +package agentcontainer import ( "encoding/json" diff --git a/cmd/agent/container/setup_windows.go b/cmd/internal/agentcontainer/setup_windows.go similarity index 94% rename from cmd/agent/container/setup_windows.go rename to cmd/internal/agentcontainer/setup_windows.go index 569ad5e7d..87bdf9065 100644 --- a/cmd/agent/container/setup_windows.go +++ b/cmd/internal/agentcontainer/setup_windows.go @@ -1,6 +1,6 @@ //go:build windows -package container +package agentcontainer import ( "fmt" diff --git a/cmd/agent/container/ssh_server.go b/cmd/internal/agentcontainer/ssh_server.go similarity index 87% rename from cmd/agent/container/ssh_server.go rename to cmd/internal/agentcontainer/ssh_server.go index 3529008db..298117ab6 100644 --- a/cmd/agent/container/ssh_server.go +++ b/cmd/internal/agentcontainer/ssh_server.go @@ -1,11 +1,11 @@ -package container +package agentcontainer import ( "fmt" "github.com/devsy-org/devsy/cmd/flags" "github.com/devsy-org/devsy/pkg/log" - helperssh "github.com/devsy-org/devsy/pkg/ssh/server" + sshserver "github.com/devsy-org/devsy/pkg/ssh/server" "github.com/devsy-org/devsy/pkg/ssh/server/port" "github.com/spf13/cobra" ) @@ -32,7 +32,7 @@ func NewSSHServerCmd(flags *flags.GlobalFlags) *cobra.Command { } sshCmd.Flags(). - StringVar(&cmd.Address, "address", fmt.Sprintf("127.0.0.1:%d", helperssh.DefaultUserPort), "Address to listen to") + StringVar(&cmd.Address, "address", fmt.Sprintf("127.0.0.1:%d", sshserver.DefaultUserPort), "Address to listen to") sshCmd.Flags(). StringVar(&cmd.RemoteUser, "remote-user", "", "The remote user for this workspace") sshCmd.Flags(). @@ -42,7 +42,7 @@ func NewSSHServerCmd(flags *flags.GlobalFlags) *cobra.Command { // Run runs the command logic. func (cmd *SSHServerCmd) Run(_ *cobra.Command, _ []string) error { - server, err := helperssh.NewContainerServer(cmd.Address, cmd.Workdir) + server, err := sshserver.NewContainerServer(cmd.Address, cmd.Workdir) if err != nil { return err } diff --git a/cmd/agent/container/vscode_async.go b/cmd/internal/agentcontainer/vscode_async.go similarity index 98% rename from cmd/agent/container/vscode_async.go rename to cmd/internal/agentcontainer/vscode_async.go index 6795e70d9..9008cd826 100644 --- a/cmd/agent/container/vscode_async.go +++ b/cmd/internal/agentcontainer/vscode_async.go @@ -1,4 +1,4 @@ -package container +package agentcontainer import ( "encoding/json" diff --git a/cmd/agent/workspace/build.go b/cmd/internal/agentworkspace/build.go similarity index 99% rename from cmd/agent/workspace/build.go rename to cmd/internal/agentworkspace/build.go index 05bc52825..acd685e87 100644 --- a/cmd/agent/workspace/build.go +++ b/cmd/internal/agentworkspace/build.go @@ -1,4 +1,4 @@ -package workspace +package agentworkspace import ( "context" diff --git a/cmd/agent/workspace/clean.go b/cmd/internal/agentworkspace/clean.go similarity index 99% rename from cmd/agent/workspace/clean.go rename to cmd/internal/agentworkspace/clean.go index 10e2e9ada..7259c31d1 100644 --- a/cmd/agent/workspace/clean.go +++ b/cmd/internal/agentworkspace/clean.go @@ -1,4 +1,4 @@ -package workspace +package agentworkspace import ( "context" diff --git a/cmd/agent/workspace/clean_test.go b/cmd/internal/agentworkspace/clean_test.go similarity index 99% rename from cmd/agent/workspace/clean_test.go rename to cmd/internal/agentworkspace/clean_test.go index 70877bdb9..9ec8b9b5a 100644 --- a/cmd/agent/workspace/clean_test.go +++ b/cmd/internal/agentworkspace/clean_test.go @@ -1,4 +1,4 @@ -package workspace +package agentworkspace import ( "context" diff --git a/cmd/agent/workspace/delete.go b/cmd/internal/agentworkspace/delete.go similarity index 99% rename from cmd/agent/workspace/delete.go rename to cmd/internal/agentworkspace/delete.go index 23de15165..6f895dae0 100644 --- a/cmd/agent/workspace/delete.go +++ b/cmd/internal/agentworkspace/delete.go @@ -1,4 +1,4 @@ -package workspace +package agentworkspace import ( "context" diff --git a/cmd/agent/workspace/delete_test.go b/cmd/internal/agentworkspace/delete_test.go similarity index 99% rename from cmd/agent/workspace/delete_test.go rename to cmd/internal/agentworkspace/delete_test.go index be0fec0b3..6a7d63a57 100644 --- a/cmd/agent/workspace/delete_test.go +++ b/cmd/internal/agentworkspace/delete_test.go @@ -1,4 +1,4 @@ -package workspace +package agentworkspace import ( "os" diff --git a/cmd/agent/workspace/docker_darwin_test.go b/cmd/internal/agentworkspace/docker_darwin_test.go similarity index 98% rename from cmd/agent/workspace/docker_darwin_test.go rename to cmd/internal/agentworkspace/docker_darwin_test.go index 0f1519ab0..5a167bdbe 100644 --- a/cmd/agent/workspace/docker_darwin_test.go +++ b/cmd/internal/agentworkspace/docker_darwin_test.go @@ -1,6 +1,6 @@ //go:build darwin -package workspace +package agentworkspace import ( "os" diff --git a/cmd/agent/workspace/install_dotfiles.go b/cmd/internal/agentworkspace/install_dotfiles.go similarity index 99% rename from cmd/agent/workspace/install_dotfiles.go rename to cmd/internal/agentworkspace/install_dotfiles.go index fe5781514..171b5d0ad 100644 --- a/cmd/agent/workspace/install_dotfiles.go +++ b/cmd/internal/agentworkspace/install_dotfiles.go @@ -1,4 +1,4 @@ -package workspace +package agentworkspace import ( "context" diff --git a/cmd/agent/workspace/logs.go b/cmd/internal/agentworkspace/logs.go similarity index 98% rename from cmd/agent/workspace/logs.go rename to cmd/internal/agentworkspace/logs.go index 59f27c90c..1baa93036 100644 --- a/cmd/agent/workspace/logs.go +++ b/cmd/internal/agentworkspace/logs.go @@ -1,4 +1,4 @@ -package workspace +package agentworkspace import ( "context" diff --git a/cmd/agent/workspace/logs_daemon.go b/cmd/internal/agentworkspace/logs_daemon.go similarity index 98% rename from cmd/agent/workspace/logs_daemon.go rename to cmd/internal/agentworkspace/logs_daemon.go index 901a716f9..ef5cc5a67 100644 --- a/cmd/agent/workspace/logs_daemon.go +++ b/cmd/internal/agentworkspace/logs_daemon.go @@ -1,4 +1,4 @@ -package workspace +package agentworkspace import ( "context" diff --git a/cmd/agent/workspace/setup_gpg.go b/cmd/internal/agentworkspace/setup_gpg.go similarity index 99% rename from cmd/agent/workspace/setup_gpg.go rename to cmd/internal/agentworkspace/setup_gpg.go index b78f4de3f..76332e268 100644 --- a/cmd/agent/workspace/setup_gpg.go +++ b/cmd/internal/agentworkspace/setup_gpg.go @@ -1,4 +1,4 @@ -package workspace +package agentworkspace import ( "context" diff --git a/cmd/agent/workspace/status.go b/cmd/internal/agentworkspace/status.go similarity index 98% rename from cmd/agent/workspace/status.go rename to cmd/internal/agentworkspace/status.go index 743d186ef..6b0f2a732 100644 --- a/cmd/agent/workspace/status.go +++ b/cmd/internal/agentworkspace/status.go @@ -1,4 +1,4 @@ -package workspace +package agentworkspace import ( "context" diff --git a/cmd/agent/workspace/stop.go b/cmd/internal/agentworkspace/stop.go similarity index 98% rename from cmd/agent/workspace/stop.go rename to cmd/internal/agentworkspace/stop.go index 3056f4715..00686e3c0 100644 --- a/cmd/agent/workspace/stop.go +++ b/cmd/internal/agentworkspace/stop.go @@ -1,4 +1,4 @@ -package workspace +package agentworkspace import ( "context" diff --git a/cmd/agent/workspace/up.go b/cmd/internal/agentworkspace/up.go similarity index 99% rename from cmd/agent/workspace/up.go rename to cmd/internal/agentworkspace/up.go index 10e0b39ba..572328f5d 100644 --- a/cmd/agent/workspace/up.go +++ b/cmd/internal/agentworkspace/up.go @@ -1,4 +1,4 @@ -package workspace +package agentworkspace import ( "context" diff --git a/cmd/agent/workspace/update_config.go b/cmd/internal/agentworkspace/update_config.go similarity index 97% rename from cmd/agent/workspace/update_config.go rename to cmd/internal/agentworkspace/update_config.go index 485631aaa..8754a562c 100644 --- a/cmd/agent/workspace/update_config.go +++ b/cmd/internal/agentworkspace/update_config.go @@ -1,4 +1,4 @@ -package workspace +package agentworkspace import ( "context" diff --git a/cmd/agent/workspace/workspace.go b/cmd/internal/agentworkspace/workspace.go similarity index 97% rename from cmd/agent/workspace/workspace.go rename to cmd/internal/agentworkspace/workspace.go index dfdfe9261..a55ac5796 100644 --- a/cmd/agent/workspace/workspace.go +++ b/cmd/internal/agentworkspace/workspace.go @@ -1,4 +1,4 @@ -package workspace +package agentworkspace import ( "github.com/devsy-org/devsy/cmd/flags" diff --git a/cmd/helper/browser_tunnel.go b/cmd/internal/browser_tunnel.go similarity index 99% rename from cmd/helper/browser_tunnel.go rename to cmd/internal/browser_tunnel.go index 7185f8726..c9cf0c84e 100644 --- a/cmd/helper/browser_tunnel.go +++ b/cmd/internal/browser_tunnel.go @@ -1,4 +1,4 @@ -package helper +package cmdinternal import ( "context" diff --git a/cmd/helper/browser_tunnel_test.go b/cmd/internal/browser_tunnel_test.go similarity index 99% rename from cmd/helper/browser_tunnel_test.go rename to cmd/internal/browser_tunnel_test.go index 527305f31..d0a5ed1e1 100644 --- a/cmd/helper/browser_tunnel_test.go +++ b/cmd/internal/browser_tunnel_test.go @@ -1,4 +1,4 @@ -package helper +package cmdinternal import ( "strings" diff --git a/cmd/helper/check_provider_update.go b/cmd/internal/check_provider_update.go similarity index 99% rename from cmd/helper/check_provider_update.go rename to cmd/internal/check_provider_update.go index f6ea1f45c..8a92841ee 100644 --- a/cmd/helper/check_provider_update.go +++ b/cmd/internal/check_provider_update.go @@ -1,4 +1,4 @@ -package helper +package cmdinternal import ( "bytes" diff --git a/cmd/agent/container_tunnel.go b/cmd/internal/container_tunnel.go similarity index 94% rename from cmd/agent/container_tunnel.go rename to cmd/internal/container_tunnel.go index 3e71d0a5e..20f5d8c63 100644 --- a/cmd/agent/container_tunnel.go +++ b/cmd/internal/container_tunnel.go @@ -1,4 +1,4 @@ -package agent +package cmdinternal import ( "bytes" @@ -8,8 +8,8 @@ import ( "os/signal" "syscall" - "github.com/devsy-org/devsy/cmd/agent/workspace" "github.com/devsy-org/devsy/cmd/flags" + "github.com/devsy-org/devsy/cmd/internal/agentworkspace" "github.com/devsy-org/devsy/pkg/agent" pkgconfig "github.com/devsy-org/devsy/pkg/config" "github.com/devsy-org/devsy/pkg/devcontainer" @@ -61,13 +61,13 @@ func (cmd *ContainerTunnelCmd) Run(ctx context.Context) error { } // make sure content folder exists - _, err = workspace.InitContentFolder(workspaceInfo) + _, err = agentworkspace.InitContentFolder(workspaceInfo) if err != nil { return err } // create runner - runner, err := workspace.CreateRunner(workspaceInfo) + runner, err := agentworkspace.CreateRunner(workspaceInfo) if err != nil { return err } diff --git a/cmd/helper/fleet_helper.go b/cmd/internal/fleet_server.go similarity index 98% rename from cmd/helper/fleet_helper.go rename to cmd/internal/fleet_server.go index 29b26b2a4..d390928ef 100644 --- a/cmd/helper/fleet_helper.go +++ b/cmd/internal/fleet_server.go @@ -1,4 +1,4 @@ -package helper +package cmdinternal import ( "os" diff --git a/cmd/helper/json/get.go b/cmd/internal/get.go similarity index 99% rename from cmd/helper/json/get.go rename to cmd/internal/get.go index f6e500ab9..f988854d8 100644 --- a/cmd/helper/json/get.go +++ b/cmd/internal/get.go @@ -1,4 +1,4 @@ -package json +package cmdinternal import ( "context" diff --git a/cmd/helper/get_image.go b/cmd/internal/get_image.go similarity index 97% rename from cmd/helper/get_image.go rename to cmd/internal/get_image.go index 160387b83..e4580edd9 100644 --- a/cmd/helper/get_image.go +++ b/cmd/internal/get_image.go @@ -1,4 +1,4 @@ -package helper +package cmdinternal import ( "context" diff --git a/cmd/helper/get_image_platforms.go b/cmd/internal/get_image_platforms.go similarity index 98% rename from cmd/helper/get_image_platforms.go rename to cmd/internal/get_image_platforms.go index 7ef48fed4..96f4c4851 100644 --- a/cmd/helper/get_image_platforms.go +++ b/cmd/internal/get_image_platforms.go @@ -1,4 +1,4 @@ -package helper +package cmdinternal import ( "context" diff --git a/cmd/helper/get_provider_name.go b/cmd/internal/get_provider_name.go similarity index 98% rename from cmd/helper/get_provider_name.go rename to cmd/internal/get_provider_name.go index e36ab0fd7..7006914b6 100644 --- a/cmd/helper/get_provider_name.go +++ b/cmd/internal/get_provider_name.go @@ -1,4 +1,4 @@ -package helper +package cmdinternal import ( "bytes" diff --git a/cmd/helper/get_workspace_config.go b/cmd/internal/get_workspace_config.go similarity index 99% rename from cmd/helper/get_workspace_config.go rename to cmd/internal/get_workspace_config.go index f36b4f9d2..eb9875abe 100644 --- a/cmd/helper/get_workspace_config.go +++ b/cmd/internal/get_workspace_config.go @@ -1,4 +1,4 @@ -package helper +package cmdinternal import ( "context" diff --git a/cmd/helper/get_workspace_name.go b/cmd/internal/get_workspace_name.go similarity index 97% rename from cmd/helper/get_workspace_name.go rename to cmd/internal/get_workspace_name.go index c1f5251b6..e8c6336e6 100644 --- a/cmd/helper/get_workspace_name.go +++ b/cmd/internal/get_workspace_name.go @@ -1,4 +1,4 @@ -package helper +package cmdinternal import ( "context" diff --git a/cmd/helper/get_workspace_uid.go b/cmd/internal/get_workspace_uid.go similarity index 97% rename from cmd/helper/get_workspace_uid.go rename to cmd/internal/get_workspace_uid.go index 66c109a66..77ba08192 100644 --- a/cmd/helper/get_workspace_uid.go +++ b/cmd/internal/get_workspace_uid.go @@ -1,4 +1,4 @@ -package helper +package cmdinternal import ( "context" diff --git a/cmd/agent/git_credentials.go b/cmd/internal/git_credentials.go similarity index 94% rename from cmd/agent/git_credentials.go rename to cmd/internal/git_credentials.go index a8b365e0c..fafa6e0ee 100644 --- a/cmd/agent/git_credentials.go +++ b/cmd/internal/git_credentials.go @@ -1,4 +1,4 @@ -package agent +package cmdinternal import ( "bytes" @@ -12,8 +12,8 @@ import ( "path/filepath" "strconv" - "github.com/devsy-org/devsy/cmd/agent/container" "github.com/devsy-org/devsy/cmd/flags" + "github.com/devsy-org/devsy/cmd/internal/agentcontainer" "github.com/devsy-org/devsy/pkg/gitcredentials" devsyhttp "github.com/devsy-org/devsy/pkg/http" "github.com/devsy-org/devsy/pkg/ts" @@ -80,7 +80,7 @@ func (cmd *GitCredentialsCmd) Run(ctx context.Context, args []string) error { func getCredentialsFromWorkspaceServer( credentials *gitcredentials.GitCredentials, ) *gitcredentials.GitCredentials { - if _, err := os.Stat(filepath.Join(container.RootDir, ts.RunnerProxySocket)); err != nil { + if _, err := os.Stat(filepath.Join(agentcontainer.RootDir, ts.RunnerProxySocket)); err != nil { // workspace server is not running return nil } @@ -88,7 +88,7 @@ func getCredentialsFromWorkspaceServer( httpClient := &http.Client{ Transport: &http.Transport{ DialContext: func(_ context.Context, _, _ string) (net.Conn, error) { - return net.Dial("unix", filepath.Join(container.RootDir, ts.RunnerProxySocket)) + return net.Dial("unix", filepath.Join(agentcontainer.RootDir, ts.RunnerProxySocket)) }, }, } diff --git a/cmd/agent/git_ssh_signature.go b/cmd/internal/git_ssh_signature.go similarity index 75% rename from cmd/agent/git_ssh_signature.go rename to cmd/internal/git_ssh_signature.go index aa7f06804..06b69f2dd 100644 --- a/cmd/agent/git_ssh_signature.go +++ b/cmd/internal/git_ssh_signature.go @@ -1,9 +1,10 @@ -package agent +package cmdinternal import ( "fmt" "os" "os/exec" + "os/user" "strings" "github.com/devsy-org/devsy/cmd/flags" @@ -136,3 +137,52 @@ func delegateToSSHKeygen(args []string) error { return c.Run() } + +type GitSSHSignatureHelperCmd struct { + *flags.GlobalFlags + + CertPath string +} + +// NewGitSSHSignatureHelperCmd creates a new git-ssh-signature-helper command +// This agent command can be used to inject the Git SSH signature helper. +// +// This command is used to set up the environment for Git SSH signature verification by configuring +// the necessary helper using a provided signing key path. +// +// Example usage: +// +// git-ssh-signature-helper [signing-key-path] +// +// The signing key path is a required argument for this command. It should be what equal to what you +// would have set as user.signingkey git config. +func NewGitSSHSignatureHelperCmd(flags *flags.GlobalFlags) *cobra.Command { + cmd := &GitSSHSignatureHelperCmd{ + GlobalFlags: flags, + } + + gitSshSignatureHelperCmd := &cobra.Command{ + Use: "git-ssh-signature-helper [signing-key-path]", + Short: "used to inject git ssh signature helper", + RunE: func(_ *cobra.Command, args []string) error { + usr, err := user.Current() + if err != nil { + return err + } + + if len(args) < 1 { + return fmt.Errorf("gitSigningKey argument is required") + } + cmd.CertPath = args[0] + + err = gitsshsigning.ConfigureHelper(usr.Username, cmd.CertPath) + if err != nil { + return err + } + + return nil + }, + } + + return gitSshSignatureHelperCmd +} diff --git a/cmd/agent/git_ssh_signature_test.go b/cmd/internal/git_ssh_signature_test.go similarity index 99% rename from cmd/agent/git_ssh_signature_test.go rename to cmd/internal/git_ssh_signature_test.go index 6504c07e6..dbc2f563b 100644 --- a/cmd/agent/git_ssh_signature_test.go +++ b/cmd/internal/git_ssh_signature_test.go @@ -1,4 +1,4 @@ -package agent +package cmdinternal import ( "testing" diff --git a/cmd/helper/http/http.go b/cmd/internal/http.go similarity index 94% rename from cmd/helper/http/http.go rename to cmd/internal/http.go index c5924a597..ca0e3a5d4 100644 --- a/cmd/helper/http/http.go +++ b/cmd/internal/http.go @@ -1,4 +1,4 @@ -package http +package cmdinternal import ( "github.com/devsy-org/devsy/cmd/flags" diff --git a/cmd/internal/internal.go b/cmd/internal/internal.go index b667b79eb..08c95187a 100644 --- a/cmd/internal/internal.go +++ b/cmd/internal/internal.go @@ -1,26 +1,51 @@ package cmdinternal import ( - "github.com/devsy-org/devsy/cmd/agent" "github.com/devsy-org/devsy/cmd/flags" - "github.com/devsy-org/devsy/cmd/helper" "github.com/spf13/cobra" ) // NewInternalCmd is the hidden parent for plumbing commands invoked by other -// processes (the daemon, the desktop app, container init scripts). -// Subcommands here are not part of the user-facing CLI contract. +// processes (the daemon, the desktop app, container init scripts), not part of +// the user-facing CLI contract. func NewInternalCmd(globalFlags *flags.GlobalFlags) *cobra.Command { cmd := &cobra.Command{ Use: "internal", - Short: "Internal plumbing commands (not for direct use)", + Short: "internal commands", Hidden: true, } - cmd.AddCommand(agent.NewAgentCmd(globalFlags)) - cmd.AddCommand(helper.NewHelperCmd(globalFlags)) + cmd.AddCommand(NewAgentCmd(globalFlags)) cmd.AddCommand(NewDaemonLocalCmd(globalFlags)) cmd.AddCommand(NewLogsDaemonCmd(globalFlags)) cmd.AddCommand(NewRunUserCommandsCmd(globalFlags)) cmd.AddCommand(NewRunUserCommandsCmdAlias(globalFlags)) + + // Utility plumbing commands. The agentPreRunE hook is attached per-command + // (not on the `internal` parent) so the daemon-local/logs-daemon/ + // run-user-commands children keep inheriting the root command's + // PersistentPreRunE instead. + preRun := agentPreRunE(globalFlags) + withPreRun := func(c *cobra.Command) *cobra.Command { + c.PersistentPreRunE = preRun + return c + } + cmd.AddCommand(withPreRun(NewHTTPCmd(globalFlags))) + cmd.AddCommand(withPreRun(NewJSONCmd(globalFlags))) + cmd.AddCommand(withPreRun(NewStringsCmd(globalFlags))) + cmd.AddCommand(withPreRun(NewSSHServerCmd(globalFlags))) + cmd.AddCommand(withPreRun(NewGetWorkspaceNameCmd(globalFlags))) + cmd.AddCommand(withPreRun(NewGetWorkspaceUIDCmd(globalFlags))) + cmd.AddCommand(withPreRun(NewGetWorkspaceConfigCommand(globalFlags))) + cmd.AddCommand(withPreRun(NewGetProviderNameCmd(globalFlags))) + cmd.AddCommand(withPreRun(NewCheckProviderUpdateCmd(globalFlags))) + cmd.AddCommand(withPreRun(NewSSHClientCmd())) + cmd.AddCommand(withPreRun(NewShellCmd())) + cmd.AddCommand(withPreRun(NewSSHGitCloneCmd())) + cmd.AddCommand(withPreRun(NewFleetServerCmd(globalFlags))) + cmd.AddCommand(withPreRun(NewDockerCredentialsHelperCmd(globalFlags))) + cmd.AddCommand(withPreRun(NewGetImageCmd(globalFlags))) + cmd.AddCommand(withPreRun(NewGetImagePlatformsCmd(globalFlags))) + cmd.AddCommand(withPreRun(NewBrowserTunnelCmd(globalFlags))) + return cmd } diff --git a/cmd/helper/json/json.go b/cmd/internal/json.go similarity index 94% rename from cmd/helper/json/json.go rename to cmd/internal/json.go index a7a82b063..f15bec7ee 100644 --- a/cmd/helper/json/json.go +++ b/cmd/internal/json.go @@ -1,4 +1,4 @@ -package json +package cmdinternal import ( "github.com/devsy-org/devsy/cmd/flags" diff --git a/cmd/helper/http/request.go b/cmd/internal/request.go similarity index 99% rename from cmd/helper/http/request.go rename to cmd/internal/request.go index 481dd1c61..ee5cc72ec 100644 --- a/cmd/helper/http/request.go +++ b/cmd/internal/request.go @@ -1,4 +1,4 @@ -package http +package cmdinternal import ( "context" diff --git a/cmd/helper/docker_credentials.go b/cmd/internal/setup_docker_credentials.go similarity index 97% rename from cmd/helper/docker_credentials.go rename to cmd/internal/setup_docker_credentials.go index f2ff84f88..701c072bc 100644 --- a/cmd/helper/docker_credentials.go +++ b/cmd/internal/setup_docker_credentials.go @@ -1,4 +1,4 @@ -package helper +package cmdinternal import ( "fmt" diff --git a/cmd/helper/sh.go b/cmd/internal/sh.go similarity index 98% rename from cmd/helper/sh.go rename to cmd/internal/sh.go index 4e1852469..9f612bbae 100644 --- a/cmd/helper/sh.go +++ b/cmd/internal/sh.go @@ -1,4 +1,4 @@ -package helper +package cmdinternal import ( "context" diff --git a/cmd/helper/ssh_client.go b/cmd/internal/ssh_client.go similarity index 99% rename from cmd/helper/ssh_client.go rename to cmd/internal/ssh_client.go index e4f515fb5..601f09b14 100644 --- a/cmd/helper/ssh_client.go +++ b/cmd/internal/ssh_client.go @@ -1,4 +1,4 @@ -package helper +package cmdinternal import ( "context" diff --git a/cmd/helper/ssh_git_clone.go b/cmd/internal/ssh_git_clone.go similarity index 99% rename from cmd/helper/ssh_git_clone.go rename to cmd/internal/ssh_git_clone.go index 0bdb9b7bf..0d14156e0 100644 --- a/cmd/helper/ssh_git_clone.go +++ b/cmd/internal/ssh_git_clone.go @@ -1,4 +1,4 @@ -package helper +package cmdinternal import ( "context" diff --git a/cmd/helper/ssh_server.go b/cmd/internal/ssh_server.go similarity index 94% rename from cmd/helper/ssh_server.go rename to cmd/internal/ssh_server.go index 4ed079a04..5483ad7f7 100644 --- a/cmd/helper/ssh_server.go +++ b/cmd/internal/ssh_server.go @@ -1,4 +1,4 @@ -package helper +package cmdinternal import ( "encoding/base64" @@ -9,7 +9,7 @@ import ( "github.com/devsy-org/devsy/cmd/flags" "github.com/devsy-org/devsy/pkg/agent" "github.com/devsy-org/devsy/pkg/log" - helperssh "github.com/devsy-org/devsy/pkg/ssh/server" + sshserver "github.com/devsy-org/devsy/pkg/ssh/server" "github.com/devsy-org/devsy/pkg/ssh/server/port" "github.com/devsy-org/devsy/pkg/stdio" "github.com/devsy-org/devsy/pkg/token" @@ -42,7 +42,7 @@ func NewSSHServerCmd(flags *flags.GlobalFlags) *cobra.Command { } sshCmd.Flags(). - StringVar(&cmd.Address, "address", fmt.Sprintf("0.0.0.0:%d", helperssh.DefaultPort), "Address to listen to") + StringVar(&cmd.Address, "address", fmt.Sprintf("0.0.0.0:%d", sshserver.DefaultPort), "Address to listen to") sshCmd.Flags(). BoolVar(&cmd.Stdio, "stdio", false, "Will listen on stdout and stdin instead of an address") sshCmd.Flags(). @@ -103,10 +103,10 @@ func (cmd *SSHServerCmd) Run(_ *cobra.Command, _ []string) error { // SSH cleanup could run. Liveness is decided via a per-directory flock // the owning process holds for its lifetime; the kernel releases the // flock on any process exit (including SIGKILL). - helperssh.SweepStaleAgentSockets() + sshserver.SweepStaleAgentSockets() // start the server - server, err := helperssh.NewServer( + server, err := sshserver.NewServer( cmd.Address, hostKey, keys, diff --git a/cmd/helper/strings/strings.go b/cmd/internal/strings.go similarity index 94% rename from cmd/helper/strings/strings.go rename to cmd/internal/strings.go index 1f31b2ab3..951615a05 100644 --- a/cmd/helper/strings/strings.go +++ b/cmd/internal/strings.go @@ -1,4 +1,4 @@ -package strings +package cmdinternal import ( "github.com/devsy-org/devsy/cmd/flags" diff --git a/cmd/machine/ssh.go b/cmd/machine/ssh.go index 3d6c9bf05..29a9b9e23 100644 --- a/cmd/machine/ssh.go +++ b/cmd/machine/ssh.go @@ -141,7 +141,7 @@ func (cmd *SSHCmd) Run(ctx context.Context, args []string) error { }, Exec: func(ctx context.Context, stdin io.Reader, stdout io.Writer, stderr io.Writer) error { command := fmt.Sprintf( - "'%s' internal helper ssh-server --stdio", + "'%s' internal ssh-server --stdio", machineClient.AgentPath(), ) if cmd.Debug { diff --git a/cmd/pro/check_update.go b/cmd/pro/check_update.go index baa3dca06..848dda7c1 100644 --- a/cmd/pro/check_update.go +++ b/cmd/pro/check_update.go @@ -5,7 +5,7 @@ import ( "encoding/json" "fmt" - "github.com/devsy-org/devsy/cmd/agent" + cmdinternal "github.com/devsy-org/devsy/cmd/internal" "github.com/devsy-org/devsy/cmd/pro/flags" "github.com/devsy-org/devsy/cmd/pro/proutil" "github.com/devsy-org/devsy/pkg/config" @@ -55,7 +55,7 @@ func NewCheckUpdateCmd(globalFlags *flags.GlobalFlags) *cobra.Command { root.Annotations = map[string]string{} } // Don't print debug message - root.Annotations[agent.AgentExecutedAnnotation] = "true" + root.Annotations[cmdinternal.AgentExecutedAnnotation] = "true" //nolint:goconst }, } diff --git a/cmd/pro/daemon/netcheck.go b/cmd/pro/daemon/netcheck.go index 14bb353b0..6e308a8ec 100644 --- a/cmd/pro/daemon/netcheck.go +++ b/cmd/pro/daemon/netcheck.go @@ -5,7 +5,7 @@ import ( "fmt" "strconv" - "github.com/devsy-org/devsy/cmd/agent" + cmdinternal "github.com/devsy-org/devsy/cmd/internal" "github.com/devsy-org/devsy/cmd/pro/completion" proflags "github.com/devsy-org/devsy/cmd/pro/flags" "github.com/devsy-org/devsy/cmd/pro/proutil" @@ -54,7 +54,7 @@ func NewNetcheckCmd(flags *proflags.GlobalFlags) *cobra.Command { root.Annotations = map[string]string{} } // Don't print debug message - root.Annotations[agent.AgentExecutedAnnotation] = "true" + root.Annotations[cmdinternal.AgentExecutedAnnotation] = "true" }, } diff --git a/cmd/pro/daemon/status.go b/cmd/pro/daemon/status.go index e56f5e69b..11641da13 100644 --- a/cmd/pro/daemon/status.go +++ b/cmd/pro/daemon/status.go @@ -5,7 +5,7 @@ import ( "encoding/json" "fmt" - "github.com/devsy-org/devsy/cmd/agent" + cmdinternal "github.com/devsy-org/devsy/cmd/internal" "github.com/devsy-org/devsy/cmd/pro/completion" proflags "github.com/devsy-org/devsy/cmd/pro/flags" "github.com/devsy-org/devsy/cmd/pro/proutil" @@ -52,7 +52,7 @@ func NewStatusCmd(flags *proflags.GlobalFlags) *cobra.Command { root.Annotations = map[string]string{} } // Don't print debug message - root.Annotations[agent.AgentExecutedAnnotation] = "true" + root.Annotations[cmdinternal.AgentExecutedAnnotation] = "true" }, } diff --git a/cmd/pro/health.go b/cmd/pro/health.go index 4ed3bc593..7a1899aa0 100644 --- a/cmd/pro/health.go +++ b/cmd/pro/health.go @@ -5,7 +5,7 @@ import ( "context" "fmt" - "github.com/devsy-org/devsy/cmd/agent" + cmdinternal "github.com/devsy-org/devsy/cmd/internal" "github.com/devsy-org/devsy/cmd/pro/flags" "github.com/devsy-org/devsy/cmd/pro/proutil" "github.com/devsy-org/devsy/pkg/client/clientimplementation" @@ -57,7 +57,7 @@ func NewHealthCmd(globalFlags *flags.GlobalFlags) *cobra.Command { root.Annotations = map[string]string{} } // Don't print debug message - root.Annotations[agent.AgentExecutedAnnotation] = "true" + root.Annotations[cmdinternal.AgentExecutedAnnotation] = "true" //nolint:goconst }, } diff --git a/cmd/pro/provider/provider.go b/cmd/pro/provider/provider.go index 6f901659b..d20241c33 100644 --- a/cmd/pro/provider/provider.go +++ b/cmd/pro/provider/provider.go @@ -3,7 +3,7 @@ package provider import ( "os" - "github.com/devsy-org/devsy/cmd/agent" + cmdinternal "github.com/devsy-org/devsy/cmd/internal" "github.com/devsy-org/devsy/cmd/pro/flags" "github.com/devsy-org/devsy/cmd/pro/provider/create" "github.com/devsy-org/devsy/cmd/pro/provider/get" @@ -34,7 +34,7 @@ func NewProProviderCmd(globalFlags *flags.GlobalFlags) *cobra.Command { } // Disable debug hints if we execute pro commands from Devsy Desktop - // We're reusing the agent.AgentExecutedAnnotation for simplicity, could rename in the future + // We're reusing the cmdinternal.AgentExecutedAnnotation for simplicity, could rename in the future if os.Getenv(config.EnvUI) == config.BoolTrue { cmd.VisitParents(func(c *cobra.Command) { // find the root command @@ -42,7 +42,7 @@ func NewProProviderCmd(globalFlags *flags.GlobalFlags) *cobra.Command { if c.Annotations == nil { c.Annotations = map[string]string{} } - c.Annotations[agent.AgentExecutedAnnotation] = config.BoolTrue + c.Annotations[cmdinternal.AgentExecutedAnnotation] = config.BoolTrue } }) } diff --git a/cmd/workspace/logs.go b/cmd/workspace/logs.go index 3b37fba17..09a2f7462 100644 --- a/cmd/workspace/logs.go +++ b/cmd/workspace/logs.go @@ -72,7 +72,7 @@ func (cmd *LogsCmd) Run(ctx context.Context, args []string) error { return fmt.Errorf("this command is not supported for proxy providers") } - sshServerCmd := fmt.Sprintf("'%s' internal helper ssh-server --stdio", client.AgentPath()) + sshServerCmd := fmt.Sprintf("'%s' internal ssh-server --stdio", client.AgentPath()) if log.DebugEnabled() { sshServerCmd += " --debug" } diff --git a/cmd/workspace/ssh.go b/cmd/workspace/ssh.go index 731a6871e..9f310a94b 100644 --- a/cmd/workspace/ssh.go +++ b/cmd/workspace/ssh.go @@ -545,7 +545,6 @@ func (cmd *SSHCmd) startTunnel( commandArgs := []string{ agent.ContainerDevsyHelperLocation, "internal", - "helper", "ssh-server", "--track-activity", "--stdio", @@ -676,7 +675,7 @@ func (cmd *SSHCmd) startServices( } // setupGPGAgent will forward a local gpg-agent into the remote container -// this works by using cmd/agent/workspace/setup_gpg. +// this works by using cmd/internal/agentworkspace/setup_gpg. func (cmd *SSHCmd) setupGPGAgent( ctx context.Context, containerClient *ssh.Client, diff --git a/cmd/workspace/up/agent.go b/cmd/workspace/up/agent.go index c8a1dd035..e94d157c3 100644 --- a/cmd/workspace/up/agent.go +++ b/cmd/workspace/up/agent.go @@ -197,7 +197,7 @@ func (cmd *UpCmd) devsyUpMachineSSH( return nil, fmt.Errorf("get agent info: %w", err) } - sshTunnelCmd := fmt.Sprintf("'%s' internal helper ssh-server --stdio", client.AgentPath()) + sshTunnelCmd := fmt.Sprintf("'%s' internal ssh-server --stdio", client.AgentPath()) if log.DebugEnabled() { sshTunnelCmd += " --debug" //nolint:goconst } diff --git a/desktop/src/main/ipc.ts b/desktop/src/main/ipc.ts index 0bcac6992..178e5194d 100644 --- a/desktop/src/main/ipc.ts +++ b/desktop/src/main/ipc.ts @@ -1022,7 +1022,7 @@ export function registerIpcHandlers(deps: IpcDependencies): { "image_inspect_platforms", async (_event, args: { ref: string }) => { const result = await cli.run<{ platforms: string[] }>([ - "helper", + "internal", "get-image-platforms", args.ref, ]) diff --git a/docs/uml/up_sequence.puml b/docs/uml/up_sequence.puml index 90b4548f4..a7082fa24 100644 --- a/docs/uml/up_sequence.puml +++ b/docs/uml/up_sequence.puml @@ -35,7 +35,7 @@ alt image not already available deactivate Agent end -Devsy -> Agent: devsy helper ssh-server --stdio +Devsy -> Agent: devsy internal ssh-server --stdio activate Agent Devsy -> Agent: devsy agent daemon Devsy -> Agent: devsy agent workspace up --workspace-info @@ -43,7 +43,7 @@ Devsy -> Agent: devsy agent workspace up --workspace-info Agent -> ContainerRuntime: run dev container ContainerRuntime --> Agent: container id -Agent -> ContainerAgent: devsy helper ssh-server --stdio +Agent -> ContainerAgent: devsy internal ssh-server --stdio activate ContainerAgent Agent -> ContainerAgent: devsy agent container setup diff --git a/e2e/tests/machineprovider/testdata/machineprovider/provider.yaml b/e2e/tests/machineprovider/testdata/machineprovider/provider.yaml index 59d72eb4e..3fba813a5 100644 --- a/e2e/tests/machineprovider/testdata/machineprovider/provider.yaml +++ b/e2e/tests/machineprovider/testdata/machineprovider/provider.yaml @@ -31,4 +31,4 @@ exec: cat ${LOCATION}/${MACHINE_ID}/status.txt 2>/dev/null || echo "NOTFOUND" command: |- - "${DEVSY}" internal helper sh -c "${COMMAND}" + "${DEVSY}" internal sh -c "${COMMAND}" diff --git a/e2e/tests/machineprovider/testdata/machineprovider2/provider.yaml b/e2e/tests/machineprovider/testdata/machineprovider2/provider.yaml index 7da1205a0..2e0c50805 100644 --- a/e2e/tests/machineprovider/testdata/machineprovider2/provider.yaml +++ b/e2e/tests/machineprovider/testdata/machineprovider2/provider.yaml @@ -24,7 +24,7 @@ exec: docker start devsy-${MACHINE_ID} sleep 5 status: |- - STATUS=$(docker inspect devsy-${MACHINE_ID} 2>/dev/null | ${DEVSY} internal helper json get "[0].State.Status" || true) + STATUS=$(docker inspect devsy-${MACHINE_ID} 2>/dev/null | ${DEVSY} internal json get "[0].State.Status" || true) if [ -z $STATUS ]; then echo "NOTFOUND" else diff --git a/e2e/tests/machineprovider/testdata/machineprovider3/provider.yaml b/e2e/tests/machineprovider/testdata/machineprovider3/provider.yaml index c918c1a39..1b14a88b7 100644 --- a/e2e/tests/machineprovider/testdata/machineprovider3/provider.yaml +++ b/e2e/tests/machineprovider/testdata/machineprovider3/provider.yaml @@ -24,7 +24,7 @@ exec: docker start devsy-${MACHINE_ID} sleep 5 status: |- - STATUS=$(docker inspect devsy-${MACHINE_ID} 2>/dev/null | ${DEVSY} internal helper json get "[0].State.Status" || true) + STATUS=$(docker inspect devsy-${MACHINE_ID} 2>/dev/null | ${DEVSY} internal json get "[0].State.Status" || true) if [ -z $STATUS ]; then echo "NOTFOUND" else diff --git a/e2e/tests/tunnel/testdata/tunnel/provider.yaml b/e2e/tests/tunnel/testdata/tunnel/provider.yaml index c8cf5a163..ba2b194eb 100644 --- a/e2e/tests/tunnel/testdata/tunnel/provider.yaml +++ b/e2e/tests/tunnel/testdata/tunnel/provider.yaml @@ -24,7 +24,7 @@ exec: docker start devsy-${MACHINE_ID} sleep 5 status: |- - STATUS=$(docker inspect devsy-${MACHINE_ID} 2>/dev/null | ${DEVSY} internal helper json get "[0].State.Status" || true) + STATUS=$(docker inspect devsy-${MACHINE_ID} 2>/dev/null | ${DEVSY} internal json get "[0].State.Status" || true) if [ -z $STATUS ]; then echo "NOTFOUND" else diff --git a/pkg/agent/agent.go b/pkg/agent/agent.go index e55201e4a..6f5263417 100644 --- a/pkg/agent/agent.go +++ b/pkg/agent/agent.go @@ -500,7 +500,7 @@ func Tunnel( } // build command - command := fmt.Sprintf("'%s' internal helper ssh-server --stdio", ContainerDevsyHelperLocation) + command := fmt.Sprintf("'%s' internal ssh-server --stdio", ContainerDevsyHelperLocation) if log.DebugEnabled() { command += " --debug" } diff --git a/pkg/agent/workspace.go b/pkg/agent/workspace.go index 8984bf14a..630265792 100644 --- a/pkg/agent/workspace.go +++ b/pkg/agent/workspace.go @@ -602,7 +602,7 @@ func setupSSHKey(keys []string, agentPath string) ([]string, func(), error) { } env := []string{"GIT_TERMINAL_PROMPT=0"} - gitSSHCmd := []string{agentPath, "internal", "helper", "ssh-git-clone"} + gitSSHCmd := []string{agentPath, "internal", "ssh-git-clone"} for _, keyFile := range keyFiles { gitSSHCmd = append(gitSSHCmd, "--key-file="+keyFile) } diff --git a/pkg/devcontainer/setup.go b/pkg/devcontainer/setup.go index 571f8033d..f388514a9 100644 --- a/pkg/devcontainer/setup.go +++ b/pkg/devcontainer/setup.go @@ -376,7 +376,7 @@ func (r *runner) executeSetup( func (r *runner) buildSSHTunnelCommand() string { args := []string{ shellescape.Quote(agent.ContainerDevsyHelperLocation), - "internal", "helper", "ssh-server", "--stdio", + "internal", "ssh-server", "--stdio", } if ide.ReusesAuthSock(r.WorkspaceConfig.Workspace.IDE.Name) { diff --git a/pkg/ide/fleet/fleet.go b/pkg/ide/fleet/fleet.go index 8759a5a42..950031952 100644 --- a/pkg/ide/fleet/fleet.go +++ b/pkg/ide/fleet/fleet.go @@ -212,7 +212,7 @@ func (o *FleetServer) startMonitor() error { return command.StartBackgroundOnce("fleet-monitor", func() (*exec.Cmd, error) { log.Infof("starting fleet monitor in background") - runCommand := fmt.Sprintf("%s internal helper fleet-server --workspaceid %s", self, "test") + runCommand := fmt.Sprintf("%s internal fleet-server --workspaceid %s", self, "test") args := []string{} if o.userName != "" { args = append(args, "su", o.userName, "-c", runCommand) diff --git a/pkg/ide/opener/browser_tunnel.go b/pkg/ide/opener/browser_tunnel.go index 2daafcd1f..c470aa782 100644 --- a/pkg/ide/opener/browser_tunnel.go +++ b/pkg/ide/opener/browser_tunnel.go @@ -160,7 +160,7 @@ type browserIDEInvocation struct { OpenBrowser bool // whether to launch a host browser pointing at TargetURL } -// startDetachedBrowserTunnel spawns `devsy internal helper browser-tunnel ...` as a +// startDetachedBrowserTunnel spawns `devsy internal browser-tunnel ...` as a // detached background process so the CLI can return to the prompt while the // tunnel remains running. // @@ -373,7 +373,7 @@ func buildHelperArgs( openBrowser bool, ) []string { args := []string{ - "internal", "helper", "browser-tunnel", + "internal", "browser-tunnel", "--context", contextName, "--workspace", workspaceID, "--target-url", tunnelParams.TargetURL, diff --git a/pkg/ide/opener/browser_tunnel_test.go b/pkg/ide/opener/browser_tunnel_test.go index 6b6b0d937..46c86c6b6 100644 --- a/pkg/ide/opener/browser_tunnel_test.go +++ b/pkg/ide/opener/browser_tunnel_test.go @@ -38,9 +38,8 @@ func TestBuildHelperArgs_Basic(t *testing.T) { GitSSHSigningKey: "", }, false) - if len(args) < 3 || args[0] != "internal" || args[1] != "helper" || - args[2] != "browser-tunnel" { - t.Fatalf("expected args to start with [internal helper browser-tunnel], got %v", args) + if len(args) < 2 || args[0] != "internal" || args[1] != "browser-tunnel" { + t.Fatalf("expected args to start with [internal browser-tunnel], got %v", args) } checkPairs := []struct { diff --git a/pkg/shell/shell.go b/pkg/shell/shell.go index b0b7ddef4..6c81071e1 100644 --- a/pkg/shell/shell.go +++ b/pkg/shell/shell.go @@ -149,7 +149,7 @@ func GetShell(userName string) ([]string, error) { return nil, err } - return []string{executable, "internal", "helper", "sh"}, nil + return []string{executable, "internal", "sh"}, nil } func getUserShell(userName string) (string, error) { diff --git a/pkg/tunnel/container.go b/pkg/tunnel/container.go index eba48af28..65a0d39d1 100644 --- a/pkg/tunnel/container.go +++ b/pkg/tunnel/container.go @@ -95,7 +95,7 @@ func (c *ContainerTunnel) runHostTunnel( defer func() { _ = writer.Close() }() defer log.Debugf("Tunnel to host closed") - command := fmt.Sprintf("'%s' internal helper ssh-server --stdio", c.client.AgentPath()) + command := fmt.Sprintf("'%s' internal ssh-server --stdio", c.client.AgentPath()) if log.DebugEnabled() { command += " --debug" } diff --git a/providers/docker/provider.yaml b/providers/docker/provider.yaml index fc6d1d267..90037881a 100644 --- a/providers/docker/provider.yaml +++ b/providers/docker/provider.yaml @@ -34,4 +34,4 @@ agent: DOCKER_HOST: ${DOCKER_HOST} exec: command: |- - "${DEVSY}" internal helper sh -c "${COMMAND}" + "${DEVSY}" internal sh -c "${COMMAND}" diff --git a/providers/kubernetes/provider.yaml b/providers/kubernetes/provider.yaml index ddad09cf3..be120bd83 100644 --- a/providers/kubernetes/provider.yaml +++ b/providers/kubernetes/provider.yaml @@ -131,4 +131,4 @@ agent: strictSecurity: ${STRICT_SECURITY} exec: command: |- - "${DEVSY}" internal helper sh -c "${COMMAND}" + "${DEVSY}" internal sh -c "${COMMAND}" diff --git a/providers/podman/provider.yaml b/providers/podman/provider.yaml index a39f290b9..f8533ffaa 100644 --- a/providers/podman/provider.yaml +++ b/providers/podman/provider.yaml @@ -30,4 +30,4 @@ agent: DOCKER_HOST: ${PODMAN_HOST} exec: command: |- - "${DEVSY}" internal helper sh -c "${COMMAND}" + "${DEVSY}" internal sh -c "${COMMAND}"