|
@@ -3,8 +3,8 @@ package sites
|
|
|
import (
|
|
|
"github.com/0xJacky/Nginx-UI/api"
|
|
|
"github.com/0xJacky/Nginx-UI/internal/cert"
|
|
|
- "github.com/0xJacky/Nginx-UI/internal/helper"
|
|
|
"github.com/0xJacky/Nginx-UI/internal/nginx"
|
|
|
+ "github.com/0xJacky/Nginx-UI/internal/site"
|
|
|
"github.com/0xJacky/Nginx-UI/model"
|
|
|
"github.com/0xJacky/Nginx-UI/query"
|
|
|
"github.com/gin-gonic/gin"
|
|
@@ -17,14 +17,8 @@ import (
|
|
|
)
|
|
|
|
|
|
func GetSite(c *gin.Context) {
|
|
|
- rewriteName, ok := c.Get("rewriteConfigFileName")
|
|
|
name := c.Param("name")
|
|
|
|
|
|
- // for modify filename
|
|
|
- if ok {
|
|
|
- name = rewriteName.(string)
|
|
|
- }
|
|
|
-
|
|
|
path := nginx.GetConfPath("sites-available", name)
|
|
|
file, err := os.Stat(path)
|
|
|
if os.IsNotExist(err) {
|
|
@@ -51,7 +45,7 @@ func GetSite(c *gin.Context) {
|
|
|
}
|
|
|
|
|
|
s := query.Site
|
|
|
- site, err := s.Where(s.Path.Eq(path)).FirstOrCreate()
|
|
|
+ siteModel, err := s.Where(s.Path.Eq(path)).FirstOrCreate()
|
|
|
if err != nil {
|
|
|
api.ErrHandler(c, err)
|
|
|
return
|
|
@@ -62,7 +56,7 @@ func GetSite(c *gin.Context) {
|
|
|
logger.Warn(err)
|
|
|
}
|
|
|
|
|
|
- if site.Advanced {
|
|
|
+ if siteModel.Advanced {
|
|
|
origContent, err := os.ReadFile(path)
|
|
|
if err != nil {
|
|
|
api.ErrHandler(c, err)
|
|
@@ -71,7 +65,7 @@ func GetSite(c *gin.Context) {
|
|
|
|
|
|
c.JSON(http.StatusOK, Site{
|
|
|
ModifiedAt: file.ModTime(),
|
|
|
- Site: site,
|
|
|
+ Site: siteModel,
|
|
|
Enabled: enabled,
|
|
|
Name: name,
|
|
|
Config: string(origContent),
|
|
@@ -103,8 +97,8 @@ func GetSite(c *gin.Context) {
|
|
|
}
|
|
|
|
|
|
c.JSON(http.StatusOK, Site{
|
|
|
+ Site: siteModel,
|
|
|
ModifiedAt: file.ModTime(),
|
|
|
- Site: site,
|
|
|
Enabled: enabled,
|
|
|
Name: name,
|
|
|
Config: nginxConfig.FmtCode(),
|
|
@@ -119,15 +113,7 @@ func GetSite(c *gin.Context) {
|
|
|
func SaveSite(c *gin.Context) {
|
|
|
name := c.Param("name")
|
|
|
|
|
|
- if name == "" {
|
|
|
- c.JSON(http.StatusNotAcceptable, gin.H{
|
|
|
- "message": "param name is empty",
|
|
|
- })
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
var json struct {
|
|
|
- Name string `json:"name" binding:"required"`
|
|
|
Content string `json:"content" binding:"required"`
|
|
|
SiteCategoryID uint64 `json:"site_category_id"`
|
|
|
SyncNodeIDs []uint64 `json:"sync_node_ids"`
|
|
@@ -138,129 +124,27 @@ func SaveSite(c *gin.Context) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- path := nginx.GetConfPath("sites-available", name)
|
|
|
-
|
|
|
- if !json.Overwrite && helper.FileExists(path) {
|
|
|
- c.JSON(http.StatusNotAcceptable, gin.H{
|
|
|
- "message": "File exists",
|
|
|
- })
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- err := os.WriteFile(path, []byte(json.Content), 0644)
|
|
|
+ err := site.Save(name, json.Content, json.Overwrite, json.SiteCategoryID, json.SyncNodeIDs)
|
|
|
if err != nil {
|
|
|
api.ErrHandler(c, err)
|
|
|
return
|
|
|
}
|
|
|
- enabledConfigFilePath := nginx.GetConfPath("sites-enabled", name)
|
|
|
- s := query.Site
|
|
|
-
|
|
|
- _, err = s.Where(s.Path.Eq(path)).
|
|
|
- Select(s.SiteCategoryID, s.SyncNodeIDs).
|
|
|
- Updates(&model.Site{
|
|
|
- SiteCategoryID: json.SiteCategoryID,
|
|
|
- SyncNodeIDs: json.SyncNodeIDs,
|
|
|
- })
|
|
|
- if err != nil {
|
|
|
- api.ErrHandler(c, err)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- // rename the config file if needed
|
|
|
- if name != json.Name {
|
|
|
- newPath := nginx.GetConfPath("sites-available", json.Name)
|
|
|
- _, _ = s.Where(s.Path.Eq(path)).Update(s.Path, newPath)
|
|
|
-
|
|
|
- // check if dst file exists, do not rename
|
|
|
- if helper.FileExists(newPath) {
|
|
|
- c.JSON(http.StatusNotAcceptable, gin.H{
|
|
|
- "message": "File exists",
|
|
|
- })
|
|
|
- return
|
|
|
- }
|
|
|
- // recreate a soft link
|
|
|
- if helper.FileExists(enabledConfigFilePath) {
|
|
|
- _ = os.Remove(enabledConfigFilePath)
|
|
|
- enabledConfigFilePath = nginx.GetConfPath("sites-enabled", json.Name)
|
|
|
- err = os.Symlink(newPath, enabledConfigFilePath)
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- api.ErrHandler(c, err)
|
|
|
- return
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- err = os.Rename(path, newPath)
|
|
|
- if err != nil {
|
|
|
- api.ErrHandler(c, err)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- name = json.Name
|
|
|
- c.Set("rewriteConfigFileName", name)
|
|
|
- }
|
|
|
-
|
|
|
- enabledConfigFilePath = nginx.GetConfPath("sites-enabled", name)
|
|
|
- if helper.FileExists(enabledConfigFilePath) {
|
|
|
- // Test nginx configuration
|
|
|
- output := nginx.TestConf()
|
|
|
-
|
|
|
- if nginx.GetLogLevel(output) > nginx.Warn {
|
|
|
- c.JSON(http.StatusInternalServerError, gin.H{
|
|
|
- "message": output,
|
|
|
- })
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- output = nginx.Reload()
|
|
|
-
|
|
|
- if nginx.GetLogLevel(output) > nginx.Warn {
|
|
|
- c.JSON(http.StatusInternalServerError, gin.H{
|
|
|
- "message": output,
|
|
|
- })
|
|
|
- return
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
GetSite(c)
|
|
|
}
|
|
|
|
|
|
-func EnableSite(c *gin.Context) {
|
|
|
- configFilePath := nginx.GetConfPath("sites-available", c.Param("name"))
|
|
|
- enabledConfigFilePath := nginx.GetConfPath("sites-enabled", c.Param("name"))
|
|
|
-
|
|
|
- _, err := os.Stat(configFilePath)
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- api.ErrHandler(c, err)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- if _, err = os.Stat(enabledConfigFilePath); os.IsNotExist(err) {
|
|
|
- err = os.Symlink(configFilePath, enabledConfigFilePath)
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- api.ErrHandler(c, err)
|
|
|
- return
|
|
|
- }
|
|
|
+func RenameSite(c *gin.Context) {
|
|
|
+ oldName := c.Param("name")
|
|
|
+ var json struct {
|
|
|
+ NewName string `json:"new_name"`
|
|
|
}
|
|
|
-
|
|
|
- // Test nginx config, if not pass, then disable the site.
|
|
|
- output := nginx.TestConf()
|
|
|
- if nginx.GetLogLevel(output) > nginx.Warn {
|
|
|
- _ = os.Remove(enabledConfigFilePath)
|
|
|
- c.JSON(http.StatusInternalServerError, gin.H{
|
|
|
- "message": output,
|
|
|
- })
|
|
|
+ if !cosy.BindAndValid(c, &json) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- output = nginx.Reload()
|
|
|
-
|
|
|
- if nginx.GetLogLevel(output) > nginx.Warn {
|
|
|
- c.JSON(http.StatusInternalServerError, gin.H{
|
|
|
- "message": output,
|
|
|
- })
|
|
|
+ err := site.Rename(oldName, json.NewName)
|
|
|
+ if err != nil {
|
|
|
+ api.ErrHandler(c, err)
|
|
|
return
|
|
|
}
|
|
|
|
|
@@ -269,72 +153,32 @@ func EnableSite(c *gin.Context) {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
-func DisableSite(c *gin.Context) {
|
|
|
- enabledConfigFilePath := nginx.GetConfPath("sites-enabled", c.Param("name"))
|
|
|
- _, err := os.Stat(enabledConfigFilePath)
|
|
|
+func EnableSite(c *gin.Context) {
|
|
|
+ err := site.Enable(c.Param("name"))
|
|
|
if err != nil {
|
|
|
api.ErrHandler(c, err)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- err = os.Remove(enabledConfigFilePath)
|
|
|
- if err != nil {
|
|
|
- api.ErrHandler(c, err)
|
|
|
- return
|
|
|
- }
|
|
|
+ c.JSON(http.StatusOK, gin.H{
|
|
|
+ "message": "ok",
|
|
|
+ })
|
|
|
+}
|
|
|
|
|
|
- // delete auto cert record
|
|
|
- certModel := model.Cert{Filename: c.Param("name")}
|
|
|
- err = certModel.Remove()
|
|
|
+func DisableSite(c *gin.Context) {
|
|
|
+ err := site.Disable(c.Param("name"))
|
|
|
if err != nil {
|
|
|
api.ErrHandler(c, err)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- output := nginx.Reload()
|
|
|
- if nginx.GetLogLevel(output) > nginx.Warn {
|
|
|
- c.JSON(http.StatusInternalServerError, gin.H{
|
|
|
- "message": output,
|
|
|
- })
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
|
"message": "ok",
|
|
|
})
|
|
|
}
|
|
|
|
|
|
func DeleteSite(c *gin.Context) {
|
|
|
- var err error
|
|
|
- name := c.Param("name")
|
|
|
- availablePath := nginx.GetConfPath("sites-available", name)
|
|
|
-
|
|
|
- s := query.Site
|
|
|
- _, err = s.Where(s.Path.Eq(availablePath)).Unscoped().Delete(&model.Site{})
|
|
|
- if err != nil {
|
|
|
- api.ErrHandler(c, err)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- enabledPath := nginx.GetConfPath("sites-enabled", name)
|
|
|
- if _, err = os.Stat(availablePath); os.IsNotExist(err) {
|
|
|
- c.JSON(http.StatusNotFound, gin.H{
|
|
|
- "message": "site not found",
|
|
|
- })
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- if _, err = os.Stat(enabledPath); err == nil {
|
|
|
- c.JSON(http.StatusNotAcceptable, gin.H{
|
|
|
- "message": "site is enabled",
|
|
|
- })
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- certModel := model.Cert{Filename: name}
|
|
|
- _ = certModel.Remove()
|
|
|
-
|
|
|
- err = os.Remove(availablePath)
|
|
|
+ err := site.Delete(c.Param("name"))
|
|
|
if err != nil {
|
|
|
api.ErrHandler(c, err)
|
|
|
return
|