fix: share runtime env injection for reposync and terminal

This commit is contained in:
limitcool
2026-04-01 16:12:29 +08:00
parent 82bb54e97c
commit ea1d9f2306
3 changed files with 135 additions and 85 deletions
+104
View File
@@ -0,0 +1,104 @@
package utils
import (
"fmt"
"os"
"path/filepath"
"strings"
"github.com/engigu/baihu-panel/internal/constant"
)
// BuildRuntimeProcessEnv 构造 Baihu 内部可信子进程需要继承的运行时环境变量。
// 仅包含 Baihu 自己的路径/数据库配置,不包含用户任务环境变量。
func BuildRuntimeProcessEnv() []string {
envs := make([]string, 0, 11)
configPath := constant.ConfigPath
if absConfig, err := filepath.Abs(constant.ConfigPath); err == nil {
configPath = absConfig
}
envs = append(envs, formatEnvVar("BH_CONFIG_PATH", configPath))
if scriptsDir := ResolveAbsScriptsDir(); strings.TrimSpace(scriptsDir) != "" {
envs = append(envs, formatEnvVar("BH_SCRIPTS_DIR", scriptsDir))
}
appendEnvIfSet(&envs, "BH_DB_TYPE", constant.RuntimeDBType)
appendEnvIfSet(&envs, "BH_DB_HOST", constant.RuntimeDBHost)
if constant.RuntimeDBPort > 0 {
envs = append(envs, formatEnvVar("BH_DB_PORT", fmt.Sprintf("%d", constant.RuntimeDBPort)))
}
appendEnvIfSet(&envs, "BH_DB_USER", constant.RuntimeDBUser)
appendEnvIfSet(&envs, "BH_DB_PASSWORD", constant.RuntimeDBPassword)
appendEnvIfSet(&envs, "BH_DB_NAME", constant.RuntimeDBName)
appendEnvIfSet(&envs, "BH_DB_PATH", constant.RuntimeDBPath)
appendEnvIfSet(&envs, "BH_DB_DSN", constant.RuntimeDBDSN)
appendEnvIfSet(&envs, "BH_DB_TABLE_PREFIX", constant.RuntimeDBTablePrefix)
return envs
}
// BuildShellEnvPrefix 将 KEY=VALUE 环境变量切片转换为 shell 前缀。
func BuildShellEnvPrefix(envs []string) string {
parts := make([]string, 0, len(envs))
for _, env := range envs {
key, value, ok := strings.Cut(env, "=")
if !ok || strings.TrimSpace(key) == "" {
continue
}
parts = append(parts, ShellEnvAssignment(key, value))
}
if len(parts) == 0 {
return ""
}
return strings.Join(parts, " ") + " "
}
// ShellEnvAssignment 生成 shell 可安全使用的 KEY='VALUE' 赋值片段。
func ShellEnvAssignment(key, value string) string {
return key + "='" + strings.ReplaceAll(value, "'", "'\\''") + "'"
}
// ResolveAbsScriptsDir 解析 Baihu 运行时脚本目录的绝对路径。
func ResolveAbsScriptsDir() string {
if scriptsDir := os.Getenv("BH_SCRIPTS_DIR"); scriptsDir != "" {
if filepath.IsAbs(scriptsDir) {
return filepath.Clean(scriptsDir)
}
if absScriptsDir, err := filepath.Abs(scriptsDir); err == nil {
return absScriptsDir
}
return filepath.Clean(scriptsDir)
}
if configPath := os.Getenv("BH_CONFIG_PATH"); configPath != "" {
if !filepath.IsAbs(configPath) {
if absConfigPath, err := filepath.Abs(configPath); err == nil {
configPath = absConfigPath
}
}
projectRoot := filepath.Dir(filepath.Dir(configPath))
return filepath.Clean(filepath.Join(projectRoot, constant.ScriptsWorkDir))
}
if absScriptsDir, err := filepath.Abs(constant.ScriptsWorkDir); err == nil {
return absScriptsDir
}
return filepath.Clean(constant.ScriptsWorkDir)
}
func appendEnvIfSet(envs *[]string, key, value string) {
if strings.TrimSpace(value) == "" {
return
}
*envs = append(*envs, formatEnvVar(key, value))
}
func formatEnvVar(key, value string) string {
return fmt.Sprintf("%s=%s", key, value)
}