diff --git a/go.mod b/go.mod index 459d6ac2..9b84981b 100644 --- a/go.mod +++ b/go.mod @@ -13,15 +13,18 @@ require ( github.com/go-ole/go-ole v1.2.4 // indirect github.com/go-sql-driver/mysql v1.5.0 github.com/go-yaml/yaml v2.1.0+incompatible - github.com/golang/protobuf v1.4.2 + github.com/golang/protobuf v1.5.2 github.com/iwind/TeaGo v0.0.0-20210411134150-ddf57e240c2f github.com/lionsoul2014/ip2region v2.2.0-release+incompatible github.com/mozillazg/go-pinyin v0.18.0 github.com/pkg/sftp v1.12.0 - github.com/shirou/gopsutil v2.20.9+incompatible + github.com/shirou/gopsutil v3.21.5+incompatible + github.com/tklauser/go-sysconf v0.3.6 // indirect golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a - golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 - google.golang.org/grpc v1.32.0 - google.golang.org/protobuf v1.25.0 + golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect + golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 + google.golang.org/genproto v0.0.0-20210617175327-b9e0b3197ced // indirect + google.golang.org/grpc v1.38.0 + google.golang.org/protobuf v1.26.0 gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go.sum b/go.sum index 68280e42..8f0dec2d 100644 --- a/go.sum +++ b/go.sum @@ -68,6 +68,7 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/cloudflare-go v0.13.2/go.mod h1:27kfc1apuifUmJhp069y0+hwlKDg4bd8LWlu7oKeZvM= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cpu/goacmedns v0.0.3/go.mod h1:4MipLkI+qScwqtVxcNO6okBhbgRrr7/tKXUSgSL0teQ= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -83,6 +84,7 @@ github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFP github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/exoscale/egoscale v0.23.0/go.mod h1:hRo78jkjkCDKpivQdRBEpNYF5+cVpCJCPDg2/r45KaY= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= @@ -134,6 +136,9 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -143,6 +148,7 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -153,6 +159,7 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gophercloud/gophercloud v0.6.1-0.20191122030953-d8ac278c1c9d/go.mod h1:ozGNgr9KYOVATV5jsgHl/ceCDXGuguqOZAzoQ/2vcNM= @@ -283,6 +290,8 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/sacloud/libsacloud v1.36.2/go.mod h1:P7YAOVmnIn3DKHqCZcUKYUXmSwGBm3yS7IBEjKVSrjg= github.com/shirou/gopsutil v2.20.9+incompatible h1:msXs2frUV+O/JLva9EDLpuJ84PrFsdCTCQex8PUdtkQ= github.com/shirou/gopsutil v2.20.9+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil v3.21.5+incompatible h1:OloQyEerMi7JUrXiNzy8wQ5XN+baemxSl12QgIzt0jc= +github.com/shirou/gopsutil v3.21.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -300,6 +309,10 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/tklauser/go-sysconf v0.3.6 h1:oc1sJWvKkmvIxhDHeKWvZS4f6AW+YcoguSfRF2/Hmo4= +github.com/tklauser/go-sysconf v0.3.6/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= +github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= +github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= github.com/transip/gotransip/v6 v6.2.0/go.mod h1:pQZ36hWWRahCUXkFWlx9Hs711gLd8J4qdgLdRzmtY+g= github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -307,6 +320,7 @@ github.com/vultr/govultr v0.5.0/go.mod h1:wZZXZbYbqyY1n3AldoeYNZK4Wnmmoq6dNFkvd5 github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -350,6 +364,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -357,6 +372,7 @@ golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -385,6 +401,9 @@ golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 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/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -397,6 +416,7 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180622082034-63fc586f45fe/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -433,11 +453,23 @@ golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= 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.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -476,10 +508,12 @@ golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -517,6 +551,8 @@ google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20210617175327-b9e0b3197ced h1:c5geK1iMU3cDKtFrCVQIcjR3W+JOZMuhIyICMCTbtus= +google.golang.org/genproto v0.0.0-20210617175327-b9e0b3197ced/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -530,6 +566,8 @@ google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.32.0 h1:zWTV+LMdc3kaiJMSTOFz2UgSBgx8RNQoTGiZu3fR9S0= google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -540,6 +578,9 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/db/models/api_access_token_dao.go b/internal/db/models/api_access_token_dao.go index c02ffcd1..09b8f542 100644 --- a/internal/db/models/api_access_token_dao.go +++ b/internal/db/models/api_access_token_dao.go @@ -1,6 +1,7 @@ package models import ( + "github.com/TeaOSLab/EdgeAPI/internal/errors" _ "github.com/go-sql-driver/mysql" "github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/dbs" @@ -29,10 +30,23 @@ func init() { }) } -// 生成AccessToken -func (this *APIAccessTokenDAO) GenerateAccessToken(tx *dbs.Tx, userId int64) (token string, expiresAt int64, err error) { +// GenerateAccessToken 生成AccessToken +func (this *APIAccessTokenDAO) GenerateAccessToken(tx *dbs.Tx, adminId int64, userId int64) (token string, expiresAt int64, err error) { + if adminId <= 0 && userId <= 0 { + err = errors.New("either 'adminId' or 'userId' should not be zero") + return + } + + if adminId > 0 { + userId = 0 + } + if userId > 0 { + adminId = 0 + } + // 查询以前的 accessToken, err := this.Query(tx). + Attr("adminId", adminId). Attr("userId", userId). Find() if err != nil { @@ -48,6 +62,7 @@ func (this *APIAccessTokenDAO) GenerateAccessToken(tx *dbs.Tx, userId int64) (to op.Id = accessToken.(*APIAccessToken).Id } + op.AdminId = adminId op.UserId = userId op.Token = token op.CreatedAt = time.Now().Unix() @@ -56,7 +71,7 @@ func (this *APIAccessTokenDAO) GenerateAccessToken(tx *dbs.Tx, userId int64) (to return } -// 查找AccessToken +// FindAccessToken 查找AccessToken func (this *APIAccessTokenDAO) FindAccessToken(tx *dbs.Tx, token string) (*APIAccessToken, error) { one, err := this.Query(tx). Attr("token", token). diff --git a/internal/db/models/api_access_token_model.go b/internal/db/models/api_access_token_model.go index e2e38d95..6babfd4f 100644 --- a/internal/db/models/api_access_token_model.go +++ b/internal/db/models/api_access_token_model.go @@ -1,9 +1,10 @@ package models -// API访问令牌 +// APIAccessToken API访问令牌 type APIAccessToken struct { Id uint64 `field:"id"` // ID UserId uint32 `field:"userId"` // 用户ID + AdminId uint32 `field:"adminId"` // 管理员ID Token string `field:"token"` // 令牌 CreatedAt uint64 `field:"createdAt"` // 创建时间 ExpiredAt uint64 `field:"expiredAt"` // 过期时间 @@ -12,6 +13,7 @@ type APIAccessToken struct { type APIAccessTokenOperator struct { Id interface{} // ID UserId interface{} // 用户ID + AdminId interface{} // 管理员ID Token interface{} // 令牌 CreatedAt interface{} // 创建时间 ExpiredAt interface{} // 过期时间 diff --git a/internal/db/models/dns/dns_task_dao_test.go b/internal/db/models/dns/dns_task_dao_test.go index c19ae99e..9c71349a 100644 --- a/internal/db/models/dns/dns_task_dao_test.go +++ b/internal/db/models/dns/dns_task_dao_test.go @@ -9,7 +9,7 @@ import ( func TestDNSTaskDAO_CreateDNSTask(t *testing.T) { dbs.NotifyReady() - err := SharedDNSTaskDAO.CreateDNSTask(nil, 1, 2, 3, "taskType") + err := SharedDNSTaskDAO.CreateDNSTask(nil, 1, 2, 3, 0, "taskType") if err != nil { t.Fatal(err) } diff --git a/internal/db/models/user_access_key_dao.go b/internal/db/models/user_access_key_dao.go index 05a0cbe8..765b1c1b 100644 --- a/internal/db/models/user_access_key_dao.go +++ b/internal/db/models/user_access_key_dao.go @@ -66,11 +66,12 @@ func (this *UserAccessKeyDAO) FindEnabledUserAccessKey(tx *dbs.Tx, id int64) (*U } // CreateAccessKey 创建Key -func (this *UserAccessKeyDAO) CreateAccessKey(tx *dbs.Tx, userId int64, description string) (int64, error) { - if userId <= 0 { - return 0, errors.New("invalid userId") +func (this *UserAccessKeyDAO) CreateAccessKey(tx *dbs.Tx, adminId int64, userId int64, description string) (int64, error) { + if adminId <= 0 && userId <= 0 { + return 0, errors.New("invalid adminId or userId") } op := NewUserAccessKeyOperator() + op.AdminId = adminId op.UserId = userId op.Description = description op.UniqueId = rands.String(16) @@ -81,8 +82,9 @@ func (this *UserAccessKeyDAO) CreateAccessKey(tx *dbs.Tx, userId int64, descript } // FindAllEnabledAccessKeys 查找用户所有的Key -func (this *UserAccessKeyDAO) FindAllEnabledAccessKeys(tx *dbs.Tx, userId int64) (result []*UserAccessKey, err error) { +func (this *UserAccessKeyDAO) FindAllEnabledAccessKeys(tx *dbs.Tx, adminId int64, userId int64) (result []*UserAccessKey, err error) { _, err = this.Query(tx). + Attr("adminId", adminId). Attr("userId", userId). State(UserAccessKeyStateEnabled). DescPk(). @@ -92,10 +94,11 @@ func (this *UserAccessKeyDAO) FindAllEnabledAccessKeys(tx *dbs.Tx, userId int64) } // CheckUserAccessKey 检查用户的AccessKey -func (this *UserAccessKeyDAO) CheckUserAccessKey(tx *dbs.Tx, userId int64, accessKeyId int64) (bool, error) { +func (this *UserAccessKeyDAO) CheckUserAccessKey(tx *dbs.Tx, adminId int64, userId int64, accessKeyId int64) (bool, error) { return this.Query(tx). Pk(accessKeyId). State(UserAccessKeyStateEnabled). + Attr("adminId", adminId). Attr("userId", userId). Exist() } @@ -133,3 +136,12 @@ func (this *UserAccessKeyDAO) UpdateAccessKeyAccessedAt(tx *dbs.Tx, accessKeyId Set("accessedAt", time.Now().Unix()). UpdateQuickly() } + +// CountAllEnabledAccessKeys 计算可用AccessKey数量 +func (this *UserAccessKeyDAO) CountAllEnabledAccessKeys(tx *dbs.Tx, adminId int64, userId int64) (int64, error) { + return this.Query(tx). + Attr("adminId", adminId). + Attr("userId", userId). + State(UserAccessKeyStateEnabled). + Count() +} diff --git a/internal/db/models/user_access_key_model.go b/internal/db/models/user_access_key_model.go index c8bbfc75..88fd3d03 100644 --- a/internal/db/models/user_access_key_model.go +++ b/internal/db/models/user_access_key_model.go @@ -3,6 +3,7 @@ package models // UserAccessKey AccessKey type UserAccessKey struct { Id uint32 `field:"id"` // ID + AdminId uint32 `field:"adminId"` // 管理员ID UserId uint32 `field:"userId"` // 用户ID SubUserId uint32 `field:"subUserId"` // 子用户ID IsOn uint8 `field:"isOn"` // 是否启用 @@ -15,6 +16,7 @@ type UserAccessKey struct { type UserAccessKeyOperator struct { Id interface{} // ID + AdminId interface{} // 管理员ID UserId interface{} // 用户ID SubUserId interface{} // 子用户ID IsOn interface{} // 是否启用 diff --git a/internal/nodes/api_node.go b/internal/nodes/api_node.go index d52ba81f..76853c1f 100644 --- a/internal/nodes/api_node.go +++ b/internal/nodes/api_node.go @@ -27,16 +27,21 @@ import ( "os/exec" "regexp" "strconv" + "sync" "time" ) var sharedAPIConfig *configs.APIConfig = nil type APINode struct { + serviceInstanceMap map[string]interface{} + serviceInstanceLocker sync.Mutex } func NewAPINode() *APINode { - return &APINode{} + return &APINode{ + serviceInstanceMap: map[string]interface{}{}, + } } func (this *APINode) Start() { diff --git a/internal/nodes/api_node_services.go b/internal/nodes/api_node_services.go index 76d3eb2b..a42a33e3 100644 --- a/internal/nodes/api_node_services.go +++ b/internal/nodes/api_node_services.go @@ -7,94 +7,483 @@ import ( "github.com/TeaOSLab/EdgeAPI/internal/rpc/services/nameservers" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "google.golang.org/grpc" + "reflect" + "strings" ) // 注册服务 func (this *APINode) registerServices(server *grpc.Server) { - pb.RegisterAdminServiceServer(server, &services.AdminService{}) - pb.RegisterNodeGrantServiceServer(server, &services.NodeGrantService{}) - pb.RegisterServerServiceServer(server, &services.ServerService{}) - pb.RegisterNodeServiceServer(server, &services.NodeService{}) - pb.RegisterNodeClusterServiceServer(server, &services.NodeClusterService{}) - pb.RegisterNodeIPAddressServiceServer(server, &services.NodeIPAddressService{}) - pb.RegisterAPINodeServiceServer(server, &services.APINodeService{}) - pb.RegisterOriginServiceServer(server, &services.OriginService{}) - pb.RegisterHTTPWebServiceServer(server, &services.HTTPWebService{}) - pb.RegisterReverseProxyServiceServer(server, &services.ReverseProxyService{}) - pb.RegisterHTTPGzipServiceServer(server, &services.HTTPGzipService{}) - pb.RegisterHTTPHeaderPolicyServiceServer(server, &services.HTTPHeaderPolicyService{}) - pb.RegisterHTTPHeaderServiceServer(server, &services.HTTPHeaderService{}) - pb.RegisterHTTPPageServiceServer(server, &services.HTTPPageService{}) - pb.RegisterHTTPAccessLogPolicyServiceServer(server, &services.HTTPAccessLogPolicyService{}) - pb.RegisterHTTPCachePolicyServiceServer(server, &services.HTTPCachePolicyService{}) - pb.RegisterHTTPFirewallPolicyServiceServer(server, &services.HTTPFirewallPolicyService{}) - pb.RegisterHTTPLocationServiceServer(server, &services.HTTPLocationService{}) - pb.RegisterHTTPWebsocketServiceServer(server, &services.HTTPWebsocketService{}) - pb.RegisterHTTPRewriteRuleServiceServer(server, &services.HTTPRewriteRuleService{}) - pb.RegisterSSLCertServiceServer(server, &services.SSLCertService{}) - pb.RegisterSSLPolicyServiceServer(server, &services.SSLPolicyService{}) - pb.RegisterSysSettingServiceServer(server, &services.SysSettingService{}) - pb.RegisterHTTPFirewallRuleGroupServiceServer(server, &services.HTTPFirewallRuleGroupService{}) - pb.RegisterHTTPFirewallRuleSetServiceServer(server, &services.HTTPFirewallRuleSetService{}) - pb.RegisterDBNodeServiceServer(server, &services.DBNodeService{}) - pb.RegisterNodeLogServiceServer(server, &services.NodeLogService{}) - pb.RegisterHTTPAccessLogServiceServer(server, &services.HTTPAccessLogService{}) - pb.RegisterMessageServiceServer(server, &services.MessageService{}) - pb.RegisterMessageRecipientServiceServer(server, &services.MessageRecipientService{}) - pb.RegisterMessageReceiverServiceServer(server, &services.MessageReceiverService{}) - pb.RegisterMessageMediaServiceServer(server, &services.MessageMediaService{}) - pb.RegisterMessageRecipientGroupServiceServer(server, &services.MessageRecipientGroupService{}) - pb.RegisterMessageMediaInstanceServiceServer(server, &services.MessageMediaInstanceService{}) - pb.RegisterMessageTaskServiceServer(server, &services.MessageTaskService{}) - pb.RegisterMessageTaskLogServiceServer(server, &services.MessageTaskLogService{}) - pb.RegisterNodeGroupServiceServer(server, &services.NodeGroupService{}) - pb.RegisterNodeRegionServiceServer(server, &services.NodeRegionService{}) - pb.RegisterNodePriceItemServiceServer(server, &services.NodePriceItemService{}) - pb.RegisterServerGroupServiceServer(server, &services.ServerGroupService{}) - pb.RegisterIPLibraryServiceServer(server, &services.IPLibraryService{}) - pb.RegisterFileChunkServiceServer(server, &services.FileChunkService{}) - pb.RegisterFileServiceServer(server, &services.FileService{}) - pb.RegisterRegionCountryServiceServer(server, &services.RegionCountryService{}) - pb.RegisterRegionProvinceServiceServer(server, &services.RegionProvinceService{}) - pb.RegisterIPListServiceServer(server, &services.IPListService{}) - pb.RegisterIPItemServiceServer(server, &services.IPItemService{}) - pb.RegisterLogServiceServer(server, &services.LogService{}) - pb.RegisterDNSProviderServiceServer(server, &services.DNSProviderService{}) - pb.RegisterDNSDomainServiceServer(server, &services.DNSDomainService{}) - pb.RegisterDNSServiceServer(server, &services.DNSService{}) - pb.RegisterACMEUserServiceServer(server, &services.ACMEUserService{}) - pb.RegisterACMETaskServiceServer(server, &services.ACMETaskService{}) - pb.RegisterACMEAuthenticationServiceServer(server, &services.ACMEAuthenticationService{}) - pb.RegisterUserServiceServer(server, &services.UserService{}) - pb.RegisterServerDailyStatServiceServer(server, &services.ServerDailyStatService{}) - pb.RegisterUserBillServiceServer(server, &services.UserBillService{}) - pb.RegisterUserNodeServiceServer(server, &services.UserNodeService{}) - pb.RegisterLoginServiceServer(server, &services.LoginService{}) - pb.RegisterUserAccessKeyServiceServer(server, &services.UserAccessKeyService{}) - pb.RegisterSysLockerServiceServer(server, &services.SysLockerService{}) - pb.RegisterNodeTaskServiceServer(server, &services.NodeTaskService{}) - pb.RegisterNodeValueServiceServer(server, &services.NodeValueService{}) - pb.RegisterDBServiceServer(server, &services.DBService{}) - pb.RegisterServerRegionCityMonthlyStatServiceServer(server, &services.ServerRegionCityMonthlyStatService{}) - pb.RegisterServerRegionCountryMonthlyStatServiceServer(server, &services.ServerRegionCountryMonthlyStatService{}) - pb.RegisterServerRegionProvinceMonthlyStatServiceServer(server, &services.ServerRegionProvinceMonthlyStatService{}) - pb.RegisterServerRegionProviderMonthlyStatServiceServer(server, &services.ServerRegionProviderMonthlyStatService{}) - pb.RegisterServerClientSystemMonthlyStatServiceServer(server, &services.ServerClientSystemMonthlyStatService{}) - pb.RegisterServerClientBrowserMonthlyStatServiceServer(server, &services.ServerClientBrowserMonthlyStatService{}) - pb.RegisterServerHTTPFirewallDailyStatServiceServer(server, &services.ServerHTTPFirewallDailyStatService{}) - pb.RegisterDNSTaskServiceServer(server, &services.DNSTaskService{}) - pb.RegisterNodeClusterFirewallActionServiceServer(server, &services.NodeClusterFirewallActionService{}) - pb.RegisterMonitorNodeServiceServer(server, &services.MonitorNodeService{}) - pb.RegisterAuthorityKeyServiceServer(server, &services.AuthorityKeyService{}) - pb.RegisterAuthorityNodeServiceServer(server, &services.AuthorityNodeService{}) - pb.RegisterLatestItemServiceServer(server, &services.LatestItemService{}) - pb.RegisterNodeThresholdServiceServer(server, &services.NodeThresholdService{}) - pb.RegisterHTTPFastcgiServiceServer(server, &services.HTTPFastcgiService{}) - pb.RegisterNSClusterServiceServer(server, &nameservers.NSClusterService{}) - pb.RegisterNSNodeServiceServer(server, &nameservers.NSNodeService{}) - pb.RegisterNSDomainServiceServer(server, &nameservers.NSDomainService{}) - pb.RegisterNSRecordServiceServer(server, &nameservers.NSRecordService{}) - pb.RegisterNSRouteServiceServer(server, &nameservers.NSRouteService{}) - pb.RegisterNSAccessLogServiceServer(server, &nameservers.NSAccessLogService{}) - pb.RegisterHTTPAuthPolicyServiceServer(server, &services.HTTPAuthPolicyService{}) + { + instance := this.serviceInstance(&services.AdminService{}).(*services.AdminService) + pb.RegisterAdminServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.NodeGrantService{}).(*services.NodeGrantService) + pb.RegisterNodeGrantServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.ServerService{}).(*services.ServerService) + pb.RegisterServerServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.NodeService{}).(*services.NodeService) + pb.RegisterNodeServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.NodeClusterService{}).(*services.NodeClusterService) + pb.RegisterNodeClusterServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.NodeIPAddressService{}).(*services.NodeIPAddressService) + pb.RegisterNodeIPAddressServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.APINodeService{}).(*services.APINodeService) + pb.RegisterAPINodeServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.OriginService{}).(*services.OriginService) + pb.RegisterOriginServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.HTTPWebService{}).(*services.HTTPWebService) + pb.RegisterHTTPWebServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.ReverseProxyService{}).(*services.ReverseProxyService) + pb.RegisterReverseProxyServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.HTTPGzipService{}).(*services.HTTPGzipService) + pb.RegisterHTTPGzipServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.HTTPHeaderPolicyService{}).(*services.HTTPHeaderPolicyService) + pb.RegisterHTTPHeaderPolicyServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.HTTPHeaderService{}).(*services.HTTPHeaderService) + pb.RegisterHTTPHeaderServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.HTTPPageService{}).(*services.HTTPPageService) + pb.RegisterHTTPPageServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.HTTPAccessLogPolicyService{}).(*services.HTTPAccessLogPolicyService) + pb.RegisterHTTPAccessLogPolicyServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.HTTPCachePolicyService{}).(*services.HTTPCachePolicyService) + pb.RegisterHTTPCachePolicyServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.HTTPFirewallPolicyService{}).(*services.HTTPFirewallPolicyService) + pb.RegisterHTTPFirewallPolicyServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.HTTPLocationService{}).(*services.HTTPLocationService) + pb.RegisterHTTPLocationServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.HTTPWebsocketService{}).(*services.HTTPWebsocketService) + pb.RegisterHTTPWebsocketServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.HTTPRewriteRuleService{}).(*services.HTTPRewriteRuleService) + pb.RegisterHTTPRewriteRuleServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.SSLCertService{}).(*services.SSLCertService) + pb.RegisterSSLCertServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.SSLPolicyService{}).(*services.SSLPolicyService) + pb.RegisterSSLPolicyServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.SysSettingService{}).(*services.SysSettingService) + pb.RegisterSysSettingServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.HTTPFirewallRuleGroupService{}).(*services.HTTPFirewallRuleGroupService) + pb.RegisterHTTPFirewallRuleGroupServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.HTTPFirewallRuleSetService{}).(*services.HTTPFirewallRuleSetService) + pb.RegisterHTTPFirewallRuleSetServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.DBNodeService{}).(*services.DBNodeService) + pb.RegisterDBNodeServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.NodeLogService{}).(*services.NodeLogService) + pb.RegisterNodeLogServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.HTTPAccessLogService{}).(*services.HTTPAccessLogService) + pb.RegisterHTTPAccessLogServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.MessageService{}).(*services.MessageService) + pb.RegisterMessageServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.MessageRecipientService{}).(*services.MessageRecipientService) + pb.RegisterMessageRecipientServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.MessageReceiverService{}).(*services.MessageReceiverService) + pb.RegisterMessageReceiverServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.MessageMediaService{}).(*services.MessageMediaService) + pb.RegisterMessageMediaServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.MessageRecipientGroupService{}).(*services.MessageRecipientGroupService) + pb.RegisterMessageRecipientGroupServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.MessageMediaInstanceService{}).(*services.MessageMediaInstanceService) + pb.RegisterMessageMediaInstanceServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.MessageTaskService{}).(*services.MessageTaskService) + pb.RegisterMessageTaskServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.MessageTaskLogService{}).(*services.MessageTaskLogService) + pb.RegisterMessageTaskLogServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.NodeGroupService{}).(*services.NodeGroupService) + pb.RegisterNodeGroupServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.NodeRegionService{}).(*services.NodeRegionService) + pb.RegisterNodeRegionServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.NodePriceItemService{}).(*services.NodePriceItemService) + pb.RegisterNodePriceItemServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.ServerGroupService{}).(*services.ServerGroupService) + pb.RegisterServerGroupServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.IPLibraryService{}).(*services.IPLibraryService) + pb.RegisterIPLibraryServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.FileChunkService{}).(*services.FileChunkService) + pb.RegisterFileChunkServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.FileService{}).(*services.FileService) + pb.RegisterFileServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.RegionCountryService{}).(*services.RegionCountryService) + pb.RegisterRegionCountryServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.RegionProvinceService{}).(*services.RegionProvinceService) + pb.RegisterRegionProvinceServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.IPListService{}).(*services.IPListService) + pb.RegisterIPListServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.IPItemService{}).(*services.IPItemService) + pb.RegisterIPItemServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.LogService{}).(*services.LogService) + pb.RegisterLogServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.DNSProviderService{}).(*services.DNSProviderService) + pb.RegisterDNSProviderServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.DNSDomainService{}).(*services.DNSDomainService) + pb.RegisterDNSDomainServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.DNSService{}).(*services.DNSService) + pb.RegisterDNSServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.ACMEUserService{}).(*services.ACMEUserService) + pb.RegisterACMEUserServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.ACMETaskService{}).(*services.ACMETaskService) + pb.RegisterACMETaskServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.ACMEAuthenticationService{}).(*services.ACMEAuthenticationService) + pb.RegisterACMEAuthenticationServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.UserService{}).(*services.UserService) + pb.RegisterUserServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.ServerDailyStatService{}).(*services.ServerDailyStatService) + pb.RegisterServerDailyStatServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.UserBillService{}).(*services.UserBillService) + pb.RegisterUserBillServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.UserNodeService{}).(*services.UserNodeService) + pb.RegisterUserNodeServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.LoginService{}).(*services.LoginService) + pb.RegisterLoginServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.UserAccessKeyService{}).(*services.UserAccessKeyService) + pb.RegisterUserAccessKeyServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.SysLockerService{}).(*services.SysLockerService) + pb.RegisterSysLockerServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.NodeTaskService{}).(*services.NodeTaskService) + pb.RegisterNodeTaskServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.NodeValueService{}).(*services.NodeValueService) + pb.RegisterNodeValueServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.DBService{}).(*services.DBService) + pb.RegisterDBServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.ServerRegionCityMonthlyStatService{}).(*services.ServerRegionCityMonthlyStatService) + pb.RegisterServerRegionCityMonthlyStatServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.ServerRegionCountryMonthlyStatService{}).(*services.ServerRegionCountryMonthlyStatService) + pb.RegisterServerRegionCountryMonthlyStatServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.ServerRegionProvinceMonthlyStatService{}).(*services.ServerRegionProvinceMonthlyStatService) + pb.RegisterServerRegionProvinceMonthlyStatServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.ServerRegionProviderMonthlyStatService{}).(*services.ServerRegionProviderMonthlyStatService) + pb.RegisterServerRegionProviderMonthlyStatServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.ServerClientSystemMonthlyStatService{}).(*services.ServerClientSystemMonthlyStatService) + pb.RegisterServerClientSystemMonthlyStatServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.ServerClientBrowserMonthlyStatService{}).(*services.ServerClientBrowserMonthlyStatService) + pb.RegisterServerClientBrowserMonthlyStatServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.ServerHTTPFirewallDailyStatService{}).(*services.ServerHTTPFirewallDailyStatService) + pb.RegisterServerHTTPFirewallDailyStatServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.DNSTaskService{}).(*services.DNSTaskService) + pb.RegisterDNSTaskServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.NodeClusterFirewallActionService{}).(*services.NodeClusterFirewallActionService) + pb.RegisterNodeClusterFirewallActionServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.MonitorNodeService{}).(*services.MonitorNodeService) + pb.RegisterMonitorNodeServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.AuthorityKeyService{}).(*services.AuthorityKeyService) + pb.RegisterAuthorityKeyServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.AuthorityNodeService{}).(*services.AuthorityNodeService) + pb.RegisterAuthorityNodeServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.LatestItemService{}).(*services.LatestItemService) + pb.RegisterLatestItemServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.NodeThresholdService{}).(*services.NodeThresholdService) + pb.RegisterNodeThresholdServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.HTTPFastcgiService{}).(*services.HTTPFastcgiService) + pb.RegisterHTTPFastcgiServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&nameservers.NSClusterService{}).(*nameservers.NSClusterService) + pb.RegisterNSClusterServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&nameservers.NSNodeService{}).(*nameservers.NSNodeService) + pb.RegisterNSNodeServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&nameservers.NSDomainService{}).(*nameservers.NSDomainService) + pb.RegisterNSDomainServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&nameservers.NSRecordService{}).(*nameservers.NSRecordService) + pb.RegisterNSRecordServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&nameservers.NSRouteService{}).(*nameservers.NSRouteService) + pb.RegisterNSRouteServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&nameservers.NSAccessLogService{}).(*nameservers.NSAccessLogService) + pb.RegisterNSAccessLogServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.HTTPAuthPolicyService{}).(*services.HTTPAuthPolicyService) + pb.RegisterHTTPAuthPolicyServiceServer(server, instance) + this.rest(instance) + } + + // TODO check service names + for serviceName := range server.GetServiceInfo() { + index := strings.LastIndex(serviceName, ".") + if index >= 0 { + serviceName = serviceName[index+1:] + } + _, ok := restServicesMap[serviceName] + if !ok { + panic("can not find service '" + serviceName + "' in rest") + } + } +} + +func (this *APINode) rest(instance interface{}) { + this.serviceInstanceLocker.Lock() + defer this.serviceInstanceLocker.Unlock() + + var name = reflect.TypeOf(instance).String() + index := strings.LastIndex(name, ".") + if index >= 0 { + name = name[index+1:] + } + + _, ok := restServicesMap[name] + if ok { + return + } + restServicesMap[name] = reflect.ValueOf(instance) +} + +func (this *APINode) serviceInstance(instance interface{}) interface{} { + this.serviceInstanceLocker.Lock() + defer this.serviceInstanceLocker.Unlock() + + typeName := reflect.TypeOf(instance).String() + result, ok := this.serviceInstanceMap[typeName] + if ok { + return result + } + + this.serviceInstanceMap[typeName] = instance + return instance } diff --git a/internal/nodes/rest_server.go b/internal/nodes/rest_server.go index 90eba94b..41ea3332 100644 --- a/internal/nodes/rest_server.go +++ b/internal/nodes/rest_server.go @@ -13,14 +13,13 @@ import ( "net/http" "reflect" "regexp" + "strings" "time" ) var servicePathReg = regexp.MustCompile(`^/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)$`) -var servicesMap = map[string]reflect.Value{ +var restServicesMap = map[string]reflect.Value{ "APIAccessTokenService": reflect.ValueOf(new(services.APIAccessTokenService)), - "HTTPAccessLogService": reflect.ValueOf(new(services.HTTPAccessLogService)), - "IPItemService": reflect.ValueOf(new(services.IPItemService)), } type RestServer struct{} @@ -67,12 +66,19 @@ func (this *RestServer) handle(writer http.ResponseWriter, req *http.Request) { serviceName := matches[1] methodName := matches[2] - serviceType, ok := servicesMap[serviceName] + serviceType, ok := restServicesMap[serviceName] if !ok { writer.WriteHeader(http.StatusNotFound) return } + if len(methodName) == 0 { + writer.WriteHeader(http.StatusNotFound) + return + } + + // 再次查找 + methodName = strings.ToUpper(string(methodName[0])) + methodName[1:] method := serviceType.MethodByName(methodName) if !method.IsValid() { writer.WriteHeader(http.StatusNotFound) @@ -90,7 +96,7 @@ func (this *RestServer) handle(writer http.ResponseWriter, req *http.Request) { // 上下文 ctx := context.Background() - if serviceName != "APIAccessTokenService" || methodName != "GetAPIAccessToken" { + if serviceName != "APIAccessTokenService" || (methodName != "GetAPIAccessToken" && methodName != "getAPIAccessToken") { // 校验TOKEN token := req.Header.Get("Edge-Access-Token") if len(token) == 0 { @@ -123,6 +129,8 @@ func (this *RestServer) handle(writer http.ResponseWriter, req *http.Request) { if accessToken.UserId > 0 { ctx = rpcutils.NewPlainContext("user", int64(accessToken.UserId)) + } else if accessToken.AdminId > 0 { + ctx = rpcutils.NewPlainContext("admin", int64(accessToken.AdminId)) } else { // TODO 支持更多类型的角色 this.writeJSON(writer, maps.Map{ diff --git a/internal/rpc/services/service_api_access_token.go b/internal/rpc/services/service_api_access_token.go index 91cd754c..ed298a30 100644 --- a/internal/rpc/services/service_api_access_token.go +++ b/internal/rpc/services/service_api_access_token.go @@ -14,7 +14,7 @@ type APIAccessTokenService struct { // GetAPIAccessToken 获取AccessToken func (this *APIAccessTokenService) GetAPIAccessToken(ctx context.Context, req *pb.GetAPIAccessTokenRequest) (*pb.GetAPIAccessTokenResponse, error) { - if req.Type == "user" { // 用户 + if req.Type == "user" || req.Type == "admin" { // 用户或管理员 tx := this.NullTx() accessKey, err := models.SharedUserAccessKeyDAO.FindAccessKeyWithUniqueId(tx, req.AccessKeyId) @@ -28,6 +28,18 @@ func (this *APIAccessTokenService) GetAPIAccessToken(ctx context.Context, req *p return nil, errors.New("access key not found") } + // 检查数据 + switch req.Type { + case "user": + if accessKey.UserId == 0 { + return nil, errors.New("access key not found") + } + case "admin": + if accessKey.AdminId == 0 { + return nil, errors.New("access key not found") + } + } + // 更新AccessKey访问时间 err = models.SharedUserAccessKeyDAO.UpdateAccessKeyAccessedAt(tx, int64(accessKey.Id)) if err != nil { @@ -35,7 +47,7 @@ func (this *APIAccessTokenService) GetAPIAccessToken(ctx context.Context, req *p } // 创建AccessToken - token, expiresAt, err := models.SharedAPIAccessTokenDAO.GenerateAccessToken(tx, int64(accessKey.UserId)) + token, expiresAt, err := models.SharedAPIAccessTokenDAO.GenerateAccessToken(tx, int64(accessKey.AdminId), int64(accessKey.UserId)) if err != nil { return nil, err } diff --git a/internal/rpc/services/service_user_access_key.go b/internal/rpc/services/service_user_access_key.go index ea0da9b9..d73249d9 100644 --- a/internal/rpc/services/service_user_access_key.go +++ b/internal/rpc/services/service_user_access_key.go @@ -20,7 +20,7 @@ func (this *UserAccessKeyService) CreateUserAccessKey(ctx context.Context, req * tx := this.NullTx() - userAccessKeyId, err := models.SharedUserAccessKeyDAO.CreateAccessKey(tx, req.UserId, req.Description) + userAccessKeyId, err := models.SharedUserAccessKeyDAO.CreateAccessKey(tx, req.AdminId, req.UserId, req.Description) if err != nil { return nil, err } @@ -36,7 +36,7 @@ func (this *UserAccessKeyService) FindAllEnabledUserAccessKeys(ctx context.Conte tx := this.NullTx() - accessKeys, err := models.SharedUserAccessKeyDAO.FindAllEnabledAccessKeys(tx, req.UserId) + accessKeys, err := models.SharedUserAccessKeyDAO.FindAllEnabledAccessKeys(tx, req.AdminId, req.UserId) if err != nil { return nil, err } @@ -68,7 +68,7 @@ func (this *UserAccessKeyService) DeleteUserAccessKey(ctx context.Context, req * tx := this.NullTx() if userId > 0 { - ok, err := models.SharedUserAccessKeyDAO.CheckUserAccessKey(tx, userId, req.UserAccessKeyId) + ok, err := models.SharedUserAccessKeyDAO.CheckUserAccessKey(tx, 0, userId, req.UserAccessKeyId) if err != nil { return nil, err } @@ -94,7 +94,7 @@ func (this *UserAccessKeyService) UpdateUserAccessKeyIsOn(ctx context.Context, r tx := this.NullTx() if userId > 0 { - ok, err := models.SharedUserAccessKeyDAO.CheckUserAccessKey(tx, userId, req.UserAccessKeyId) + ok, err := models.SharedUserAccessKeyDAO.CheckUserAccessKey(tx, 0, userId, req.UserAccessKeyId) if err != nil { return nil, err } @@ -109,3 +109,18 @@ func (this *UserAccessKeyService) UpdateUserAccessKeyIsOn(ctx context.Context, r } return this.Success() } + +// CountAllEnabledUserAccessKeys 计算AccessKey数量 +func (this *UserAccessKeyService) CountAllEnabledUserAccessKeys(ctx context.Context, req *pb.CountAllEnabledUserAccessKeysRequest) (*pb.RPCCountResponse, error) { + _, _, err := this.ValidateAdminAndUser(ctx, 0, req.UserId) + if err != nil { + return nil, err + } + + tx := this.NullTx() + count, err := models.SharedUserAccessKeyDAO.CountAllEnabledAccessKeys(tx, req.AdminId, req.UserId) + if err != nil { + return nil, err + } + return this.SuccessCount(count) +}