diff --git a/app/http/controllers/plugins/openresty_controller.go b/app/http/controllers/plugins/openresty_controller.go index c3448415..5ddc6db4 100644 --- a/app/http/controllers/plugins/openresty_controller.go +++ b/app/http/controllers/plugins/openresty_controller.go @@ -1,6 +1,7 @@ package plugins import ( + "fmt" "regexp" "time" @@ -61,7 +62,8 @@ func (r *OpenRestyController) SaveConfig(ctx http.Context) http.Response { } if err := systemctl.Reload("openresty"); err != nil { - return controllers.Error(ctx, http.StatusInternalServerError, "重载服务失败") + _, err = shell.Execf("openresty -t") + return controllers.Error(ctx, http.StatusInternalServerError, fmt.Sprintf("重载服务失败: %v", err)) } return controllers.Success(ctx, nil) diff --git a/app/http/controllers/plugins/phpmyadmin_controller.go b/app/http/controllers/plugins/phpmyadmin_controller.go index 846e25c7..5c48f70f 100644 --- a/app/http/controllers/plugins/phpmyadmin_controller.go +++ b/app/http/controllers/plugins/phpmyadmin_controller.go @@ -88,8 +88,9 @@ func (r *PhpMyAdminController) SetPort(ctx http.Context) http.Response { } } - if err := systemctl.Reload("openresty"); err != nil { - return controllers.Error(ctx, http.StatusInternalServerError, "重载OpenResty失败") + if err = systemctl.Reload("openresty"); err != nil { + _, err = shell.Execf("openresty -t") + return controllers.Error(ctx, http.StatusInternalServerError, fmt.Sprintf("重载OpenResty失败: %v", err)) } return controllers.Success(ctx, nil) diff --git a/app/http/controllers/website_controller.go b/app/http/controllers/website_controller.go index b6dce563..e876bba6 100644 --- a/app/http/controllers/website_controller.go +++ b/app/http/controllers/website_controller.go @@ -14,6 +14,7 @@ import ( "github.com/TheTNB/panel/internal" "github.com/TheTNB/panel/internal/services" "github.com/TheTNB/panel/pkg/io" + "github.com/TheTNB/panel/pkg/shell" "github.com/TheTNB/panel/pkg/str" "github.com/TheTNB/panel/pkg/systemctl" "github.com/TheTNB/panel/pkg/types" @@ -586,7 +587,8 @@ server return nil } if err := systemctl.Reload("openresty"); err != nil { - return Error(ctx, http.StatusInternalServerError, err.Error()) + _, err = shell.Execf("openresty -t") + return Error(ctx, http.StatusInternalServerError, fmt.Sprintf("重载OpenResty失败: %v", err)) } return Success(ctx, nil) @@ -652,7 +654,8 @@ func (r *WebsiteController) Status(ctx http.Context) http.Response { return ErrorSystem(ctx) } if err = systemctl.Reload("openresty"); err != nil { - return Error(ctx, http.StatusInternalServerError, err.Error()) + _, err = shell.Execf("openresty -t") + return Error(ctx, http.StatusInternalServerError, fmt.Sprintf("重载OpenResty失败: %v", err)) } return Success(ctx, nil) diff --git a/internal/services/cert.go b/internal/services/cert.go index 322c137e..8f76e4b5 100644 --- a/internal/services/cert.go +++ b/internal/services/cert.go @@ -16,6 +16,7 @@ import ( "github.com/TheTNB/panel/pkg/acme" "github.com/TheTNB/panel/pkg/cert" "github.com/TheTNB/panel/pkg/io" + "github.com/TheTNB/panel/pkg/shell" "github.com/TheTNB/panel/pkg/systemctl" ) @@ -316,6 +317,7 @@ func (s *CertImpl) ObtainAuto(ID uint) (acme.Certificate, error) { return acme.Certificate{}, err } if err = systemctl.Reload("openresty"); err != nil { + _, err = shell.Execf("openresty -t") return acme.Certificate{}, err } } @@ -356,6 +358,7 @@ func (s *CertImpl) ObtainManual(ID uint) (acme.Certificate, error) { return acme.Certificate{}, err } if err = systemctl.Reload("openresty"); err != nil { + _, err = shell.Execf("openresty -t") return acme.Certificate{}, err } } @@ -442,6 +445,7 @@ func (s *CertImpl) Renew(ID uint) (acme.Certificate, error) { return acme.Certificate{}, err } if err = systemctl.Reload("openresty"); err != nil { + _, err = shell.Execf("openresty -t") return acme.Certificate{}, err } } @@ -474,6 +478,7 @@ func (s *CertImpl) Deploy(ID, WebsiteID uint) error { return err } if err = systemctl.Reload("openresty"); err != nil { + _, err = shell.Execf("openresty -t") return err } diff --git a/internal/services/website.go b/internal/services/website.go index efde230b..2922ee11 100644 --- a/internal/services/website.go +++ b/internal/services/website.go @@ -290,6 +290,7 @@ server } if err := systemctl.Reload("openresty"); err != nil { + _, err = shell.Execf("openresty -t") return models.Website{}, err } @@ -334,6 +335,7 @@ func (r *WebsiteImpl) SaveConfig(config requests.SaveConfig) error { return err } if err = systemctl.Reload("openresty"); err != nil { + _, err = shell.Execf("openresty -t") return err } @@ -529,7 +531,12 @@ func (r *WebsiteImpl) SaveConfig(config requests.SaveConfig) error { return err } - return systemctl.Reload("openresty") + err = systemctl.Reload("openresty") + if err != nil { + _, err = shell.Execf("openresty -t") + } + + return err } // Delete 删除网站 @@ -554,7 +561,12 @@ func (r *WebsiteImpl) Delete(id uint) error { _ = io.Remove("/www/server/vhost/ssl/" + website.Name + ".key") _ = io.Remove(website.Path) - return systemctl.Reload("openresty") + err := systemctl.Reload("openresty") + if err != nil { + _, err = shell.Execf("openresty -t") + } + + return err } // GetConfig 获取网站配置 @@ -577,7 +589,7 @@ func (r *WebsiteImpl) GetConfig(id uint) (types.WebsiteSetting, error) { setting.Raw = config ports := str.Cut(config, "# port标记位开始", "# port标记位结束") - matches := regexp.MustCompile(`listen\s+(.*);`).FindAllStringSubmatch(ports, -1) + matches := regexp.MustCompile(`listen\s+([^;]*);?`).FindAllStringSubmatch(ports, -1) for _, match := range matches { if len(match) < 2 { continue @@ -597,17 +609,17 @@ func (r *WebsiteImpl) GetConfig(id uint) (types.WebsiteSetting, error) { } } serverName := str.Cut(config, "# server_name标记位开始", "# server_name标记位结束") - match := regexp.MustCompile(`server_name\s+(.*);`).FindStringSubmatch(serverName) + match := regexp.MustCompile(`server_name\s+([^;]*);?`).FindStringSubmatch(serverName) if len(match) > 1 { setting.Domains = strings.Split(match[1], " ") } root := str.Cut(config, "# root标记位开始", "# root标记位结束") - match = regexp.MustCompile(`root\s+(.*);`).FindStringSubmatch(root) + match = regexp.MustCompile(`root\s+([^;]*);?`).FindStringSubmatch(root) if len(match) > 1 { setting.Root = match[1] } index := str.Cut(config, "# index标记位开始", "# index标记位结束") - match = regexp.MustCompile(`index\s+(.*);`).FindStringSubmatch(index) + match = regexp.MustCompile(`index\s+([^;]*);?`).FindStringSubmatch(index) if len(match) > 1 { setting.Index = match[1] } @@ -631,29 +643,31 @@ func (r *WebsiteImpl) GetConfig(id uint) (types.WebsiteSetting, error) { ssl := str.Cut(config, "# ssl标记位开始", "# ssl标记位结束") setting.HttpRedirect = strings.Contains(ssl, "# http重定向标记位") setting.Hsts = strings.Contains(ssl, "# hsts标记位") - if decode, err := cert.ParseCert(crt); err == nil { - setting.SslNotBefore = decode.NotBefore.Format("2006-01-02 15:04:05") - setting.SslNotAfter = decode.NotAfter.Format("2006-01-02 15:04:05") - setting.SslIssuer = decode.Issuer.CommonName - setting.SslOCSPServer = decode.OCSPServer - setting.SSlDNSNames = decode.DNSNames - } } else { setting.HttpRedirect = false setting.Hsts = false } + // 解析证书信息 + if decode, err := cert.ParseCert(crt); err == nil { + setting.SslNotBefore = decode.NotBefore.Format("2006-01-02 15:04:05") + setting.SslNotAfter = decode.NotAfter.Format("2006-01-02 15:04:05") + setting.SslIssuer = decode.Issuer.CommonName + setting.SslOCSPServer = decode.OCSPServer + setting.SSlDNSNames = decode.DNSNames + } + waf := str.Cut(config, "# waf标记位开始", "# waf标记位结束") setting.Waf = strings.Contains(waf, "waf on;") - match = regexp.MustCompile(`waf_mode\s+(.+);`).FindStringSubmatch(waf) + match = regexp.MustCompile(`waf_mode\s+([^;]*);?`).FindStringSubmatch(waf) if len(match) > 1 { setting.WafMode = match[1] } - match = regexp.MustCompile(`waf_cc_deny\s+(.+);`).FindStringSubmatch(waf) + match = regexp.MustCompile(`waf_cc_deny\s+([^;]*);?`).FindStringSubmatch(waf) if len(match) > 1 { setting.WafCcDeny = match[1] } - match = regexp.MustCompile(`waf_cache\s+(.+);`).FindStringSubmatch(waf) + match = regexp.MustCompile(`waf_cache\s+([^;]*);?`).FindStringSubmatch(waf) if len(match) > 1 { setting.WafCache = match[1] } diff --git a/pkg/acme/solvers.go b/pkg/acme/solvers.go index 09b16551..ea5f68fa 100644 --- a/pkg/acme/solvers.go +++ b/pkg/acme/solvers.go @@ -14,6 +14,7 @@ import ( "github.com/mholt/acmez/v2/acme" "golang.org/x/net/publicsuffix" + "github.com/TheTNB/panel/pkg/shell" "github.com/TheTNB/panel/pkg/systemctl" ) @@ -46,6 +47,7 @@ func (s httpSolver) Present(_ context.Context, challenge acme.Challenge) error { return fmt.Errorf("无法写入OpenResty配置文件: %w", err) } if err = systemctl.Reload("openresty"); err != nil { + _, err = shell.Execf("openresty -t") return fmt.Errorf("无法重载OpenResty: %w", err) }