github.com/v2fly/v2ray-core/v5@v5.16.2-0.20240507031116-8191faa6e095/main/commands/all/api/balancer_info.go (about) 1 package api 2 3 import ( 4 "fmt" 5 "os" 6 "strings" 7 8 routerService "github.com/v2fly/v2ray-core/v5/app/router/command" 9 "github.com/v2fly/v2ray-core/v5/main/commands/base" 10 ) 11 12 // TODO: support "-json" flag for json output 13 var cmdBalancerInfo = &base.Command{ 14 CustomFlags: true, 15 UsageLine: "{{.Exec}} api bi [--server=127.0.0.1:8080] [balancer]...", 16 Short: "balancer information", 17 Long: ` 18 Get information of specified balancers, including health, strategy 19 and selecting. If no balancer tag specified, get information of 20 all balancers. 21 22 > Make sure you have "RoutingService" set in "config.api.services" 23 of server config. 24 25 Arguments: 26 27 -json 28 Use json output. 29 30 -s, -server <server:port> 31 The API server address. Default 127.0.0.1:8080 32 33 -t, -timeout <seconds> 34 Timeout seconds to call API. Default 3 35 36 Example: 37 38 {{.Exec}} {{.LongName}} --server=127.0.0.1:8080 balancer1 balancer2 39 `, 40 Run: executeBalancerInfo, 41 } 42 43 func executeBalancerInfo(cmd *base.Command, args []string) { 44 setSharedFlags(cmd) 45 cmd.Flag.Parse(args) 46 47 conn, ctx, close := dialAPIServer() 48 defer close() 49 50 client := routerService.NewRoutingServiceClient(conn) 51 r := &routerService.GetBalancerInfoRequest{Tag: cmd.Flag.Arg(0)} 52 resp, err := client.GetBalancerInfo(ctx, r) 53 if err != nil { 54 base.Fatalf("failed to get health information: %s", err) 55 } 56 57 if apiJSON { 58 showJSONResponse(resp) 59 return 60 } 61 62 showBalancerInfo(resp.Balancer) 63 } 64 65 func showBalancerInfo(b *routerService.BalancerMsg) { 66 const tableIndent = 4 67 sb := new(strings.Builder) 68 // Override 69 if b.Override != nil { 70 sb.WriteString(" - Selecting Override:\n") 71 for i, s := range []string{b.Override.Target} { 72 writeRow(sb, tableIndent, i+1, []string{s}, nil) 73 } 74 } 75 // Selects 76 sb.WriteString(" - Selects:\n") 77 78 for i, o := range b.PrincipleTarget.Tag { 79 writeRow(sb, tableIndent, i+1, []string{o}, nil) 80 } 81 os.Stdout.WriteString(sb.String()) 82 } 83 84 func getColumnFormats(titles []string) []string { 85 w := make([]string, len(titles)) 86 for i, t := range titles { 87 w[i] = fmt.Sprintf("%%-%ds ", len(t)) 88 } 89 return w 90 } 91 92 func writeRow(sb *strings.Builder, indent, index int, values, formats []string) { 93 if index == 0 { 94 // title line 95 sb.WriteString(strings.Repeat(" ", indent+4)) 96 } else { 97 sb.WriteString(fmt.Sprintf("%s%-4d", strings.Repeat(" ", indent), index)) 98 } 99 for i, v := range values { 100 format := "%-14s" 101 if i < len(formats) { 102 format = formats[i] 103 } 104 sb.WriteString(fmt.Sprintf(format, v)) 105 } 106 sb.WriteByte('\n') 107 }