mirror of
https://github.com/v2fly/v2ray-core
synced 2024-02-27 03:18:06 +00:00
update API command
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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())
|
||||
}
|
||||
|
||||
@@ -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,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) {
|
||||
|
||||
Reference in New Issue
Block a user