mirror of
https://github.com/woodchen-ink/certimate.git
synced 2025-07-19 09:51:55 +08:00
commit
9cea6775d1
1
.vscode/settings.json
vendored
1
.vscode/settings.json
vendored
@ -11,6 +11,7 @@
|
|||||||
"gopls": {
|
"gopls": {
|
||||||
"formatting.gofumpt": true,
|
"formatting.gofumpt": true,
|
||||||
},
|
},
|
||||||
|
"typescript.tsdk": "ui/node_modules/typescript/lib",
|
||||||
"[go]": {
|
"[go]": {
|
||||||
"editor.defaultFormatter": "golang.go"
|
"editor.defaultFormatter": "golang.go"
|
||||||
},
|
},
|
||||||
|
165
go.mod
165
go.mod
@ -1,40 +1,41 @@
|
|||||||
module github.com/usual2970/certimate
|
module github.com/usual2970/certimate
|
||||||
|
|
||||||
go 1.22.0
|
go 1.23.0
|
||||||
|
|
||||||
toolchain go1.23.2
|
toolchain go1.23.2
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/alibabacloud-go/alb-20200616/v2 v2.2.1
|
github.com/alibabacloud-go/alb-20200616/v2 v2.2.6
|
||||||
github.com/alibabacloud-go/cas-20200407/v3 v3.0.1
|
github.com/alibabacloud-go/cas-20200407/v3 v3.0.4
|
||||||
github.com/alibabacloud-go/cdn-20180510/v5 v5.0.0
|
github.com/alibabacloud-go/cdn-20180510/v5 v5.2.2
|
||||||
github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.10
|
github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.10
|
||||||
github.com/alibabacloud-go/nlb-20220430/v2 v2.0.3
|
github.com/alibabacloud-go/nlb-20220430/v2 v2.0.3
|
||||||
github.com/alibabacloud-go/slb-20140515/v4 v4.0.9
|
github.com/alibabacloud-go/slb-20140515/v4 v4.0.9
|
||||||
github.com/alibabacloud-go/tea v1.2.2
|
github.com/alibabacloud-go/tea v1.2.2
|
||||||
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible
|
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible
|
||||||
github.com/baidubce/bce-sdk-go v0.9.197
|
github.com/baidubce/bce-sdk-go v0.9.209
|
||||||
github.com/go-acme/lego/v4 v4.20.2
|
github.com/byteplus-sdk/byteplus-sdk-golang v1.0.35
|
||||||
|
github.com/go-acme/lego/v4 v4.21.0
|
||||||
github.com/gojek/heimdall/v7 v7.0.3
|
github.com/gojek/heimdall/v7 v7.0.3
|
||||||
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.120
|
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.128
|
||||||
github.com/labstack/echo/v5 v5.0.0-20230722203903-ec5b858dab61
|
github.com/labstack/echo/v5 v5.0.0-20230722203903-ec5b858dab61
|
||||||
github.com/nikoksr/notify v1.0.0
|
github.com/nikoksr/notify v1.1.0
|
||||||
github.com/pavlo-v-chernykh/keystore-go/v4 v4.5.0
|
github.com/pavlo-v-chernykh/keystore-go/v4 v4.5.0
|
||||||
github.com/pkg/sftp v1.13.6
|
github.com/pkg/sftp v1.13.7
|
||||||
github.com/pocketbase/dbx v1.10.1
|
github.com/pocketbase/dbx v1.11.0
|
||||||
github.com/pocketbase/pocketbase v0.22.18
|
github.com/pocketbase/pocketbase v0.22.21
|
||||||
github.com/qiniu/go-sdk/v7 v7.22.0
|
github.com/qiniu/go-sdk/v7 v7.25.1
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.1017
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.1065
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1031
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1065
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1034
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1065
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.0.992
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.0.1065
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.1030
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.1065
|
||||||
github.com/volcengine/volc-sdk-golang v1.0.184
|
github.com/volcengine/volc-sdk-golang v1.0.189
|
||||||
golang.org/x/crypto v0.28.0
|
golang.org/x/crypto v0.31.0
|
||||||
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56
|
golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67
|
||||||
k8s.io/api v0.31.1
|
k8s.io/api v0.32.0
|
||||||
k8s.io/apimachinery v0.31.1
|
k8s.io/apimachinery v0.32.0
|
||||||
k8s.io/client-go v0.31.1
|
k8s.io/client-go v0.32.0
|
||||||
software.sslmate.com/src/go-pkcs12 v0.5.0
|
software.sslmate.com/src/go-pkcs12 v0.5.0
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -44,23 +45,21 @@ require (
|
|||||||
github.com/alibabacloud-go/tea-oss-sdk v1.1.3 // indirect
|
github.com/alibabacloud-go/tea-oss-sdk v1.1.3 // indirect
|
||||||
github.com/alibabacloud-go/tea-oss-utils v1.1.0 // indirect
|
github.com/alibabacloud-go/tea-oss-utils v1.1.0 // indirect
|
||||||
github.com/alibabacloud-go/tea-utils/v2 v2.0.6 // indirect
|
github.com/alibabacloud-go/tea-utils/v2 v2.0.6 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/route53 v1.46.0 // indirect
|
github.com/aws/aws-sdk-go-v2/service/route53 v1.46.4 // indirect
|
||||||
github.com/blinkbean/dingtalk v1.1.3 // indirect
|
github.com/blinkbean/dingtalk v1.1.3 // indirect
|
||||||
github.com/byteplus-sdk/byteplus-sdk-golang v1.0.35 // indirect
|
|
||||||
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
|
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
|
||||||
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
|
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
|
||||||
github.com/go-lark/lark v1.14.1 // indirect
|
github.com/go-lark/lark v1.15.0 // indirect
|
||||||
github.com/go-logr/logr v1.4.2 // indirect
|
github.com/go-logr/logr v1.4.2 // indirect
|
||||||
github.com/go-openapi/jsonpointer v0.19.6 // indirect
|
github.com/go-openapi/jsonpointer v0.21.0 // indirect
|
||||||
github.com/go-openapi/jsonreference v0.20.2 // indirect
|
github.com/go-openapi/jsonreference v0.20.2 // indirect
|
||||||
github.com/go-openapi/swag v0.22.4 // indirect
|
github.com/go-openapi/swag v0.23.0 // indirect
|
||||||
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible // indirect
|
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible // indirect
|
||||||
github.com/gogo/protobuf v1.3.2 // indirect
|
github.com/gogo/protobuf v1.3.2 // indirect
|
||||||
github.com/golang/protobuf v1.5.4 // indirect
|
github.com/golang/protobuf v1.5.4 // indirect
|
||||||
github.com/google/gnostic-models v0.6.8 // indirect
|
github.com/google/gnostic-models v0.6.8 // indirect
|
||||||
github.com/google/go-cmp v0.6.0 // indirect
|
github.com/google/go-cmp v0.6.0 // indirect
|
||||||
github.com/google/gofuzz v1.2.0 // indirect
|
github.com/google/gofuzz v1.2.0 // indirect
|
||||||
github.com/imdario/mergo v0.3.6 // indirect
|
|
||||||
github.com/josharian/intern v1.0.0 // indirect
|
github.com/josharian/intern v1.0.0 // indirect
|
||||||
github.com/mailru/easyjson v0.7.7 // indirect
|
github.com/mailru/easyjson v0.7.7 // indirect
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||||
@ -69,13 +68,13 @@ require (
|
|||||||
github.com/technoweenie/multipartstreamer v1.0.1 // indirect
|
github.com/technoweenie/multipartstreamer v1.0.1 // indirect
|
||||||
github.com/x448/float16 v0.8.4 // indirect
|
github.com/x448/float16 v0.8.4 // indirect
|
||||||
go.mongodb.org/mongo-driver v1.12.0 // indirect
|
go.mongodb.org/mongo-driver v1.12.0 // indirect
|
||||||
|
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
|
||||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
|
||||||
k8s.io/klog/v2 v2.130.1 // indirect
|
k8s.io/klog/v2 v2.130.1 // indirect
|
||||||
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect
|
k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect
|
||||||
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect
|
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
|
||||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
|
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
|
sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect
|
||||||
sigs.k8s.io/yaml v1.4.0 // indirect
|
sigs.k8s.io/yaml v1.4.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -86,50 +85,50 @@ require (
|
|||||||
github.com/alibabacloud-go/dcdn-20180115/v3 v3.4.2
|
github.com/alibabacloud-go/dcdn-20180115/v3 v3.4.2
|
||||||
github.com/alibabacloud-go/debug v1.0.1 // indirect
|
github.com/alibabacloud-go/debug v1.0.1 // indirect
|
||||||
github.com/alibabacloud-go/endpoint-util v1.1.0 // indirect
|
github.com/alibabacloud-go/endpoint-util v1.1.0 // indirect
|
||||||
github.com/alibabacloud-go/openapi-util v0.1.0 // indirect
|
github.com/alibabacloud-go/openapi-util v0.1.1 // indirect
|
||||||
github.com/alibabacloud-go/tea-utils v1.4.5 // indirect
|
github.com/alibabacloud-go/tea-utils v1.4.5 // indirect
|
||||||
github.com/alibabacloud-go/tea-xml v1.1.3 // indirect
|
github.com/alibabacloud-go/tea-xml v1.1.3 // indirect
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go v1.63.47 // indirect
|
github.com/aliyun/alibaba-cloud-sdk-go v1.63.72 // indirect
|
||||||
github.com/aliyun/credentials-go v1.3.10 // indirect
|
github.com/aliyun/credentials-go v1.3.10 // indirect
|
||||||
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
|
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2 v1.32.3 // indirect
|
github.com/aws/aws-sdk-go-v2 v1.32.7 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 // indirect
|
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/config v1.28.1 // indirect
|
github.com/aws/aws-sdk-go-v2/config v1.28.7 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/credentials v1.17.42 // indirect
|
github.com/aws/aws-sdk-go-v2/credentials v1.17.48 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 // indirect
|
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.8 // indirect
|
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.44 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 // indirect
|
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 // indirect
|
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
|
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22 // indirect
|
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.26 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 // indirect
|
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3 // indirect
|
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.7 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 // indirect
|
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3 // indirect
|
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.7 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2 // indirect
|
github.com/aws/aws-sdk-go-v2/service/s3 v1.71.1 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 // indirect
|
github.com/aws/aws-sdk-go-v2/service/sso v1.24.8 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 // indirect
|
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 // indirect
|
github.com/aws/aws-sdk-go-v2/service/sts v1.33.3 // indirect
|
||||||
github.com/aws/smithy-go v1.22.0 // indirect
|
github.com/aws/smithy-go v1.22.1 // indirect
|
||||||
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
|
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
|
||||||
github.com/clbanning/mxj/v2 v2.5.6 // indirect
|
github.com/clbanning/mxj/v2 v2.5.6 // indirect
|
||||||
github.com/cloudflare/cloudflare-go v0.108.0 // indirect
|
github.com/cloudflare/cloudflare-go v0.112.0 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||||
github.com/disintegration/imaging v1.6.2 // indirect
|
github.com/disintegration/imaging v1.6.2 // indirect
|
||||||
github.com/domodwyer/mailyak/v3 v3.6.2
|
github.com/domodwyer/mailyak/v3 v3.6.2
|
||||||
github.com/dustin/go-humanize v1.0.1 // indirect
|
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||||
github.com/fatih/color v1.17.0 // indirect
|
github.com/fatih/color v1.18.0 // indirect
|
||||||
github.com/gabriel-vasile/mimetype v1.4.6 // indirect
|
github.com/gabriel-vasile/mimetype v1.4.7 // indirect
|
||||||
github.com/ganigeorgiev/fexpr v0.4.1 // indirect
|
github.com/ganigeorgiev/fexpr v0.4.1 // indirect
|
||||||
github.com/go-jose/go-jose/v4 v4.0.4 // indirect
|
github.com/go-jose/go-jose/v4 v4.0.4 // indirect
|
||||||
github.com/go-ozzo/ozzo-validation/v4 v4.3.0 // indirect
|
github.com/go-ozzo/ozzo-validation/v4 v4.3.0 // indirect
|
||||||
github.com/goccy/go-json v0.10.3 // indirect
|
github.com/goccy/go-json v0.10.4 // indirect
|
||||||
github.com/gojek/valkyrie v0.0.0-20180215180059-6aee720afcdf // indirect
|
github.com/gojek/valkyrie v0.0.0-20180215180059-6aee720afcdf // indirect
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.1 // indirect
|
github.com/golang-jwt/jwt/v4 v4.5.1 // indirect
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
|
||||||
github.com/google/go-querystring v1.1.0 // indirect
|
github.com/google/go-querystring v1.1.0 // indirect
|
||||||
github.com/google/uuid v1.6.0 // indirect
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
github.com/googleapis/gax-go/v2 v2.13.0 // indirect
|
github.com/googleapis/gax-go/v2 v2.14.1 // indirect
|
||||||
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
|
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
|
||||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||||
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
||||||
@ -148,39 +147,39 @@ require (
|
|||||||
github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect
|
github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||||
github.com/spf13/cast v1.6.0 // indirect
|
github.com/spf13/cast v1.7.1 // indirect
|
||||||
github.com/spf13/cobra v1.8.1 // indirect
|
github.com/spf13/cobra v1.8.1 // indirect
|
||||||
github.com/spf13/pflag v1.0.5 // indirect
|
github.com/spf13/pflag v1.0.5 // indirect
|
||||||
github.com/stretchr/objx v0.5.2 // indirect
|
github.com/stretchr/objx v0.5.2 // indirect
|
||||||
github.com/stretchr/testify v1.9.0 // indirect
|
github.com/stretchr/testify v1.10.0 // indirect
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1034 // indirect
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1065 // indirect
|
||||||
github.com/tjfoc/gmsm v1.4.1 // indirect
|
github.com/tjfoc/gmsm v1.4.1 // indirect
|
||||||
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
||||||
github.com/valyala/fasttemplate v1.2.2 // indirect
|
github.com/valyala/fasttemplate v1.2.2 // indirect
|
||||||
go.opencensus.io v0.24.0 // indirect
|
go.opencensus.io v0.24.0 // indirect
|
||||||
gocloud.dev v0.37.0 // indirect
|
gocloud.dev v0.40.0 // indirect
|
||||||
golang.org/x/image v0.18.0 // indirect
|
golang.org/x/image v0.23.0 // indirect
|
||||||
golang.org/x/mod v0.21.0 // indirect
|
golang.org/x/mod v0.22.0 // indirect
|
||||||
golang.org/x/net v0.30.0 // indirect
|
golang.org/x/net v0.33.0 // indirect
|
||||||
golang.org/x/oauth2 v0.23.0 // indirect
|
golang.org/x/oauth2 v0.24.0 // indirect
|
||||||
golang.org/x/sync v0.8.0
|
golang.org/x/sync v0.10.0
|
||||||
golang.org/x/sys v0.26.0 // indirect
|
golang.org/x/sys v0.28.0 // indirect
|
||||||
golang.org/x/term v0.25.0 // indirect
|
golang.org/x/term v0.27.0 // indirect
|
||||||
golang.org/x/text v0.19.0 // indirect
|
golang.org/x/text v0.21.0 // indirect
|
||||||
golang.org/x/time v0.7.0 // indirect
|
golang.org/x/time v0.8.0 // indirect
|
||||||
golang.org/x/tools v0.25.0 // indirect
|
golang.org/x/tools v0.28.0 // indirect
|
||||||
golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect
|
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
|
||||||
google.golang.org/api v0.204.0 // indirect
|
google.golang.org/api v0.214.0 // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20241219192143-6b3ec007d9bb // indirect
|
||||||
google.golang.org/grpc v1.67.1 // indirect
|
google.golang.org/grpc v1.69.2 // indirect
|
||||||
google.golang.org/protobuf v1.35.1 // indirect
|
google.golang.org/protobuf v1.36.0 // indirect
|
||||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
modernc.org/gc/v3 v3.0.0-20240722195230-4a140ff9c08e // indirect
|
modernc.org/gc/v3 v3.0.0-20241213165251-3bc300f6d0c9 // indirect
|
||||||
modernc.org/libc v1.55.3 // indirect
|
modernc.org/libc v1.61.5 // indirect
|
||||||
modernc.org/mathutil v1.6.0 // indirect
|
modernc.org/mathutil v1.7.0 // indirect
|
||||||
modernc.org/memory v1.8.0 // indirect
|
modernc.org/memory v1.8.0 // indirect
|
||||||
modernc.org/sqlite v1.31.1 // indirect
|
modernc.org/sqlite v1.34.4 // indirect
|
||||||
modernc.org/strutil v1.2.0 // indirect
|
modernc.org/strutil v1.2.0 // indirect
|
||||||
modernc.org/token v1.1.0 // indirect
|
modernc.org/token v1.1.0 // indirect
|
||||||
)
|
)
|
||||||
|
441
go.sum
441
go.sum
@ -1,3 +1,5 @@
|
|||||||
|
cel.dev/expr v0.18.0 h1:CJ6drgk+Hf96lkLikr4rFf19WrU0BOWEihyZnI2TAzo=
|
||||||
|
cel.dev/expr v0.18.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=
|
||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
||||||
@ -15,23 +17,24 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY
|
|||||||
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
|
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
|
||||||
cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE=
|
cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE=
|
||||||
cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U=
|
cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U=
|
||||||
cloud.google.com/go/auth v0.10.0 h1:tWlkvFAh+wwTOzXIjrwM64karR1iTBZ/GRr0S/DULYo=
|
cloud.google.com/go/auth v0.13.0 h1:8Fu8TZy167JkW8Tj3q7dIkr2v4cndv41ouecJx0PAHs=
|
||||||
cloud.google.com/go/auth v0.10.0/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI=
|
cloud.google.com/go/auth v0.13.0/go.mod h1:COOjD9gwfKNKz+IIduatIhYJQIc0mG3H102r/EMxX6Q=
|
||||||
cloud.google.com/go/auth/oauth2adapt v0.2.5 h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk=
|
cloud.google.com/go/auth/oauth2adapt v0.2.6 h1:V6a6XDu2lTwPZWOawrAa9HUK+DB2zfJyTuciBG5hFkU=
|
||||||
cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8=
|
cloud.google.com/go/auth/oauth2adapt v0.2.6/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8=
|
||||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||||
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
||||||
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
||||||
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
|
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
|
||||||
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
|
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
|
||||||
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
|
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
|
||||||
cloud.google.com/go/compute v1.25.0 h1:H1/4SqSUhjPFE7L5ddzHOfY2bCAvjwNRZPNl6Ni5oYU=
|
cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I=
|
||||||
cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo=
|
cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg=
|
||||||
cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k=
|
|
||||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||||
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
||||||
cloud.google.com/go/iam v1.1.11 h1:0mQ8UKSfdHLut6pH9FM3bI55KWR46ketn0PuXleDyxw=
|
cloud.google.com/go/iam v1.2.2 h1:ozUSofHUGf/F4tCNy/mu9tHLTaxZFLOUiKzjcgWHGIA=
|
||||||
cloud.google.com/go/iam v1.1.11/go.mod h1:biXoiLWYIKntto2joP+62sd9uW5EpkZmKIvfNcTWlnQ=
|
cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY=
|
||||||
|
cloud.google.com/go/monitoring v1.21.2 h1:FChwVtClH19E7pJ+e0xUhJPGksctZNVOk2UhMmblmdU=
|
||||||
|
cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU=
|
||||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
||||||
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
||||||
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
||||||
@ -41,8 +44,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
|
|||||||
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
|
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
|
||||||
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
|
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
|
||||||
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
||||||
cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs=
|
cloud.google.com/go/storage v1.45.0 h1:5av0QcIVj77t+44mV4gffFC/LscFRUhto6UBMB5SimM=
|
||||||
cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0=
|
cloud.google.com/go/storage v1.45.0/go.mod h1:wpPblkIuMP5jCB/E48Pz9zIo2S/zD8g+ITmxKkPCITE=
|
||||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||||
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
||||||
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
||||||
@ -56,6 +59,12 @@ github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2
|
|||||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||||
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
||||||
github.com/DataDog/datadog-go v3.7.1+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
github.com/DataDog/datadog-go v3.7.1+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
||||||
|
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.3 h1:cb3br57K508pQEFgBxn9GDhPS9HefpyMPK1RzmtMNzk=
|
||||||
|
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.3/go.mod h1:itPGVDKf9cC/ov4MdvJ2QZ0khw4bfoo9jzwTJlaxy2k=
|
||||||
|
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.3 h1:xir5X8TS8UBVPWg2jHL+cSTf0jZgqYQSA54TscSt1/0=
|
||||||
|
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.3/go.mod h1:SsdWig2J5PMnfMvfJuEb1uZa8Y+kvNyvrULFo69gTFk=
|
||||||
|
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.3 h1:2vcVkrNdSMJpoOVAWi9ApsQR5iqNeFGt5Qx8Xlt3IoI=
|
||||||
|
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.3/go.mod h1:wRbFgBQUVm1YXrvWKofAEmq9HNJTDphbAaJSSX01KUI=
|
||||||
github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
|
github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
|
||||||
github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
|
github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
|
||||||
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
|
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
|
||||||
@ -75,17 +84,17 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF
|
|||||||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
|
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
|
||||||
github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82/go.mod h1:nLnM0KdK1CmygvjpDUO6m1TjSsiQtL61juhNsvV/JVI=
|
github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82/go.mod h1:nLnM0KdK1CmygvjpDUO6m1TjSsiQtL61juhNsvV/JVI=
|
||||||
github.com/alibabacloud-go/alb-20200616/v2 v2.2.1 h1:b8ixnrkFhWrmJQd+iEE1UWPD5vdyC3d9l7G0uvkfi2s=
|
github.com/alibabacloud-go/alb-20200616/v2 v2.2.6 h1:lgTuFZSfULbwpotnmE8qguIWTwR+X+F5Xrz6WrHQCaA=
|
||||||
github.com/alibabacloud-go/alb-20200616/v2 v2.2.1/go.mod h1:cPdZwovbqpv+5nM/HnMwZpG5q0/gBuX31hu2H1VoyrM=
|
github.com/alibabacloud-go/alb-20200616/v2 v2.2.6/go.mod h1:jU/K+GVb5b0vjiDpkf6E0dH77tsi1jTLGWm4ouCiRxk=
|
||||||
github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6 h1:eIf+iGJxdU4U9ypaUfbtOWCsZSbTb8AUHvyPrxu6mAA=
|
github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6 h1:eIf+iGJxdU4U9ypaUfbtOWCsZSbTb8AUHvyPrxu6mAA=
|
||||||
github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6/go.mod h1:4EUIoxs/do24zMOGGqYVWgw0s9NtiylnJglOeEB5UJo=
|
github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6/go.mod h1:4EUIoxs/do24zMOGGqYVWgw0s9NtiylnJglOeEB5UJo=
|
||||||
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc=
|
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc=
|
||||||
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 h1:zE8vH9C7JiZLNJJQ5OwjU9mSi4T9ef9u3BURT6LCLC8=
|
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 h1:zE8vH9C7JiZLNJJQ5OwjU9mSi4T9ef9u3BURT6LCLC8=
|
||||||
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5/go.mod h1:tWnyE9AjF8J8qqLk645oUmVUnFybApTQWklQmi5tY6g=
|
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5/go.mod h1:tWnyE9AjF8J8qqLk645oUmVUnFybApTQWklQmi5tY6g=
|
||||||
github.com/alibabacloud-go/cas-20200407/v3 v3.0.1 h1:kAxd9IkdMaIX9aoBRA34q9WXKnkKTucil/zUlG4/3vo=
|
github.com/alibabacloud-go/cas-20200407/v3 v3.0.4 h1:ngRlctbt135zoujwX0lXSv9m4h1/bmg/yalQS0z1EWc=
|
||||||
github.com/alibabacloud-go/cas-20200407/v3 v3.0.1/go.mod h1:gElMYWcjdjKgqq9/2YxE6BIUMs10ZNGM4PRiRlDXgBs=
|
github.com/alibabacloud-go/cas-20200407/v3 v3.0.4/go.mod h1:6n9MZ9SH3HlSzfe2oKwjOqhJx3dxvW2gMDO+lq8t9U4=
|
||||||
github.com/alibabacloud-go/cdn-20180510/v5 v5.0.0 h1:yTKngw4rBR3hdpoo/uCyBffYXfPfjNjlaDL8nTYUIds=
|
github.com/alibabacloud-go/cdn-20180510/v5 v5.2.2 h1:+KJOPukTM+xMyiLOW5qBwYKG2df3Ar7coRsqc1juKO8=
|
||||||
github.com/alibabacloud-go/cdn-20180510/v5 v5.0.0/go.mod h1:HxQrwVKBx3/6bIwmdDcpqBpSQt2tpi/j4LfEhl+QFPk=
|
github.com/alibabacloud-go/cdn-20180510/v5 v5.2.2/go.mod h1:GnPiPL3HlzCi8SGiLiVgKrAFkP1vTtcF4yGtjsl4wfo=
|
||||||
github.com/alibabacloud-go/darabonba-array v0.1.0 h1:vR8s7b1fWAQIjEjWnuF0JiKsCvclSRTfDzZHTYqfufY=
|
github.com/alibabacloud-go/darabonba-array v0.1.0 h1:vR8s7b1fWAQIjEjWnuF0JiKsCvclSRTfDzZHTYqfufY=
|
||||||
github.com/alibabacloud-go/darabonba-array v0.1.0/go.mod h1:BLKxr0brnggqOJPqT09DFJ8g3fsDshapUD3C3aOEFaI=
|
github.com/alibabacloud-go/darabonba-array v0.1.0/go.mod h1:BLKxr0brnggqOJPqT09DFJ8g3fsDshapUD3C3aOEFaI=
|
||||||
github.com/alibabacloud-go/darabonba-encode-util v0.0.2 h1:1uJGrbsGEVqWcWxrS9MyC2NG0Ax+GpOM5gtupki31XE=
|
github.com/alibabacloud-go/darabonba-encode-util v0.0.2 h1:1uJGrbsGEVqWcWxrS9MyC2NG0Ax+GpOM5gtupki31XE=
|
||||||
@ -95,7 +104,6 @@ github.com/alibabacloud-go/darabonba-map v0.0.2/go.mod h1:28AJaX8FOE/ym8OUFWga+M
|
|||||||
github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.0/go.mod h1:5JHVmnHvGzR2wNdgaW1zDLQG8kOC4Uec8ubkMogW7OQ=
|
github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.0/go.mod h1:5JHVmnHvGzR2wNdgaW1zDLQG8kOC4Uec8ubkMogW7OQ=
|
||||||
github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.5/go.mod h1:kUe8JqFmoVU7lfBauaDD5taFaW7mBI+xVsyHutYtabg=
|
github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.5/go.mod h1:kUe8JqFmoVU7lfBauaDD5taFaW7mBI+xVsyHutYtabg=
|
||||||
github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.7/go.mod h1:CzQnh+94WDnJOnKZH5YRyouL+OOcdBnXY5VWAf0McgI=
|
github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.7/go.mod h1:CzQnh+94WDnJOnKZH5YRyouL+OOcdBnXY5VWAf0McgI=
|
||||||
github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.8/go.mod h1:CzQnh+94WDnJOnKZH5YRyouL+OOcdBnXY5VWAf0McgI=
|
|
||||||
github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.9/go.mod h1:bb+Io8Sn2RuM3/Rpme6ll86jMyFSrD1bxeV/+v61KeU=
|
github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.9/go.mod h1:bb+Io8Sn2RuM3/Rpme6ll86jMyFSrD1bxeV/+v61KeU=
|
||||||
github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.10 h1:GEYkMApgpKEVDn6z12DcH1EGYpDYRB8JxsazM4Rywak=
|
github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.10 h1:GEYkMApgpKEVDn6z12DcH1EGYpDYRB8JxsazM4Rywak=
|
||||||
github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.10/go.mod h1:26a14FGhZVELuz2cc2AolvW4RHmIO3/HRwsdHhaIPDE=
|
github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.10/go.mod h1:26a14FGhZVELuz2cc2AolvW4RHmIO3/HRwsdHhaIPDE=
|
||||||
@ -114,8 +122,9 @@ github.com/alibabacloud-go/endpoint-util v1.1.0/go.mod h1:O5FuCALmCKs2Ff7JFJMudH
|
|||||||
github.com/alibabacloud-go/nlb-20220430/v2 v2.0.3 h1:LtyUVlgBEKyzWgQJurzXM6MXCt84sQr9cE5OKqYymko=
|
github.com/alibabacloud-go/nlb-20220430/v2 v2.0.3 h1:LtyUVlgBEKyzWgQJurzXM6MXCt84sQr9cE5OKqYymko=
|
||||||
github.com/alibabacloud-go/nlb-20220430/v2 v2.0.3/go.mod h1:4a/RcBYeAhYowHzX+LMgnouz7NradnSKPKl14KS3B1U=
|
github.com/alibabacloud-go/nlb-20220430/v2 v2.0.3/go.mod h1:4a/RcBYeAhYowHzX+LMgnouz7NradnSKPKl14KS3B1U=
|
||||||
github.com/alibabacloud-go/openapi-util v0.0.11/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws=
|
github.com/alibabacloud-go/openapi-util v0.0.11/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws=
|
||||||
github.com/alibabacloud-go/openapi-util v0.1.0 h1:0z75cIULkDrdEhkLWgi9tnLe+KhAFE/r5Pb3312/eAY=
|
|
||||||
github.com/alibabacloud-go/openapi-util v0.1.0/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws=
|
github.com/alibabacloud-go/openapi-util v0.1.0/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws=
|
||||||
|
github.com/alibabacloud-go/openapi-util v0.1.1 h1:ujGErJjG8ncRW6XtBBMphzHTvCxn4DjrVw4m04HsS28=
|
||||||
|
github.com/alibabacloud-go/openapi-util v0.1.1/go.mod h1:/UehBSE2cf1gYT43GV4E+RxTdLRzURImCYY0aRmlXpw=
|
||||||
github.com/alibabacloud-go/openplatform-20191219/v2 v2.0.1 h1:L0TIjr9Qh/SLVc1yPhFkcB9+9SbCNK/jPq4ZKB5zmnc=
|
github.com/alibabacloud-go/openplatform-20191219/v2 v2.0.1 h1:L0TIjr9Qh/SLVc1yPhFkcB9+9SbCNK/jPq4ZKB5zmnc=
|
||||||
github.com/alibabacloud-go/openplatform-20191219/v2 v2.0.1/go.mod h1:EKxBRDLcMzwl4VLF/1WJwlByZZECJawPXUvinKMsTTs=
|
github.com/alibabacloud-go/openplatform-20191219/v2 v2.0.1/go.mod h1:EKxBRDLcMzwl4VLF/1WJwlByZZECJawPXUvinKMsTTs=
|
||||||
github.com/alibabacloud-go/slb-20140515/v4 v4.0.9 h1:nrf9gQth7fONUj7V8i78Yb98eb9NdKl0VdeSjmeYugI=
|
github.com/alibabacloud-go/slb-20140515/v4 v4.0.9 h1:nrf9gQth7fONUj7V8i78Yb98eb9NdKl0VdeSjmeYugI=
|
||||||
@ -151,8 +160,8 @@ github.com/alibabacloud-go/tea-xml v1.1.1/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCE
|
|||||||
github.com/alibabacloud-go/tea-xml v1.1.2/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8=
|
github.com/alibabacloud-go/tea-xml v1.1.2/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8=
|
||||||
github.com/alibabacloud-go/tea-xml v1.1.3 h1:7LYnm+JbOq2B+T/B0fHC4Ies4/FofC4zHzYtqw7dgt0=
|
github.com/alibabacloud-go/tea-xml v1.1.3 h1:7LYnm+JbOq2B+T/B0fHC4Ies4/FofC4zHzYtqw7dgt0=
|
||||||
github.com/alibabacloud-go/tea-xml v1.1.3/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8=
|
github.com/alibabacloud-go/tea-xml v1.1.3/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8=
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go v1.63.47 h1:B8ApNodSpIM5ST9INmhMG4d0rRwNY/63/XjXUDO/XIo=
|
github.com/aliyun/alibaba-cloud-sdk-go v1.63.72 h1:HvFZUzEbNvfe8F2Mg0wBGv90bPhWDxgVtDHR5zoBOU0=
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go v1.63.47/go.mod h1:SOSDHfe1kX91v3W5QiBsWSLqeLxImobbMX1mxrFHsVQ=
|
github.com/aliyun/alibaba-cloud-sdk-go v1.63.72/go.mod h1:SOSDHfe1kX91v3W5QiBsWSLqeLxImobbMX1mxrFHsVQ=
|
||||||
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible h1:8psS8a+wKfiLt1iVDX79F7Y6wUM49Lcha2FMXt4UM8g=
|
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible h1:8psS8a+wKfiLt1iVDX79F7Y6wUM49Lcha2FMXt4UM8g=
|
||||||
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
|
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
|
||||||
github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw=
|
github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw=
|
||||||
@ -171,53 +180,53 @@ github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3d
|
|||||||
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
|
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
|
||||||
github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY=
|
github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY=
|
||||||
github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q=
|
github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q=
|
||||||
github.com/aws/aws-sdk-go v1.51.11 h1:El5VypsMIz7sFwAAj/j06JX9UGs4KAbAIEaZ57bNY4s=
|
github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
|
||||||
github.com/aws/aws-sdk-go v1.51.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk=
|
github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
|
||||||
github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4=
|
github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4=
|
||||||
github.com/aws/aws-sdk-go-v2 v1.32.3 h1:T0dRlFBKcdaUPGNtkBSwHZxrtis8CQU17UpNBZYd0wk=
|
github.com/aws/aws-sdk-go-v2 v1.32.7 h1:ky5o35oENWi0JYWUZkB7WYvVPP+bcRF5/Iq7JWSb5Rw=
|
||||||
github.com/aws/aws-sdk-go-v2 v1.32.3/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo=
|
github.com/aws/aws-sdk-go-v2 v1.32.7/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U=
|
||||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 h1:pT3hpW0cOHRJx8Y0DfJUEQuqPild8jRGmSFmBgvydr0=
|
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 h1:lL7IfaFzngfx0ZwUGOZdsFFnQ5uLvR0hWqqhyE7Q9M8=
|
||||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6/go.mod h1:j/I2++U0xX+cr44QjHay4Cvxj6FUbnxrgmqN3H1jTZA=
|
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7/go.mod h1:QraP0UcVlQJsmHfioCrveWOC1nbiWUl3ej08h4mXWoc=
|
||||||
github.com/aws/aws-sdk-go-v2/config v1.28.1 h1:oxIvOUXy8x0U3fR//0eq+RdCKimWI900+SV+10xsCBw=
|
github.com/aws/aws-sdk-go-v2/config v1.28.7 h1:GduUnoTXlhkgnxTD93g1nv4tVPILbdNQOzav+Wpg7AE=
|
||||||
github.com/aws/aws-sdk-go-v2/config v1.28.1/go.mod h1:bRQcttQJiARbd5JZxw6wG0yIK3eLeSCPdg6uqmmlIiI=
|
github.com/aws/aws-sdk-go-v2/config v1.28.7/go.mod h1:vZGX6GVkIE8uECSUHB6MWAUsd4ZcG2Yq/dMa4refR3M=
|
||||||
github.com/aws/aws-sdk-go-v2/credentials v1.17.42 h1:sBP0RPjBU4neGpIYyx8mkU2QqLPl5u9cmdTWVzIpHkM=
|
github.com/aws/aws-sdk-go-v2/credentials v1.17.48 h1:IYdLD1qTJ0zanRavulofmqut4afs45mOWEI+MzZtTfQ=
|
||||||
github.com/aws/aws-sdk-go-v2/credentials v1.17.42/go.mod h1:FwZBfU530dJ26rv9saAbxa9Ej3eF/AK0OAY86k13n4M=
|
github.com/aws/aws-sdk-go-v2/credentials v1.17.48/go.mod h1:tOscxHN3CGmuX9idQ3+qbkzrjVIx32lqDSU1/0d/qXs=
|
||||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 h1:68jFVtt3NulEzojFesM/WVarlFpCaXLKaBxDpzkQ9OQ=
|
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22 h1:kqOrpojG71DxJm/KDPO+Z/y1phm1JlC8/iT+5XRmAn8=
|
||||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18/go.mod h1:Fjnn5jQVIo6VyedMc0/EhPpfNlPl7dHV916O6B+49aE=
|
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22/go.mod h1:NtSFajXVVL8TA2QNngagVZmUtXciyrHOt7xgz4faS/M=
|
||||||
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.8 h1:u1KOU1S15ufyZqmH/rA3POkiRH6EcDANHj2xHRzq+zc=
|
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.44 h1:2zxMLXLedpB4K1ilbJFxtMKsVKaexOqDttOhc0QGm3Q=
|
||||||
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.8/go.mod h1:WPv2FRnkIOoDv/8j2gSUsI4qDc7392w5anFB/I89GZ8=
|
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.44/go.mod h1:VuLHdqwjSvgftNC7yqPWyGVhEwPmJpeRi07gOgOfHF8=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 h1:Jw50LwEkVjuVzE1NzkhNKkBf9cRN7MtE1F/b2cOKTUM=
|
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26 h1:I/5wmGMffY4happ8NOCuIUEWGUvvFp5NSeQcXl9RHcI=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22/go.mod h1:Y/SmAyPcOTmpeVaWSzSKiILfXTVJwrGmYZhcRbhWuEY=
|
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26/go.mod h1:FR8f4turZtNy6baO0KJ5FJUmXH/cSkI9fOngs0yl6mA=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 h1:981MHwBaRZM7+9QSR6XamDzF/o7ouUGxFzr+nVSIhrs=
|
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26 h1:zXFLuEuMMUOvEARXFUVJdfqZ4bvvSgdGRq/ATcrQxzM=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22/go.mod h1:1RA1+aBEfn+CAB/Mh0MB6LsdCYCnjZm7tKXtnk499ZQ=
|
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26/go.mod h1:3o2Wpy0bogG1kyOPrgkXA8pgIfEEv0+m19O9D5+W8y8=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ=
|
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
|
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22 h1:yV+hCAHZZYJQcwAaszoBNwLbPItHvApxT0kVIw6jRgs=
|
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.26 h1:GeNJsIFHB+WW5ap2Tec4K6dzcVTsRbsT1Lra46Hv9ME=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22/go.mod h1:kbR1TL8llqB1eGnVbybcA4/wgScxdylOdyAd51yxPdw=
|
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.26/go.mod h1:zfgMpwHDXX2WGoG84xG2H+ZlPTkJUU4YUvx2svLQYWo=
|
||||||
github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o=
|
github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 h1:TToQNkvGguu209puTojY/ozlqy2d/SFNcoLIqTFi42g=
|
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0/go.mod h1:0jp+ltwkf+SwG2fm/PKo8t4y8pJSgOCO4D8Lz3k0aHQ=
|
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3 h1:kT6BcZsmMtNkP/iYMcRG+mIEA/IbeiUimXtGmqF39y0=
|
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.7 h1:tB4tNw83KcajNAzaIMhkhVI2Nt8fAZd5A5ro113FEMY=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3/go.mod h1:Z8uGua2k4PPaGOYn66pK02rhMrot3Xk3tpBuUFPomZU=
|
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.7/go.mod h1:lvpyBGkZ3tZ9iSsUIcC2EWp+0ywa7aK3BLT+FwZi+mQ=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 h1:qcxX0JYlgWH3hpPUnd6U0ikcl6LLA9sLkXE2w1fpMvY=
|
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7 h1:8eUsivBQzZHqe/3FE+cqwfH+0p5Jo8PFM/QYQSmeZ+M=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3/go.mod h1:cLSNEmI45soc+Ef8K/L+8sEA3A3pYFEYf5B5UI+6bH4=
|
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7/go.mod h1:kLPQvGUmxn/fqiCrDeohwG33bq2pQpGeY62yRO6Nrh0=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3 h1:ZC7Y/XgKUxwqcdhO5LE8P6oGP1eh6xlQReWNKfhvJno=
|
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.7 h1:Hi0KGbrnr57bEHWM0bJ1QcBzxLrL/k2DHvGYhb8+W1w=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3/go.mod h1:WqfO7M9l9yUAw0HcHaikwRd/H6gzYdz7vjejCA5e2oY=
|
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.7/go.mod h1:wKNgWgExdjjrm4qvfbTorkvocEstaoDl4WCvGfeCy9c=
|
||||||
github.com/aws/aws-sdk-go-v2/service/route53 v1.46.0 h1:AaOWmXBSDSIEsTzx8Y2nYAxckgmBPNiRU5mjn/a9ynI=
|
github.com/aws/aws-sdk-go-v2/service/route53 v1.46.4 h1:0jMtawybbfpFEIMy4wvfyW2Z4YLr7mnuzT0fhR67Nrc=
|
||||||
github.com/aws/aws-sdk-go-v2/service/route53 v1.46.0/go.mod h1:IN9bx4yLAa3a3J7A41skQefcYObNv6ARAd2i5WxvGKg=
|
github.com/aws/aws-sdk-go-v2/service/route53 v1.46.4/go.mod h1:xlMODgumb0Pp8bzfpojqelDrf8SL9rb5ovwmwKJl+oU=
|
||||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2 h1:p9TNFL8bFUMd+38YIpTAXpoxyz0MxC7FlbFEH4P4E1U=
|
github.com/aws/aws-sdk-go-v2/service/s3 v1.71.1 h1:aOVVZJgWbaH+EJYPvEgkNhCEbXXvH7+oML36oaPK3zE=
|
||||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2/go.mod h1:fNjyo0Coen9QTwQLWeV6WO2Nytwiu+cCcWaTdKCAqqE=
|
github.com/aws/aws-sdk-go-v2/service/s3 v1.71.1/go.mod h1:r+xl5yzMk9083rMR+sJ5TYj9Tihvf/l1oxzZXDgGj2Q=
|
||||||
github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 h1:UTpsIf0loCIWEbrqdLb+0RxnTXfWh2vhw4nQmFi4nPc=
|
github.com/aws/aws-sdk-go-v2/service/sso v1.24.8 h1:CvuUmnXI7ebaUAhbJcDy9YQx8wHR69eZ9I7q5hszt/g=
|
||||||
github.com/aws/aws-sdk-go-v2/service/sso v1.24.3/go.mod h1:FZ9j3PFHHAR+w0BSEjK955w5YD2UwB/l/H0yAK3MJvI=
|
github.com/aws/aws-sdk-go-v2/service/sso v1.24.8/go.mod h1:XDeGv1opzwm8ubxddF0cgqkZWsyOtw4lr6dxwmb6YQg=
|
||||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 h1:2YCmIXv3tmiItw0LlYf6v7gEHebLY45kBEnPezbUKyU=
|
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7 h1:F2rBfNAL5UyswqoeWv9zs74N/NanhK16ydHW1pahX6E=
|
||||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3/go.mod h1:u19stRyNPxGhj6dRm+Cdgu6N75qnbW7+QN0q0dsAk58=
|
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7/go.mod h1:JfyQ0g2JG8+Krq0EuZNnRwX0mU0HrwY/tG6JNfcqh4k=
|
||||||
github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 h1:wVnQ6tigGsRqSWDEEyH6lSAJ9OyFUsSnbaUWChuSGzs=
|
github.com/aws/aws-sdk-go-v2/service/sts v1.33.3 h1:Xgv/hyNgvLda/M9l9qxXc4UFSgppnRczLxlMs5Ae/QY=
|
||||||
github.com/aws/aws-sdk-go-v2/service/sts v1.32.3/go.mod h1:VZa9yTFyj4o10YGsmDO4gbQJUvvhY72fhumT8W4LqsE=
|
github.com/aws/aws-sdk-go-v2/service/sts v1.33.3/go.mod h1:5Gn+d+VaaRgsjewpMvGazt0WfcFO+Md4wLOuBfGR9Bc=
|
||||||
github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E=
|
github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E=
|
||||||
github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM=
|
github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro=
|
||||||
github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
|
github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
|
||||||
github.com/baidubce/bce-sdk-go v0.9.197 h1:TQqa4J+FTagrywhaTQ707ffE1eG3ix1s06eSZ/K+Wk0=
|
github.com/baidubce/bce-sdk-go v0.9.209 h1:2UaYKD5D2kia+8bhLlqhYWZdhhGnx8vgHfHX7YUpXPg=
|
||||||
github.com/baidubce/bce-sdk-go v0.9.197/go.mod h1:zbYJMQwE4IZuyrJiFO8tO8NbtYiKTFTbwh4eIsqjVdg=
|
github.com/baidubce/bce-sdk-go v0.9.209/go.mod h1:zbYJMQwE4IZuyrJiFO8tO8NbtYiKTFTbwh4eIsqjVdg=
|
||||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||||
@ -234,9 +243,14 @@ github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInq
|
|||||||
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
|
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
|
||||||
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
|
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
|
github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g=
|
||||||
|
github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=
|
||||||
|
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
|
||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
|
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||||
|
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||||
@ -247,11 +261,13 @@ github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn
|
|||||||
github.com/clbanning/mxj/v2 v2.5.6 h1:Jm4VaCI/+Ug5Q57IzEoZbwx4iQFA6wkXv72juUSeK+g=
|
github.com/clbanning/mxj/v2 v2.5.6 h1:Jm4VaCI/+Ug5Q57IzEoZbwx4iQFA6wkXv72juUSeK+g=
|
||||||
github.com/clbanning/mxj/v2 v2.5.6/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
|
github.com/clbanning/mxj/v2 v2.5.6/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cloudflare/cloudflare-go v0.108.0 h1:C4Skfjd8I8X3uEOGmQUT4/iGyZcWdkIU7HwvMoLkEE0=
|
github.com/cloudflare/cloudflare-go v0.112.0 h1:caFwqXdGJCl3rjVMgbPEn8iCYAg9JsRYV3dIVQE5d7g=
|
||||||
github.com/cloudflare/cloudflare-go v0.108.0/go.mod h1:m492eNahT/9MsN7Ppnoge8AaI7QhVFtEgVm3I9HJFeU=
|
github.com/cloudflare/cloudflare-go v0.112.0/go.mod h1:QB55kuJ5ZTeLNFcLJePfMuBilhu/LDKpLBmKFQIoSZ0=
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
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/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
|
github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI=
|
||||||
|
github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
|
||||||
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||||
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||||
@ -286,12 +302,16 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m
|
|||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.13.1 h1:vPfJZCkob6yTMEgS+0TwfTUfbHjfy/6vOJ8hUWX/uXE=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.13.1/go.mod h1:X45hY0mufo6Fd0KW3rqsGvQMw58jvjymeCzBU3mWyHw=
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
|
github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM=
|
||||||
|
github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4=
|
||||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||||
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
|
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
|
||||||
github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
|
github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
|
||||||
github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4=
|
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
|
||||||
github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI=
|
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
|
||||||
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
|
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
|
||||||
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||||
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
|
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
|
||||||
@ -305,14 +325,14 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo
|
|||||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||||
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
|
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
|
||||||
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
|
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
|
||||||
github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc=
|
github.com/gabriel-vasile/mimetype v1.4.7 h1:SKFKl7kD0RiPdbht0s7hFtjl489WcQ1VyPW8ZzUMYCA=
|
||||||
github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc=
|
github.com/gabriel-vasile/mimetype v1.4.7/go.mod h1:GDlAgAyIRT27BhFl53XNAFtfjzOkLaF35JdEG0P7LtU=
|
||||||
github.com/gammazero/toposort v0.1.1/go.mod h1:H2cozTnNpMw0hg2VHAYsAxmkHXBYroNangj2NTBQDvw=
|
github.com/gammazero/toposort v0.1.1/go.mod h1:H2cozTnNpMw0hg2VHAYsAxmkHXBYroNangj2NTBQDvw=
|
||||||
github.com/ganigeorgiev/fexpr v0.4.1 h1:hpUgbUEEWIZhSDBtf4M9aUNfQQ0BZkGRaMePy7Gcx5k=
|
github.com/ganigeorgiev/fexpr v0.4.1 h1:hpUgbUEEWIZhSDBtf4M9aUNfQQ0BZkGRaMePy7Gcx5k=
|
||||||
github.com/ganigeorgiev/fexpr v0.4.1/go.mod h1:RyGiGqmeXhEQ6+mlGdnUleLHgtzzu/VGO2WtJkF5drE=
|
github.com/ganigeorgiev/fexpr v0.4.1/go.mod h1:RyGiGqmeXhEQ6+mlGdnUleLHgtzzu/VGO2WtJkF5drE=
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
github.com/go-acme/lego/v4 v4.20.2 h1:ZwO3oLZb8fL6up1OZVJP3yHuvqhozzlEmyqKmhrPchQ=
|
github.com/go-acme/lego/v4 v4.21.0 h1:arEW+8o5p7VI8Bk1kr/PDlgD1DrxtTH1gJ4b7mehL8o=
|
||||||
github.com/go-acme/lego/v4 v4.20.2/go.mod h1:foauPlhnhoq8WUphaWx5U04uDc+JGhk4ZZtPz/Vqsjg=
|
github.com/go-acme/lego/v4 v4.21.0/go.mod h1:HrSWzm3Ckj45Ie3i+p1zKVobbQoMOaGu9m4up0dUeDI=
|
||||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
@ -323,8 +343,8 @@ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
|
|||||||
github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs=
|
github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs=
|
||||||
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
|
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
|
||||||
github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
|
github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
|
||||||
github.com/go-lark/lark v1.14.1 h1:qWYQTk6wLwf/08u8WbdNAHNmfqavdOvmsENlQ+Cb8aY=
|
github.com/go-lark/lark v1.15.0 h1:wzfzK9j85BrbFYcjxGZSjJiXbOxHQYkKjIClUwyT9XU=
|
||||||
github.com/go-lark/lark v1.14.1/go.mod h1:6ltbSztPZRT6IaO9ZIQyVaY5pVp/KeMizDYtfZkU+vM=
|
github.com/go-lark/lark v1.15.0/go.mod h1:6ltbSztPZRT6IaO9ZIQyVaY5pVp/KeMizDYtfZkU+vM=
|
||||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||||
@ -333,13 +353,14 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
|
|||||||
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||||
github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
|
|
||||||
github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
|
github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
|
||||||
|
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
|
||||||
|
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
|
||||||
github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
|
github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
|
||||||
github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
|
github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
|
||||||
github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
|
github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
|
||||||
github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU=
|
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
|
||||||
github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
|
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
|
||||||
github.com/go-ozzo/ozzo-validation/v4 v4.3.0 h1:byhDUpfEwjsVQb1vBunvIjh2BHQ9ead57VkAEY4V+Es=
|
github.com/go-ozzo/ozzo-validation/v4 v4.3.0 h1:byhDUpfEwjsVQb1vBunvIjh2BHQ9ead57VkAEY4V+Es=
|
||||||
github.com/go-ozzo/ozzo-validation/v4 v4.3.0/go.mod h1:2NKgrcHl3z6cJs+3Oo940FPRiTzuqKbvfrL2RxCj6Ew=
|
github.com/go-ozzo/ozzo-validation/v4 v4.3.0/go.mod h1:2NKgrcHl3z6cJs+3Oo940FPRiTzuqKbvfrL2RxCj6Ew=
|
||||||
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||||
@ -349,8 +370,8 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+
|
|||||||
github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
|
github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
|
||||||
github.com/go-playground/validator/v10 v10.7.0/go.mod h1:xm76BBt941f7yWdGnI2DVPFFg1UK3YY04qifoXU3lOk=
|
github.com/go-playground/validator/v10 v10.7.0/go.mod h1:xm76BBt941f7yWdGnI2DVPFFg1UK3YY04qifoXU3lOk=
|
||||||
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||||
github.com/go-sql-driver/mysql v1.8.0 h1:UtktXaU2Nb64z/pLiGIxY4431SJ4/dR5cjMmlVHgnT4=
|
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
|
||||||
github.com/go-sql-driver/mysql v1.8.0/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
|
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
|
||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
|
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
|
||||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
||||||
@ -359,8 +380,8 @@ github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZ
|
|||||||
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible h1:2cauKuaELYAEARXRkq2LrJ0yDDv1rW7+wrTEdVL3uaU=
|
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible h1:2cauKuaELYAEARXRkq2LrJ0yDDv1rW7+wrTEdVL3uaU=
|
||||||
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible/go.mod h1:qf9acutJ8cwBUhm1bqgz6Bei9/C/c93FPDljKWwsOgM=
|
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible/go.mod h1:qf9acutJ8cwBUhm1bqgz6Bei9/C/c93FPDljKWwsOgM=
|
||||||
github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw=
|
github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw=
|
||||||
github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
|
github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM=
|
||||||
github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
|
github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
|
||||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
|
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
|
||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
@ -371,6 +392,7 @@ github.com/gojek/heimdall/v7 v7.0.3/go.mod h1:Z43HtMid7ysSjmsedPTXAki6jcdcNVnjn5
|
|||||||
github.com/gojek/valkyrie v0.0.0-20180215180059-6aee720afcdf h1:5xRGbUdOmZKoDXkGx5evVLehuCMpuO1hl701bEQqXOM=
|
github.com/gojek/valkyrie v0.0.0-20180215180059-6aee720afcdf h1:5xRGbUdOmZKoDXkGx5evVLehuCMpuO1hl701bEQqXOM=
|
||||||
github.com/gojek/valkyrie v0.0.0-20180215180059-6aee720afcdf/go.mod h1:QzhUKaYKJmcbTnCYCAVQrroCOY7vOOI8cSQ4NbuhYf0=
|
github.com/gojek/valkyrie v0.0.0-20180215180059-6aee720afcdf/go.mod h1:QzhUKaYKJmcbTnCYCAVQrroCOY7vOOI8cSQ4NbuhYf0=
|
||||||
github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A=
|
github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A=
|
||||||
|
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
|
||||||
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo=
|
github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo=
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
||||||
@ -379,8 +401,9 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU
|
|||||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
|
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
|
||||||
|
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||||
@ -444,8 +467,8 @@ 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/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
github.com/google/pprof v0.0.0-20240625030939-27f56978b8b0 h1:e+8XbKB6IMn8A4OAyZccO4pYfB3s7bt6azNIPE7AnPg=
|
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo=
|
||||||
github.com/google/pprof v0.0.0-20240625030939-27f56978b8b0/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
|
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
|
||||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM=
|
github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM=
|
||||||
github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA=
|
github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA=
|
||||||
@ -459,8 +482,8 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gT
|
|||||||
github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA=
|
github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
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/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||||
github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s=
|
github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q=
|
||||||
github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A=
|
github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA=
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||||
@ -503,13 +526,11 @@ github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKEN
|
|||||||
github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog=
|
github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog=
|
||||||
github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68=
|
github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68=
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.120 h1:i+rlH2xzkEMGbol86Fq/ioxgAaOnX2vkH4i/bLptc5s=
|
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.128 h1:kQ2Agpfy7Ze1ajn9xCQG9G6T7XIbqv+FBDS/U98W9Mk=
|
||||||
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.120/go.mod h1:JWz2ujO9X3oU5wb6kXp+DpR2UuDj2SldDbX8T0FSuhI=
|
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.128/go.mod h1:JWz2ujO9X3oU5wb6kXp+DpR2UuDj2SldDbX8T0FSuhI=
|
||||||
github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo=
|
github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo=
|
||||||
github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
|
github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
|
||||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||||
github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28=
|
|
||||||
github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
|
||||||
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||||
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||||
github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
|
github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
|
||||||
@ -572,7 +593,6 @@ github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgx
|
|||||||
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
|
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
|
||||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
||||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||||
github.com/matishsiao/goInfo v0.0.0-20210923090445-da2e3fa8d45f/go.mod h1:aEt7p9Rvh67BYApmZwNDPpgircTO2kgdmDUoF/1QmwA=
|
|
||||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||||
@ -632,8 +652,8 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS
|
|||||||
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
|
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
|
||||||
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
|
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
|
||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
github.com/nikoksr/notify v1.0.0 h1:qe9/6FRsWdxBgQgWcpvQ0sv8LRGJZDpRB4TkL2uNdO8=
|
github.com/nikoksr/notify v1.1.0 h1:IMw9p5ARDtKzZQmQSUy2+2LU/PPwBCdwQg2lCZh9EvY=
|
||||||
github.com/nikoksr/notify v1.0.0/go.mod h1:hPaaDt30d6LAA7/5nb0e48Bp/MctDfycCSs8VEgN29I=
|
github.com/nikoksr/notify v1.1.0/go.mod h1:joe1r6qqAznTHzkC734Li8hxxVAYxzO6phBtMLfOVuo=
|
||||||
github.com/nrdcg/namesilo v0.2.1 h1:kLjCjsufdW/IlC+iSfAqj0iQGgKjlbUUeDJio5Y6eMg=
|
github.com/nrdcg/namesilo v0.2.1 h1:kLjCjsufdW/IlC+iSfAqj0iQGgKjlbUUeDJio5Y6eMg=
|
||||||
github.com/nrdcg/namesilo v0.2.1/go.mod h1:lwMvfQTyYq+BbjJd30ylEG4GPSS6PII0Tia4rRpRiyw=
|
github.com/nrdcg/namesilo v0.2.1/go.mod h1:lwMvfQTyYq+BbjJd30ylEG4GPSS6PII0Tia4rRpRiyw=
|
||||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||||
@ -643,14 +663,14 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W
|
|||||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
||||||
github.com/onsi/ginkgo v1.16.2 h1:HFB2fbVIlhIfCfOW81bZFbiC/RvnpXSdhbF2/DJr134=
|
github.com/onsi/ginkgo v1.16.2 h1:HFB2fbVIlhIfCfOW81bZFbiC/RvnpXSdhbF2/DJr134=
|
||||||
github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E=
|
github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E=
|
||||||
github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA=
|
github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM=
|
||||||
github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To=
|
github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
|
||||||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||||
github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY=
|
github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY=
|
||||||
github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw=
|
github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4=
|
||||||
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
|
github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
|
||||||
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
|
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
|
||||||
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
|
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
|
||||||
github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A=
|
github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A=
|
||||||
@ -669,15 +689,19 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
|
|||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
|
github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
|
||||||
github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo=
|
github.com/pkg/sftp v1.13.7 h1:uv+I3nNJvlKZIQGSr8JVQLNHFU9YhhNpvC14Y6KgmSM=
|
||||||
github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk=
|
github.com/pkg/sftp v1.13.7/go.mod h1:KMKI0t3T6hfA+lTR/ssZdunHo+uwq7ghoN09/FSu3DY=
|
||||||
|
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=
|
||||||
|
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/pocketbase/dbx v1.10.1 h1:cw+vsyfCJD8YObOVeqb93YErnlxwYMkNZ4rwN0G0AaA=
|
github.com/pocketbase/dbx v1.11.0 h1:LpZezioMfT3K4tLrqA55wWFw1EtH1pM4tzSVa7kgszU=
|
||||||
github.com/pocketbase/dbx v1.10.1/go.mod h1:xXRCIAKTHMgUCyCKZm55pUOdvFziJjQfXaWKhu2vhMs=
|
github.com/pocketbase/dbx v1.11.0/go.mod h1:xXRCIAKTHMgUCyCKZm55pUOdvFziJjQfXaWKhu2vhMs=
|
||||||
github.com/pocketbase/pocketbase v0.22.18 h1:yVckUhi5GDORqCb0BbtlvRB1CVxHY9HO9btEaeZHVJU=
|
github.com/pocketbase/pocketbase v0.22.21 h1:DGPCxn6co8VuTV0mton4NFO/ON49XiFMszRr+Mysy48=
|
||||||
github.com/pocketbase/pocketbase v0.22.18/go.mod h1:0QFvDOOW7ANId78ChZSagyHbmP6CgMxDQrQFXzeaDpA=
|
github.com/pocketbase/pocketbase v0.22.21/go.mod h1:Cw5E4uoGhKItBIE2lJL3NfmiUr9Syk2xaNJ2G7Dssow=
|
||||||
|
github.com/pocketbase/pocketbase v0.23.12 h1:HB4THFbzaliF0C3wvpx+kNOZxIwCEMDqN3/17gn5N7E=
|
||||||
|
github.com/pocketbase/pocketbase v0.23.12/go.mod h1:OcFJNMO0Vzt3f9+lweMbup6iL7V13ckxu1pdEY6FeM0=
|
||||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
||||||
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
|
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
|
||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
@ -702,8 +726,8 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O
|
|||||||
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
||||||
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
||||||
github.com/qiniu/dyn v1.3.0/go.mod h1:E8oERcm8TtwJiZvkQPbcAh0RL8jO1G0VXJMW3FAWdkk=
|
github.com/qiniu/dyn v1.3.0/go.mod h1:E8oERcm8TtwJiZvkQPbcAh0RL8jO1G0VXJMW3FAWdkk=
|
||||||
github.com/qiniu/go-sdk/v7 v7.22.0 h1:NiRj6+beSkKsPBr4XN9OdjPJQKhERtOwOwu3HJtzcWQ=
|
github.com/qiniu/go-sdk/v7 v7.25.1 h1:fynXKE2RP9XYkispAI3YI+eML39JFEx2+PLYP46ephA=
|
||||||
github.com/qiniu/go-sdk/v7 v7.22.0/go.mod h1:44lnyCs6gflCxMUV1yTBlZhPEB4ZO6LIDHkMV8Rofms=
|
github.com/qiniu/go-sdk/v7 v7.25.1/go.mod h1:uZE85Pi0ftIHT/UNLShosdzwsovqpdas0LwAGO7cPao=
|
||||||
github.com/qiniu/x v1.10.5/go.mod h1:03Ni9tj+N2h2aKnAz+6N0Xfl8FwMEDRC2PAlxekASDs=
|
github.com/qiniu/x v1.10.5/go.mod h1:03Ni9tj+N2h2aKnAz+6N0Xfl8FwMEDRC2PAlxekASDs=
|
||||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||||
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||||
@ -729,8 +753,8 @@ github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYl
|
|||||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||||
github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
|
github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
|
||||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||||
github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
|
github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
|
||||||
github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
|
github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
|
||||||
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
|
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
|
||||||
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
|
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
|
||||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||||
@ -757,26 +781,22 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
|
|||||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM=
|
github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM=
|
||||||
github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog=
|
github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog=
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.1017 h1:OymmfmyFkvHirY3WHsoRT3cdTEsqygLbMn8jM41erK4=
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.1065 h1:q0Op2QlMmag0R2vZX08GvOh0T29dcUqc+aIHF6a1sIE=
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.1017/go.mod h1:gnLxGXlLmF+jDqWR1/RVoF/UUwxQxomQhkc0oN7KeuI=
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.1065/go.mod h1:UiS7HMWbxGhO/y7nmnHuBMyP4qEDmJeooK6YKWNMuEw=
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1031 h1:/eVMCl+jadCex6HxNN6/hFbC0iWl+e8s4PSIcI8aqS4=
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1065 h1:Kb/l5yh9M6Ow59ZRAMcdIBxsNT3uy8fZYh8xy2rM+xQ=
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1031/go.mod h1:8Km0fRIaDS7PssuyxDFvRRFBUFmECqG+ICpViCs/Vak=
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1065/go.mod h1:bgwicHdrBXLcgB4mQd8pWbSNuM7fIAjhxHfdZ/Hb7p4=
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.992/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1065 h1:krcqtAmexnHHBm/4ge4tr2b1cn/a7JGBESVGoZYXQAE=
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1017/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1065/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1030/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1065 h1:aEFtLD1ceyeljQXB1S2BjN0zjTkf0X3XmpuxFIiC29w=
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1031/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1065/go.mod h1:HWvwy09hFSMXrj9SMvVRWV4U7rZO3l+WuogyNuxiT3M=
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1034 h1:T7ewuO2DD+5R2LRpD2kTRy25aCkVDVdYkmmyUS63i08=
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.0.1065 h1:rHI/2WYmEBfnqVNo5iUy0gu0J7ekFBE/NDV/oKZv448=
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1034/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.0.1065/go.mod h1:nnd6/G8xfl7RMsm2XYdQT5SfjdxG/U09QaC6qO89JJg=
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1034 h1:hXxv58/eSlDj80n0P0ISXh91pC/2vqurJNwn5SpXFPI=
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.1065 h1:gDuqak8/kNgF99+ksk70JHjI1Poa5pmrgYDW6xYya8I=
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1034/go.mod h1:hwTIplwF9IYWz5HQcyw0+R8aqJB0lEZB8sI0pIA5Htw=
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.1065/go.mod h1:r6yv70O5CZLsVhz6z05ZTGVUYxKQtGE2p90mopsR014=
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.0.992 h1:A6O89OlCJQUpNxGqC/E5By04UNKBryIt5olQIGOx8mg=
|
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.0.992/go.mod h1:BcvC7ZPdSlhRggVq4J1ToJlgv8bmODIAuSo0naFZOLo=
|
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.1030 h1:tlHbfQlAfL12J/5XF4indKl0cAA3vEn6TDiGZVsr050=
|
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.1030/go.mod h1:8dW6JByZKNDAPnjlXxBk9yDc+QGbldpa0tBRfi1kG+U=
|
|
||||||
github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w=
|
github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w=
|
||||||
github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho=
|
github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho=
|
||||||
github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE=
|
github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE=
|
||||||
@ -790,8 +810,8 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw
|
|||||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||||
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
|
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
|
||||||
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
|
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
|
||||||
github.com/volcengine/volc-sdk-golang v1.0.184 h1:vSpr4nuKAbiAmGkOJAupkHIvd3oM08JNMyHJU/21loQ=
|
github.com/volcengine/volc-sdk-golang v1.0.189 h1:VMDTHWYXakXJtZqPYn0As/h4eB0c4imvyru6mIp+o60=
|
||||||
github.com/volcengine/volc-sdk-golang v1.0.184/go.mod h1:u0VtPvlXWpXDTmc9IHkaW1q+5Jjwus4oAqRhNMDRInE=
|
github.com/volcengine/volc-sdk-golang v1.0.189/go.mod h1:u0VtPvlXWpXDTmc9IHkaW1q+5Jjwus4oAqRhNMDRInE=
|
||||||
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
|
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
|
||||||
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
|
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
|
||||||
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
|
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
|
||||||
@ -821,16 +841,22 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
|||||||
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
|
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
|
||||||
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
|
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
|
||||||
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
|
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
|
||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc=
|
go.opentelemetry.io/contrib/detectors/gcp v1.31.0 h1:G1JQOreVrfhRkner+l4mrGxmfqYCAuy76asTDAo0xsA=
|
||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI=
|
go.opentelemetry.io/contrib/detectors/gcp v1.31.0/go.mod h1:tzQL6E1l+iV44YFTkcAeNQqzXUiekSYP9jjJjXwEd00=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk=
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8=
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8=
|
||||||
go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s=
|
||||||
go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM=
|
||||||
go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc=
|
go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY=
|
||||||
go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8=
|
go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE=
|
||||||
go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4=
|
go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE=
|
||||||
go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ=
|
go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY=
|
||||||
|
go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk=
|
||||||
|
go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0=
|
||||||
|
go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc=
|
||||||
|
go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8=
|
||||||
|
go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys=
|
||||||
|
go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A=
|
||||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||||
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
|
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
|
||||||
@ -840,8 +866,8 @@ go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9i
|
|||||||
go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
|
go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
|
||||||
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
|
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
|
||||||
go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
|
go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
|
||||||
gocloud.dev v0.37.0 h1:XF1rN6R0qZI/9DYjN16Uy0durAmSlf58DHOcb28GPro=
|
gocloud.dev v0.40.0 h1:f8LgP+4WDqOG/RXoUcyLpeIAGOcAbZrZbDQCUee10ng=
|
||||||
gocloud.dev v0.37.0/go.mod h1:7/O4kqdInCNsc6LqgmuFnS0GRew4XNNYWpA44yQnwco=
|
gocloud.dev v0.40.0/go.mod h1:drz+VyYNBvrMTW0KZiBAYEdl8lbNZx+OQ7oQvdrFmSQ=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
@ -861,16 +887,16 @@ golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5y
|
|||||||
golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
|
|
||||||
golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
|
golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
|
||||||
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
|
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
|
||||||
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
|
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
|
||||||
|
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
|
||||||
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
|
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
|
||||||
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
|
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
|
||||||
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
|
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
|
||||||
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
||||||
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
|
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
|
||||||
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
|
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
|
||||||
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
@ -884,14 +910,14 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
|
|||||||
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||||
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
|
golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo=
|
||||||
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
|
golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c=
|
||||||
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
|
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
|
||||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ=
|
golang.org/x/image v0.23.0 h1:HseQ7c2OpPKTPVzNjG5fwJsOTCiiwS4QdsYi5XU6H68=
|
||||||
golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E=
|
golang.org/x/image v0.23.0/go.mod h1:wJJBTdLfCCf3tiHa1fNxpZmUI4mmoZvwMCPP0ddoNKY=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
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=
|
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
@ -912,11 +938,10 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB
|
|||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.6.0-dev/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
|
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
|
golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
|
||||||
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
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-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
@ -960,7 +985,6 @@ golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qx
|
|||||||
golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
|
|
||||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||||
@ -970,16 +994,16 @@ golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
|
|||||||
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
|
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
|
||||||
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
|
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
|
||||||
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
|
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
|
||||||
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
|
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
|
||||||
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
|
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
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-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
|
golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE=
|
||||||
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
@ -993,8 +1017,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ
|
|||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
|
||||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/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-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
@ -1058,33 +1082,33 @@ golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBc
|
|||||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
|
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
|
||||||
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
|
||||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||||
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
||||||
golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo=
|
golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo=
|
||||||
golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
|
golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
|
||||||
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
|
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
|
||||||
|
golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
|
||||||
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
|
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
|
||||||
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
|
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
|
||||||
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
|
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
|
||||||
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
||||||
golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
|
golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
|
||||||
golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
|
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
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.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.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
@ -1102,15 +1126,15 @@ golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
|||||||
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
|
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
|
||||||
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
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-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
|
golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg=
|
||||||
golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||||
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
@ -1163,14 +1187,14 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
|||||||
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||||
golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE=
|
golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8=
|
||||||
golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg=
|
golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
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-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
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=
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 h1:LLhsEBxRTBLuKlQxFBYUOU8xyFgXv6cOTp2HASDlsDk=
|
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY=
|
||||||
golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
|
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
|
||||||
gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
|
gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
|
||||||
gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=
|
gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=
|
||||||
gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
|
gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
|
||||||
@ -1191,8 +1215,8 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M
|
|||||||
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
||||||
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
|
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
|
||||||
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
|
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
|
||||||
google.golang.org/api v0.204.0 h1:3PjmQQEDkR/ENVZZwIYB4W/KzYtN8OrqnNcHWpeR8E4=
|
google.golang.org/api v0.214.0 h1:h2Gkq07OYi6kusGOaT/9rnNljuXmqPnaig7WGPmKbwA=
|
||||||
google.golang.org/api v0.204.0/go.mod h1:69y8QSoKIbL9F94bWgWAq6wGqGwyjBgi2y8rAK8zLag=
|
google.golang.org/api v0.214.0/go.mod h1:bYPpLG8AyeMWwDU6NXoB00xC0DFkikVvd5MfwoxjLqE=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
@ -1233,10 +1257,10 @@ google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxH
|
|||||||
google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
||||||
google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 h1:Q3nlH8iSQSRUwOskjbcSMcF2jiYMNiQYZ0c2KEJLKKU=
|
google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 h1:Q3nlH8iSQSRUwOskjbcSMcF2jiYMNiQYZ0c2KEJLKKU=
|
||||||
google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38/go.mod h1:xBI+tzfqGGN2JBeSebfKXFSdBpWVQ7sLW40PTupVRm4=
|
google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38/go.mod h1:xBI+tzfqGGN2JBeSebfKXFSdBpWVQ7sLW40PTupVRm4=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53 h1:fVoAXEKA4+yufmbdVYv+SE73+cPZbbbe8paLsHfkK+U=
|
google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 h1:CkkIfIt50+lT6NHAVoRYEyAvQGFM7xEwXUUywFvEb3Q=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53/go.mod h1:riSXTwQ4+nqmPGtobMFyW5FqVAmIs0St6VPp4Ug7CE4=
|
google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576/go.mod h1:1R3kvZ1dtP3+4p4d3G8uJ8rFk/fWlScl38vanWACI08=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20241219192143-6b3ec007d9bb h1:3oy2tynMOP1QbTC0MsNNAV+Se8M2Bd0A5+x1QHyw+pI=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20241219192143-6b3ec007d9bb/go.mod h1:lcTa1sDdWEIHMWlITnIczmw5w60CF9ffkb8Z+DVmmjA=
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||||
@ -1254,8 +1278,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv
|
|||||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||||
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||||
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
||||||
google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
|
google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU=
|
||||||
google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
|
google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4=
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
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-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
@ -1271,8 +1295,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
|
|||||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||||
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||||
google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
|
google.golang.org/protobuf v1.36.0 h1:mjIs9gYtt56AzC4ZaffQuh88TZurBGhIJMBZGSxNerQ=
|
||||||
google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
google.golang.org/protobuf v1.36.0/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
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 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
@ -1281,6 +1305,8 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8
|
|||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
|
gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4=
|
||||||
|
gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M=
|
||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
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/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
|
||||||
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
|
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
|
||||||
@ -1313,40 +1339,41 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt
|
|||||||
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0=
|
howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0=
|
||||||
k8s.io/api v0.31.1 h1:Xe1hX/fPW3PXYYv8BlozYqw63ytA92snr96zMW9gWTU=
|
k8s.io/api v0.32.0 h1:OL9JpbvAU5ny9ga2fb24X8H6xQlVp+aJMFlgtQjR9CE=
|
||||||
k8s.io/api v0.31.1/go.mod h1:sbN1g6eY6XVLeqNsZGLnI5FwVseTrZX7Fv3O26rhAaI=
|
k8s.io/api v0.32.0/go.mod h1:4LEwHZEf6Q/cG96F3dqR965sYOfmPM7rq81BLgsE0p0=
|
||||||
k8s.io/apimachinery v0.31.1 h1:mhcUBbj7KUjaVhyXILglcVjuS4nYXiwC+KKFBgIVy7U=
|
k8s.io/apimachinery v0.32.0 h1:cFSE7N3rmEEtv4ei5X6DaJPHHX0C+upp+v5lVPiEwpg=
|
||||||
k8s.io/apimachinery v0.31.1/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo=
|
k8s.io/apimachinery v0.32.0/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
|
||||||
k8s.io/client-go v0.31.1 h1:f0ugtWSbWpxHR7sjVpQwuvw9a3ZKLXX0u0itkFXufb0=
|
k8s.io/client-go v0.32.0 h1:DimtMcnN/JIKZcrSrstiwvvZvLjG0aSxy8PxN8IChp8=
|
||||||
k8s.io/client-go v0.31.1/go.mod h1:sKI8871MJN2OyeqRlmA4W4KM9KBdBUpDLu/43eGemCg=
|
k8s.io/client-go v0.32.0/go.mod h1:boDWvdM1Drk4NJj/VddSLnx59X3OPgwrOo0vGbtq9+8=
|
||||||
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
|
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
|
||||||
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
|
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
|
||||||
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag=
|
k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y=
|
||||||
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98=
|
k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4=
|
||||||
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A=
|
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
|
||||||
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||||
modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ=
|
modernc.org/cc/v4 v4.24.1 h1:mLykA8iIlZ/SZbwI2JgYIURXQMSgmOb/+5jaielxPi4=
|
||||||
modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=
|
modernc.org/cc/v4 v4.24.1/go.mod h1:T1lKJZhXIi2VSqGBiB4LIbKs9NsKTbUXj4IDrmGqtTI=
|
||||||
modernc.org/ccgo/v4 v4.19.2 h1:lwQZgvboKD0jBwdaeVCTouxhxAyN6iawF3STraAal8Y=
|
modernc.org/ccgo/v4 v4.23.5 h1:6uAwu8u3pnla3l/+UVUrDDO1HIGxHTYmFH6w+X9nsyw=
|
||||||
modernc.org/ccgo/v4 v4.19.2/go.mod h1:ysS3mxiMV38XGRTTcgo0DQTeTmAO4oCmJl1nX9VFI3s=
|
modernc.org/ccgo/v4 v4.23.5/go.mod h1:FogrWfBdzqLWm1ku6cfr4IzEFouq2fSAPf6aSAHdAJQ=
|
||||||
|
modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8=
|
||||||
modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
|
modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
|
||||||
modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
|
modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
|
||||||
modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw=
|
modernc.org/gc/v2 v2.6.0 h1:Tiw3pezQj7PfV8k4Dzyu/vhRHR2e92kOXtTFU8pbCl4=
|
||||||
modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU=
|
modernc.org/gc/v2 v2.6.0/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU=
|
||||||
modernc.org/gc/v3 v3.0.0-20240722195230-4a140ff9c08e h1:WPC4v0rNIFb2PY+nBBEEKyugPPRHPzUgyN3xZPpGK58=
|
modernc.org/gc/v3 v3.0.0-20241213165251-3bc300f6d0c9 h1:ovz6yUKX71igz2yvk4NpiCL5fvdjZAI+DhuDEGx1xyU=
|
||||||
modernc.org/gc/v3 v3.0.0-20240722195230-4a140ff9c08e/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4=
|
modernc.org/gc/v3 v3.0.0-20241213165251-3bc300f6d0c9/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4=
|
||||||
modernc.org/libc v1.55.3 h1:AzcW1mhlPNrRtjS5sS+eW2ISCgSOLLNyFzRh/V3Qj/U=
|
modernc.org/libc v1.61.5 h1:WzsPUvWl2CvsRmk2foyWWHUEUmQ2iW4oFyWOVR0O5ho=
|
||||||
modernc.org/libc v1.55.3/go.mod h1:qFXepLhz+JjFThQ4kzwzOjA/y/artDeg+pcYnY+Q83w=
|
modernc.org/libc v1.61.5/go.mod h1:llBdEGIywhnRgAFuTF+CWaKV8/2bFgACcQZTXhkAuAM=
|
||||||
modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4=
|
modernc.org/mathutil v1.7.0 h1:KPlMfpLMs4EXAo8T8JJEkmCT9KP/B4vU1+GaBnDhHQY=
|
||||||
modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo=
|
modernc.org/mathutil v1.7.0/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
|
||||||
modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E=
|
modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E=
|
||||||
modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU=
|
modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU=
|
||||||
modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4=
|
modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4=
|
||||||
modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
|
modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
|
||||||
modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc=
|
modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc=
|
||||||
modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss=
|
modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss=
|
||||||
modernc.org/sqlite v1.31.1 h1:XVU0VyzxrYHlBhIs1DiEgSl0ZtdnPtbLVy8hSkzxGrs=
|
modernc.org/sqlite v1.34.4 h1:sjdARozcL5KJBvYQvLlZEmctRgW9xqIZc2ncN7PU0P8=
|
||||||
modernc.org/sqlite v1.31.1/go.mod h1:UqoylwmTb9F+IqXERT8bW9zzOWN8qwAIcLdzeBZs4hA=
|
modernc.org/sqlite v1.34.4/go.mod h1:3QQFCG2SEMtc2nv+Wq4cQCH7Hjcg+p/RMlS1XK+zwbk=
|
||||||
modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
|
modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
|
||||||
modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
|
modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
|
||||||
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
|
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
|
||||||
@ -1355,10 +1382,10 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8
|
|||||||
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
|
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
|
||||||
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
|
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=
|
||||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
|
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo=
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
|
sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA=
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
|
sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4=
|
||||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
||||||
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
|
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
|
||||||
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
|
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package app
|
package app
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"log/slog"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/pocketbase/pocketbase"
|
"github.com/pocketbase/pocketbase"
|
||||||
@ -19,3 +20,7 @@ func GetApp() *pocketbase.PocketBase {
|
|||||||
|
|
||||||
return instance
|
return instance
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetLogger() *slog.Logger {
|
||||||
|
return GetApp().Logger()
|
||||||
|
}
|
@ -7,14 +7,14 @@ import (
|
|||||||
"github.com/pocketbase/pocketbase/tools/cron"
|
"github.com/pocketbase/pocketbase/tools/cron"
|
||||||
)
|
)
|
||||||
|
|
||||||
var schedulerOnce sync.Once
|
|
||||||
|
|
||||||
var scheduler *cron.Cron
|
var scheduler *cron.Cron
|
||||||
|
|
||||||
|
var schedulerOnce sync.Once
|
||||||
|
|
||||||
func GetScheduler() *cron.Cron {
|
func GetScheduler() *cron.Cron {
|
||||||
schedulerOnce.Do(func() {
|
schedulerOnce.Do(func() {
|
||||||
scheduler = cron.New()
|
scheduler = cron.New()
|
||||||
location, err := time.LoadLocation("Asia/Shanghai")
|
location, err := time.LoadLocation("Local")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
scheduler.SetTimezone(location)
|
scheduler.SetTimezone(location)
|
||||||
}
|
}
|
38
internal/applicant/acme-ca.go
Normal file
38
internal/applicant/acme-ca.go
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package applicant
|
||||||
|
|
||||||
|
const (
|
||||||
|
sslProviderLetsEncrypt = "letsencrypt"
|
||||||
|
sslProviderLetsEncryptStaging = "letsencrypt_staging"
|
||||||
|
sslProviderZeroSSL = "zerossl"
|
||||||
|
sslProviderGoogleTrustServices = "gts"
|
||||||
|
)
|
||||||
|
const defaultSSLProvider = sslProviderLetsEncrypt
|
||||||
|
|
||||||
|
const (
|
||||||
|
letsencryptUrl = "https://acme-v02.api.letsencrypt.org/directory"
|
||||||
|
letsencryptStagingUrl = "https://acme-staging-v02.api.letsencrypt.org/directory"
|
||||||
|
zerosslUrl = "https://acme.zerossl.com/v2/DV90"
|
||||||
|
gtsUrl = "https://dv.acme-v02.api.pki.goog/directory"
|
||||||
|
)
|
||||||
|
|
||||||
|
var sslProviderUrls = map[string]string{
|
||||||
|
sslProviderLetsEncrypt: letsencryptUrl,
|
||||||
|
sslProviderLetsEncryptStaging: letsencryptStagingUrl,
|
||||||
|
sslProviderZeroSSL: zerosslUrl,
|
||||||
|
sslProviderGoogleTrustServices: gtsUrl,
|
||||||
|
}
|
||||||
|
|
||||||
|
type acmeSSLProviderConfig struct {
|
||||||
|
Config acmeSSLProviderConfigContent `json:"config"`
|
||||||
|
Provider string `json:"provider"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type acmeSSLProviderConfigContent struct {
|
||||||
|
ZeroSSL acmeSSLProviderEabConfig `json:"zerossl"`
|
||||||
|
GoogleTrustServices acmeSSLProviderEabConfig `json:"gts"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type acmeSSLProviderEabConfig struct {
|
||||||
|
EabHmacKey string `json:"eabHmacKey"`
|
||||||
|
EabKid string `json:"eabKid"`
|
||||||
|
}
|
125
internal/applicant/acme-user.go
Normal file
125
internal/applicant/acme-user.go
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
package applicant
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto"
|
||||||
|
"crypto/ecdsa"
|
||||||
|
"crypto/elliptic"
|
||||||
|
"crypto/rand"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/go-acme/lego/v4/lego"
|
||||||
|
"github.com/go-acme/lego/v4/registration"
|
||||||
|
|
||||||
|
"github.com/usual2970/certimate/internal/domain"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/utils/x509"
|
||||||
|
"github.com/usual2970/certimate/internal/repository"
|
||||||
|
)
|
||||||
|
|
||||||
|
type acmeUser struct {
|
||||||
|
CA string
|
||||||
|
Email string
|
||||||
|
Registration *registration.Resource
|
||||||
|
|
||||||
|
privkey string
|
||||||
|
}
|
||||||
|
|
||||||
|
func newAcmeUser(ca, email string) (*acmeUser, error) {
|
||||||
|
repo := repository.NewAcmeAccountRepository()
|
||||||
|
|
||||||
|
applyUser := &acmeUser{
|
||||||
|
CA: ca,
|
||||||
|
Email: email,
|
||||||
|
}
|
||||||
|
|
||||||
|
acmeAccount, err := repo.GetByCAAndEmail(ca, email)
|
||||||
|
if err != nil {
|
||||||
|
key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
keyPEM, err := x509.ConvertECPrivateKeyToPEM(key)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
applyUser.privkey = keyPEM
|
||||||
|
return applyUser, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
applyUser.Registration = acmeAccount.Resource
|
||||||
|
applyUser.privkey = acmeAccount.Key
|
||||||
|
|
||||||
|
return applyUser, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *acmeUser) GetEmail() string {
|
||||||
|
return u.Email
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u acmeUser) GetRegistration() *registration.Resource {
|
||||||
|
return u.Registration
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *acmeUser) GetPrivateKey() crypto.PrivateKey {
|
||||||
|
rs, _ := x509.ParseECPrivateKeyFromPEM(u.privkey)
|
||||||
|
return rs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *acmeUser) hasRegistration() bool {
|
||||||
|
return u.Registration != nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *acmeUser) getPrivateKeyPEM() string {
|
||||||
|
return u.privkey
|
||||||
|
}
|
||||||
|
|
||||||
|
type acmeAccountRepository interface {
|
||||||
|
GetByCAAndEmail(ca, email string) (*domain.AcmeAccount, error)
|
||||||
|
Save(ca, email, key string, resource *registration.Resource) error
|
||||||
|
}
|
||||||
|
|
||||||
|
func registerAcmeUser(client *lego.Client, sslProviderConfig *acmeSSLProviderConfig, user *acmeUser) (*registration.Resource, error) {
|
||||||
|
// TODO: fix 潜在的并发问题
|
||||||
|
|
||||||
|
var reg *registration.Resource
|
||||||
|
var err error
|
||||||
|
switch sslProviderConfig.Provider {
|
||||||
|
case sslProviderZeroSSL:
|
||||||
|
reg, err = client.Registration.RegisterWithExternalAccountBinding(registration.RegisterEABOptions{
|
||||||
|
TermsOfServiceAgreed: true,
|
||||||
|
Kid: sslProviderConfig.Config.ZeroSSL.EabKid,
|
||||||
|
HmacEncoded: sslProviderConfig.Config.ZeroSSL.EabHmacKey,
|
||||||
|
})
|
||||||
|
case sslProviderGoogleTrustServices:
|
||||||
|
reg, err = client.Registration.RegisterWithExternalAccountBinding(registration.RegisterEABOptions{
|
||||||
|
TermsOfServiceAgreed: true,
|
||||||
|
Kid: sslProviderConfig.Config.GoogleTrustServices.EabKid,
|
||||||
|
HmacEncoded: sslProviderConfig.Config.GoogleTrustServices.EabHmacKey,
|
||||||
|
})
|
||||||
|
|
||||||
|
case sslProviderLetsEncrypt, sslProviderLetsEncryptStaging:
|
||||||
|
reg, err = client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})
|
||||||
|
|
||||||
|
default:
|
||||||
|
err = fmt.Errorf("unsupported ssl provider: %s", sslProviderConfig.Provider)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
repo := repository.NewAcmeAccountRepository()
|
||||||
|
|
||||||
|
resp, err := repo.GetByCAAndEmail(sslProviderConfig.Provider, user.GetEmail())
|
||||||
|
if err == nil {
|
||||||
|
user.privkey = resp.Key
|
||||||
|
return resp.Resource, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := repo.Save(sslProviderConfig.Provider, user.GetEmail(), user.getPrivateKeyPEM(), reg); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to save registration: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return reg, nil
|
||||||
|
}
|
@ -1,36 +0,0 @@
|
|||||||
package applicant
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/providers/dns/alidns"
|
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
|
||||||
)
|
|
||||||
|
|
||||||
type aliyun struct {
|
|
||||||
option *ApplyOption
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewAliyun(option *ApplyOption) Applicant {
|
|
||||||
return &aliyun{
|
|
||||||
option: option,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *aliyun) Apply() (*Certificate, error) {
|
|
||||||
access := &domain.AliyunAccess{}
|
|
||||||
json.Unmarshal([]byte(a.option.Access), access)
|
|
||||||
|
|
||||||
os.Setenv("ALICLOUD_ACCESS_KEY", access.AccessKeyId)
|
|
||||||
os.Setenv("ALICLOUD_SECRET_KEY", access.AccessKeySecret)
|
|
||||||
os.Setenv("ALICLOUD_PROPAGATION_TIMEOUT", fmt.Sprintf("%d", a.option.Timeout))
|
|
||||||
dnsProvider, err := alidns.NewDNSProvider()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return apply(a.option, dnsProvider)
|
|
||||||
}
|
|
@ -2,283 +2,110 @@ package applicant
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"crypto"
|
"encoding/json"
|
||||||
"crypto/ecdsa"
|
|
||||||
"crypto/elliptic"
|
|
||||||
"crypto/rand"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/utils/x509"
|
|
||||||
"github.com/usual2970/certimate/internal/repository"
|
|
||||||
"github.com/usual2970/certimate/internal/utils/app"
|
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/certcrypto"
|
"github.com/go-acme/lego/v4/certcrypto"
|
||||||
"github.com/go-acme/lego/v4/certificate"
|
"github.com/go-acme/lego/v4/certificate"
|
||||||
"github.com/go-acme/lego/v4/challenge"
|
"github.com/go-acme/lego/v4/challenge"
|
||||||
"github.com/go-acme/lego/v4/challenge/dns01"
|
"github.com/go-acme/lego/v4/challenge/dns01"
|
||||||
"github.com/go-acme/lego/v4/lego"
|
"github.com/go-acme/lego/v4/lego"
|
||||||
"github.com/go-acme/lego/v4/registration"
|
|
||||||
"github.com/pocketbase/pocketbase/models"
|
"github.com/usual2970/certimate/internal/domain"
|
||||||
|
"github.com/usual2970/certimate/internal/repository"
|
||||||
)
|
)
|
||||||
|
|
||||||
/*
|
type applyConfig struct {
|
||||||
提供商类型常量值。
|
Domains string
|
||||||
|
ContactEmail string
|
||||||
注意:如果追加新的常量值,请保持以 ASCII 排序。
|
AccessConfig string
|
||||||
NOTICE: If you add new constant, please keep ASCII order.
|
KeyAlgorithm string
|
||||||
*/
|
Nameservers string
|
||||||
const (
|
PropagationTimeout int32
|
||||||
configTypeACMEHttpReq = "acmehttpreq"
|
DisableFollowCNAME bool
|
||||||
configTypeAliyun = "aliyun"
|
|
||||||
configTypeAWS = "aws"
|
|
||||||
configTypeCloudflare = "cloudflare"
|
|
||||||
configTypeGoDaddy = "godaddy"
|
|
||||||
configTypeHuaweiCloud = "huaweicloud"
|
|
||||||
configTypeNameDotCom = "namedotcom"
|
|
||||||
configTypeNameSilo = "namesilo"
|
|
||||||
configTypePowerDNS = "powerdns"
|
|
||||||
configTypeTencentCloud = "tencentcloud"
|
|
||||||
configTypeVolcEngine = "volcengine"
|
|
||||||
)
|
|
||||||
|
|
||||||
const defaultSSLProvider = "letsencrypt"
|
|
||||||
const (
|
|
||||||
sslProviderLetsencrypt = "letsencrypt"
|
|
||||||
sslProviderZeroSSL = "zerossl"
|
|
||||||
sslProviderGts = "gts"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
zerosslUrl = "https://acme.zerossl.com/v2/DV90"
|
|
||||||
letsencryptUrl = "https://acme-v02.api.letsencrypt.org/directory"
|
|
||||||
gtsUrl = "https://dv.acme-v02.api.pki.goog/directory"
|
|
||||||
)
|
|
||||||
|
|
||||||
var sslProviderUrls = map[string]string{
|
|
||||||
sslProviderLetsencrypt: letsencryptUrl,
|
|
||||||
sslProviderZeroSSL: zerosslUrl,
|
|
||||||
sslProviderGts: gtsUrl,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const defaultEmail = "536464346@qq.com"
|
type ApplyCertResult struct {
|
||||||
|
Certificate string
|
||||||
const defaultTimeout = 60
|
PrivateKey string
|
||||||
|
IssuerCertificate string
|
||||||
type Certificate struct {
|
ACMECertUrl string
|
||||||
CertUrl string `json:"certUrl"`
|
ACMECertStableUrl string
|
||||||
CertStableUrl string `json:"certStableUrl"`
|
CSR string
|
||||||
PrivateKey string `json:"privateKey"`
|
|
||||||
Certificate string `json:"certificate"`
|
|
||||||
IssuerCertificate string `json:"issuerCertificate"`
|
|
||||||
Csr string `json:"csr"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ApplyOption struct {
|
|
||||||
Email string `json:"email"`
|
|
||||||
Domain string `json:"domain"`
|
|
||||||
Access string `json:"access"`
|
|
||||||
KeyAlgorithm string `json:"keyAlgorithm"`
|
|
||||||
Nameservers string `json:"nameservers"`
|
|
||||||
Timeout int64 `json:"timeout"`
|
|
||||||
DisableFollowCNAME bool `json:"disableFollowCNAME"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ApplyUser struct {
|
|
||||||
Ca string
|
|
||||||
Email string
|
|
||||||
Registration *registration.Resource
|
|
||||||
key string
|
|
||||||
}
|
|
||||||
|
|
||||||
func newApplyUser(ca, email string) (*ApplyUser, error) {
|
|
||||||
repo := getAcmeAccountRepository()
|
|
||||||
rs := &ApplyUser{
|
|
||||||
Ca: ca,
|
|
||||||
Email: email,
|
|
||||||
}
|
|
||||||
resp, err := repo.GetByCAAndEmail(ca, email)
|
|
||||||
if err != nil {
|
|
||||||
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
keyStr, err := x509.ConvertECPrivateKeyToPEM(privateKey)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
rs.key = keyStr
|
|
||||||
|
|
||||||
return rs, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
rs.Registration = resp.Resource
|
|
||||||
rs.key = resp.Key
|
|
||||||
|
|
||||||
return rs, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *ApplyUser) GetEmail() string {
|
|
||||||
return u.Email
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u ApplyUser) GetRegistration() *registration.Resource {
|
|
||||||
return u.Registration
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *ApplyUser) GetPrivateKey() crypto.PrivateKey {
|
|
||||||
rs, _ := x509.ParseECPrivateKeyFromPEM(u.key)
|
|
||||||
return rs
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *ApplyUser) hasRegistration() bool {
|
|
||||||
return u.Registration != nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *ApplyUser) getPrivateKeyString() string {
|
|
||||||
return u.key
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type Applicant interface {
|
type Applicant interface {
|
||||||
Apply() (*Certificate, error)
|
Apply() (*ApplyCertResult, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func Get(record *models.Record) (Applicant, error) {
|
func NewWithApplyNode(node *domain.WorkflowNode) (Applicant, error) {
|
||||||
if record.GetString("applyConfig") == "" {
|
if node.Type != domain.WorkflowNodeTypeApply {
|
||||||
return nil, errors.New("applyConfig is empty")
|
return nil, fmt.Errorf("node type is not apply")
|
||||||
}
|
}
|
||||||
|
|
||||||
applyConfig := &domain.ApplyConfig{}
|
|
||||||
record.UnmarshalJSONField("applyConfig", applyConfig)
|
|
||||||
|
|
||||||
access, err := app.GetApp().Dao().FindRecordById("access", applyConfig.Access)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("access record not found: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if applyConfig.Email == "" {
|
|
||||||
applyConfig.Email = defaultEmail
|
|
||||||
}
|
|
||||||
|
|
||||||
if applyConfig.Timeout == 0 {
|
|
||||||
applyConfig.Timeout = defaultTimeout
|
|
||||||
}
|
|
||||||
|
|
||||||
option := &ApplyOption{
|
|
||||||
Email: applyConfig.Email,
|
|
||||||
Domain: record.GetString("domain"),
|
|
||||||
Access: access.GetString("config"),
|
|
||||||
KeyAlgorithm: applyConfig.KeyAlgorithm,
|
|
||||||
Nameservers: applyConfig.Nameservers,
|
|
||||||
Timeout: applyConfig.Timeout,
|
|
||||||
DisableFollowCNAME: applyConfig.DisableFollowCNAME,
|
|
||||||
}
|
|
||||||
|
|
||||||
return GetWithTypeOption(access.GetString("configType"), option)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetWithApplyNode(node *domain.WorkflowNode) (Applicant, error) {
|
|
||||||
// 获取授权配置
|
|
||||||
accessRepo := repository.NewAccessRepository()
|
accessRepo := repository.NewAccessRepository()
|
||||||
|
accessId := node.GetConfigString("providerAccessId")
|
||||||
access, err := accessRepo.GetById(context.Background(), node.GetConfigString("access"))
|
access, err := accessRepo.GetById(context.Background(), accessId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("access record not found: %w", err)
|
return nil, fmt.Errorf("failed to get access #%s record: %w", accessId, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
timeout := node.GetConfigInt64("timeout")
|
applyConfig := &applyConfig{
|
||||||
if timeout == 0 {
|
Domains: node.GetConfigString("domains"),
|
||||||
timeout = defaultTimeout
|
ContactEmail: node.GetConfigString("contactEmail"),
|
||||||
}
|
AccessConfig: access.Config,
|
||||||
|
|
||||||
applyConfig := &ApplyOption{
|
|
||||||
Email: node.GetConfigString("email"),
|
|
||||||
Domain: node.GetConfigString("domain"),
|
|
||||||
Access: access.Config,
|
|
||||||
KeyAlgorithm: node.GetConfigString("keyAlgorithm"),
|
KeyAlgorithm: node.GetConfigString("keyAlgorithm"),
|
||||||
Nameservers: node.GetConfigString("nameservers"),
|
Nameservers: node.GetConfigString("nameservers"),
|
||||||
Timeout: timeout,
|
PropagationTimeout: node.GetConfigInt32("propagationTimeout"),
|
||||||
DisableFollowCNAME: node.GetConfigBool("disableFollowCNAME"),
|
DisableFollowCNAME: node.GetConfigBool("disableFollowCNAME"),
|
||||||
}
|
}
|
||||||
|
|
||||||
return GetWithTypeOption(access.ConfigType, applyConfig)
|
challengeProvider, err := createChallengeProvider(domain.AccessProviderType(access.Provider), access.Config, applyConfig)
|
||||||
}
|
if err != nil {
|
||||||
|
|
||||||
func GetWithTypeOption(t string, option *ApplyOption) (Applicant, error) {
|
|
||||||
switch t {
|
|
||||||
case configTypeAliyun:
|
|
||||||
return NewAliyun(option), nil
|
|
||||||
case configTypeTencentCloud:
|
|
||||||
return NewTencent(option), nil
|
|
||||||
case configTypeHuaweiCloud:
|
|
||||||
return NewHuaweiCloud(option), nil
|
|
||||||
case configTypeAWS:
|
|
||||||
return NewAws(option), nil
|
|
||||||
case configTypeCloudflare:
|
|
||||||
return NewCloudflare(option), nil
|
|
||||||
case configTypeNameDotCom:
|
|
||||||
return NewNameDotCom(option), nil
|
|
||||||
case configTypeNameSilo:
|
|
||||||
return NewNamesilo(option), nil
|
|
||||||
case configTypeGoDaddy:
|
|
||||||
return NewGodaddy(option), nil
|
|
||||||
case configTypePowerDNS:
|
|
||||||
return NewPdns(option), nil
|
|
||||||
case configTypeACMEHttpReq:
|
|
||||||
return NewHttpreq(option), nil
|
|
||||||
case configTypeVolcEngine:
|
|
||||||
return NewVolcengine(option), nil
|
|
||||||
default:
|
|
||||||
return nil, errors.New("unknown config type")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type SSLProviderConfig struct {
|
|
||||||
Config SSLProviderConfigContent `json:"config"`
|
|
||||||
Provider string `json:"provider"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type SSLProviderConfigContent struct {
|
|
||||||
Zerossl SSLProviderEab `json:"zerossl"`
|
|
||||||
Gts SSLProviderEab `json:"gts"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type SSLProviderEab struct {
|
|
||||||
EabHmacKey string `json:"eabHmacKey"`
|
|
||||||
EabKid string `json:"eabKid"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func apply(option *ApplyOption, provider challenge.Provider) (*Certificate, error) {
|
|
||||||
record, _ := app.GetApp().Dao().FindFirstRecordByFilter("settings", "name='sslProvider'")
|
|
||||||
|
|
||||||
sslProvider := &SSLProviderConfig{
|
|
||||||
Config: SSLProviderConfigContent{},
|
|
||||||
Provider: defaultSSLProvider,
|
|
||||||
}
|
|
||||||
if record != nil {
|
|
||||||
if err := record.UnmarshalJSONField("content", sslProvider); err != nil {
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return &proxyApplicant{
|
||||||
|
applicant: challengeProvider,
|
||||||
|
applyConfig: applyConfig,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func apply(challengeProvider challenge.Provider, applyConfig *applyConfig) (*ApplyCertResult, error) {
|
||||||
|
settingsRepo := repository.NewSettingsRepository()
|
||||||
|
settings, _ := settingsRepo.GetByName(context.Background(), "sslProvider")
|
||||||
|
|
||||||
|
sslProviderConfig := &acmeSSLProviderConfig{
|
||||||
|
Config: acmeSSLProviderConfigContent{},
|
||||||
|
Provider: defaultSSLProvider,
|
||||||
|
}
|
||||||
|
if settings != nil {
|
||||||
|
if err := json.Unmarshal([]byte(settings.Content), sslProviderConfig); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if sslProviderConfig.Provider == "" {
|
||||||
|
sslProviderConfig.Provider = defaultSSLProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
myUser, err := newAcmeUser(sslProviderConfig.Provider, applyConfig.ContactEmail)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Some unified lego environment variables are configured here.
|
// Some unified lego environment variables are configured here.
|
||||||
// link: https://github.com/go-acme/lego/issues/1867
|
// link: https://github.com/go-acme/lego/issues/1867
|
||||||
os.Setenv("LEGO_DISABLE_CNAME_SUPPORT", strconv.FormatBool(option.DisableFollowCNAME))
|
os.Setenv("LEGO_DISABLE_CNAME_SUPPORT", strconv.FormatBool(applyConfig.DisableFollowCNAME))
|
||||||
|
|
||||||
myUser, err := newApplyUser(sslProvider.Provider, option.Email)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
config := lego.NewConfig(myUser)
|
config := lego.NewConfig(myUser)
|
||||||
|
|
||||||
// This CA URL is configured for a local dev instance of Boulder running in Docker in a VM.
|
// This CA URL is configured for a local dev instance of Boulder running in Docker in a VM.
|
||||||
config.CADirURL = sslProviderUrls[sslProvider.Provider]
|
config.CADirURL = sslProviderUrls[sslProviderConfig.Provider]
|
||||||
config.Certificate.KeyType = parseKeyAlgorithm(option.KeyAlgorithm)
|
config.Certificate.KeyType = parseKeyAlgorithm(applyConfig.KeyAlgorithm)
|
||||||
|
|
||||||
// A client facilitates communication with the CA server.
|
// A client facilitates communication with the CA server.
|
||||||
client, err := lego.NewClient(config)
|
client, err := lego.NewClient(config)
|
||||||
@ -287,111 +114,41 @@ func apply(option *ApplyOption, provider challenge.Provider) (*Certificate, erro
|
|||||||
}
|
}
|
||||||
|
|
||||||
challengeOptions := make([]dns01.ChallengeOption, 0)
|
challengeOptions := make([]dns01.ChallengeOption, 0)
|
||||||
nameservers := parseNameservers(option.Nameservers)
|
if len(applyConfig.Nameservers) > 0 {
|
||||||
if len(nameservers) > 0 {
|
challengeOptions = append(challengeOptions, dns01.AddRecursiveNameservers(dns01.ParseNameservers(strings.Split(applyConfig.Nameservers, ";"))))
|
||||||
challengeOptions = append(challengeOptions, dns01.AddRecursiveNameservers(nameservers))
|
challengeOptions = append(challengeOptions, dns01.DisableAuthoritativeNssPropagationRequirement())
|
||||||
}
|
}
|
||||||
|
|
||||||
client.Challenge.SetDNS01Provider(provider, challengeOptions...)
|
client.Challenge.SetDNS01Provider(challengeProvider, challengeOptions...)
|
||||||
|
|
||||||
// New users will need to register
|
// New users will need to register
|
||||||
if !myUser.hasRegistration() {
|
if !myUser.hasRegistration() {
|
||||||
reg, err := getReg(client, sslProvider, myUser)
|
reg, err := registerAcmeUser(client, sslProviderConfig, myUser)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to register: %w", err)
|
return nil, fmt.Errorf("failed to register: %w", err)
|
||||||
}
|
}
|
||||||
myUser.Registration = reg
|
myUser.Registration = reg
|
||||||
}
|
}
|
||||||
|
|
||||||
domains := strings.Split(option.Domain, ";")
|
certRequest := certificate.ObtainRequest{
|
||||||
request := certificate.ObtainRequest{
|
Domains: strings.Split(applyConfig.Domains, ";"),
|
||||||
Domains: domains,
|
|
||||||
Bundle: true,
|
Bundle: true,
|
||||||
}
|
}
|
||||||
certificates, err := client.Certificate.Obtain(request)
|
certResource, err := client.Certificate.Obtain(certRequest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return &Certificate{
|
return &ApplyCertResult{
|
||||||
CertUrl: certificates.CertURL,
|
PrivateKey: string(certResource.PrivateKey),
|
||||||
CertStableUrl: certificates.CertStableURL,
|
Certificate: string(certResource.Certificate),
|
||||||
PrivateKey: string(certificates.PrivateKey),
|
IssuerCertificate: string(certResource.IssuerCertificate),
|
||||||
Certificate: string(certificates.Certificate),
|
CSR: string(certResource.CSR),
|
||||||
IssuerCertificate: string(certificates.IssuerCertificate),
|
ACMECertUrl: certResource.CertURL,
|
||||||
Csr: string(certificates.CSR),
|
ACMECertStableUrl: certResource.CertStableURL,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type AcmeAccountRepository interface {
|
|
||||||
GetByCAAndEmail(ca, email string) (*domain.AcmeAccount, error)
|
|
||||||
Save(ca, email, key string, resource *registration.Resource) error
|
|
||||||
}
|
|
||||||
|
|
||||||
func getAcmeAccountRepository() AcmeAccountRepository {
|
|
||||||
return repository.NewAcmeAccountRepository()
|
|
||||||
}
|
|
||||||
|
|
||||||
func getReg(client *lego.Client, sslProvider *SSLProviderConfig, user *ApplyUser) (*registration.Resource, error) {
|
|
||||||
var reg *registration.Resource
|
|
||||||
var err error
|
|
||||||
switch sslProvider.Provider {
|
|
||||||
case sslProviderZeroSSL:
|
|
||||||
reg, err = client.Registration.RegisterWithExternalAccountBinding(registration.RegisterEABOptions{
|
|
||||||
TermsOfServiceAgreed: true,
|
|
||||||
Kid: sslProvider.Config.Zerossl.EabKid,
|
|
||||||
HmacEncoded: sslProvider.Config.Zerossl.EabHmacKey,
|
|
||||||
})
|
|
||||||
case sslProviderGts:
|
|
||||||
reg, err = client.Registration.RegisterWithExternalAccountBinding(registration.RegisterEABOptions{
|
|
||||||
TermsOfServiceAgreed: true,
|
|
||||||
Kid: sslProvider.Config.Gts.EabKid,
|
|
||||||
HmacEncoded: sslProvider.Config.Gts.EabHmacKey,
|
|
||||||
})
|
|
||||||
|
|
||||||
case sslProviderLetsencrypt:
|
|
||||||
reg, err = client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})
|
|
||||||
|
|
||||||
default:
|
|
||||||
err = errors.New("unknown ssl provider")
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
repo := getAcmeAccountRepository()
|
|
||||||
|
|
||||||
resp, err := repo.GetByCAAndEmail(sslProvider.Provider, user.GetEmail())
|
|
||||||
if err == nil {
|
|
||||||
user.key = resp.Key
|
|
||||||
return resp.Resource, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := repo.Save(sslProvider.Provider, user.GetEmail(), user.getPrivateKeyString(), reg); err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to save registration: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return reg, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseNameservers(ns string) []string {
|
|
||||||
nameservers := make([]string, 0)
|
|
||||||
|
|
||||||
lines := strings.Split(ns, ";")
|
|
||||||
|
|
||||||
for _, line := range lines {
|
|
||||||
line = strings.TrimSpace(line)
|
|
||||||
if line == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
nameservers = append(nameservers, line)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nameservers
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseKeyAlgorithm(algo string) certcrypto.KeyType {
|
func parseKeyAlgorithm(algo string) certcrypto.KeyType {
|
||||||
switch algo {
|
switch algo {
|
||||||
case "RSA2048":
|
case "RSA2048":
|
||||||
@ -410,3 +167,13 @@ func parseKeyAlgorithm(algo string) certcrypto.KeyType {
|
|||||||
return certcrypto.RSA2048
|
return certcrypto.RSA2048
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: 暂时使用代理模式以兼容之前版本代码,后续重新实现此处逻辑
|
||||||
|
type proxyApplicant struct {
|
||||||
|
applicant challenge.Provider
|
||||||
|
applyConfig *applyConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *proxyApplicant) Apply() (*ApplyCertResult, error) {
|
||||||
|
return apply(d.applicant, d.applyConfig)
|
||||||
|
}
|
||||||
|
@ -1,39 +0,0 @@
|
|||||||
package applicant
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/providers/dns/route53"
|
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
|
||||||
)
|
|
||||||
|
|
||||||
type aws struct {
|
|
||||||
option *ApplyOption
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewAws(option *ApplyOption) Applicant {
|
|
||||||
return &aws{
|
|
||||||
option: option,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *aws) Apply() (*Certificate, error) {
|
|
||||||
access := &domain.AwsAccess{}
|
|
||||||
json.Unmarshal([]byte(t.option.Access), access)
|
|
||||||
|
|
||||||
os.Setenv("AWS_REGION", access.Region)
|
|
||||||
os.Setenv("AWS_ACCESS_KEY_ID", access.AccessKeyId)
|
|
||||||
os.Setenv("AWS_SECRET_ACCESS_KEY", access.SecretAccessKey)
|
|
||||||
os.Setenv("AWS_HOSTED_ZONE_ID", access.HostedZoneId)
|
|
||||||
os.Setenv("AWS_PROPAGATION_TIMEOUT", fmt.Sprintf("%d", t.option.Timeout))
|
|
||||||
|
|
||||||
dnsProvider, err := route53.NewDNSProvider()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return apply(t.option, dnsProvider)
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
package applicant
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
cf "github.com/go-acme/lego/v4/providers/dns/cloudflare"
|
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
|
||||||
)
|
|
||||||
|
|
||||||
type cloudflare struct {
|
|
||||||
option *ApplyOption
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewCloudflare(option *ApplyOption) Applicant {
|
|
||||||
return &cloudflare{
|
|
||||||
option: option,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *cloudflare) Apply() (*Certificate, error) {
|
|
||||||
access := &domain.CloudflareAccess{}
|
|
||||||
json.Unmarshal([]byte(c.option.Access), access)
|
|
||||||
|
|
||||||
os.Setenv("CLOUDFLARE_DNS_API_TOKEN", access.DnsApiToken)
|
|
||||||
os.Setenv("CLOUDFLARE_PROPAGATION_TIMEOUT", fmt.Sprintf("%d", c.option.Timeout))
|
|
||||||
|
|
||||||
provider, err := cf.NewDNSProvider()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return apply(c.option, provider)
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
package applicant
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
godaddyProvider "github.com/go-acme/lego/v4/providers/dns/godaddy"
|
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
|
||||||
)
|
|
||||||
|
|
||||||
type godaddy struct {
|
|
||||||
option *ApplyOption
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewGodaddy(option *ApplyOption) Applicant {
|
|
||||||
return &godaddy{
|
|
||||||
option: option,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *godaddy) Apply() (*Certificate, error) {
|
|
||||||
access := &domain.GodaddyAccess{}
|
|
||||||
json.Unmarshal([]byte(a.option.Access), access)
|
|
||||||
|
|
||||||
os.Setenv("GODADDY_API_KEY", access.ApiKey)
|
|
||||||
os.Setenv("GODADDY_API_SECRET", access.ApiSecret)
|
|
||||||
os.Setenv("GODADDY_PROPAGATION_TIMEOUT", fmt.Sprintf("%d", a.option.Timeout))
|
|
||||||
|
|
||||||
dnsProvider, err := godaddyProvider.NewDNSProvider()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return apply(a.option, dnsProvider)
|
|
||||||
}
|
|
@ -1,38 +0,0 @@
|
|||||||
package applicant
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/providers/dns/httpreq"
|
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
|
||||||
)
|
|
||||||
|
|
||||||
type httpReq struct {
|
|
||||||
option *ApplyOption
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewHttpreq(option *ApplyOption) Applicant {
|
|
||||||
return &httpReq{
|
|
||||||
option: option,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *httpReq) Apply() (*Certificate, error) {
|
|
||||||
access := &domain.HttpreqAccess{}
|
|
||||||
json.Unmarshal([]byte(a.option.Access), access)
|
|
||||||
|
|
||||||
os.Setenv("HTTPREQ_ENDPOINT", access.Endpoint)
|
|
||||||
os.Setenv("HTTPREQ_MODE", access.Mode)
|
|
||||||
os.Setenv("HTTPREQ_USERNAME", access.Username)
|
|
||||||
os.Setenv("HTTPREQ_PASSWORD", access.Password)
|
|
||||||
os.Setenv("HTTPREQ_PROPAGATION_TIMEOUT", fmt.Sprintf("%d", a.option.Timeout))
|
|
||||||
dnsProvider, err := httpreq.NewDNSProvider()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return apply(a.option, dnsProvider)
|
|
||||||
}
|
|
@ -1,43 +0,0 @@
|
|||||||
package applicant
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
huaweicloudProvider "github.com/go-acme/lego/v4/providers/dns/huaweicloud"
|
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
|
||||||
)
|
|
||||||
|
|
||||||
type huaweicloud struct {
|
|
||||||
option *ApplyOption
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewHuaweiCloud(option *ApplyOption) Applicant {
|
|
||||||
return &huaweicloud{
|
|
||||||
option: option,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *huaweicloud) Apply() (*Certificate, error) {
|
|
||||||
access := &domain.HuaweiCloudAccess{}
|
|
||||||
json.Unmarshal([]byte(t.option.Access), access)
|
|
||||||
|
|
||||||
region := access.Region
|
|
||||||
if region == "" {
|
|
||||||
region = "cn-north-1"
|
|
||||||
}
|
|
||||||
|
|
||||||
os.Setenv("HUAWEICLOUD_REGION", region) // 华为云的 SDK 要求必须传一个区域,实际上 DNS-01 流程里用不到,但不传会报错
|
|
||||||
os.Setenv("HUAWEICLOUD_ACCESS_KEY_ID", access.AccessKeyId)
|
|
||||||
os.Setenv("HUAWEICLOUD_SECRET_ACCESS_KEY", access.SecretAccessKey)
|
|
||||||
os.Setenv("HUAWEICLOUD_PROPAGATION_TIMEOUT", fmt.Sprintf("%d", t.option.Timeout))
|
|
||||||
|
|
||||||
dnsProvider, err := huaweicloudProvider.NewDNSProvider()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return apply(t.option, dnsProvider)
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
package applicant
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/providers/dns/namedotcom"
|
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
|
||||||
)
|
|
||||||
|
|
||||||
type nameDotCom struct {
|
|
||||||
option *ApplyOption
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewNameDotCom(option *ApplyOption) Applicant {
|
|
||||||
return &nameDotCom{
|
|
||||||
option: option,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (n *nameDotCom) Apply() (*Certificate, error) {
|
|
||||||
access := &domain.NameDotComAccess{}
|
|
||||||
json.Unmarshal([]byte(n.option.Access), access)
|
|
||||||
|
|
||||||
config := namedotcom.NewDefaultConfig()
|
|
||||||
config.Username = access.Username
|
|
||||||
config.APIToken = access.ApiToken
|
|
||||||
config.PropagationTimeout = time.Duration(n.option.Timeout) * time.Second
|
|
||||||
|
|
||||||
dnsProvider, err := namedotcom.NewDNSProviderConfig(config)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return apply(n.option, dnsProvider)
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
package applicant
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
namesiloProvider "github.com/go-acme/lego/v4/providers/dns/namesilo"
|
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
|
||||||
)
|
|
||||||
|
|
||||||
type namesilo struct {
|
|
||||||
option *ApplyOption
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewNamesilo(option *ApplyOption) Applicant {
|
|
||||||
return &namesilo{
|
|
||||||
option: option,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *namesilo) Apply() (*Certificate, error) {
|
|
||||||
access := &domain.NameSiloAccess{}
|
|
||||||
json.Unmarshal([]byte(a.option.Access), access)
|
|
||||||
|
|
||||||
os.Setenv("NAMESILO_API_KEY", access.ApiKey)
|
|
||||||
os.Setenv("NAMESILO_PROPAGATION_TIMEOUT", fmt.Sprintf("%d", a.option.Timeout))
|
|
||||||
|
|
||||||
dnsProvider, err := namesiloProvider.NewDNSProvider()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return apply(a.option, dnsProvider)
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
package applicant
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/providers/dns/pdns"
|
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
|
||||||
)
|
|
||||||
|
|
||||||
type powerdns struct {
|
|
||||||
option *ApplyOption
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewPdns(option *ApplyOption) Applicant {
|
|
||||||
return &powerdns{
|
|
||||||
option: option,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *powerdns) Apply() (*Certificate, error) {
|
|
||||||
access := &domain.PdnsAccess{}
|
|
||||||
json.Unmarshal([]byte(a.option.Access), access)
|
|
||||||
|
|
||||||
os.Setenv("PDNS_API_URL", access.ApiUrl)
|
|
||||||
os.Setenv("PDNS_API_KEY", access.ApiKey)
|
|
||||||
os.Setenv("PDNS_PROPAGATION_TIMEOUT", fmt.Sprintf("%d", a.option.Timeout))
|
|
||||||
dnsProvider, err := pdns.NewDNSProvider()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return apply(a.option, dnsProvider)
|
|
||||||
}
|
|
199
internal/applicant/providers.go
Normal file
199
internal/applicant/providers.go
Normal file
@ -0,0 +1,199 @@
|
|||||||
|
package applicant
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/go-acme/lego/v4/challenge"
|
||||||
|
|
||||||
|
"github.com/usual2970/certimate/internal/domain"
|
||||||
|
providerACMEHttpReq "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/acmehttpreq"
|
||||||
|
providerAliyun "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/aliyun"
|
||||||
|
providerAWS "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/aws"
|
||||||
|
providerCloudflare "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/cloudflare"
|
||||||
|
providerGoDaddy "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/godaddy"
|
||||||
|
providerHuaweiCloud "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/huaweicloud"
|
||||||
|
providerNameDotCom "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/namedotcom"
|
||||||
|
providerNameSilo "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/namesilo"
|
||||||
|
providerPowerDNS "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/powerdns"
|
||||||
|
providerTencentCloud "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/tencentcloud"
|
||||||
|
providerVolcEngine "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/volcengine"
|
||||||
|
)
|
||||||
|
|
||||||
|
func createChallengeProvider(provider domain.AccessProviderType, accessConfig string, applyConfig *applyConfig) (challenge.Provider, error) {
|
||||||
|
/*
|
||||||
|
注意:如果追加新的常量值,请保持以 ASCII 排序。
|
||||||
|
NOTICE: If you add new constant, please keep ASCII order.
|
||||||
|
*/
|
||||||
|
switch provider {
|
||||||
|
case domain.AccessProviderTypeACMEHttpReq:
|
||||||
|
{
|
||||||
|
access := &domain.AccessConfigForACMEHttpReq{}
|
||||||
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
applicant, err := providerACMEHttpReq.NewChallengeProvider(&providerACMEHttpReq.ACMEHttpReqApplicantConfig{
|
||||||
|
Endpoint: access.Endpoint,
|
||||||
|
Mode: access.Mode,
|
||||||
|
Username: access.Username,
|
||||||
|
Password: access.Password,
|
||||||
|
PropagationTimeout: applyConfig.PropagationTimeout,
|
||||||
|
})
|
||||||
|
return applicant, err
|
||||||
|
}
|
||||||
|
|
||||||
|
case domain.AccessProviderTypeAliyun:
|
||||||
|
{
|
||||||
|
access := &domain.AccessConfigForAliyun{}
|
||||||
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
applicant, err := providerAliyun.NewChallengeProvider(&providerAliyun.AliyunApplicantConfig{
|
||||||
|
AccessKeyId: access.AccessKeyId,
|
||||||
|
AccessKeySecret: access.AccessKeySecret,
|
||||||
|
PropagationTimeout: applyConfig.PropagationTimeout,
|
||||||
|
})
|
||||||
|
return applicant, err
|
||||||
|
}
|
||||||
|
|
||||||
|
case domain.AccessProviderTypeAWS:
|
||||||
|
{
|
||||||
|
access := &domain.AccessConfigForAWS{}
|
||||||
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
applicant, err := providerAWS.NewChallengeProvider(&providerAWS.AWSApplicantConfig{
|
||||||
|
AccessKeyId: access.AccessKeyId,
|
||||||
|
SecretAccessKey: access.SecretAccessKey,
|
||||||
|
Region: access.Region,
|
||||||
|
HostedZoneId: access.HostedZoneId,
|
||||||
|
PropagationTimeout: applyConfig.PropagationTimeout,
|
||||||
|
})
|
||||||
|
return applicant, err
|
||||||
|
}
|
||||||
|
|
||||||
|
case domain.AccessProviderTypeCloudflare:
|
||||||
|
{
|
||||||
|
access := &domain.AccessConfigForCloudflare{}
|
||||||
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
applicant, err := providerCloudflare.NewChallengeProvider(&providerCloudflare.CloudflareApplicantConfig{
|
||||||
|
DnsApiToken: access.DnsApiToken,
|
||||||
|
PropagationTimeout: applyConfig.PropagationTimeout,
|
||||||
|
})
|
||||||
|
return applicant, err
|
||||||
|
}
|
||||||
|
|
||||||
|
case domain.AccessProviderTypeGoDaddy:
|
||||||
|
{
|
||||||
|
access := &domain.AccessConfigForGoDaddy{}
|
||||||
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
applicant, err := providerGoDaddy.NewChallengeProvider(&providerGoDaddy.GoDaddyApplicantConfig{
|
||||||
|
ApiKey: access.ApiKey,
|
||||||
|
ApiSecret: access.ApiSecret,
|
||||||
|
PropagationTimeout: applyConfig.PropagationTimeout,
|
||||||
|
})
|
||||||
|
return applicant, err
|
||||||
|
}
|
||||||
|
|
||||||
|
case domain.AccessProviderTypeHuaweiCloud:
|
||||||
|
{
|
||||||
|
access := &domain.AccessConfigForHuaweiCloud{}
|
||||||
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
applicant, err := providerHuaweiCloud.NewChallengeProvider(&providerHuaweiCloud.HuaweiCloudApplicantConfig{
|
||||||
|
AccessKeyId: access.AccessKeyId,
|
||||||
|
SecretAccessKey: access.SecretAccessKey,
|
||||||
|
Region: access.Region,
|
||||||
|
PropagationTimeout: applyConfig.PropagationTimeout,
|
||||||
|
})
|
||||||
|
return applicant, err
|
||||||
|
}
|
||||||
|
|
||||||
|
case domain.AccessProviderTypeNameDotCom:
|
||||||
|
{
|
||||||
|
access := &domain.AccessConfigForNameDotCom{}
|
||||||
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
applicant, err := providerNameDotCom.NewChallengeProvider(&providerNameDotCom.NameDotComApplicantConfig{
|
||||||
|
Username: access.Username,
|
||||||
|
ApiToken: access.ApiToken,
|
||||||
|
PropagationTimeout: applyConfig.PropagationTimeout,
|
||||||
|
})
|
||||||
|
return applicant, err
|
||||||
|
}
|
||||||
|
|
||||||
|
case domain.AccessProviderTypeNameSilo:
|
||||||
|
{
|
||||||
|
access := &domain.AccessConfigForNameSilo{}
|
||||||
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
applicant, err := providerNameSilo.NewChallengeProvider(&providerNameSilo.NameSiloApplicantConfig{
|
||||||
|
ApiKey: access.ApiKey,
|
||||||
|
PropagationTimeout: applyConfig.PropagationTimeout,
|
||||||
|
})
|
||||||
|
return applicant, err
|
||||||
|
}
|
||||||
|
|
||||||
|
case domain.AccessProviderTypePowerDNS:
|
||||||
|
{
|
||||||
|
access := &domain.AccessConfigForPowerDNS{}
|
||||||
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
applicant, err := providerPowerDNS.NewChallengeProvider(&providerPowerDNS.PowerDNSApplicantConfig{
|
||||||
|
ApiUrl: access.ApiUrl,
|
||||||
|
ApiKey: access.ApiKey,
|
||||||
|
PropagationTimeout: applyConfig.PropagationTimeout,
|
||||||
|
})
|
||||||
|
return applicant, err
|
||||||
|
}
|
||||||
|
|
||||||
|
case domain.AccessProviderTypeTencentCloud:
|
||||||
|
{
|
||||||
|
access := &domain.AccessConfigForTencentCloud{}
|
||||||
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
applicant, err := providerTencentCloud.NewChallengeProvider(&providerTencentCloud.TencentCloudApplicantConfig{
|
||||||
|
SecretId: access.SecretId,
|
||||||
|
SecretKey: access.SecretKey,
|
||||||
|
PropagationTimeout: applyConfig.PropagationTimeout,
|
||||||
|
})
|
||||||
|
return applicant, err
|
||||||
|
}
|
||||||
|
|
||||||
|
case domain.AccessProviderTypeVolcEngine:
|
||||||
|
{
|
||||||
|
access := &domain.AccessConfigForVolcEngine{}
|
||||||
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
applicant, err := providerVolcEngine.NewChallengeProvider(&providerVolcEngine.VolcEngineApplicantConfig{
|
||||||
|
AccessKeyId: access.AccessKeyId,
|
||||||
|
SecretAccessKey: access.SecretAccessKey,
|
||||||
|
PropagationTimeout: applyConfig.PropagationTimeout,
|
||||||
|
})
|
||||||
|
return applicant, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, fmt.Errorf("unsupported applicant provider: %s", provider)
|
||||||
|
}
|
@ -1,37 +0,0 @@
|
|||||||
package applicant
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/providers/dns/tencentcloud"
|
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
|
||||||
)
|
|
||||||
|
|
||||||
type tencent struct {
|
|
||||||
option *ApplyOption
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewTencent(option *ApplyOption) Applicant {
|
|
||||||
return &tencent{
|
|
||||||
option: option,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *tencent) Apply() (*Certificate, error) {
|
|
||||||
access := &domain.TencentAccess{}
|
|
||||||
json.Unmarshal([]byte(t.option.Access), access)
|
|
||||||
|
|
||||||
os.Setenv("TENCENTCLOUD_SECRET_ID", access.SecretId)
|
|
||||||
os.Setenv("TENCENTCLOUD_SECRET_KEY", access.SecretKey)
|
|
||||||
os.Setenv("TENCENTCLOUD_PROPAGATION_TIMEOUT", fmt.Sprintf("%d", t.option.Timeout))
|
|
||||||
|
|
||||||
dnsProvider, err := tencentcloud.NewDNSProvider()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return apply(t.option, dnsProvider)
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
package applicant
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
volcengineDns "github.com/go-acme/lego/v4/providers/dns/volcengine"
|
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
|
||||||
)
|
|
||||||
|
|
||||||
type volcengine struct {
|
|
||||||
option *ApplyOption
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewVolcengine(option *ApplyOption) Applicant {
|
|
||||||
return &volcengine{
|
|
||||||
option: option,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *volcengine) Apply() (*Certificate, error) {
|
|
||||||
access := &domain.VolcEngineAccess{}
|
|
||||||
json.Unmarshal([]byte(a.option.Access), access)
|
|
||||||
|
|
||||||
os.Setenv("VOLC_ACCESSKEY", access.AccessKeyId)
|
|
||||||
os.Setenv("VOLC_SECRETKEY", access.SecretAccessKey)
|
|
||||||
os.Setenv("VOLC_PROPAGATION_TIMEOUT", fmt.Sprintf("%d", a.option.Timeout))
|
|
||||||
dnsProvider, err := volcengineDns.NewDNSProvider()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return apply(a.option, dnsProvider)
|
|
||||||
}
|
|
@ -6,19 +6,19 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/usual2970/certimate/internal/app"
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
"github.com/usual2970/certimate/internal/domain"
|
||||||
"github.com/usual2970/certimate/internal/notify"
|
"github.com/usual2970/certimate/internal/notify"
|
||||||
"github.com/usual2970/certimate/internal/repository"
|
"github.com/usual2970/certimate/internal/repository"
|
||||||
"github.com/usual2970/certimate/internal/utils/app"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
defaultExpireSubject = "您有 {COUNT} 张证书即将过期"
|
defaultExpireSubject = "您有 ${COUNT} 张证书即将过期"
|
||||||
defaultExpireMessage = "有 {COUNT} 张证书即将过期,域名分别为 {DOMAINS},请保持关注!"
|
defaultExpireMessage = "有 ${COUNT} 张证书即将过期,域名分别为 ${DOMAINS},请保持关注!"
|
||||||
)
|
)
|
||||||
|
|
||||||
type CertificateRepository interface {
|
type CertificateRepository interface {
|
||||||
GetExpireSoon(ctx context.Context) ([]domain.Certificate, error)
|
ListExpireSoon(ctx context.Context) ([]domain.Certificate, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type certificateService struct {
|
type certificateService struct {
|
||||||
@ -33,69 +33,72 @@ func NewCertificateService(repo CertificateRepository) *certificateService {
|
|||||||
|
|
||||||
func (s *certificateService) InitSchedule(ctx context.Context) error {
|
func (s *certificateService) InitSchedule(ctx context.Context) error {
|
||||||
scheduler := app.GetScheduler()
|
scheduler := app.GetScheduler()
|
||||||
|
|
||||||
err := scheduler.Add("certificate", "0 0 * * *", func() {
|
err := scheduler.Add("certificate", "0 0 * * *", func() {
|
||||||
certs, err := s.repo.GetExpireSoon(context.Background())
|
certs, err := s.repo.ListExpireSoon(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
app.GetApp().Logger().Error("failed to get expire soon certificate", "err", err)
|
app.GetLogger().Error("failed to get expire soon certificate", "err", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
msg := buildMsg(certs)
|
|
||||||
if err := notify.SendToAllChannels(msg.Subject, msg.Message); err != nil {
|
notification := buildExpireSoonNotification(certs)
|
||||||
app.GetApp().Logger().Error("failed to send expire soon certificate", "err", err)
|
if notification == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := notify.SendToAllChannels(notification.Subject, notification.Message); err != nil {
|
||||||
|
app.GetLogger().Error("failed to send expire soon certificate", "err", err)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
app.GetApp().Logger().Error("failed to add schedule", "err", err)
|
app.GetLogger().Error("failed to add schedule", "err", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
scheduler.Start()
|
scheduler.Start()
|
||||||
app.GetApp().Logger().Info("certificate schedule started")
|
app.GetLogger().Info("certificate schedule started")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildMsg(records []domain.Certificate) *domain.NotifyMessage {
|
type certificateNotification struct {
|
||||||
|
Subject string `json:"subject"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildExpireSoonNotification(records []domain.Certificate) *certificateNotification {
|
||||||
if len(records) == 0 {
|
if len(records) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询模板信息
|
|
||||||
settingRepo := repository.NewSettingRepository()
|
|
||||||
setting, err := settingRepo.GetByName(context.Background(), "notifyTemplates")
|
|
||||||
|
|
||||||
subject := defaultExpireSubject
|
subject := defaultExpireSubject
|
||||||
message := defaultExpireMessage
|
message := defaultExpireMessage
|
||||||
|
|
||||||
|
// 查询模板信息
|
||||||
|
settingRepo := repository.NewSettingsRepository()
|
||||||
|
setting, err := settingRepo.GetByName(context.Background(), "notifyTemplates")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
var templates *domain.NotifyTemplates
|
var templates *domain.NotifyTemplatesSettingsContent
|
||||||
|
|
||||||
json.Unmarshal([]byte(setting.Content), &templates)
|
json.Unmarshal([]byte(setting.Content), &templates)
|
||||||
|
|
||||||
if templates != nil && len(templates.NotifyTemplates) > 0 {
|
if templates != nil && len(templates.NotifyTemplates) > 0 {
|
||||||
subject = templates.NotifyTemplates[0].Title
|
subject = templates.NotifyTemplates[0].Subject
|
||||||
message = templates.NotifyTemplates[0].Content
|
message = templates.NotifyTemplates[0].Message
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 替换变量
|
// 替换变量
|
||||||
count := len(records)
|
count := len(records)
|
||||||
domains := make([]string, count)
|
domains := make([]string, count)
|
||||||
|
|
||||||
for i, record := range records {
|
for i, record := range records {
|
||||||
domains[i] = record.SAN
|
domains[i] = record.SubjectAltNames
|
||||||
}
|
}
|
||||||
|
|
||||||
countStr := strconv.Itoa(count)
|
countStr := strconv.Itoa(count)
|
||||||
domainStr := strings.Join(domains, ";")
|
domainStr := strings.Join(domains, ";")
|
||||||
|
subject = strings.ReplaceAll(subject, "${COUNT}", countStr)
|
||||||
subject = strings.ReplaceAll(subject, "{COUNT}", countStr)
|
subject = strings.ReplaceAll(subject, "${DOMAINS}", domainStr)
|
||||||
subject = strings.ReplaceAll(subject, "{DOMAINS}", domainStr)
|
message = strings.ReplaceAll(message, "${COUNT}", countStr)
|
||||||
|
message = strings.ReplaceAll(message, "${DOMAINS}", domainStr)
|
||||||
message = strings.ReplaceAll(message, "{COUNT}", countStr)
|
|
||||||
message = strings.ReplaceAll(message, "{DOMAINS}", domainStr)
|
|
||||||
|
|
||||||
// 返回消息
|
// 返回消息
|
||||||
return &domain.NotifyMessage{
|
return &certificateNotification{
|
||||||
Subject: subject,
|
Subject: subject,
|
||||||
Message: message,
|
Message: message,
|
||||||
}
|
}
|
||||||
|
@ -4,150 +4,56 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/pocketbase/pocketbase/models"
|
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/applicant"
|
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
"github.com/usual2970/certimate/internal/domain"
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/repository"
|
"github.com/usual2970/certimate/internal/repository"
|
||||||
)
|
)
|
||||||
|
|
||||||
/*
|
|
||||||
提供商部署目标常量值。
|
|
||||||
|
|
||||||
注意:如果追加新的常量值,请保持以 ASCII 排序。
|
|
||||||
NOTICE: If you add new constant, please keep ASCII order.
|
|
||||||
*/
|
|
||||||
const (
|
|
||||||
targetAliyunALB = "aliyun-alb"
|
|
||||||
targetAliyunCDN = "aliyun-cdn"
|
|
||||||
targetAliyunCLB = "aliyun-clb"
|
|
||||||
targetAliyunDCDN = "aliyun-dcdn"
|
|
||||||
targetAliyunNLB = "aliyun-nlb"
|
|
||||||
targetAliyunOSS = "aliyun-oss"
|
|
||||||
targetBaiduCloudCDN = "baiducloud-cdn"
|
|
||||||
targetBytePlusCDN = "byteplus-cdn"
|
|
||||||
targetDogeCloudCDN = "dogecloud-cdn"
|
|
||||||
targetHuaweiCloudCDN = "huaweicloud-cdn"
|
|
||||||
targetHuaweiCloudELB = "huaweicloud-elb"
|
|
||||||
targetK8sSecret = "k8s-secret"
|
|
||||||
targetLocal = "local"
|
|
||||||
targetQiniuCDN = "qiniu-cdn"
|
|
||||||
targetSSH = "ssh"
|
|
||||||
targetTencentCloudCDN = "tencentcloud-cdn"
|
|
||||||
targetTencentCloudCLB = "tencentcloud-clb"
|
|
||||||
targetTencentCloudCOS = "tencentcloud-cos"
|
|
||||||
targetTencentCloudECDN = "tencentcloud-ecdn"
|
|
||||||
targetTencentCloudEO = "tencentcloud-eo"
|
|
||||||
targetVolcEngineCDN = "volcengine-cdn"
|
|
||||||
targetVolcEngineLive = "volcengine-live"
|
|
||||||
targetWebhook = "webhook"
|
|
||||||
)
|
|
||||||
|
|
||||||
type DeployerOption struct {
|
|
||||||
DomainId string `json:"domainId"`
|
|
||||||
Domain string `json:"domain"`
|
|
||||||
Access string `json:"access"`
|
|
||||||
AccessRecord *domain.Access `json:"-"`
|
|
||||||
DeployConfig domain.DeployConfig `json:"deployConfig"`
|
|
||||||
Certificate applicant.Certificate `json:"certificate"`
|
|
||||||
Variables map[string]string `json:"variables"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Deployer interface {
|
type Deployer interface {
|
||||||
Deploy(ctx context.Context) error
|
Deploy(ctx context.Context) error
|
||||||
GetInfos() []string
|
|
||||||
GetID() string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func Gets(record *models.Record, cert *applicant.Certificate) ([]Deployer, error) {
|
func NewWithDeployNode(node *domain.WorkflowNode, certdata struct {
|
||||||
rs := make([]Deployer, 0)
|
Certificate string
|
||||||
if record.GetString("deployConfig") == "" {
|
PrivateKey string
|
||||||
return rs, nil
|
},
|
||||||
|
) (Deployer, error) {
|
||||||
|
if node.Type != domain.WorkflowNodeTypeDeploy {
|
||||||
|
return nil, fmt.Errorf("node type is not deploy")
|
||||||
}
|
}
|
||||||
|
|
||||||
deployConfigs := make([]domain.DeployConfig, 0)
|
|
||||||
|
|
||||||
err := record.UnmarshalJSONField("deployConfig", &deployConfigs)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("解析部署配置失败: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(deployConfigs) == 0 {
|
|
||||||
return rs, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, deployConfig := range deployConfigs {
|
|
||||||
deployer, err := newWithDeployConfig(record, cert, deployConfig)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
rs = append(rs, deployer)
|
|
||||||
}
|
|
||||||
|
|
||||||
return rs, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetWithTypeAndOption(deployType string, option *DeployerOption) (Deployer, error) {
|
|
||||||
return newWithTypeAndOption(deployType, option)
|
|
||||||
}
|
|
||||||
|
|
||||||
func newWithDeployConfig(record *models.Record, cert *applicant.Certificate, deployConfig domain.DeployConfig) (Deployer, error) {
|
|
||||||
accessRepo := repository.NewAccessRepository()
|
accessRepo := repository.NewAccessRepository()
|
||||||
access, err := accessRepo.GetById(context.Background(), deployConfig.Access)
|
accessId := node.GetConfigString("providerAccessId")
|
||||||
|
access, err := accessRepo.GetById(context.Background(), accessId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("获取access失败:%w", err)
|
return nil, fmt.Errorf("failed to get access #%s record: %w", accessId, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
option := &DeployerOption{
|
deployProvider := node.GetConfigString("provider")
|
||||||
DomainId: record.Id,
|
deployConfig := node.GetConfigMap("providerConfig")
|
||||||
Domain: record.GetString("domain"),
|
deployer, logger, err := createDeployer(domain.DeployProviderType(deployProvider), access.Config, deployConfig)
|
||||||
Access: access.Config,
|
|
||||||
AccessRecord: access,
|
|
||||||
DeployConfig: deployConfig,
|
|
||||||
}
|
|
||||||
if cert != nil {
|
|
||||||
option.Certificate = *cert
|
|
||||||
} else {
|
|
||||||
option.Certificate = applicant.Certificate{
|
|
||||||
Certificate: record.GetString("certificate"),
|
|
||||||
PrivateKey: record.GetString("privateKey"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return newWithTypeAndOption(deployConfig.Type, option)
|
|
||||||
}
|
|
||||||
|
|
||||||
func newWithTypeAndOption(deployType string, option *DeployerOption) (Deployer, error) {
|
|
||||||
deployer, logger, err := createDeployer(deployType, option.AccessRecord.Config, option.DeployConfig.Config)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return &proxyDeployer{
|
return &proxyDeployer{
|
||||||
option: option,
|
|
||||||
logger: logger,
|
logger: logger,
|
||||||
deployer: deployer,
|
deployer: deployer,
|
||||||
|
deployCertificate: certdata.Certificate,
|
||||||
|
deployPrivateKey: certdata.PrivateKey,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: 暂时使用代理模式以兼容之前版本代码,后续重新实现此处逻辑
|
// TODO: 暂时使用代理模式以兼容之前版本代码,后续重新实现此处逻辑
|
||||||
type proxyDeployer struct {
|
type proxyDeployer struct {
|
||||||
option *DeployerOption
|
logger logger.Logger
|
||||||
logger deployer.Logger
|
|
||||||
deployer deployer.Deployer
|
deployer deployer.Deployer
|
||||||
}
|
deployCertificate string
|
||||||
|
deployPrivateKey string
|
||||||
func (d *proxyDeployer) GetID() string {
|
|
||||||
return fmt.Sprintf("%s-%s", d.option.AccessRecord.GetString("name"), d.option.AccessRecord.Id)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *proxyDeployer) GetInfos() []string {
|
|
||||||
return d.logger.GetRecords()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *proxyDeployer) Deploy(ctx context.Context) error {
|
func (d *proxyDeployer) Deploy(ctx context.Context) error {
|
||||||
_, err := d.deployer.Deploy(ctx, d.option.Certificate.Certificate, d.option.Certificate.PrivateKey)
|
_, err := d.deployer.Deploy(ctx, d.deployCertificate, d.deployPrivateKey)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -30,26 +30,27 @@ import (
|
|||||||
providerVolcEngineCDN "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/volcengine-cdn"
|
providerVolcEngineCDN "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/volcengine-cdn"
|
||||||
providerVolcEngineLive "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/volcengine-live"
|
providerVolcEngineLive "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/volcengine-live"
|
||||||
providerWebhook "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/webhook"
|
providerWebhook "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/webhook"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/utils/maps"
|
"github.com/usual2970/certimate/internal/pkg/utils/maps"
|
||||||
)
|
)
|
||||||
|
|
||||||
func createDeployer(target string, accessConfig string, deployConfig map[string]any) (deployer.Deployer, deployer.Logger, error) {
|
func createDeployer(provider domain.DeployProviderType, accessConfig string, deployConfig map[string]any) (deployer.Deployer, logger.Logger, error) {
|
||||||
logger := deployer.NewDefaultLogger()
|
logger := logger.NewDefaultLogger()
|
||||||
|
|
||||||
/*
|
/*
|
||||||
注意:如果追加新的常量值,请保持以 ASCII 排序。
|
注意:如果追加新的常量值,请保持以 ASCII 排序。
|
||||||
NOTICE: If you add new constant, please keep ASCII order.
|
NOTICE: If you add new constant, please keep ASCII order.
|
||||||
*/
|
*/
|
||||||
switch target {
|
switch provider {
|
||||||
case targetAliyunALB, targetAliyunCDN, targetAliyunCLB, targetAliyunDCDN, targetAliyunNLB, targetAliyunOSS:
|
case domain.DeployProviderTypeAliyunALB, domain.DeployProviderTypeAliyunCDN, domain.DeployProviderTypeAliyunCLB, domain.DeployProviderTypeAliyunDCDN, domain.DeployProviderTypeAliyunNLB, domain.DeployProviderTypeAliyunOSS:
|
||||||
{
|
{
|
||||||
access := &domain.AliyunAccess{}
|
access := &domain.AccessConfigForAliyun{}
|
||||||
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
switch target {
|
switch provider {
|
||||||
case targetAliyunALB:
|
case domain.DeployProviderTypeAliyunALB:
|
||||||
deployer, err := providerAliyunALB.NewWithLogger(&providerAliyunALB.AliyunALBDeployerConfig{
|
deployer, err := providerAliyunALB.NewWithLogger(&providerAliyunALB.AliyunALBDeployerConfig{
|
||||||
AccessKeyId: access.AccessKeyId,
|
AccessKeyId: access.AccessKeyId,
|
||||||
AccessKeySecret: access.AccessKeySecret,
|
AccessKeySecret: access.AccessKeySecret,
|
||||||
@ -60,7 +61,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
}, logger)
|
}, logger)
|
||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
|
|
||||||
case targetAliyunCDN:
|
case domain.DeployProviderTypeAliyunCDN:
|
||||||
deployer, err := providerAliyunCDN.NewWithLogger(&providerAliyunCDN.AliyunCDNDeployerConfig{
|
deployer, err := providerAliyunCDN.NewWithLogger(&providerAliyunCDN.AliyunCDNDeployerConfig{
|
||||||
AccessKeyId: access.AccessKeyId,
|
AccessKeyId: access.AccessKeyId,
|
||||||
AccessKeySecret: access.AccessKeySecret,
|
AccessKeySecret: access.AccessKeySecret,
|
||||||
@ -68,7 +69,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
}, logger)
|
}, logger)
|
||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
|
|
||||||
case targetAliyunCLB:
|
case domain.DeployProviderTypeAliyunCLB:
|
||||||
deployer, err := providerAliyunCLB.NewWithLogger(&providerAliyunCLB.AliyunCLBDeployerConfig{
|
deployer, err := providerAliyunCLB.NewWithLogger(&providerAliyunCLB.AliyunCLBDeployerConfig{
|
||||||
AccessKeyId: access.AccessKeyId,
|
AccessKeyId: access.AccessKeyId,
|
||||||
AccessKeySecret: access.AccessKeySecret,
|
AccessKeySecret: access.AccessKeySecret,
|
||||||
@ -79,7 +80,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
}, logger)
|
}, logger)
|
||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
|
|
||||||
case targetAliyunDCDN:
|
case domain.DeployProviderTypeAliyunDCDN:
|
||||||
deployer, err := providerAliyunDCDN.NewWithLogger(&providerAliyunDCDN.AliyunDCDNDeployerConfig{
|
deployer, err := providerAliyunDCDN.NewWithLogger(&providerAliyunDCDN.AliyunDCDNDeployerConfig{
|
||||||
AccessKeyId: access.AccessKeyId,
|
AccessKeyId: access.AccessKeyId,
|
||||||
AccessKeySecret: access.AccessKeySecret,
|
AccessKeySecret: access.AccessKeySecret,
|
||||||
@ -87,7 +88,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
}, logger)
|
}, logger)
|
||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
|
|
||||||
case targetAliyunNLB:
|
case domain.DeployProviderTypeAliyunNLB:
|
||||||
deployer, err := providerAliyunNLB.NewWithLogger(&providerAliyunNLB.AliyunNLBDeployerConfig{
|
deployer, err := providerAliyunNLB.NewWithLogger(&providerAliyunNLB.AliyunNLBDeployerConfig{
|
||||||
AccessKeyId: access.AccessKeyId,
|
AccessKeyId: access.AccessKeyId,
|
||||||
AccessKeySecret: access.AccessKeySecret,
|
AccessKeySecret: access.AccessKeySecret,
|
||||||
@ -98,7 +99,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
}, logger)
|
}, logger)
|
||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
|
|
||||||
case targetAliyunOSS:
|
case domain.DeployProviderTypeAliyunOSS:
|
||||||
deployer, err := providerAliyunOSS.NewWithLogger(&providerAliyunOSS.AliyunOSSDeployerConfig{
|
deployer, err := providerAliyunOSS.NewWithLogger(&providerAliyunOSS.AliyunOSSDeployerConfig{
|
||||||
AccessKeyId: access.AccessKeyId,
|
AccessKeyId: access.AccessKeyId,
|
||||||
AccessKeySecret: access.AccessKeySecret,
|
AccessKeySecret: access.AccessKeySecret,
|
||||||
@ -113,9 +114,9 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case targetBaiduCloudCDN:
|
case domain.DeployProviderTypeBaiduCloudCDN:
|
||||||
{
|
{
|
||||||
access := &domain.BaiduCloudAccess{}
|
access := &domain.AccessConfigForBaiduCloud{}
|
||||||
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
}
|
}
|
||||||
@ -128,9 +129,9 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
}
|
}
|
||||||
|
|
||||||
case targetBytePlusCDN:
|
case domain.DeployProviderTypeBytePlusCDN:
|
||||||
{
|
{
|
||||||
access := &domain.ByteplusAccess{}
|
access := &domain.AccessConfigForBytePlus{}
|
||||||
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
}
|
}
|
||||||
@ -143,9 +144,9 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
}
|
}
|
||||||
|
|
||||||
case targetDogeCloudCDN:
|
case domain.DeployProviderTypeDogeCloudCDN:
|
||||||
{
|
{
|
||||||
access := &domain.DogeCloudAccess{}
|
access := &domain.AccessConfigForDogeCloud{}
|
||||||
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
}
|
}
|
||||||
@ -158,15 +159,15 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
}
|
}
|
||||||
|
|
||||||
case targetHuaweiCloudCDN, targetHuaweiCloudELB:
|
case domain.DeployProviderTypeHuaweiCloudCDN, domain.DeployProviderTypeHuaweiCloudELB:
|
||||||
{
|
{
|
||||||
access := &domain.HuaweiCloudAccess{}
|
access := &domain.AccessConfigForHuaweiCloud{}
|
||||||
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
switch target {
|
switch provider {
|
||||||
case targetHuaweiCloudCDN:
|
case domain.DeployProviderTypeHuaweiCloudCDN:
|
||||||
deployer, err := providerHuaweiCloudCDN.NewWithLogger(&providerHuaweiCloudCDN.HuaweiCloudCDNDeployerConfig{
|
deployer, err := providerHuaweiCloudCDN.NewWithLogger(&providerHuaweiCloudCDN.HuaweiCloudCDNDeployerConfig{
|
||||||
AccessKeyId: access.AccessKeyId,
|
AccessKeyId: access.AccessKeyId,
|
||||||
SecretAccessKey: access.SecretAccessKey,
|
SecretAccessKey: access.SecretAccessKey,
|
||||||
@ -175,7 +176,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
}, logger)
|
}, logger)
|
||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
|
|
||||||
case targetHuaweiCloudELB:
|
case domain.DeployProviderTypeHuaweiCloudELB:
|
||||||
deployer, err := providerHuaweiCloudELB.NewWithLogger(&providerHuaweiCloudELB.HuaweiCloudELBDeployerConfig{
|
deployer, err := providerHuaweiCloudELB.NewWithLogger(&providerHuaweiCloudELB.HuaweiCloudELBDeployerConfig{
|
||||||
AccessKeyId: access.AccessKeyId,
|
AccessKeyId: access.AccessKeyId,
|
||||||
SecretAccessKey: access.SecretAccessKey,
|
SecretAccessKey: access.SecretAccessKey,
|
||||||
@ -192,13 +193,13 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case targetLocal:
|
case domain.DeployProviderTypeLocal:
|
||||||
{
|
{
|
||||||
deployer, err := providerLocal.NewWithLogger(&providerLocal.LocalDeployerConfig{
|
deployer, err := providerLocal.NewWithLogger(&providerLocal.LocalDeployerConfig{
|
||||||
ShellEnv: providerLocal.ShellEnvType(maps.GetValueAsString(deployConfig, "shellEnv")),
|
ShellEnv: providerLocal.ShellEnvType(maps.GetValueAsString(deployConfig, "shellEnv")),
|
||||||
PreCommand: maps.GetValueAsString(deployConfig, "preCommand"),
|
PreCommand: maps.GetValueAsString(deployConfig, "preCommand"),
|
||||||
PostCommand: maps.GetValueAsString(deployConfig, "postCommand"),
|
PostCommand: maps.GetValueAsString(deployConfig, "postCommand"),
|
||||||
OutputFormat: providerLocal.OutputFormatType(maps.GetValueOrDefaultAsString(deployConfig, "format", "PEM")),
|
OutputFormat: providerLocal.OutputFormatType(maps.GetValueOrDefaultAsString(deployConfig, "format", string(providerLocal.OUTPUT_FORMAT_PEM))),
|
||||||
OutputCertPath: maps.GetValueAsString(deployConfig, "certPath"),
|
OutputCertPath: maps.GetValueAsString(deployConfig, "certPath"),
|
||||||
OutputKeyPath: maps.GetValueAsString(deployConfig, "keyPath"),
|
OutputKeyPath: maps.GetValueAsString(deployConfig, "keyPath"),
|
||||||
PfxPassword: maps.GetValueAsString(deployConfig, "pfxPassword"),
|
PfxPassword: maps.GetValueAsString(deployConfig, "pfxPassword"),
|
||||||
@ -209,9 +210,9 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
}
|
}
|
||||||
|
|
||||||
case targetK8sSecret:
|
case domain.DeployProviderTypeK8sSecret:
|
||||||
{
|
{
|
||||||
access := &domain.KubernetesAccess{}
|
access := &domain.AccessConfigForKubernetes{}
|
||||||
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
}
|
}
|
||||||
@ -220,15 +221,16 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
KubeConfig: access.KubeConfig,
|
KubeConfig: access.KubeConfig,
|
||||||
Namespace: maps.GetValueOrDefaultAsString(deployConfig, "namespace", "default"),
|
Namespace: maps.GetValueOrDefaultAsString(deployConfig, "namespace", "default"),
|
||||||
SecretName: maps.GetValueAsString(deployConfig, "secretName"),
|
SecretName: maps.GetValueAsString(deployConfig, "secretName"),
|
||||||
|
SecretType: maps.GetValueOrDefaultAsString(deployConfig, "secretType", "kubernetes.io/tls"),
|
||||||
SecretDataKeyForCrt: maps.GetValueOrDefaultAsString(deployConfig, "secretDataKeyForCrt", "tls.crt"),
|
SecretDataKeyForCrt: maps.GetValueOrDefaultAsString(deployConfig, "secretDataKeyForCrt", "tls.crt"),
|
||||||
SecretDataKeyForKey: maps.GetValueOrDefaultAsString(deployConfig, "secretDataKeyForKey", "tls.key"),
|
SecretDataKeyForKey: maps.GetValueOrDefaultAsString(deployConfig, "secretDataKeyForKey", "tls.key"),
|
||||||
}, logger)
|
}, logger)
|
||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
}
|
}
|
||||||
|
|
||||||
case targetQiniuCDN:
|
case domain.DeployProviderTypeQiniuCDN:
|
||||||
{
|
{
|
||||||
access := &domain.QiniuAccess{}
|
access := &domain.AccessConfigForQiniu{}
|
||||||
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
}
|
}
|
||||||
@ -241,9 +243,9 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
}
|
}
|
||||||
|
|
||||||
case targetSSH:
|
case domain.DeployProviderTypeSSH:
|
||||||
{
|
{
|
||||||
access := &domain.SSHAccess{}
|
access := &domain.AccessConfigForSSH{}
|
||||||
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
}
|
}
|
||||||
@ -258,7 +260,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
SshKeyPassphrase: access.KeyPassphrase,
|
SshKeyPassphrase: access.KeyPassphrase,
|
||||||
PreCommand: maps.GetValueAsString(deployConfig, "preCommand"),
|
PreCommand: maps.GetValueAsString(deployConfig, "preCommand"),
|
||||||
PostCommand: maps.GetValueAsString(deployConfig, "postCommand"),
|
PostCommand: maps.GetValueAsString(deployConfig, "postCommand"),
|
||||||
OutputFormat: providerSSH.OutputFormatType(maps.GetValueOrDefaultAsString(deployConfig, "format", "PEM")),
|
OutputFormat: providerSSH.OutputFormatType(maps.GetValueOrDefaultAsString(deployConfig, "format", string(providerSSH.OUTPUT_FORMAT_PEM))),
|
||||||
OutputCertPath: maps.GetValueAsString(deployConfig, "certPath"),
|
OutputCertPath: maps.GetValueAsString(deployConfig, "certPath"),
|
||||||
OutputKeyPath: maps.GetValueAsString(deployConfig, "keyPath"),
|
OutputKeyPath: maps.GetValueAsString(deployConfig, "keyPath"),
|
||||||
PfxPassword: maps.GetValueAsString(deployConfig, "pfxPassword"),
|
PfxPassword: maps.GetValueAsString(deployConfig, "pfxPassword"),
|
||||||
@ -269,15 +271,15 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
}
|
}
|
||||||
|
|
||||||
case targetTencentCloudCDN, targetTencentCloudCLB, targetTencentCloudCOS, targetTencentCloudECDN, targetTencentCloudEO:
|
case domain.DeployProviderTypeTencentCloudCDN, domain.DeployProviderTypeTencentCloudCLB, domain.DeployProviderTypeTencentCloudCOS, domain.DeployProviderTypeTencentCloudECDN, domain.DeployProviderTypeTencentCloudEO:
|
||||||
{
|
{
|
||||||
access := &domain.TencentAccess{}
|
access := &domain.AccessConfigForTencentCloud{}
|
||||||
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
switch target {
|
switch provider {
|
||||||
case targetTencentCloudCDN:
|
case domain.DeployProviderTypeTencentCloudCDN:
|
||||||
deployer, err := providerTencentCloudCDN.NewWithLogger(&providerTencentCloudCDN.TencentCloudCDNDeployerConfig{
|
deployer, err := providerTencentCloudCDN.NewWithLogger(&providerTencentCloudCDN.TencentCloudCDNDeployerConfig{
|
||||||
SecretId: access.SecretId,
|
SecretId: access.SecretId,
|
||||||
SecretKey: access.SecretKey,
|
SecretKey: access.SecretKey,
|
||||||
@ -285,7 +287,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
}, logger)
|
}, logger)
|
||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
|
|
||||||
case targetTencentCloudCLB:
|
case domain.DeployProviderTypeTencentCloudCLB:
|
||||||
deployer, err := providerTencentCloudCLB.NewWithLogger(&providerTencentCloudCLB.TencentCloudCLBDeployerConfig{
|
deployer, err := providerTencentCloudCLB.NewWithLogger(&providerTencentCloudCLB.TencentCloudCLBDeployerConfig{
|
||||||
SecretId: access.SecretId,
|
SecretId: access.SecretId,
|
||||||
SecretKey: access.SecretKey,
|
SecretKey: access.SecretKey,
|
||||||
@ -297,7 +299,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
}, logger)
|
}, logger)
|
||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
|
|
||||||
case targetTencentCloudCOS:
|
case domain.DeployProviderTypeTencentCloudCOS:
|
||||||
deployer, err := providerTencentCloudCOD.NewWithLogger(&providerTencentCloudCOD.TencentCloudCOSDeployerConfig{
|
deployer, err := providerTencentCloudCOD.NewWithLogger(&providerTencentCloudCOD.TencentCloudCOSDeployerConfig{
|
||||||
SecretId: access.SecretId,
|
SecretId: access.SecretId,
|
||||||
SecretKey: access.SecretKey,
|
SecretKey: access.SecretKey,
|
||||||
@ -307,7 +309,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
}, logger)
|
}, logger)
|
||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
|
|
||||||
case targetTencentCloudECDN:
|
case domain.DeployProviderTypeTencentCloudECDN:
|
||||||
deployer, err := providerTencentCloudECDN.NewWithLogger(&providerTencentCloudECDN.TencentCloudECDNDeployerConfig{
|
deployer, err := providerTencentCloudECDN.NewWithLogger(&providerTencentCloudECDN.TencentCloudECDNDeployerConfig{
|
||||||
SecretId: access.SecretId,
|
SecretId: access.SecretId,
|
||||||
SecretKey: access.SecretKey,
|
SecretKey: access.SecretKey,
|
||||||
@ -315,7 +317,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
}, logger)
|
}, logger)
|
||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
|
|
||||||
case targetTencentCloudEO:
|
case domain.DeployProviderTypeTencentCloudEO:
|
||||||
deployer, err := providerTencentCloudEO.NewWithLogger(&providerTencentCloudEO.TencentCloudEODeployerConfig{
|
deployer, err := providerTencentCloudEO.NewWithLogger(&providerTencentCloudEO.TencentCloudEODeployerConfig{
|
||||||
SecretId: access.SecretId,
|
SecretId: access.SecretId,
|
||||||
SecretKey: access.SecretKey,
|
SecretKey: access.SecretKey,
|
||||||
@ -329,26 +331,26 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case targetVolcEngineCDN, targetVolcEngineLive:
|
case domain.DeployProviderTypeVolcEngineCDN, domain.DeployProviderTypeVolcEngineLive:
|
||||||
{
|
{
|
||||||
access := &domain.VolcEngineAccess{}
|
access := &domain.AccessConfigForVolcEngine{}
|
||||||
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
switch target {
|
switch provider {
|
||||||
case targetVolcEngineCDN:
|
case domain.DeployProviderTypeVolcEngineCDN:
|
||||||
deployer, err := providerVolcEngineCDN.NewWithLogger(&providerVolcEngineCDN.VolcEngineCDNDeployerConfig{
|
deployer, err := providerVolcEngineCDN.NewWithLogger(&providerVolcEngineCDN.VolcEngineCDNDeployerConfig{
|
||||||
AccessKey: access.AccessKey,
|
AccessKey: access.AccessKeyId,
|
||||||
SecretKey: access.SecretKey,
|
SecretKey: access.SecretAccessKey,
|
||||||
Domain: maps.GetValueAsString(deployConfig, "domain"),
|
Domain: maps.GetValueAsString(deployConfig, "domain"),
|
||||||
}, logger)
|
}, logger)
|
||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
|
|
||||||
case targetVolcEngineLive:
|
case domain.DeployProviderTypeVolcEngineLive:
|
||||||
deployer, err := providerVolcEngineLive.NewWithLogger(&providerVolcEngineLive.VolcEngineLiveDeployerConfig{
|
deployer, err := providerVolcEngineLive.NewWithLogger(&providerVolcEngineLive.VolcEngineLiveDeployerConfig{
|
||||||
AccessKey: access.AccessKey,
|
AccessKey: access.AccessKeyId,
|
||||||
SecretKey: access.SecretKey,
|
SecretKey: access.SecretAccessKey,
|
||||||
Domain: maps.GetValueAsString(deployConfig, "domain"),
|
Domain: maps.GetValueAsString(deployConfig, "domain"),
|
||||||
}, logger)
|
}, logger)
|
||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
@ -358,34 +360,20 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case targetWebhook:
|
case domain.DeployProviderTypeWebhook:
|
||||||
{
|
{
|
||||||
access := &domain.WebhookAccess{}
|
access := &domain.AccessConfigForWebhook{}
|
||||||
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
|
||||||
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
variables := make(map[string]string)
|
|
||||||
if deployConfig != nil {
|
|
||||||
value, ok := deployConfig["variables"]
|
|
||||||
if ok {
|
|
||||||
kvs := make([]domain.KV, 0)
|
|
||||||
bts, _ := json.Marshal(value)
|
|
||||||
if err := json.Unmarshal(bts, &kvs); err == nil {
|
|
||||||
for _, kv := range kvs {
|
|
||||||
variables[kv.Key] = kv.Value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
deployer, err := providerWebhook.NewWithLogger(&providerWebhook.WebhookDeployerConfig{
|
deployer, err := providerWebhook.NewWithLogger(&providerWebhook.WebhookDeployerConfig{
|
||||||
Url: access.Url,
|
WebhookUrl: access.Url,
|
||||||
Variables: variables,
|
WebhookData: maps.GetValueAsString(deployConfig, "webhookData"),
|
||||||
}, logger)
|
}, logger)
|
||||||
return deployer, logger, err
|
return deployer, logger, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, nil, fmt.Errorf("unsupported deployer target: %s", target)
|
return nil, nil, fmt.Errorf("unsupported deployer provider: %s", provider)
|
||||||
}
|
}
|
@ -4,109 +4,88 @@ import "time"
|
|||||||
|
|
||||||
type Access struct {
|
type Access struct {
|
||||||
Meta
|
Meta
|
||||||
Name string `json:"name"`
|
Name string `json:"name" db:"name"`
|
||||||
Config string `json:"config"`
|
Provider string `json:"provider" db:"provider"`
|
||||||
ConfigType string `json:"configType"`
|
Config string `json:"config" db:"config"`
|
||||||
Deleted time.Time `json:"deleted"`
|
Usage string `json:"usage" db:"usage"`
|
||||||
Usage string `json:"usage"`
|
DeletedAt time.Time `json:"deleted" db:"deleted"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 兼容一下原 pocketbase 的 record
|
type AccessConfigForACMEHttpReq struct {
|
||||||
func (a *Access) GetString(key string) string {
|
|
||||||
switch key {
|
|
||||||
case "name":
|
|
||||||
return a.Name
|
|
||||||
default:
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type AliyunAccess struct {
|
|
||||||
AccessKeyId string `json:"accessKeyId"`
|
|
||||||
AccessKeySecret string `json:"accessKeySecret"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ByteplusAccess struct {
|
|
||||||
AccessKey string `json:"accessKey"`
|
|
||||||
SecretKey string `json:"secretKey"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type TencentAccess struct {
|
|
||||||
SecretId string `json:"secretId"`
|
|
||||||
SecretKey string `json:"secretKey"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type HuaweiCloudAccess struct {
|
|
||||||
AccessKeyId string `json:"accessKeyId"`
|
|
||||||
SecretAccessKey string `json:"secretAccessKey"`
|
|
||||||
Region string `json:"region"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type BaiduCloudAccess struct {
|
|
||||||
AccessKeyId string `json:"accessKeyId"`
|
|
||||||
SecretAccessKey string `json:"secretAccessKey"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type AwsAccess struct {
|
|
||||||
AccessKeyId string `json:"accessKeyId"`
|
|
||||||
SecretAccessKey string `json:"secretAccessKey"`
|
|
||||||
Region string `json:"region"`
|
|
||||||
HostedZoneId string `json:"hostedZoneId"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type CloudflareAccess struct {
|
|
||||||
DnsApiToken string `json:"dnsApiToken"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type QiniuAccess struct {
|
|
||||||
AccessKey string `json:"accessKey"`
|
|
||||||
SecretKey string `json:"secretKey"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type DogeCloudAccess struct {
|
|
||||||
AccessKey string `json:"accessKey"`
|
|
||||||
SecretKey string `json:"secretKey"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type NameSiloAccess struct {
|
|
||||||
ApiKey string `json:"apiKey"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type GodaddyAccess struct {
|
|
||||||
ApiKey string `json:"apiKey"`
|
|
||||||
ApiSecret string `json:"apiSecret"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type NameDotComAccess struct {
|
|
||||||
Username string `json:"username"`
|
|
||||||
ApiToken string `json:"apiToken"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type PdnsAccess struct {
|
|
||||||
ApiUrl string `json:"apiUrl"`
|
|
||||||
ApiKey string `json:"apiKey"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type VolcEngineAccess struct {
|
|
||||||
AccessKey string `json:"accessKey"`
|
|
||||||
SecretKey string `json:"secretKey"`
|
|
||||||
|
|
||||||
// Deprecated: Use [AccessKey] and [SecretKey] instead in the future
|
|
||||||
AccessKeyId string `json:"accessKeyId"`
|
|
||||||
// Deprecated: Use [AccessKey] and [SecretKey] instead in the future
|
|
||||||
SecretAccessKey string `json:"secretAccessKey"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type HttpreqAccess struct {
|
|
||||||
Endpoint string `json:"endpoint"`
|
Endpoint string `json:"endpoint"`
|
||||||
Mode string `json:"mode"`
|
Mode string `json:"mode"`
|
||||||
Username string `json:"username"`
|
Username string `json:"username"`
|
||||||
Password string `json:"password"`
|
Password string `json:"password"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type LocalAccess struct{}
|
type AccessConfigForAliyun struct {
|
||||||
|
AccessKeyId string `json:"accessKeyId"`
|
||||||
|
AccessKeySecret string `json:"accessKeySecret"`
|
||||||
|
}
|
||||||
|
|
||||||
type SSHAccess struct {
|
type AccessConfigForAWS struct {
|
||||||
|
AccessKeyId string `json:"accessKeyId"`
|
||||||
|
SecretAccessKey string `json:"secretAccessKey"`
|
||||||
|
Region string `json:"region"`
|
||||||
|
HostedZoneId string `json:"hostedZoneId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AccessConfigForBaiduCloud struct {
|
||||||
|
AccessKeyId string `json:"accessKeyId"`
|
||||||
|
SecretAccessKey string `json:"secretAccessKey"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AccessConfigForBytePlus struct {
|
||||||
|
AccessKey string `json:"accessKey"`
|
||||||
|
SecretKey string `json:"secretKey"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AccessConfigForCloudflare struct {
|
||||||
|
DnsApiToken string `json:"dnsApiToken"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AccessConfigForDogeCloud struct {
|
||||||
|
AccessKey string `json:"accessKey"`
|
||||||
|
SecretKey string `json:"secretKey"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AccessConfigForGoDaddy struct {
|
||||||
|
ApiKey string `json:"apiKey"`
|
||||||
|
ApiSecret string `json:"apiSecret"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AccessConfigForHuaweiCloud struct {
|
||||||
|
AccessKeyId string `json:"accessKeyId"`
|
||||||
|
SecretAccessKey string `json:"secretAccessKey"`
|
||||||
|
Region string `json:"region"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AccessConfigForLocal struct{}
|
||||||
|
|
||||||
|
type AccessConfigForKubernetes struct {
|
||||||
|
KubeConfig string `json:"kubeConfig"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AccessConfigForNameDotCom struct {
|
||||||
|
Username string `json:"username"`
|
||||||
|
ApiToken string `json:"apiToken"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AccessConfigForNameSilo struct {
|
||||||
|
ApiKey string `json:"apiKey"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AccessConfigForPowerDNS struct {
|
||||||
|
ApiUrl string `json:"apiUrl"`
|
||||||
|
ApiKey string `json:"apiKey"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AccessConfigForQiniu struct {
|
||||||
|
AccessKey string `json:"accessKey"`
|
||||||
|
SecretKey string `json:"secretKey"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AccessConfigForSSH struct {
|
||||||
Host string `json:"host"`
|
Host string `json:"host"`
|
||||||
Port string `json:"port"`
|
Port string `json:"port"`
|
||||||
Username string `json:"username"`
|
Username string `json:"username"`
|
||||||
@ -115,10 +94,16 @@ type SSHAccess struct {
|
|||||||
KeyPassphrase string `json:"keyPassphrase"`
|
KeyPassphrase string `json:"keyPassphrase"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type WebhookAccess struct {
|
type AccessConfigForTencentCloud struct {
|
||||||
Url string `json:"url"`
|
SecretId string `json:"secretId"`
|
||||||
|
SecretKey string `json:"secretKey"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type KubernetesAccess struct {
|
type AccessConfigForVolcEngine struct {
|
||||||
KubeConfig string `json:"kubeConfig"`
|
AccessKeyId string `json:"accessKeyId"`
|
||||||
|
SecretAccessKey string `json:"secretAccessKey"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AccessConfigForWebhook struct {
|
||||||
|
Url string `json:"url"`
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,13 @@
|
|||||||
package domain
|
package domain
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/registration"
|
"github.com/go-acme/lego/v4/registration"
|
||||||
)
|
)
|
||||||
|
|
||||||
type AcmeAccount struct {
|
type AcmeAccount struct {
|
||||||
Id string
|
Meta
|
||||||
Ca string
|
CA string `json:"ca" db:"ca"`
|
||||||
Email string
|
Email string `json:"email" db:"email"`
|
||||||
Resource *registration.Resource
|
Resource *registration.Resource `json:"resource" db:"resource"`
|
||||||
Key string
|
Key string `json:"key" db:"key"`
|
||||||
Created time.Time
|
|
||||||
Updated time.Time
|
|
||||||
}
|
}
|
||||||
|
@ -2,42 +2,25 @@ package domain
|
|||||||
|
|
||||||
import "time"
|
import "time"
|
||||||
|
|
||||||
var ValidityDuration = time.Hour * 24 * 10
|
type CertificateSourceType string
|
||||||
|
|
||||||
|
const (
|
||||||
|
CertificateSourceTypeWorkflow = CertificateSourceType("workflow")
|
||||||
|
CertificateSourceTypeUpload = CertificateSourceType("upload")
|
||||||
|
)
|
||||||
|
|
||||||
type Certificate struct {
|
type Certificate struct {
|
||||||
Meta
|
Meta
|
||||||
SAN string `json:"san" db:"san"`
|
Source CertificateSourceType `json:"source" db:"source"`
|
||||||
|
SubjectAltNames string `json:"subjectAltNames" db:"subjectAltNames"`
|
||||||
Certificate string `json:"certificate" db:"certificate"`
|
Certificate string `json:"certificate" db:"certificate"`
|
||||||
PrivateKey string `json:"privateKey" db:"privateKey"`
|
PrivateKey string `json:"privateKey" db:"privateKey"`
|
||||||
IssuerCertificate string `json:"issuerCertificate" db:"issuerCertificate"`
|
IssuerCertificate string `json:"issuerCertificate" db:"issuerCertificate"`
|
||||||
CertUrl string `json:"certUrl" db:"certUrl"`
|
EffectAt time.Time `json:"effectAt" db:"effectAt"`
|
||||||
CertStableUrl string `json:"certStableUrl" db:"certStableUrl"`
|
ExpireAt time.Time `json:"expireAt" db:"expireAt"`
|
||||||
Output string `json:"output" db:"output"`
|
ACMECertUrl string `json:"acmeCertUrl" db:"acmeCertUrl"`
|
||||||
Workflow string `json:"workflow" db:"workflow"`
|
ACMECertStableUrl string `json:"acmeCertStableUrl" db:"acmeCertStableUrl"`
|
||||||
ExpireAt time.Time `json:"ExpireAt" db:"expireAt"`
|
WorkflowId string `json:"workflowId" db:"workflowId"`
|
||||||
NodeId string `json:"nodeId" db:"nodeId"`
|
WorkflowNodeId string `json:"workflowNodeId" db:"workflowNodeId"`
|
||||||
}
|
WorkflowOutputId string `json:"workflowOutputId" db:"workflowOutputId"`
|
||||||
|
|
||||||
type MetaData struct {
|
|
||||||
Version string `json:"version"`
|
|
||||||
SerialNumber string `json:"serialNumber"`
|
|
||||||
Validity CertificateValidity `json:"validity"`
|
|
||||||
SignatureAlgorithm string `json:"signatureAlgorithm"`
|
|
||||||
Issuer CertificateIssuer `json:"issuer"`
|
|
||||||
Subject CertificateSubject `json:"subject"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type CertificateIssuer struct {
|
|
||||||
Country string `json:"country"`
|
|
||||||
Organization string `json:"organization"`
|
|
||||||
CommonName string `json:"commonName"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type CertificateSubject struct {
|
|
||||||
CN string `json:"CN"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type CertificateValidity struct {
|
|
||||||
NotBefore string `json:"notBefore"`
|
|
||||||
NotAfter string `json:"notAfter"`
|
|
||||||
}
|
}
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
package domain
|
|
||||||
|
|
||||||
import "time"
|
|
||||||
|
|
||||||
type Meta struct {
|
|
||||||
Id string `json:"id" db:"id"`
|
|
||||||
Created time.Time `json:"created" db:"created"`
|
|
||||||
Updated time.Time `json:"updated" db:"updated"`
|
|
||||||
}
|
|
@ -1,144 +0,0 @@
|
|||||||
package domain
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/utils/maps"
|
|
||||||
)
|
|
||||||
|
|
||||||
type ApplyConfig struct {
|
|
||||||
Email string `json:"email"`
|
|
||||||
Access string `json:"access"`
|
|
||||||
KeyAlgorithm string `json:"keyAlgorithm"`
|
|
||||||
Nameservers string `json:"nameservers"`
|
|
||||||
Timeout int64 `json:"timeout"`
|
|
||||||
DisableFollowCNAME bool `json:"disableFollowCNAME"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type DeployConfig struct {
|
|
||||||
Id string `json:"id"`
|
|
||||||
Access string `json:"access"`
|
|
||||||
Type string `json:"type"`
|
|
||||||
Config map[string]any `json:"config"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: 以字符串形式获取配置项。
|
|
||||||
//
|
|
||||||
// 入参:
|
|
||||||
// - key: 配置项的键。
|
|
||||||
//
|
|
||||||
// 出参:
|
|
||||||
// - 配置项的值。如果配置项不存在或者类型不是字符串,则返回空字符串。
|
|
||||||
func (dc *DeployConfig) GetConfigAsString(key string) string {
|
|
||||||
return maps.GetValueAsString(dc.Config, key)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: 以字符串形式获取配置项。
|
|
||||||
//
|
|
||||||
// 入参:
|
|
||||||
// - key: 配置项的键。
|
|
||||||
// - defaultValue: 默认值。
|
|
||||||
//
|
|
||||||
// 出参:
|
|
||||||
// - 配置项的值。如果配置项不存在、类型不是字符串或者值为零值,则返回默认值。
|
|
||||||
func (dc *DeployConfig) GetConfigOrDefaultAsString(key string, defaultValue string) string {
|
|
||||||
return maps.GetValueOrDefaultAsString(dc.Config, key, defaultValue)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: 以 32 位整数形式获取配置项。
|
|
||||||
//
|
|
||||||
// 入参:
|
|
||||||
// - key: 配置项的键。
|
|
||||||
//
|
|
||||||
// 出参:
|
|
||||||
// - 配置项的值。如果配置项不存在或者类型不是 32 位整数,则返回 0。
|
|
||||||
func (dc *DeployConfig) GetConfigAsInt32(key string) int32 {
|
|
||||||
return maps.GetValueAsInt32(dc.Config, key)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: 以 32 位整数形式获取配置项。
|
|
||||||
//
|
|
||||||
// 入参:
|
|
||||||
// - key: 配置项的键。
|
|
||||||
// - defaultValue: 默认值。
|
|
||||||
//
|
|
||||||
// 出参:
|
|
||||||
// - 配置项的值。如果配置项不存在、类型不是 32 位整数或者值为零值,则返回默认值。
|
|
||||||
func (dc *DeployConfig) GetConfigOrDefaultAsInt32(key string, defaultValue int32) int32 {
|
|
||||||
return maps.GetValueOrDefaultAsInt32(dc.Config, key, defaultValue)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: 以布尔形式获取配置项。
|
|
||||||
//
|
|
||||||
// 入参:
|
|
||||||
// - key: 配置项的键。
|
|
||||||
//
|
|
||||||
// 出参:
|
|
||||||
// - 配置项的值。如果配置项不存在或者类型不是布尔,则返回 false。
|
|
||||||
func (dc *DeployConfig) GetConfigAsBool(key string) bool {
|
|
||||||
return maps.GetValueAsBool(dc.Config, key)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: 以布尔形式获取配置项。
|
|
||||||
//
|
|
||||||
// 入参:
|
|
||||||
// - key: 配置项的键。
|
|
||||||
// - defaultValue: 默认值。
|
|
||||||
//
|
|
||||||
// 出参:
|
|
||||||
// - 配置项的值。如果配置项不存在或者类型不是布尔,则返回默认值。
|
|
||||||
func (dc *DeployConfig) GetConfigOrDefaultAsBool(key string, defaultValue bool) bool {
|
|
||||||
return maps.GetValueOrDefaultAsBool(dc.Config, key, defaultValue)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: 以变量字典形式获取配置项。
|
|
||||||
//
|
|
||||||
// 出参:
|
|
||||||
// - 变量字典。
|
|
||||||
func (dc *DeployConfig) GetConfigAsVariables() map[string]string {
|
|
||||||
rs := make(map[string]string)
|
|
||||||
|
|
||||||
if dc.Config != nil {
|
|
||||||
value, ok := dc.Config["variables"]
|
|
||||||
if !ok {
|
|
||||||
return rs
|
|
||||||
}
|
|
||||||
|
|
||||||
kvs := make([]KV, 0)
|
|
||||||
bts, _ := json.Marshal(value)
|
|
||||||
if err := json.Unmarshal(bts, &kvs); err != nil {
|
|
||||||
return rs
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, kv := range kvs {
|
|
||||||
rs[kv.Key] = kv.Value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return rs
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: GetDomain returns the domain from the deploy config,
|
|
||||||
// if the domain is a wildcard domain, and wildcard is true, return the wildcard domain
|
|
||||||
func (dc *DeployConfig) GetDomain(wildcard ...bool) string {
|
|
||||||
val := dc.GetConfigAsString("domain")
|
|
||||||
if val == "" {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
if !strings.HasPrefix(val, "*") {
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(wildcard) > 0 && wildcard[0] {
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
|
|
||||||
return strings.TrimPrefix(val, "*")
|
|
||||||
}
|
|
||||||
|
|
||||||
type KV struct {
|
|
||||||
Key string `json:"key"`
|
|
||||||
Value string `json:"value"`
|
|
||||||
}
|
|
9
internal/domain/meta.go
Normal file
9
internal/domain/meta.go
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
package domain
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
type Meta struct {
|
||||||
|
Id string `json:"id" db:"id"`
|
||||||
|
CreatedAt time.Time `json:"created" db:"created"`
|
||||||
|
UpdatedAt time.Time `json:"updated" db:"updated"`
|
||||||
|
}
|
@ -1,5 +1,7 @@
|
|||||||
package domain
|
package domain
|
||||||
|
|
||||||
|
type NotifyChannelType string
|
||||||
|
|
||||||
/*
|
/*
|
||||||
消息通知渠道常量值。
|
消息通知渠道常量值。
|
||||||
|
|
||||||
@ -7,14 +9,14 @@ package domain
|
|||||||
NOTICE: If you add new constant, please keep ASCII order.
|
NOTICE: If you add new constant, please keep ASCII order.
|
||||||
*/
|
*/
|
||||||
const (
|
const (
|
||||||
NotifyChannelBark = "bark"
|
NotifyChannelTypeBark = NotifyChannelType("bark")
|
||||||
NotifyChannelDingtalk = "dingtalk"
|
NotifyChannelTypeDingTalk = NotifyChannelType("dingtalk")
|
||||||
NotifyChannelEmail = "email"
|
NotifyChannelTypeEmail = NotifyChannelType("email")
|
||||||
NotifyChannelLark = "lark"
|
NotifyChannelTypeLark = NotifyChannelType("lark")
|
||||||
NotifyChannelServerChan = "serverchan"
|
NotifyChannelTypeServerChan = NotifyChannelType("serverchan")
|
||||||
NotifyChannelTelegram = "telegram"
|
NotifyChannelTypeTelegram = NotifyChannelType("telegram")
|
||||||
NotifyChannelWebhook = "webhook"
|
NotifyChannelTypeWebhook = NotifyChannelType("webhook")
|
||||||
NotifyChannelWeCom = "wecom"
|
NotifyChannelTypeWeCom = NotifyChannelType("wecom")
|
||||||
)
|
)
|
||||||
|
|
||||||
type NotifyTestPushReq struct {
|
type NotifyTestPushReq struct {
|
||||||
|
66
internal/domain/provider.go
Normal file
66
internal/domain/provider.go
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
package domain
|
||||||
|
|
||||||
|
type AccessProviderType string
|
||||||
|
|
||||||
|
/*
|
||||||
|
提供商类型常量值。
|
||||||
|
|
||||||
|
注意:如果追加新的常量值,请保持以 ASCII 排序。
|
||||||
|
NOTICE: If you add new constant, please keep ASCII order.
|
||||||
|
*/
|
||||||
|
const (
|
||||||
|
AccessProviderTypeACMEHttpReq = AccessProviderType("acmehttpreq")
|
||||||
|
AccessProviderTypeAliyun = AccessProviderType("aliyun")
|
||||||
|
AccessProviderTypeAWS = AccessProviderType("aws")
|
||||||
|
AccessProviderTypeBaiduCloud = AccessProviderType("baiducloud")
|
||||||
|
AccessProviderTypeBytePlus = AccessProviderType("byteplus")
|
||||||
|
AccessProviderTypeCloudflare = AccessProviderType("cloudflare")
|
||||||
|
AccessProviderTypeDogeCloud = AccessProviderType("dogecloud")
|
||||||
|
AccessProviderTypeGoDaddy = AccessProviderType("godaddy")
|
||||||
|
AccessProviderTypeHuaweiCloud = AccessProviderType("huaweicloud")
|
||||||
|
AccessProviderTypeKubernetes = AccessProviderType("k8s")
|
||||||
|
AccessProviderTypeLocal = AccessProviderType("local")
|
||||||
|
AccessProviderTypeNameDotCom = AccessProviderType("namedotcom")
|
||||||
|
AccessProviderTypeNameSilo = AccessProviderType("namesilo")
|
||||||
|
AccessProviderTypePowerDNS = AccessProviderType("powerdns")
|
||||||
|
AccessProviderTypeQiniu = AccessProviderType("qiniu")
|
||||||
|
AccessProviderTypeSSH = AccessProviderType("ssh")
|
||||||
|
AccessProviderTypeTencentCloud = AccessProviderType("tencentcloud")
|
||||||
|
AccessProviderTypeVolcEngine = AccessProviderType("volcengine")
|
||||||
|
AccessProviderTypeWebhook = AccessProviderType("webhook")
|
||||||
|
)
|
||||||
|
|
||||||
|
type DeployProviderType string
|
||||||
|
|
||||||
|
/*
|
||||||
|
提供商部署目标常量值。
|
||||||
|
短横线前的部分始终等于提供商类型。
|
||||||
|
|
||||||
|
注意:如果追加新的常量值,请保持以 ASCII 排序。
|
||||||
|
NOTICE: If you add new constant, please keep ASCII order.
|
||||||
|
*/
|
||||||
|
const (
|
||||||
|
DeployProviderTypeAliyunALB = DeployProviderType("aliyun-alb")
|
||||||
|
DeployProviderTypeAliyunCDN = DeployProviderType("aliyun-cdn")
|
||||||
|
DeployProviderTypeAliyunCLB = DeployProviderType("aliyun-clb")
|
||||||
|
DeployProviderTypeAliyunDCDN = DeployProviderType("aliyun-dcdn")
|
||||||
|
DeployProviderTypeAliyunNLB = DeployProviderType("aliyun-nlb")
|
||||||
|
DeployProviderTypeAliyunOSS = DeployProviderType("aliyun-oss")
|
||||||
|
DeployProviderTypeBaiduCloudCDN = DeployProviderType("baiducloud-cdn")
|
||||||
|
DeployProviderTypeBytePlusCDN = DeployProviderType("byteplus-cdn")
|
||||||
|
DeployProviderTypeDogeCloudCDN = DeployProviderType("dogecloud-cdn")
|
||||||
|
DeployProviderTypeHuaweiCloudCDN = DeployProviderType("huaweicloud-cdn")
|
||||||
|
DeployProviderTypeHuaweiCloudELB = DeployProviderType("huaweicloud-elb")
|
||||||
|
DeployProviderTypeK8sSecret = DeployProviderType("k8s-secret")
|
||||||
|
DeployProviderTypeLocal = DeployProviderType("local")
|
||||||
|
DeployProviderTypeQiniuCDN = DeployProviderType("qiniu-cdn")
|
||||||
|
DeployProviderTypeSSH = DeployProviderType("ssh")
|
||||||
|
DeployProviderTypeTencentCloudCDN = DeployProviderType("tencentcloud-cdn")
|
||||||
|
DeployProviderTypeTencentCloudCLB = DeployProviderType("tencentcloud-clb")
|
||||||
|
DeployProviderTypeTencentCloudCOS = DeployProviderType("tencentcloud-cos")
|
||||||
|
DeployProviderTypeTencentCloudECDN = DeployProviderType("tencentcloud-ecdn")
|
||||||
|
DeployProviderTypeTencentCloudEO = DeployProviderType("tencentcloud-eo")
|
||||||
|
DeployProviderTypeVolcEngineCDN = DeployProviderType("volcengine-cdn")
|
||||||
|
DeployProviderTypeVolcEngineLive = DeployProviderType("volcengine-live")
|
||||||
|
DeployProviderTypeWebhook = DeployProviderType("webhook")
|
||||||
|
)
|
@ -1,45 +0,0 @@
|
|||||||
package domain
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Setting struct {
|
|
||||||
ID string `json:"id"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
Content string `json:"content"`
|
|
||||||
Created time.Time `json:"created"`
|
|
||||||
Updated time.Time `json:"updated"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ChannelsConfig map[string]map[string]any
|
|
||||||
|
|
||||||
func (s *Setting) GetChannelContent(channel string) (map[string]any, error) {
|
|
||||||
conf := &ChannelsConfig{}
|
|
||||||
if err := json.Unmarshal([]byte(s.Content), conf); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
v, ok := (*conf)[channel]
|
|
||||||
if !ok {
|
|
||||||
return nil, fmt.Errorf("channel \"%s\" not found", channel)
|
|
||||||
}
|
|
||||||
|
|
||||||
return v, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type NotifyTemplates struct {
|
|
||||||
NotifyTemplates []NotifyTemplate `json:"notifyTemplates"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type NotifyTemplate struct {
|
|
||||||
Title string `json:"title"`
|
|
||||||
Content string `json:"content"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type NotifyMessage struct {
|
|
||||||
Subject string
|
|
||||||
Message string
|
|
||||||
}
|
|
37
internal/domain/settings.go
Normal file
37
internal/domain/settings.go
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
package domain
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Settings struct {
|
||||||
|
Meta
|
||||||
|
Name string `json:"name" db:"name"`
|
||||||
|
Content string `json:"content" db:"content"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type NotifyTemplatesSettingsContent struct {
|
||||||
|
NotifyTemplates []NotifyTemplate `json:"notifyTemplates"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type NotifyTemplate struct {
|
||||||
|
Subject string `json:"subject"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type NotifyChannelsSettingsContent map[string]map[string]any
|
||||||
|
|
||||||
|
func (s *Settings) GetNotifyChannelConfig(channel string) (map[string]any, error) {
|
||||||
|
conf := &NotifyChannelsSettingsContent{}
|
||||||
|
if err := json.Unmarshal([]byte(s.Content), conf); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
v, ok := (*conf)[channel]
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("channel \"%s\" not found", channel)
|
||||||
|
}
|
||||||
|
|
||||||
|
return v, nil
|
||||||
|
}
|
@ -1,95 +1,101 @@
|
|||||||
package domain
|
package domain
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"time"
|
||||||
"strconv"
|
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/utils/maps"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
type WorkflowNodeType string
|
||||||
WorkflowNodeTypeStart = "start"
|
|
||||||
WorkflowNodeTypeEnd = "end"
|
|
||||||
WorkflowNodeTypeApply = "apply"
|
|
||||||
WorkflowNodeTypeDeploy = "deploy"
|
|
||||||
WorkflowNodeTypeNotify = "notify"
|
|
||||||
WorkflowNodeTypeBranch = "branch"
|
|
||||||
WorkflowNodeTypeCondition = "condition"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
WorkflowTypeAuto = "auto"
|
WorkflowNodeTypeStart = WorkflowNodeType("start")
|
||||||
WorkflowTypeManual = "manual"
|
WorkflowNodeTypeEnd = WorkflowNodeType("end")
|
||||||
|
WorkflowNodeTypeApply = WorkflowNodeType("apply")
|
||||||
|
WorkflowNodeTypeDeploy = WorkflowNodeType("deploy")
|
||||||
|
WorkflowNodeTypeNotify = WorkflowNodeType("notify")
|
||||||
|
WorkflowNodeTypeBranch = WorkflowNodeType("branch")
|
||||||
|
WorkflowNodeTypeCondition = WorkflowNodeType("condition")
|
||||||
|
)
|
||||||
|
|
||||||
|
type WorkflowTriggerType string
|
||||||
|
|
||||||
|
const (
|
||||||
|
WorkflowTriggerTypeAuto = WorkflowTriggerType("auto")
|
||||||
|
WorkflowTriggerTypeManual = WorkflowTriggerType("manual")
|
||||||
)
|
)
|
||||||
|
|
||||||
type Workflow struct {
|
type Workflow struct {
|
||||||
Meta
|
Meta
|
||||||
Name string `json:"name"`
|
Name string `json:"name" db:"name"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description" db:"description"`
|
||||||
Type string `json:"type"`
|
Trigger WorkflowTriggerType `json:"trigger" db:"trigger"`
|
||||||
Crontab string `json:"crontab"`
|
TriggerCron string `json:"triggerCron" db:"triggerCron"`
|
||||||
Content *WorkflowNode `json:"content"`
|
Enabled bool `json:"enabled" db:"enabled"`
|
||||||
Draft *WorkflowNode `json:"draft"`
|
Content *WorkflowNode `json:"content" db:"content"`
|
||||||
Enabled bool `json:"enabled"`
|
Draft *WorkflowNode `json:"draft" db:"draft"`
|
||||||
HasDraft bool `json:"hasDraft"`
|
HasDraft bool `json:"hasDraft" db:"hasDraft"`
|
||||||
|
LastRunId string `json:"lastRunId" db:"lastRunId"`
|
||||||
|
LastRunStatus WorkflowRunStatusType `json:"lastRunStatus" db:"lastRunStatus"`
|
||||||
|
LastRunTime time.Time `json:"lastRunTime" db:"lastRunTime"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type WorkflowNode struct {
|
type WorkflowNode struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
|
Type WorkflowNodeType `json:"type"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Next *WorkflowNode `json:"next"`
|
|
||||||
Config map[string]any `json:"config"`
|
Config map[string]any `json:"config"`
|
||||||
Input []WorkflowNodeIo `json:"input"`
|
Inputs []WorkflowNodeIO `json:"inputs"`
|
||||||
Output []WorkflowNodeIo `json:"output"`
|
Outputs []WorkflowNodeIO `json:"outputs"`
|
||||||
|
|
||||||
|
Next *WorkflowNode `json:"next"`
|
||||||
|
Branches []WorkflowNode `json:"branches"`
|
||||||
|
|
||||||
Validated bool `json:"validated"`
|
Validated bool `json:"validated"`
|
||||||
Type string `json:"type"`
|
|
||||||
|
|
||||||
Branches []WorkflowNode `json:"branches"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *WorkflowNode) GetConfigString(key string) string {
|
func (n *WorkflowNode) GetConfigString(key string) string {
|
||||||
if v, ok := n.Config[key]; ok {
|
return maps.GetValueAsString(n.Config, key)
|
||||||
if s, ok := v.(string); ok {
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *WorkflowNode) GetConfigBool(key string) bool {
|
func (n *WorkflowNode) GetConfigBool(key string) bool {
|
||||||
if v, ok := n.Config[key]; ok {
|
return maps.GetValueAsBool(n.Config, key)
|
||||||
if b, ok := v.(bool); ok {
|
}
|
||||||
return b
|
|
||||||
}
|
func (n *WorkflowNode) GetConfigInt32(key string) int32 {
|
||||||
}
|
return maps.GetValueAsInt32(n.Config, key)
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *WorkflowNode) GetConfigInt64(key string) int64 {
|
func (n *WorkflowNode) GetConfigInt64(key string) int64 {
|
||||||
// 先转成字符串,再转成 int64
|
return maps.GetValueAsInt64(n.Config, key)
|
||||||
if v, ok := n.Config[key]; ok {
|
|
||||||
temp := fmt.Sprintf("%v", v)
|
|
||||||
if i, err := strconv.ParseInt(temp, 10, 64); err == nil {
|
|
||||||
return i
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type WorkflowNodeIo struct {
|
func (n *WorkflowNode) GetConfigMap(key string) map[string]any {
|
||||||
|
if val, ok := n.Config[key]; ok {
|
||||||
|
if result, ok := val.(map[string]any); ok {
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return make(map[string]any)
|
||||||
|
}
|
||||||
|
|
||||||
|
type WorkflowNodeIO struct {
|
||||||
Label string `json:"label"`
|
Label string `json:"label"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
Required bool `json:"required"`
|
Required bool `json:"required"`
|
||||||
Value any `json:"value"`
|
Value any `json:"value"`
|
||||||
ValueSelector WorkflowNodeIoValueSelector `json:"valueSelector"`
|
ValueSelector WorkflowNodeIOValueSelector `json:"valueSelector"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type WorkflowNodeIoValueSelector struct {
|
type WorkflowNodeIOValueSelector struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type WorkflowRunReq struct {
|
type WorkflowRunReq struct {
|
||||||
Id string `json:"id"`
|
WorkflowId string `json:"workflowId"`
|
||||||
|
Trigger WorkflowTriggerType `json:"trigger"`
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
package domain
|
package domain
|
||||||
|
|
||||||
const WorkflowOutputCertificate = "certificate"
|
|
||||||
|
|
||||||
type WorkflowOutput struct {
|
type WorkflowOutput struct {
|
||||||
Meta
|
Meta
|
||||||
Workflow string `json:"workflow"`
|
WorkflowId string `json:"workflowId" db:"workflow"`
|
||||||
NodeId string `json:"nodeId"`
|
NodeId string `json:"nodeId" db:"nodeId"`
|
||||||
Node *WorkflowNode `json:"node"`
|
Node *WorkflowNode `json:"node" db:"node"`
|
||||||
Output []WorkflowNodeIo `json:"output"`
|
Outputs []WorkflowNodeIO `json:"outputs" db:"outputs"`
|
||||||
Succeed bool `json:"succeed"`
|
Succeeded bool `json:"succeeded" db:"succeeded"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const WORKFLOW_OUTPUT_CERTIFICATE = "certificate"
|
||||||
|
49
internal/domain/workflow_run.go
Normal file
49
internal/domain/workflow_run.go
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
package domain
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
type WorkflowRunStatusType string
|
||||||
|
|
||||||
|
const (
|
||||||
|
WorkflowRunStatusTypePending WorkflowRunStatusType = "pending"
|
||||||
|
WorkflowRunStatusTypeRunning WorkflowRunStatusType = "running"
|
||||||
|
WorkflowRunStatusTypeSucceeded WorkflowRunStatusType = "succeeded"
|
||||||
|
WorkflowRunStatusTypeFailed WorkflowRunStatusType = "failed"
|
||||||
|
)
|
||||||
|
|
||||||
|
type WorkflowRun struct {
|
||||||
|
Meta
|
||||||
|
WorkflowId string `json:"workflowId" db:"workflowId"`
|
||||||
|
Status WorkflowRunStatusType `json:"status" db:"status"`
|
||||||
|
Trigger WorkflowTriggerType `json:"trigger" db:"trigger"`
|
||||||
|
StartedAt time.Time `json:"startedAt" db:"startedAt"`
|
||||||
|
EndedAt time.Time `json:"endedAt" db:"endedAt"`
|
||||||
|
Logs []WorkflowRunLog `json:"logs" db:"logs"`
|
||||||
|
Error string `json:"error" db:"error"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type WorkflowRunLog struct {
|
||||||
|
NodeId string `json:"nodeId"`
|
||||||
|
NodeName string `json:"nodeName"`
|
||||||
|
Error string `json:"error"`
|
||||||
|
Outputs []WorkflowRunLogOutput `json:"outputs"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type WorkflowRunLogOutput struct {
|
||||||
|
Time string `json:"time"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
Content string `json:"content"`
|
||||||
|
Error string `json:"error"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type WorkflowRunLogs []WorkflowRunLog
|
||||||
|
|
||||||
|
func (r WorkflowRunLogs) FirstError() string {
|
||||||
|
for _, log := range r {
|
||||||
|
if log.Error != "" {
|
||||||
|
return log.Error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ""
|
||||||
|
}
|
@ -1,33 +0,0 @@
|
|||||||
package domain
|
|
||||||
|
|
||||||
type RunLogOutput struct {
|
|
||||||
Time string `json:"time"`
|
|
||||||
Title string `json:"title"`
|
|
||||||
Content string `json:"content"`
|
|
||||||
Error string `json:"error"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type RunLog struct {
|
|
||||||
NodeName string `json:"nodeName"`
|
|
||||||
Error string `json:"error"`
|
|
||||||
Outputs []RunLogOutput `json:"outputs"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type WorkflowRunLog struct {
|
|
||||||
Meta
|
|
||||||
Workflow string `json:"workflow"`
|
|
||||||
Log []RunLog `json:"log"`
|
|
||||||
Succeed bool `json:"succeed"`
|
|
||||||
Error string `json:"error"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type RunLogs []RunLog
|
|
||||||
|
|
||||||
func (r RunLogs) Error() string {
|
|
||||||
for _, log := range r {
|
|
||||||
if log.Error != "" {
|
|
||||||
return log.Error
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
@ -1,213 +0,0 @@
|
|||||||
package domains
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"crypto/ecdsa"
|
|
||||||
"crypto/rsa"
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/pocketbase/pocketbase/models"
|
|
||||||
|
|
||||||
"golang.org/x/exp/slices"
|
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/applicant"
|
|
||||||
"github.com/usual2970/certimate/internal/deployer"
|
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
|
||||||
"github.com/usual2970/certimate/internal/utils/app"
|
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/utils/x509"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Phase string
|
|
||||||
|
|
||||||
const (
|
|
||||||
checkPhase Phase = "check"
|
|
||||||
applyPhase Phase = "apply"
|
|
||||||
deployPhase Phase = "deploy"
|
|
||||||
)
|
|
||||||
|
|
||||||
const validityDuration = time.Hour * 24 * 10
|
|
||||||
|
|
||||||
func deploy(ctx context.Context, record *models.Record) error {
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
app.GetApp().Logger().Error("部署失败", "err", r)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
var certificate *applicant.Certificate
|
|
||||||
|
|
||||||
history := NewHistory(record)
|
|
||||||
defer history.commit()
|
|
||||||
|
|
||||||
// ############1.检查域名配置
|
|
||||||
history.record(checkPhase, "开始检查", nil)
|
|
||||||
|
|
||||||
currRecord, err := app.GetApp().Dao().FindRecordById("domains", record.Id)
|
|
||||||
if err != nil {
|
|
||||||
app.GetApp().Logger().Error("获取记录失败", "err", err)
|
|
||||||
history.record(checkPhase, "获取域名配置失败", &RecordInfo{Err: err})
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
history.record(checkPhase, "获取记录成功", nil)
|
|
||||||
|
|
||||||
cert := currRecord.GetString("certificate")
|
|
||||||
expiredAt := currRecord.GetDateTime("expiredAt").Time()
|
|
||||||
|
|
||||||
// 检查证书是否包含设置的所有域名
|
|
||||||
changed := isCertChanged(cert, currRecord)
|
|
||||||
|
|
||||||
if cert != "" && time.Until(expiredAt) > validityDuration && currRecord.GetBool("deployed") && !changed {
|
|
||||||
app.GetApp().Logger().Info("证书在有效期内")
|
|
||||||
history.record(checkPhase, "证书在有效期内且已部署,跳过", &RecordInfo{
|
|
||||||
Info: []string{fmt.Sprintf("证书有效期至 %s", expiredAt.Format("2006-01-02"))},
|
|
||||||
}, true)
|
|
||||||
|
|
||||||
// 跳过的情况也算成功
|
|
||||||
history.setWholeSuccess(true)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
history.record(checkPhase, "检查通过", nil, true)
|
|
||||||
|
|
||||||
// ############2.申请证书
|
|
||||||
history.record(applyPhase, "开始申请", nil)
|
|
||||||
|
|
||||||
if cert != "" && time.Until(expiredAt) > validityDuration && !changed {
|
|
||||||
history.record(applyPhase, "证书在有效期内,跳过", &RecordInfo{
|
|
||||||
Info: []string{fmt.Sprintf("证书有效期至 %s", expiredAt.Format("2006-01-02"))},
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
applicant, err := applicant.Get(currRecord)
|
|
||||||
if err != nil {
|
|
||||||
history.record(applyPhase, "获取applicant失败", &RecordInfo{Err: err})
|
|
||||||
app.GetApp().Logger().Error("获取applicant失败", "err", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
certificate, err = applicant.Apply()
|
|
||||||
if err != nil {
|
|
||||||
history.record(applyPhase, "申请证书失败", &RecordInfo{Err: err})
|
|
||||||
app.GetApp().Logger().Error("申请证书失败", "err", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
history.record(applyPhase, "申请证书成功", &RecordInfo{
|
|
||||||
Info: []string{fmt.Sprintf("证书地址: %s", certificate.CertUrl)},
|
|
||||||
})
|
|
||||||
history.setCert(certificate)
|
|
||||||
}
|
|
||||||
|
|
||||||
history.record(applyPhase, "保存证书成功", nil, true)
|
|
||||||
|
|
||||||
// ############3.部署证书
|
|
||||||
history.record(deployPhase, "开始部署", nil, false)
|
|
||||||
deployers, err := deployer.Gets(currRecord, certificate)
|
|
||||||
if err != nil {
|
|
||||||
history.record(deployPhase, "获取deployer失败", &RecordInfo{Err: err})
|
|
||||||
app.GetApp().Logger().Error("获取deployer失败", "err", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 没有部署配置,也算成功
|
|
||||||
if len(deployers) == 0 {
|
|
||||||
history.record(deployPhase, "没有部署配置", &RecordInfo{Info: []string{"没有部署配置"}})
|
|
||||||
history.setWholeSuccess(true)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, deployer := range deployers {
|
|
||||||
if err = deployer.Deploy(ctx); err != nil {
|
|
||||||
|
|
||||||
app.GetApp().Logger().Error("部署失败", "err", err)
|
|
||||||
history.record(deployPhase, "部署失败", &RecordInfo{Err: err, Info: deployer.GetInfos()})
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
history.record(deployPhase, fmt.Sprintf("[%s]-部署成功", deployer.GetID()), &RecordInfo{
|
|
||||||
Info: deployer.GetInfos(),
|
|
||||||
}, false)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
app.GetApp().Logger().Info("部署成功")
|
|
||||||
history.record(deployPhase, "部署成功", nil, true)
|
|
||||||
|
|
||||||
history.setWholeSuccess(true)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func isCertChanged(certificate string, record *models.Record) bool {
|
|
||||||
// 如果证书为空,直接返回true
|
|
||||||
if certificate == "" {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// 解析证书
|
|
||||||
cert, err := x509.ParseCertificateFromPEM(certificate)
|
|
||||||
if err != nil {
|
|
||||||
app.GetApp().Logger().Error("解析证书失败", "err", err)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// 遍历域名列表,检查是否都在证书中,找到第一个不存在证书中域名时提前返回true
|
|
||||||
for _, domain := range strings.Split(record.GetString("domain"), ";") {
|
|
||||||
if !slices.Contains(cert.DNSNames, domain) && !slices.Contains(cert.DNSNames, "*."+removeLastSubdomain(domain)) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 解析applyConfig
|
|
||||||
applyConfig := &domain.ApplyConfig{}
|
|
||||||
record.UnmarshalJSONField("applyConfig", applyConfig)
|
|
||||||
|
|
||||||
// 检查证书加密算法是否变更
|
|
||||||
switch pubkey := cert.PublicKey.(type) {
|
|
||||||
case *rsa.PublicKey:
|
|
||||||
bitSize := pubkey.N.BitLen()
|
|
||||||
switch bitSize {
|
|
||||||
case 2048:
|
|
||||||
// RSA2048
|
|
||||||
if applyConfig.KeyAlgorithm != "" && applyConfig.KeyAlgorithm != "RSA2048" {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
case 3072:
|
|
||||||
// RSA3072
|
|
||||||
if applyConfig.KeyAlgorithm != "RSA3072" {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
case 4096:
|
|
||||||
// RSA4096
|
|
||||||
if applyConfig.KeyAlgorithm != "RSA4096" {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
case 8192:
|
|
||||||
// RSA8192
|
|
||||||
if applyConfig.KeyAlgorithm != "RSA8192" {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case *ecdsa.PublicKey:
|
|
||||||
bitSize := pubkey.Curve.Params().BitSize
|
|
||||||
switch bitSize {
|
|
||||||
case 256:
|
|
||||||
// EC256
|
|
||||||
if applyConfig.KeyAlgorithm != "EC256" {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
case 384:
|
|
||||||
// EC384
|
|
||||||
if applyConfig.KeyAlgorithm != "EC384" {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func removeLastSubdomain(domain string) string {
|
|
||||||
parts := strings.Split(domain, ".")
|
|
||||||
if len(parts) > 1 {
|
|
||||||
return strings.Join(parts[1:], ".")
|
|
||||||
}
|
|
||||||
return domain
|
|
||||||
}
|
|
@ -1,79 +0,0 @@
|
|||||||
package domains
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/pocketbase/pocketbase/models"
|
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/utils/app"
|
|
||||||
)
|
|
||||||
|
|
||||||
func create(ctx context.Context, record *models.Record) error {
|
|
||||||
if !record.GetBool("enabled") {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if record.GetBool("rightnow") {
|
|
||||||
go func() {
|
|
||||||
if err := deploy(ctx, record); err != nil {
|
|
||||||
app.GetApp().Logger().Error("deploy failed", "err", err)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
|
|
||||||
scheduler := app.GetScheduler()
|
|
||||||
|
|
||||||
err := scheduler.Add(record.Id, record.GetString("crontab"), func() {
|
|
||||||
deploy(ctx, record)
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
app.GetApp().Logger().Error("add cron job failed", "err", err)
|
|
||||||
return fmt.Errorf("add cron job failed: %w", err)
|
|
||||||
}
|
|
||||||
app.GetApp().Logger().Error("add cron job failed", "domain", record.GetString("domain"))
|
|
||||||
|
|
||||||
scheduler.Start()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func update(ctx context.Context, record *models.Record) error {
|
|
||||||
scheduler := app.GetScheduler()
|
|
||||||
scheduler.Remove(record.Id)
|
|
||||||
if !record.GetBool("enabled") {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if record.GetBool("rightnow") {
|
|
||||||
go func() {
|
|
||||||
if err := deploy(ctx, record); err != nil {
|
|
||||||
app.GetApp().Logger().Error("deploy failed", "err", err)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
|
|
||||||
err := scheduler.Add(record.Id, record.GetString("crontab"), func() {
|
|
||||||
deploy(ctx, record)
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
app.GetApp().Logger().Error("update cron job failed", "err", err)
|
|
||||||
return fmt.Errorf("update cron job failed: %w", err)
|
|
||||||
}
|
|
||||||
app.GetApp().Logger().Info("update cron job success", "domain", record.GetString("domain"))
|
|
||||||
|
|
||||||
scheduler.Start()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func delete(_ context.Context, record *models.Record) error {
|
|
||||||
scheduler := app.GetScheduler()
|
|
||||||
|
|
||||||
scheduler.Remove(record.Id)
|
|
||||||
scheduler.Start()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func setRightnow(ctx context.Context, record *models.Record, ok bool) error {
|
|
||||||
record.Set("rightnow", ok)
|
|
||||||
return app.GetApp().Dao().SaveRecord(record)
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
package domains
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/pocketbase/pocketbase/core"
|
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/utils/app"
|
|
||||||
)
|
|
||||||
|
|
||||||
const tableName = "domains"
|
|
||||||
|
|
||||||
func AddEvent() error {
|
|
||||||
app := app.GetApp()
|
|
||||||
|
|
||||||
app.OnRecordAfterCreateRequest(tableName).Add(func(e *core.RecordCreateEvent) error {
|
|
||||||
return create(e.HttpContext.Request().Context(), e.Record)
|
|
||||||
})
|
|
||||||
|
|
||||||
app.OnRecordAfterUpdateRequest(tableName).Add(func(e *core.RecordUpdateEvent) error {
|
|
||||||
return update(e.HttpContext.Request().Context(), e.Record)
|
|
||||||
})
|
|
||||||
|
|
||||||
app.OnRecordAfterDeleteRequest(tableName).Add(func(e *core.RecordDeleteEvent) error {
|
|
||||||
return delete(e.HttpContext.Request().Context(), e.Record)
|
|
||||||
})
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
@ -1,122 +0,0 @@
|
|||||||
package domains
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/pocketbase/pocketbase/models"
|
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/applicant"
|
|
||||||
"github.com/usual2970/certimate/internal/utils/app"
|
|
||||||
"github.com/usual2970/certimate/internal/utils/xtime"
|
|
||||||
)
|
|
||||||
|
|
||||||
type historyItem struct {
|
|
||||||
Time string `json:"time"`
|
|
||||||
Message string `json:"message"`
|
|
||||||
Error string `json:"error"`
|
|
||||||
Info []string `json:"info"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type RecordInfo struct {
|
|
||||||
Err error `json:"err"`
|
|
||||||
Info []string `json:"info"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type history struct {
|
|
||||||
Domain string `json:"domain"`
|
|
||||||
Log map[Phase][]historyItem `json:"log"`
|
|
||||||
Phase Phase `json:"phase"`
|
|
||||||
PhaseSuccess bool `json:"phaseSuccess"`
|
|
||||||
DeployedAt string `json:"deployedAt"`
|
|
||||||
Cert *applicant.Certificate `json:"cert"`
|
|
||||||
WholeSuccess bool `json:"wholeSuccess"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewHistory(record *models.Record) *history {
|
|
||||||
return &history{
|
|
||||||
Domain: record.Id,
|
|
||||||
DeployedAt: time.Now().UTC().Format("2006-01-02T15:04:05Z"),
|
|
||||||
Log: make(map[Phase][]historyItem),
|
|
||||||
Phase: checkPhase,
|
|
||||||
PhaseSuccess: false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *history) record(phase Phase, msg string, info *RecordInfo, pass ...bool) {
|
|
||||||
if info == nil {
|
|
||||||
info = &RecordInfo{}
|
|
||||||
}
|
|
||||||
a.Phase = phase
|
|
||||||
if len(pass) > 0 {
|
|
||||||
a.PhaseSuccess = pass[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
errMsg := ""
|
|
||||||
if info.Err != nil {
|
|
||||||
errMsg = info.Err.Error()
|
|
||||||
a.PhaseSuccess = false
|
|
||||||
}
|
|
||||||
|
|
||||||
a.Log[phase] = append(a.Log[phase], historyItem{
|
|
||||||
Message: msg,
|
|
||||||
Error: errMsg,
|
|
||||||
Info: info.Info,
|
|
||||||
Time: xtime.BeijingTimeStr(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *history) setCert(cert *applicant.Certificate) {
|
|
||||||
a.Cert = cert
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *history) setWholeSuccess(success bool) {
|
|
||||||
a.WholeSuccess = success
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *history) commit() error {
|
|
||||||
collection, err := app.GetApp().Dao().FindCollectionByNameOrId("deployments")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
record := models.NewRecord(collection)
|
|
||||||
|
|
||||||
record.Set("domain", a.Domain)
|
|
||||||
record.Set("deployedAt", a.DeployedAt)
|
|
||||||
record.Set("log", a.Log)
|
|
||||||
record.Set("phase", string(a.Phase))
|
|
||||||
record.Set("phaseSuccess", a.PhaseSuccess)
|
|
||||||
record.Set("wholeSuccess", a.WholeSuccess)
|
|
||||||
|
|
||||||
if err := app.GetApp().Dao().SaveRecord(record); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
domainRecord, err := app.GetApp().Dao().FindRecordById("domains", a.Domain)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
domainRecord.Set("lastDeployedAt", a.DeployedAt)
|
|
||||||
domainRecord.Set("lastDeployment", record.Id)
|
|
||||||
domainRecord.Set("rightnow", false)
|
|
||||||
if a.Phase == deployPhase && a.PhaseSuccess {
|
|
||||||
domainRecord.Set("deployed", true)
|
|
||||||
}
|
|
||||||
cert := a.Cert
|
|
||||||
if cert != nil {
|
|
||||||
domainRecord.Set("certUrl", cert.CertUrl)
|
|
||||||
domainRecord.Set("certStableUrl", cert.CertStableUrl)
|
|
||||||
domainRecord.Set("privateKey", cert.PrivateKey)
|
|
||||||
domainRecord.Set("certificate", cert.Certificate)
|
|
||||||
domainRecord.Set("issuerCertificate", cert.IssuerCertificate)
|
|
||||||
domainRecord.Set("csr", cert.Csr)
|
|
||||||
domainRecord.Set("expiredAt", time.Now().Add(time.Hour*24*90))
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := app.GetApp().Dao().SaveRecord(domainRecord); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
@ -2,13 +2,15 @@ package notify
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"golang.org/x/sync/errgroup"
|
"golang.org/x/sync/errgroup"
|
||||||
|
|
||||||
|
"github.com/usual2970/certimate/internal/domain"
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/notifier"
|
"github.com/usual2970/certimate/internal/pkg/core/notifier"
|
||||||
"github.com/usual2970/certimate/internal/pkg/utils/maps"
|
"github.com/usual2970/certimate/internal/pkg/utils/maps"
|
||||||
"github.com/usual2970/certimate/internal/utils/app"
|
"github.com/usual2970/certimate/internal/repository"
|
||||||
)
|
)
|
||||||
|
|
||||||
func SendToAllChannels(subject, message string) error {
|
func SendToAllChannels(subject, message string) error {
|
||||||
@ -37,7 +39,7 @@ func SendToAllChannels(subject, message string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func SendToChannel(subject, message string, channel string, channelConfig map[string]any) error {
|
func SendToChannel(subject, message string, channel string, channelConfig map[string]any) error {
|
||||||
notifier, err := createNotifier(channel, channelConfig)
|
notifier, err := createNotifier(domain.NotifyChannelType(channel), channelConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -47,13 +49,14 @@ func SendToChannel(subject, message string, channel string, channelConfig map[st
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getEnabledNotifiers() ([]notifier.Notifier, error) {
|
func getEnabledNotifiers() ([]notifier.Notifier, error) {
|
||||||
settings, err := app.GetApp().Dao().FindFirstRecordByFilter("settings", "name='notifyChannels'")
|
settingsRepo := repository.NewSettingsRepository()
|
||||||
|
settings, err := settingsRepo.GetByName(context.Background(), "notifyChannels")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("find notifyChannels error: %w", err)
|
return nil, fmt.Errorf("find notifyChannels error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
rs := make(map[string]map[string]any)
|
rs := make(map[string]map[string]any)
|
||||||
if err := settings.UnmarshalJSONField("content", &rs); err != nil {
|
if err := json.Unmarshal([]byte(settings.Content), &rs); err != nil {
|
||||||
return nil, fmt.Errorf("unmarshal notifyChannels error: %w", err)
|
return nil, fmt.Errorf("unmarshal notifyChannels error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,7 +66,7 @@ func getEnabledNotifiers() ([]notifier.Notifier, error) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
notifier, err := createNotifier(k, v)
|
notifier, err := createNotifier(domain.NotifyChannelType(k), v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -16,25 +16,25 @@ import (
|
|||||||
"github.com/usual2970/certimate/internal/pkg/utils/maps"
|
"github.com/usual2970/certimate/internal/pkg/utils/maps"
|
||||||
)
|
)
|
||||||
|
|
||||||
func createNotifier(channel string, channelConfig map[string]any) (notifier.Notifier, error) {
|
func createNotifier(channel domain.NotifyChannelType, channelConfig map[string]any) (notifier.Notifier, error) {
|
||||||
/*
|
/*
|
||||||
注意:如果追加新的常量值,请保持以 ASCII 排序。
|
注意:如果追加新的常量值,请保持以 ASCII 排序。
|
||||||
NOTICE: If you add new constant, please keep ASCII order.
|
NOTICE: If you add new constant, please keep ASCII order.
|
||||||
*/
|
*/
|
||||||
switch channel {
|
switch channel {
|
||||||
case domain.NotifyChannelBark:
|
case domain.NotifyChannelTypeBark:
|
||||||
return providerBark.New(&providerBark.BarkNotifierConfig{
|
return providerBark.New(&providerBark.BarkNotifierConfig{
|
||||||
DeviceKey: maps.GetValueAsString(channelConfig, "deviceKey"),
|
DeviceKey: maps.GetValueAsString(channelConfig, "deviceKey"),
|
||||||
ServerUrl: maps.GetValueAsString(channelConfig, "serverUrl"),
|
ServerUrl: maps.GetValueAsString(channelConfig, "serverUrl"),
|
||||||
})
|
})
|
||||||
|
|
||||||
case domain.NotifyChannelDingtalk:
|
case domain.NotifyChannelTypeDingTalk:
|
||||||
return providerDingTalk.New(&providerDingTalk.DingTalkNotifierConfig{
|
return providerDingTalk.New(&providerDingTalk.DingTalkNotifierConfig{
|
||||||
AccessToken: maps.GetValueAsString(channelConfig, "accessToken"),
|
AccessToken: maps.GetValueAsString(channelConfig, "accessToken"),
|
||||||
Secret: maps.GetValueAsString(channelConfig, "secret"),
|
Secret: maps.GetValueAsString(channelConfig, "secret"),
|
||||||
})
|
})
|
||||||
|
|
||||||
case domain.NotifyChannelEmail:
|
case domain.NotifyChannelTypeEmail:
|
||||||
return providerEmail.New(&providerEmail.EmailNotifierConfig{
|
return providerEmail.New(&providerEmail.EmailNotifierConfig{
|
||||||
SmtpHost: maps.GetValueAsString(channelConfig, "smtpHost"),
|
SmtpHost: maps.GetValueAsString(channelConfig, "smtpHost"),
|
||||||
SmtpPort: maps.GetValueAsInt32(channelConfig, "smtpPort"),
|
SmtpPort: maps.GetValueAsInt32(channelConfig, "smtpPort"),
|
||||||
@ -45,28 +45,28 @@ func createNotifier(channel string, channelConfig map[string]any) (notifier.Noti
|
|||||||
ReceiverAddress: maps.GetValueAsString(channelConfig, "receiverAddress"),
|
ReceiverAddress: maps.GetValueAsString(channelConfig, "receiverAddress"),
|
||||||
})
|
})
|
||||||
|
|
||||||
case domain.NotifyChannelLark:
|
case domain.NotifyChannelTypeLark:
|
||||||
return providerLark.New(&providerLark.LarkNotifierConfig{
|
return providerLark.New(&providerLark.LarkNotifierConfig{
|
||||||
WebhookUrl: maps.GetValueAsString(channelConfig, "webhookUrl"),
|
WebhookUrl: maps.GetValueAsString(channelConfig, "webhookUrl"),
|
||||||
})
|
})
|
||||||
|
|
||||||
case domain.NotifyChannelServerChan:
|
case domain.NotifyChannelTypeServerChan:
|
||||||
return providerServerChan.New(&providerServerChan.ServerChanNotifierConfig{
|
return providerServerChan.New(&providerServerChan.ServerChanNotifierConfig{
|
||||||
Url: maps.GetValueAsString(channelConfig, "url"),
|
Url: maps.GetValueAsString(channelConfig, "url"),
|
||||||
})
|
})
|
||||||
|
|
||||||
case domain.NotifyChannelTelegram:
|
case domain.NotifyChannelTypeTelegram:
|
||||||
return providerTelegram.New(&providerTelegram.TelegramNotifierConfig{
|
return providerTelegram.New(&providerTelegram.TelegramNotifierConfig{
|
||||||
ApiToken: maps.GetValueAsString(channelConfig, "apiToken"),
|
ApiToken: maps.GetValueAsString(channelConfig, "apiToken"),
|
||||||
ChatId: maps.GetValueAsInt64(channelConfig, "chatId"),
|
ChatId: maps.GetValueAsInt64(channelConfig, "chatId"),
|
||||||
})
|
})
|
||||||
|
|
||||||
case domain.NotifyChannelWebhook:
|
case domain.NotifyChannelTypeWebhook:
|
||||||
return providerWebhook.New(&providerWebhook.WebhookNotifierConfig{
|
return providerWebhook.New(&providerWebhook.WebhookNotifierConfig{
|
||||||
Url: maps.GetValueAsString(channelConfig, "url"),
|
Url: maps.GetValueAsString(channelConfig, "url"),
|
||||||
})
|
})
|
||||||
|
|
||||||
case domain.NotifyChannelWeCom:
|
case domain.NotifyChannelTypeWeCom:
|
||||||
return providerWeCom.New(&providerWeCom.WeComNotifierConfig{
|
return providerWeCom.New(&providerWeCom.WeComNotifierConfig{
|
||||||
WebhookUrl: maps.GetValueAsString(channelConfig, "webhookUrl"),
|
WebhookUrl: maps.GetValueAsString(channelConfig, "webhookUrl"),
|
||||||
})
|
})
|
@ -12,15 +12,15 @@ const (
|
|||||||
notifyTestBody = "欢迎使用 Certimate ,这是一条测试通知。"
|
notifyTestBody = "欢迎使用 Certimate ,这是一条测试通知。"
|
||||||
)
|
)
|
||||||
|
|
||||||
type SettingRepository interface {
|
type SettingsRepository interface {
|
||||||
GetByName(ctx context.Context, name string) (*domain.Setting, error)
|
GetByName(ctx context.Context, name string) (*domain.Settings, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type NotifyService struct {
|
type NotifyService struct {
|
||||||
settingRepo SettingRepository
|
settingRepo SettingsRepository
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewNotifyService(settingRepo SettingRepository) *NotifyService {
|
func NewNotifyService(settingRepo SettingsRepository) *NotifyService {
|
||||||
return &NotifyService{
|
return &NotifyService{
|
||||||
settingRepo: settingRepo,
|
settingRepo: settingRepo,
|
||||||
}
|
}
|
||||||
@ -32,7 +32,7 @@ func (n *NotifyService) Test(ctx context.Context, req *domain.NotifyTestPushReq)
|
|||||||
return fmt.Errorf("failed to get notify channels settings: %w", err)
|
return fmt.Errorf("failed to get notify channels settings: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
channelConfig, err := setting.GetChannelContent(req.Channel)
|
channelConfig, err := setting.GetNotifyChannelConfig(req.Channel)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to get notify channel \"%s\" config: %w", req.Channel, err)
|
return fmt.Errorf("failed to get notify channel \"%s\" config: %w", req.Channel, err)
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,41 @@
|
|||||||
|
package acmehttpreq
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"net/url"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-acme/lego/v4/challenge"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/httpreq"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ACMEHttpReqApplicantConfig struct {
|
||||||
|
Endpoint string `json:"endpoint"`
|
||||||
|
Mode string `json:"mode"`
|
||||||
|
Username string `json:"username"`
|
||||||
|
Password string `json:"password"`
|
||||||
|
PropagationTimeout int32 `json:"propagationTimeout,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewChallengeProvider(config *ACMEHttpReqApplicantConfig) (challenge.Provider, error) {
|
||||||
|
if config == nil {
|
||||||
|
return nil, errors.New("config is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
endpoint, _ := url.Parse(config.Endpoint)
|
||||||
|
providerConfig := httpreq.NewDefaultConfig()
|
||||||
|
providerConfig.Endpoint = endpoint
|
||||||
|
providerConfig.Mode = config.Mode
|
||||||
|
providerConfig.Username = config.Username
|
||||||
|
providerConfig.Password = config.Password
|
||||||
|
if config.PropagationTimeout != 0 {
|
||||||
|
providerConfig.PropagationTimeout = time.Duration(config.PropagationTimeout) * time.Second
|
||||||
|
}
|
||||||
|
|
||||||
|
provider, err := httpreq.NewDNSProviderConfig(providerConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return provider, nil
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package aliyun
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-acme/lego/v4/challenge"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/alidns"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AliyunApplicantConfig struct {
|
||||||
|
AccessKeyId string `json:"accessKeyId"`
|
||||||
|
AccessKeySecret string `json:"accessKeySecret"`
|
||||||
|
PropagationTimeout int32 `json:"propagationTimeout,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewChallengeProvider(config *AliyunApplicantConfig) (challenge.Provider, error) {
|
||||||
|
if config == nil {
|
||||||
|
return nil, errors.New("config is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
providerConfig := alidns.NewDefaultConfig()
|
||||||
|
providerConfig.APIKey = config.AccessKeyId
|
||||||
|
providerConfig.SecretKey = config.AccessKeySecret
|
||||||
|
if config.PropagationTimeout != 0 {
|
||||||
|
providerConfig.PropagationTimeout = time.Duration(config.PropagationTimeout) * time.Second
|
||||||
|
}
|
||||||
|
|
||||||
|
provider, err := alidns.NewDNSProviderConfig(providerConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return provider, nil
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
package aws
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-acme/lego/v4/challenge"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/route53"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AWSApplicantConfig struct {
|
||||||
|
AccessKeyId string `json:"accessKeyId"`
|
||||||
|
SecretAccessKey string `json:"secretAccessKey"`
|
||||||
|
Region string `json:"region"`
|
||||||
|
HostedZoneId string `json:"hostedZoneId"`
|
||||||
|
PropagationTimeout int32 `json:"propagationTimeout,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewChallengeProvider(config *AWSApplicantConfig) (challenge.Provider, error) {
|
||||||
|
if config == nil {
|
||||||
|
return nil, errors.New("config is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
providerConfig := route53.NewDefaultConfig()
|
||||||
|
providerConfig.AccessKeyID = config.AccessKeyId
|
||||||
|
providerConfig.SecretAccessKey = config.SecretAccessKey
|
||||||
|
providerConfig.Region = config.Region
|
||||||
|
providerConfig.HostedZoneID = config.HostedZoneId
|
||||||
|
if config.PropagationTimeout != 0 {
|
||||||
|
providerConfig.PropagationTimeout = time.Duration(config.PropagationTimeout) * time.Second
|
||||||
|
}
|
||||||
|
|
||||||
|
provider, err := route53.NewDNSProviderConfig(providerConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return provider, nil
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package cloudflare
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-acme/lego/v4/challenge"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/cloudflare"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CloudflareApplicantConfig struct {
|
||||||
|
DnsApiToken string `json:"dnsApiToken"`
|
||||||
|
PropagationTimeout int32 `json:"propagationTimeout,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewChallengeProvider(config *CloudflareApplicantConfig) (challenge.Provider, error) {
|
||||||
|
if config == nil {
|
||||||
|
return nil, errors.New("config is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
providerConfig := cloudflare.NewDefaultConfig()
|
||||||
|
providerConfig.AuthToken = config.DnsApiToken
|
||||||
|
if config.PropagationTimeout != 0 {
|
||||||
|
providerConfig.PropagationTimeout = time.Duration(config.PropagationTimeout) * time.Second
|
||||||
|
}
|
||||||
|
|
||||||
|
provider, err := cloudflare.NewDNSProviderConfig(providerConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return provider, nil
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package godaddy
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-acme/lego/v4/challenge"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/godaddy"
|
||||||
|
)
|
||||||
|
|
||||||
|
type GoDaddyApplicantConfig struct {
|
||||||
|
ApiKey string `json:"apiKey"`
|
||||||
|
ApiSecret string `json:"apiSecret"`
|
||||||
|
PropagationTimeout int32 `json:"propagationTimeout,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewChallengeProvider(config *GoDaddyApplicantConfig) (challenge.Provider, error) {
|
||||||
|
if config == nil {
|
||||||
|
return nil, errors.New("config is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
providerConfig := godaddy.NewDefaultConfig()
|
||||||
|
providerConfig.APIKey = config.ApiKey
|
||||||
|
providerConfig.APISecret = config.ApiSecret
|
||||||
|
if config.PropagationTimeout != 0 {
|
||||||
|
providerConfig.PropagationTimeout = time.Duration(config.PropagationTimeout) * time.Second
|
||||||
|
}
|
||||||
|
|
||||||
|
provider, err := godaddy.NewDNSProviderConfig(providerConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return provider, nil
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
package huaweicloud
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-acme/lego/v4/challenge"
|
||||||
|
hwc "github.com/go-acme/lego/v4/providers/dns/huaweicloud"
|
||||||
|
)
|
||||||
|
|
||||||
|
type HuaweiCloudApplicantConfig struct {
|
||||||
|
AccessKeyId string `json:"accessKeyId"`
|
||||||
|
SecretAccessKey string `json:"secretAccessKey"`
|
||||||
|
Region string `json:"region"`
|
||||||
|
PropagationTimeout int32 `json:"propagationTimeout,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewChallengeProvider(config *HuaweiCloudApplicantConfig) (challenge.Provider, error) {
|
||||||
|
if config == nil {
|
||||||
|
return nil, errors.New("config is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
region := config.Region
|
||||||
|
if region == "" {
|
||||||
|
// 华为云的 SDK 要求必须传一个区域,实际上 DNS-01 流程里用不到,但不传会报错
|
||||||
|
region = "cn-north-1"
|
||||||
|
}
|
||||||
|
|
||||||
|
providerConfig := hwc.NewDefaultConfig()
|
||||||
|
providerConfig.AccessKeyID = config.AccessKeyId
|
||||||
|
providerConfig.SecretAccessKey = config.SecretAccessKey
|
||||||
|
providerConfig.Region = region
|
||||||
|
if config.PropagationTimeout != 0 {
|
||||||
|
providerConfig.PropagationTimeout = time.Duration(config.PropagationTimeout) * time.Second
|
||||||
|
}
|
||||||
|
|
||||||
|
provider, err := hwc.NewDNSProviderConfig(providerConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return provider, nil
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package namedotcom
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-acme/lego/v4/challenge"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/namedotcom"
|
||||||
|
)
|
||||||
|
|
||||||
|
type NameDotComApplicantConfig struct {
|
||||||
|
Username string `json:"username"`
|
||||||
|
ApiToken string `json:"apiToken"`
|
||||||
|
PropagationTimeout int32 `json:"propagationTimeout,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewChallengeProvider(config *NameDotComApplicantConfig) (challenge.Provider, error) {
|
||||||
|
if config == nil {
|
||||||
|
return nil, errors.New("config is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
providerConfig := namedotcom.NewDefaultConfig()
|
||||||
|
providerConfig.Username = config.Username
|
||||||
|
providerConfig.APIToken = config.ApiToken
|
||||||
|
if config.PropagationTimeout != 0 {
|
||||||
|
providerConfig.PropagationTimeout = time.Duration(config.PropagationTimeout) * time.Second
|
||||||
|
}
|
||||||
|
|
||||||
|
provider, err := namedotcom.NewDNSProviderConfig(providerConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return provider, nil
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package namesilo
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-acme/lego/v4/challenge"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/namesilo"
|
||||||
|
)
|
||||||
|
|
||||||
|
type NameSiloApplicantConfig struct {
|
||||||
|
ApiKey string `json:"apiKey"`
|
||||||
|
PropagationTimeout int32 `json:"propagationTimeout,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewChallengeProvider(config *NameSiloApplicantConfig) (challenge.Provider, error) {
|
||||||
|
if config == nil {
|
||||||
|
return nil, errors.New("config is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
providerConfig := namesilo.NewDefaultConfig()
|
||||||
|
providerConfig.APIKey = config.ApiKey
|
||||||
|
if config.PropagationTimeout != 0 {
|
||||||
|
providerConfig.PropagationTimeout = time.Duration(config.PropagationTimeout) * time.Second
|
||||||
|
}
|
||||||
|
|
||||||
|
provider, err := namesilo.NewDNSProviderConfig(providerConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return provider, nil
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package namesilo
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"net/url"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-acme/lego/v4/challenge"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/pdns"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PowerDNSApplicantConfig struct {
|
||||||
|
ApiUrl string `json:"apiUrl"`
|
||||||
|
ApiKey string `json:"apiKey"`
|
||||||
|
PropagationTimeout int32 `json:"propagationTimeout,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewChallengeProvider(config *PowerDNSApplicantConfig) (challenge.Provider, error) {
|
||||||
|
if config == nil {
|
||||||
|
return nil, errors.New("config is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
host, _ := url.Parse(config.ApiUrl)
|
||||||
|
providerConfig := pdns.NewDefaultConfig()
|
||||||
|
providerConfig.Host = host
|
||||||
|
providerConfig.APIKey = config.ApiKey
|
||||||
|
if config.PropagationTimeout != 0 {
|
||||||
|
providerConfig.PropagationTimeout = time.Duration(config.PropagationTimeout) * time.Second
|
||||||
|
}
|
||||||
|
|
||||||
|
provider, err := pdns.NewDNSProviderConfig(providerConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return provider, nil
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package tencentcloud
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-acme/lego/v4/challenge"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/tencentcloud"
|
||||||
|
)
|
||||||
|
|
||||||
|
type TencentCloudApplicantConfig struct {
|
||||||
|
SecretId string `json:"secretId"`
|
||||||
|
SecretKey string `json:"secretKey"`
|
||||||
|
PropagationTimeout int32 `json:"propagationTimeout,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewChallengeProvider(config *TencentCloudApplicantConfig) (challenge.Provider, error) {
|
||||||
|
if config == nil {
|
||||||
|
return nil, errors.New("config is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
providerConfig := tencentcloud.NewDefaultConfig()
|
||||||
|
providerConfig.SecretID = config.SecretId
|
||||||
|
providerConfig.SecretKey = config.SecretKey
|
||||||
|
if config.PropagationTimeout != 0 {
|
||||||
|
providerConfig.PropagationTimeout = time.Duration(config.PropagationTimeout) * time.Second
|
||||||
|
}
|
||||||
|
|
||||||
|
provider, err := tencentcloud.NewDNSProviderConfig(providerConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return provider, nil
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package volcengine
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-acme/lego/v4/challenge"
|
||||||
|
"github.com/go-acme/lego/v4/providers/dns/volcengine"
|
||||||
|
)
|
||||||
|
|
||||||
|
type VolcEngineApplicantConfig struct {
|
||||||
|
AccessKeyId string `json:"accessKeyId"`
|
||||||
|
SecretAccessKey string `json:"secretAccessKey"`
|
||||||
|
PropagationTimeout int32 `json:"propagationTimeout,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewChallengeProvider(config *VolcEngineApplicantConfig) (challenge.Provider, error) {
|
||||||
|
if config == nil {
|
||||||
|
return nil, errors.New("config is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
providerConfig := volcengine.NewDefaultConfig()
|
||||||
|
providerConfig.AccessKey = config.AccessKeyId
|
||||||
|
providerConfig.SecretKey = config.SecretAccessKey
|
||||||
|
if config.PropagationTimeout != 0 {
|
||||||
|
providerConfig.PropagationTimeout = time.Duration(config.PropagationTimeout) * time.Second
|
||||||
|
}
|
||||||
|
|
||||||
|
provider, err := volcengine.NewDNSProviderConfig(providerConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return provider, nil
|
||||||
|
}
|
@ -20,5 +20,5 @@ type Deployer interface {
|
|||||||
|
|
||||||
// 表示证书部署结果的数据结构。
|
// 表示证书部署结果的数据结构。
|
||||||
type DeployResult struct {
|
type DeployResult struct {
|
||||||
DeploymentData map[string]any `json:"deploymentData,omitempty"`
|
ExtendedData map[string]any `json:"extendedData,omitempty"`
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import (
|
|||||||
xerrors "github.com/pkg/errors"
|
xerrors "github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
||||||
providerCas "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/aliyun-cas"
|
providerCas "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/aliyun-cas"
|
||||||
)
|
)
|
||||||
@ -35,7 +36,7 @@ type AliyunALBDeployerConfig struct {
|
|||||||
|
|
||||||
type AliyunALBDeployer struct {
|
type AliyunALBDeployer struct {
|
||||||
config *AliyunALBDeployerConfig
|
config *AliyunALBDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
sdkClient *aliyunAlb.Client
|
sdkClient *aliyunAlb.Client
|
||||||
sslUploader uploader.Uploader
|
sslUploader uploader.Uploader
|
||||||
}
|
}
|
||||||
@ -43,10 +44,10 @@ type AliyunALBDeployer struct {
|
|||||||
var _ deployer.Deployer = (*AliyunALBDeployer)(nil)
|
var _ deployer.Deployer = (*AliyunALBDeployer)(nil)
|
||||||
|
|
||||||
func New(config *AliyunALBDeployerConfig) (*AliyunALBDeployer, error) {
|
func New(config *AliyunALBDeployerConfig) (*AliyunALBDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *AliyunALBDeployerConfig, logger deployer.Logger) (*AliyunALBDeployer, error) {
|
func NewWithLogger(config *AliyunALBDeployerConfig, logger logger.Logger) (*AliyunALBDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
aliyunCdn "github.com/alibabacloud-go/cdn-20180510/v5/client"
|
aliyunCdn "github.com/alibabacloud-go/cdn-20180510/v5/client"
|
||||||
@ -12,6 +13,7 @@ import (
|
|||||||
xerrors "github.com/pkg/errors"
|
xerrors "github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
)
|
)
|
||||||
|
|
||||||
type AliyunCDNDeployerConfig struct {
|
type AliyunCDNDeployerConfig struct {
|
||||||
@ -19,23 +21,23 @@ type AliyunCDNDeployerConfig struct {
|
|||||||
AccessKeyId string `json:"accessKeyId"`
|
AccessKeyId string `json:"accessKeyId"`
|
||||||
// 阿里云 AccessKeySecret。
|
// 阿里云 AccessKeySecret。
|
||||||
AccessKeySecret string `json:"accessKeySecret"`
|
AccessKeySecret string `json:"accessKeySecret"`
|
||||||
// 加速域名(不支持泛域名)。
|
// 加速域名(支持泛域名)。
|
||||||
Domain string `json:"domain"`
|
Domain string `json:"domain"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AliyunCDNDeployer struct {
|
type AliyunCDNDeployer struct {
|
||||||
config *AliyunCDNDeployerConfig
|
config *AliyunCDNDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
sdkClient *aliyunCdn.Client
|
sdkClient *aliyunCdn.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ deployer.Deployer = (*AliyunCDNDeployer)(nil)
|
var _ deployer.Deployer = (*AliyunCDNDeployer)(nil)
|
||||||
|
|
||||||
func New(config *AliyunCDNDeployerConfig) (*AliyunCDNDeployer, error) {
|
func New(config *AliyunCDNDeployerConfig) (*AliyunCDNDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *AliyunCDNDeployerConfig, logger deployer.Logger) (*AliyunCDNDeployer, error) {
|
func NewWithLogger(config *AliyunCDNDeployerConfig, logger logger.Logger) (*AliyunCDNDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
@ -57,10 +59,13 @@ func NewWithLogger(config *AliyunCDNDeployerConfig, logger deployer.Logger) (*Al
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *AliyunCDNDeployer) Deploy(ctx context.Context, certPem string, privkeyPem string) (*deployer.DeployResult, error) {
|
func (d *AliyunCDNDeployer) Deploy(ctx context.Context, certPem string, privkeyPem string) (*deployer.DeployResult, error) {
|
||||||
|
// "*.example.com" → ".example.com",适配阿里云 CDN 要求的泛域名格式
|
||||||
|
domain := strings.TrimPrefix(d.config.Domain, "*")
|
||||||
|
|
||||||
// 设置 CDN 域名域名证书
|
// 设置 CDN 域名域名证书
|
||||||
// REF: https://help.aliyun.com/zh/cdn/developer-reference/api-cdn-2018-05-10-setcdndomainsslcertificate
|
// REF: https://help.aliyun.com/zh/cdn/developer-reference/api-cdn-2018-05-10-setcdndomainsslcertificate
|
||||||
setCdnDomainSSLCertificateReq := &aliyunCdn.SetCdnDomainSSLCertificateRequest{
|
setCdnDomainSSLCertificateReq := &aliyunCdn.SetCdnDomainSSLCertificateRequest{
|
||||||
DomainName: tea.String(d.config.Domain),
|
DomainName: tea.String(domain),
|
||||||
CertName: tea.String(fmt.Sprintf("certimate-%d", time.Now().UnixMilli())),
|
CertName: tea.String(fmt.Sprintf("certimate-%d", time.Now().UnixMilli())),
|
||||||
CertType: tea.String("upload"),
|
CertType: tea.String("upload"),
|
||||||
SSLProtocol: tea.String("on"),
|
SSLProtocol: tea.String("on"),
|
||||||
|
@ -11,6 +11,7 @@ import (
|
|||||||
xerrors "github.com/pkg/errors"
|
xerrors "github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
||||||
providerSlb "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/aliyun-slb"
|
providerSlb "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/aliyun-slb"
|
||||||
)
|
)
|
||||||
@ -34,7 +35,7 @@ type AliyunCLBDeployerConfig struct {
|
|||||||
|
|
||||||
type AliyunCLBDeployer struct {
|
type AliyunCLBDeployer struct {
|
||||||
config *AliyunCLBDeployerConfig
|
config *AliyunCLBDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
sdkClient *aliyunSlb.Client
|
sdkClient *aliyunSlb.Client
|
||||||
sslUploader uploader.Uploader
|
sslUploader uploader.Uploader
|
||||||
}
|
}
|
||||||
@ -42,10 +43,10 @@ type AliyunCLBDeployer struct {
|
|||||||
var _ deployer.Deployer = (*AliyunCLBDeployer)(nil)
|
var _ deployer.Deployer = (*AliyunCLBDeployer)(nil)
|
||||||
|
|
||||||
func New(config *AliyunCLBDeployerConfig) (*AliyunCLBDeployer, error) {
|
func New(config *AliyunCLBDeployerConfig) (*AliyunCLBDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *AliyunCLBDeployerConfig, logger deployer.Logger) (*AliyunCLBDeployer, error) {
|
func NewWithLogger(config *AliyunCLBDeployerConfig, logger logger.Logger) (*AliyunCLBDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@ import (
|
|||||||
xerrors "github.com/pkg/errors"
|
xerrors "github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
)
|
)
|
||||||
|
|
||||||
type AliyunDCDNDeployerConfig struct {
|
type AliyunDCDNDeployerConfig struct {
|
||||||
@ -26,17 +27,17 @@ type AliyunDCDNDeployerConfig struct {
|
|||||||
|
|
||||||
type AliyunDCDNDeployer struct {
|
type AliyunDCDNDeployer struct {
|
||||||
config *AliyunDCDNDeployerConfig
|
config *AliyunDCDNDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
sdkClient *aliyunDcdn.Client
|
sdkClient *aliyunDcdn.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ deployer.Deployer = (*AliyunDCDNDeployer)(nil)
|
var _ deployer.Deployer = (*AliyunDCDNDeployer)(nil)
|
||||||
|
|
||||||
func New(config *AliyunDCDNDeployerConfig) (*AliyunDCDNDeployer, error) {
|
func New(config *AliyunDCDNDeployerConfig) (*AliyunDCDNDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *AliyunDCDNDeployerConfig, logger deployer.Logger) (*AliyunDCDNDeployer, error) {
|
func NewWithLogger(config *AliyunDCDNDeployerConfig, logger logger.Logger) (*AliyunDCDNDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import (
|
|||||||
xerrors "github.com/pkg/errors"
|
xerrors "github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
||||||
providerCas "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/aliyun-cas"
|
providerCas "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/aliyun-cas"
|
||||||
)
|
)
|
||||||
@ -35,7 +36,7 @@ type AliyunNLBDeployerConfig struct {
|
|||||||
|
|
||||||
type AliyunNLBDeployer struct {
|
type AliyunNLBDeployer struct {
|
||||||
config *AliyunNLBDeployerConfig
|
config *AliyunNLBDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
sdkClient *aliyunNlb.Client
|
sdkClient *aliyunNlb.Client
|
||||||
sslUploader uploader.Uploader
|
sslUploader uploader.Uploader
|
||||||
}
|
}
|
||||||
@ -43,10 +44,10 @@ type AliyunNLBDeployer struct {
|
|||||||
var _ deployer.Deployer = (*AliyunNLBDeployer)(nil)
|
var _ deployer.Deployer = (*AliyunNLBDeployer)(nil)
|
||||||
|
|
||||||
func New(config *AliyunNLBDeployerConfig) (*AliyunNLBDeployer, error) {
|
func New(config *AliyunNLBDeployerConfig) (*AliyunNLBDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *AliyunNLBDeployerConfig, logger deployer.Logger) (*AliyunNLBDeployer, error) {
|
func NewWithLogger(config *AliyunNLBDeployerConfig, logger logger.Logger) (*AliyunNLBDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ import (
|
|||||||
xerrors "github.com/pkg/errors"
|
xerrors "github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
)
|
)
|
||||||
|
|
||||||
type AliyunOSSDeployerConfig struct {
|
type AliyunOSSDeployerConfig struct {
|
||||||
@ -26,17 +27,17 @@ type AliyunOSSDeployerConfig struct {
|
|||||||
|
|
||||||
type AliyunOSSDeployer struct {
|
type AliyunOSSDeployer struct {
|
||||||
config *AliyunOSSDeployerConfig
|
config *AliyunOSSDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
sdkClient *oss.Client
|
sdkClient *oss.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ deployer.Deployer = (*AliyunOSSDeployer)(nil)
|
var _ deployer.Deployer = (*AliyunOSSDeployer)(nil)
|
||||||
|
|
||||||
func New(config *AliyunOSSDeployerConfig) (*AliyunOSSDeployer, error) {
|
func New(config *AliyunOSSDeployerConfig) (*AliyunOSSDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *AliyunOSSDeployerConfig, logger deployer.Logger) (*AliyunOSSDeployer, error) {
|
func NewWithLogger(config *AliyunOSSDeployerConfig, logger logger.Logger) (*AliyunOSSDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import (
|
|||||||
xerrors "github.com/pkg/errors"
|
xerrors "github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
)
|
)
|
||||||
|
|
||||||
type BaiduCloudCDNDeployerConfig struct {
|
type BaiduCloudCDNDeployerConfig struct {
|
||||||
@ -18,23 +19,23 @@ type BaiduCloudCDNDeployerConfig struct {
|
|||||||
AccessKeyId string `json:"accessKeyId"`
|
AccessKeyId string `json:"accessKeyId"`
|
||||||
// 百度智能云 SecretAccessKey。
|
// 百度智能云 SecretAccessKey。
|
||||||
SecretAccessKey string `json:"secretAccessKey"`
|
SecretAccessKey string `json:"secretAccessKey"`
|
||||||
// 加速域名(不支持泛域名)。
|
// 加速域名(支持泛域名)。
|
||||||
Domain string `json:"domain"`
|
Domain string `json:"domain"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type BaiduCloudCDNDeployer struct {
|
type BaiduCloudCDNDeployer struct {
|
||||||
config *BaiduCloudCDNDeployerConfig
|
config *BaiduCloudCDNDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
sdkClient *bceCdn.Client
|
sdkClient *bceCdn.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ deployer.Deployer = (*BaiduCloudCDNDeployer)(nil)
|
var _ deployer.Deployer = (*BaiduCloudCDNDeployer)(nil)
|
||||||
|
|
||||||
func New(config *BaiduCloudCDNDeployerConfig) (*BaiduCloudCDNDeployer, error) {
|
func New(config *BaiduCloudCDNDeployerConfig) (*BaiduCloudCDNDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *BaiduCloudCDNDeployerConfig, logger deployer.Logger) (*BaiduCloudCDNDeployer, error) {
|
func NewWithLogger(config *BaiduCloudCDNDeployerConfig, logger logger.Logger) (*BaiduCloudCDNDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
xerrors "github.com/pkg/errors"
|
xerrors "github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
||||||
providerCdn "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/byteplus-cdn"
|
providerCdn "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/byteplus-cdn"
|
||||||
)
|
)
|
||||||
@ -25,7 +26,7 @@ type BytePlusCDNDeployerConfig struct {
|
|||||||
|
|
||||||
type BytePlusCDNDeployer struct {
|
type BytePlusCDNDeployer struct {
|
||||||
config *BytePlusCDNDeployerConfig
|
config *BytePlusCDNDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
sdkClient *bpCdn.CDN
|
sdkClient *bpCdn.CDN
|
||||||
sslUploader uploader.Uploader
|
sslUploader uploader.Uploader
|
||||||
}
|
}
|
||||||
@ -33,10 +34,10 @@ type BytePlusCDNDeployer struct {
|
|||||||
var _ deployer.Deployer = (*BytePlusCDNDeployer)(nil)
|
var _ deployer.Deployer = (*BytePlusCDNDeployer)(nil)
|
||||||
|
|
||||||
func New(config *BytePlusCDNDeployerConfig) (*BytePlusCDNDeployer, error) {
|
func New(config *BytePlusCDNDeployerConfig) (*BytePlusCDNDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *BytePlusCDNDeployerConfig, logger deployer.Logger) (*BytePlusCDNDeployer, error) {
|
func NewWithLogger(config *BytePlusCDNDeployerConfig, logger logger.Logger) (*BytePlusCDNDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ import (
|
|||||||
xerrors "github.com/pkg/errors"
|
xerrors "github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
||||||
providerDoge "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/dogecloud"
|
providerDoge "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/dogecloud"
|
||||||
dogesdk "github.com/usual2970/certimate/internal/pkg/vendors/dogecloud-sdk"
|
dogesdk "github.com/usual2970/certimate/internal/pkg/vendors/dogecloud-sdk"
|
||||||
@ -24,7 +25,7 @@ type DogeCloudCDNDeployerConfig struct {
|
|||||||
|
|
||||||
type DogeCloudCDNDeployer struct {
|
type DogeCloudCDNDeployer struct {
|
||||||
config *DogeCloudCDNDeployerConfig
|
config *DogeCloudCDNDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
sdkClient *dogesdk.Client
|
sdkClient *dogesdk.Client
|
||||||
sslUploader uploader.Uploader
|
sslUploader uploader.Uploader
|
||||||
}
|
}
|
||||||
@ -32,10 +33,10 @@ type DogeCloudCDNDeployer struct {
|
|||||||
var _ deployer.Deployer = (*DogeCloudCDNDeployer)(nil)
|
var _ deployer.Deployer = (*DogeCloudCDNDeployer)(nil)
|
||||||
|
|
||||||
func New(config *DogeCloudCDNDeployerConfig) (*DogeCloudCDNDeployer, error) {
|
func New(config *DogeCloudCDNDeployerConfig) (*DogeCloudCDNDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *DogeCloudCDNDeployerConfig, logger deployer.Logger) (*DogeCloudCDNDeployer, error) {
|
func NewWithLogger(config *DogeCloudCDNDeployerConfig, logger logger.Logger) (*DogeCloudCDNDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import (
|
|||||||
xerrors "github.com/pkg/errors"
|
xerrors "github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
||||||
providerScm "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/huaweicloud-scm"
|
providerScm "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/huaweicloud-scm"
|
||||||
"github.com/usual2970/certimate/internal/pkg/utils/cast"
|
"github.com/usual2970/certimate/internal/pkg/utils/cast"
|
||||||
@ -30,7 +31,7 @@ type HuaweiCloudCDNDeployerConfig struct {
|
|||||||
|
|
||||||
type HuaweiCloudCDNDeployer struct {
|
type HuaweiCloudCDNDeployer struct {
|
||||||
config *HuaweiCloudCDNDeployerConfig
|
config *HuaweiCloudCDNDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
sdkClient *huaweicloudsdk.Client
|
sdkClient *huaweicloudsdk.Client
|
||||||
sslUploader uploader.Uploader
|
sslUploader uploader.Uploader
|
||||||
}
|
}
|
||||||
@ -38,10 +39,10 @@ type HuaweiCloudCDNDeployer struct {
|
|||||||
var _ deployer.Deployer = (*HuaweiCloudCDNDeployer)(nil)
|
var _ deployer.Deployer = (*HuaweiCloudCDNDeployer)(nil)
|
||||||
|
|
||||||
func New(config *HuaweiCloudCDNDeployerConfig) (*HuaweiCloudCDNDeployer, error) {
|
func New(config *HuaweiCloudCDNDeployerConfig) (*HuaweiCloudCDNDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *HuaweiCloudCDNDeployerConfig, logger deployer.Logger) (*HuaweiCloudCDNDeployer, error) {
|
func NewWithLogger(config *HuaweiCloudCDNDeployerConfig, logger logger.Logger) (*HuaweiCloudCDNDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@ import (
|
|||||||
"golang.org/x/exp/slices"
|
"golang.org/x/exp/slices"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
||||||
providerElb "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/huaweicloud-elb"
|
providerElb "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/huaweicloud-elb"
|
||||||
"github.com/usual2970/certimate/internal/pkg/utils/cast"
|
"github.com/usual2970/certimate/internal/pkg/utils/cast"
|
||||||
@ -44,7 +45,7 @@ type HuaweiCloudELBDeployerConfig struct {
|
|||||||
|
|
||||||
type HuaweiCloudELBDeployer struct {
|
type HuaweiCloudELBDeployer struct {
|
||||||
config *HuaweiCloudELBDeployerConfig
|
config *HuaweiCloudELBDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
sdkClient *hcElb.ElbClient
|
sdkClient *hcElb.ElbClient
|
||||||
sslUploader uploader.Uploader
|
sslUploader uploader.Uploader
|
||||||
}
|
}
|
||||||
@ -52,10 +53,10 @@ type HuaweiCloudELBDeployer struct {
|
|||||||
var _ deployer.Deployer = (*HuaweiCloudELBDeployer)(nil)
|
var _ deployer.Deployer = (*HuaweiCloudELBDeployer)(nil)
|
||||||
|
|
||||||
func New(config *HuaweiCloudELBDeployerConfig) (*HuaweiCloudELBDeployer, error) {
|
func New(config *HuaweiCloudELBDeployerConfig) (*HuaweiCloudELBDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *HuaweiCloudELBDeployerConfig, logger deployer.Logger) (*HuaweiCloudELBDeployer, error) {
|
func NewWithLogger(config *HuaweiCloudELBDeployerConfig, logger logger.Logger) (*HuaweiCloudELBDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
|
@ -13,34 +13,37 @@ import (
|
|||||||
"k8s.io/client-go/tools/clientcmd"
|
"k8s.io/client-go/tools/clientcmd"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/utils/x509"
|
"github.com/usual2970/certimate/internal/pkg/utils/x509"
|
||||||
)
|
)
|
||||||
|
|
||||||
type K8sSecretDeployerConfig struct {
|
type K8sSecretDeployerConfig struct {
|
||||||
// kubeconfig 文件内容。
|
// kubeconfig 文件内容。
|
||||||
KubeConfig string `json:"kubeConfig,omitempty"`
|
KubeConfig string `json:"kubeConfig,omitempty"`
|
||||||
// K8s 命名空间。
|
// Kubernetes 命名空间。
|
||||||
Namespace string `json:"namespace,omitempty"`
|
Namespace string `json:"namespace,omitempty"`
|
||||||
// K8s Secret 名称。
|
// Kubernetes Secret 名称。
|
||||||
SecretName string `json:"secretName"`
|
SecretName string `json:"secretName"`
|
||||||
// K8s Secret 中用于存放证书的 Key。
|
// Kubernetes Secret 类型。
|
||||||
|
SecretType string `json:"secretType"`
|
||||||
|
// Kubernetes Secret 中用于存放证书的 Key。
|
||||||
SecretDataKeyForCrt string `json:"secretDataKeyForCrt,omitempty"`
|
SecretDataKeyForCrt string `json:"secretDataKeyForCrt,omitempty"`
|
||||||
// K8s Secret 中用于存放私钥的 Key。
|
// Kubernetes Secret 中用于存放私钥的 Key。
|
||||||
SecretDataKeyForKey string `json:"secretDataKeyForKey,omitempty"`
|
SecretDataKeyForKey string `json:"secretDataKeyForKey,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type K8sSecretDeployer struct {
|
type K8sSecretDeployer struct {
|
||||||
config *K8sSecretDeployerConfig
|
config *K8sSecretDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ deployer.Deployer = (*K8sSecretDeployer)(nil)
|
var _ deployer.Deployer = (*K8sSecretDeployer)(nil)
|
||||||
|
|
||||||
func New(config *K8sSecretDeployerConfig) (*K8sSecretDeployer, error) {
|
func New(config *K8sSecretDeployerConfig) (*K8sSecretDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *K8sSecretDeployerConfig, logger deployer.Logger) (*K8sSecretDeployer, error) {
|
func NewWithLogger(config *K8sSecretDeployerConfig, logger logger.Logger) (*K8sSecretDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
@ -101,7 +104,7 @@ func (d *K8sSecretDeployer) Deploy(ctx context.Context, certPem string, privkeyP
|
|||||||
Name: d.config.SecretName,
|
Name: d.config.SecretName,
|
||||||
Annotations: secretAnnotations,
|
Annotations: secretAnnotations,
|
||||||
},
|
},
|
||||||
Type: k8sCore.SecretType("kubernetes.io/tls"),
|
Type: k8sCore.SecretType(d.config.SecretType),
|
||||||
}
|
}
|
||||||
secretPayload.Data = make(map[string][]byte)
|
secretPayload.Data = make(map[string][]byte)
|
||||||
secretPayload.Data[d.config.SecretDataKeyForCrt] = []byte(certPem)
|
secretPayload.Data[d.config.SecretDataKeyForCrt] = []byte(certPem)
|
||||||
@ -117,7 +120,7 @@ func (d *K8sSecretDeployer) Deploy(ctx context.Context, certPem string, privkeyP
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 更新 Secret 实例
|
// 更新 Secret 实例
|
||||||
secretPayload.Type = k8sCore.SecretType("kubernetes.io/tls")
|
secretPayload.Type = k8sCore.SecretType(d.config.SecretType)
|
||||||
if secretPayload.ObjectMeta.Annotations == nil {
|
if secretPayload.ObjectMeta.Annotations == nil {
|
||||||
secretPayload.ObjectMeta.Annotations = secretAnnotations
|
secretPayload.ObjectMeta.Annotations = secretAnnotations
|
||||||
} else {
|
} else {
|
||||||
|
@ -11,6 +11,7 @@ import (
|
|||||||
xerrors "github.com/pkg/errors"
|
xerrors "github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/utils/fs"
|
"github.com/usual2970/certimate/internal/pkg/utils/fs"
|
||||||
"github.com/usual2970/certimate/internal/pkg/utils/x509"
|
"github.com/usual2970/certimate/internal/pkg/utils/x509"
|
||||||
)
|
)
|
||||||
@ -45,16 +46,16 @@ type LocalDeployerConfig struct {
|
|||||||
|
|
||||||
type LocalDeployer struct {
|
type LocalDeployer struct {
|
||||||
config *LocalDeployerConfig
|
config *LocalDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ deployer.Deployer = (*LocalDeployer)(nil)
|
var _ deployer.Deployer = (*LocalDeployer)(nil)
|
||||||
|
|
||||||
func New(config *LocalDeployerConfig) (*LocalDeployer, error) {
|
func New(config *LocalDeployerConfig) (*LocalDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *LocalDeployerConfig, logger deployer.Logger) (*LocalDeployer, error) {
|
func NewWithLogger(config *LocalDeployerConfig, logger logger.Logger) (*LocalDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ import (
|
|||||||
"github.com/qiniu/go-sdk/v7/auth"
|
"github.com/qiniu/go-sdk/v7/auth"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
||||||
providerQiniu "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/qiniu-sslcert"
|
providerQiniu "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/qiniu-sslcert"
|
||||||
qiniusdk "github.com/usual2970/certimate/internal/pkg/vendors/qiniu-sdk"
|
qiniusdk "github.com/usual2970/certimate/internal/pkg/vendors/qiniu-sdk"
|
||||||
@ -25,7 +26,7 @@ type QiniuCDNDeployerConfig struct {
|
|||||||
|
|
||||||
type QiniuCDNDeployer struct {
|
type QiniuCDNDeployer struct {
|
||||||
config *QiniuCDNDeployerConfig
|
config *QiniuCDNDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
sdkClient *qiniusdk.Client
|
sdkClient *qiniusdk.Client
|
||||||
sslUploader uploader.Uploader
|
sslUploader uploader.Uploader
|
||||||
}
|
}
|
||||||
@ -33,10 +34,10 @@ type QiniuCDNDeployer struct {
|
|||||||
var _ deployer.Deployer = (*QiniuCDNDeployer)(nil)
|
var _ deployer.Deployer = (*QiniuCDNDeployer)(nil)
|
||||||
|
|
||||||
func New(config *QiniuCDNDeployerConfig) (*QiniuCDNDeployer, error) {
|
func New(config *QiniuCDNDeployerConfig) (*QiniuCDNDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *QiniuCDNDeployerConfig, logger deployer.Logger) (*QiniuCDNDeployer, error) {
|
func NewWithLogger(config *QiniuCDNDeployerConfig, logger logger.Logger) (*QiniuCDNDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@ import (
|
|||||||
"golang.org/x/crypto/ssh"
|
"golang.org/x/crypto/ssh"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/utils/x509"
|
"github.com/usual2970/certimate/internal/pkg/utils/x509"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -57,16 +58,16 @@ type SshDeployerConfig struct {
|
|||||||
|
|
||||||
type SshDeployer struct {
|
type SshDeployer struct {
|
||||||
config *SshDeployerConfig
|
config *SshDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ deployer.Deployer = (*SshDeployer)(nil)
|
var _ deployer.Deployer = (*SshDeployer)(nil)
|
||||||
|
|
||||||
func New(config *SshDeployerConfig) (*SshDeployer, error) {
|
func New(config *SshDeployerConfig) (*SshDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *SshDeployerConfig, logger deployer.Logger) (*SshDeployer, error) {
|
func NewWithLogger(config *SshDeployerConfig, logger logger.Logger) (*SshDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
@ -208,8 +209,8 @@ func execSshCommand(sshCli *ssh.Client, command string) (string, string, error)
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", err
|
return "", "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
defer session.Close()
|
defer session.Close()
|
||||||
|
|
||||||
var stdoutBuf bytes.Buffer
|
var stdoutBuf bytes.Buffer
|
||||||
session.Stdout = &stdoutBuf
|
session.Stdout = &stdoutBuf
|
||||||
var stderrBuf bytes.Buffer
|
var stderrBuf bytes.Buffer
|
||||||
|
@ -74,7 +74,6 @@ func TestDeploy(t *testing.T) {
|
|||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("err: %+v", err)
|
t.Errorf("err: %+v", err)
|
||||||
panic(err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fInputCertData, _ := os.ReadFile(fInputCertPath)
|
fInputCertData, _ := os.ReadFile(fInputCertPath)
|
||||||
@ -82,7 +81,6 @@ func TestDeploy(t *testing.T) {
|
|||||||
res, err := deployer.Deploy(context.Background(), string(fInputCertData), string(fInputKeyData))
|
res, err := deployer.Deploy(context.Background(), string(fInputCertData), string(fInputKeyData))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("err: %+v", err)
|
t.Errorf("err: %+v", err)
|
||||||
panic(err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Logf("ok: %v", res)
|
t.Logf("ok: %v", res)
|
||||||
|
@ -13,6 +13,7 @@ import (
|
|||||||
"golang.org/x/exp/slices"
|
"golang.org/x/exp/slices"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
||||||
providerSsl "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/tencentcloud-ssl"
|
providerSsl "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/tencentcloud-ssl"
|
||||||
)
|
)
|
||||||
@ -28,7 +29,7 @@ type TencentCloudCDNDeployerConfig struct {
|
|||||||
|
|
||||||
type TencentCloudCDNDeployer struct {
|
type TencentCloudCDNDeployer struct {
|
||||||
config *TencentCloudCDNDeployerConfig
|
config *TencentCloudCDNDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
sdkClients *tencentCloudCDNDeployerSdkClients
|
sdkClients *tencentCloudCDNDeployerSdkClients
|
||||||
sslUploader uploader.Uploader
|
sslUploader uploader.Uploader
|
||||||
}
|
}
|
||||||
@ -41,10 +42,10 @@ type tencentCloudCDNDeployerSdkClients struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func New(config *TencentCloudCDNDeployerConfig) (*TencentCloudCDNDeployer, error) {
|
func New(config *TencentCloudCDNDeployerConfig) (*TencentCloudCDNDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *TencentCloudCDNDeployerConfig, logger deployer.Logger) (*TencentCloudCDNDeployer, error) {
|
func NewWithLogger(config *TencentCloudCDNDeployerConfig, logger logger.Logger) (*TencentCloudCDNDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import (
|
|||||||
tcSsl "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl/v20191205"
|
tcSsl "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl/v20191205"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
||||||
providerSsl "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/tencentcloud-ssl"
|
providerSsl "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/tencentcloud-ssl"
|
||||||
)
|
)
|
||||||
@ -38,7 +39,7 @@ type TencentCloudCLBDeployerConfig struct {
|
|||||||
|
|
||||||
type TencentCloudCLBDeployer struct {
|
type TencentCloudCLBDeployer struct {
|
||||||
config *TencentCloudCLBDeployerConfig
|
config *TencentCloudCLBDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
sdkClients *wSdkClients
|
sdkClients *wSdkClients
|
||||||
sslUploader uploader.Uploader
|
sslUploader uploader.Uploader
|
||||||
}
|
}
|
||||||
@ -51,10 +52,10 @@ type wSdkClients struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func New(config *TencentCloudCLBDeployerConfig) (*TencentCloudCLBDeployer, error) {
|
func New(config *TencentCloudCLBDeployerConfig) (*TencentCloudCLBDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *TencentCloudCLBDeployerConfig, logger deployer.Logger) (*TencentCloudCLBDeployer, error) {
|
func NewWithLogger(config *TencentCloudCLBDeployerConfig, logger logger.Logger) (*TencentCloudCLBDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import (
|
|||||||
tcSsl "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl/v20191205"
|
tcSsl "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl/v20191205"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
||||||
providerSsl "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/tencentcloud-ssl"
|
providerSsl "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/tencentcloud-ssl"
|
||||||
)
|
)
|
||||||
@ -30,7 +31,7 @@ type TencentCloudCOSDeployerConfig struct {
|
|||||||
|
|
||||||
type TencentCloudCOSDeployer struct {
|
type TencentCloudCOSDeployer struct {
|
||||||
config *TencentCloudCOSDeployerConfig
|
config *TencentCloudCOSDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
sdkClient *tcSsl.Client
|
sdkClient *tcSsl.Client
|
||||||
sslUploader uploader.Uploader
|
sslUploader uploader.Uploader
|
||||||
}
|
}
|
||||||
@ -38,10 +39,10 @@ type TencentCloudCOSDeployer struct {
|
|||||||
var _ deployer.Deployer = (*TencentCloudCOSDeployer)(nil)
|
var _ deployer.Deployer = (*TencentCloudCOSDeployer)(nil)
|
||||||
|
|
||||||
func New(config *TencentCloudCOSDeployerConfig) (*TencentCloudCOSDeployer, error) {
|
func New(config *TencentCloudCOSDeployerConfig) (*TencentCloudCOSDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *TencentCloudCOSDeployerConfig, logger deployer.Logger) (*TencentCloudCOSDeployer, error) {
|
func NewWithLogger(config *TencentCloudCOSDeployerConfig, logger logger.Logger) (*TencentCloudCOSDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import (
|
|||||||
tcSsl "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl/v20191205"
|
tcSsl "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl/v20191205"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
||||||
providerSsl "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/tencentcloud-ssl"
|
providerSsl "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/tencentcloud-ssl"
|
||||||
)
|
)
|
||||||
@ -27,7 +28,7 @@ type TencentCloudECDNDeployerConfig struct {
|
|||||||
|
|
||||||
type TencentCloudECDNDeployer struct {
|
type TencentCloudECDNDeployer struct {
|
||||||
config *TencentCloudECDNDeployerConfig
|
config *TencentCloudECDNDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
sdkClients *wSdkClients
|
sdkClients *wSdkClients
|
||||||
sslUploader uploader.Uploader
|
sslUploader uploader.Uploader
|
||||||
}
|
}
|
||||||
@ -40,10 +41,10 @@ type wSdkClients struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func New(config *TencentCloudECDNDeployerConfig) (*TencentCloudECDNDeployer, error) {
|
func New(config *TencentCloudECDNDeployerConfig) (*TencentCloudECDNDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *TencentCloudECDNDeployerConfig, logger deployer.Logger) (*TencentCloudECDNDeployer, error) {
|
func NewWithLogger(config *TencentCloudECDNDeployerConfig, logger logger.Logger) (*TencentCloudECDNDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import (
|
|||||||
tcTeo "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo/v20220901"
|
tcTeo "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo/v20220901"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
||||||
providerSsl "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/tencentcloud-ssl"
|
providerSsl "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/tencentcloud-ssl"
|
||||||
)
|
)
|
||||||
@ -28,7 +29,7 @@ type TencentCloudEODeployerConfig struct {
|
|||||||
|
|
||||||
type TencentCloudEODeployer struct {
|
type TencentCloudEODeployer struct {
|
||||||
config *TencentCloudEODeployerConfig
|
config *TencentCloudEODeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
sdkClients *wSdkClients
|
sdkClients *wSdkClients
|
||||||
sslUploader uploader.Uploader
|
sslUploader uploader.Uploader
|
||||||
}
|
}
|
||||||
@ -41,10 +42,10 @@ type wSdkClients struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func New(config *TencentCloudEODeployerConfig) (*TencentCloudEODeployer, error) {
|
func New(config *TencentCloudEODeployerConfig) (*TencentCloudEODeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *TencentCloudEODeployerConfig, logger deployer.Logger) (*TencentCloudEODeployer, error) {
|
func NewWithLogger(config *TencentCloudEODeployerConfig, logger logger.Logger) (*TencentCloudEODeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
veCdn "github.com/volcengine/volc-sdk-golang/service/cdn"
|
veCdn "github.com/volcengine/volc-sdk-golang/service/cdn"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
||||||
providerCdn "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/volcengine-cdn"
|
providerCdn "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/volcengine-cdn"
|
||||||
)
|
)
|
||||||
@ -25,7 +26,7 @@ type VolcEngineCDNDeployerConfig struct {
|
|||||||
|
|
||||||
type VolcEngineCDNDeployer struct {
|
type VolcEngineCDNDeployer struct {
|
||||||
config *VolcEngineCDNDeployerConfig
|
config *VolcEngineCDNDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
sdkClient *veCdn.CDN
|
sdkClient *veCdn.CDN
|
||||||
sslUploader uploader.Uploader
|
sslUploader uploader.Uploader
|
||||||
}
|
}
|
||||||
@ -33,10 +34,10 @@ type VolcEngineCDNDeployer struct {
|
|||||||
var _ deployer.Deployer = (*VolcEngineCDNDeployer)(nil)
|
var _ deployer.Deployer = (*VolcEngineCDNDeployer)(nil)
|
||||||
|
|
||||||
func New(config *VolcEngineCDNDeployerConfig) (*VolcEngineCDNDeployer, error) {
|
func New(config *VolcEngineCDNDeployerConfig) (*VolcEngineCDNDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *VolcEngineCDNDeployerConfig, logger deployer.Logger) (*VolcEngineCDNDeployer, error) {
|
func NewWithLogger(config *VolcEngineCDNDeployerConfig, logger logger.Logger) (*VolcEngineCDNDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
veLive "github.com/volcengine/volc-sdk-golang/service/live/v20230101"
|
veLive "github.com/volcengine/volc-sdk-golang/service/live/v20230101"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
"github.com/usual2970/certimate/internal/pkg/core/uploader"
|
||||||
providerLive "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/volcengine-live"
|
providerLive "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/volcengine-live"
|
||||||
"github.com/usual2970/certimate/internal/pkg/utils/cast"
|
"github.com/usual2970/certimate/internal/pkg/utils/cast"
|
||||||
@ -26,7 +27,7 @@ type VolcEngineLiveDeployerConfig struct {
|
|||||||
|
|
||||||
type VolcEngineLiveDeployer struct {
|
type VolcEngineLiveDeployer struct {
|
||||||
config *VolcEngineLiveDeployerConfig
|
config *VolcEngineLiveDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
sdkClient *veLive.Live
|
sdkClient *veLive.Live
|
||||||
sslUploader uploader.Uploader
|
sslUploader uploader.Uploader
|
||||||
}
|
}
|
||||||
@ -34,10 +35,10 @@ type VolcEngineLiveDeployer struct {
|
|||||||
var _ deployer.Deployer = (*VolcEngineLiveDeployer)(nil)
|
var _ deployer.Deployer = (*VolcEngineLiveDeployer)(nil)
|
||||||
|
|
||||||
func New(config *VolcEngineLiveDeployerConfig) (*VolcEngineLiveDeployer, error) {
|
func New(config *VolcEngineLiveDeployerConfig) (*VolcEngineLiveDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *VolcEngineLiveDeployerConfig, logger deployer.Logger) (*VolcEngineLiveDeployer, error) {
|
func NewWithLogger(config *VolcEngineLiveDeployerConfig, logger logger.Logger) (*VolcEngineLiveDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
|
@ -5,35 +5,38 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"net/http"
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/gojek/heimdall/v7/httpclient"
|
||||||
xerrors "github.com/pkg/errors"
|
xerrors "github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
||||||
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
"github.com/usual2970/certimate/internal/pkg/utils/x509"
|
"github.com/usual2970/certimate/internal/pkg/utils/x509"
|
||||||
xhttp "github.com/usual2970/certimate/internal/utils/http"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type WebhookDeployerConfig struct {
|
type WebhookDeployerConfig struct {
|
||||||
// Webhook URL。
|
// Webhook URL。
|
||||||
Url string `json:"url"`
|
WebhookUrl string `json:"webhookUrl"`
|
||||||
// Webhook 变量字典。
|
// Webhook 回调数据(JSON 格式)。
|
||||||
Variables map[string]string `json:"variables,omitempty"`
|
WebhookData string `json:"webhookData,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type WebhookDeployer struct {
|
type WebhookDeployer struct {
|
||||||
config *WebhookDeployerConfig
|
config *WebhookDeployerConfig
|
||||||
logger deployer.Logger
|
logger logger.Logger
|
||||||
|
httpClient *httpclient.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ deployer.Deployer = (*WebhookDeployer)(nil)
|
var _ deployer.Deployer = (*WebhookDeployer)(nil)
|
||||||
|
|
||||||
func New(config *WebhookDeployerConfig) (*WebhookDeployer, error) {
|
func New(config *WebhookDeployerConfig) (*WebhookDeployer, error) {
|
||||||
return NewWithLogger(config, deployer.NewNilLogger())
|
return NewWithLogger(config, logger.NewNilLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWithLogger(config *WebhookDeployerConfig, logger deployer.Logger) (*WebhookDeployer, error) {
|
func NewWithLogger(config *WebhookDeployerConfig, logger logger.Logger) (*WebhookDeployer, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, errors.New("config is nil")
|
return nil, errors.New("config is nil")
|
||||||
}
|
}
|
||||||
@ -42,44 +45,66 @@ func NewWithLogger(config *WebhookDeployerConfig, logger deployer.Logger) (*Webh
|
|||||||
return nil, errors.New("logger is nil")
|
return nil, errors.New("logger is nil")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
client := httpclient.NewClient(httpclient.WithHTTPTimeout(30 * time.Second))
|
||||||
|
|
||||||
return &WebhookDeployer{
|
return &WebhookDeployer{
|
||||||
config: config,
|
config: config,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
|
httpClient: client,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type webhookData struct {
|
|
||||||
SubjectAltNames string `json:"subjectAltNames"`
|
|
||||||
Certificate string `json:"certificate"`
|
|
||||||
PrivateKey string `json:"privateKey"`
|
|
||||||
Variables map[string]string `json:"variables"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *WebhookDeployer) Deploy(ctx context.Context, certPem string, privkeyPem string) (*deployer.DeployResult, error) {
|
func (d *WebhookDeployer) Deploy(ctx context.Context, certPem string, privkeyPem string) (*deployer.DeployResult, error) {
|
||||||
certX509, err := x509.ParseCertificateFromPEM(certPem)
|
certX509, err := x509.ParseCertificateFromPEM(certPem)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Wrap(err, "failed to parse x509")
|
return nil, xerrors.Wrap(err, "failed to parse x509")
|
||||||
}
|
}
|
||||||
|
|
||||||
data := &webhookData{
|
var webhookData interface{}
|
||||||
SubjectAltNames: strings.Join(certX509.DNSNames, ","),
|
err = json.Unmarshal([]byte(d.config.WebhookData), &webhookData)
|
||||||
Certificate: certPem,
|
if err != nil {
|
||||||
PrivateKey: privkeyPem,
|
return nil, xerrors.Wrap(err, "failed to unmarshall webhook data")
|
||||||
Variables: d.config.Variables,
|
|
||||||
}
|
}
|
||||||
body, _ := json.Marshal(data)
|
|
||||||
resp, err := xhttp.Req(d.config.Url, http.MethodPost, bytes.NewReader(body), map[string]string{
|
replaceJsonValueRecursively(webhookData, "${DOMAIN}", certX509.Subject.CommonName)
|
||||||
"Content-Type": "application/json",
|
replaceJsonValueRecursively(webhookData, "${DOMAINS}", strings.Join(certX509.DNSNames, ";"))
|
||||||
})
|
replaceJsonValueRecursively(webhookData, "${SUBJECT_ALT_NAMES}", strings.Join(certX509.DNSNames, ";"))
|
||||||
|
replaceJsonValueRecursively(webhookData, "${CERTIFICATE}", certPem)
|
||||||
|
replaceJsonValueRecursively(webhookData, "${PRIVATE_KEY}", privkeyPem)
|
||||||
|
|
||||||
|
reqBody, _ := json.Marshal(&webhookData)
|
||||||
|
resp, err := d.httpClient.Post(d.config.WebhookUrl, bytes.NewReader(reqBody), map[string][]string{"Content-Type": {"application/json"}})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Wrap(err, "failed to send webhook request")
|
return nil, xerrors.Wrap(err, "failed to send webhook request")
|
||||||
}
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
d.logger.Logt("Webhook Response", string(resp))
|
respBody, err := io.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, xerrors.Wrap(err, "failed to read response body")
|
||||||
|
}
|
||||||
|
|
||||||
|
d.logger.Logt("Webhook Response", string(respBody))
|
||||||
|
|
||||||
return &deployer.DeployResult{
|
return &deployer.DeployResult{
|
||||||
DeploymentData: map[string]any{
|
ExtendedData: map[string]any{
|
||||||
"responseText": string(resp),
|
"responseText": string(respBody),
|
||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func replaceJsonValueRecursively(data interface{}, oldStr, newStr string) interface{} {
|
||||||
|
switch v := data.(type) {
|
||||||
|
case map[string]interface{}:
|
||||||
|
for k, val := range v {
|
||||||
|
v[k] = replaceJsonValueRecursively(val, oldStr, newStr)
|
||||||
|
}
|
||||||
|
case []interface{}:
|
||||||
|
for i, val := range v {
|
||||||
|
v[i] = replaceJsonValueRecursively(val, oldStr, newStr)
|
||||||
|
}
|
||||||
|
case string:
|
||||||
|
return strings.ReplaceAll(v, oldStr, newStr)
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
@ -14,7 +14,8 @@ import (
|
|||||||
var (
|
var (
|
||||||
fInputCertPath string
|
fInputCertPath string
|
||||||
fInputKeyPath string
|
fInputKeyPath string
|
||||||
fUrl string
|
fWebhookUrl string
|
||||||
|
fWebhookData string
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@ -22,7 +23,8 @@ func init() {
|
|||||||
|
|
||||||
flag.StringVar(&fInputCertPath, argsPrefix+"INPUTCERTPATH", "", "")
|
flag.StringVar(&fInputCertPath, argsPrefix+"INPUTCERTPATH", "", "")
|
||||||
flag.StringVar(&fInputKeyPath, argsPrefix+"INPUTKEYPATH", "", "")
|
flag.StringVar(&fInputKeyPath, argsPrefix+"INPUTKEYPATH", "", "")
|
||||||
flag.StringVar(&fUrl, argsPrefix+"URL", "", "")
|
flag.StringVar(&fWebhookUrl, argsPrefix+"URL", "", "")
|
||||||
|
flag.StringVar(&fWebhookData, argsPrefix+"DATA", "", "")
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -31,7 +33,8 @@ Shell command to run this test:
|
|||||||
go test -v webhook_test.go -args \
|
go test -v webhook_test.go -args \
|
||||||
--CERTIMATE_DEPLOYER_WEBHOOK_INPUTCERTPATH="/path/to/your-input-cert.pem" \
|
--CERTIMATE_DEPLOYER_WEBHOOK_INPUTCERTPATH="/path/to/your-input-cert.pem" \
|
||||||
--CERTIMATE_DEPLOYER_WEBHOOK_INPUTKEYPATH="/path/to/your-input-key.pem" \
|
--CERTIMATE_DEPLOYER_WEBHOOK_INPUTKEYPATH="/path/to/your-input-key.pem" \
|
||||||
--CERTIMATE_DEPLOYER_WEBHOOK_URL="https://example.com/your-webhook-url"
|
--CERTIMATE_DEPLOYER_WEBHOOK_URL="https://example.com/your-webhook-url" \
|
||||||
|
--CERTIMATE_DEPLOYER_WEBHOOK_DATA="{\"certificate\":\"${Certificate}\",\"privateKey\":\"${PrivateKey}\"}"
|
||||||
*/
|
*/
|
||||||
func TestDeploy(t *testing.T) {
|
func TestDeploy(t *testing.T) {
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
@ -41,11 +44,13 @@ func TestDeploy(t *testing.T) {
|
|||||||
"args:",
|
"args:",
|
||||||
fmt.Sprintf("INPUTCERTPATH: %v", fInputCertPath),
|
fmt.Sprintf("INPUTCERTPATH: %v", fInputCertPath),
|
||||||
fmt.Sprintf("INPUTKEYPATH: %v", fInputKeyPath),
|
fmt.Sprintf("INPUTKEYPATH: %v", fInputKeyPath),
|
||||||
fmt.Sprintf("URL: %v", fUrl),
|
fmt.Sprintf("WEBHOOKURL: %v", fWebhookUrl),
|
||||||
|
fmt.Sprintf("WEBHOOKDATA: %v", fWebhookData),
|
||||||
}, "\n"))
|
}, "\n"))
|
||||||
|
|
||||||
deployer, err := provider.New(&provider.WebhookDeployerConfig{
|
deployer, err := provider.New(&provider.WebhookDeployerConfig{
|
||||||
Url: fUrl,
|
WebhookUrl: fWebhookUrl,
|
||||||
|
WebhookData: fWebhookData,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("err: %+v", err)
|
t.Errorf("err: %+v", err)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package deployer
|
package logger
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
@ -7,31 +7,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 表示定义证书部署器的日志记录器的抽象类型接口。
|
|
||||||
type Logger interface {
|
|
||||||
// 追加一条日志记录。
|
|
||||||
// 该方法会将 `data` 以 JSON 序列化后拼接到 `tag` 结尾。
|
|
||||||
//
|
|
||||||
// 入参:
|
|
||||||
// - tag:标签。
|
|
||||||
// - data:数据。
|
|
||||||
Logt(tag string, data ...any)
|
|
||||||
|
|
||||||
// 追加一条日志记录。
|
|
||||||
// 该方法会将 `args` 以 `format` 格式化。
|
|
||||||
//
|
|
||||||
// 入参:
|
|
||||||
// - format:格式化字符串。
|
|
||||||
// - args:格式化参数。
|
|
||||||
Logf(format string, args ...any)
|
|
||||||
|
|
||||||
// 获取所有日志记录。
|
|
||||||
GetRecords() []string
|
|
||||||
|
|
||||||
// 清空所有日志记录。
|
|
||||||
FlushRecords()
|
|
||||||
}
|
|
||||||
|
|
||||||
// 表示默认的日志记录器类型。
|
// 表示默认的日志记录器类型。
|
||||||
type DefaultLogger struct {
|
type DefaultLogger struct {
|
||||||
records []string
|
records []string
|
27
internal/pkg/core/logger/logger.go
Normal file
27
internal/pkg/core/logger/logger.go
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package logger
|
||||||
|
|
||||||
|
// 表示定义日志记录器的抽象类型接口。
|
||||||
|
type Logger interface {
|
||||||
|
// 追加一条日志记录。
|
||||||
|
// 该方法会将 `data` 以 JSON 序列化后拼接到 `tag` 结尾。
|
||||||
|
//
|
||||||
|
// 入参:
|
||||||
|
// - tag:标签。
|
||||||
|
// - data:数据。
|
||||||
|
Logt(tag string, data ...any)
|
||||||
|
|
||||||
|
// 追加一条日志记录。
|
||||||
|
// 该方法会将 `args` 以 `format` 格式化。
|
||||||
|
//
|
||||||
|
// 入参:
|
||||||
|
// - format:格式化字符串。
|
||||||
|
// - args:格式化参数。
|
||||||
|
Logf(format string, args ...any)
|
||||||
|
|
||||||
|
// 获取所有日志记录。
|
||||||
|
// TODO: 记录时间
|
||||||
|
GetRecords() []string
|
||||||
|
|
||||||
|
// 清空所有日志记录。
|
||||||
|
FlushRecords()
|
||||||
|
}
|
@ -1,9 +1,9 @@
|
|||||||
package deployer_test
|
package logger_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/pkg/core/deployer"
|
"github.com/usual2970/certimate/internal/pkg/core/logger"
|
||||||
)
|
)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -13,7 +13,7 @@ Shell command to run this test:
|
|||||||
*/
|
*/
|
||||||
func TestLogger(t *testing.T) {
|
func TestLogger(t *testing.T) {
|
||||||
t.Run("Logger_Appendt", func(t *testing.T) {
|
t.Run("Logger_Appendt", func(t *testing.T) {
|
||||||
logger := deployer.NewDefaultLogger()
|
logger := logger.NewDefaultLogger()
|
||||||
|
|
||||||
logger.Logt("test")
|
logger.Logt("test")
|
||||||
logger.Logt("test_nil", nil)
|
logger.Logt("test_nil", nil)
|
||||||
@ -34,7 +34,7 @@ func TestLogger(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Logger_Appendf", func(t *testing.T) {
|
t.Run("Logger_Appendf", func(t *testing.T) {
|
||||||
logger := deployer.NewDefaultLogger()
|
logger := logger.NewDefaultLogger()
|
||||||
|
|
||||||
logger.Logf("test")
|
logger.Logf("test")
|
||||||
logger.Logf("test_nil: %v", nil)
|
logger.Logf("test_nil: %v", nil)
|
@ -19,5 +19,5 @@ type Notifier interface {
|
|||||||
|
|
||||||
// 表示通知发送结果的数据结构。
|
// 表示通知发送结果的数据结构。
|
||||||
type NotifyResult struct {
|
type NotifyResult struct {
|
||||||
NotificationData map[string]any `json:"notificationData,omitempty"`
|
ExtendedData map[string]any `json:"extendedData,omitempty"`
|
||||||
}
|
}
|
||||||
|
@ -23,5 +23,5 @@ type Uploader interface {
|
|||||||
type UploadResult struct {
|
type UploadResult struct {
|
||||||
CertId string `json:"certId"`
|
CertId string `json:"certId"`
|
||||||
CertName string `json:"certName"`
|
CertName string `json:"certName"`
|
||||||
CertData map[string]any `json:"certData,omitempty"`
|
ExtendedData map[string]any `json:"extendedData,omitempty"`
|
||||||
}
|
}
|
||||||
|
@ -118,6 +118,12 @@ func GetValueOrDefaultAsInt64(dict map[string]any, key string, defaultValue int6
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if result, ok := value.(int32); ok {
|
||||||
|
if result != 0 {
|
||||||
|
return int64(result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 兼容字符串类型的值
|
// 兼容字符串类型的值
|
||||||
if str, ok := value.(string); ok {
|
if str, ok := value.(string); ok {
|
||||||
if result, err := strconv.ParseInt(str, 10, 64); err == nil {
|
if result, err := strconv.ParseInt(str, 10, 64); err == nil {
|
||||||
|
@ -5,8 +5,8 @@ import (
|
|||||||
"database/sql"
|
"database/sql"
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
|
"github.com/usual2970/certimate/internal/app"
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
"github.com/usual2970/certimate/internal/domain"
|
||||||
"github.com/usual2970/certimate/internal/utils/app"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type AccessRepository struct{}
|
type AccessRepository struct{}
|
||||||
@ -24,16 +24,16 @@ func (a *AccessRepository) GetById(ctx context.Context, id string) (*domain.Acce
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
rs := &domain.Access{
|
access := &domain.Access{
|
||||||
Meta: domain.Meta{
|
Meta: domain.Meta{
|
||||||
Id: record.GetId(),
|
Id: record.GetId(),
|
||||||
Created: record.GetTime("created"),
|
CreatedAt: record.GetCreated().Time(),
|
||||||
Updated: record.GetTime("updated"),
|
UpdatedAt: record.GetUpdated().Time(),
|
||||||
},
|
},
|
||||||
Name: record.GetString("name"),
|
Name: record.GetString("name"),
|
||||||
|
Provider: record.GetString("provider"),
|
||||||
Config: record.GetString("config"),
|
Config: record.GetString("config"),
|
||||||
ConfigType: record.GetString("configType"),
|
|
||||||
Usage: record.GetString("usage"),
|
Usage: record.GetString("usage"),
|
||||||
}
|
}
|
||||||
return rs, nil
|
return access, nil
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,10 @@ import (
|
|||||||
"github.com/go-acme/lego/v4/registration"
|
"github.com/go-acme/lego/v4/registration"
|
||||||
"github.com/pocketbase/dbx"
|
"github.com/pocketbase/dbx"
|
||||||
"github.com/pocketbase/pocketbase/models"
|
"github.com/pocketbase/pocketbase/models"
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
|
||||||
"github.com/usual2970/certimate/internal/utils/app"
|
|
||||||
"golang.org/x/sync/singleflight"
|
"golang.org/x/sync/singleflight"
|
||||||
|
|
||||||
|
"github.com/usual2970/certimate/internal/app"
|
||||||
|
"github.com/usual2970/certimate/internal/domain"
|
||||||
)
|
)
|
||||||
|
|
||||||
type AcmeAccountRepository struct{}
|
type AcmeAccountRepository struct{}
|
||||||
@ -46,13 +47,15 @@ func (r *AcmeAccountRepository) GetByCAAndEmail(ca, email string) (*domain.AcmeA
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &domain.AcmeAccount{
|
return &domain.AcmeAccount{
|
||||||
Id: record.GetString("id"),
|
Meta: domain.Meta{
|
||||||
Ca: record.GetString("ca"),
|
Id: record.GetId(),
|
||||||
|
CreatedAt: record.GetCreated().Time(),
|
||||||
|
UpdatedAt: record.GetUpdated().Time(),
|
||||||
|
},
|
||||||
|
CA: record.GetString("ca"),
|
||||||
Email: record.GetString("email"),
|
Email: record.GetString("email"),
|
||||||
Key: record.GetString("key"),
|
Key: record.GetString("key"),
|
||||||
Resource: resource,
|
Resource: resource,
|
||||||
Created: record.GetTime("created"),
|
|
||||||
Updated: record.GetTime("updated"),
|
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,8 +3,8 @@ package repository
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
|
"github.com/usual2970/certimate/internal/app"
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
"github.com/usual2970/certimate/internal/domain"
|
||||||
"github.com/usual2970/certimate/internal/utils/app"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type CertificateRepository struct{}
|
type CertificateRepository struct{}
|
||||||
@ -13,12 +13,14 @@ func NewCertificateRepository() *CertificateRepository {
|
|||||||
return &CertificateRepository{}
|
return &CertificateRepository{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *CertificateRepository) GetExpireSoon(ctx context.Context) ([]domain.Certificate, error) {
|
func (c *CertificateRepository) ListExpireSoon(ctx context.Context) ([]domain.Certificate, error) {
|
||||||
rs := []domain.Certificate{}
|
certificates := []domain.Certificate{}
|
||||||
if err := app.GetApp().Dao().DB().
|
err := app.GetApp().Dao().DB().
|
||||||
NewQuery("select * from certificate where expireAt > datetime('now') and expireAt < datetime('now', '+20 days')").
|
NewQuery("SELECT * FROM certificate WHERE expireAt > DATETIME('now') AND expireAt < DATETIME('now', '+20 days')").
|
||||||
All(&rs); err != nil {
|
All(&certificates)
|
||||||
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return rs, nil
|
|
||||||
|
return certificates, nil
|
||||||
}
|
}
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
package repository
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
|
||||||
"github.com/usual2970/certimate/internal/utils/app"
|
|
||||||
)
|
|
||||||
|
|
||||||
type SettingRepository struct{}
|
|
||||||
|
|
||||||
func NewSettingRepository() *SettingRepository {
|
|
||||||
return &SettingRepository{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *SettingRepository) GetByName(ctx context.Context, name string) (*domain.Setting, error) {
|
|
||||||
resp, err := app.GetApp().Dao().FindFirstRecordByFilter("settings", "name='"+name+"'")
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
rs := &domain.Setting{
|
|
||||||
ID: resp.GetString("id"),
|
|
||||||
Name: resp.GetString("name"),
|
|
||||||
Content: resp.GetString("content"),
|
|
||||||
Created: resp.GetTime("created"),
|
|
||||||
Updated: resp.GetTime("updated"),
|
|
||||||
}
|
|
||||||
|
|
||||||
return rs, nil
|
|
||||||
}
|
|
33
internal/repository/settings.go
Normal file
33
internal/repository/settings.go
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
package repository
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/pocketbase/dbx"
|
||||||
|
"github.com/usual2970/certimate/internal/app"
|
||||||
|
"github.com/usual2970/certimate/internal/domain"
|
||||||
|
)
|
||||||
|
|
||||||
|
type SettingsRepository struct{}
|
||||||
|
|
||||||
|
func NewSettingsRepository() *SettingsRepository {
|
||||||
|
return &SettingsRepository{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SettingsRepository) GetByName(ctx context.Context, name string) (*domain.Settings, error) {
|
||||||
|
record, err := app.GetApp().Dao().FindFirstRecordByFilter("settings", "name={:name}", dbx.Params{"name": name})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
settings := &domain.Settings{
|
||||||
|
Meta: domain.Meta{
|
||||||
|
Id: record.GetId(),
|
||||||
|
CreatedAt: record.GetCreated().Time(),
|
||||||
|
UpdatedAt: record.GetUpdated().Time(),
|
||||||
|
},
|
||||||
|
Name: record.GetString("name"),
|
||||||
|
Content: record.GetString("content"),
|
||||||
|
}
|
||||||
|
return settings, nil
|
||||||
|
}
|
@ -3,8 +3,8 @@ package repository
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
|
"github.com/usual2970/certimate/internal/app"
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
"github.com/usual2970/certimate/internal/domain"
|
||||||
"github.com/usual2970/certimate/internal/utils/app"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type StatisticsRepository struct{}
|
type StatisticsRepository struct{}
|
||||||
@ -13,47 +13,54 @@ func NewStatisticsRepository() *StatisticsRepository {
|
|||||||
return &StatisticsRepository{}
|
return &StatisticsRepository{}
|
||||||
}
|
}
|
||||||
|
|
||||||
type totalResp struct {
|
|
||||||
Total int `json:"total" db:"total"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *StatisticsRepository) Get(ctx context.Context) (*domain.Statistics, error) {
|
func (r *StatisticsRepository) Get(ctx context.Context) (*domain.Statistics, error) {
|
||||||
rs := &domain.Statistics{}
|
rs := &domain.Statistics{}
|
||||||
|
|
||||||
// 所有证书
|
// 所有证书
|
||||||
certTotal := totalResp{}
|
certTotal := struct {
|
||||||
if err := app.GetApp().Dao().DB().NewQuery("select count(*) as total from certificate").One(&certTotal); err != nil {
|
Total int `db:"total"`
|
||||||
|
}{}
|
||||||
|
if err := app.GetApp().Dao().DB().NewQuery("SELECT COUNT(*) AS total FROM certificate").One(&certTotal); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
rs.CertificateTotal = certTotal.Total
|
rs.CertificateTotal = certTotal.Total
|
||||||
|
|
||||||
// 即将过期证书
|
// 即将过期证书
|
||||||
certExpireSoonTotal := totalResp{}
|
certExpireSoonTotal := struct {
|
||||||
|
Total int `db:"total"`
|
||||||
|
}{}
|
||||||
if err := app.GetApp().Dao().DB().
|
if err := app.GetApp().Dao().DB().
|
||||||
NewQuery("select count(*) as total from certificate where expireAt > datetime('now') and expireAt < datetime('now', '+20 days')").
|
NewQuery("SELECT COUNT(*) AS total FROM certificate WHERE expireAt > DATETIME('now') and expireAt < DATETIME('now', '+20 days')").
|
||||||
One(&certExpireSoonTotal); err != nil {
|
One(&certExpireSoonTotal); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
rs.CertificateExpireSoon = certExpireSoonTotal.Total
|
rs.CertificateExpireSoon = certExpireSoonTotal.Total
|
||||||
|
|
||||||
// 已过期证书
|
// 已过期证书
|
||||||
certExpiredTotal := totalResp{}
|
certExpiredTotal := struct {
|
||||||
|
Total int `db:"total"`
|
||||||
|
}{}
|
||||||
if err := app.GetApp().Dao().DB().
|
if err := app.GetApp().Dao().DB().
|
||||||
NewQuery("select count(*) as total from certificate where expireAt < datetime('now')").
|
NewQuery("SELECT COUNT(*) AS total FROM certificate WHERE expireAt < DATETIME('now')").
|
||||||
One(&certExpiredTotal); err != nil {
|
One(&certExpiredTotal); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
rs.CertificateExpired = certExpiredTotal.Total
|
rs.CertificateExpired = certExpiredTotal.Total
|
||||||
|
|
||||||
// 所有工作流
|
// 所有工作流
|
||||||
workflowTotal := totalResp{}
|
workflowTotal := struct {
|
||||||
if err := app.GetApp().Dao().DB().NewQuery("select count(*) as total from workflow").One(&workflowTotal); err != nil {
|
Total int `db:"total"`
|
||||||
|
}{}
|
||||||
|
if err := app.GetApp().Dao().DB().NewQuery("SELECT COUNT(*) AS total FROM workflow").One(&workflowTotal); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
rs.WorkflowTotal = workflowTotal.Total
|
rs.WorkflowTotal = workflowTotal.Total
|
||||||
|
|
||||||
// 已启用工作流
|
// 已启用工作流
|
||||||
workflowEnabledTotal := totalResp{}
|
workflowEnabledTotal := struct {
|
||||||
if err := app.GetApp().Dao().DB().NewQuery("select count(*) as total from workflow where enabled is TRUE").One(&workflowEnabledTotal); err != nil {
|
Total int `db:"total"`
|
||||||
|
}{}
|
||||||
|
if err := app.GetApp().Dao().DB().NewQuery("SELECT COUNT(*) AS total FROM workflow WHERE enabled IS TRUE").One(&workflowEnabledTotal); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
rs.WorkflowEnabled = workflowEnabledTotal.Total
|
rs.WorkflowEnabled = workflowEnabledTotal.Total
|
||||||
|
@ -6,9 +6,10 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"github.com/pocketbase/dbx"
|
"github.com/pocketbase/dbx"
|
||||||
|
"github.com/pocketbase/pocketbase/daos"
|
||||||
"github.com/pocketbase/pocketbase/models"
|
"github.com/pocketbase/pocketbase/models"
|
||||||
|
"github.com/usual2970/certimate/internal/app"
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
"github.com/usual2970/certimate/internal/domain"
|
||||||
"github.com/usual2970/certimate/internal/utils/app"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type WorkflowRepository struct{}
|
type WorkflowRepository struct{}
|
||||||
@ -20,12 +21,13 @@ func NewWorkflowRepository() *WorkflowRepository {
|
|||||||
func (w *WorkflowRepository) ListEnabledAuto(ctx context.Context) ([]domain.Workflow, error) {
|
func (w *WorkflowRepository) ListEnabledAuto(ctx context.Context) ([]domain.Workflow, error) {
|
||||||
records, err := app.GetApp().Dao().FindRecordsByFilter(
|
records, err := app.GetApp().Dao().FindRecordsByFilter(
|
||||||
"workflow",
|
"workflow",
|
||||||
"enabled={:enabled} && type={:type}",
|
"enabled={:enabled} && trigger={:trigger}",
|
||||||
"-created", 1000, 0, dbx.Params{"enabled": true, "type": domain.WorkflowTypeAuto},
|
"-created", 1000, 0, dbx.Params{"enabled": true, "trigger": domain.WorkflowTriggerTypeAuto},
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
rs := make([]domain.Workflow, 0)
|
rs := make([]domain.Workflow, 0)
|
||||||
for _, record := range records {
|
for _, record := range records {
|
||||||
workflow, err := record2Workflow(record)
|
workflow, err := record2Workflow(record)
|
||||||
@ -34,25 +36,53 @@ func (w *WorkflowRepository) ListEnabledAuto(ctx context.Context) ([]domain.Work
|
|||||||
}
|
}
|
||||||
rs = append(rs, *workflow)
|
rs = append(rs, *workflow)
|
||||||
}
|
}
|
||||||
|
|
||||||
return rs, nil
|
return rs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *WorkflowRepository) SaveRunLog(ctx context.Context, log *domain.WorkflowRunLog) error {
|
func (w *WorkflowRepository) SaveRun(ctx context.Context, run *domain.WorkflowRun) error {
|
||||||
collection, err := app.GetApp().Dao().FindCollectionByNameOrId("workflow_run_log")
|
collection, err := app.GetApp().Dao().FindCollectionByNameOrId("workflow_run")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = app.GetApp().Dao().RunInTransaction(func(txDao *daos.Dao) error {
|
||||||
record := models.NewRecord(collection)
|
record := models.NewRecord(collection)
|
||||||
|
record.Set("workflowId", run.WorkflowId)
|
||||||
|
record.Set("trigger", string(run.Trigger))
|
||||||
|
record.Set("status", string(run.Status))
|
||||||
|
record.Set("startedAt", run.StartedAt)
|
||||||
|
record.Set("endedAt", run.EndedAt)
|
||||||
|
record.Set("logs", run.Logs)
|
||||||
|
record.Set("error", run.Error)
|
||||||
|
err = txDao.SaveRecord(record)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
record.Set("workflow", log.Workflow)
|
_, err = txDao.DB().Update(
|
||||||
record.Set("log", log.Log)
|
"workflow",
|
||||||
record.Set("succeed", log.Succeed)
|
dbx.Params{
|
||||||
record.Set("error", log.Error)
|
"lastRunId": record.GetId(),
|
||||||
|
"lastRunStatus": record.GetString("status"),
|
||||||
|
"lastRunTime": record.GetString("startedAt"),
|
||||||
|
},
|
||||||
|
dbx.NewExp("id={:id}", dbx.Params{"id": run.WorkflowId}),
|
||||||
|
).Execute()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return app.GetApp().Dao().SaveRecord(record)
|
return nil
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *WorkflowRepository) Get(ctx context.Context, id string) (*domain.Workflow, error) {
|
func (w *WorkflowRepository) GetById(ctx context.Context, id string) (*domain.Workflow, error) {
|
||||||
record, err := app.GetApp().Dao().FindRecordById("workflow", id)
|
record, err := app.GetApp().Dao().FindRecordById("workflow", id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, sql.ErrNoRows) {
|
if errors.Is(err, sql.ErrNoRows) {
|
||||||
@ -78,19 +108,20 @@ func record2Workflow(record *models.Record) (*domain.Workflow, error) {
|
|||||||
workflow := &domain.Workflow{
|
workflow := &domain.Workflow{
|
||||||
Meta: domain.Meta{
|
Meta: domain.Meta{
|
||||||
Id: record.GetId(),
|
Id: record.GetId(),
|
||||||
Created: record.GetTime("created"),
|
CreatedAt: record.GetCreated().Time(),
|
||||||
Updated: record.GetTime("updated"),
|
UpdatedAt: record.GetUpdated().Time(),
|
||||||
},
|
},
|
||||||
Name: record.GetString("name"),
|
Name: record.GetString("name"),
|
||||||
Description: record.GetString("description"),
|
Description: record.GetString("description"),
|
||||||
Type: record.GetString("type"),
|
Trigger: domain.WorkflowTriggerType(record.GetString("trigger")),
|
||||||
Crontab: record.GetString("crontab"),
|
TriggerCron: record.GetString("triggerCron"),
|
||||||
Enabled: record.GetBool("enabled"),
|
Enabled: record.GetBool("enabled"),
|
||||||
HasDraft: record.GetBool("hasDraft"),
|
|
||||||
|
|
||||||
Content: content,
|
Content: content,
|
||||||
Draft: draft,
|
Draft: draft,
|
||||||
|
HasDraft: record.GetBool("hasDraft"),
|
||||||
|
LastRunId: record.GetString("lastRunId"),
|
||||||
|
LastRunStatus: domain.WorkflowRunStatusType(record.GetString("lastRunStatus")),
|
||||||
|
LastRunTime: record.GetDateTime("lastRunTime").Time(),
|
||||||
}
|
}
|
||||||
|
|
||||||
return workflow, nil
|
return workflow, nil
|
||||||
}
|
}
|
||||||
|
@ -7,8 +7,8 @@ import (
|
|||||||
|
|
||||||
"github.com/pocketbase/dbx"
|
"github.com/pocketbase/dbx"
|
||||||
"github.com/pocketbase/pocketbase/models"
|
"github.com/pocketbase/pocketbase/models"
|
||||||
|
"github.com/usual2970/certimate/internal/app"
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
"github.com/usual2970/certimate/internal/domain"
|
||||||
"github.com/usual2970/certimate/internal/utils/app"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type WorkflowOutputRepository struct{}
|
type WorkflowOutputRepository struct{}
|
||||||
@ -17,7 +17,7 @@ func NewWorkflowOutputRepository() *WorkflowOutputRepository {
|
|||||||
return &WorkflowOutputRepository{}
|
return &WorkflowOutputRepository{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *WorkflowOutputRepository) Get(ctx context.Context, nodeId string) (*domain.WorkflowOutput, error) {
|
func (w *WorkflowOutputRepository) GetByNodeId(ctx context.Context, nodeId string) (*domain.WorkflowOutput, error) {
|
||||||
records, err := app.GetApp().Dao().FindRecordsByFilter("workflow_output", "nodeId={:nodeId}", "-created", 1, 0, dbx.Params{"nodeId": nodeId})
|
records, err := app.GetApp().Dao().FindRecordsByFilter("workflow_output", "nodeId={:nodeId}", "-created", 1, 0, dbx.Params{"nodeId": nodeId})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, sql.ErrNoRows) {
|
if errors.Is(err, sql.ErrNoRows) {
|
||||||
@ -35,29 +35,29 @@ func (w *WorkflowOutputRepository) Get(ctx context.Context, nodeId string) (*dom
|
|||||||
return nil, errors.New("failed to unmarshal node")
|
return nil, errors.New("failed to unmarshal node")
|
||||||
}
|
}
|
||||||
|
|
||||||
output := make([]domain.WorkflowNodeIo, 0)
|
outputs := make([]domain.WorkflowNodeIO, 0)
|
||||||
if err := record.UnmarshalJSONField("output", &output); err != nil {
|
if err := record.UnmarshalJSONField("outputs", &outputs); err != nil {
|
||||||
return nil, errors.New("failed to unmarshal output")
|
return nil, errors.New("failed to unmarshal output")
|
||||||
}
|
}
|
||||||
|
|
||||||
rs := &domain.WorkflowOutput{
|
rs := &domain.WorkflowOutput{
|
||||||
Meta: domain.Meta{
|
Meta: domain.Meta{
|
||||||
Id: record.GetId(),
|
Id: record.GetId(),
|
||||||
Created: record.GetCreated().Time(),
|
CreatedAt: record.GetCreated().Time(),
|
||||||
Updated: record.GetUpdated().Time(),
|
UpdatedAt: record.GetUpdated().Time(),
|
||||||
},
|
},
|
||||||
Workflow: record.GetString("workflow"),
|
WorkflowId: record.GetString("workflowId"),
|
||||||
NodeId: record.GetString("nodeId"),
|
NodeId: record.GetString("nodeId"),
|
||||||
Node: node,
|
Node: node,
|
||||||
Output: output,
|
Outputs: outputs,
|
||||||
Succeed: record.GetBool("succeed"),
|
Succeeded: record.GetBool("succeeded"),
|
||||||
}
|
}
|
||||||
|
|
||||||
return rs, nil
|
return rs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *WorkflowOutputRepository) GetCertificate(ctx context.Context, nodeId string) (*domain.Certificate, error) {
|
func (w *WorkflowOutputRepository) GetCertificateByNodeId(ctx context.Context, nodeId string) (*domain.Certificate, error) {
|
||||||
records, err := app.GetApp().Dao().FindRecordsByFilter("certificate", "nodeId={:nodeId}", "-created", 1, 0, dbx.Params{"nodeId": nodeId})
|
records, err := app.GetApp().Dao().FindRecordsByFilter("certificate", "workflowNodeId={:workflowNodeId}", "-created", 1, 0, dbx.Params{"workflowNodeId": nodeId})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, sql.ErrNoRows) {
|
if errors.Is(err, sql.ErrNoRows) {
|
||||||
return nil, domain.ErrRecordNotFound
|
return nil, domain.ErrRecordNotFound
|
||||||
@ -73,19 +73,21 @@ func (w *WorkflowOutputRepository) GetCertificate(ctx context.Context, nodeId st
|
|||||||
rs := &domain.Certificate{
|
rs := &domain.Certificate{
|
||||||
Meta: domain.Meta{
|
Meta: domain.Meta{
|
||||||
Id: record.GetId(),
|
Id: record.GetId(),
|
||||||
Created: record.GetDateTime("created").Time(),
|
CreatedAt: record.GetCreated().Time(),
|
||||||
Updated: record.GetDateTime("updated").Time(),
|
UpdatedAt: record.GetUpdated().Time(),
|
||||||
},
|
},
|
||||||
|
Source: domain.CertificateSourceType(record.GetString("source")),
|
||||||
|
SubjectAltNames: record.GetString("subjectAltNames"),
|
||||||
Certificate: record.GetString("certificate"),
|
Certificate: record.GetString("certificate"),
|
||||||
PrivateKey: record.GetString("privateKey"),
|
PrivateKey: record.GetString("privateKey"),
|
||||||
IssuerCertificate: record.GetString("issuerCertificate"),
|
IssuerCertificate: record.GetString("issuerCertificate"),
|
||||||
SAN: record.GetString("san"),
|
EffectAt: record.GetDateTime("effectAt").Time(),
|
||||||
Output: record.GetString("output"),
|
|
||||||
ExpireAt: record.GetDateTime("expireAt").Time(),
|
ExpireAt: record.GetDateTime("expireAt").Time(),
|
||||||
CertUrl: record.GetString("certUrl"),
|
ACMECertUrl: record.GetString("acmeCertUrl"),
|
||||||
CertStableUrl: record.GetString("certStableUrl"),
|
ACMECertStableUrl: record.GetString("acmeCertStableUrl"),
|
||||||
Workflow: record.GetString("workflow"),
|
WorkflowId: record.GetString("workflowId"),
|
||||||
NodeId: record.GetString("nodeId"),
|
WorkflowNodeId: record.GetString("workflowNodeId"),
|
||||||
|
WorkflowOutputId: record.GetString("workflowOutputId"),
|
||||||
}
|
}
|
||||||
return rs, nil
|
return rs, nil
|
||||||
}
|
}
|
||||||
@ -107,11 +109,11 @@ func (w *WorkflowOutputRepository) Save(ctx context.Context, output *domain.Work
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
record.Set("workflow", output.Workflow)
|
record.Set("workflowId", output.WorkflowId)
|
||||||
record.Set("nodeId", output.NodeId)
|
record.Set("nodeId", output.NodeId)
|
||||||
record.Set("node", output.Node)
|
record.Set("node", output.Node)
|
||||||
record.Set("output", output.Output)
|
record.Set("outputs", output.Outputs)
|
||||||
record.Set("succeed", output.Succeed)
|
record.Set("succeeded", output.Succeeded)
|
||||||
|
|
||||||
if err := app.GetApp().Dao().SaveRecord(record); err != nil {
|
if err := app.GetApp().Dao().SaveRecord(record); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -128,30 +130,32 @@ func (w *WorkflowOutputRepository) Save(ctx context.Context, output *domain.Work
|
|||||||
}
|
}
|
||||||
|
|
||||||
certRecord := models.NewRecord(certCollection)
|
certRecord := models.NewRecord(certCollection)
|
||||||
|
certRecord.Set("source", string(certificate.Source))
|
||||||
|
certRecord.Set("subjectAltNames", certificate.SubjectAltNames)
|
||||||
certRecord.Set("certificate", certificate.Certificate)
|
certRecord.Set("certificate", certificate.Certificate)
|
||||||
certRecord.Set("privateKey", certificate.PrivateKey)
|
certRecord.Set("privateKey", certificate.PrivateKey)
|
||||||
certRecord.Set("issuerCertificate", certificate.IssuerCertificate)
|
certRecord.Set("issuerCertificate", certificate.IssuerCertificate)
|
||||||
certRecord.Set("san", certificate.SAN)
|
certRecord.Set("effectAt", certificate.EffectAt)
|
||||||
certRecord.Set("output", certificate.Output)
|
|
||||||
certRecord.Set("expireAt", certificate.ExpireAt)
|
certRecord.Set("expireAt", certificate.ExpireAt)
|
||||||
certRecord.Set("certUrl", certificate.CertUrl)
|
certRecord.Set("acmeCertUrl", certificate.ACMECertUrl)
|
||||||
certRecord.Set("certStableUrl", certificate.CertStableUrl)
|
certRecord.Set("acmeCertStableUrl", certificate.ACMECertStableUrl)
|
||||||
certRecord.Set("workflow", certificate.Workflow)
|
certRecord.Set("workflowId", certificate.WorkflowId)
|
||||||
certRecord.Set("nodeId", certificate.NodeId)
|
certRecord.Set("workflowNodeId", certificate.WorkflowNodeId)
|
||||||
|
certRecord.Set("workflowOutputId", certificate.WorkflowOutputId)
|
||||||
|
|
||||||
if err := app.GetApp().Dao().SaveRecord(certRecord); err != nil {
|
if err := app.GetApp().Dao().SaveRecord(certRecord); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新 certificate
|
// 更新 certificate
|
||||||
for i, item := range output.Output {
|
for i, item := range output.Outputs {
|
||||||
if item.Name == "certificate" {
|
if item.Name == domain.WORKFLOW_OUTPUT_CERTIFICATE {
|
||||||
output.Output[i].Value = certRecord.GetId()
|
output.Outputs[i].Value = certRecord.GetId()
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
record.Set("output", output.Output)
|
record.Set("outputs", output.Outputs)
|
||||||
|
|
||||||
if err := app.GetApp().Dao().SaveRecord(record); err != nil {
|
if err := app.GetApp().Dao().SaveRecord(record); err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -4,7 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
"github.com/usual2970/certimate/internal/domain"
|
||||||
"github.com/usual2970/certimate/internal/utils/resp"
|
"github.com/usual2970/certimate/internal/rest/resp"
|
||||||
|
|
||||||
"github.com/labstack/echo/v5"
|
"github.com/labstack/echo/v5"
|
||||||
)
|
)
|
||||||
|
@ -3,9 +3,9 @@ package resp
|
|||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
|
||||||
|
|
||||||
"github.com/labstack/echo/v5"
|
"github.com/labstack/echo/v5"
|
||||||
|
|
||||||
|
"github.com/usual2970/certimate/internal/domain"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Response struct {
|
type Response struct {
|
@ -5,7 +5,7 @@ import (
|
|||||||
|
|
||||||
"github.com/labstack/echo/v5"
|
"github.com/labstack/echo/v5"
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
"github.com/usual2970/certimate/internal/domain"
|
||||||
"github.com/usual2970/certimate/internal/utils/resp"
|
"github.com/usual2970/certimate/internal/rest/resp"
|
||||||
)
|
)
|
||||||
|
|
||||||
type StatisticsService interface {
|
type StatisticsService interface {
|
||||||
|
@ -5,7 +5,7 @@ import (
|
|||||||
|
|
||||||
"github.com/labstack/echo/v5"
|
"github.com/labstack/echo/v5"
|
||||||
"github.com/usual2970/certimate/internal/domain"
|
"github.com/usual2970/certimate/internal/domain"
|
||||||
"github.com/usual2970/certimate/internal/utils/resp"
|
"github.com/usual2970/certimate/internal/rest/resp"
|
||||||
)
|
)
|
||||||
|
|
||||||
type WorkflowService interface {
|
type WorkflowService interface {
|
||||||
|
@ -14,7 +14,7 @@ import (
|
|||||||
func Register(e *echo.Echo) {
|
func Register(e *echo.Echo) {
|
||||||
group := e.Group("/api", apis.RequireAdminAuth())
|
group := e.Group("/api", apis.RequireAdminAuth())
|
||||||
|
|
||||||
notifyRepo := repository.NewSettingRepository()
|
notifyRepo := repository.NewSettingsRepository()
|
||||||
notifySvc := notify.NewNotifyService(notifyRepo)
|
notifySvc := notify.NewNotifyService(notifyRepo)
|
||||||
|
|
||||||
workflowRepo := repository.NewWorkflowRepository()
|
workflowRepo := repository.NewWorkflowRepository()
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user