config.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package api
  2. import (
  3. "github.com/0xJacky/Nginx-UI/server/pkg/config_list"
  4. "github.com/0xJacky/Nginx-UI/server/pkg/nginx"
  5. "github.com/gin-gonic/gin"
  6. "log"
  7. "net/http"
  8. "os"
  9. "path/filepath"
  10. "strings"
  11. )
  12. func GetConfigs(c *gin.Context) {
  13. orderBy := c.Query("order_by")
  14. sort := c.DefaultQuery("sort", "desc")
  15. dir := c.DefaultQuery("dir", "/")
  16. mySort := map[string]string{
  17. "name": "string",
  18. "modify": "time",
  19. "is_dir": "bool",
  20. }
  21. configFiles, err := os.ReadDir(nginx.GetNginxConfPath(dir))
  22. if err != nil {
  23. ErrHandler(c, err)
  24. return
  25. }
  26. var configs []gin.H
  27. for i := range configFiles {
  28. file := configFiles[i]
  29. fileInfo, _ := file.Info()
  30. switch mode := fileInfo.Mode(); {
  31. case mode.IsRegular(): // regular file, not a hidden file
  32. if "." == file.Name()[0:1] {
  33. continue
  34. }
  35. case mode&os.ModeSymlink != 0: // is a symbol
  36. var targetPath string
  37. targetPath, err = os.Readlink(nginx.GetNginxConfPath(file.Name()))
  38. if err != nil {
  39. log.Println("GetConfigs Read Symlink Error", targetPath, err)
  40. continue
  41. }
  42. }
  43. configs = append(configs, gin.H{
  44. "name": file.Name(),
  45. "size": fileInfo.Size(),
  46. "modify": fileInfo.ModTime(),
  47. "is_dir": file.IsDir(),
  48. })
  49. }
  50. configs = config_list.Sort(orderBy, sort, mySort[orderBy], configs)
  51. c.JSON(http.StatusOK, gin.H{
  52. "data": configs,
  53. })
  54. }
  55. func GetConfig(c *gin.Context) {
  56. name := c.Param("name")
  57. path := filepath.Join(nginx.GetNginxConfPath("/"), name)
  58. content, err := os.ReadFile(path)
  59. if err != nil {
  60. ErrHandler(c, err)
  61. return
  62. }
  63. c.JSON(http.StatusOK, gin.H{
  64. "config": string(content),
  65. })
  66. }
  67. type AddConfigJson struct {
  68. Name string `json:"name" binding:"required"`
  69. Content string `json:"content" binding:"required"`
  70. }
  71. func AddConfig(c *gin.Context) {
  72. var request AddConfigJson
  73. err := c.BindJSON(&request)
  74. if err != nil {
  75. ErrHandler(c, err)
  76. return
  77. }
  78. name := request.Name
  79. content := request.Content
  80. path := filepath.Join(nginx.GetNginxConfPath("/"), name)
  81. if _, err = os.Stat(path); err == nil {
  82. c.JSON(http.StatusNotAcceptable, gin.H{
  83. "message": "config exist",
  84. })
  85. return
  86. }
  87. if content != "" {
  88. err = os.WriteFile(path, []byte(content), 0644)
  89. if err != nil {
  90. ErrHandler(c, err)
  91. return
  92. }
  93. }
  94. output := nginx.ReloadNginx()
  95. if output != "" && strings.Contains(output, "error") {
  96. c.JSON(http.StatusInternalServerError, gin.H{
  97. "message": output,
  98. })
  99. return
  100. }
  101. c.JSON(http.StatusOK, gin.H{
  102. "name": name,
  103. "content": content,
  104. })
  105. }
  106. type EditConfigJson struct {
  107. Content string `json:"content" binding:"required"`
  108. }
  109. func EditConfig(c *gin.Context) {
  110. name := c.Param("name")
  111. var request EditConfigJson
  112. err := c.BindJSON(&request)
  113. if err != nil {
  114. ErrHandler(c, err)
  115. return
  116. }
  117. path := filepath.Join(nginx.GetNginxConfPath("/"), name)
  118. content := request.Content
  119. origContent, err := os.ReadFile(path)
  120. if err != nil {
  121. ErrHandler(c, err)
  122. return
  123. }
  124. if content != "" && content != string(origContent) {
  125. // model.CreateBackup(path)
  126. err = os.WriteFile(path, []byte(content), 0644)
  127. if err != nil {
  128. ErrHandler(c, err)
  129. return
  130. }
  131. }
  132. output := nginx.ReloadNginx()
  133. if output != "" && strings.Contains(output, "error") {
  134. c.JSON(http.StatusInternalServerError, gin.H{
  135. "message": output,
  136. })
  137. return
  138. }
  139. GetConfig(c)
  140. }