2022-07-15 04:26:12 +00:00
|
|
|
package nginx
|
|
|
|
|
2022-07-21 08:02:07 +00:00
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"npm/internal/config"
|
2023-01-04 05:36:56 +00:00
|
|
|
"npm/internal/entity/certificate"
|
2022-07-21 08:02:07 +00:00
|
|
|
"npm/internal/entity/host"
|
2023-01-04 05:36:56 +00:00
|
|
|
"npm/internal/entity/upstream"
|
2022-07-21 08:02:07 +00:00
|
|
|
"npm/internal/logger"
|
2023-01-04 05:36:56 +00:00
|
|
|
"npm/internal/status"
|
2022-07-21 08:02:07 +00:00
|
|
|
)
|
2022-07-15 04:26:12 +00:00
|
|
|
|
|
|
|
// ConfigureHost will attempt to write nginx conf and reload nginx
|
|
|
|
func ConfigureHost(h host.Model) error {
|
|
|
|
// nolint: errcheck, gosec
|
2023-01-04 05:36:56 +00:00
|
|
|
h.Expand([]string{"certificate", "nginxtemplate"})
|
|
|
|
|
|
|
|
var certificateTemplate certificate.Template
|
|
|
|
if h.Certificate != nil {
|
|
|
|
certificateTemplate = h.Certificate.GetTemplate()
|
|
|
|
}
|
2022-07-21 08:02:07 +00:00
|
|
|
|
|
|
|
data := TemplateData{
|
|
|
|
ConfDir: fmt.Sprintf("%s/nginx/hosts", config.Configuration.DataFolder),
|
|
|
|
DataDir: config.Configuration.DataFolder,
|
2022-11-08 00:03:45 +00:00
|
|
|
Host: h.GetTemplate(),
|
2023-01-04 05:36:56 +00:00
|
|
|
Certificate: certificateTemplate,
|
2022-07-21 08:02:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
filename := fmt.Sprintf("%s/host_%d.conf", data.ConfDir, h.ID)
|
|
|
|
|
|
|
|
// Write the config to disk
|
2023-01-04 05:36:56 +00:00
|
|
|
err := writeTemplate(filename, h.NginxTemplate.Template, data)
|
2022-07-21 08:02:07 +00:00
|
|
|
if err != nil {
|
|
|
|
// this configuration failed somehow
|
2023-01-04 05:36:56 +00:00
|
|
|
h.Status = status.StatusError
|
2022-07-21 08:02:07 +00:00
|
|
|
h.ErrorMessage = fmt.Sprintf("Template generation failed: %s", err.Error())
|
|
|
|
logger.Debug(h.ErrorMessage)
|
|
|
|
return h.Save(true)
|
|
|
|
}
|
2022-07-15 04:26:12 +00:00
|
|
|
|
|
|
|
// nolint: errcheck, gosec
|
2023-01-04 05:36:56 +00:00
|
|
|
if output, err := reloadNginx(); err != nil {
|
2022-07-21 08:02:07 +00:00
|
|
|
// reloading nginx failed, likely due to this host having a problem
|
2023-01-04 05:36:56 +00:00
|
|
|
h.Status = status.StatusError
|
|
|
|
h.ErrorMessage = fmt.Sprintf("Nginx configuation error: %s - %s", err.Error(), output)
|
2022-07-21 08:02:07 +00:00
|
|
|
writeConfigFile(filename, fmt.Sprintf("# %s", h.ErrorMessage))
|
|
|
|
logger.Debug(h.ErrorMessage)
|
|
|
|
} else {
|
|
|
|
// All good
|
2023-01-04 05:36:56 +00:00
|
|
|
h.Status = status.StatusOK
|
2022-07-21 08:02:07 +00:00
|
|
|
h.ErrorMessage = ""
|
|
|
|
logger.Debug("ConfigureHost OK: %+v", h)
|
|
|
|
}
|
|
|
|
|
|
|
|
return h.Save(true)
|
2022-07-15 04:26:12 +00:00
|
|
|
}
|
2023-01-04 05:36:56 +00:00
|
|
|
|
|
|
|
// ConfigureUpstream will attempt to write nginx conf and reload nginx
|
|
|
|
func ConfigureUpstream(u upstream.Model) error {
|
|
|
|
logger.Debug("ConfigureUpstream: %+v)", u)
|
|
|
|
|
|
|
|
// nolint: errcheck, gosec
|
|
|
|
u.Expand([]string{"nginxtemplate"})
|
|
|
|
|
|
|
|
data := TemplateData{
|
|
|
|
ConfDir: fmt.Sprintf("%s/nginx/upstreams", config.Configuration.DataFolder),
|
|
|
|
DataDir: config.Configuration.DataFolder,
|
|
|
|
Upstream: u,
|
|
|
|
}
|
|
|
|
|
|
|
|
filename := fmt.Sprintf("%s/upstream_%d.conf", data.ConfDir, u.ID)
|
|
|
|
|
|
|
|
// Write the config to disk
|
|
|
|
err := writeTemplate(filename, u.NginxTemplate.Template, data)
|
|
|
|
if err != nil {
|
|
|
|
// this configuration failed somehow
|
|
|
|
u.Status = status.StatusError
|
|
|
|
u.ErrorMessage = fmt.Sprintf("Template generation failed: %s", err.Error())
|
|
|
|
logger.Debug(u.ErrorMessage)
|
|
|
|
return u.Save(true)
|
|
|
|
}
|
|
|
|
|
|
|
|
// nolint: errcheck, gosec
|
|
|
|
if output, err := reloadNginx(); err != nil {
|
|
|
|
// reloading nginx failed, likely due to this host having a problem
|
|
|
|
u.Status = status.StatusError
|
|
|
|
u.ErrorMessage = fmt.Sprintf("Nginx configuation error: %s - %s", err.Error(), output)
|
|
|
|
writeConfigFile(filename, fmt.Sprintf("# %s", u.ErrorMessage))
|
|
|
|
logger.Debug(u.ErrorMessage)
|
|
|
|
} else {
|
|
|
|
// All good
|
|
|
|
u.Status = status.StatusOK
|
|
|
|
u.ErrorMessage = ""
|
|
|
|
logger.Debug("ConfigureUpstream OK: %+v", u)
|
|
|
|
}
|
|
|
|
|
|
|
|
return u.Save(true)
|
|
|
|
}
|