github.com/xmplusdev/xmcore@v1.8.11-0.20240412132628-5518b55526af/main/commands/all/api/rules_add.go (about) 1 package api 2 3 import ( 4 "fmt" 5 6 routerService "github.com/xmplusdev/xmcore/app/router/command" 7 cserial "github.com/xmplusdev/xmcore/common/serial" 8 "github.com/xmplusdev/xmcore/infra/conf" 9 "github.com/xmplusdev/xmcore/infra/conf/serial" 10 "github.com/xmplusdev/xmcore/main/commands/base" 11 ) 12 13 var cmdAddRules = &base.Command{ 14 CustomFlags: true, 15 UsageLine: "{{.Exec}} api adrules [--server=127.0.0.1:8080] <c1.json> [c2.json]...", 16 Short: "Add routing rules", 17 Long: ` 18 Add routing rules to Xray. 19 Arguments: 20 -s, -server 21 The API server address. Default 127.0.0.1:8080 22 -t, -timeout 23 Timeout seconds to call API. Default 3 24 -append 25 append or replace config. Default false 26 27 Example: 28 {{.Exec}} {{.LongName}} --server=127.0.0.1:8080 c1.json c2.json 29 `, 30 Run: executeAddRules, 31 } 32 33 func executeAddRules(cmd *base.Command, args []string) { 34 var ( 35 shouldAppend bool 36 ) 37 setSharedFlags(cmd) 38 cmd.Flag.BoolVar(&shouldAppend, "append", false, "") 39 cmd.Flag.Parse(args) 40 41 unnamedArgs := cmd.Flag.Args() 42 if len(unnamedArgs) == 0 { 43 fmt.Println("reading from stdin:") 44 unnamedArgs = []string{"stdin:"} 45 } 46 conn, ctx, close := dialAPIServer() 47 defer close() 48 49 client := routerService.NewRoutingServiceClient(conn) 50 51 rcs := make([]conf.RouterConfig, 0) 52 for _, arg := range unnamedArgs { 53 r, err := loadArg(arg) 54 if err != nil { 55 base.Fatalf("failed to load %s: %s", arg, err) 56 } 57 conf, err := serial.DecodeJSONConfig(r) 58 if err != nil { 59 base.Fatalf("failed to decode %s: %s", arg, err) 60 } 61 rcs = append(rcs, *conf.RouterConfig) 62 } 63 if len(rcs) == 0 { 64 base.Fatalf("no valid rule found in config") 65 } 66 for _, in := range rcs { 67 68 config, err := in.Build() 69 if err != nil { 70 base.Fatalf("failed to build conf: %s", err) 71 } 72 tmsg := cserial.ToTypedMessage(config) 73 if tmsg == nil { 74 base.Fatalf("failed to format config to TypedMessage.") 75 } 76 77 ra := &routerService.AddRuleRequest{ 78 Config: tmsg, 79 ShouldAppend: shouldAppend, 80 } 81 resp, err := client.AddRule(ctx, ra) 82 if err != nil { 83 base.Fatalf("failed to perform AddRule: %s", err) 84 } 85 showJSONResponse(resp) 86 } 87 88 }