diff --git a/app/http/controllers/plugins/fail2ban_controller.go b/app/http/controllers/plugins/fail2ban_controller.go index bb2e3a62..c881c909 100644 --- a/app/http/controllers/plugins/fail2ban_controller.go +++ b/app/http/controllers/plugins/fail2ban_controller.go @@ -221,11 +221,8 @@ func (r *Fail2banController) Add(ctx http.Context) http.Response { } var ports string for _, port := range config.Ports { - if len(strings.Split(port, " ")) > 1 { - ports += strings.Split(port, " ")[0] + "," - } else { - ports += port + "," - } + fields := strings.Fields(cast.ToString(port)) + ports += fields[0] + "," } rule := ` diff --git a/app/http/controllers/website_controller.go b/app/http/controllers/website_controller.go index 509c2c25..9244e54c 100644 --- a/app/http/controllers/website_controller.go +++ b/app/http/controllers/website_controller.go @@ -274,10 +274,7 @@ func (r *WebsiteController) SaveConfig(ctx http.Context) http.Response { err := r.website.SaveConfig(saveConfigRequest) if err != nil { - facades.Log().Request(ctx.Request()).Tags("面板", "网站管理").With(map[string]any{ - "error": err.Error(), - }).Info("保存网站配置失败") - return Error(ctx, http.StatusInternalServerError, "保存网站配置失败: "+err.Error()) + return Error(ctx, http.StatusInternalServerError, err.Error()) } return Success(ctx, nil) diff --git a/app/http/requests/website/add.go b/app/http/requests/website/add.go index bee3207b..81fb95d8 100644 --- a/app/http/requests/website/add.go +++ b/app/http/requests/website/add.go @@ -8,7 +8,7 @@ import ( type Add struct { Name string `form:"name" json:"name"` Domains []string `form:"domains" json:"domains"` - Ports []string `form:"ports" json:"ports"` + Ports []uint `form:"ports" json:"ports"` Path string `form:"path" json:"path"` Php int `form:"php" json:"php"` Db bool `form:"db" json:"db"` diff --git a/app/http/requests/website/save_config.go b/app/http/requests/website/save_config.go index dee0f5e7..d38a1ced 100644 --- a/app/http/requests/website/save_config.go +++ b/app/http/requests/website/save_config.go @@ -8,7 +8,7 @@ import ( type SaveConfig struct { ID uint `form:"id" json:"id" filter:"uint"` Domains []string `form:"domains" json:"domains"` - Ports []string `form:"ports" json:"ports"` + Ports []uint `form:"ports" json:"ports"` Hsts bool `form:"hsts" json:"hsts"` Ssl bool `form:"ssl" json:"ssl"` HttpRedirect bool `form:"http_redirect" json:"http_redirect"` @@ -50,8 +50,8 @@ func (r *SaveConfig) Rules(ctx http.Context) map[string]string { "raw": "required|string", "rewrite": "string", "php": "int", - "ssl_certificate": "required_if:ssl,true|bool", - "ssl_certificate_key": "required_if:ssl,true|bool", + "ssl_certificate": "required_if:ssl,true", + "ssl_certificate_key": "required_if:ssl,true", } } diff --git a/app/services/website.go b/app/services/website.go index 45b0febb..9e519ca1 100644 --- a/app/services/website.go +++ b/app/services/website.go @@ -11,6 +11,7 @@ import ( "strings" "github.com/goravel/framework/facades" + "github.com/spf13/cast" requests "panel/app/http/requests/website" "panel/app/models" @@ -30,7 +31,7 @@ type PanelWebsite struct { Name string `json:"name"` Status bool `json:"status"` Domains []string `json:"domains"` - Ports []string `json:"ports"` + Ports []uint `json:"ports"` Path string `json:"path"` Php int `json:"php"` Ssl bool `json:"ssl"` @@ -46,7 +47,7 @@ type PanelWebsite struct { type WebsiteSetting struct { Name string `json:"name"` Domains []string `json:"domains"` - Ports []string `json:"ports"` + Ports []uint `json:"ports"` Root string `json:"root"` Path string `json:"path"` Index string `json:"index"` @@ -170,22 +171,19 @@ func (r *WebsiteImpl) Add(website PanelWebsite) (models.Website, error) { portList := "" domainList := "" - portUsed := make(map[string]bool) + portUsed := make(map[uint]bool) domainUsed := make(map[string]bool) for i, port := range website.Ports { if _, ok := portUsed[port]; !ok { if i == len(website.Ports)-1 { - portList += " listen " + port + ";" + portList += " listen " + cast.ToString(port) + ";" } else { - portList += " listen " + port + ";\n" + portList += " listen " + cast.ToString(port) + ";\n" } portUsed[port] = true } } - if len(website.Ports) == 0 { - portList += " listen 80;\n" - } for _, domain := range website.Domains { if _, ok := domainUsed[domain]; !ok { domainList += " " + domain @@ -367,16 +365,14 @@ func (r *WebsiteImpl) SaveConfig(config requests.SaveConfig) error { var port strings.Builder ports := config.Ports for i, v := range ports { - if _, err := strconv.Atoi(v); err != nil && v != "443 ssl http2" { - return errors.New("端口格式错误") - } - if v == "443" && config.Ssl { - v = "443 ssl http2" + vStr := cast.ToString(v) + if v == 443 && config.Ssl { + vStr = "443 ssl http2" } if i != len(ports)-1 { - port.WriteString(" listen " + v + ";\n") + port.WriteString(" listen " + vStr + ";\n") } else { - port.WriteString(" listen " + v + ";") + port.WriteString(" listen " + vStr + ";") } } portConfigOld := tools.Cut(raw, "# port标记位开始", "# port标记位结束") @@ -581,7 +577,9 @@ func (r *WebsiteImpl) GetConfig(id uint) (WebsiteSetting, error) { if len(match) < 2 { continue } - setting.Ports = append(setting.Ports, match[1]) + + port := strings.Fields(match[1])[0] + setting.Ports = append(setting.Ports, cast.ToUint(port)) } serverName := tools.Cut(config, "# server_name标记位开始", "# server_name标记位结束") match := regexp.MustCompile(`server_name\s+(.*);`).FindStringSubmatch(serverName) diff --git a/pkg/tools/system.go b/pkg/tools/system.go index 1a6016c6..e4813735 100644 --- a/pkg/tools/system.go +++ b/pkg/tools/system.go @@ -1,6 +1,8 @@ package tools import ( + "bytes" + "errors" "fmt" "os" "os/exec" @@ -39,8 +41,16 @@ func Remove(path string) error { func Exec(shell string) (string, error) { cmd := exec.Command("bash", "-c", "LC_ALL=C "+shell) - output, err := cmd.CombinedOutput() - return strings.TrimSpace(string(output)), err + var stdoutBuf, stderrBuf bytes.Buffer + cmd.Stdout = &stdoutBuf + cmd.Stderr = &stderrBuf + + err := cmd.Run() + if err != nil { + return "", errors.New(strings.TrimSpace(stderrBuf.String())) + } + + return strings.TrimSpace(stdoutBuf.String()), err } // ExecAsync 异步执行 shell 命令