github.com/iotexproject/iotex-core@v1.14.1-rc1/ioctl/cmd/bc/bcversion.go (about)

     1  package bc
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"github.com/grpc-ecosystem/go-grpc-middleware/util/metautils"
     8  	"github.com/iotexproject/iotex-proto/golang/iotexapi"
     9  	"github.com/spf13/cobra"
    10  	"google.golang.org/grpc/status"
    11  
    12  	"github.com/iotexproject/iotex-core/ioctl/config"
    13  	"github.com/iotexproject/iotex-core/ioctl/output"
    14  	"github.com/iotexproject/iotex-core/ioctl/util"
    15  )
    16  
    17  var versionCmdShorts = map[config.Language]string{
    18  	config.English: "get blockchain version",
    19  	config.Chinese: "获取API节点版本信息",
    20  }
    21  
    22  var _bcVersionCmd = &cobra.Command{
    23  	Use:   "version",
    24  	Short: config.TranslateInLang(versionCmdShorts, config.UILanguage),
    25  	Args:  cobra.ExactArgs(0),
    26  	RunE: func(cmd *cobra.Command, args []string) error {
    27  		out, err := bcVersion()
    28  		if err != nil {
    29  			return output.PrintError(err)
    30  		}
    31  		output.PrintResult(out)
    32  		return nil
    33  	},
    34  }
    35  
    36  func bcVersion() (string, error) {
    37  	conn, err := util.ConnectToEndpoint(config.ReadConfig.SecureConnect && !config.Insecure)
    38  	if err != nil {
    39  		return "", output.NewError(output.NetworkError, "failed to connect to endpoint", err)
    40  	}
    41  	defer conn.Close()
    42  
    43  	cli := iotexapi.NewAPIServiceClient(conn)
    44  	req := &iotexapi.GetServerMetaRequest{}
    45  	ctx := context.Background()
    46  
    47  	jwtMD, err := util.JwtAuth()
    48  	if err == nil {
    49  		ctx = metautils.NiceMD(jwtMD).ToOutgoing(ctx)
    50  	}
    51  
    52  	rsp, err := cli.GetServerMeta(ctx, req)
    53  	if err != nil {
    54  		sta, ok := status.FromError(err)
    55  		if ok {
    56  			return "", output.NewError(output.APIError, sta.Message(), nil)
    57  		}
    58  		return "", output.NewError(output.NetworkError, "failed to get version from server", err)
    59  	}
    60  
    61  	title := "API endpoint version"
    62  	detail := output.JSONString(rsp.ServerMeta)
    63  
    64  	return fmt.Sprintf("%s:\n%s\n", title, detail), nil
    65  }