github.com/v2fly/v2ray-core/v5@v5.16.2-0.20240507031116-8191faa6e095/main/commands/all/api/shared.go (about)

     1  package api
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"os"
     7  	"strings"
     8  	"time"
     9  
    10  	"google.golang.org/grpc"
    11  	"google.golang.org/protobuf/encoding/protojson"
    12  	"google.golang.org/protobuf/proto"
    13  
    14  	core "github.com/v2fly/v2ray-core/v5"
    15  	"github.com/v2fly/v2ray-core/v5/main/commands/base"
    16  )
    17  
    18  var (
    19  	apiServerAddrPtr string
    20  	apiTimeout       int
    21  	apiJSON          bool
    22  	// APIConfigFormat is an internal variable
    23  	APIConfigFormat string
    24  	// APIConfigRecursively is an internal variable
    25  	APIConfigRecursively bool
    26  )
    27  
    28  // SetSharedFlags is an internal API
    29  func SetSharedFlags(cmd *base.Command) {
    30  	setSharedFlags(cmd)
    31  }
    32  
    33  func setSharedFlags(cmd *base.Command) {
    34  	cmd.Flag.StringVar(&apiServerAddrPtr, "s", "127.0.0.1:8080", "")
    35  	cmd.Flag.StringVar(&apiServerAddrPtr, "server", "127.0.0.1:8080", "")
    36  	cmd.Flag.IntVar(&apiTimeout, "t", 3, "")
    37  	cmd.Flag.IntVar(&apiTimeout, "timeout", 3, "")
    38  	cmd.Flag.BoolVar(&apiJSON, "json", false, "")
    39  }
    40  
    41  // SetSharedConfigFlags is an internal API
    42  func SetSharedConfigFlags(cmd *base.Command) {
    43  	setSharedConfigFlags(cmd)
    44  }
    45  
    46  func setSharedConfigFlags(cmd *base.Command) {
    47  	cmd.Flag.StringVar(&APIConfigFormat, "format", core.FormatAuto, "")
    48  	cmd.Flag.BoolVar(&APIConfigRecursively, "r", false, "")
    49  }
    50  
    51  // SetSharedFlags is an internal API
    52  func DialAPIServer() (conn *grpc.ClientConn, ctx context.Context, close func()) {
    53  	return dialAPIServer()
    54  }
    55  
    56  func dialAPIServer() (conn *grpc.ClientConn, ctx context.Context, close func()) {
    57  	ctx, cancel := context.WithTimeout(context.Background(), time.Duration(apiTimeout)*time.Second)
    58  	conn = dialAPIServerWithContext(ctx)
    59  	close = func() {
    60  		cancel()
    61  		conn.Close()
    62  	}
    63  	return
    64  }
    65  
    66  func dialAPIServerWithoutTimeout() (conn *grpc.ClientConn, ctx context.Context, close func()) {
    67  	ctx = context.Background()
    68  	conn = dialAPIServerWithContext(ctx)
    69  	close = func() {
    70  		conn.Close()
    71  	}
    72  	return
    73  }
    74  
    75  func dialAPIServerWithContext(ctx context.Context) (conn *grpc.ClientConn) {
    76  	conn, err := grpc.DialContext(ctx, apiServerAddrPtr, grpc.WithInsecure(), grpc.WithBlock())
    77  	if err != nil {
    78  		base.Fatalf("failed to dial %s", apiServerAddrPtr)
    79  	}
    80  	return
    81  }
    82  
    83  func protoToJSONString(m proto.Message, prefix, indent string) (string, error) { // nolint: unparam
    84  	return strings.TrimSpace(protojson.MarshalOptions{Indent: indent}.Format(m)), nil
    85  }
    86  
    87  func showJSONResponse(m proto.Message) {
    88  	output, err := protoToJSONString(m, "", "")
    89  	if err != nil {
    90  		fmt.Fprintf(os.Stdout, "%v\n", m)
    91  		base.Fatalf("error encode json: %s", err)
    92  	}
    93  	fmt.Println(output)
    94  }