diff --git a/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/deploy-to-live/index.ts b/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/deploy-to-live/index.ts new file mode 100644 index 00000000..6390ab16 --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/deploy-to-live/index.ts @@ -0,0 +1,126 @@ +import { IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline'; +import { CertInfo } from '@certd/plugin-cert'; +import { createRemoteSelectInputDefine, TencentAccess, TencentSslClient } from '@certd/plugin-lib'; +import { AbstractPlusTaskPlugin } from '@certd/plugin-plus'; + +@IsTaskPlugin({ + name: 'TencentDeployCertToLive', + title: '腾讯云-部署到腾讯云直播', + icon: 'svg:icon-tencentcloud', + desc: 'https://console.cloud.tencent.com/live/', + group: pluginGroups.tencent.key, + needPlus: true, + default: { + strategy: { + runStrategy: RunStrategy.SkipWhenSucceed, + }, + }, +}) +export class TencentDeployCertToLive extends AbstractPlusTaskPlugin { + @TaskInput({ + title: 'Access提供者', + helper: 'access 授权', + component: { + name: 'access-selector', + type: 'tencent', + }, + required: true, + }) + accessId!: string; + + @TaskInput( + createRemoteSelectInputDefine({ + title: '直播域名', + helper: '请选择域名或输入域名', + typeName: 'TencentDeployCertToLive', + action: TencentDeployCertToLive.prototype.onGetDomainList.name, + }) + ) + domains!: string[]; + + @TaskInput({ + title: '域名证书', + helper: '请选择前置任务输出的域名证书,或者选择前置任务“上传证书到腾讯云”任务的证书ID', + component: { + name: 'output-selector', + from: ['CertApply', 'CertApplyLego', 'UploadCertToTencent'], + }, + required: true, + }) + cert!: CertInfo | string; + + async onInstance() {} + + async execute(): Promise { + const access = await this.accessService.getById(this.accessId); + + let tencentCertId = this.cert as string; + if (typeof this.cert !== 'string') { + const sslClient = new TencentSslClient({ + access, + logger: this.logger, + }); + tencentCertId = await sslClient.uploadToTencent({ + certName: this.appendTimeSuffix('certd'), + cert: this.cert, + }); + } + + const client = await this.getLiveClient(); + const domainNames = this.domains.map((item: any) => { + return { + DomainName: item, + Status: -1, + }; + }); + const params = { + DomainInfos: domainNames, + CloudCertId: tencentCertId, + }; + const res = await client.ModifyLiveDomainCertBindings(params); + this.checkRet(res); + + this.logger.info('部署完成', JSON.stringify(res)); + } + + checkRet(ret: any) { + if (!ret || ret.Error) { + throw new Error('执行失败:' + ret.Error.Code + ',' + ret.Error.Message); + } + } + + async getLiveClient() { + const accessProvider = await this.accessService.getById(this.accessId); + const sdk = await import('tencentcloud-sdk-nodejs/tencentcloud/services/live/v20180801/index.js'); + const CssClient = sdk.v20180801.Client; + + const clientConfig = { + credential: { + secretId: accessProvider.secretId, + secretKey: accessProvider.secretKey, + }, + region: '', + profile: { + httpProfile: { + endpoint: 'live.tencentcloudapi.com', + }, + }, + }; + + return new CssClient(clientConfig); + } + + async onGetDomainList(data: any) { + const client = await this.getLiveClient(); + const res = await client.DescribeLiveDomains({ + PageSize: 100, + }); + this.checkRet(res); + return res.DomainList.map((item: any) => { + return { + label: item.Name, + value: item.Name, + }; + }); + } +}