file.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. package nginx_controller
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "github.com/astaxie/beego/logs"
  7. "github.com/astaxie/beego/orm"
  8. config2 "nginx-ui/server/config"
  9. "nginx-ui/server/models"
  10. nginx2 "nginx-ui/server/nginx"
  11. "nginx-ui/server/utils"
  12. "os"
  13. "strings"
  14. "time"
  15. )
  16. type FileController struct {
  17. BaseController
  18. }
  19. func getRootDir() (string, error) {
  20. root := fmt.Sprintf("%s/files", config2.GetDataDir())
  21. if exist := utils.IsExist(root); exist != true {
  22. err := os.MkdirAll(root, 0777)
  23. if err != nil {
  24. return "", err
  25. }
  26. }
  27. return root, nil
  28. }
  29. // Get getAll
  30. func (c *FileController) Get() {
  31. fileName := c.GetString("filename")
  32. logs.Info("get file: {}", fileName)
  33. root, err := getRootDir()
  34. if err != nil {
  35. c.Ctx.Output.SetStatus(404)
  36. return
  37. }
  38. fromFile := fmt.Sprintf("%s/%s", root, fileName)
  39. c.Ctx.Output.Download(fromFile, fileName)
  40. }
  41. // Post file upload
  42. // POST /file
  43. func (c *FileController) Post() {
  44. f, header, err := c.GetFile("file")
  45. if err != nil {
  46. c.Ctx.Output.SetStatus(500)
  47. c.ErrorJson(err)
  48. return
  49. }
  50. var req models.FileReq
  51. err = c.ParseForm(&req)
  52. if err != nil {
  53. c.Ctx.Output.SetStatus(500)
  54. c.ErrorJson(err)
  55. return
  56. }
  57. defer f.Close()
  58. root, err := getRootDir()
  59. if err != nil {
  60. c.ErrorJson(err)
  61. return
  62. }
  63. if strings.HasPrefix(req.Path, "/") {
  64. req.Path = req.Path[1:len(req.Path)]
  65. }
  66. root = fmt.Sprintf("%s/%s", root, req.Key)
  67. index := strings.LastIndex(req.Path, "/")
  68. if index > 0 {
  69. subDir := req.Path[0:index]
  70. root = fmt.Sprintf("%s/%s", root, subDir)
  71. }
  72. if !utils.IsExist(root) {
  73. err = os.MkdirAll(root, 0777)
  74. }
  75. if err != nil {
  76. c.Ctx.Output.SetStatus(500)
  77. c.ErrorJson(err)
  78. return
  79. }
  80. toFile := fmt.Sprintf("%s/%s", root, header.Filename)
  81. err = c.SaveToFile("file", toFile)
  82. if err != nil {
  83. c.Ctx.Output.SetStatus(500)
  84. c.ErrorJson(err)
  85. return
  86. }
  87. c.SetData(toFile).Json()
  88. }
  89. // Deploy 部署到服务器
  90. // POST /nginx/:id/file/deploy
  91. func (c *FileController) Deploy() {
  92. nginx, err := c.CheckNginxPermission()
  93. if err != nil {
  94. return
  95. }
  96. logs.Info("deploy ", nginx.Id)
  97. var req models.DeployReq
  98. err = json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  99. if err != nil {
  100. logs.Error(err, string(c.Ctx.Input.RequestBody))
  101. c.ErrorJson(err)
  102. return
  103. }
  104. if err != nil {
  105. c.ErrorJson(err)
  106. return
  107. }
  108. err = HandleDeploy(req)
  109. if err != nil {
  110. c.ErrorJson(err)
  111. return
  112. }
  113. c.Json()
  114. }
  115. // Download 下载文件
  116. // GET /file/:id/file/:fileName
  117. func (c *FileController) Download() {
  118. fileName := c.Ctx.Input.Param("fileName")
  119. nginxId := c.Ctx.Input.Param("nginxId")
  120. logs.Info("download file: {} for nginxId: {}", fileName, nginxId)
  121. root, err := getRootDir()
  122. if err != nil {
  123. logs.Warn("getRootDir fail: %v", err)
  124. c.ErrorJson(err)
  125. return
  126. }
  127. filePath := fmt.Sprintf("%s/%s", root, fileName)
  128. if !utils.IsExist(filePath) {
  129. logs.Warn("dir not exist: ", root)
  130. c.ErrorJson(errors.New("未上传文件或者文件已被删除!"))
  131. }
  132. c.Ctx.Output.Download(filePath, fileName)
  133. }
  134. func HandleDeploy(req models.DeployReq) error {
  135. root, err := getRootDir()
  136. if err != nil {
  137. return err
  138. }
  139. root = fmt.Sprintf("%s/%s", root, req.Key)
  140. if !utils.IsExist(root) {
  141. logs.Warn("dir not exist: ", root)
  142. return errors.New("未上传文件或者文件已被删除!")
  143. }
  144. o := orm.NewOrm()
  145. nginx := models.Nginx{
  146. Id: req.NginxId,
  147. }
  148. err = o.Read(&nginx)
  149. if err != nil {
  150. return err
  151. }
  152. ins := nginx2.GetInstance(&nginx)
  153. dirs := ins.CheckDirs()
  154. if nginx.IsLocal {
  155. cmd := fmt.Sprintf("if [ ! -d %s ];then mkdir -p %s;fi && cp -r %s/* %s", req.Dir, req.Dir, root, req.Dir)
  156. _, err := ins.Run(cmd)
  157. return err
  158. }
  159. tarPath := fmt.Sprintf("%s.tar.gz", root)
  160. if !utils.IsExist(tarPath) {
  161. err = utils.TarXz(tarPath, root)
  162. if err != nil {
  163. return err
  164. }
  165. }
  166. timeNow := time.Now().Format("20060102150105")
  167. dst := fmt.Sprintf("%s/%s_%s.tar.gz", dirs.BackupDir, req.Key, timeNow)
  168. err = ins.SendFile(tarPath, dst)
  169. if err != nil {
  170. return err
  171. }
  172. cmd := fmt.Sprintf("if [ ! -d %s ];then mkdir -p %s;fi && tar -zxvf %s -C %s", req.Dir, req.Dir, dst, req.Dir)
  173. if req.Clear {
  174. cmd = fmt.Sprintf("rm -rf %s;%s", req.Dir, cmd)
  175. }
  176. _, err = ins.Run(cmd)
  177. if err != nil {
  178. return err
  179. }
  180. if len(req.Cmd) > 0 {
  181. _, err = ins.Run(req.Cmd)
  182. }
  183. if err != nil {
  184. return errors.New(fmt.Sprintf("部署已完成,命令执行异常:%s", err.Error()))
  185. }
  186. return nil
  187. }
  188. // Delete del certs
  189. func (c *FileController) Delete() {
  190. }