config_json.go 927 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package main
  2. import (
  3. "io"
  4. "os"
  5. "os/exec"
  6. "v2ray.com/core"
  7. "v2ray.com/core/app/log"
  8. "v2ray.com/core/common/platform"
  9. jsonconf "v2ray.com/ext/tools/conf/serial"
  10. )
  11. func jsonToProto(input io.Reader) (*core.Config, error) {
  12. v2ctl := platform.GetToolLocation("v2ctl")
  13. _, err := os.Stat(v2ctl)
  14. if err != nil {
  15. return nil, err
  16. }
  17. cmd := exec.Command(v2ctl, "config")
  18. cmd.Stdin = input
  19. cmd.Stderr = os.Stderr
  20. stdoutReader, err := cmd.StdoutPipe()
  21. if err != nil {
  22. return nil, err
  23. }
  24. defer stdoutReader.Close()
  25. return core.LoadConfig(core.ConfigFormat_Protobuf, stdoutReader)
  26. }
  27. func init() {
  28. core.RegisterConfigLoader(core.ConfigFormat_JSON, func(input io.Reader) (*core.Config, error) {
  29. config, err := jsonToProto(input)
  30. if err != nil {
  31. log.Trace(newError("failed to execute v2ctl to convert config file.").Base(err).AtWarning())
  32. return jsonconf.LoadJSONConfig(input)
  33. }
  34. return config, nil
  35. })
  36. }