convert.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package all
  2. import (
  3. "bytes"
  4. "os"
  5. "github.com/v2fly/v2ray-core/v4/commands/base"
  6. "github.com/v2fly/v2ray-core/v4/infra/conf/merge"
  7. "github.com/v2fly/v2ray-core/v4/infra/conf/serial"
  8. "google.golang.org/protobuf/proto"
  9. )
  10. var cmdConvert = &base.Command{
  11. UsageLine: "{{.Exec}} convert [-r] [c1.json] [<url>.json] [dir1] ...",
  12. Short: "Convert multiple json config to protobuf",
  13. Long: `
  14. Convert JSON config to protobuf.
  15. If multiple JSON files or folders specified, it merges them first, then convert.
  16. Arguments:
  17. -r
  18. Load confdir recursively.
  19. Examples:
  20. {{.Exec}} {{.LongName}} config.json
  21. {{.Exec}} {{.LongName}} c1.json c2.json
  22. {{.Exec}} {{.LongName}} c1.json https://url.to/c2.json
  23. {{.Exec}} {{.LongName}} "path/to/json_dir"
  24. `,
  25. }
  26. func init() {
  27. cmdConvert.Run = executeConvert // break init loop
  28. }
  29. var convertReadDirRecursively = cmdConvert.Flag.Bool("r", false, "")
  30. func executeConvert(cmd *base.Command, args []string) {
  31. unnamed := cmd.Flag.Args()
  32. files := resolveFolderToFiles(unnamed, *convertReadDirRecursively)
  33. if len(files) == 0 {
  34. base.Fatalf("empty config list")
  35. }
  36. data, err := merge.FilesToJSON(files)
  37. if err != nil {
  38. base.Fatalf("failed to load json: %s", err)
  39. }
  40. r := bytes.NewReader(data)
  41. cf, err := serial.DecodeJSONConfig(r)
  42. if err != nil {
  43. base.Fatalf("failed to decode json: %s", err)
  44. }
  45. pbConfig, err := cf.Build()
  46. if err != nil {
  47. base.Fatalf(err.Error())
  48. }
  49. bytesConfig, err := proto.Marshal(pbConfig)
  50. if err != nil {
  51. base.Fatalf("failed to marshal proto config: %s", err)
  52. }
  53. if _, err := os.Stdout.Write(bytesConfig); err != nil {
  54. base.Fatalf("failed to write proto config: %s", err)
  55. }
  56. }