| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 | package nginximport (	"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 (	nginxPrefix string)// GetNginxExeDir Returns the directory containing the nginx executablefunc GetNginxExeDir() string {	return filepath.Dir(getNginxSbinPath())}// 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}// GetPrefix returns the prefix of the nginx executablefunc GetPrefix() string {	if nginxPrefix != "" {		return nginxPrefix	}	out := getNginxV()	r, _ := regexp.Compile(`--prefix=(\S+)`)	match := r.FindStringSubmatch(out)	if len(match) < 1 {		logger.Debug("nginx.GetPrefix len(match) < 1")		if runtime.GOOS == "windows" {			nginxPrefix = GetNginxExeDir()		} else {			nginxPrefix = "/usr/local/nginx"		}		return nginxPrefix	}	nginxPrefix = resolvePath(match[1])	return nginxPrefix}// GetConfPath returns the path of the nginx configuration filefunc 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}// GetConfEntryPath returns the path of the nginx configuration filefunc 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)}// GetPIDPath returns the path of the nginx PID filefunc 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("pid path not found in nginx -V output")			return ""		}		path = match[1]	} else {		path = settings.NginxSettings.PIDPath	}	return resolvePath(path)}// GetSbinPath returns the path of the nginx executablefunc GetSbinPath() (path string) {	return getNginxSbinPath()}// GetAccessLogPath returns the path of the nginx access log filefunc GetAccessLogPath() (path string) {	path = settings.NginxSettings.AccessLogPath	if path == "" {		out := getNginxV()		r, _ := regexp.Compile(`--http-log-path=(\S+)`)		match := r.FindStringSubmatch(out)		if len(match) > 1 {			path = match[1]			resolvedPath := resolvePath(path)			// Check if the matched path exists but is not a regular file			if !isValidRegularFile(resolvedPath) {				logger.Debug("access log path from nginx -V exists but is not a regular file, try to get from nginx -T output", "path", resolvedPath)				fallbackPath := getAccessLogPathFromNginxT()				if fallbackPath != "" {					path = fallbackPath					return path // Already resolved in getAccessLogPathFromNginxT				}			}		}		if path == "" {			logger.Debug("access log path not found in nginx -V output, try to get from nginx -T output")			path = getAccessLogPathFromNginxT()		}	}	return resolvePath(path)}// GetErrorLogPath returns the path of the nginx error log filefunc GetErrorLogPath() string {	path := settings.NginxSettings.ErrorLogPath	if path == "" {		out := getNginxV()		r, _ := regexp.Compile(`--error-log-path=(\S+)`)		match := r.FindStringSubmatch(out)		if len(match) > 1 {			path = match[1]			resolvedPath := resolvePath(path)			// Check if the matched path exists but is not a regular file			if !isValidRegularFile(resolvedPath) {				logger.Debug("error log path from nginx -V exists but is not a regular file, try to get from nginx -T output", "path", resolvedPath)				fallbackPath := getErrorLogPathFromNginxT()				if fallbackPath != "" {					path = fallbackPath					return path // Already resolved in getErrorLogPathFromNginxT				}			}		}		if path == "" {			logger.Debug("error log path not found in nginx -V output, try to get from nginx -T output")			path = getErrorLogPathFromNginxT()		}	}	return resolvePath(path)}// GetModulesPath returns the path of the nginx modulesfunc GetModulesPath() string {	// First try to get from nginx -V output	out := getNginxV()	if out != "" {		// Look for --modules-path in the output		if strings.Contains(out, "--modules-path=") {			parts := strings.Split(out, "--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")}
 |