convert_confs.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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 "toml":
  24. bs, err := tomlsToJSONs(files)
  25. if err != nil {
  26. base.Fatalf("failed to convert toml 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. case "yaml":
  33. bs, err := yamlsToJSONs(files)
  34. if err != nil {
  35. base.Fatalf("failed to convert yaml to json: %s", err)
  36. }
  37. m, err = merge.BytesToMap(bs)
  38. if err != nil {
  39. base.Fatalf("failed to merge converted json: %s", err)
  40. }
  41. default:
  42. base.Errorf("invalid input format: %s", format)
  43. base.Errorf("Run '%s help %s' for details.", base.CommandEnv.Exec, cmdConvert.LongName())
  44. base.Exit()
  45. }
  46. return m
  47. }
  48. // resolveFolderToFiles expands folder path (if any and it exists) to file paths.
  49. // Any other paths, like file, even URL, it returns them as is.
  50. func resolveFolderToFiles(paths []string, extensions []string, recursively bool) []string {
  51. dirReader := readConfDir
  52. if recursively {
  53. dirReader = readConfDirRecursively
  54. }
  55. files := make([]string, 0)
  56. for _, p := range paths {
  57. i, err := os.Stat(p)
  58. if err == nil && i.IsDir() {
  59. files = append(files, dirReader(p, extensions)...)
  60. continue
  61. }
  62. files = append(files, p)
  63. }
  64. return files
  65. }
  66. func readConfDir(dirPath string, extensions []string) []string {
  67. confs, err := ioutil.ReadDir(dirPath)
  68. if err != nil {
  69. base.Fatalf("failed to read dir %s: %s", dirPath, err)
  70. }
  71. files := make([]string, 0)
  72. for _, f := range confs {
  73. ext := filepath.Ext(f.Name())
  74. for _, e := range extensions {
  75. if strings.EqualFold(ext, e) {
  76. files = append(files, filepath.Join(dirPath, f.Name()))
  77. break
  78. }
  79. }
  80. }
  81. return files
  82. }
  83. // getFolderFiles get files in the folder and it's children
  84. func readConfDirRecursively(dirPath string, extensions []string) []string {
  85. files := make([]string, 0)
  86. err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {
  87. ext := filepath.Ext(path)
  88. for _, e := range extensions {
  89. if strings.EqualFold(ext, e) {
  90. files = append(files, path)
  91. break
  92. }
  93. }
  94. return nil
  95. })
  96. if err != nil {
  97. base.Fatalf("failed to read dir %s: %s", dirPath, err)
  98. }
  99. return files
  100. }
  101. func yamlsToJSONs(files []string) ([][]byte, error) {
  102. jsons := make([][]byte, 0)
  103. for _, file := range files {
  104. bs, err := cmdarg.LoadArgToBytes(file)
  105. if err != nil {
  106. return nil, err
  107. }
  108. j, err := json.FromYAML(bs)
  109. if err != nil {
  110. return nil, err
  111. }
  112. jsons = append(jsons, j)
  113. }
  114. return jsons, nil
  115. }
  116. func tomlsToJSONs(files []string) ([][]byte, error) {
  117. jsons := make([][]byte, 0)
  118. for _, file := range files {
  119. bs, err := cmdarg.LoadArgToBytes(file)
  120. if err != nil {
  121. return nil, err
  122. }
  123. j, err := json.FromTOML(bs)
  124. if err != nil {
  125. return nil, err
  126. }
  127. jsons = append(jsons, j)
  128. }
  129. return jsons, nil
  130. }