Path: blob/main/components/gitpod-cli/cmd/ports-await.go
2498 views
// Copyright (c) 2020 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"fmt"8"os"9"regexp"10"strconv"11"time"1213"github.com/gitpod-io/gitpod/gitpod-cli/pkg/utils"14"github.com/spf13/cobra"15"golang.org/x/xerrors"16)1718const (19fnNetTCP = "/proc/net/tcp"20fnNetTCP6 = "/proc/net/tcp6"21)2223var awaitPortCmd = &cobra.Command{24Use: "await <port>",25Short: "Waits for a process to listen on a port",26Args: cobra.ExactArgs(1),27RunE: func(cmd *cobra.Command, args []string) error {28port, err := strconv.ParseUint(args[0], 10, 16)29if err != nil {30return GpError{Err: xerrors.Errorf("port cannot be parsed as int: %w", err), OutCome: utils.Outcome_UserErr, ErrorCode: utils.UserErrorCode_InvalidArguments}31}3233// Expected format: local port (in hex), remote address (irrelevant here), connection state ("0A" is "TCP_LISTEN")34pattern, err := regexp.Compile(fmt.Sprintf(":[0]*%X \\w+:\\w+ 0A ", port))35if err != nil {36return GpError{Err: xerrors.Errorf("cannot compile regexp pattern"), OutCome: utils.Outcome_UserErr, ErrorCode: utils.UserErrorCode_InvalidArguments}37}3839var protos []string40for _, path := range []string{fnNetTCP, fnNetTCP6} {41if _, err := os.Stat(path); err == nil {42protos = append(protos, path)43}44}4546fmt.Printf("Awaiting port %d... ", port)47t := time.NewTicker(time.Second * 2)48for cmd.Context().Err() == nil {49for _, proto := range protos {50tcp, err := os.ReadFile(proto)51if err != nil {52return xerrors.Errorf("cannot read %v: %w", proto, err)53}5455if pattern.MatchString(string(tcp)) {56fmt.Println("ok")57return nil58}59}60select {61case <-cmd.Context().Done():62return nil63case <-t.C:64}65}66return nil67},68}6970var awaitPortCmdAlias = &cobra.Command{71Hidden: true,72Deprecated: "please use `ports await` instead.",73Use: "await-port <port>",74Short: awaitPortCmd.Short,75Long: awaitPortCmd.Long,76Args: awaitPortCmd.Args,77RunE: awaitPortCmd.RunE,78}7980func init() {81portsCmd.AddCommand(awaitPortCmd)8283rootCmd.AddCommand(awaitPortCmdAlias)84}858687