From 4961a4ddc75e19d9d887817b48cb50642c6487b9 Mon Sep 17 00:00:00 2001 From: zeaslity Date: Mon, 20 Mar 2023 14:51:38 +0800 Subject: [PATCH] =?UTF-8?q?[agent-go]=20=E5=BC=80=E5=A7=8B=E4=BD=BF?= =?UTF-8?q?=E7=94=A8GO=E9=87=8D=E6=9E=84Agent=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agent-go/go.mod | 35 ----- agent-go/main.go | 120 ----------------- agent-go/readme.md | 31 +++++ {agent-go => server-go}/entity/ServerInfo.go | 0 {agent-go => server-go}/entity/global.go | 0 server-go/go.mod | 38 ++++++ {agent-go => server-go}/go.sum | 0 server-go/main.go | 125 ++++++++++++++++++ .../router/ServerRouter.go | 2 +- {agent-go => server-go}/router/router.go | 1 - {agent-go => server-go}/service/DBConfig.go | 2 +- {agent-go => server-go}/service/ServerAPI.go | 2 +- {agent-go => server-go}/test/channelTest.go | 0 13 files changed, 197 insertions(+), 159 deletions(-) create mode 100644 agent-go/readme.md rename {agent-go => server-go}/entity/ServerInfo.go (100%) rename {agent-go => server-go}/entity/global.go (100%) create mode 100644 server-go/go.mod rename {agent-go => server-go}/go.sum (100%) create mode 100644 server-go/main.go rename {agent-go => server-go}/router/ServerRouter.go (96%) rename {agent-go => server-go}/router/router.go (91%) rename {agent-go => server-go}/service/DBConfig.go (96%) rename {agent-go => server-go}/service/ServerAPI.go (98%) rename {agent-go => server-go}/test/channelTest.go (100%) diff --git a/agent-go/go.mod b/agent-go/go.mod index 9327db8..802a879 100644 --- a/agent-go/go.mod +++ b/agent-go/go.mod @@ -1,38 +1,3 @@ module agent-go go 1.18 - -require ( - github.com/gin-gonic/gin v1.9.0 - github.com/go-playground/validator/v10 v10.11.2 - gorm.io/driver/mysql v1.4.7 - gorm.io/gorm v1.24.6 -) - -require ( - github.com/bytedance/sonic v1.8.0 // indirect - github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect - github.com/gin-contrib/sse v0.1.0 // indirect - github.com/go-playground/locales v0.14.1 // indirect - github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-sql-driver/mysql v1.7.0 // indirect - github.com/goccy/go-json v0.10.0 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.5 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/cpuid/v2 v2.0.9 // indirect - github.com/leodido/go-urn v1.2.1 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect - github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect - github.com/twitchyliquid64/golang-asm v0.15.1 // indirect - github.com/ugorji/go/codec v1.2.9 // indirect - golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect - golang.org/x/crypto v0.5.0 // indirect - golang.org/x/net v0.7.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect -) diff --git a/agent-go/main.go b/agent-go/main.go index 8de8238..7905807 100644 --- a/agent-go/main.go +++ b/agent-go/main.go @@ -1,125 +1,5 @@ package main -import ( - "agent-go/router" - "agent-go/service" - "fmt" - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - "github.com/go-playground/validator/v10" - "net/http" -) - -func myValidate(fl validator.FieldLevel) bool { - fmt.Println(fl.Field().Interface().(int)) - return true -} - func main() { - // init the db connection - service.InitDB() - - // all the route - engine := router.Routers() - - // Get方法 - engine.GET("/ping", func(c *gin.Context) { - - statusOK := http.StatusOK - c.JSON( - statusOK, - gin.H{}) - }) - - // Post方法,接收request body的形式 - engine.POST("/jsonPost", func(c *gin.Context) { - - // 自定义 请求规则验证器 - if v, ok := binding.Validator.Engine().(*validator.Validate); ok { - v.RegisterValidation("myValidation", myValidate) - } - - var p string - err := c.ShouldBindJSON(&p) - if err != nil { - return - } - }) - - // 上传文件的操作 前端上传文件使用的是form-data的形式 - // 单个文件上传 - engine.POST("/upload", func(c *gin.Context) { - file, err := c.FormFile("file") // 获取上传的文件 - if err != nil { - c.String(400, fmt.Sprintf("get form err: %s", err.Error())) - return - } - // 如果有其他的表单信息 - c.DefaultPostForm("name", "default-file-name") - - // 打印文件信息 - fmt.Printf("File Name: %s\n", file.Filename) - fmt.Printf("File Size: %d bytes\n", file.Size) - fmt.Printf("MIME Type: %s\n", file.Header.Get("Content-Type")) - - // 保存文件到本地 - err = c.SaveUploadedFile(file, "./"+file.Filename) - if err != nil { - c.String(500, fmt.Sprintf("upload file err: %s", err.Error())) - return - } - - c.String(200, fmt.Sprintf("%s uploaded successfully!", file.Filename)) - }) - - // 多个文件上传 - engine.POST("/multi-upload", func(c *gin.Context) { - form, err := c.MultipartForm() // 获取多个文件上传表单 - if err != nil { - c.String(400, fmt.Sprintf("get form err: %s", err.Error())) - return - } - - // 遍历所有上传的文件 - files := form.File["files"] - for _, file := range files { - // 打印文件信息 - fmt.Printf("File Name: %s\n", file.Filename) - fmt.Printf("File Size: %d bytes\n", file.Size) - fmt.Printf("MIME Type: %s\n", file.Header.Get("Content-Type")) - - // 保存文件到本地 - err = c.SaveUploadedFile(file, "./"+file.Filename) - if err != nil { - c.String(500, fmt.Sprintf("upload file err: %s", err.Error())) - return - } - } - - c.String(200, fmt.Sprintf("%d files uploaded successfully!", len(files))) - }) - - // 返回静态文件 - engine.GET("/file", func(c *gin.Context) { - c.File("./example.txt") // 返回指定路径的文件 - }) - - // 返回动态生成的文件 - engine.GET("/download", func(c *gin.Context) { - content := "Hello, world!" - fileName := "example.txt" - - // 设置响应头,使浏览器可以下载文件 - c.Header("Content-Disposition", "attachment; filename="+fileName) - c.Header("Content-Type", "application/octet-stream") - c.Header("Content-Transfer-Encoding", "binary") - c.Header("Cache-Control", "no-cache") - - // 将内容写入响应体中 - c.String(http.StatusOK, content) - }) - - engine.Run(":9090") - } diff --git a/agent-go/readme.md b/agent-go/readme.md new file mode 100644 index 0000000..25e3305 --- /dev/null +++ b/agent-go/readme.md @@ -0,0 +1,31 @@ +使用GO语言重构Octopus-Agent项目 +--- + +## Message + +1. Agent注册与离线机制 +2. 从环境变量中获取信息 + +## Executor + +1. 利用协程池 + 1. 实现任务超时控制-可控,可不控 + 2. 任务异步非阻塞式执行 + +2. 执行Shell命令 + 1. 简单的命令 -- 单行命令 + 2. 管道命令 -- 管道式命令-复杂单行命令 + 3. 完整体命令 -- 多行命令 + 4. shell脚本 -- 执行shell脚本 + +3. 执行结果上报 + 1. 执行日志合并收集,统一上报 + 2. 执行结果上报 + +## Status + +1. 版本信息汇报 +2. 收集Agent自身的服务器信息 +3. 上报Agent的版本信息 + +## \ No newline at end of file diff --git a/agent-go/entity/ServerInfo.go b/server-go/entity/ServerInfo.go similarity index 100% rename from agent-go/entity/ServerInfo.go rename to server-go/entity/ServerInfo.go diff --git a/agent-go/entity/global.go b/server-go/entity/global.go similarity index 100% rename from agent-go/entity/global.go rename to server-go/entity/global.go diff --git a/server-go/go.mod b/server-go/go.mod new file mode 100644 index 0000000..35576e2 --- /dev/null +++ b/server-go/go.mod @@ -0,0 +1,38 @@ +module server-go + +go 1.18 + +require ( + github.com/gin-gonic/gin v1.9.0 + github.com/go-playground/validator/v10 v10.11.2 + gorm.io/driver/mysql v1.4.7 + gorm.io/gorm v1.24.6 +) + +require ( + github.com/bytedance/sonic v1.8.0 // indirect + github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-sql-driver/mysql v1.7.0 // indirect + github.com/goccy/go-json v0.10.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.0.9 // indirect + github.com/leodido/go-urn v1.2.1 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.9 // indirect + golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect + golang.org/x/crypto v0.5.0 // indirect + golang.org/x/net v0.7.0 // indirect + golang.org/x/sys v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/agent-go/go.sum b/server-go/go.sum similarity index 100% rename from agent-go/go.sum rename to server-go/go.sum diff --git a/server-go/main.go b/server-go/main.go new file mode 100644 index 0000000..94786fd --- /dev/null +++ b/server-go/main.go @@ -0,0 +1,125 @@ +package main + +import ( + "fmt" + "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin/binding" + "github.com/go-playground/validator/v10" + "net/http" + "server-go/router" + "server-go/service" +) + +func myValidate(fl validator.FieldLevel) bool { + fmt.Println(fl.Field().Interface().(int)) + return true +} + +func main() { + + // init the db connection + service.InitDB() + + // all the route + engine := router.Routers() + + // Get方法 + engine.GET("/ping", func(c *gin.Context) { + + statusOK := http.StatusOK + c.JSON( + statusOK, + gin.H{}) + }) + + // Post方法,接收request body的形式 + engine.POST("/jsonPost", func(c *gin.Context) { + + // 自定义 请求规则验证器 + if v, ok := binding.Validator.Engine().(*validator.Validate); ok { + v.RegisterValidation("myValidation", myValidate) + } + + var p string + err := c.ShouldBindJSON(&p) + if err != nil { + return + } + }) + + // 上传文件的操作 前端上传文件使用的是form-data的形式 + // 单个文件上传 + engine.POST("/upload", func(c *gin.Context) { + file, err := c.FormFile("file") // 获取上传的文件 + if err != nil { + c.String(400, fmt.Sprintf("get form err: %s", err.Error())) + return + } + // 如果有其他的表单信息 + c.DefaultPostForm("name", "default-file-name") + + // 打印文件信息 + fmt.Printf("File Name: %s\n", file.Filename) + fmt.Printf("File Size: %d bytes\n", file.Size) + fmt.Printf("MIME Type: %s\n", file.Header.Get("Content-Type")) + + // 保存文件到本地 + err = c.SaveUploadedFile(file, "./"+file.Filename) + if err != nil { + c.String(500, fmt.Sprintf("upload file err: %s", err.Error())) + return + } + + c.String(200, fmt.Sprintf("%s uploaded successfully!", file.Filename)) + }) + + // 多个文件上传 + engine.POST("/multi-upload", func(c *gin.Context) { + form, err := c.MultipartForm() // 获取多个文件上传表单 + if err != nil { + c.String(400, fmt.Sprintf("get form err: %s", err.Error())) + return + } + + // 遍历所有上传的文件 + files := form.File["files"] + for _, file := range files { + // 打印文件信息 + fmt.Printf("File Name: %s\n", file.Filename) + fmt.Printf("File Size: %d bytes\n", file.Size) + fmt.Printf("MIME Type: %s\n", file.Header.Get("Content-Type")) + + // 保存文件到本地 + err = c.SaveUploadedFile(file, "./"+file.Filename) + if err != nil { + c.String(500, fmt.Sprintf("upload file err: %s", err.Error())) + return + } + } + + c.String(200, fmt.Sprintf("%d files uploaded successfully!", len(files))) + }) + + // 返回静态文件 + engine.GET("/file", func(c *gin.Context) { + c.File("./example.txt") // 返回指定路径的文件 + }) + + // 返回动态生成的文件 + engine.GET("/download", func(c *gin.Context) { + content := "Hello, world!" + fileName := "example.txt" + + // 设置响应头,使浏览器可以下载文件 + c.Header("Content-Disposition", "attachment; filename="+fileName) + c.Header("Content-Type", "application/octet-stream") + c.Header("Content-Transfer-Encoding", "binary") + c.Header("Cache-Control", "no-cache") + + // 将内容写入响应体中 + c.String(http.StatusOK, content) + }) + + engine.Run(":9090") + +} diff --git a/agent-go/router/ServerRouter.go b/server-go/router/ServerRouter.go similarity index 96% rename from agent-go/router/ServerRouter.go rename to server-go/router/ServerRouter.go index bfab701..24d7179 100644 --- a/agent-go/router/ServerRouter.go +++ b/server-go/router/ServerRouter.go @@ -1,8 +1,8 @@ package router import ( - "agent-go/service" "github.com/gin-gonic/gin" + "server-go/service" ) type ServerRouter struct { diff --git a/agent-go/router/router.go b/server-go/router/router.go similarity index 91% rename from agent-go/router/router.go rename to server-go/router/router.go index 185f288..c062455 100644 --- a/agent-go/router/router.go +++ b/server-go/router/router.go @@ -1,7 +1,6 @@ package router import ( - _ "agent-go/service" "github.com/gin-gonic/gin" ) diff --git a/agent-go/service/DBConfig.go b/server-go/service/DBConfig.go similarity index 96% rename from agent-go/service/DBConfig.go rename to server-go/service/DBConfig.go index 0661446..34565c2 100644 --- a/agent-go/service/DBConfig.go +++ b/server-go/service/DBConfig.go @@ -1,9 +1,9 @@ package service import ( - "agent-go/entity" "gorm.io/driver/mysql" "gorm.io/gorm" + "server-go/entity" ) func InitDB() *gorm.DB { diff --git a/agent-go/service/ServerAPI.go b/server-go/service/ServerAPI.go similarity index 98% rename from agent-go/service/ServerAPI.go rename to server-go/service/ServerAPI.go index e1dee08..5f5a900 100644 --- a/agent-go/service/ServerAPI.go +++ b/server-go/service/ServerAPI.go @@ -1,10 +1,10 @@ package service import ( - "agent-go/entity" "fmt" "github.com/gin-gonic/gin" "net/http" + "server-go/entity" ) type ServerAPI struct { diff --git a/agent-go/test/channelTest.go b/server-go/test/channelTest.go similarity index 100% rename from agent-go/test/channelTest.go rename to server-go/test/channelTest.go