Path: blob/main/components/local-app/cmd/workspace-ssh.go
2497 views
// Copyright (c) 2023 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package cmd56import (7"context"8"fmt"9"log/slog"10"time"1112"github.com/bufbuild/connect-go"13v1 "github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1"14"github.com/gitpod-io/local-app/pkg/helper"15"github.com/spf13/cobra"16)1718var workspaceSSHOpts struct {19DryRun bool20NoImplicitStart bool21}2223// workspaceSSHCmd connects to a given workspace24var workspaceSSHCmd = &cobra.Command{25Use: "ssh <workspace-id>",26Short: "Connects to a workspace via SSH",27Args: cobra.MinimumNArgs(1),28Example: ` # connect to workspace with current terminal session29$ gitpod workspace ssh <workspace-id>3031# Execute a command through SSH32$ gitpod workspace ssh <workspace-id> -- ls -la33$ gitpod ws ssh <workspace-id> -- -t watch date3435# Get all SSH features with --dry-run36$ $(gitpod workspace ssh <workspace-id> --dry-run) -- ls -la37$ $(gitpod workspace ssh <workspace-id> --dry-run) -t watch date`,38RunE: func(cmd *cobra.Command, args []string) error {39cmd.SilenceUsage = true4041ctx, cancel := context.WithTimeout(cmd.Context(), 5*time.Minute)42defer cancel()4344workspaceID := args[0]4546gitpod, err := getGitpodClient(cmd.Context())47if err != nil {48return err49}5051ws, err := gitpod.Workspaces.GetWorkspace(ctx, connect.NewRequest(&v1.GetWorkspaceRequest{WorkspaceId: workspaceID}))52if err != nil {53return err54}5556if ws.Msg.Result.Status.Instance.Status.Phase != v1.WorkspaceInstanceStatus_PHASE_RUNNING {57if workspaceSSHOpts.NoImplicitStart {58return fmt.Errorf("workspace is not running")59}60slog.Info("workspace is not running, starting it...")61_, err := gitpod.Workspaces.StartWorkspace(ctx, connect.NewRequest(&v1.StartWorkspaceRequest{WorkspaceId: workspaceID}))62if err != nil {63return err64}65_, err = helper.ObserveWorkspaceUntilStarted(ctx, gitpod, workspaceID)66if err != nil {67return err68}69}7071dashDashIndex := cmd.ArgsLenAtDash()7273sshArgs := []string{}74if dashDashIndex != -1 {75sshArgs = args[dashDashIndex:]76}7778return helper.SSHConnectToWorkspace(cmd.Context(), gitpod, workspaceID, workspaceSSHOpts.DryRun, sshArgs...)79},80}8182func init() {83workspaceCmd.AddCommand(workspaceSSHCmd)84workspaceSSHCmd.Flags().BoolVarP(&workspaceSSHOpts.DryRun, "dry-run", "n", false, "Dry run the command")85workspaceSSHCmd.Flags().BoolVarP(&workspaceSSHOpts.NoImplicitStart, "no-implicit-start", "", false, "Do not start the workspace if it is not running")86}878889