common/pathutil/assistpath.go (152 lines of code) (raw):
package pathutil
import (
"os"
"path/filepath"
"sync"
)
var (
scriptPath string
logPath string
logPathRWLock sync.RWMutex
versionedConfigDir string
versionedConfigDirRWLock sync.RWMutex
crossVersionConfigDir string
crossVersionConfigDirRWLock sync.RWMutex
)
func MakeSurePath(path string) error {
return os.MkdirAll(path, os.ModePerm)
}
func SetCurrentEnvPath() bool {
path := os.Getenv("path")
path += ";"
cur_path, _ := GetExecutableDir()
path += cur_path
os.Setenv("path", path)
return true
}
func SetScriptPath(path string) {
scriptPath = path
}
func GetScriptPath() (string, error) {
if scriptPath != "" {
return scriptPath, nil
}
crossVersionDir, err := getCrossVersionOutboundDir()
if err != nil {
return "", err
}
path := filepath.Join(crossVersionDir, "work", "script")
err = MakeSurePath(path)
return path, err
}
func SetLogPath(path string) {
logPath = path
MakeSurePath(logPath)
}
func GetLogPath() (string, error) {
logPathRWLock.RLock()
if logPath == "" {
logPathRWLock.RUnlock()
logPathRWLock.Lock()
defer logPathRWLock.Unlock()
if logPath == "" {
parentDir, err := GetExecutableDir()
if err != nil {
return "", err
}
writableDir := filepath.Join(parentDir, "log")
if err := MakeSurePath(writableDir); err != nil {
return "", err
}
logPath = writableDir
}
} else {
defer logPathRWLock.RUnlock()
}
return logPath, nil
}
func GetHybridPath() (string, error) {
crossVersionDir, err := GetCrossVersionInboundDir()
if err != nil {
return "", err
}
path := filepath.Join(crossVersionDir, "hybrid")
err = MakeSurePath(path)
return path, err
}
func GetConfigPath() (string, error) {
versionedConfigDirRWLock.RLock()
if versionedConfigDir == "" {
versionedConfigDirRWLock.RUnlock()
versionedConfigDirRWLock.Lock()
defer versionedConfigDirRWLock.Unlock()
if versionedConfigDir == "" {
parentDir, err := getVersionedInboundDir()
if err != nil {
return "", err
}
writableDir := filepath.Join(parentDir, "config")
if err := MakeSurePath(writableDir); err != nil {
return "", err
}
versionedConfigDir = writableDir
}
} else {
defer versionedConfigDirRWLock.RUnlock()
}
return versionedConfigDir, nil
}
func GetCrossVersionConfigPath() (string, error) {
crossVersionConfigDirRWLock.RLock()
if crossVersionConfigDir == "" {
crossVersionConfigDirRWLock.RUnlock()
crossVersionConfigDirRWLock.Lock()
defer crossVersionConfigDirRWLock.Unlock()
if crossVersionConfigDir == "" {
crossVersionDir, err := GetCrossVersionInboundDir()
if err != nil {
return "", err
}
writableDir := filepath.Join(crossVersionDir, "config")
if err := MakeSurePath(writableDir); err != nil {
return "", err
}
crossVersionConfigDir = writableDir
}
} else {
defer crossVersionConfigDirRWLock.RUnlock()
}
return crossVersionConfigDir, nil
}
func GetTempPath() (string, error) {
goTempDir := os.TempDir()
// According to https://pkg.go.dev/os#TempDir, path returned from os.TempDir()
// is neither guaranteed to exist nor have accessible permissions. Therefore
// we need to make sure such path accessible manually.
err := MakeSurePath(goTempDir)
return goTempDir, err
}
func GetCachePath() (string, error) {
crossVersionDir, err := getCrossVersionOutboundDir()
if err != nil {
return "", err
}
path := filepath.Join(crossVersionDir, "cache")
MakeSurePath((path))
return path, err
}
func GetPluginPath() (string, error) {
crossVersionDir, err := getCrossVersionOutboundDir()
if err != nil {
return "", err
}
path := filepath.Join(crossVersionDir, "plugin")
err = MakeSurePath(path)
return path, err
}
func GetPreInstalledPluginPath() (string, error) {
cur, err := getVersionedOutboundDir()
if err != nil {
return "", err
}
path := filepath.Join(cur, "plugin")
err = MakeSurePath(path)
return path, err
}