123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- package nginx
- import (
- "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
- )
- // Returns the directory containing the nginx executable
- func GetNginxExeDir() string {
- return filepath.Dir(getNginxSbinPath())
- }
- // Resolves relative paths by joining them with the nginx executable directory on Windows
- func 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 executable
- func GetPrefix() string {
- if nginxPrefix != "" {
- return nginxPrefix
- }
- out := getNginxV()
- r, _ := regexp.Compile(`--prefix=(\S+)`)
- match := r.FindStringSubmatch(out)
- if len(match) < 1 {
- logger.Error("nginx.GetPrefix len(match) < 1")
- nginxPrefix = "/usr/local/nginx"
- return nginxPrefix
- }
- nginxPrefix = resolvePath(match[1])
- return nginxPrefix
- }
- // GetConfPath returns the path of the nginx configuration file
- 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
- }
- // GetConfEntryPath returns the path of the nginx configuration file
- 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)
- }
- // GetPIDPath returns the path of the nginx PID file
- 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("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 executable
- func GetSbinPath() (path string) {
- return getNginxSbinPath()
- }
- // GetAccessLogPath returns the path of the nginx access log file
- func 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]
- }
- 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 file
- func 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]
- }
- 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 modules
- func 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")
- }
|