platform.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package platform
  2. import (
  3. "os"
  4. "path/filepath"
  5. "strconv"
  6. "strings"
  7. )
  8. //go:generate go run github.com/v2fly/v2ray-core/v4/common/errors/errorgen
  9. type EnvFlag struct {
  10. Name string
  11. AltName string
  12. }
  13. func NewEnvFlag(name string) EnvFlag {
  14. return EnvFlag{
  15. Name: name,
  16. AltName: NormalizeEnvName(name),
  17. }
  18. }
  19. func (f EnvFlag) GetValue(defaultValue func() string) string {
  20. if v, found := os.LookupEnv(f.Name); found {
  21. return v
  22. }
  23. if len(f.AltName) > 0 {
  24. if v, found := os.LookupEnv(f.AltName); found {
  25. return v
  26. }
  27. }
  28. return defaultValue()
  29. }
  30. func (f EnvFlag) GetValueAsInt(defaultValue int) int {
  31. useDefaultValue := false
  32. s := f.GetValue(func() string {
  33. useDefaultValue = true
  34. return ""
  35. })
  36. if useDefaultValue {
  37. return defaultValue
  38. }
  39. v, err := strconv.ParseInt(s, 10, 32)
  40. if err != nil {
  41. return defaultValue
  42. }
  43. return int(v)
  44. }
  45. func NormalizeEnvName(name string) string {
  46. return strings.ReplaceAll(strings.ToUpper(strings.TrimSpace(name)), ".", "_")
  47. }
  48. func getExecutableDir() string {
  49. exec, err := os.Executable()
  50. if err != nil {
  51. return ""
  52. }
  53. return filepath.Dir(exec)
  54. }
  55. func getExecutableSubDir(dir string) func() string {
  56. return func() string {
  57. return filepath.Join(getExecutableDir(), dir)
  58. }
  59. }
  60. func GetPluginDirectory() string {
  61. const name = "v2ray.location.plugin"
  62. pluginDir := NewEnvFlag(name).GetValue(getExecutableSubDir("plugins"))
  63. return pluginDir
  64. }
  65. func GetConfigurationPath() string {
  66. const name = "v2ray.location.config"
  67. configPath := NewEnvFlag(name).GetValue(getExecutableDir)
  68. return filepath.Join(configPath, "config.json")
  69. }
  70. // GetConfDirPath reads "v2ray.location.confdir"
  71. func GetConfDirPath() string {
  72. const name = "v2ray.location.confdir"
  73. configPath := NewEnvFlag(name).GetValue(func() string { return "" })
  74. return configPath
  75. }