only server runtime over https if enabled

server fix
This commit is contained in:
Christian Goll
2025-12-03 14:33:25 +01:00
committed by Jonathon Anderson
parent 2f88b4c3d5
commit 04c54f1907

View File

@@ -37,7 +37,7 @@ func (h *slashFix) ServeHTTP(w http.ResponseWriter, r *http.Request) {
h.mux.ServeHTTP(w, r) h.mux.ServeHTTP(w, r)
} }
func defaultHandler() *slashFix { func configureHandler(includeRuntime bool, apiHandler http.Handler) *slashFix {
var wwHandler http.ServeMux var wwHandler http.ServeMux
wwHandler.HandleFunc("/provision/", warewulfd.ProvisionSend) wwHandler.HandleFunc("/provision/", warewulfd.ProvisionSend)
wwHandler.HandleFunc("/ipxe/", warewulfd.ProvisionSend) wwHandler.HandleFunc("/ipxe/", warewulfd.ProvisionSend)
@@ -45,9 +45,16 @@ func defaultHandler() *slashFix {
wwHandler.HandleFunc("/kernel/", warewulfd.ProvisionSend) wwHandler.HandleFunc("/kernel/", warewulfd.ProvisionSend)
wwHandler.HandleFunc("/container/", warewulfd.ProvisionSend) wwHandler.HandleFunc("/container/", warewulfd.ProvisionSend)
wwHandler.HandleFunc("/overlay-system/", warewulfd.ProvisionSend) wwHandler.HandleFunc("/overlay-system/", warewulfd.ProvisionSend)
wwHandler.HandleFunc("/overlay-runtime/", warewulfd.ProvisionSend) if includeRuntime {
wwHandler.HandleFunc("/overlay-runtime/", warewulfd.ProvisionSend)
}
wwHandler.HandleFunc("/overlay-file/", warewulfd.OverlaySend) wwHandler.HandleFunc("/overlay-file/", warewulfd.OverlaySend)
wwHandler.HandleFunc("/status", warewulfd.StatusSend) wwHandler.HandleFunc("/status", warewulfd.StatusSend)
if apiHandler != nil {
wwHandler.Handle("/api/", apiHandler)
}
return &slashFix{&wwHandler} return &slashFix{&wwHandler}
} }
@@ -74,15 +81,12 @@ func RunServer() error {
} }
} }
apiHandler := api.Handler(auth, conf.API.AllowedIPNets()) var apiHandler http.Handler
defaultHandler := defaultHandler() if conf.API != nil && conf.API.Enabled() {
dispatchHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { apiHandler = api.Handler(auth, conf.API.AllowedIPNets())
if strings.HasPrefix(r.URL.Path, "/api") && conf.API != nil && conf.API.Enabled() { }
apiHandler.ServeHTTP(w, r)
} else { httpHandler := configureHandler(!conf.Warewulf.EnableHttps(), apiHandler)
defaultHandler.ServeHTTP(w, r)
}
})
if conf.Warewulf.EnableHttps() { if conf.Warewulf.EnableHttps() {
key := path.Join(conf.Paths.Sysconfdir, "warewulf", "keys", "warewulf.key") key := path.Join(conf.Paths.Sysconfdir, "warewulf", "keys", "warewulf.key")
@@ -91,9 +95,10 @@ func RunServer() error {
if !util.IsFile(key) || !util.IsFile(crt) { if !util.IsFile(key) || !util.IsFile(crt) {
wwlog.Error("HTTPS enabled but keys not found in %s", path.Join(conf.Paths.Sysconfdir, "warewulf", "keys")) wwlog.Error("HTTPS enabled but keys not found in %s", path.Join(conf.Paths.Sysconfdir, "warewulf", "keys"))
} else { } else {
httpsHandler := configureHandler(true, apiHandler)
go func() { go func() {
wwlog.Info("Starting HTTPS service on port %d", conf.Warewulf.SecurePort) wwlog.Info("Starting HTTPS service on port %d", conf.Warewulf.SecurePort)
if err := http.ListenAndServeTLS(":"+strconv.Itoa(conf.Warewulf.SecurePort), crt, key, dispatchHandler); err != nil { if err := http.ListenAndServeTLS(":"+strconv.Itoa(conf.Warewulf.SecurePort), crt, key, httpsHandler); err != nil {
wwlog.Error("Could not start HTTPS service: %s", err) wwlog.Error("Could not start HTTPS service: %s", err)
} }
}() }()
@@ -101,7 +106,7 @@ func RunServer() error {
} }
wwlog.Info("Starting HTTP service on port %d", daemonPort) wwlog.Info("Starting HTTP service on port %d", daemonPort)
if err := http.ListenAndServe(":"+strconv.Itoa(daemonPort), dispatchHandler); err != nil { if err := http.ListenAndServe(":"+strconv.Itoa(daemonPort), httpHandler); err != nil {
return fmt.Errorf("could not start listening service: %w", err) return fmt.Errorf("could not start listening service: %w", err)
} }