github.com/v2fly/v2ray-core/v5@v5.16.2-0.20240507031116-8191faa6e095/common/platform/platform.go (about)

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