file.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "github.com/astaxie/beego/logs"
  7. "github.com/astaxie/beego/orm"
  8. "os"
  9. config2 "server/config"
  10. "server/models"
  11. nginx2 "server/nginx"
  12. "server/utils"
  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 save certs
  42. func (c *FileController) Post() {
  43. f, header, err := c.GetFile("file")
  44. if err != nil {
  45. c.Ctx.Output.SetStatus(500)
  46. c.ErrorJson(err)
  47. return
  48. }
  49. var req models.FileReq
  50. err = c.ParseForm(&req)
  51. if err != nil {
  52. c.Ctx.Output.SetStatus(500)
  53. c.ErrorJson(err)
  54. return
  55. }
  56. defer f.Close()
  57. root, err := getRootDir()
  58. if err != nil {
  59. c.ErrorJson(err)
  60. return
  61. }
  62. if strings.HasPrefix(req.Path, "/") {
  63. req.Path = req.Path[1:len(req.Path)]
  64. }
  65. root = fmt.Sprintf("%s/%s", root, req.Key)
  66. index := strings.LastIndex(req.Path, "/")
  67. if index > 0 {
  68. subDir := req.Path[0:index]
  69. root = fmt.Sprintf("%s/%s", root, subDir)
  70. }
  71. if !utils.IsExist(root) {
  72. err = os.MkdirAll(root, 0777)
  73. }
  74. if err != nil {
  75. c.Ctx.Output.SetStatus(500)
  76. c.ErrorJson(err)
  77. return
  78. }
  79. toFile := fmt.Sprintf("%s/%s", root, header.Filename)
  80. err = c.SaveToFile("file", toFile)
  81. if err != nil {
  82. c.Ctx.Output.SetStatus(500)
  83. c.ErrorJson(err)
  84. return
  85. }
  86. c.setData(toFile).json()
  87. }
  88. // Deploy 部署到服务器
  89. func (c *FileController) Deploy() {
  90. var req models.DeployReq
  91. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  92. if err != nil {
  93. logs.Error(err, string(c.Ctx.Input.RequestBody))
  94. c.ErrorJson(err)
  95. return
  96. }
  97. if err != nil {
  98. c.ErrorJson(err)
  99. return
  100. }
  101. err = HandleDeploy(req)
  102. if err != nil {
  103. c.ErrorJson(err)
  104. return
  105. }
  106. c.json()
  107. }
  108. func HandleDeploy(req models.DeployReq) error {
  109. root, err := getRootDir()
  110. if err != nil {
  111. return err
  112. }
  113. root = fmt.Sprintf("%s/%s", root, req.Key)
  114. if !utils.IsExist(root) {
  115. logs.Warn("dir not exist: ", root)
  116. return errors.New("未上传文件或者文件已被删除!")
  117. }
  118. o := orm.NewOrm()
  119. nginx := models.Nginx{
  120. Id: req.NginxId,
  121. }
  122. err = o.Read(&nginx)
  123. if err != nil {
  124. return err
  125. }
  126. ins := nginx2.GetInstance(&nginx)
  127. dirs := ins.CheckDirs()
  128. if nginx.IsLocal {
  129. cmd := fmt.Sprintf("if [ ! -d %s ];then mkdir -p %s;fi && cp -r %s/* %s", req.Dir, req.Dir, root, req.Dir)
  130. _, err := ins.Run(cmd)
  131. return err
  132. }
  133. tarPath := fmt.Sprintf("%s.tar.gz", root)
  134. if !utils.IsExist(tarPath) {
  135. err = utils.TarXz(tarPath, root)
  136. if err != nil {
  137. return err
  138. }
  139. }
  140. timeNow := time.Now().Format("20060102150105")
  141. dst := fmt.Sprintf("%s/%s_%s.tar.gz", dirs.BackupDir, req.Key, timeNow)
  142. err = ins.SendFile(tarPath, dst)
  143. if err != nil {
  144. return err
  145. }
  146. cmd := fmt.Sprintf("if [ ! -d %s ];then mkdir -p %s;fi && tar -zxvf %s -C %s", req.Dir, req.Dir, dst, req.Dir)
  147. if req.Clear {
  148. cmd = fmt.Sprintf("rm -rf %s;%s", req.Dir, cmd)
  149. }
  150. _, err = ins.Run(cmd)
  151. if err != nil {
  152. return err
  153. }
  154. return nil
  155. }
  156. // Delete del certs
  157. func (c *FileController) Delete() {
  158. }