update API command

This commit is contained in:
Shelikhoo
2021-09-04 11:12:33 +01:00
parent 81462f7b65
commit 775b9f54df
6 changed files with 152 additions and 310 deletions
-47
View File
@@ -1,47 +0,0 @@
package api
import (
routerService "github.com/v2fly/v2ray-core/v4/app/router/command"
"github.com/v2fly/v2ray-core/v4/main/commands/base"
)
var cmdBalancerCheck = &base.Command{
CustomFlags: true,
UsageLine: "{{.Exec}} api bc [--server=127.0.0.1:8080] [balancer]...",
Short: "balancer health check",
Long: `
Perform instant health checks for specific balancers. If no
balancer tag specified, check all balancers.
> Make sure you have "RoutingService" set in "config.api.services"
of server config.
Arguments:
-s, -server <server:port>
The API server address. Default 127.0.0.1:8080
-t, -timeout <seconds>
Timeout seconds to call API. Default 3
Example:
{{.Exec}} {{.LongName}} --server=127.0.0.1:8080 balancer1 balancer2
`,
Run: executeBalancerCheck,
}
func executeBalancerCheck(cmd *base.Command, args []string) {
setSharedFlags(cmd)
cmd.Flag.Parse(args)
conn, ctx, close := dialAPIServer()
defer close()
client := routerService.NewRoutingServiceClient(conn)
r := &routerService.CheckBalancersRequest{BalancerTags: cmd.Flag.Args()}
_, err := client.CheckBalancers(ctx, r)
if err != nil {
base.Fatalf("failed to perform balancer health checks: %s", err)
}
}
+10 -35
View File
@@ -3,7 +3,6 @@ package api
import (
"fmt"
"os"
"sort"
"strings"
routerService "github.com/v2fly/v2ray-core/v4/app/router/command"
@@ -49,60 +48,36 @@ func executeBalancerInfo(cmd *base.Command, args []string) {
defer close()
client := routerService.NewRoutingServiceClient(conn)
r := &routerService.GetBalancersRequest{BalancerTags: cmd.Flag.Args()}
resp, err := client.GetBalancers(ctx, r)
r := &routerService.GetBalancerInfoRequest{Tag: args[0]}
resp, err := client.GetBalancerInfo(ctx, r)
if err != nil {
base.Fatalf("failed to get health information: %s", err)
}
sort.Slice(resp.Balancers, func(i, j int) bool {
return resp.Balancers[i].Tag < resp.Balancers[j].Tag
})
if apiJSON {
showJSONResponse(resp)
return
}
for _, b := range resp.Balancers {
showBalancerInfo(b)
}
showBalancerInfo(resp.Balancer)
}
func showBalancerInfo(b *routerService.BalancerMsg) {
const tableIndent = 4
sb := new(strings.Builder)
// Balancer
sb.WriteString(fmt.Sprintf("Balancer: %s\n", b.Tag))
// Strategy
sb.WriteString(" - Strategy:\n")
for _, v := range b.StrategySettings {
sb.WriteString(fmt.Sprintf(" %s\n", v))
}
// Override
if b.Override != nil {
sb.WriteString(" - Selecting Override:\n")
until := fmt.Sprintf("until: %s", b.Override.Until)
writeRow(sb, tableIndent, 0, []string{until}, nil)
for i, s := range b.Override.Selects {
for i, s := range []string{b.Override.Target} {
writeRow(sb, tableIndent, i+1, []string{s}, nil)
}
}
b.Titles = append(b.Titles, "Tag")
formats := getColumnFormats(b.Titles)
// Selects
sb.WriteString(" - Selects:\n")
writeRow(sb, tableIndent, 0, b.Titles, formats)
for i, o := range b.Selects {
o.Values = append(o.Values, o.Tag)
writeRow(sb, tableIndent, i+1, o.Values, formats)
}
// Others
scnt := len(b.Selects)
if len(b.Others) > 0 {
sb.WriteString(" - Others:\n")
writeRow(sb, tableIndent, 0, b.Titles, formats)
for i, o := range b.Others {
o.Values = append(o.Values, o.Tag)
writeRow(sb, tableIndent, scnt+i+1, o.Values, formats)
}
for i, o := range b.PrincipleTarget.Tag {
writeRow(sb, tableIndent, i+1, []string{o}, nil)
}
os.Stdout.WriteString(sb.String())
}
+13 -24
View File
@@ -1,37 +1,29 @@
package api
import (
"time"
routerService "github.com/v2fly/v2ray-core/v4/app/router/command"
"github.com/v2fly/v2ray-core/v4/main/commands/base"
)
var cmdBalancerOverride = &base.Command{
CustomFlags: true,
UsageLine: "{{.Exec}} api bo [--server=127.0.0.1:8080] <-b balancer> selectors...",
UsageLine: "{{.Exec}} api bo [--server=127.0.0.1:8080] <-b balancer> outboundTag",
Short: "balancer override",
Long: `
Override a balancer's selection in a duration of time.
Override a balancer's selection.
> Make sure you have "RoutingService" set in "config.api.services"
of server config.
Once a balancer's selection is overridden:
- The selectors of the balancer won't apply.
- The strategy of the balancer stops selecting qualified nodes
according to its settings, doing only the final pick.
- The balancer's selection result will always be outboundTag
Arguments:
-b, -balancer <tag>
Tag of the target balancer. Required.
-v, -validity <duration>
Time duration of the validity of override, e.g.: 60s, 60m,
24h, 1m30s. Default 1h.
-r, -remove
Remove the override
@@ -43,7 +35,7 @@ Arguments:
Example:
{{.Exec}} {{.LongName}} --server=127.0.0.1:8080 -b balancer selector1 selector2
{{.Exec}} {{.LongName}} --server=127.0.0.1:8080 -b balancer tag
{{.Exec}} {{.LongName}} --server=127.0.0.1:8080 -b balancer -r
`,
Run: executeBalancerOverride,
@@ -52,13 +44,10 @@ Example:
func executeBalancerOverride(cmd *base.Command, args []string) {
var (
balancer string
validity time.Duration
remove bool
)
cmd.Flag.StringVar(&balancer, "b", "", "")
cmd.Flag.StringVar(&balancer, "balancer", "", "")
cmd.Flag.DurationVar(&validity, "v", time.Hour, "")
cmd.Flag.DurationVar(&validity, "validity", time.Hour, "")
cmd.Flag.BoolVar(&remove, "r", false, "")
cmd.Flag.BoolVar(&remove, "remove", false, "")
setSharedFlags(cmd)
@@ -71,17 +60,17 @@ func executeBalancerOverride(cmd *base.Command, args []string) {
conn, ctx, close := dialAPIServer()
defer close()
v := int64(0)
if !remove {
v = int64(validity)
}
client := routerService.NewRoutingServiceClient(conn)
r := &routerService.OverrideSelectingRequest{
BalancerTag: balancer,
Selectors: cmd.Flag.Args(),
Validity: v,
target := ""
if !remove {
target = cmd.Flag.Args()[0]
}
_, err := client.OverrideSelecting(ctx, r)
r := &routerService.OverrideBalancerTargetRequest{
BalancerTag: balancer,
Target: target,
}
_, err := client.OverrideBalancerTarget(ctx, r)
if err != nil {
base.Fatalf("failed to override balancer: %s", err)
}
+2 -10
View File
@@ -2,8 +2,8 @@ package api
import (
"context"
"encoding/json"
"fmt"
"google.golang.org/protobuf/encoding/protojson"
"os"
"strings"
"time"
@@ -81,15 +81,7 @@ func dialAPIServerWithContext(ctx context.Context) (conn *grpc.ClientConn) {
}
func protoToJSONString(m proto.Message, prefix, indent string) (string, error) {
b := new(strings.Builder)
e := json.NewEncoder(b)
e.SetIndent(prefix, indent)
e.SetEscapeHTML(false)
err := e.Encode(m)
if err != nil {
return "", err
}
return strings.TrimSpace(b.String()), nil
return strings.TrimSpace(protojson.MarshalOptions{Indent: indent}.Format(m)), nil
}
func showJSONResponse(m proto.Message) {