config.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package control
  2. import (
  3. "bytes"
  4. "io"
  5. "os"
  6. "strings"
  7. "github.com/golang/protobuf/proto"
  8. "github.com/v2fly/v2ray-core/v4/common"
  9. "github.com/v2fly/v2ray-core/v4/infra/conf"
  10. "github.com/v2fly/v2ray-core/v4/infra/conf/serial"
  11. )
  12. // ConfigCommand is the json to pb convert struct
  13. type ConfigCommand struct{}
  14. // Name for cmd usage
  15. func (c *ConfigCommand) Name() string {
  16. return "config"
  17. }
  18. // Description for help usage
  19. func (c *ConfigCommand) Description() Description {
  20. return Description{
  21. Short: "merge multiple json config",
  22. Usage: []string{"v2ctl config config.json c1.json c2.json <url>.json"},
  23. }
  24. }
  25. // Execute real work here.
  26. func (c *ConfigCommand) Execute(args []string) error {
  27. if len(args) < 1 {
  28. return newError("empty config list")
  29. }
  30. conf := &conf.Config{}
  31. for _, arg := range args {
  32. ctllog.Println("Read config: ", arg)
  33. r, err := c.LoadArg(arg)
  34. common.Must(err)
  35. c, err := serial.DecodeJSONConfig(r)
  36. if err != nil {
  37. ctllog.Fatalln(err)
  38. }
  39. conf.Override(c, arg)
  40. }
  41. pbConfig, err := conf.Build()
  42. if err != nil {
  43. return err
  44. }
  45. bytesConfig, err := proto.Marshal(pbConfig)
  46. if err != nil {
  47. return newError("failed to marshal proto config").Base(err)
  48. }
  49. if _, err := os.Stdout.Write(bytesConfig); err != nil {
  50. return newError("failed to write proto config").Base(err)
  51. }
  52. return nil
  53. }
  54. // LoadArg loads one arg, maybe an remote url, or local file path
  55. func (c *ConfigCommand) LoadArg(arg string) (out io.Reader, err error) {
  56. var data []byte
  57. switch {
  58. case strings.HasPrefix(arg, "http://"), strings.HasPrefix(arg, "https://"):
  59. data, err = FetchHTTPContent(arg)
  60. case arg == "stdin:":
  61. data, err = io.ReadAll(os.Stdin)
  62. default:
  63. data, err = os.ReadFile(arg)
  64. }
  65. if err != nil {
  66. return
  67. }
  68. out = bytes.NewBuffer(data)
  69. return
  70. }
  71. func init() {
  72. common.Must(RegisterCommand(&ConfigCommand{}))
  73. }