瀏覽代碼

feat: 增加文件上传后的cmd 和日志获取的接口

tuon 1 年之前
父節點
當前提交
f6f6a4f1aa
共有 4 個文件被更改,包括 87 次插入17 次删除
  1. 7 1
      server/controllers/file.go
  2. 52 0
      server/controllers/logger.go
  3. 27 16
      server/models/file.go
  4. 1 0
      server/routers/router.go

+ 7 - 1
server/controllers/file.go

@@ -44,7 +44,7 @@ func (c *FileController) Get() {
 	c.Ctx.Output.Download(fromFile, fileName)
 }
 
-// Post 文件长传
+// Post file upload
 // POST /file
 func (c *FileController) Post() {
 	f, header, err := c.GetFile("file")
@@ -171,6 +171,12 @@ func HandleDeploy(req models.DeployReq) error {
 	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
 }
 

+ 52 - 0
server/controllers/logger.go

@@ -0,0 +1,52 @@
+package controllers
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/astaxie/beego/logs"
+	"server/models"
+	nginx2 "server/nginx"
+)
+
+type LoggerController struct {
+	BaseController
+}
+
+// Post file upload
+// POST /file
+func (c *LoggerController) Post() {
+	nginx, err := c.CheckNginxPermission()
+	if err != nil {
+		return
+	}
+	logs.Info("get ", nginx.Id)
+	var req models.LoggerReq
+	err = json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		logs.Error(err, string(c.Ctx.Input.RequestBody))
+		c.ErrorJson(err)
+		return
+	}
+	if req.MaxLines <= 0 {
+		req.MaxLines = 1000
+	}
+
+	var cmd = fmt.Sprintf("cat %s", req.FileName)
+	if req.End <= 0 {
+		cmd = fmt.Sprintf("%s | head -n %d", cmd, req.MaxLines)
+	} else if req.Start >= 0 {
+		cmd = fmt.Sprintf("%s | head -n %d | tail -n +%d", cmd, req.End, req.Start)
+	} else {
+		cmd = fmt.Sprintf("%s | tail -n %d", cmd, req.MaxLines)
+	}
+	logs.Info("get logs cmd: ", cmd)
+
+	ins := nginx2.GetInstance(nginx)
+
+	resp, err := ins.Run(cmd)
+	if err != nil {
+		c.ErrorJson(err)
+		return
+	}
+	c.setData(resp).json()
+}

+ 27 - 16
server/models/file.go

@@ -1,16 +1,27 @@
-package models
-
-type FileReq struct {
-	Path string `json:"path"`
-	Key  string `json:"key"`
-}
-
-type DeployReq struct {
-	// 已上传的文件夹根目录
-	Key     string `json:"key"`
-	NginxId int    `json:"nginxId"`
-	// 部署目录
-	Dir string `json:"dir"`
-	// 是否先清空文件夹,再部署
-	Clear bool `json:"clear"`
-}
+package models
+
+type FileReq struct {
+	Path string `json:"path"`
+	Key  string `json:"key"`
+}
+
+type DeployReq struct {
+	// 已上传的文件夹根目录
+	Key     string `json:"key"`
+	NginxId int    `json:"nginxId"`
+	// 部署目录
+	Dir string `json:"dir"`
+	// 是否先清空文件夹,再部署
+	Clear bool `json:"clear"`
+	// 文件上传后执行后置命令,适用于简单的部署
+	Cmd string `json:"cmd"`
+}
+
+type LoggerReq struct {
+	Start int `json:"start"`
+	End   int `json:"end"`
+	// 文件的绝对路径
+	FileName string `json:"fileName"`
+	// 最大显示行数
+	MaxLines int `json:"maxLines"`
+}

+ 1 - 0
server/routers/router.go

@@ -33,6 +33,7 @@ func init() {
 		// file upload download
 		beego.NSRouter("/nginx/:id/file/deploy", &controllers.FileController{}, "post:Deploy"),
 		beego.NSRouter("/file", &controllers.FileController{}),
+		beego.NSRouter("/logger", &controllers.LoggerController{}),
 
 		beego.NSRouter("/user/login", &controllers.UserController{}, "post:Login"),
 		beego.NSRouter("/user/info", &controllers.UserController{}, "get:User"),