123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- package nginx
- import (
- "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 executable
- func 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 executable
- func 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 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
- }
- 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 path
- func 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")
- }
|