diff --git a/go.mod b/go.mod index 50992abd49a08caa0e63868fa3cb45fa38ef5990..bbbca44a565c84a7c86ec5a6ce107a3f0bf3e759 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/360EntSecGroup-Skylar/excelize v1.4.1 github.com/Luzifer/go-openssl/v4 v4.1.0 github.com/bytedance/go-tagexpr v2.7.4+incompatible + github.com/ghodss/yaml v1.0.0 github.com/gin-gonic/gin v1.9.0 github.com/go-playground/locales v0.14.1 github.com/go-playground/universal-translator v0.18.1 @@ -72,6 +73,7 @@ require ( golang.org/x/text v0.9.0 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978 // indirect diff --git a/go.sum b/go.sum index 2d958ffb7102d886ef75f5dcc1af119e683a4925..22d5b86200554992cf44d41d41c33a32d8bd0790 100644 --- a/go.sum +++ b/go.sum @@ -81,6 +81,7 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= @@ -650,6 +651,8 @@ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/src/bean/vo/request/host_manage.go b/src/bean/vo/request/host_manage.go index 70b9d6a897acbddbac8d514ffd6b5b2eb4052f64..dc9cda59b0a4b0a2025977352e21fdc9afe87837 100644 --- a/src/bean/vo/request/host_manage.go +++ b/src/bean/vo/request/host_manage.go @@ -36,10 +36,10 @@ type ListHostManageReq struct { // StateHostManageReq 状态检测 type StateHostManageReq struct { - DetectionType int `json:"detection_type" form:"detection_type" binding:"oneof=1 2 3"` //1主页列表手动检测 2输入ip列表保存时检测 3上传ip列表文件保存时检测 - Id int `json:"id" form:"id"` //主机分组ID - //HostFile file `form:"host_file"` // 主机文件 - HostManageList string `json:"host_manage_list" form:"host_manage_list"` //主机ip列表 + DetectionType int `json:"detection_type" form:"detection_type" binding:"oneof=1 2 3"` //1主页列表手动检测 2输入ip列表保存时检测 3上传ip列表文件保存时检测 + Id int `json:"id" form:"id"` //主机分组ID + HostManageList string `json:"host_manage_list" form:"host_manage_list"` //主机ip列表 + FileName string `json:"file_name" form:"file_name"` //文件名称 } // HostIpExceptionListReq 异常列表 diff --git a/src/controller/host_manage.go b/src/controller/host_manage.go index 1236760aff106f8bcb210d1051ca6743ae81384d..86c1ffbf2963072b753b4b93c4b06b6d8121985f 100644 --- a/src/controller/host_manage.go +++ b/src/controller/host_manage.go @@ -57,6 +57,52 @@ func ParsingHostFiles(c *gin.Context) (hostManageList []request.HostManageList, return } +// GetMinioFiles 解析minio中xlsx类型文件 +func GetMinioFiles(fileName string) (hostManageList []request.HostManageList, err error) { + + obj, err := service.DocLibSvc{}.GetFile(fileName) + if err != nil { + err = resp.GetFileStreamError.WithError(err) + return + } + + xlsxData, err := excelize.OpenReader(obj) + if err != nil { + err = resp.ReadFileError.WithError(err) + return + } + //读取工作簿 + rows := xlsxData.GetRows("Sheet1") + + if len(rows) > 1001 { + err = resp.FailedToParseFile.WithError(errors.New("ip数量不可超过1000")) + return + } + + for i := 0; i < len(rows); i++ { + //默认跳过第一行 + if i < 1 { + continue + } + + var voucherType int + if rows[i][2] == "密码验证" { + voucherType = 0 + } else { + voucherType = 1 + } + hostManageList = append(hostManageList, request.HostManageList{ + Ip: rows[i][0], + Port: rows[i][1], + VoucherType: voucherType, + UserName: rows[i][3], + Password: rows[i][4], + }) + } + return + +} + // AddHostManage 新增 func AddHostManage(c *gin.Context) { var ( @@ -237,7 +283,9 @@ func StateHostManage(c *gin.Context) { } case 3: //解析主机文件 - hostManageList, err = ParsingHostFiles(c) + //hostManageList, err = ParsingHostFiles(c) + hostManageList, err = GetMinioFiles(req.FileName) + if err != nil { SendJsonResponse(c, resp.ReadFileError.WithError(errors.New("解析主机文件失败")), nil) return diff --git a/src/main.go b/src/main.go index 6e4f8619fe2be113c9a202353c0411016d3f6530..41fc2c2d49b0a967dbc3008fe37090b652546969 100644 --- a/src/main.go +++ b/src/main.go @@ -60,7 +60,7 @@ func initConfig() { LogMode: util.SetEnvInt("LOG_MODE", 1), // 1.标准打印 2.输出文件 ArgBool: util.SetEnvBool("ARG_BOOL", false), // 示例参数 ArgInt: util.SetEnvInt("ARG_INT", 10), // 示例参数 - MinioServer: util.SetEnvStr("MINIO_SERVER", "cache.wodcloud.com"), // Minio 服务地址 + MinioServer: util.SetEnvStr("MINIO_SERVER", "https://cache.wodcloud.com"), // Minio 服务地址 MinioAccessKey: util.SetEnvStr("MINIO_ACCESS_KEY", "beagleadmin"), // Minio Access Key MinioSecretKey: util.SetEnvStr("MINIO_SECRET_KEY", "H76cPmwvH7vJ"), // Minio Secret MinioBucket: util.SetEnvStr("MINIO_BUCKET", "so-operation"), // Minio Bucket diff --git a/src/router/router.go b/src/router/router.go index 444593ee78b9aa3d191a141880091fe17e9bc874..c50c4e2c214f4b0cfacb6ccf2f463ac2b379a711 100644 --- a/src/router/router.go +++ b/src/router/router.go @@ -28,7 +28,7 @@ func Load(r *gin.Engine, middleware ...gin.HandlerFunc) { base.GET("/example/list", controller.GetExampleList) // 示例获取列表 } - base.POST("add_file", controller.AddFile) //文件上传 + base.POST("/add_file", controller.AddFile) //文件上传 // 初始化自动化运维路由 InitAutomatedMaintenRouter(r) diff --git a/src/service/doc_lib.go b/src/service/doc_lib.go index 62a8d3dd0882849dfa212d43058de5d7718f4f6c..b1fc7e8632e34828fd83bbbad2c06a5acf36cadd 100644 --- a/src/service/doc_lib.go +++ b/src/service/doc_lib.go @@ -1,6 +1,7 @@ package service import ( + "context" "fmt" "github.com/gin-gonic/gin" "github.com/google/uuid" @@ -8,6 +9,7 @@ import ( "github.com/pkg/errors" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/client" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/conf" + "io" "mime/multipart" "net/http" "path" @@ -81,6 +83,31 @@ func (d *DocLibSvc) AddFile(c *gin.Context) (fileUrl string, err error) { err = errors.Wrap(err, "上传文件失败") return } - fileUrl = fmt.Sprintf("https://%s/%s/%s%s", conf.Options.MinioServer, conf.Options.MinioBucket, id, ext) + fileUrl = fmt.Sprintf("%s/%s/%s%s", conf.Options.MinioServer, conf.Options.MinioBucket, id, ext) return } + +// GetFile 读取minio文件 +func (d DocLibSvc) GetFile(fileName string) (obj io.Reader, err error) { + minioClient, err := client.GetMinioConnect() + if err != nil { + err = errors.Wrap(err, "getMinio") + return + } + object, err := minioClient.GetObject(context.Background(), conf.Options.MinioBucket, fileName, minio.GetObjectOptions{}) + if err != nil { + err = errors.Wrap(err, "download object error") + return + } + obj = io.Reader(object) + return obj, nil + //localFile, err := os.Create("C:/Users/25238/Desktop/123456.xlsx") + //if err != nil { + // log.Fatalf("create local object error " + err.Error()) + //} + //_, err = io.Copy(localFile, object) + //if err != nil { + // log.Fatalf("write object from object to local file error " + err.Error()) + // return + //} +}