Path: blob/main/components/gitpod-cli/cmd/ports-list.go
2498 views
// Copyright (c) 2022 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"os"10"time"1112"github.com/gitpod-io/gitpod/gitpod-cli/pkg/supervisor"13"github.com/gitpod-io/gitpod/gitpod-cli/pkg/utils"14"github.com/gitpod-io/gitpod/supervisor/api"15"github.com/spf13/cobra"1617"github.com/olekukonko/tablewriter"18)1920var listPortsCmd = &cobra.Command{21Use: "list",22Short: "Lists the workspace ports and their states.",23RunE: func(cmd *cobra.Command, args []string) error {24ctx, cancel := context.WithTimeout(cmd.Context(), 10*time.Second)25defer cancel()2627client, err := supervisor.New(ctx)28if err != nil {29return err30}31defer client.Close()3233ports, err := client.GetPortsList(ctx)34if err != nil {35return err36}3738if len(ports) == 0 {39fmt.Println("No ports detected.")40return nil41}4243table := tablewriter.NewWriter(os.Stdout)44table.SetHeader([]string{"Port", "Status", "Protocol", "URL", "Name & Description"})45table.SetBorders(tablewriter.Border{Left: true, Top: false, Right: true, Bottom: false})46table.SetCenterSeparator("|")4748for _, port := range ports {49status := ""50statusColor := tablewriter.FgHiBlackColor51accessible := port.Exposed != nil || port.Tunneled != nil5253exposedUrl := ""54if port.Exposed != nil {55exposedUrl = port.Exposed.Url56}5758if !port.Served {59status = "not served"60} else if !accessible {61if port.AutoExposure == api.PortAutoExposure_failed {62status = "failed to expose"63statusColor = tablewriter.FgRedColor64} else {65status = "detecting..."66statusColor = tablewriter.FgYellowColor67}68} else if port.Exposed != nil {69if port.Exposed.Visibility == api.PortVisibility_public {70status = "open (public)"71statusColor = tablewriter.FgHiGreenColor72}73if port.Exposed.Visibility == api.PortVisibility_private {74status = "open (private)"75statusColor = tablewriter.FgHiCyanColor76}77} else if port.Tunneled != nil {78if port.Tunneled.Visibility == api.TunnelVisiblity(api.TunnelVisiblity_value["network"]) {79status = "open on all interfaces"80statusColor = tablewriter.FgHiGreenColor81}82if port.Tunneled.Visibility == api.TunnelVisiblity(api.TunnelVisiblity_value["host"]) {83status = "open on localhost"84statusColor = tablewriter.FgHiGreenColor85}86}8788nameAndDescription := port.Name89if len(port.Description) > 0 {90if len(nameAndDescription) > 0 {91nameAndDescription = fmt.Sprint(nameAndDescription, ": ", port.Description)92} else {93nameAndDescription = port.Description94}95}9697colors := []tablewriter.Colors{}98if !noColor && utils.ColorsEnabled() {99colors = []tablewriter.Colors{{}, {statusColor}, {}, {}}100}101102table.Rich(103[]string{fmt.Sprint(port.LocalPort), status, port.Exposed.Protocol.String(), exposedUrl, nameAndDescription},104colors,105)106}107108table.Render()109return nil110},111}112113func init() {114listPortsCmd.Flags().BoolVarP(&noColor, "no-color", "", false, "Disable output colorization")115portsCmd.AddCommand(listPortsCmd)116}117118119