Commit a812ce93 authored by 陈子龙's avatar 陈子龙

新增 文件上传接口,优化主机管理

parent 422e5242
......@@ -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
)
......@@ -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=
......
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正常)
}
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
}
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"` // 密码
}
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
}
......@@ -25,4 +25,8 @@ type Config struct {
LogMode int
ArgBool bool
ArgInt int
MinioServer string
MinioAccessKey string
MinioSecretKey string
MinioBucket string
}
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))
//}
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)
}
......@@ -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
......
......@@ -57,6 +57,10 @@ 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", "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
}
}
......
......@@ -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) // 状态检测
}
}
......@@ -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)
}
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
}
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
}
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,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment