| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 | package nginximport (	"os/exec"	"path/filepath"	"regexp"	"runtime"	"strings"	"github.com/0xJacky/Nginx-UI/internal/helper"	"github.com/0xJacky/Nginx-UI/settings"	"github.com/uozi-tech/cosy/logger")var nginxExePath string// Returns the path to the nginx executablefunc getNginxExePath() string {	if nginxExePath != "" {		return nginxExePath	}	var path string	var err error	if runtime.GOOS == "windows" {		path, err = exec.LookPath("nginx.exe")	} else {		path, err = exec.LookPath("nginx")	}	if err == nil {		nginxExePath = path		return nginxExePath	}	return nginxExePath}// Returns the directory containing the nginx executablefunc getNginxExeDir() string {	return filepath.Dir(getNginxExePath())}func getNginxV() string {	exePath := getNginxExePath()	out, err := exec.Command(exePath, "-V").CombinedOutput()	if err != nil {		logger.Error(err)		return ""	}	return string(out)}// Resolves relative paths by joining them with the nginx executable directory on Windowsfunc resolvePath(path string) string {	if path == "" {		return ""	}	// Handle relative paths on Windows	if runtime.GOOS == "windows" && !filepath.IsAbs(path) {		return filepath.Join(getNginxExeDir(), path)	}	return path}func GetConfPath(dir ...string) (confPath string) {	if settings.NginxSettings.ConfigDir == "" {		out := getNginxV()		r, _ := regexp.Compile("--conf-path=(.*)/(.*.conf)")		match := r.FindStringSubmatch(out)		if len(match) < 1 {			logger.Error("nginx.GetConfPath len(match) < 1")			return ""		}		confPath = match[1]	} else {		confPath = settings.NginxSettings.ConfigDir	}	confPath = resolvePath(confPath)	joined := filepath.Clean(filepath.Join(confPath, filepath.Join(dir...)))	if !helper.IsUnderDirectory(joined, confPath) {		return confPath	}	return joined}func GetConfEntryPath() (path string) {	if settings.NginxSettings.ConfigPath == "" {		out := getNginxV()		r, _ := regexp.Compile("--conf-path=(.*.conf)")		match := r.FindStringSubmatch(out)		if len(match) < 1 {			logger.Error("nginx.GetConfEntryPath len(match) < 1")			return ""		}		path = match[1]	} else {		path = settings.NginxSettings.ConfigPath	}	return resolvePath(path)}func GetPIDPath() (path string) {	if settings.NginxSettings.PIDPath == "" {		out := getNginxV()		r, _ := regexp.Compile("--pid-path=(.*.pid)")		match := r.FindStringSubmatch(out)		if len(match) < 1 {			logger.Error("nginx.GetPIDPath len(match) < 1")			return ""		}		path = match[1]	} else {		path = settings.NginxSettings.PIDPath	}	return resolvePath(path)}func GetSbinPath() (path string) {	out := getNginxV()	r, _ := regexp.Compile("--sbin-path=(\\S+)")	match := r.FindStringSubmatch(out)	if len(match) < 1 {		logger.Error("nginx.GetPIDPath len(match) < 1")		return ""	}	path = match[1]	return resolvePath(path)}func GetAccessLogPath() (path string) {	if settings.NginxSettings.AccessLogPath == "" {		out := getNginxV()		r, _ := regexp.Compile("--http-log-path=(\\S+)")		match := r.FindStringSubmatch(out)		if len(match) < 1 {			logger.Error("nginx.GetAccessLogPath len(match) < 1")			return ""		}		path = match[1]	} else {		path = settings.NginxSettings.AccessLogPath	}	return resolvePath(path)}func GetErrorLogPath() string {	if settings.NginxSettings.ErrorLogPath == "" {		out := getNginxV()		r, _ := regexp.Compile("--error-log-path=(\\S+)")		match := r.FindStringSubmatch(out)		if len(match) < 1 {			logger.Error("nginx.GetErrorLogPath len(match) < 1")			return ""		}		return resolvePath(match[1])	} else {		return resolvePath(settings.NginxSettings.ErrorLogPath)	}}// GetModulesPath returns the nginx modules pathfunc GetModulesPath() string {	// First try to get from nginx -V output	stdOut, stdErr := execCommand(getNginxExePath(), "-V")	if stdErr != nil {		return ""	}	if stdOut != "" {		// Look for --modules-path in the output		if strings.Contains(stdOut, "--modules-path=") {			parts := strings.Split(stdOut, "--modules-path=")			if len(parts) > 1 {				// Extract the path				path := strings.Split(parts[1], " ")[0]				// Remove quotes if present				path = strings.Trim(path, "\"")				return resolvePath(path)			}		}	}	// Default path if not found	if runtime.GOOS == "windows" {		return resolvePath("modules")	}	return resolvePath("/usr/lib/nginx/modules")}
 |