Add endpoints to return nginx config from disk

This commit is contained in:
Jamie Curnow 2023-01-09 15:42:56 +10:00
parent ca4d92d793
commit 5586d16afd
5 changed files with 128 additions and 0 deletions

View File

@ -164,6 +164,45 @@ func DeleteHost() func(http.ResponseWriter, *http.Request) {
}
}
// GetHostNginxConfig will return a Host's nginx config from disk
// Route: GET /hosts/{hostID}/nginx-config
// Route: GET /hosts/{hostID}/nginx-config.txt
func GetHostNginxConfig(format string) func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
var err error
var hostID int
if hostID, err = getURLParamInt(r, "hostID"); err != nil {
h.ResultErrorJSON(w, r, http.StatusBadRequest, err.Error(), nil)
return
}
item, err := host.GetByID(hostID)
switch err {
case sql.ErrNoRows:
h.ResultErrorJSON(w, r, http.StatusNotFound, "Not found", nil)
case nil:
// Get the config from disk
content, nErr := nginx.GetHostConfigContent(item)
if nErr != nil {
h.ResultErrorJSON(w, r, http.StatusBadRequest, nErr.Error(), nil)
return
}
if format == "text" {
h.ResultResponseText(w, r, http.StatusOK, content)
return
}
j := struct {
Content string `json:"content"`
}{Content: content}
h.ResultResponseJSON(w, r, http.StatusOK, j)
default:
h.ResultErrorJSON(w, r, http.StatusBadRequest, err.Error(), nil)
}
}
}
func configureHost(h host.Model) {
err := jobqueue.AddJob(jobqueue.Job{
Name: "NginxConfigureHost",

View File

@ -117,6 +117,45 @@ func DeleteUpstream() func(http.ResponseWriter, *http.Request) {
}
}
// GetHostNginxConfig will return a Host's nginx config from disk
// Route: GET /upstreams/{upstreamID}/nginx-config
// Route: GET /upstreams/{upstreamID}/nginx-config.txt
func GetUpstreamNginxConfig(format string) func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
var err error
var upstreamID int
if upstreamID, err = getURLParamInt(r, "upstreamID"); err != nil {
h.ResultErrorJSON(w, r, http.StatusBadRequest, err.Error(), nil)
return
}
item, err := upstream.GetByID(upstreamID)
switch err {
case sql.ErrNoRows:
h.ResultErrorJSON(w, r, http.StatusNotFound, "Not found", nil)
case nil:
// Get the config from disk
content, nErr := nginx.GetUpstreamConfigContent(item)
if nErr != nil {
h.ResultErrorJSON(w, r, http.StatusBadRequest, nErr.Error(), nil)
return
}
if format == "text" {
h.ResultResponseText(w, r, http.StatusOK, content)
return
}
j := struct {
Content string `json:"content"`
}{Content: content}
h.ResultResponseJSON(w, r, http.StatusOK, j)
default:
h.ResultErrorJSON(w, r, http.StatusBadRequest, err.Error(), nil)
}
}
}
func configureUpstream(u upstream.Model) {
err := jobqueue.AddJob(jobqueue.Job{
Name: "NginxConfigureUpstream",

View File

@ -81,6 +81,13 @@ func ResultErrorJSON(w http.ResponseWriter, r *http.Request, status int, message
ResultResponseJSON(w, r, status, errorResponse)
}
// ResultResponseText will write the result as text to the http output
func ResultResponseText(w http.ResponseWriter, r *http.Request, status int, content string) {
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
w.WriteHeader(status)
fmt.Fprint(w, content)
}
// getPrettyPrintFromContext returns the PrettyPrint setting
func getPrettyPrintFromContext(r *http.Request) bool {
pretty, ok := r.Context().Value(c.PrettyPrintCtxKey).(bool)

View File

@ -168,6 +168,8 @@ func applyRoutes(r chi.Router) chi.Router {
Post("/", handler.CreateHost())
r.With(middleware.Enforce(user.CapabilityHostsManage)).With(middleware.EnforceRequestSchema(schema.UpdateHost())).
Put("/{hostID:[0-9]+}", handler.UpdateHost())
r.With(middleware.Enforce(user.CapabilityHostsManage)).Get("/{hostID:[0-9]+}/nginx-config", handler.GetHostNginxConfig("json"))
r.With(middleware.Enforce(user.CapabilityHostsManage)).Get("/{hostID:[0-9]+}/nginx-config.txt", handler.GetHostNginxConfig("text"))
})
// Nginx Templates
@ -202,6 +204,8 @@ func applyRoutes(r chi.Router) chi.Router {
r.With(middleware.Enforce(user.CapabilityHostsManage)).Delete("/{upstreamID:[0-9]+}", handler.DeleteUpstream())
r.With(middleware.Enforce(user.CapabilityHostsManage)).With(middleware.EnforceRequestSchema(schema.CreateUpstream())).
Post("/", handler.CreateUpstream())
r.With(middleware.Enforce(user.CapabilityHostsManage)).Get("/{upstreamID:[0-9]+}/nginx-config", handler.GetUpstreamNginxConfig("json"))
r.With(middleware.Enforce(user.CapabilityHostsManage)).Get("/{upstreamID:[0-9]+}/nginx-config.txt", handler.GetUpstreamNginxConfig("text"))
})
})

View File

@ -185,3 +185,42 @@ func removeFiles(files []string) {
}
}
}
// GetHostConfigContent returns nginx config as it exists on disk
func GetHostConfigContent(h host.Model) (string, error) {
filename := getHostFilename(h, "")
if h.ErrorMessage != "" {
filename = getHostFilename(h, ErrorSuffix)
}
if h.IsDisabled {
filename = getHostFilename(h, DisabledSuffix)
}
if h.IsDeleted {
filename = getHostFilename(h, DeletedSuffix)
}
// nolint: gosec
cnt, err := os.ReadFile(filename)
if err != nil {
return "", err
}
return string(cnt), nil
}
// GetUpstreamConfigContent returns nginx config as it exists on disk
func GetUpstreamConfigContent(u upstream.Model) (string, error) {
filename := getUpstreamFilename(u, "")
if u.ErrorMessage != "" {
filename = getUpstreamFilename(u, ErrorSuffix)
}
if u.IsDeleted {
filename = getUpstreamFilename(u, DeletedSuffix)
}
// nolint: gosec
cnt, err := os.ReadFile(filename)
if err != nil {
return "", err
}
return string(cnt), nil
}