diff --git a/go.mod b/go.mod index 7c710d35..7b565e12 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( github.com/alibabacloud-go/slb-20140515/v4 v4.0.9 github.com/alibabacloud-go/tea v1.2.2 github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible + github.com/baidubce/bce-sdk-go v0.9.197 github.com/go-acme/lego/v4 v4.19.2 github.com/gojek/heimdall/v7 v7.0.3 github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.114 diff --git a/go.sum b/go.sum index d93ba3da..676b48cf 100644 --- a/go.sum +++ b/go.sum @@ -159,6 +159,8 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8 github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o= github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= github.com/aws/smithy-go v1.20.4/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.197/go.mod h1:zbYJMQwE4IZuyrJiFO8tO8NbtYiKTFTbwh4eIsqjVdg= github.com/blinkbean/dingtalk v1.1.3 h1:MbidFZYom7DTFHD/YIs+eaI7kRy52kmWE/sy0xjo6E4= github.com/blinkbean/dingtalk v1.1.3/go.mod h1:9BaLuGSBqY3vT5hstValh48DbsKO7vaHaJnG9pXwbto= github.com/cactus/go-statsd-client/statsd v0.0.0-20200423205355-cb0885a1018c/go.mod h1:l/bIBLeOl9eX+wxJAzxS4TveKRtAqlyDpHjhkfO0MEI= diff --git a/internal/deployer/baiducloud_cdn.go b/internal/deployer/baiducloud_cdn.go new file mode 100644 index 00000000..f38bc4d8 --- /dev/null +++ b/internal/deployer/baiducloud_cdn.go @@ -0,0 +1,80 @@ +package deployer + +import ( + "context" + "encoding/json" + "fmt" + "time" + + baiduCdn "github.com/baidubce/bce-sdk-go/services/cdn" + baiduCdnApi "github.com/baidubce/bce-sdk-go/services/cdn/api" + xerrors "github.com/pkg/errors" + + "github.com/usual2970/certimate/internal/domain" +) + +type BaiduCloudCDNDeployer struct { + option *DeployerOption + infos []string + + sdkClient *baiduCdn.Client +} + +func NewBaiduCloudCDNDeployer(option *DeployerOption) (Deployer, error) { + access := &domain.BaiduCloudAccess{} + if err := json.Unmarshal([]byte(option.Access), access); err != nil { + return nil, xerrors.Wrap(err, "failed to get access") + } + + client, err := (&BaiduCloudCDNDeployer{}).createSdkClient( + access.AccessKeyId, + access.SecretAccessKey, + ) + if err != nil { + return nil, xerrors.Wrap(err, "failed to create sdk client") + } + + return &BaiduCloudCDNDeployer{ + option: option, + infos: make([]string, 0), + sdkClient: client, + }, nil +} + +func (d *BaiduCloudCDNDeployer) GetID() string { + return fmt.Sprintf("%s-%s", d.option.AccessRecord.GetString("name"), d.option.AccessRecord.Id) +} + +func (d *BaiduCloudCDNDeployer) GetInfos() []string { + return d.infos +} + +func (d *BaiduCloudCDNDeployer) Deploy(ctx context.Context) error { + // 修改域名证书 + // REF: https://cloud.baidu.com/doc/CDN/s/qjzuz2hp8 + putCertResp, err := d.sdkClient.PutCert( + d.option.DeployConfig.GetConfigAsString("domain"), + &baiduCdnApi.UserCertificate{ + CertName: fmt.Sprintf("certimate-%d", time.Now().UnixMilli()), + ServerData: d.option.Certificate.Certificate, + PrivateData: d.option.Certificate.PrivateKey, + }, + "ON", + ) + if err != nil { + return xerrors.Wrap(err, "failed to execute sdk request 'cdn.PutCert'") + } + + d.infos = append(d.infos, toStr("已修改域名证书", putCertResp)) + + return nil +} + +func (d *BaiduCloudCDNDeployer) createSdkClient(accessKeyId, secretAccessKey string) (*baiduCdn.Client, error) { + client, err := baiduCdn.NewClient(accessKeyId, secretAccessKey, "") + if err != nil { + return nil, err + } + + return client, nil +} diff --git a/internal/deployer/deployer.go b/internal/deployer/deployer.go index 31a0c50f..c8456ae6 100644 --- a/internal/deployer/deployer.go +++ b/internal/deployer/deployer.go @@ -33,6 +33,7 @@ const ( targetTencentTEO = "tencent-teo" targetHuaweiCloudCDN = "huaweicloud-cdn" targetHuaweiCloudELB = "huaweicloud-elb" + targetBaiduCloudCDN = "baiducloud-cdn" targetQiniuCdn = "qiniu-cdn" targetDogeCloudCdn = "dogecloud-cdn" targetLocal = "local" @@ -135,6 +136,8 @@ func getWithDeployConfig(record *models.Record, cert *applicant.Certificate, dep return NewHuaweiCloudCDNDeployer(option) case targetHuaweiCloudELB: return NewHuaweiCloudELBDeployer(option) + case targetBaiduCloudCDN: + return NewBaiduCloudCDNDeployer(option) case targetQiniuCdn: return NewQiniuCDNDeployer(option) case targetDogeCloudCdn: diff --git a/ui/src/components/certimate/DeployEditDialog.tsx b/ui/src/components/certimate/DeployEditDialog.tsx index 7256a7fb..9389fa62 100644 --- a/ui/src/components/certimate/DeployEditDialog.tsx +++ b/ui/src/components/certimate/DeployEditDialog.tsx @@ -20,6 +20,7 @@ import DeployToTencentCOS from "./DeployToTencentCOS"; import DeployToTencentTEO from "./DeployToTencentTEO"; import DeployToHuaweiCloudCDN from "./DeployToHuaweiCloudCDN"; import DeployToHuaweiCloudELB from "./DeployToHuaweiCloudELB"; +import DeployToBaiduCloudCDN from "./DeployToBaiduCloudCDN"; import DeployToQiniuCDN from "./DeployToQiniuCDN"; import DeployToDogeCloudCDN from "./DeployToDogeCloudCDN"; import DeployToLocal from "./DeployToLocal"; @@ -152,6 +153,9 @@ const DeployEditDialog = ({ trigger, deployConfig, onSave }: DeployEditDialogPro case "huaweicloud-elb": childComponent = ; break; + case "baiducloud-cdn": + childComponent = ; + break; case "qiniu-cdn": childComponent = ; break; diff --git a/ui/src/components/certimate/DeployToBaiduCloudCDN.tsx b/ui/src/components/certimate/DeployToBaiduCloudCDN.tsx new file mode 100644 index 00000000..262fb3e5 --- /dev/null +++ b/ui/src/components/certimate/DeployToBaiduCloudCDN.tsx @@ -0,0 +1,68 @@ +import { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { z } from "zod"; +import { produce } from "immer"; + +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { useDeployEditContext } from "./DeployEdit"; + +type DeployToBaiduCloudCDNConfigParams = { + domain?: string; +}; + +const DeployToBaiduCloudCDN = () => { + const { t } = useTranslation(); + + const { config, setConfig, errors, setErrors } = useDeployEditContext(); + + useEffect(() => { + if (!config.id) { + setConfig({ + ...config, + config: {}, + }); + } + }, []); + + useEffect(() => { + setErrors({}); + }, []); + + const formSchema = z.object({ + domain: z.string().regex(/^(?:\*\.)?([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}$/, { + message: t("common.errmsg.domain_invalid"), + }), + }); + + useEffect(() => { + const res = formSchema.safeParse(config.config); + setErrors({ + ...errors, + domain: res.error?.errors?.find((e) => e.path[0] === "domain")?.message, + }); + }, [config]); + + return ( + + + {t("domain.deployment.form.domain.label")} + { + const nv = produce(config, (draft) => { + draft.config ??= {}; + draft.config.domain = e.target.value?.trim(); + }); + setConfig(nv); + }} + /> + {errors?.domain} + + + ); +}; + +export default DeployToBaiduCloudCDN; diff --git a/ui/src/domain/domain.ts b/ui/src/domain/domain.ts index aefc6677..c4b5f683 100644 --- a/ui/src/domain/domain.ts +++ b/ui/src/domain/domain.ts @@ -85,6 +85,7 @@ export const deployTargetsMap: Map = new Map ["tencent-teo", "common.provider.tencent.teo", "/imgs/providers/tencent.svg"], ["huaweicloud-cdn", "common.provider.huaweicloud.cdn", "/imgs/providers/huaweicloud.svg"], ["huaweicloud-elb", "common.provider.huaweicloud.elb", "/imgs/providers/huaweicloud.svg"], + ["baiducloud-cdn", "common.provider.baiducloud.cdn", "/imgs/providers/baiducloud.svg"], ["qiniu-cdn", "common.provider.qiniu.cdn", "/imgs/providers/qiniu.svg"], ["dogecloud-cdn", "common.provider.dogecloud.cdn", "/imgs/providers/dogecloud.svg"], ["local", "common.provider.local", "/imgs/providers/local.svg"], diff --git a/ui/src/i18n/locales/en/nls.common.json b/ui/src/i18n/locales/en/nls.common.json index 54e1fa97..69517f1e 100644 --- a/ui/src/i18n/locales/en/nls.common.json +++ b/ui/src/i18n/locales/en/nls.common.json @@ -69,6 +69,7 @@ "common.provider.huaweicloud.cdn": "Huawei Cloud - CDN", "common.provider.huaweicloud.elb": "Huawei Cloud - ELB", "common.provider.baiducloud": "Baidu Cloud", + "common.provider.baiducloud.cdn": "Baidu Cloud - CDN", "common.provider.qiniu": "Qiniu Cloud", "common.provider.qiniu.cdn": "Qiniu Cloud - CDN", "common.provider.dogecloud": "Doge Cloud", diff --git a/ui/src/i18n/locales/zh/nls.common.json b/ui/src/i18n/locales/zh/nls.common.json index 607da17d..5657836e 100644 --- a/ui/src/i18n/locales/zh/nls.common.json +++ b/ui/src/i18n/locales/zh/nls.common.json @@ -69,6 +69,7 @@ "common.provider.huaweicloud.cdn": "华为云 - 内容分发网络 CDN", "common.provider.huaweicloud.elb": "华为云 - 弹性负载均衡 ELB", "common.provider.baiducloud": "百度智能云", + "common.provider.baiducloud.cdn": "百度智能云 - 内容分发网络 CDN", "common.provider.qiniu": "七牛云", "common.provider.qiniu.cdn": "七牛云 - 内容分发网络 CDN", "common.provider.dogecloud": "多吉云",