From 76b19a4980f8edba5238543b82a7811e1003746c Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Fri, 16 May 2025 08:38:16 +0800 Subject: [PATCH 01/10] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=83=A8?= =?UTF-8?q?=E7=BD=B2flexcdn=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui/certd-server/src/plugins/index.ts | 1 + .../plugins/plugin-refresh-cert.ts | 53 +++++++++++-------- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/packages/ui/certd-server/src/plugins/index.ts b/packages/ui/certd-server/src/plugins/index.ts index 25c07e00..1f49aca2 100644 --- a/packages/ui/certd-server/src/plugins/index.ts +++ b/packages/ui/certd-server/src/plugins/index.ts @@ -20,3 +20,4 @@ export * from './plugin-volcengine/index.js' export * from './plugin-jdcloud/index.js' export * from './plugin-51dns/index.js' export * from './plugin-notification/index.js' +export * from './plugin-flex/index.js' diff --git a/packages/ui/certd-server/src/plugins/plugin-flex/plugins/plugin-refresh-cert.ts b/packages/ui/certd-server/src/plugins/plugin-flex/plugins/plugin-refresh-cert.ts index 6846cac8..92340be7 100644 --- a/packages/ui/certd-server/src/plugins/plugin-flex/plugins/plugin-refresh-cert.ts +++ b/packages/ui/certd-server/src/plugins/plugin-flex/plugins/plugin-refresh-cert.ts @@ -15,9 +15,9 @@ import { FlexCDNClient } from "../client.js"; default: { //默认值配置照抄即可 strategy: { - runStrategy: RunStrategy.SkipWhenSucceed, - }, - }, + runStrategy: RunStrategy.SkipWhenSucceed + } + } }) //类名规范,跟上面插件名称(name)一致 export class FlexCDNRefreshCert extends AbstractTaskPlugin { @@ -27,8 +27,8 @@ export class FlexCDNRefreshCert extends AbstractTaskPlugin { helper: "请选择前置任务输出的域名证书", component: { name: "output-selector", - from: [...CertApplyPluginNames], - }, + from: [...CertApplyPluginNames] + } // required: true, // 必填 }) cert!: CertInfo; @@ -41,9 +41,9 @@ export class FlexCDNRefreshCert extends AbstractTaskPlugin { title: "FlexCDN授权", component: { name: "access-selector", - type: "FlexCDN", //固定授权类型 + type: "flexcdn" //固定授权类型 }, - required: true, //必填 + required: true //必填 }) accessId!: string; // @@ -52,13 +52,14 @@ export class FlexCDNRefreshCert extends AbstractTaskPlugin { createRemoteSelectInputDefine({ title: "证书Id", helper: "要更新的Flex证书id", - action: FlexCDNRefreshCert.prototype.onGetCertList.name, + action: FlexCDNRefreshCert.prototype.onGetCertList.name }) ) certList!: number[]; //插件实例化时执行的方法 - async onInstance() {} + async onInstance() { + } //插件执行方法 async execute(): Promise { @@ -67,7 +68,7 @@ export class FlexCDNRefreshCert extends AbstractTaskPlugin { const client = new FlexCDNClient({ http: this.ctx.http, logger: this.logger, - access, + access }); await client.getToken(); for (const item of this.certList) { @@ -76,18 +77,23 @@ export class FlexCDNRefreshCert extends AbstractTaskPlugin { const res = await client.doRequest({ url: `/SSLCertService/findEnabledSSLCertConfig`, data: { - sslCertId: item, - }, + sslCertId: item + } }); + const sslCert = JSON.parse(this.ctx.utils.hash.base64Decode(res.sslCertJSON)) + this.logger.info(`证书信息:${sslCert.name},${sslCert.dnsNames}`); + const body = { + name: sslCert.name, + sslCertId: item, + certData: this.cert.crt, + keyData: this.cert.key + }; await client.doRequest({ url: `/SSLCertService/updateSSLCert`, data: { - ...res, - sslCertId: item, - certData: this.cert.crt, - keyData: this.cert.key, - }, + sslCertJSON:this.ctx.utils.hash.base64(JSON.stringify(body)) + } }); this.logger.info(`更新证书${item}成功`); @@ -101,28 +107,29 @@ export class FlexCDNRefreshCert extends AbstractTaskPlugin { const client = new FlexCDNClient({ http: this.ctx.http, logger: this.logger, - access, + access }); await client.getToken(); const res = await client.doRequest({ url: "/SSLCertService/listSSLCerts", - data: { size: 1000}, - method: "POST", + data: { size: 1000 }, + method: "POST" }); - const list = res.sslCertsJSON; + const list = JSON.parse(this.ctx.utils.hash.base64Decode(res.sslCertsJSON)); if (!list || list.length === 0) { throw new Error("没有找到证书,请先在控制台上传一次证书且关联网站"); } const options = list.map((item: any) => { return { - label: `${item.name}<${item.id}-${item.firstServerName}>`, + label: `${item.name}<${item.id}-${item.dnsNames[0]}>`, value: item.id, - domain: JSON.parse(item.serverNamesJSON), + domain: item.dnsNames }; }); return this.ctx.utils.options.buildGroupOptions(options, this.certDomains); } } + //实例化一下,注册插件 new FlexCDNRefreshCert(); From fcf8309c238208281ecb4575b2c3cfe50c11d783 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Fri, 16 May 2025 08:38:38 +0800 Subject: [PATCH 02/10] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E5=9C=A8=E7=BA=BF=E6=8F=92=E4=BB=B6=E4=B8=8D=E7=94=9F?= =?UTF-8?q?=E6=95=88=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/basic/src/utils/index.ts | 68 +++++++++---------- packages/core/basic/src/utils/util.hash.ts | 4 ++ .../core/pipeline/src/registry/registry.ts | 5 ++ .../sys/plugin/plugin-controller.ts | 4 +- .../modules/plugin/service/plugin-service.ts | 55 ++++++++++++++- 5 files changed, 98 insertions(+), 38 deletions(-) diff --git a/packages/core/basic/src/utils/index.ts b/packages/core/basic/src/utils/index.ts index 642fa9bc..94b2109f 100644 --- a/packages/core/basic/src/utils/index.ts +++ b/packages/core/basic/src/utils/index.ts @@ -1,39 +1,39 @@ -export * from './util.request.js'; -export * from './util.env.js'; -export * from './util.log.js'; -export * from './util.file.js'; -export * from './util.sp.js'; -export * from './util.promise.js'; -export * from './util.hash.js'; -export * from './util.merge.js'; -export * from './util.cache.js'; -export * from './util.string.js'; -export * from './util.lock.js'; -export * from './util.mitter.js'; -export * from './util.id.js'; -export * from './util.domain.js'; -export * from './util.amount.js'; -import { stringUtils } from './util.string.js'; -import sleep from './util.sleep.js'; -import { http, download } from './util.request.js'; +export * from "./util.request.js"; +export * from "./util.env.js"; +export * from "./util.log.js"; +export * from "./util.file.js"; +export * from "./util.sp.js"; +export * from "./util.promise.js"; +export * from "./util.hash.js"; +export * from "./util.merge.js"; +export * from "./util.cache.js"; +export * from "./util.string.js"; +export * from "./util.lock.js"; +export * from "./util.mitter.js"; +export * from "./util.id.js"; +export * from "./util.domain.js"; +export * from "./util.amount.js"; +import { stringUtils } from "./util.string.js"; +import sleep from "./util.sleep.js"; +import { http, download } from "./util.request.js"; -import { mergeUtils } from './util.merge.js'; -import { sp } from './util.sp.js'; -import { hashUtils } from './util.hash.js'; -import { promises } from './util.promise.js'; -import { fileUtils } from './util.file.js'; -import * as _ from 'lodash-es'; -import { cache } from './util.cache.js'; -import dayjs from 'dayjs'; -import { domainUtils } from './util.domain.js'; -import { optionsUtils } from './util.options.js'; -import { amountUtils } from './util.amount.js'; -import { nanoid } from 'nanoid'; -import * as id from './util.id.js'; -import { locker } from './util.lock.js'; -import { mitter } from './util.mitter.js'; +import { mergeUtils } from "./util.merge.js"; +import { sp } from "./util.sp.js"; +import { hashUtils } from "./util.hash.js"; +import { promises } from "./util.promise.js"; +import { fileUtils } from "./util.file.js"; +import * as _ from "lodash-es"; +import { cache } from "./util.cache.js"; +import dayjs from "dayjs"; +import { domainUtils } from "./util.domain.js"; +import { optionsUtils } from "./util.options.js"; +import { amountUtils } from "./util.amount.js"; +import { nanoid } from "nanoid"; +import * as id from "./util.id.js"; +import { locker } from "./util.lock.js"; +import { mitter } from "./util.mitter.js"; -import * as request from './util.request.js'; +import * as request from "./util.request.js"; export const utils = { sleep, http, diff --git a/packages/core/basic/src/utils/util.hash.ts b/packages/core/basic/src/utils/util.hash.ts index 87f6a0e8..303ffa1d 100644 --- a/packages/core/basic/src/utils/util.hash.ts +++ b/packages/core/basic/src/utils/util.hash.ts @@ -14,9 +14,13 @@ function hmacSha256(data: string, digest: BinaryToTextEncoding = "base64") { function base64(data: string) { return Buffer.from(data).toString("base64"); } +function base64Decode(data: string) { + return Buffer.from(data, "base64").toString("utf8"); +} export const hashUtils = { md5, sha256, base64, + base64Decode, hmacSha256, }; diff --git a/packages/core/pipeline/src/registry/registry.ts b/packages/core/pipeline/src/registry/registry.ts index 9abc85d3..b466bcc9 100644 --- a/packages/core/pipeline/src/registry/registry.ts +++ b/packages/core/pipeline/src/registry/registry.ts @@ -48,6 +48,11 @@ export class Registry { logger.info(`注册插件:${this.type}:${key}`); } + unRegister(key: string) { + delete this.storage[key]; + logger.info(`反注册插件:${this.type}:${key}`); + } + get(name: string): RegistryItem { if (!name) { throw new Error("插件名称不能为空"); diff --git a/packages/ui/certd-server/src/controller/sys/plugin/plugin-controller.ts b/packages/ui/certd-server/src/controller/sys/plugin/plugin-controller.ts index a0bd13f4..6ff73443 100644 --- a/packages/ui/certd-server/src/controller/sys/plugin/plugin-controller.ts +++ b/packages/ui/certd-server/src/controller/sys/plugin/plugin-controller.ts @@ -57,12 +57,12 @@ export class PluginController extends CrudController { @Post('/delete', { summary: 'sys:settings:edit' }) async delete(@Query('id') id: number) { - return super.delete(id); + return super.deleteByIds([id]); } @Post('/deleteByIds', { summary: 'sys:settings:edit' }) async deleteByIds(@Body('ids') ids: number[]) { - const res = await this.service.delete(ids); + const res = await this.service.deleteByIds(ids); return this.ok(res); } diff --git a/packages/ui/certd-server/src/modules/plugin/service/plugin-service.ts b/packages/ui/certd-server/src/modules/plugin/service/plugin-service.ts index c3c94a07..2793ebfc 100644 --- a/packages/ui/certd-server/src/modules/plugin/service/plugin-service.ts +++ b/packages/ui/certd-server/src/modules/plugin/service/plugin-service.ts @@ -193,10 +193,49 @@ export class PluginService extends BaseService { throw new Error(`插件类型${param.pluginType}不支持`); } - return await super.add({ + const res= await super.add({ ...param, ...plugin }); + + await this.registerById(res.id); + return res + } + + async registerById(id: any) { + const item = await this.info(id); + if (!item) { + return; + } + if(item.type === "builtIn"){ + return; + } + await this.registerPlugin(item); + } + + async unRegisterById(id: any){ + const item = await this.info(id); + if (!item) { + return; + } + if (item.type === "builtIn") { + return; + } + let name = item.name; + if (item.author){ + name = `${item.author}/${item.name}` + } + if (item.pluginType === "access"){ + accessRegistry.unRegister(name) + }else if (item.pluginType === "deploy"){ + pluginRegistry.unRegister(name) + }else if (item.pluginType === "dnsProvider"){ + dnsProviderRegistry.unRegister(name) + }else if (item.pluginType === "notification"){ + notificationRegistry.unRegister(name) + }else{ + logger.warn(`不支持的插件类型:${item.pluginType}`) + } } async update(param: any) { @@ -211,7 +250,11 @@ export class PluginService extends BaseService { throw new Error(`插件${param.author}/${param.name}已存在`); } - return await super.update(param); + + const res= await super.update(param); + + await this.registerById(param.id); + return res } async compile(code: string) { @@ -420,4 +463,12 @@ export class PluginService extends BaseService { } + async deleteByIds(ids:any[]){ + await super.delete(ids); + for (const id of ids) { + await this.unRegisterById(id) + } + } + + } From 61f06faaf514258fd26d74067ba57a45dc5c7c57 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Fri, 16 May 2025 08:42:31 +0800 Subject: [PATCH 03/10] chore: --- .../plugins/plugin-flex/plugins/plugin-refresh-cert.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/ui/certd-server/src/plugins/plugin-flex/plugins/plugin-refresh-cert.ts b/packages/ui/certd-server/src/plugins/plugin-flex/plugins/plugin-refresh-cert.ts index 92340be7..be69fe3c 100644 --- a/packages/ui/certd-server/src/plugins/plugin-flex/plugins/plugin-refresh-cert.ts +++ b/packages/ui/certd-server/src/plugins/plugin-flex/plugins/plugin-refresh-cert.ts @@ -72,7 +72,7 @@ export class FlexCDNRefreshCert extends AbstractTaskPlugin { }); await client.getToken(); for (const item of this.certList) { - this.logger.info(`开始更新证书:${item}`); + this.logger.info(`----------- 开始更新证书:${item}`); const res = await client.doRequest({ url: `/SSLCertService/findEnabledSSLCertConfig`, @@ -86,17 +86,17 @@ export class FlexCDNRefreshCert extends AbstractTaskPlugin { const body = { name: sslCert.name, sslCertId: item, - certData: this.cert.crt, - keyData: this.cert.key + certData: this.ctx.utils.hash.base64(this.cert.crt), + keyData: this.ctx.utils.hash.base64(this.cert.key) }; await client.doRequest({ url: `/SSLCertService/updateSSLCert`, data: { - sslCertJSON:this.ctx.utils.hash.base64(JSON.stringify(body)) + ...body } }); - this.logger.info(`更新证书${item}成功`); + this.logger.info(`----------- 更新证书${item}成功`); } this.logger.info("部署完成"); From 677fec0a0b6fceb4966705e471bbfeeda91610c7 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Fri, 16 May 2025 08:55:54 +0800 Subject: [PATCH 04/10] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=AF=BC=E5=85=A5=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../certd-client/src/views/sys/plugin/crud.tsx | 1 + .../modules/plugin/service/plugin-service.ts | 18 +++++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/ui/certd-client/src/views/sys/plugin/crud.tsx b/packages/ui/certd-client/src/views/sys/plugin/crud.tsx index 1c8eac4d..1565ab16 100644 --- a/packages/ui/certd-client/src/views/sys/plugin/crud.tsx +++ b/packages/ui/certd-client/src/views/sys/plugin/crud.tsx @@ -91,6 +91,7 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat }, afterSubmit() { notification.success({ message: "操作成功" }); + crudExpose.doRefresh(); }, async doSubmit({ form }: any) { return await api.ImportPlugin({ diff --git a/packages/ui/certd-server/src/modules/plugin/service/plugin-service.ts b/packages/ui/certd-server/src/modules/plugin/service/plugin-service.ts index 2793ebfc..c4908734 100644 --- a/packages/ui/certd-server/src/modules/plugin/service/plugin-service.ts +++ b/packages/ui/certd-server/src/modules/plugin/service/plugin-service.ts @@ -438,25 +438,25 @@ export class PluginService extends BaseService { ...loaded, metadata: yaml.dump(metadata), extra: yaml.dump(extra), - content: req.content, + content: loaded.content, disabled: false }; if (!pluginEntity.pluginType) { throw new Error(`插件类型不能为空`); } - if (old) { - if (!req.override) { - throw new Error(`插件${loaded.author}/${loaded.name}已存在`); - } - //update - pluginEntity.id = old.id; - await this.update(pluginEntity); - } else { + if (!old) { //add const {id} = await this.add(pluginEntity); pluginEntity.id = id; + } else{ + if (!req.override) { + throw new Error(`插件${loaded.author}/${loaded.name}已存在`); + } + pluginEntity.id = old.id; } + //update + await this.update(pluginEntity); return { id: pluginEntity.id }; From aebb07c5cc8b1f233b9d203ff017ac60e6971a85 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Fri, 16 May 2025 23:14:43 +0800 Subject: [PATCH 05/10] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E5=B0=8F?= =?UTF-8?q?=E5=8A=A9=E6=89=8B=EF=BC=8C=E4=BB=85=E5=9C=A8=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E4=B9=8B=E5=90=8E=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui/certd-client/src/App.vue | 13 ++----------- .../ui/certd-client/src/layout/layout-basic.vue | 15 +++++++++++---- .../src/views/framework/login/index.vue | 2 ++ 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/ui/certd-client/src/App.vue b/packages/ui/certd-client/src/App.vue index 8887c8bd..7faa70cc 100644 --- a/packages/ui/certd-client/src/App.vue +++ b/packages/ui/certd-client/src/App.vue @@ -3,7 +3,6 @@ - @@ -49,7 +48,7 @@ localeChanged("zh-cn"); provide("fn:router.reload", reload); provide("fn:locale.changed", localeChanged); -const settingsStore = useSettingStore(); + const { isDark } = usePreferences(); const { tokens } = useAntdDesignTokens(); @@ -74,13 +73,5 @@ const tokenTheme = computed(() => { // const settingStore = useSettingStore(); // settingStore.init(); -const chatBox = ref(); -// onMounted(async () => { -// await util.sleep(2000); -// await chatBox.value.openChat({ q: "hello" }); -// }); -const openChat = (q: string) => { - chatBox.value.openChat({ q }); -}; -provide("fn:ai.open", openChat); + diff --git a/packages/ui/certd-client/src/layout/layout-basic.vue b/packages/ui/certd-client/src/layout/layout-basic.vue index 2af00c36..d223fa02 100644 --- a/packages/ui/certd-client/src/layout/layout-basic.vue +++ b/packages/ui/certd-client/src/layout/layout-basic.vue @@ -1,17 +1,16 @@ diff --git a/packages/ui/certd-client/src/views/framework/login/index.vue b/packages/ui/certd-client/src/views/framework/login/index.vue index c31b9a67..6ccc92fa 100644 --- a/packages/ui/certd-client/src/views/framework/login/index.vue +++ b/packages/ui/certd-client/src/views/framework/login/index.vue @@ -43,6 +43,8 @@ + +