rules_add.go 2.1 KB

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