platform.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package platform
  2. import (
  3. "os"
  4. "path/filepath"
  5. "strconv"
  6. "strings"
  7. )
  8. type EnvFlag struct {
  9. Name string
  10. AltName string
  11. }
  12. func (f EnvFlag) GetValue(defaultValue func() string) string {
  13. if v, found := os.LookupEnv(f.Name); found {
  14. return v
  15. }
  16. if len(f.AltName) > 0 {
  17. if v, found := os.LookupEnv(f.AltName); found {
  18. return v
  19. }
  20. }
  21. return defaultValue()
  22. }
  23. func (f EnvFlag) GetValueAsInt(defaultValue int) int {
  24. useDefaultValue := false
  25. s := f.GetValue(func() string {
  26. useDefaultValue = true
  27. return ""
  28. })
  29. if useDefaultValue {
  30. return defaultValue
  31. }
  32. v, err := strconv.ParseInt(s, 10, 32)
  33. if err != nil {
  34. return defaultValue
  35. }
  36. return int(v)
  37. }
  38. func NormalizeEnvName(name string) string {
  39. return strings.Replace(strings.ToUpper(strings.TrimSpace(name)), ".", "_", -1)
  40. }
  41. func getExecutableDir() string {
  42. exec, err := os.Executable()
  43. if err != nil {
  44. return ""
  45. }
  46. return filepath.Dir(exec)
  47. }
  48. func getExecuableSubDir(dir string) func() string {
  49. return func() string {
  50. return filepath.Join(getExecutableDir(), dir)
  51. }
  52. }
  53. func GetAssetLocation(file string) string {
  54. const name = "v2ray.location.asset"
  55. assetPath := EnvFlag{Name: name, AltName: NormalizeEnvName(name)}.GetValue(getExecutableDir)
  56. return filepath.Join(assetPath, file)
  57. }
  58. func GetPluginDirectory() string {
  59. const name = "v2ray.location.plugin"
  60. pluginDir := EnvFlag{Name: name, AltName: NormalizeEnvName(name)}.GetValue(getExecuableSubDir("plugins"))
  61. return pluginDir
  62. }