98 lines
2.6 KiB
Go
98 lines
2.6 KiB
Go
|
|
package handlers
|
||
|
|
|
||
|
|
import (
|
||
|
|
"net/http"
|
||
|
|
"os"
|
||
|
|
"os/exec"
|
||
|
|
"path/filepath"
|
||
|
|
"strings"
|
||
|
|
|
||
|
|
"setec-manager/internal/nginx"
|
||
|
|
"setec-manager/internal/system"
|
||
|
|
)
|
||
|
|
|
||
|
|
type nginxStatus struct {
|
||
|
|
Running bool `json:"running"`
|
||
|
|
Status string `json:"status"`
|
||
|
|
ConfigTest string `json:"config_test"`
|
||
|
|
ConfigOK bool `json:"config_ok"`
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *Handler) NginxStatus(w http.ResponseWriter, r *http.Request) {
|
||
|
|
status := nginxStatus{}
|
||
|
|
status.Status, status.Running = nginx.Status()
|
||
|
|
|
||
|
|
testOut, testErr := nginx.Test()
|
||
|
|
status.ConfigTest = testOut
|
||
|
|
status.ConfigOK = testErr == nil
|
||
|
|
|
||
|
|
if acceptsJSON(r) {
|
||
|
|
writeJSON(w, http.StatusOK, status)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
h.render(w, "nginx.html", status)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *Handler) NginxReload(w http.ResponseWriter, r *http.Request) {
|
||
|
|
// Validate config first
|
||
|
|
if _, err := nginx.Test(); err != nil {
|
||
|
|
writeError(w, http.StatusBadRequest, "nginx config test failed — not reloading")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
if err := nginx.Reload(); err != nil {
|
||
|
|
writeError(w, http.StatusInternalServerError, err.Error())
|
||
|
|
return
|
||
|
|
}
|
||
|
|
writeJSON(w, http.StatusOK, map[string]string{"status": "reloaded"})
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *Handler) NginxRestart(w http.ResponseWriter, r *http.Request) {
|
||
|
|
if err := nginx.Restart(); err != nil {
|
||
|
|
writeError(w, http.StatusInternalServerError, err.Error())
|
||
|
|
return
|
||
|
|
}
|
||
|
|
writeJSON(w, http.StatusOK, map[string]string{"status": "restarted"})
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *Handler) NginxConfigView(w http.ResponseWriter, r *http.Request) {
|
||
|
|
domain := paramStr(r, "domain")
|
||
|
|
path := filepath.Join(h.Config.Nginx.SitesAvailable, domain)
|
||
|
|
|
||
|
|
data, err := os.ReadFile(path)
|
||
|
|
if err != nil {
|
||
|
|
writeError(w, http.StatusNotFound, "config not found for "+domain)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
writeJSON(w, http.StatusOK, map[string]string{"domain": domain, "config": string(data)})
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *Handler) NginxTest(w http.ResponseWriter, r *http.Request) {
|
||
|
|
out, err := nginx.Test()
|
||
|
|
ok := err == nil
|
||
|
|
writeJSON(w, http.StatusOK, map[string]interface{}{
|
||
|
|
"output": strings.TrimSpace(out),
|
||
|
|
"valid": ok,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *Handler) NginxInstallBase(w http.ResponseWriter, r *http.Request) {
|
||
|
|
// Install nginx if not present
|
||
|
|
if _, err := exec.LookPath("nginx"); err != nil {
|
||
|
|
if _, installErr := system.PackageInstall("nginx"); installErr != nil {
|
||
|
|
writeError(w, http.StatusInternalServerError, installErr.Error())
|
||
|
|
return
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Install snippets
|
||
|
|
if err := nginx.InstallSnippets(h.Config); err != nil {
|
||
|
|
writeError(w, http.StatusInternalServerError, err.Error())
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
// Ensure certbot webroot exists
|
||
|
|
os.MkdirAll(h.Config.Nginx.CertbotWebroot, 0755)
|
||
|
|
|
||
|
|
writeJSON(w, http.StatusOK, map[string]string{"status": "nginx configured"})
|
||
|
|
}
|