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 }