run.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package commands
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "path/filepath"
  7. "strings"
  8. core "github.com/v2fly/v2ray-core/v5"
  9. "github.com/v2fly/v2ray-core/v5/common/cmdarg"
  10. "github.com/v2fly/v2ray-core/v5/common/platform"
  11. "github.com/v2fly/v2ray-core/v5/main/commands/base"
  12. )
  13. var (
  14. configFiles cmdarg.Arg
  15. configDirs cmdarg.Arg
  16. configFormat *string
  17. configDirRecursively *bool
  18. )
  19. func setConfigFlags(cmd *base.Command) {
  20. configFormat = cmd.Flag.String("format", core.FormatAuto, "")
  21. configDirRecursively = cmd.Flag.Bool("r", false, "")
  22. cmd.Flag.Var(&configFiles, "config", "")
  23. cmd.Flag.Var(&configFiles, "c", "")
  24. cmd.Flag.Var(&configDirs, "confdir", "")
  25. cmd.Flag.Var(&configDirs, "d", "")
  26. }
  27. func fileExists(file string) bool {
  28. info, err := os.Stat(file)
  29. return err == nil && !info.IsDir()
  30. }
  31. func dirExists(file string) bool {
  32. if file == "" {
  33. return false
  34. }
  35. info, err := os.Stat(file)
  36. return err == nil && info.IsDir()
  37. }
  38. func readConfDir(dirPath string, extension []string) cmdarg.Arg {
  39. confs, err := os.ReadDir(dirPath)
  40. if err != nil {
  41. base.Fatalf("failed to read dir %s: %s", dirPath, err)
  42. }
  43. files := make(cmdarg.Arg, 0)
  44. for _, f := range confs {
  45. ext := filepath.Ext(f.Name())
  46. for _, e := range extension {
  47. if strings.EqualFold(e, ext) {
  48. files.Set(filepath.Join(dirPath, f.Name()))
  49. break
  50. }
  51. }
  52. }
  53. return files
  54. }
  55. // getFolderFiles get files in the folder and it's children
  56. func readConfDirRecursively(dirPath string, extension []string) cmdarg.Arg {
  57. files := make(cmdarg.Arg, 0)
  58. err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {
  59. ext := filepath.Ext(path)
  60. for _, e := range extension {
  61. if strings.EqualFold(e, ext) {
  62. files.Set(path)
  63. break
  64. }
  65. }
  66. return nil
  67. })
  68. if err != nil {
  69. base.Fatalf("failed to read dir %s: %s", dirPath, err)
  70. }
  71. return files
  72. }
  73. func getConfigFilePath() cmdarg.Arg {
  74. extension, err := core.GetLoaderExtensions(*configFormat)
  75. if err != nil {
  76. base.Fatalf(err.Error())
  77. }
  78. dirReader := readConfDir
  79. if *configDirRecursively {
  80. dirReader = readConfDirRecursively
  81. }
  82. if len(configDirs) > 0 {
  83. for _, d := range configDirs {
  84. log.Println("Using confdir from arg:", d)
  85. configFiles = append(configFiles, dirReader(d, extension)...)
  86. }
  87. } else if envConfDir := platform.GetConfDirPath(); dirExists(envConfDir) {
  88. log.Println("Using confdir from env:", envConfDir)
  89. configFiles = append(configFiles, dirReader(envConfDir, extension)...)
  90. }
  91. if len(configFiles) > 0 {
  92. return configFiles
  93. }
  94. if len(configFiles) == 0 && len(configDirs) > 0 {
  95. base.Fatalf("no config file found with extension: %s", extension)
  96. }
  97. if workingDir, err := os.Getwd(); err == nil {
  98. configFile := filepath.Join(workingDir, "config.json")
  99. if fileExists(configFile) {
  100. log.Println("Using default config: ", configFile)
  101. return cmdarg.Arg{configFile}
  102. }
  103. }
  104. if configFile := platform.GetConfigurationPath(); fileExists(configFile) {
  105. log.Println("Using config from env: ", configFile)
  106. return cmdarg.Arg{configFile}
  107. }
  108. return nil
  109. }
  110. func startV2Ray() (core.Server, error) {
  111. config, err := core.LoadConfig(*configFormat, configFiles)
  112. if err != nil {
  113. if len(configFiles) == 0 {
  114. err = newError("failed to load config").Base(err)
  115. } else {
  116. err = newError(fmt.Sprintf("failed to load config: %s", configFiles)).Base(err)
  117. }
  118. return nil, err
  119. }
  120. server, err := core.New(config)
  121. if err != nil {
  122. return nil, newError("failed to create server").Base(err)
  123. }
  124. return server, nil
  125. }