123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- package controllers
- import (
- "encoding/json"
- "errors"
- "fmt"
- "github.com/astaxie/beego/logs"
- "github.com/astaxie/beego/orm"
- config2 "nginx-ui/server/config"
- "nginx-ui/server/models"
- nginx2 "nginx-ui/server/nginx"
- "nginx-ui/server/utils"
- "os"
- "strings"
- "time"
- )
- type FileController struct {
- BaseController
- }
- func getRootDir() (string, error) {
- root := fmt.Sprintf("%s/files", config2.GetDataDir())
- if exist := utils.IsExist(root); exist != true {
- err := os.MkdirAll(root, 0777)
- if err != nil {
- return "", err
- }
- }
- return root, nil
- }
- // Get getAll
- func (c *FileController) Get() {
- fileName := c.GetString("filename")
- logs.Info("get file: {}", fileName)
- root, err := getRootDir()
- if err != nil {
- c.Ctx.Output.SetStatus(404)
- return
- }
- fromFile := fmt.Sprintf("%s/%s", root, fileName)
- c.Ctx.Output.Download(fromFile, fileName)
- }
- // Post file upload
- // POST /file
- func (c *FileController) Post() {
- f, header, err := c.GetFile("file")
- if err != nil {
- c.Ctx.Output.SetStatus(500)
- c.ErrorJson(err)
- return
- }
- var req models.FileReq
- err = c.ParseForm(&req)
- if err != nil {
- c.Ctx.Output.SetStatus(500)
- c.ErrorJson(err)
- return
- }
- defer f.Close()
- root, err := getRootDir()
- if err != nil {
- c.ErrorJson(err)
- return
- }
- if strings.HasPrefix(req.Path, "/") {
- req.Path = req.Path[1:len(req.Path)]
- }
- root = fmt.Sprintf("%s/%s", root, req.Key)
- index := strings.LastIndex(req.Path, "/")
- if index > 0 {
- subDir := req.Path[0:index]
- root = fmt.Sprintf("%s/%s", root, subDir)
- }
- if !utils.IsExist(root) {
- err = os.MkdirAll(root, 0777)
- }
- if err != nil {
- c.Ctx.Output.SetStatus(500)
- c.ErrorJson(err)
- return
- }
- toFile := fmt.Sprintf("%s/%s", root, header.Filename)
- err = c.SaveToFile("file", toFile)
- if err != nil {
- c.Ctx.Output.SetStatus(500)
- c.ErrorJson(err)
- return
- }
- c.setData(toFile).json()
- }
- // Deploy 部署到服务器
- // POST /nginx/:id/file/deploy
- func (c *FileController) Deploy() {
- nginx, err := c.CheckNginxPermission()
- if err != nil {
- return
- }
- logs.Info("deploy ", nginx.Id)
- var req models.DeployReq
- err = json.Unmarshal(c.Ctx.Input.RequestBody, &req)
- if err != nil {
- logs.Error(err, string(c.Ctx.Input.RequestBody))
- c.ErrorJson(err)
- return
- }
- if err != nil {
- c.ErrorJson(err)
- return
- }
- err = HandleDeploy(req)
- if err != nil {
- c.ErrorJson(err)
- return
- }
- c.json()
- }
- func HandleDeploy(req models.DeployReq) error {
- root, err := getRootDir()
- if err != nil {
- return err
- }
- root = fmt.Sprintf("%s/%s", root, req.Key)
- if !utils.IsExist(root) {
- logs.Warn("dir not exist: ", root)
- return errors.New("未上传文件或者文件已被删除!")
- }
- o := orm.NewOrm()
- nginx := models.Nginx{
- Id: req.NginxId,
- }
- err = o.Read(&nginx)
- if err != nil {
- return err
- }
- ins := nginx2.GetInstance(&nginx)
- dirs := ins.CheckDirs()
- if nginx.IsLocal {
- cmd := fmt.Sprintf("if [ ! -d %s ];then mkdir -p %s;fi && cp -r %s/* %s", req.Dir, req.Dir, root, req.Dir)
- _, err := ins.Run(cmd)
- return err
- }
- tarPath := fmt.Sprintf("%s.tar.gz", root)
- if !utils.IsExist(tarPath) {
- err = utils.TarXz(tarPath, root)
- if err != nil {
- return err
- }
- }
- timeNow := time.Now().Format("20060102150105")
- dst := fmt.Sprintf("%s/%s_%s.tar.gz", dirs.BackupDir, req.Key, timeNow)
- err = ins.SendFile(tarPath, dst)
- if err != nil {
- return err
- }
- cmd := fmt.Sprintf("if [ ! -d %s ];then mkdir -p %s;fi && tar -zxvf %s -C %s", req.Dir, req.Dir, dst, req.Dir)
- if req.Clear {
- cmd = fmt.Sprintf("rm -rf %s;%s", req.Dir, cmd)
- }
- _, err = ins.Run(cmd)
- if err != nil {
- return err
- }
- if len(req.Cmd) > 0 {
- _, err = ins.Run(req.Cmd)
- }
- if err != nil {
- return errors.New(fmt.Sprintf("部署已完成,命令执行异常:%s", err.Error()))
- }
- return nil
- }
- // Delete del certs
- func (c *FileController) Delete() {
- }
|