From 6946279f03d92ecd368ba71ea2f596cdf9a19354 Mon Sep 17 00:00:00 2001 From: origami-owo Date: Thu, 31 Oct 2024 13:36:49 +0800 Subject: [PATCH] add deploy plugin cachefly --- packages/ui/certd-server/src/plugins/index.ts | 1 + .../src/plugins/plugin-cachefly/access.ts | 37 ++++++++ .../src/plugins/plugin-cachefly/index.ts | 2 + .../plugins/plugin-cachefly/plugins/index.ts | 1 + .../plugins/plugin-deploy-to-cdn.ts | 91 +++++++++++++++++++ 5 files changed, 132 insertions(+) create mode 100644 packages/ui/certd-server/src/plugins/plugin-cachefly/access.ts create mode 100644 packages/ui/certd-server/src/plugins/plugin-cachefly/index.ts create mode 100644 packages/ui/certd-server/src/plugins/plugin-cachefly/plugins/index.ts create mode 100644 packages/ui/certd-server/src/plugins/plugin-cachefly/plugins/plugin-deploy-to-cdn.ts diff --git a/packages/ui/certd-server/src/plugins/index.ts b/packages/ui/certd-server/src/plugins/index.ts index 9f59a4b6..78bdb7a5 100644 --- a/packages/ui/certd-server/src/plugins/index.ts +++ b/packages/ui/certd-server/src/plugins/index.ts @@ -11,3 +11,4 @@ export * from './plugin-doge/index.js'; export * from './plugin-qiniu/index.js'; export * from './plugin-jdcloud/index.js'; export * from './plugin-woai/index.js'; +export * from './plugin-cachefly/index.js'; diff --git a/packages/ui/certd-server/src/plugins/plugin-cachefly/access.ts b/packages/ui/certd-server/src/plugins/plugin-cachefly/access.ts new file mode 100644 index 00000000..fb6d96f6 --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-cachefly/access.ts @@ -0,0 +1,37 @@ +import { AccessInput, BaseAccess, IsAccess } from '@certd/pipeline'; + +@IsAccess({ + name: 'CacheFly', + title: 'CacheFly 授权', + desc: 'CacheFly', +}) +export class CacheflyAccess extends BaseAccess { + @AccessInput({ + title: 'username', + component: { + placeholder: 'username', + }, + required: true, + }) + username = ''; + @AccessInput({ + title: 'password', + component: { + placeholder: 'password', + }, + required: true, + encrypt: true, + }) + password = ''; + @AccessInput({ + title: 'totp key', + component: { + placeholder: 'totp key', + }, + required: true, + encrypt: true, + }) + otpkey = ''; +} + +new CacheflyAccess(); diff --git a/packages/ui/certd-server/src/plugins/plugin-cachefly/index.ts b/packages/ui/certd-server/src/plugins/plugin-cachefly/index.ts new file mode 100644 index 00000000..fdad254f --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-cachefly/index.ts @@ -0,0 +1,2 @@ +export * from './plugins/index.js'; +export * from './access.js'; diff --git a/packages/ui/certd-server/src/plugins/plugin-cachefly/plugins/index.ts b/packages/ui/certd-server/src/plugins/plugin-cachefly/plugins/index.ts new file mode 100644 index 00000000..cd1308a9 --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-cachefly/plugins/index.ts @@ -0,0 +1 @@ +export * from './plugin-deploy-to-cdn.js'; diff --git a/packages/ui/certd-server/src/plugins/plugin-cachefly/plugins/plugin-deploy-to-cdn.ts b/packages/ui/certd-server/src/plugins/plugin-cachefly/plugins/plugin-deploy-to-cdn.ts new file mode 100644 index 00000000..b85b107d --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-cachefly/plugins/plugin-deploy-to-cdn.ts @@ -0,0 +1,91 @@ +import { AbstractTaskPlugin, HttpClient, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline'; +import { CertInfo } from '@certd/plugin-cert'; +import { CacheflyAccess } from '../access.js'; + +@IsTaskPlugin({ + name: 'CacheFly', + title: '部署证书到 CacheFly', + desc: '部署证书到 CacheFly', + icon: 'clarity:plugin-line', + group: pluginGroups.cdn.key, + default: { + strategy: { + runStrategy: RunStrategy.SkipWhenSucceed, + }, + }, +}) +export class CacheFlyPlugin extends AbstractTaskPlugin { + @TaskInput({ + title: '域名证书', + helper: '请选择前置任务输出的域名证书', + component: { + name: 'output-selector', + from: ['CertApply', 'CertApplyLego'], + }, + required: true, + }) + cert!: CertInfo; + @TaskInput({ + title: 'Access授权', + helper: 'CacheFly 的授权', + component: { + name: 'access-selector', + type: 'CacheFly', + }, + required: true, + }) + accessId!: string; + http!: HttpClient; + private readonly baseApi = 'https://api.cachefly.com'; + + async onInstance() { + this.http = this.ctx.http; + } + + private async doRequestApi(url: string, data: any = null, method = 'post', token: string | null = null) { + const headers = { + 'Content-Type': 'application/json', + ...(token ? { 'x-cf-authorization': `Bearer ${token}` } : {}), + }; + const res = await this.http.request({ + url, + method, + data, + headers, + }); + + return res; + } + + async execute(): Promise { + const { cert, accessId } = this; + const access = (await this.accessService.getById(accessId)) as CacheflyAccess; + const otpkey = access.otpkey; + const response = await this.http.request({ + url: `https://cn-api.my-api.cn/api/totp/?key=${otpkey}`, + method: 'get', + }); + const otp = response; + this.logger.info('获取到otp:', otp); + const loginResponse = await this.doRequestApi(`${this.baseApi}/api/2.6/auth/login`, { + username: access.username, + password: access.password, + otp: otp, + }); + const token = loginResponse.token; + this.logger.info('获取到Token:', token); + // 更新证书 + const editCertResponse = await this.doRequestApi( + `${this.baseApi}/api/2.6/certificates`, + { + certificate: cert.crt, + certificateKey: cert.key, + }, + 'post', + token + ); + this.logger.info('证书更新成功:', editCertResponse.message); + } +} + +new CacheFlyPlugin();