From a812ce93447794df57830b684194fae1b7fec503 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=AD=90=E9=BE=99?= Date: Tue, 27 Jun 2023 09:11:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=8E=A5=E5=8F=A3=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=B8=BB=E6=9C=BA=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 21 +- go.sum | 40 ++- src/bean/entity/host_manage.go | 26 ++ src/bean/vo/request/host_manage.go | 38 +++ src/bean/vo/response/host_manage.go | 59 +++++ src/common/client/minio.go | 32 +++ src/common/conf/options.go | 28 ++- src/controller/doc_lib.go | 117 +++++++++ src/controller/host_manage.go | 175 +++++++++++++ src/controller/task_manage.go | 22 +- src/main.go | 28 ++- src/router/automatedmaintenrouter.go | 11 +- src/router/router.go | 12 + src/service/doc_lib.go | 87 +++++++ src/service/host_manage.go | 351 +++++++++++++++++++++++++++ src/service/task_manage.go | 19 +- 16 files changed, 998 insertions(+), 68 deletions(-) create mode 100644 src/bean/entity/host_manage.go create mode 100644 src/bean/vo/request/host_manage.go create mode 100644 src/bean/vo/response/host_manage.go create mode 100644 src/common/client/minio.go create mode 100644 src/controller/doc_lib.go create mode 100644 src/controller/host_manage.go create mode 100644 src/service/doc_lib.go create mode 100644 src/service/host_manage.go diff --git a/go.mod b/go.mod index fdc20b0..bd48683 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,8 @@ require ( github.com/google/uuid v1.3.0 github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible github.com/lib/pq v1.10.9 + github.com/minio/minio-go/v7 v7.0.58 + github.com/pkg/errors v0.9.1 github.com/spf13/cast v1.5.0 github.com/spf13/pflag v1.0.5 github.com/thoas/go-funk v0.9.3 @@ -26,6 +28,7 @@ require ( github.com/andybalholm/brotli v1.0.5 // indirect github.com/bytedance/sonic v1.8.0 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/goccy/go-json v0.10.0 // indirect github.com/golang/protobuf v1.5.0 // indirect @@ -33,16 +36,19 @@ require ( github.com/henrylee2cn/ameda v1.5.0 // indirect github.com/henrylee2cn/goutil v0.0.0-20220704075712-42f2ec55fe8d // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.16.3 // indirect - github.com/klauspost/cpuid/v2 v2.0.9 // indirect + github.com/klauspost/compress v1.16.5 // indirect + github.com/klauspost/cpuid/v2 v2.2.4 // indirect github.com/leodido/go-urn v1.2.3 // indirect github.com/lestrrat-go/strftime v1.0.6 // indirect github.com/mattn/go-isatty v0.0.17 // indirect + github.com/minio/md5-simd v1.1.2 // indirect + github.com/minio/sha256-simd v1.0.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/nyaruka/phonenumbers v1.1.7 // indirect github.com/pelletier/go-toml/v2 v2.0.6 // indirect - github.com/pkg/errors v0.9.1 // indirect + github.com/rs/xid v1.5.0 // indirect + github.com/sirupsen/logrus v1.9.2 // indirect github.com/syndtr/goleveldb v1.0.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.9 // indirect @@ -50,11 +56,12 @@ require ( go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.6.0 // indirect golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect - golang.org/x/crypto v0.7.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect + golang.org/x/crypto v0.9.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/sys v0.8.0 // indirect + 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.v3 v3.0.1 // indirect xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978 // indirect ) diff --git a/go.sum b/go.sum index 160f837..e21a591 100644 --- a/go.sum +++ b/go.sum @@ -63,6 +63,8 @@ github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= @@ -233,10 +235,12 @@ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNU github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY= -github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= +github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= +github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= +github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -282,6 +286,12 @@ github.com/mattn/go-sqlite3 v1.14.9 h1:10HX2Td0ocZpYEjhilsuo6WWtUqttj2Kb0KtD86/K github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.58 h1:B9/8Az8Om/2kX8Ys2ai2PZbBTokRE5W6P5OaqnAs6po= +github.com/minio/minio-go/v7 v7.0.58/go.mod h1:NUDy4A4oXPq1l2yK6LTSvCEzAMeIcoz9lcj5dbzSrRE= +github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= +github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= @@ -362,6 +372,8 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -376,6 +388,8 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y= +github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -464,8 +478,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -494,8 +508,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -532,9 +546,11 @@ golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -542,8 +558,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -602,6 +618,8 @@ gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= diff --git a/src/bean/entity/host_manage.go b/src/bean/entity/host_manage.go new file mode 100644 index 0000000..c6a05cf --- /dev/null +++ b/src/bean/entity/host_manage.go @@ -0,0 +1,26 @@ +package entity + +import "time" + +type HostManage struct { + Id int `json:"id" xorm:"pk autoincr" ` // id + HostName string `json:"hostName" xorm:"host_name"` // 主机分组名称 + IsDelete int `json:"isDelete" xorm:"is_delete" ` // 是否删除(0 未删除 1已删除) + CreateUser string `json:"createUser" xorm:"create_user" ` // 创建人 + CreateTime time.Time `json:"createTime" xorm:"create_time"` // 创建时间 + UpdateUser string `json:"updateUser" xorm:"update_user" ` // 修改人 + UpdateTime time.Time `json:"updateTime" xorm:"update_time"` // 修改时间 +} + +type HostManageList struct { + Id int `json:"id" xorm:"pk autoincr" ` // id + Ip string `json:"ip" xorm:"ip"` // ip + Port string `json:"port" xorm:"port"` // 端口 + VoucherType int `json:"voucherType" xorm:"voucher_type"` // 凭证类型(0密码验证 密钥验证) + UserName string `json:"userName" xorm:"user_name"` // 用户名 + Password string `json:"password" xorm:"password"` // 密码 + HostGroupId int `json:"hostGroupId" xorm:"host_group_id"` // 主机分组id + HostFileUrl string `json:"hostFileUrl" xorm:"host_file_url"` // 主机文件url + IsDelete int `json:"isDelete" xorm:"is_delete" ` // 是否删除(0 未删除 1已删除) + ConnStatus int `json:"connStatus" xorm:"conn_status" ` // 连接状态(0异常 1正常) +} diff --git a/src/bean/vo/request/host_manage.go b/src/bean/vo/request/host_manage.go new file mode 100644 index 0000000..71ee0cc --- /dev/null +++ b/src/bean/vo/request/host_manage.go @@ -0,0 +1,38 @@ +package request + +type AddHostManageReq struct { + HostName string `json:"hostName"` // 主机分组名称 + HostFileUrl string `json:"hostFileUrl"` // 主机文件url + HostManageList []HostManageList `json:"hostManageList"` //主机列表 +} + +type HostManageList struct { + Ip string `json:"ip"` // ip + Port string `json:"port"` // 端口 + VoucherType int `json:"voucherType"` // 凭证类型(0密码验证 密钥验证) + UserName string `json:"userName"` // 用户名 + Password string `json:"password"` // 密码 +} + +type EditHostManageReq struct { + Id int `json:"id"` // 主键ID + HostName string `json:"hostName"` // 主机分组名称 + HostFileUrl string `json:"hostFileUrl"` // 主机文件url + HostManageList []HostManageList `json:"hostManageList"` //主机列表 +} + +type DelHostManageReq struct { + Id []int `json:"id" vd:"len($)>0;msg:'请输入id'"` // 主键ID +} + +type ListHostManageReq struct { + Search string `json:"search" form:"search"` //关键词 + CreateDateFrom string `json:"createDateFrom" form:"createDateFrom"` //创建时间从 + CreateDateTo string `json:"createDateTo" form:"createDateTo"` //创建时间至 + Pagination +} + +type StateHostManageReq struct { + Id int `json:"id" form:"id" binding:"required"` //主键ID + Pagination +} diff --git a/src/bean/vo/response/host_manage.go b/src/bean/vo/response/host_manage.go new file mode 100644 index 0000000..ef4acf9 --- /dev/null +++ b/src/bean/vo/response/host_manage.go @@ -0,0 +1,59 @@ +package response + +import "time" + +type HostManageRes struct { + Id int `json:"id"` // id + HostName string `json:"hostName"` // 主机分组名称 + TaskCnt int `json:"taskCnt"` // 任务数量 + IpCnt int `json:"ipCnt"` // ip数量 + CreateUser string `json:"createUser"` // 创建人 + CreateTime time.Time `json:"createTime"` // 创建时间 + UpdateUser string `json:"updateUser"` // 修改人 + UpdateTime time.Time `json:"updateTime"` // 修改时间 + HostFileUrl string `json:"hostFileUrl"` // 主机文件url + HostList []HostList `json:"hostList"` // 主机列表 + TaskList []TaskList `json:"taskList"` // 主机列表 +} + +type HostManage struct { + Id int `json:"id"` // id + HostName string `json:"hostName"` // 主机分组名称 + CreateUser string `json:"createUser"` // 创建人 + CreateTime time.Time `json:"createTime"` // 创建时间 + UpdateUser string `json:"updateUser"` // 修改人 + UpdateTime time.Time `json:"updateTime"` // 修改时间 +} + +type HostList struct { + Id int `json:"id"` // id + Ip string `json:"ip"` // ip + Port string `json:"port"` // 端口 + HostFileUrl string `json:"hostFileUrl"` // 主机文件url +} + +type TaskList struct { + Id int `json:"id"` // id + TaskName string `json:"taskName"` // 任务名称 + TaskDesc string `json:"taskDesc"` // 任务描述 + ExecCnt int `json:"execCnt"` // 执行次数 +} + +type HostManagesRes struct { + Id int `json:"id"` // id + HostName string `json:"hostName"` // 主机分组名称 + CreateUser string `json:"createUser"` // 创建人 + CreateTime time.Time `json:"createTime"` // 创建时间 + TaskCnt int `json:"taskCnt"` // 任务数量 + IpCntErr int `json:"ipCntErr"` // ip数量(异常) + IpCnt int `json:"ipCnt"` // ip数量(全部) +} + +type HostManageListRes struct { + Id int `json:"id"` // id + Ip string `json:"ip"` // ip + Port string `json:"port"` // 端口 + VoucherType int `json:"voucherType"` // 凭证类型(0密码验证 密钥验证) + UserName string `json:"userName"` // 用户名 + Password string `json:"password"` // 密码 +} diff --git a/src/common/client/minio.go b/src/common/client/minio.go new file mode 100644 index 0000000..b3b7fe5 --- /dev/null +++ b/src/common/client/minio.go @@ -0,0 +1,32 @@ +package client + +import ( + "fmt" + "github.com/minio/minio-go/v7" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/conf" + "net/url" + + "github.com/minio/minio-go/v7/pkg/credentials" +) + +var MinioClient *minio.Client + +func GetMinioConnect() (*minio.Client, error) { + if MinioClient != nil { + return MinioClient, nil + } + parse, err := url.Parse(conf.Options.MinioServer) + if err != nil { + return MinioClient, err + } + minioClient, err := minio.New(parse.Host, &minio.Options{ + Creds: credentials.NewStaticV4(conf.Options.MinioAccessKey, conf.Options.MinioSecretKey, ""), + Secure: false, + }) + if err != nil { + return MinioClient, err + } + MinioClient = minioClient + fmt.Printf("connect Minio Server { %s } success!\n", conf.Options.MinioServer) + return MinioClient, err +} diff --git a/src/common/conf/options.go b/src/common/conf/options.go index 76bb42b..f196f28 100644 --- a/src/common/conf/options.go +++ b/src/common/conf/options.go @@ -13,16 +13,20 @@ var ( // 公共配置 type Config struct { - DbURL string - DbDriver string - RedisURL string - RedisDB int - RedisTag string - Prefix string - LogDirPrefix string - LogDirName string - LogSaveDays int - LogMode int - ArgBool bool - ArgInt int + DbURL string + DbDriver string + RedisURL string + RedisDB int + RedisTag string + Prefix string + LogDirPrefix string + LogDirName string + LogSaveDays int + LogMode int + ArgBool bool + ArgInt int + MinioServer string + MinioAccessKey string + MinioSecretKey string + MinioBucket string } diff --git a/src/controller/doc_lib.go b/src/controller/doc_lib.go new file mode 100644 index 0000000..c2b1288 --- /dev/null +++ b/src/controller/doc_lib.go @@ -0,0 +1,117 @@ +package controller + +import ( + "github.com/gin-gonic/gin" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/service" +) + +func AddFile(c *gin.Context) { + + docLibSvc := service.DocLibSvc{} + doc, err := docLibSvc.AddFile(c) + if err != nil { + SendJsonResponse(c, resp.FAIL.WithError(err), nil) + return + } + SendJsonResponse(c, resp.OK, doc) +} + +// +//func (d *DocLib) Get(c *gin.Context) { +// var req request.DocLibGetReq +// if err := c.ShouldBindUri(&req); err != nil { +// resp.Json(c, resp.InvalidParam.WithTranslate(err)) +// return +// } +// user, _ := header.GetUserContext(c) +// svc := new(service.DocLibSvc) +// svc.User = &user +// doc, docUrl, err := svc.Get(c, req) +// if err != nil { +// resp.Json(c, resp.FAIL.WithMsg(err.Error())) +// return +// } +// switch req.Opt { +// case "download": +// //c.Redirect(http.StatusMovedPermanently, docUrl.String()) +// docUrlParse, _ := url.Parse(docUrl.String()) +// proxy := httputil.ReverseProxy{ +// Director: func(req *http.Request) { +// req.Header = c.Request.Header +// req.Host = docUrlParse.Host +// req.URL = docUrlParse +// }, +// } +// proxy.ServeHTTP(c.Writer, c.Request) +// case "preview": +// c.Redirect(http.StatusMovedPermanently, docUrl.String()) +// case "info": +// resp.Json(c, resp.OK.WithData(doc)) +// case "tmp": +// resp.Json(c, resp.OK.WithData(docUrl.String())) +// } +//} +// +//func (d *DocLib) List(c *gin.Context) { +// var req request.DocLibListReq +// if err := c.ShouldBind(&req); err != nil { +// resp.Json(c, resp.InvalidParam.WithTranslate(err)) +// return +// } +// user, _ := header.GetUserContext(c) +// svc := new(service.DocLibSvc) +// svc.User = &user +// data, err := svc.List(c, req) +// if err != nil { +// resp.Json(c, resp.FAIL.WithMsg(err.Error())) +// return +// } +// resp.Json(c, resp.OK.WithData(data)) +//} +// +//func (d *DocLib) Del(c *gin.Context) { +// var req request.DocLibDelReq +// if err := c.ShouldBind(&req); err != nil { +// resp.Json(c, resp.InvalidParam.WithTranslate(err)) +// return +// } +// user, _ := header.GetUserContext(c) +// svc := new(service.DocLibSvc) +// svc.User = &user +// err := svc.Del(c, req) +// if err != nil { +// resp.Json(c, resp.FAIL.WithMsg(err.Error())) +// return +// } +// resp.Json(c, resp.OK) +//} +// +//func (d *DocLib) Exts(c *gin.Context) { +// user, _ := header.GetUserContext(c) +// svc := new(service.DocLibSvc) +// svc.User = &user +// data, err := svc.Exts(c) +// if err != nil { +// resp.Json(c, resp.FAIL.WithMsg(err.Error())) +// return +// } +// resp.Json(c, resp.OK.WithData(data)) +//} +// +//func (d *DocLib) Update(c *gin.Context) { +// var req request.DocLibUpdateReq +// if err := c.ShouldBind(&req); err != nil { +// resp.Json(c, resp.InvalidParam.WithTranslate(err)) +// return +// } +// user, _ := header.GetUserContext(c) +// svc := new(service.DocLibSvc) +// svc.User = &user +// doc, err := svc.Update(c, req) +// if err != nil { +// resp.Json(c, resp.FAIL.WithMsg(err.Error())) +// return +// } +// resp.Json(c, resp.OK.WithData(doc)) +//} diff --git a/src/controller/host_manage.go b/src/controller/host_manage.go new file mode 100644 index 0000000..bd3cf13 --- /dev/null +++ b/src/controller/host_manage.go @@ -0,0 +1,175 @@ +package controller + +import ( + "errors" + "github.com/gin-gonic/gin" + "github.com/spf13/cast" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/request" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/service" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/util" +) + +// AddHostManage 新增 +func AddHostManage(c *gin.Context) { + var req request.AddHostManageReq + if err := c.ShouldBindJSON(&req); err != nil { + SendJsonResponse(c, resp.InvalidParam.WithError(err), nil) + return + } + //参数校验 + if req.HostName == "" { + SendJsonResponse(c, resp.InvalidParam.WithError(errors.New("主机分组名称为空")), nil) + return + } + if req.HostFileUrl == "" { + if len(req.HostManageList) == 0 { + SendJsonResponse(c, resp.InvalidParam.WithError(errors.New("主机分组数量为0")), nil) + return + } + if len(req.HostManageList) > 5 { + SendJsonResponse(c, resp.InvalidParam.WithError(errors.New("主机分组数量超过5条")), nil) + return + } + for _, v := range req.HostManageList { + if v.Ip == "" || v.UserName == "" { + SendJsonResponse(c, resp.InvalidParam.WithError(errors.New("ip或用户名为空")), nil) + return + } + if v.VoucherType == 0 && v.Password == "" { + SendJsonResponse(c, resp.InvalidParam.WithError(errors.New("密码为空")), nil) + return + } + } + } + + hostManageSvc := service.HostManageSvc{} + err := hostManageSvc.AddHostManage(req) + if err != nil { + SendJsonResponse(c, err, nil) + return + } + SendJsonResponse(c, resp.OK, nil) +} + +// EditHostManage 编辑 +func EditHostManage(c *gin.Context) { + var req request.EditHostManageReq + if err := c.ShouldBindJSON(&req); err != nil { + SendJsonResponse(c, resp.InvalidParam.WithError(err), nil) + return + } + //参数校验 + if req.HostName == "" || req.Id == 0 { + SendJsonResponse(c, resp.InvalidParam.WithError(errors.New("主机分组ID或名称为空")), nil) + return + } + if req.HostFileUrl == "" { + if len(req.HostManageList) == 0 { + SendJsonResponse(c, resp.InvalidParam.WithError(errors.New("主机分组数量为0")), nil) + return + } + if len(req.HostManageList) > 5 { + SendJsonResponse(c, resp.InvalidParam.WithError(errors.New("主机分组数量超过5条")), nil) + return + } + for _, v := range req.HostManageList { + if v.Ip == "" || v.UserName == "" { + SendJsonResponse(c, resp.InvalidParam.WithError(errors.New("ip或用户名为空")), nil) + return + } + if v.VoucherType == 0 && v.Password == "" { + SendJsonResponse(c, resp.InvalidParam.WithError(errors.New("密码为空")), nil) + return + } + } + } + + hostManageSvc := service.HostManageSvc{} + err := hostManageSvc.EditHostManage(req) + if err != nil { + SendJsonResponse(c, err, nil) + return + } + SendJsonResponse(c, resp.OK, nil) +} + +// DelHostManage 删除 +func DelHostManage(c *gin.Context) { + var req request.DelHostManageReq + if err := c.ShouldBindJSON(&req); err != nil { + SendJsonResponse(c, resp.InvalidParam.WithError(err), nil) + return + } + //参数校验 + if err := util.ValidateSimple(req, "Id"); err != nil { + SendJsonResponse(c, resp.InvalidParam.WithError(err), nil) + return + } + + hostManageSvc := service.HostManageSvc{} + err := hostManageSvc.DelHostManage(req) + if err != nil { + SendJsonResponse(c, err, nil) + return + } + SendJsonResponse(c, resp.OK, nil) +} + +// DetailsHostManage 详情 +func DetailsHostManage(c *gin.Context) { + var ( + err error + id string + ) + + if id = c.Query("id"); id == "" { + id = c.Param("id") + } + if id == "" { + SendJsonResponse(c, resp.InvalidParam.WithError(errors.New("id为空")), nil) + return + } + + hostManageSvc := service.HostManageSvc{} + data, err := hostManageSvc.DetailsHostManage(cast.ToInt(id)) + if err != nil { + SendJsonResponse(c, err, nil) + return + } + SendJsonResponse(c, resp.OK, data) +} + +// ListHostManage 列表 +func ListHostManage(c *gin.Context) { + var req request.ListHostManageReq + if err := c.ShouldBindJSON(&req); err != nil { + SendJsonResponse(c, resp.InvalidParam.WithError(err), nil) + return + } + + hostManageSvc := service.HostManageSvc{} + total, list, err := hostManageSvc.ListHostManage(req) + if err != nil { + SendJsonPageResponse(c, err, nil, 0) + return + } + SendJsonPageResponse(c, resp.OK, list, total) +} + +// StateHostManage 状态检测 +func StateHostManage(c *gin.Context) { + var req request.StateHostManageReq + if err := c.ShouldBindJSON(&req); err != nil { + SendJsonResponse(c, resp.InvalidParam.WithError(err), nil) + return + } + + hostManageSvc := service.HostManageSvc{} + total, list, err := hostManageSvc.StateHostManage(req) + if err != nil { + SendJsonPageResponse(c, err, nil, 0) + return + } + SendJsonPageResponse(c, resp.OK, list, total) +} diff --git a/src/controller/task_manage.go b/src/controller/task_manage.go index 0e7264a..a8ed9f3 100644 --- a/src/controller/task_manage.go +++ b/src/controller/task_manage.go @@ -23,8 +23,8 @@ func AddTaskManage(c *gin.Context) { return } - taskManageService := service.TaskManageSvc{} - err := taskManageService.AddTaskManage(req) + taskManageSvc := service.TaskManageSvc{} + err := taskManageSvc.AddTaskManage(req) if err != nil { SendJsonResponse(c, err, nil) return @@ -45,8 +45,8 @@ func EditTaskManage(c *gin.Context) { return } - taskManageService := service.TaskManageSvc{} - err := taskManageService.EditTaskManage(req) + taskManageSvc := service.TaskManageSvc{} + err := taskManageSvc.EditTaskManage(req) if err != nil { SendJsonResponse(c, err, nil) return @@ -67,8 +67,8 @@ func DelTaskManage(c *gin.Context) { return } - taskManageService := service.TaskManageSvc{} - err := taskManageService.DelTaskManage(req) + taskManageSvc := service.TaskManageSvc{} + err := taskManageSvc.DelTaskManage(req) if err != nil { SendJsonResponse(c, err, nil) return @@ -87,12 +87,12 @@ func DetailsTaskManage(c *gin.Context) { id = c.Param("id") } if id == "" { - SendJsonResponse(c, resp.InvalidParam.WithError(errors.New("规则名称重复")), nil) + SendJsonResponse(c, resp.InvalidParam.WithError(errors.New("id为空")), nil) return } - taskManageService := service.TaskManageSvc{} - data, err := taskManageService.DetailsTaskManage(cast.ToInt(id)) + taskManageSvc := service.TaskManageSvc{} + data, err := taskManageSvc.DetailsTaskManage(cast.ToInt(id)) if err != nil { SendJsonResponse(c, err, nil) return @@ -108,8 +108,8 @@ func ListTaskManage(c *gin.Context) { return } - taskManageService := service.TaskManageSvc{} - total, list, err := taskManageService.ListTaskManage(req) + taskManageSvc := service.TaskManageSvc{} + total, list, err := taskManageSvc.ListTaskManage(req) if err != nil { SendJsonPageResponse(c, err, nil, 0) return diff --git a/src/main.go b/src/main.go index ec91e1f..7dce950 100644 --- a/src/main.go +++ b/src/main.go @@ -45,18 +45,22 @@ func initConfig() { conf.LoggerLevel = util.SetEnvStr("LOG_LEVEL", "info") conf.RunMode = util.SetEnvStr("GIN_MODE", "debug") // project run mode, available parameters: debug、release conf.Options = &conf.Config{ - Prefix: *prefix, - DbURL: util.SetEnvStr("DB_URL", "host=localhost port=9010 user=postgres password=passwd123 dbname=postgres sslmode=disable"), - DbDriver: util.SetEnvStr("DB_DRIVER", "postgres"), - RedisURL: util.SetEnvStr("REDIS_URL", "localhost:6379"), - RedisDB: 0, - RedisTag: "bg", - LogDirPrefix: util.SetEnvStr("LOG_DIR_PREFIX", "/app/log"), // 日志目录 - LogDirName: util.SetEnvStr("LOG_NAME", "syslog"), // 日志名称 - LogSaveDays: util.SetEnvInt("LOG_SAVE_DAYS", 7), // 日志最大存储天数 - LogMode: util.SetEnvInt("LOG_MODE", 1), // 1.标准打印 2.输出文件 - ArgBool: util.SetEnvBool("ARG_BOOL", false), // 示例参数 - ArgInt: util.SetEnvInt("ARG_INT", 10), // 示例参数 + Prefix: *prefix, + DbURL: util.SetEnvStr("DB_URL", "host=localhost port=9010 user=postgres password=passwd123 dbname=postgres sslmode=disable"), + DbDriver: util.SetEnvStr("DB_DRIVER", "postgres"), + RedisURL: util.SetEnvStr("REDIS_URL", "localhost:6379"), + RedisDB: 0, + RedisTag: "bg", + LogDirPrefix: util.SetEnvStr("LOG_DIR_PREFIX", "/app/log"), // 日志目录 + LogDirName: util.SetEnvStr("LOG_NAME", "syslog"), // 日志名称 + LogSaveDays: util.SetEnvInt("LOG_SAVE_DAYS", 7), // 日志最大存储天数 + 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", "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/automatedmaintenrouter.go b/src/router/automatedmaintenrouter.go index bbd887c..15a6f46 100644 --- a/src/router/automatedmaintenrouter.go +++ b/src/router/automatedmaintenrouter.go @@ -22,10 +22,11 @@ func InitAutomatedMaintenRouter(e *gin.Engine) { //主机管理 host := so.Group("/hostManage") { - host.POST("/add") // 新增 - host.PUT("/edit") // 编辑 - host.DELETE("/del") // 删除 - host.GET("/details") // 详情 - host.GET("/list") // 列表 + host.POST("/add", controller.AddHostManage) // 新增 + host.PUT("/edit", controller.EditHostManage) // 编辑 + host.DELETE("/del", controller.DelHostManage) // 删除 + host.GET("/details", controller.DetailsHostManage) // 详情 + host.GET("/list", controller.ListHostManage) // 列表 + host.GET("/state", controller.StateHostManage) // 状态检测 } } diff --git a/src/router/router.go b/src/router/router.go index 645e4a7..f5d0016 100644 --- a/src/router/router.go +++ b/src/router/router.go @@ -27,6 +27,18 @@ func Load(r *gin.Engine, middleware ...gin.HandlerFunc) { base.GET("/example", controller.Example) // 示例 base.GET("/example/list", controller.GetExampleList) // 示例获取列表 } + + //文档库 + docLib := base.Group("doc_lib") + { + docLib.POST("addFile", controller.AddFile) //文件上传 + //docLib.GET(":id/:opt", docLibController.Get) //预览或下载 + //docLib.GET("", docLibController.List) //文档列表 + //docLib.DELETE("", docLibController.Del) //删除、移除文档 + //docLib.GET("exts", docLibController.Exts) //格式列表 + //docLib.PUT("", docLibController.Update) //文档编辑 + } + // 初始化自动化运维路由 InitAutomatedMaintenRouter(r) } diff --git a/src/service/doc_lib.go b/src/service/doc_lib.go new file mode 100644 index 0000000..c4b9a16 --- /dev/null +++ b/src/service/doc_lib.go @@ -0,0 +1,87 @@ +package service + +import ( + "fmt" + "github.com/gin-gonic/gin" + "github.com/google/uuid" + "github.com/minio/minio-go/v7" + "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" + "mime/multipart" + "net/http" + "path" +) + +var maxFileByte int64 = 104857600 //100M + +type DocLibSvc struct{} + +func GetFileContentType(out multipart.File) (contentType string, err error) { + buffer := make([]byte, 512) + _, err = out.Read(buffer) + if err != nil { + return + } + contentType = http.DetectContentType(buffer) + return +} + +func (d *DocLibSvc) AddFile(c *gin.Context) (fileUrl string, err error) { + var ( + uploadFile *multipart.FileHeader + uploadFd multipart.File + minioClient *minio.Client + ext string + contentType string + ) + uploadFile, err = c.FormFile("upload_file") + if err != nil { + err = errors.Wrap(err, "上传的文件不存在") + return + } + if uploadFile.Size > maxFileByte { + err = errors.New("超过上传最大限制") + return + } + uploadFd, err = uploadFile.Open() + if err != nil { + err = errors.Wrap(err, "打开文件失败") + return + } + defer uploadFd.Close() + + ext = path.Ext(uploadFile.Filename) + contentType, err = GetFileContentType(uploadFd) + if err != nil { + err = errors.Wrap(err, "获取ContentType失败") + return + } + uploadFd.Seek(0, 0) + + //上传文件到minio + minioClient, err = client.GetMinioConnect() + if err != nil { + err = errors.Wrap(err, "getMinio") + return + } + id := uuid.NewString() + _, err = minioClient.PutObject(c, + conf.Options.MinioBucket, + fmt.Sprintf("%s%s", id, ext), + uploadFd, + uploadFile.Size, + minio.PutObjectOptions{ + ContentType: contentType, + UserMetadata: map[string]string{ + "name": uploadFile.Filename, + }, + }) + if err != nil { + err = errors.Wrap(err, "上传文件失败") + return + } + fileUrl = fmt.Sprintf("https://%s/%s/%s%s", conf.Options.MinioServer, conf.Options.MinioBucket, id, ext) + fmt.Printf("https://%s/%s/%s%s", conf.Options.MinioServer, conf.Options.MinioBucket, id, ext) + return +} diff --git a/src/service/host_manage.go b/src/service/host_manage.go new file mode 100644 index 0000000..7b7bf84 --- /dev/null +++ b/src/service/host_manage.go @@ -0,0 +1,351 @@ +package service + +import ( + "errors" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/entity" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/request" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/response" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/client" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp" + "time" +) + +type HostManageSvc struct { + User *entity.User +} + +// AddHostManage 新增主机 +func (h *HostManageSvc) AddHostManage(req request.AddHostManageReq) (err error) { + db, err := client.GetDbClient() + if err != nil { + err = resp.DbConnectError.WithError(err) + return + } + + // 开启事务 + session := db.NewSession() + defer session.Close() + session.Begin() + + // 校验 主机分组名称 是否重复 + has, err := session.Table("host_manage").Where("is_delete = 0 AND host_name = ?", req.HostName).Exist() + if has { + err = resp.DbDataCheckError.WithError(errors.New("主机名称重复")) + session.Rollback() + return + } + if err != nil { + err = resp.DbSelectError.WithError(err) + session.Rollback() + return + } + + //新增主机分组 + hostManage := entity.HostManage{ + HostName: req.HostName, + CreateUser: "", + CreateTime: time.Now(), + UpdateUser: "", + UpdateTime: time.Now(), + } + _, err = session.Table("host_manage").Insert(&hostManage) + if err != nil { + err = resp.DbInsertError.WithError(err) + session.Rollback() + return + } + + if req.HostFileUrl == "" { + //新增主机分组列表 + for _, v := range req.HostManageList { + port := "22" + if v.Port != "" { + port = v.Port + } + hostManageList := entity.HostManageList{ + Ip: v.Ip, + Port: port, + VoucherType: v.VoucherType, + UserName: v.UserName, + Password: v.Password, + HostGroupId: hostManage.Id, + } + _, err = session.Table("host_manage_list").Insert(&hostManageList) + if err != nil { + err = resp.DbInsertError.WithError(err) + session.Rollback() + return + } + } + } else { + //读取并解析文件内容--czl + var hostManageLists []entity.HostManageList + //新增主机分组列表--文件形式 + for _, v := range hostManageLists { + port := "22" + if v.Port != "" { + port = v.Port + } + hostManageList := entity.HostManageList{ + Ip: v.Ip, + Port: port, + VoucherType: v.VoucherType, + UserName: v.UserName, + Password: v.Password, + HostGroupId: hostManage.Id, + HostFileUrl: req.HostFileUrl, + } + _, err = session.Table("host_manage_list").Insert(&hostManageList) + if err != nil { + err = resp.DbInsertError.WithError(err) + session.Rollback() + return + } + } + } + + session.Commit() + return +} + +// EditHostManage 编辑 +func (h *HostManageSvc) EditHostManage(req request.EditHostManageReq) (err error) { + db, err := client.GetDbClient() + if err != nil { + err = resp.DbConnectError.WithError(err) + return + } + + // 开启事务 + session := db.NewSession() + defer session.Close() + session.Begin() + + // 校验 主机分组名称 是否重复 + has, err := session.Table("host_manage").Where("is_delete = 0 AND id != ? AND host_name = ?", req.Id, req.HostName).Exist() + if has { + err = resp.DbDataCheckError.WithError(errors.New("主机名称重复")) + session.Rollback() + return + } + if err != nil { + err = resp.DbSelectError.WithError(err) + session.Rollback() + return + } + + //修改主机分组信息 + hostManage := entity.HostManage{ + HostName: req.HostName, + UpdateUser: "", + UpdateTime: time.Now(), + } + _, err = session.Table("host_manage").Where("is_delete = 0 AND id = ?", req.Id). + Cols("host_name,update_user,update_time").Update(&hostManage) + if err != nil { + err = resp.DbUpdateError.WithError(err) + session.Rollback() + return + } + + //删除主机列表数据 + _, err = session.Table("host_manage_list").Where("host_group_id = ?", req.Id).Cols("is_delete").Update(&entity.TaskManage{ + IsDelete: 1, + }) + if err != nil { + err = resp.DbDeleteError.WithError(err) + session.Rollback() + return + } + + if req.HostFileUrl == "" { + //修改主机分组列表 + for _, v := range req.HostManageList { + port := "22" + if v.Port != "" { + port = v.Port + } + hostManageList := entity.HostManageList{ + Ip: v.Ip, + Port: port, + VoucherType: v.VoucherType, + UserName: v.UserName, + Password: v.Password, + HostGroupId: hostManage.Id, + } + _, err = session.Table("host_manage_list").Insert(&hostManageList) + if err != nil { + err = resp.DbInsertError.WithError(err) + session.Rollback() + return + } + } + } else { + //读取并解析文件内容--czl + var hostManageLists []entity.HostManageList + //新增主机分组列表--文件形式 + for _, v := range hostManageLists { + port := "22" + if v.Port != "" { + port = v.Port + } + hostManageList := entity.HostManageList{ + Ip: v.Ip, + Port: port, + VoucherType: v.VoucherType, + UserName: v.UserName, + Password: v.Password, + HostGroupId: hostManage.Id, + HostFileUrl: req.HostFileUrl, + } + _, err = session.Table("host_manage_list").Insert(&hostManageList) + if err != nil { + err = resp.DbInsertError.WithError(err) + session.Rollback() + return + } + } + } + session.Commit() + return +} + +// DelHostManage 删除任务 +func (h *HostManageSvc) DelHostManage(req request.DelHostManageReq) (err error) { + db, err := client.GetDbClient() + if err != nil { + err = resp.DbConnectError.WithError(err) + return + } + + // 开启事务 + session := db.NewSession() + defer session.Close() + session.Begin() + + //删除主机分组 + _, err = session.Table("host_manage").In("id", req.Id).Cols("is_delete").Update(&entity.HostManageList{ + IsDelete: 1, + }) + if err != nil { + err = resp.DbDeleteError.WithError(err) + session.Rollback() + return + } + //删除主机分组列表 + _, err = session.Table("host_manage_list").In("host_group_id", req.Id).Cols("is_delete").Update(&entity.HostManageList{ + IsDelete: 1, + }) + if err != nil { + err = resp.DbDeleteError.WithError(err) + session.Rollback() + return + } + session.Commit() + return +} + +// DetailsHostManage 详情 +func (h *HostManageSvc) DetailsHostManage(id int) (hostManageRes response.HostManageRes, err error) { + db, err := client.GetDbClient() + if err != nil { + err = resp.DbConnectError.WithError(err) + return + } + + var hostManage response.HostManage + hostList := make([]response.HostList, 0) + taskList := make([]response.TaskList, 0) + + //查询主机分组 + _, err = db.Table("host_manage").Where("is_delete = 0 AND id = ?", id).Get(&hostManage) + if err != nil { + err = resp.DbSelectError.WithError(err) + return + } + //查询主机列表 + err = db.Table("host_manage_list").Where("is_delete = 0 AND host_group_id = ?", id).Find(&hostList) + if err != nil { + err = resp.DbSelectError.WithError(err) + return + } + //查询任务列表 + err = db.Table("task_manage").Where("is_delete = 0 AND host_group_id = ?", id).Find(&taskList) + if err != nil { + err = resp.DbSelectError.WithError(err) + return + } + + hostManageRes.Id = hostManage.Id + hostManageRes.HostName = hostManage.HostName + hostManageRes.TaskCnt = len(hostManageRes.TaskList) + hostManageRes.IpCnt = len(hostManageRes.HostList) + hostManageRes.CreateUser = hostManage.CreateUser + hostManageRes.CreateTime = hostManage.CreateTime + hostManageRes.UpdateUser = hostManage.UpdateUser + hostManageRes.UpdateTime = hostManage.UpdateTime + for _, v := range hostList { + if v.HostFileUrl != "" { + hostManageRes.HostFileUrl = v.HostFileUrl + break + } + } + hostManageRes.HostList = hostList + hostManageRes.TaskList = taskList + + return +} + +// ListHostManage 列表 +func (h *HostManageSvc) ListHostManage(req request.ListHostManageReq) (total int64, hostManageListRes []response.HostManagesRes, err error) { + db, err := client.GetDbClient() + if err != nil { + err = resp.DbConnectError.WithError(err) + return + } + + finder := db.Table("host_manage").Alias("hm").Where("hm.is_delete = 0") + if req.Search != "" { + finder.Where("hm.host_name LIKE ?", "%"+req.Search+"%") + } + if req.CreateDateFrom != "" { + finder.Where("hm.create_time >= ?", req.CreateDateFrom) + } + if req.CreateDateTo != "" { + finder.Where("hm.create_time <= ?", req.CreateDateFrom) + } + finder.OrderBy("hm.id") + //查询任务 + total, err = finder.Select("hm.id,hm.host_name,hm.create_user,hm.create_time,(SELECT COUNT(*) FROM "+ + "task_manage tm WHERE tm.is_delete = 0 AND tm.host_group_id = hm.ID) AS task_cnt,(SELECT COUNT(*) FROM "+ + "host_manage_list hml WHERE hml.is_delete = 0 AND hml.conn_status = 0 AND hml.host_group_id = hm.ID) AS "+ + "ip_cnt_err,(SELECT COUNT(*) FROM host_manage_list hml WHERE hml.is_delete = 0 AND hml.host_group_id = hm.ID) AS ip_cnt"). + Limit(req.PageSize, (req.Page-1)*req.PageSize).FindAndCount(&hostManageListRes) + if err != nil { + err = resp.DbSelectError.WithError(err) + return + } + return +} + +// StateHostManage 状态检测 +func (h *HostManageSvc) StateHostManage(req request.StateHostManageReq) (total int64, hostManageListRes []response.HostManageListRes, err error) { + db, err := client.GetDbClient() + if err != nil { + err = resp.DbConnectError.WithError(err) + return + } + + //状态检测。。 + + //查询异常列表 + finder := db.Table("host_manage_list").Where("is_delete = 0 AND conn_status = 0 AND host_group_id = ?", req.Id) + finder.OrderBy("id") + //查询任务 + total, err = finder.Limit(req.PageSize, (req.Page-1)*req.PageSize).FindAndCount(&hostManageListRes) + if err != nil { + err = resp.DbSelectError.WithError(err) + return + } + return +} diff --git a/src/service/task_manage.go b/src/service/task_manage.go index 04d7931..043a894 100644 --- a/src/service/task_manage.go +++ b/src/service/task_manage.go @@ -1,7 +1,6 @@ package service import ( - "errors" "fmt" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/entity" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/request" @@ -24,15 +23,15 @@ func (t *TaskManageSvc) AddTaskManage(req request.AddTaskManageReq) (err error) } // 校验 任务名称 是否重复 - has, err := db.Table("task_manage").Where("is_delete = 0 AND task_name = ?", req.TaskName).Exist() - if has { - err = resp.DbDataCheckError.WithError(errors.New("任务名称重复")) - return - } - if err != nil { - err = resp.DbSelectError.WithError(err) - return - } + //has, err := db.Table("task_manage").Where("is_delete = 0 AND task_name = ?", req.TaskName).Exist() + //if has { + // err = resp.DbDataCheckError.WithError(errors.New("任务名称重复")) + // return + //} + //if err != nil { + // err = resp.DbSelectError.WithError(err) + // return + //} taskManage := entity.TaskManage{ TaskName: req.TaskName, -- 2.26.0