domain.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. package api
  2. import (
  3. "github.com/0xJacky/Nginx-UI/server/model"
  4. "github.com/0xJacky/Nginx-UI/server/tool"
  5. "github.com/0xJacky/Nginx-UI/server/tool/nginx"
  6. "github.com/gin-gonic/gin"
  7. "io/ioutil"
  8. "net/http"
  9. "os"
  10. "path/filepath"
  11. )
  12. func GetDomains(c *gin.Context) {
  13. orderBy := c.Query("order_by")
  14. sort := c.DefaultQuery("sort", "desc")
  15. mySort := map[string]string{
  16. "enabled": "bool",
  17. "name": "string",
  18. "modify": "time",
  19. }
  20. configFiles, err := ioutil.ReadDir(nginx.GetNginxConfPath("sites-available"))
  21. if err != nil {
  22. ErrHandler(c, err)
  23. return
  24. }
  25. enabledConfig, err := ioutil.ReadDir(filepath.Join(nginx.GetNginxConfPath("sites-enabled")))
  26. if err != nil {
  27. ErrHandler(c, err)
  28. return
  29. }
  30. enabledConfigMap := make(map[string]bool)
  31. for i := range enabledConfig {
  32. enabledConfigMap[enabledConfig[i].Name()] = true
  33. }
  34. var configs []gin.H
  35. for i := range configFiles {
  36. file := configFiles[i]
  37. if !file.IsDir() {
  38. configs = append(configs, gin.H{
  39. "name": file.Name(),
  40. "size": file.Size(),
  41. "modify": file.ModTime(),
  42. "enabled": enabledConfigMap[file.Name()],
  43. })
  44. }
  45. }
  46. configs = tool.Sort(orderBy, sort, mySort[orderBy], configs)
  47. c.JSON(http.StatusOK, gin.H{
  48. "configs": configs,
  49. })
  50. }
  51. func GetDomain(c *gin.Context) {
  52. name := c.Param("name")
  53. path := filepath.Join(nginx.GetNginxConfPath("sites-available"), name)
  54. enabled := true
  55. if _, err := os.Stat(filepath.Join(nginx.GetNginxConfPath("sites-enabled"), name)); os.IsNotExist(err) {
  56. enabled = false
  57. }
  58. content, err := ioutil.ReadFile(path)
  59. if err != nil {
  60. if os.IsNotExist(err) {
  61. c.JSON(http.StatusNotFound, gin.H{
  62. "message": err.Error(),
  63. })
  64. return
  65. }
  66. ErrHandler(c, err)
  67. return
  68. }
  69. _, err = model.FirstCert(name)
  70. c.JSON(http.StatusOK, gin.H{
  71. "enabled": enabled,
  72. "name": name,
  73. "config": string(content),
  74. "auto_cert": err == nil,
  75. })
  76. }
  77. func EditDomain(c *gin.Context) {
  78. var err error
  79. name := c.Param("name")
  80. request := make(gin.H)
  81. err = c.BindJSON(&request)
  82. path := filepath.Join(nginx.GetNginxConfPath("sites-available"), name)
  83. err = ioutil.WriteFile(path, []byte(request["content"].(string)), 0644)
  84. if err != nil {
  85. ErrHandler(c, err)
  86. return
  87. }
  88. enabledConfigFilePath := filepath.Join(nginx.GetNginxConfPath("sites-enabled"), name)
  89. if _, err = os.Stat(enabledConfigFilePath); err == nil {
  90. // 测试配置文件
  91. err = nginx.TestNginxConf()
  92. if err != nil {
  93. c.JSON(http.StatusInternalServerError, gin.H{
  94. "message": err.Error(),
  95. })
  96. return
  97. }
  98. output := nginx.ReloadNginx()
  99. if output != "" {
  100. c.JSON(http.StatusInternalServerError, gin.H{
  101. "message": output,
  102. })
  103. return
  104. }
  105. }
  106. GetDomain(c)
  107. }
  108. func EnableDomain(c *gin.Context) {
  109. configFilePath := filepath.Join(nginx.GetNginxConfPath("sites-available"), c.Param("name"))
  110. enabledConfigFilePath := filepath.Join(nginx.GetNginxConfPath("sites-enabled"), c.Param("name"))
  111. _, err := os.Stat(configFilePath)
  112. if err != nil {
  113. ErrHandler(c, err)
  114. return
  115. }
  116. err = os.Symlink(configFilePath, enabledConfigFilePath)
  117. if err != nil {
  118. ErrHandler(c, err)
  119. return
  120. }
  121. // 测试配置文件,不通过则撤回启用
  122. err = nginx.TestNginxConf()
  123. if err != nil {
  124. _ = os.Remove(enabledConfigFilePath)
  125. c.JSON(http.StatusInternalServerError, gin.H{
  126. "message": err.Error(),
  127. })
  128. return
  129. }
  130. output := nginx.ReloadNginx()
  131. if output != "" {
  132. c.JSON(http.StatusInternalServerError, gin.H{
  133. "message": output,
  134. })
  135. return
  136. }
  137. c.JSON(http.StatusOK, gin.H{
  138. "message": "ok",
  139. })
  140. }
  141. func DisableDomain(c *gin.Context) {
  142. enabledConfigFilePath := filepath.Join(nginx.GetNginxConfPath("sites-enabled"), c.Param("name"))
  143. _, err := os.Stat(enabledConfigFilePath)
  144. if err != nil {
  145. ErrHandler(c, err)
  146. return
  147. }
  148. err = os.Remove(enabledConfigFilePath)
  149. if err != nil {
  150. ErrHandler(c, err)
  151. return
  152. }
  153. // delete auto cert record
  154. cert := model.Cert{Domain: c.Param("name")}
  155. err = cert.Remove()
  156. if err != nil {
  157. ErrHandler(c, err)
  158. return
  159. }
  160. output := nginx.ReloadNginx()
  161. if output != "" {
  162. c.JSON(http.StatusInternalServerError, gin.H{
  163. "message": output,
  164. })
  165. return
  166. }
  167. c.JSON(http.StatusOK, gin.H{
  168. "message": "ok",
  169. })
  170. }
  171. func DeleteDomain(c *gin.Context) {
  172. var err error
  173. name := c.Param("name")
  174. availablePath := filepath.Join(nginx.GetNginxConfPath("sites-available"), name)
  175. enabledPath := filepath.Join(nginx.GetNginxConfPath("sites-enabled"), name)
  176. if _, err = os.Stat(availablePath); os.IsNotExist(err) {
  177. c.JSON(http.StatusNotFound, gin.H{
  178. "message": "site not found",
  179. })
  180. return
  181. }
  182. if _, err = os.Stat(enabledPath); err == nil {
  183. c.JSON(http.StatusNotAcceptable, gin.H{
  184. "message": "site is enabled",
  185. })
  186. return
  187. }
  188. cert := model.Cert{Domain: name}
  189. _ = cert.Remove()
  190. err = os.Remove(availablePath)
  191. if err != nil {
  192. ErrHandler(c, err)
  193. return
  194. }
  195. c.JSON(http.StatusOK, gin.H{
  196. "message": "ok",
  197. })
  198. }
  199. func AddDomainToAutoCert(c *gin.Context) {
  200. domain := c.Param("domain")
  201. cert, err := model.FirstOrCreateCert(domain)
  202. if err != nil {
  203. ErrHandler(c, err)
  204. return
  205. }
  206. c.JSON(http.StatusOK, cert)
  207. }
  208. func RemoveDomainFromAutoCert(c *gin.Context) {
  209. cert := model.Cert{
  210. Domain: c.Param("domain"),
  211. }
  212. err := cert.Remove()
  213. if err != nil {
  214. ErrHandler(c, err)
  215. return
  216. }
  217. c.JSON(http.StatusOK, nil)
  218. }