convert_confs.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package all
  2. import (
  3. "io/ioutil"
  4. "os"
  5. "path/filepath"
  6. "strings"
  7. "github.com/v2fly/v2ray-core/v4/common/cmdarg"
  8. "github.com/v2fly/v2ray-core/v4/infra/conf/json"
  9. "github.com/v2fly/v2ray-core/v4/infra/conf/merge"
  10. "github.com/v2fly/v2ray-core/v4/main/commands/base"
  11. )
  12. func mergeConvertToMap(files []string, format string) map[string]interface{} {
  13. var (
  14. m map[string]interface{}
  15. err error
  16. )
  17. switch inputFormat {
  18. case "json":
  19. m, err = merge.FilesToMap(files)
  20. if err != nil {
  21. base.Fatalf("failed to load json: %s", err)
  22. }
  23. case "yaml":
  24. bs, err := yamlsToJSONs(files)
  25. if err != nil {
  26. base.Fatalf("failed to convert yaml to json: %s", err)
  27. }
  28. m, err = merge.BytesToMap(bs)
  29. if err != nil {
  30. base.Fatalf("failed to merge converted json: %s", err)
  31. }
  32. default:
  33. base.Errorf("invalid input format: %s", format)
  34. base.Errorf("Run '%s help %s' for details.", base.CommandEnv.Exec, cmdConvert.LongName())
  35. base.Exit()
  36. }
  37. return m
  38. }
  39. // resolveFolderToFiles expands folder path (if any and it exists) to file paths.
  40. // Any other paths, like file, even URL, it returns them as is.
  41. func resolveFolderToFiles(paths []string, extensions []string, recursively bool) []string {
  42. dirReader := readConfDir
  43. if recursively {
  44. dirReader = readConfDirRecursively
  45. }
  46. files := make([]string, 0)
  47. for _, p := range paths {
  48. i, err := os.Stat(p)
  49. if err == nil && i.IsDir() {
  50. files = append(files, dirReader(p, extensions)...)
  51. continue
  52. }
  53. files = append(files, p)
  54. }
  55. return files
  56. }
  57. func readConfDir(dirPath string, extensions []string) []string {
  58. confs, err := ioutil.ReadDir(dirPath)
  59. if err != nil {
  60. base.Fatalf("failed to read dir %s: %s", dirPath, err)
  61. }
  62. files := make([]string, 0)
  63. for _, f := range confs {
  64. ext := filepath.Ext(f.Name())
  65. for _, e := range extensions {
  66. if strings.EqualFold(ext, e) {
  67. files = append(files, filepath.Join(dirPath, f.Name()))
  68. break
  69. }
  70. }
  71. }
  72. return files
  73. }
  74. // getFolderFiles get files in the folder and it's children
  75. func readConfDirRecursively(dirPath string, extensions []string) []string {
  76. files := make([]string, 0)
  77. err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {
  78. ext := filepath.Ext(path)
  79. for _, e := range extensions {
  80. if strings.EqualFold(ext, e) {
  81. files = append(files, path)
  82. break
  83. }
  84. }
  85. return nil
  86. })
  87. if err != nil {
  88. base.Fatalf("failed to read dir %s: %s", dirPath, err)
  89. }
  90. return files
  91. }
  92. func yamlsToJSONs(files []string) ([][]byte, error) {
  93. jsons := make([][]byte, 0)
  94. for _, file := range files {
  95. bs, err := cmdarg.LoadArgToBytes(file)
  96. if err != nil {
  97. return nil, err
  98. }
  99. j, err := json.FromYAML(bs)
  100. if err != nil {
  101. return nil, err
  102. }
  103. jsons = append(jsons, j)
  104. }
  105. return jsons, nil
  106. }