diff --git a/hscontrol/app.go b/hscontrol/app.go index c0ff87ee..eb5528ba 100644 --- a/hscontrol/app.go +++ b/hscontrol/app.go @@ -446,6 +446,7 @@ func (h *Headscale) createRouter(grpcMux *grpcRuntime.ServeMux) *mux.Router { router.HandleFunc("/robots.txt", h.RobotsHandler).Methods(http.MethodGet) router.HandleFunc("/health", h.HealthHandler).Methods(http.MethodGet) + router.HandleFunc("/version", h.VersionHandler).Methods(http.MethodGet) router.HandleFunc("/key", h.KeyHandler).Methods(http.MethodGet) router.HandleFunc("/register/{registration_id}", h.authProvider.RegisterHandler). Methods(http.MethodGet) diff --git a/hscontrol/handlers.go b/hscontrol/handlers.go index f9f9115a..0cc5bd36 100644 --- a/hscontrol/handlers.go +++ b/hscontrol/handlers.go @@ -201,6 +201,24 @@ func (h *Headscale) RobotsHandler( } } +// VersionHandler returns version information about the Headscale server +// Listens in /version. +func (h *Headscale) VersionHandler( + writer http.ResponseWriter, + req *http.Request, +) { + writer.Header().Set("Content-Type", "application/json") + writer.WriteHeader(http.StatusOK) + + versionInfo := types.GetVersionInfo() + if err := json.NewEncoder(writer).Encode(versionInfo); err != nil { + log.Error(). + Caller(). + Err(err). + Msg("Failed to write version response") + } +} + var codeStyleRegisterWebAPI = styles.Props{ styles.Display: "block", styles.Padding: "20px",