package config import ( _ "embed" "fmt" "io" "os" "path/filepath" "runtime" "strings" ) //go:embed version var version string //go:embed name var name string type LogLevel string const ( Debug LogLevel = "debug" Info LogLevel = "info" Notice LogLevel = "notice" Warn LogLevel = "warn" Error LogLevel = "error" ) func GetVersion() string { return strings.TrimSpace(version) } func GetName() string { return strings.TrimSpace(name) } func GetLogLevel() LogLevel { if IsDebug() { return Debug } logLevel := os.Getenv("XUI_LOG_LEVEL") if logLevel == "" { return Info } return LogLevel(logLevel) } func IsDebug() bool { return os.Getenv("XUI_DEBUG") == "true" } func GetBinFolderPath() string { binFolderPath := os.Getenv("XUI_BIN_FOLDER") if binFolderPath == "" { binFolderPath = "bin" } return binFolderPath } func getBaseDir() string { exePath, err := os.Executable() if err != nil { return "." } exeDir := filepath.Dir(exePath) exeDirLower := strings.ToLower(filepath.ToSlash(exeDir)) if strings.Contains(exeDirLower, "/appdata/local/temp/") || strings.Contains(exeDirLower, "/go-build") { wd, err := os.Getwd() if err != nil { return "." } return wd } return exeDir } func GetDBFolderPath() string { dbFolderPath := os.Getenv("XUI_DB_FOLDER") if dbFolderPath != "" { return dbFolderPath } if runtime.GOOS == "windows" { return getBaseDir() } return "/etc/x-ui" } func GetDBPath() string { return fmt.Sprintf("%s/%s.db", GetDBFolderPath(), GetName()) } func GetLogFolder() string { logFolderPath := os.Getenv("XUI_LOG_FOLDER") if logFolderPath != "" { return logFolderPath } if runtime.GOOS == "windows" { return getBaseDir() } return "/var/log" } func copyFile(src, dst string) error { in, err := os.Open(src) if err != nil { return err } defer in.Close() out, err := os.Create(dst) if err != nil { return err } defer out.Close() _, err = io.Copy(out, in) if err != nil { return err } return out.Sync() } func init() { if runtime.GOOS != "windows" { return } if os.Getenv("XUI_DB_FOLDER") != "" { return } oldDBFolder := "/etc/x-ui" oldDBPath := fmt.Sprintf("%s/%s.db", oldDBFolder, GetName()) newDBFolder := GetDBFolderPath() newDBPath := fmt.Sprintf("%s/%s.db", newDBFolder, GetName()) _, err := os.Stat(newDBPath) if err == nil { return // new exists } _, err = os.Stat(oldDBPath) if os.IsNotExist(err) { return // old does not exist } _ = copyFile(oldDBPath, newDBPath) // ignore error }