From 9b4a31fa6a32b9cab2e22bd141cf96ca29120445 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Fri, 1 Nov 2024 10:22:40 +0800 Subject: [PATCH 001/119] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=A4=B4?= =?UTF-8?q?=E5=83=8F=E6=B2=A1=E6=9C=89=E6=9B=B4=E6=96=B0=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui/certd-client/src/store/modules/user.ts | 4 ++++ .../certd-client/src/views/framework/home/dashboard/index.vue | 1 + 2 files changed, 5 insertions(+) diff --git a/packages/ui/certd-client/src/store/modules/user.ts b/packages/ui/certd-client/src/store/modules/user.ts index faeba1772..21d1566aa 100644 --- a/packages/ui/certd-client/src/store/modules/user.ts +++ b/packages/ui/certd-client/src/store/modules/user.ts @@ -82,6 +82,10 @@ export const useUserStore = defineStore({ return userInfo; }, + async loadUserInfo() { + await this.getUserInfoAction(); + }, + async onLoginSuccess(loginData: any) { await this.getUserInfoAction(); const userInfo = await this.getUserInfoAction(); diff --git a/packages/ui/certd-client/src/views/framework/home/dashboard/index.vue b/packages/ui/certd-client/src/views/framework/home/dashboard/index.vue index 988172faa..3db8ecae4 100644 --- a/packages/ui/certd-client/src/views/framework/home/dashboard/index.vue +++ b/packages/ui/certd-client/src/views/framework/home/dashboard/index.vue @@ -205,6 +205,7 @@ async function loadPluginGroups() { const pluginGroups = ref(); onMounted(async () => { + await userStore.loadUserInfo(); await loadLatestVersion(); await loadCount(); await loadPluginGroups(); From 396dc34a841c7d016b033736afdba8366fb2d211 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Fri, 1 Nov 2024 10:23:27 +0800 Subject: [PATCH 002/119] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E9=80=89=E6=8B=A9=E5=99=A8=EF=BC=8C=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=A1=AB=E5=86=99=E5=88=86=E9=92=9F=E5=92=8C=E7=A7=92=E9=92=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/pipeline/package.json | 1 + packages/ui/certd-client/src/api/service.ts | 1 + .../ui/certd-client/src/components/cron-editor/index.vue | 9 +++++++++ .../ui/certd-client/src/router/source/modules/certd.ts | 2 -- .../src/views/certd/pipeline/certd-form/crud.tsx | 2 +- .../pipeline/pipeline/component/trigger-form/index.vue | 2 +- .../src/modules/pipeline/service/pipeline-service.ts | 5 ++++- 7 files changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/core/pipeline/package.json b/packages/core/pipeline/package.json index 6ebb2c506..d66f7aa98 100644 --- a/packages/core/pipeline/package.json +++ b/packages/core/pipeline/package.json @@ -4,6 +4,7 @@ "version": "1.27.0", "type": "module", "main": "./dist/index.js", + "module": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { "dev": "vite", diff --git a/packages/ui/certd-client/src/api/service.ts b/packages/ui/certd-client/src/api/service.ts index df000c1f6..41c1e15af 100644 --- a/packages/ui/certd-client/src/api/service.ts +++ b/packages/ui/certd-client/src/api/service.ts @@ -28,6 +28,7 @@ function createService() { // dataAxios 是 axios 返回数据中的 data const dataAxios = response.data; + // @ts-ignore if (response.config.unpack === false) { //如果不需要解包 return dataAxios; diff --git a/packages/ui/certd-client/src/components/cron-editor/index.vue b/packages/ui/certd-client/src/components/cron-editor/index.vue index d9091185b..aa6e26934 100644 --- a/packages/ui/certd-client/src/components/cron-editor/index.vue +++ b/packages/ui/certd-client/src/components/cron-editor/index.vue @@ -48,6 +48,15 @@ const onUpdate = (value: string) => { if (value === props.modelValue) { return; } + const arr: string[] = value.split(" "); + if (arr[0] === "*") { + arr[0] = "0"; + } + if (arr[1] === "*") { + arr[1] = "0"; + } + value = arr.join(" "); + emit("update:modelValue", value); errorMessage.value = undefined; }; diff --git a/packages/ui/certd-client/src/router/source/modules/certd.ts b/packages/ui/certd-client/src/router/source/modules/certd.ts index 062d70552..bdab1c79b 100644 --- a/packages/ui/certd-client/src/router/source/modules/certd.ts +++ b/packages/ui/certd-client/src/router/source/modules/certd.ts @@ -1,5 +1,3 @@ -import { sysResources } from "/@/router/source/modules/sys"; - export const certdResources = [ { title: "证书自动化", diff --git a/packages/ui/certd-client/src/views/certd/pipeline/certd-form/crud.tsx b/packages/ui/certd-client/src/views/certd/pipeline/certd-form/crud.tsx index ca686f960..ca78cf67a 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/certd-form/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/pipeline/certd-form/crud.tsx @@ -98,7 +98,7 @@ export default function (certPluginGroup: PluginGroup, formWrapperRef: any): Cre vModel: "modelValue", placeholder: "0 0 4 * * *" }, - helper: "点击上面的按钮,选择每天几点几分定时执行,后面的分秒都要选择0。\n建议设置为每天触发一次,证书未到期之前任务会跳过,不会重复执行", + helper: "点击上面的按钮,选择每天几点定时执行。\n建议设置为每天触发一次,证书未到期之前任务会跳过,不会重复执行", order: 100 } }, diff --git a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/trigger-form/index.vue b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/trigger-form/index.vue index b6dacaf3d..e65a3976b 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/trigger-form/index.vue +++ b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/trigger-form/index.vue @@ -58,7 +58,7 @@ name: 'cron-editor', vModel: 'modelValue' }, - helper: '点击上面的按钮,选择每天几点几分定时执行,后面的分秒都要选择0。\n建议设置为每天触发一次,证书未到期之前任务会跳过,不会重复执行', + helper: '点击上面的按钮,选择每天几点定时执行。\n建议设置为每天触发一次,证书未到期之前任务会跳过,不会重复执行', rules: [{ required: true, message: '此项必填' }] }" /> diff --git a/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts b/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts index fae388a8e..874cb730b 100644 --- a/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts +++ b/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts @@ -306,8 +306,11 @@ export class PipelineService extends BaseService { return; } cron = cron.trim(); + if (cron.startsWith('* *')) { + cron = cron.replace('* *', '0 0'); + } if (cron.startsWith('*')) { - cron = '0' + cron.substring(1, cron.length); + cron = cron.replace('*', '0'); } const triggerId = trigger.id; const name = this.buildCronKey(pipelineId, triggerId); From 7ad4b55ee000c1dd0747832b11107f32b0ffb889 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Fri, 1 Nov 2024 10:23:45 +0800 Subject: [PATCH 003/119] =?UTF-8?q?perf:=20=E7=A6=81=E6=AD=A2=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E7=BC=93=E5=AD=98=EF=BC=8C=E7=82=B9=E5=87=BBtab?= =?UTF-8?q?=E9=A1=B5=E7=AD=BE=E5=8F=AF=E4=BB=A5=E5=88=B7=E6=96=B0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui/certd-client/src/router/resolve.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ui/certd-client/src/router/resolve.ts b/packages/ui/certd-client/src/router/resolve.ts index 8c36cc7dd..7c53cdeae 100644 --- a/packages/ui/certd-client/src/router/resolve.ts +++ b/packages/ui/certd-client/src/router/resolve.ts @@ -40,11 +40,11 @@ function transformOneResource(resource: any, parent: any) { if (route.component == null) { route.component = LayoutPass; } - if (route?.meta?.cache !== false) { + if (route?.meta?.cache !== true) { if (route.meta == null) { route.meta = {}; } - route.meta.cache = true; + route.meta.cache = false; } } if (resource.children) { From b1117ed54a3ef015752999324ff72b821ef5e4b9 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Fri, 1 Nov 2024 18:09:32 +0800 Subject: [PATCH 004/119] =?UTF-8?q?perf:=20cname=20=E5=9F=9F=E5=90=8D?= =?UTF-8?q?=E6=98=A0=E5=B0=84=E8=AE=B0=E5=BD=95=E5=8F=AF=E8=AF=BB=E6=80=A7?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/basic/src/utils/index.ts | 6 +- packages/core/basic/src/utils/util.id.ts | 3 + .../src/system/basic/service/plus-service.ts | 9 ++- packages/ui/certd-client/package.json | 8 +-- .../cname-record-info.vue | 7 ++- .../domains-verify-plan-editor/cname-tip.vue | 19 ++++++ .../components/tutorial/tutorial-steps.vue | 16 +++-- .../src/components/vip-button/index.vue | 9 ++- .../src/layout/layout-framework.vue | 2 +- .../src/views/certd/cname/record/crud.tsx | 29 +++++++-- .../src/controller/basic/file-controller.ts | 1 + .../cname/cname-provider-controller.ts | 2 +- .../cname/cname-record-controller.ts | 3 +- .../{cname_provider.ts => cname-provider.ts} | 2 + .../cname/service/cname-provider-service.ts | 25 ++++++-- .../cname/service/cname-record-service.ts | 23 +++++-- .../modules/cname/service/common-provider.ts | 61 +++++++++++++++++++ 17 files changed, 190 insertions(+), 35 deletions(-) create mode 100644 packages/core/basic/src/utils/util.id.ts create mode 100644 packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/cname-tip.vue rename packages/ui/certd-server/src/modules/cname/entity/{cname_provider.ts => cname-provider.ts} (98%) create mode 100644 packages/ui/certd-server/src/modules/cname/service/common-provider.ts diff --git a/packages/core/basic/src/utils/index.ts b/packages/core/basic/src/utils/index.ts index ba12f73a2..fb8568817 100644 --- a/packages/core/basic/src/utils/index.ts +++ b/packages/core/basic/src/utils/index.ts @@ -9,7 +9,7 @@ export * from './util.merge.js'; export * from './util.cache.js'; import sleep from './util.sleep.js'; import { http } from './util.request.js'; -import { nanoid } from 'nanoid'; + import { mergeUtils } from './util.merge.js'; import { sp } from './util.sp.js'; import { hashUtils } from './util.hash.js'; @@ -20,7 +20,8 @@ import { cache } from './util.cache.js'; import dayjs from 'dayjs'; import { domainUtils } from './util.domain.js'; import { optionsUtils } from './util.options.js'; - +import { nanoid } from 'nanoid'; +import * as id from './util.id.js'; export const utils = { sleep, http, @@ -32,6 +33,7 @@ export const utils = { mergeUtils, cache, nanoid, + id, dayjs, domain: domainUtils, options: optionsUtils, diff --git a/packages/core/basic/src/utils/util.id.ts b/packages/core/basic/src/utils/util.id.ts new file mode 100644 index 000000000..472d1fe2f --- /dev/null +++ b/packages/core/basic/src/utils/util.id.ts @@ -0,0 +1,3 @@ +import { customAlphabet } from 'nanoid'; + +export const simpleNanoId = customAlphabet('1234567890abcdefghijklmopqrstuvwxyz', 10); diff --git a/packages/libs/lib-server/src/system/basic/service/plus-service.ts b/packages/libs/lib-server/src/system/basic/service/plus-service.ts index 803308d64..faa2e2ed1 100644 --- a/packages/libs/lib-server/src/system/basic/service/plus-service.ts +++ b/packages/libs/lib-server/src/system/basic/service/plus-service.ts @@ -12,13 +12,18 @@ export class PlusService { plusServerBaseUrls: string[]; async getPlusRequestService() { - const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo); + const subjectId = await this.getSubjectId(); return new PlusRequestService({ plusServerBaseUrls: this.plusServerBaseUrls, - subjectId: installInfo.siteId, + subjectId, }); } + async getSubjectId() { + const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo); + return installInfo.siteId; + } + async requestWithoutSign(config: any) { const plusRequestService = await this.getPlusRequestService(); return await plusRequestService.requestWithoutSign(config); diff --git a/packages/ui/certd-client/package.json b/packages/ui/certd-client/package.json index a9e8da715..270299396 100644 --- a/packages/ui/certd-client/package.json +++ b/packages/ui/certd-client/package.json @@ -26,10 +26,10 @@ "dependencies": { "@ant-design/colors": "^7.0.2", "@ant-design/icons-vue": "^6.1.0", - "@fast-crud/fast-crud": "^1.22.2", - "@fast-crud/fast-extends": "^1.22.2", - "@fast-crud/ui-antdv4": "^1.22.2", - "@fast-crud/ui-interface": "^1.22.2", + "@fast-crud/fast-crud": "^1.22.3", + "@fast-crud/fast-extends": "^1.22.3", + "@fast-crud/ui-antdv4": "^1.22.3", + "@fast-crud/ui-interface": "^1.22.3", "@iconify/vue": "^4.1.1", "@soerenmartius/vue3-clipboard": "^0.1.2", "@vue-js-cron/light": "^4.0.5", diff --git a/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/cname-record-info.vue b/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/cname-record-info.vue index 5050c142b..10fbe4aa3 100644 --- a/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/cname-record-info.vue +++ b/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/cname-record-info.vue @@ -15,7 +15,11 @@ - 点击验证 + +
不要删除CNAME
@@ -27,6 +31,7 @@ import { CnameRecord, GetByDomain } from "/@/components/plugins/cert/domains-ver import { ref, watch } from "vue"; import { dict } from "@fast-crud/fast-crud"; import * as api from "./api.js"; +import CnameTip from "./cname-tip.vue"; const statusDict = dict({ data: [ { label: "待设置CNAME", value: "cname", color: "warning" }, diff --git a/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/cname-tip.vue b/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/cname-tip.vue new file mode 100644 index 000000000..4b56da377 --- /dev/null +++ b/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/cname-tip.vue @@ -0,0 +1,19 @@ + + + diff --git a/packages/ui/certd-client/src/components/tutorial/tutorial-steps.vue b/packages/ui/certd-client/src/components/tutorial/tutorial-steps.vue index 81ef87f37..4f881079f 100644 --- a/packages/ui/certd-client/src/components/tutorial/tutorial-steps.vue +++ b/packages/ui/certd-client/src/components/tutorial/tutorial-steps.vue @@ -64,18 +64,22 @@ const steps = ref([ { image: "/static/doc/images/3-add-success.png", title: "流水线创建成功", - descriptions: ["此时证书申请任务已经建好", "点击手动触发即可测试证书申请", "接下来演示如何添加部署任务"] + descriptions: ["点击手动触发即可申请证书"] + }, + { + title: "接下来演示如何自动部署证书", + descriptions: ["如果您只需要申请证书,那么到这一步就可以了"] } ] }, { title: "添加部署证书任务", - description: "演示部署到主机上的Nginx", + description: "这里演示部署证书到Nginx", items: [ { image: "/static/doc/images/5-1-add-host.png", - title: "添加nginx部署任务", - descriptions: ["演示第一个部署任务,部署到nginx"] + title: "添加证书部署任务", + descriptions: ["这里演示自动部署证书到nginx", "Certd提供茫茫多的部署插件,满足您的各种部署需求"] }, { image: "/static/doc/images/5-2-add-host.png", @@ -94,8 +98,8 @@ const steps = ref([ }, { image: "/static/doc/images/5-5-plugin-list.png", - title: "还可以添加其他更多部署任务", - descriptions: ["插件列表"] + title: "本系统提供茫茫多的部署插件", + descriptions: ["您可以根据自身需求将证书部署到各种应用和平台"] } ] }, diff --git a/packages/ui/certd-client/src/components/vip-button/index.vue b/packages/ui/certd-client/src/components/vip-button/index.vue index fbf104234..eaca81830 100644 --- a/packages/ui/certd-client/src/components/vip-button/index.vue +++ b/packages/ui/certd-client/src/components/vip-button/index.vue @@ -155,7 +155,7 @@ function openUpgrade() { title = "续期专业版/升级商业版"; } - modal.confirm({ + const modalRef = modal.confirm({ title, async onOk() { return await doActive(); @@ -206,6 +206,10 @@ function openUpgrade() { ); } + function goAccount() { + router.push("/sys/account"); + modalRef.destroy(); + } return (
@@ -226,6 +230,9 @@ function openUpgrade() { 没有激活码? {activationCodeGetWay}
+
+ 激活码使用过一次之后,不可再次使用,如果要更换站点,请绑定账号,然后"转移VIP"即可 +
); diff --git a/packages/ui/certd-client/src/layout/layout-framework.vue b/packages/ui/certd-client/src/layout/layout-framework.vue index 19060c5f4..d843b3c82 100644 --- a/packages/ui/certd-client/src/layout/layout-framework.vue +++ b/packages/ui/certd-client/src/layout/layout-framework.vue @@ -165,7 +165,7 @@ onMounted(async () => { await settingStore.checkUrlBound(); }); -function menuClick(menu) { +function menuClick(menu: any) { routerUtils.open(menu.path); } diff --git a/packages/ui/certd-client/src/views/certd/cname/record/crud.tsx b/packages/ui/certd-client/src/views/certd/cname/record/crud.tsx index a19fe246f..9127b8f32 100644 --- a/packages/ui/certd-client/src/views/certd/cname/record/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/cname/record/crud.tsx @@ -6,7 +6,7 @@ import { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, Edi import { useUserStore } from "/@/store/modules/user"; import { useSettingStore } from "/@/store/modules/settings"; import { message } from "ant-design-vue"; - +import CnameTip from "/@/components/plugins/cert/domains-verify-plan-editor/cname-tip.vue"; export default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet { const router = useRouter(); const { t } = useI18n(); @@ -126,11 +126,18 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat component: { onDictChange: ({ form, dict }: any) => { if (!form.cnameProviderId) { - const item = dict.data.find((item: any) => item.isDefault); + const item = dict.data.find((item: any) => item.isDefault && !item.disabled); if (item) { form.cnameProviderId = item.id; } } + }, + renderLabel(item: any) { + if (item.title) { + return `${item.domain}<${item.title}>`; + } else { + return item.domain; + } } }, helper: { @@ -147,7 +154,13 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat } }, column: { - show: false + cellRender({ value }) { + if (value < 0) { + return 公共CNAME; + } else { + return 自定义CNAME; + } + } } }, status: { @@ -183,6 +196,7 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat if (row.status === "valid") { return "-"; } + async function doVerify() { row._validating_ = true; try { @@ -199,9 +213,12 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat } } return ( - - 点击验证 - +
+ + 点击验证 + + +
); } } diff --git a/packages/ui/certd-server/src/controller/basic/file-controller.ts b/packages/ui/certd-server/src/controller/basic/file-controller.ts index 714b5d9e6..7c6519210 100644 --- a/packages/ui/certd-server/src/controller/basic/file-controller.ts +++ b/packages/ui/certd-server/src/controller/basic/file-controller.ts @@ -41,6 +41,7 @@ export class FileController extends BaseController { } const filePath = this.fileService.getFile(key, userId); this.ctx.response.attachment(filePath); + this.ctx.response.set('Cache-Control', 'public,max-age=2592000'); await send(this.ctx, filePath); } } diff --git a/packages/ui/certd-server/src/controller/cname/cname-provider-controller.ts b/packages/ui/certd-server/src/controller/cname/cname-provider-controller.ts index 2aca6a6d6..958c40df4 100644 --- a/packages/ui/certd-server/src/controller/cname/cname-provider-controller.ts +++ b/packages/ui/certd-server/src/controller/cname/cname-provider-controller.ts @@ -21,7 +21,7 @@ export class CnameProviderController extends BaseController { @Post('/list', { summary: Constants.per.authOnly }) async list(@Body(ALL) body: any) { body.userId = this.getUserId(); - const res = await this.providerService.find({}); + const res = await this.providerService.list({}); return this.ok(res); } } diff --git a/packages/ui/certd-server/src/controller/cname/cname-record-controller.ts b/packages/ui/certd-server/src/controller/cname/cname-record-controller.ts index 7a1ad15f8..9d0e55bf5 100644 --- a/packages/ui/certd-server/src/controller/cname/cname-record-controller.ts +++ b/packages/ui/certd-server/src/controller/cname/cname-record-controller.ts @@ -40,7 +40,8 @@ export class CnameRecordController extends CrudController { @Post('/list', { summary: Constants.per.authOnly }) async list(@Body(ALL) body: any) { body.userId = this.getUserId(); - return super.list(body); + const list = await this.getService().list(body); + return this.ok(list); } @Post('/add', { summary: Constants.per.authOnly }) diff --git a/packages/ui/certd-server/src/modules/cname/entity/cname_provider.ts b/packages/ui/certd-server/src/modules/cname/entity/cname-provider.ts similarity index 98% rename from packages/ui/certd-server/src/modules/cname/entity/cname_provider.ts rename to packages/ui/certd-server/src/modules/cname/entity/cname-provider.ts index b64d1c5cf..4da5fb633 100644 --- a/packages/ui/certd-server/src/modules/cname/entity/cname_provider.ts +++ b/packages/ui/certd-server/src/modules/cname/entity/cname-provider.ts @@ -34,4 +34,6 @@ export class CnameProviderEntity { default: () => 'CURRENT_TIMESTAMP', }) updateTime: Date; + + title: string; } diff --git a/packages/ui/certd-server/src/modules/cname/service/cname-provider-service.ts b/packages/ui/certd-server/src/modules/cname/service/cname-provider-service.ts index 3352075ac..feec8ef96 100644 --- a/packages/ui/certd-server/src/modules/cname/service/cname-provider-service.ts +++ b/packages/ui/certd-server/src/modules/cname/service/cname-provider-service.ts @@ -1,8 +1,9 @@ import { Provide, Scope, ScopeEnum } from '@midwayjs/core'; import { InjectEntityModel } from '@midwayjs/typeorm'; import { Repository } from 'typeorm'; -import { BaseService, ValidateException } from '@certd/lib-server'; -import { CnameProviderEntity } from '../entity/cname_provider.js'; +import { BaseService, ListReq, ValidateException } from '@certd/lib-server'; +import { CnameProviderEntity } from '../entity/cname-provider.js'; +import { CommonProviders } from './common-provider.js'; /** * 授权 @@ -19,7 +20,7 @@ export class CnameProviderService extends BaseService { } async getDefault() { - return await this.repository.findOne({ where: { isDefault: true } }); + return await this.repository.findOne({ where: { isDefault: true, disabled: false } }); } /** * 新增 @@ -80,10 +81,24 @@ export class CnameProviderService extends BaseService { if (def) { return def; } - const founds = await this.repository.find({ take: 1, order: { createTime: 'DESC' } }); + const founds = await this.repository.find({ take: 1, order: { createTime: 'DESC' }, where: { disabled: false } }); if (founds && founds.length > 0) { return founds[0]; } - return null; + return CommonProviders[0] as CnameProviderEntity; + } + + async list(req: ListReq): Promise { + const list = await super.list(req); + + return [...list, ...CommonProviders]; + } + + async info(id: any, infoIgnoreProperty?: any): Promise { + if (id < 0) { + //使用公共provider + return CommonProviders.find(p => p.id === id); + } + return await super.info(id, infoIgnoreProperty); } } diff --git a/packages/ui/certd-server/src/modules/cname/service/cname-record-service.ts b/packages/ui/certd-server/src/modules/cname/service/cname-record-service.ts index e7210784c..e92f01758 100644 --- a/packages/ui/certd-server/src/modules/cname/service/cname-record-service.ts +++ b/packages/ui/certd-server/src/modules/cname/service/cname-record-service.ts @@ -1,16 +1,16 @@ import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core'; import { InjectEntityModel } from '@midwayjs/typeorm'; import { Repository } from 'typeorm'; -import { BaseService, ValidateException } from '@certd/lib-server'; +import { BaseService, PlusService, ValidateException } from '@certd/lib-server'; import { CnameRecordEntity, CnameRecordStatusType } from '../entity/cname-record.js'; -import { v4 as uuidv4 } from 'uuid'; import { createDnsProvider, IDnsProvider, parseDomain } from '@certd/plugin-cert'; import { cache, CnameProvider, http, logger, utils } from '@certd/pipeline'; import { AccessService } from '../../pipeline/service/access-service.js'; import { isDev } from '../../../utils/env.js'; import { walkTxtRecord } from '@certd/acme-client'; import { CnameProviderService } from './cname-provider-service.js'; -import { CnameProviderEntity } from '../entity/cname_provider.js'; +import { CnameProviderEntity } from '../entity/cname-provider.js'; +import { CommonDnsProvider } from './common-provider.js'; type CnameCheckCacheValue = { validating: boolean; @@ -34,6 +34,10 @@ export class CnameRecordService extends BaseService { @Inject() accessService: AccessService; + + @Inject() + plusService: PlusService; + //@ts-ignore getRepository() { return this.repository; @@ -85,8 +89,8 @@ export class CnameRecordService extends BaseService { } param.hostRecord = hostRecord; - const cnameKey = uuidv4().replaceAll('-', ''); - param.recordValue = `${cnameKey}.${cnameProvider.domain}`; + const cnameKey = utils.id.simpleNanoId(); + param.recordValue = `${param.domain}.${cnameKey}.${cnameProvider.domain}`; } async update(param: any) { @@ -189,6 +193,15 @@ export class CnameRecordService extends BaseService { if (cnameProvider == null) { throw new ValidateException(`CNAME服务:${bean.cnameProviderId} 已被删除,请修改CNAME记录,重新选择CNAME服务`); } + + if (cnameProvider.id < 0) { + //公共CNAME + return new CommonDnsProvider({ + config: cnameProvider, + plusService: this.plusService, + }); + } + const access = await this.accessService.getById(cnameProvider.accessId, cnameProvider.userId); const context = { access, logger, http, utils }; const dnsProvider: IDnsProvider = await createDnsProvider({ diff --git a/packages/ui/certd-server/src/modules/cname/service/common-provider.ts b/packages/ui/certd-server/src/modules/cname/service/common-provider.ts new file mode 100644 index 000000000..fb0f987b0 --- /dev/null +++ b/packages/ui/certd-server/src/modules/cname/service/common-provider.ts @@ -0,0 +1,61 @@ +import { CreateRecordOptions, DnsProviderContext, IDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert'; +import { PlusService } from '@certd/lib-server'; + +export type CnameProvider = { + id: number; + domain: string; + title: string; +}; +export const CommonProviders = [ + { + id: -1, + domain: 'cname.certd.com.cn', + title: '公共CNAME服务', + }, +]; + +export class CommonDnsProvider implements IDnsProvider { + ctx: DnsProviderContext; + config: CnameProvider; + plusService: PlusService; + + constructor(opts: { config: CnameProvider; plusService: PlusService }) { + this.config = opts.config; + this.plusService = opts.plusService; + } + + async onInstance() {} + async createRecord(options: CreateRecordOptions) { + if (!this.config.domain.endsWith(options.domain)) { + throw new Error('cname服务域名不匹配'); + } + const res = await this.plusService.requestWithoutSign({ + url: '/activation/certd/cname/recordCreate', + data: { + subjectId: this.plusService.getSubjectId(), + domain: options.domain, + hostRecord: options.hostRecord, + recordValue: options.value, + providerId: this.config.id, + }, + }); + return res; + } + async removeRecord(options: RemoveRecordOptions) { + const res = await this.plusService.requestWithoutSign({ + url: '/activation/certd/cname/recordRemove', + data: { + subjectId: this.plusService.getSubjectId(), + domain: options.recordReq.domain, + hostRecord: options.recordReq.hostRecord, + recordValue: options.recordReq.value, + recordId: options.recordRes.id, + providerId: this.config.id, + }, + }); + return res; + } + setCtx(ctx: DnsProviderContext): void { + this.ctx = ctx; + } +} From 222ef2f8509921f37430fd07e7ed40230d3c6349 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sat, 2 Nov 2024 21:23:42 +0800 Subject: [PATCH 005/119] chore: 1 --- build-dev.trigger | 2 +- packages/ui/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build-dev.trigger b/build-dev.trigger index aed7fe9af..d00491fd7 100644 --- a/build-dev.trigger +++ b/build-dev.trigger @@ -1 +1 @@ -21:59 +1 diff --git a/packages/ui/Dockerfile b/packages/ui/Dockerfile index fe7bd2e8a..9ce5f5449 100644 --- a/packages/ui/Dockerfile +++ b/packages/ui/Dockerfile @@ -13,7 +13,7 @@ RUN cd /workspace/certd-server && pnpm install && npm run build-on-docker FROM node:18-alpine RUN apk add --no-cache openssl -# RUN apk add --no-cache openjdk11-jdk +RUN apk add --no-cache openjdk8 WORKDIR /app/ COPY --from=builder /workspace/certd-server/ /app/ #RUN cd /app/tools/linux/ && ls -lh && tar -zxvf lego_linux_amd64.tar.gz From 8b7572a9e58d6b0ab632c7b97addba85b7008a73 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sat, 2 Nov 2024 22:04:05 +0800 Subject: [PATCH 006/119] chore: 1 --- docs/.vitepress/config.ts | 1 + docs/guide/use/custom-script/index.md | 80 +++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 docs/guide/use/custom-script/index.md diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 91185bb2f..5dec81bcd 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -98,6 +98,7 @@ export default defineConfig({ { text: "忘记密码", link: "/guide/use/forgotpasswd/" }, { text: "数据备份", link: "/guide/use/backup/" }, { text: "Certd本身的证书更新", link: "/guide/use/https/index.md" }, + { text: "js脚本插件使用", link: "/guide/use/custom-script/index.md" }, { text: "如何贡献代码", link: "/guide/development/index.md" }, ] }, diff --git a/docs/guide/use/custom-script/index.md b/docs/guide/use/custom-script/index.md new file mode 100644 index 000000000..6d8e84200 --- /dev/null +++ b/docs/guide/use/custom-script/index.md @@ -0,0 +1,80 @@ +# 自定义脚本插件 + +## 介绍 + +自定义脚本插件是一个通用的插件,可以通过编写脚本来实现各种功能,例如:调用第三方API、执行系统命令、发送邮件等。 + +## 使用示例 +```js +const certPem = this.ctx.self.cert.crt +const certKey = this.ctx.self.cert.key + +//axios发起http请求上传证书 +const res = await this.ctx.http.request({ + url:"your_cert_deploy_url", + method:"post", + data:{ + crt : certPem, + key : certKey + } +}) +this.ctx.logger.info("上传成功",res.data) + + +``` +## API + + +```ts + +type ctx = { + CertReader: typeof CertReader; + self: CustomScriptPlugin; + //流水线定义 + pipeline: Pipeline; + //步骤定义 + step: Step; + //日志 + logger: Logger; + //当前步骤输入参数跟上一次执行比较是否有变化 + inputChanged: boolean; + //授权获取服务 + accessService: IAccessService; + //邮件服务 + emailService: IEmailService; + //cname记录服务 + cnameProxyService: ICnameProxyService; + //插件配置服务 + pluginConfigService: IPluginConfigService; + //流水线上下文 + pipelineContext: IContext; + //用户上下文 + userContext: IContext; + //http请求客户端 + http: HttpClient; // http.request(AxiosConfig) + //文件存储 + fileStore: FileStore; + //上一次执行结果状态 + lastStatus?: Runnable; + //用户取消信号 + signal: AbortSignal; + //工具类 + utils: typeof utils; + //用户信息 + user: UserInfo; +} + +type CertInfo = { + crt:string; //fullchain证书,即 cert.pem, cert.crt + key:string; // 私钥 + ic: string; //中间证书 + pfx: string;//PFX证书,base64编码 + der: string;//DER证书,base64编码 +} + +type CustomScriptPlugin = { + //可以获取证书 + cert: CertInfo +} + +``` From 0cea8db0f96102d4c6289f663cc76f8983125b0a Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sat, 2 Nov 2024 22:05:37 +0800 Subject: [PATCH 007/119] chore: 1 --- docs/guide/use/custom-script/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/guide/use/custom-script/index.md b/docs/guide/use/custom-script/index.md index 6d8e84200..a984a6d3f 100644 --- a/docs/guide/use/custom-script/index.md +++ b/docs/guide/use/custom-script/index.md @@ -1,10 +1,10 @@ # 自定义脚本插件 -## 介绍 +## 1. 介绍 自定义脚本插件是一个通用的插件,可以通过编写脚本来实现各种功能,例如:调用第三方API、执行系统命令、发送邮件等。 -## 使用示例 +## 2. 使用示例 ```js const certPem = this.ctx.self.cert.crt const certKey = this.ctx.self.cert.key @@ -22,8 +22,8 @@ this.ctx.logger.info("上传成功",res.data) ``` -## API - +## 3. API +下面是`ctx`对象的`typescript`类型定义 ```ts From ba11febad6d3b032380b41d2075d94bb3b2be6d3 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sat, 2 Nov 2024 22:26:35 +0800 Subject: [PATCH 008/119] chore: docs --- README.md | 31 ++++++++++++++++++------------- docs/images/start/home.png | Bin 0 -> 166900 bytes step.md | 2 +- 3 files changed, 19 insertions(+), 14 deletions(-) create mode 100644 docs/images/start/home.png diff --git a/README.md b/README.md index 8abc2c1b3..482f1dc80 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ Certd 是一个免费全自动申请和自动部署更新SSL证书的管理系 关键字:证书自动申请、证书自动更新、证书自动续期、证书自动续签、证书管理工具 - ## 一、特性 本项目不仅支持证书申请过程自动化,还可以自动化部署更新证书,让你的证书永不过期。 @@ -28,25 +27,31 @@ https://certd.handsfree.work/ > 注意数据将不定期清理,不定期停止定时任务,生产使用请自行部署 > 包含敏感信息,务必自己本地部署进行生产使用 +![首页](./docs/images/start/home.png) + ## 三、使用教程 更多教程请访问文档网站 [certd.docmirror.cn](https://certd.docmirror.cn/) -本案例演示,如何配置自动申请证书,并部署到阿里云CDN,然后快要到期前自动更新证书并重新部署 +仅需3步,让你的证书永不过期 + +### 1. 创建证书流水线 +![演示](packages/ui/certd-client/public/static/doc/images/1-add.png) + +### 2. 添加部署任务 +此处演示部署证书到主机上的nginx上 +certd支持海量的部署插件,您可以根据自身实际情况进行选择,比如部署到阿里云、腾讯云、CDN、宝塔、1Panel等应用或系统上 +![演示](packages/ui/certd-client/public/static/doc/images/5-1-add-host.png) + +### 3. 定时运行 +![演示](packages/ui/certd-client/public/static/doc/images/12-1-log-success.png) -![演示](packages/ui/certd-client/public/static/doc/images/5-view.png) -![演示](packages/ui/certd-client/public/static/doc/images/9-start.png) -![演示](packages/ui/certd-client/public/static/doc/images/10-1-log.png) -![演示](packages/ui/certd-client/public/static/doc/images/13-3-download.png) -![演示](packages/ui/certd-client/public/static/doc/images/13-1-result.png) ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ -------> [点我查看详细使用步骤演示](./step.md) <-------- ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ -当前支持的部署插件列表 -![演示](./docs/images/plugins/list.png) ## 四、私有化部署 @@ -54,10 +59,10 @@ https://certd.handsfree.work/ 您可以根据实际情况从如下方式中选择一种方式进行私有化部署: -1. [宝塔面板方式部署](./install/baota/) -2. [1Panel面板方式部署](./install/1panel/) -2. [Docker方式部署](./install/docker/) -3. [源码方式部署](./install/source/) +1. [宝塔面板方式部署](https://certd.docmirror.cn/guide/install/docker/) +2. [1Panel面板方式部署](https://certd.docmirror.cn/guide/install/1panel/) +2. [Docker方式部署](https://certd.docmirror.cn/guide/install/docker/) +3. [源码方式部署](https://certd.docmirror.cn/guide/install/source/) #### Docker镜像说明: * 国内镜像地址: diff --git a/docs/images/start/home.png b/docs/images/start/home.png new file mode 100644 index 0000000000000000000000000000000000000000..cbcbb92afc3d5f6f538e1e2a122ed42997d64a17 GIT binary patch literal 166900 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
  • %0^VXSVb{e=JYNl2qT}vwy^oHN(q(g9%Wt&T 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

    R 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 R5DW^&_*e5& Date: Sat, 2 Nov 2024 22:34:32 +0800 Subject: [PATCH 009/119] chore: docs --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 482f1dc80..f9ac85fc8 100644 --- a/README.md +++ b/README.md @@ -31,9 +31,6 @@ https://certd.handsfree.work/ ## 三、使用教程 -更多教程请访问文档网站 [certd.docmirror.cn](https://certd.docmirror.cn/) - - 仅需3步,让你的证书永不过期 ### 1. 创建证书流水线 @@ -52,6 +49,9 @@ certd支持海量的部署插件,您可以根据自身实际情况进行选择 -------> [点我查看详细使用步骤演示](./step.md) <-------- ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ +更多教程请访问文档网站 [certd.docmirror.cn](https://certd.docmirror.cn/) + + ## 四、私有化部署 From f4f8d45a8e6b8deb5d0ff11d0476bb56bf90c731 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sat, 2 Nov 2024 22:48:11 +0800 Subject: [PATCH 010/119] chore: docs --- README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f9ac85fc8..21c16b45f 100644 --- a/README.md +++ b/README.md @@ -36,9 +36,12 @@ https://certd.handsfree.work/ ### 1. 创建证书流水线 ![演示](packages/ui/certd-client/public/static/doc/images/1-add.png) +> 添加成功后,就可以直接运行流水线申请证书了 + ### 2. 添加部署任务 -此处演示部署证书到主机上的nginx上 -certd支持海量的部署插件,您可以根据自身实际情况进行选择,比如部署到阿里云、腾讯云、CDN、宝塔、1Panel等应用或系统上 +当然我们一般需要把证书部署到应用上,certd支持海量的部署插件,您可以根据自身实际情况进行选择,比如部署到Nginx、阿里云、腾讯云、K8S、CDN、宝塔、1Panel等等 + +此处演示部署证书到主机的nginx上 ![演示](packages/ui/certd-client/public/static/doc/images/5-1-add-host.png) ### 3. 定时运行 @@ -61,8 +64,8 @@ certd支持海量的部署插件,您可以根据自身实际情况进行选择 1. [宝塔面板方式部署](https://certd.docmirror.cn/guide/install/docker/) 2. [1Panel面板方式部署](https://certd.docmirror.cn/guide/install/1panel/) -2. [Docker方式部署](https://certd.docmirror.cn/guide/install/docker/) -3. [源码方式部署](https://certd.docmirror.cn/guide/install/source/) +3. [Docker方式部署](https://certd.docmirror.cn/guide/install/docker/) +4. [源码方式部署](https://certd.docmirror.cn/guide/install/source/) #### Docker镜像说明: * 国内镜像地址: From 3563a4cc36d07755707f9cd6cbf1efb49b9c6486 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sat, 2 Nov 2024 23:37:25 +0800 Subject: [PATCH 011/119] =?UTF-8?q?chore:=20=E8=A7=A3=E5=8E=8Blego?= =?UTF-8?q?=E4=B9=8B=E5=90=8E=EF=BC=8C=E8=AE=BE=E7=BD=AE=E4=B8=BA=E5=8F=AF?= =?UTF-8?q?=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/plugin-cert/src/plugin/cert-plugin/lego/index.ts | 3 +++ packages/ui/Dockerfile | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/lego/index.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/lego/index.ts index a37fa1d32..5887144b2 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/lego/index.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/lego/index.ts @@ -140,6 +140,9 @@ export class CertApplyLegoPlugin extends CertApplyBasePlugin { await utils.sp.spawn({ cmd: `tar -zxvf ./tools/linux/lego_linux_${platform}.tar.gz -C ./tools/linux/`, }); + await utils.sp.spawn({ + cmd: `chmod +x ./tools/linux/*`, + }); this.logger.info("解压lego成功"); } else { const zip = new JSZip(); diff --git a/packages/ui/Dockerfile b/packages/ui/Dockerfile index 9ce5f5449..26d321ff9 100644 --- a/packages/ui/Dockerfile +++ b/packages/ui/Dockerfile @@ -16,8 +16,7 @@ RUN apk add --no-cache openssl RUN apk add --no-cache openjdk8 WORKDIR /app/ COPY --from=builder /workspace/certd-server/ /app/ -#RUN cd /app/tools/linux/ && ls -lh && tar -zxvf lego_linux_amd64.tar.gz -RUN chmod +x /app/tools/linux/* + ENV TZ=Asia/Shanghai ENV NODE_ENV=production From ba4cc234ae3fcfbe45a374e8f2dc6b67026a1165 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 09:27:59 +0800 Subject: [PATCH 012/119] chore: --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8abc2c1b3..a7b9eb0b6 100644 --- a/README.md +++ b/README.md @@ -164,7 +164,7 @@ https://afdian.com/a/greper ## 十二、 开源许可 * 本项目遵循 GNU Affero General Public License(AGPL)开源协议。 -* 允许个人和公司使用、复制、修改和分发本项目,禁止任何形式的商业用途 +* 允许个人和公司内部自由使用、复制、修改和分发本项目,未获得商业授权情况下禁止任何形式的商业用途 * 未获得商业授权情况下,禁止任何对logo、版权信息及授权许可相关代码的修改。 * 如需商业授权,请联系作者。 From 5b3931ecb700cdfedfc620572985e81470ebed9c Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 10:34:50 +0800 Subject: [PATCH 013/119] chore: --- .github/workflows/sync-to-gitee-dev.yml | 1 + .github/workflows/sync-to-gitee.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/sync-to-gitee-dev.yml b/.github/workflows/sync-to-gitee-dev.yml index 2cc62d7eb..d893ac014 100644 --- a/.github/workflows/sync-to-gitee-dev.yml +++ b/.github/workflows/sync-to-gitee-dev.yml @@ -16,6 +16,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + lfs: true - name: Set git user # 2. 给git命令设置用户名和邮箱,↙↙↙ 改成你的name和email run: | git config --global user.name "xiaojunnuo" diff --git a/.github/workflows/sync-to-gitee.yml b/.github/workflows/sync-to-gitee.yml index 9707beaa8..f1eca2ab8 100644 --- a/.github/workflows/sync-to-gitee.yml +++ b/.github/workflows/sync-to-gitee.yml @@ -16,6 +16,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + lfs: true - name: Set git user # 2. 给git命令设置用户名和邮箱,↙↙↙ 改成你的name和email run: | git config --global user.name "xiaojunnuo" From e6ab0b6864ab0c09a05968b04fa5383851699810 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 10:38:15 +0800 Subject: [PATCH 014/119] =?UTF-8?q?chore:=20simple=20nanoid=2012=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/basic/src/utils/util.id.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/basic/src/utils/util.id.ts b/packages/core/basic/src/utils/util.id.ts index 472d1fe2f..ca00030c8 100644 --- a/packages/core/basic/src/utils/util.id.ts +++ b/packages/core/basic/src/utils/util.id.ts @@ -1,3 +1,3 @@ import { customAlphabet } from 'nanoid'; -export const simpleNanoId = customAlphabet('1234567890abcdefghijklmopqrstuvwxyz', 10); +export const simpleNanoId = customAlphabet('1234567890abcdefghijklmopqrstuvwxyz', 12); From cbe34981253fda6f063211fae6116fef85ee8466 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 11:58:44 +0800 Subject: [PATCH 015/119] chore: --- docs/guide/development/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guide/development/index.md b/docs/guide/development/index.md index b0216b372..8341d8754 100644 --- a/docs/guide/development/index.md +++ b/docs/guide/development/index.md @@ -7,13 +7,13 @@ ```shell # 克隆代码 -git clone https://github.com/certd/certd +git clone https://github.com/certd/certd --depth=1 #进入项目目录 cd certd -# 切换到最新版本代码 -git checkout v1.26.7 # 这里换成最新版本号 +# 切换到最新版本代码【如果v2分支无法编译,请尝试切换到最新版tag】 +# git checkout v1.27.0 # 这里换成最新版本号 ``` From 0f572f4cb3bed8db922ebb53a42dd0bf96e29723 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 13:32:02 +0800 Subject: [PATCH 016/119] chore: --- packages/ui/Dockerfile | 14 +++++++++++++- start.sh | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/ui/Dockerfile b/packages/ui/Dockerfile index 26d321ff9..337b8ca21 100644 --- a/packages/ui/Dockerfile +++ b/packages/ui/Dockerfile @@ -10,13 +10,25 @@ RUN npm install -g pnpm@8.15.7 RUN cp /workspace/certd-client/dist/* /workspace/certd-server/public/ -rf RUN cd /workspace/certd-server && pnpm install && npm run build-on-docker - FROM node:18-alpine RUN apk add --no-cache openssl RUN apk add --no-cache openjdk8 WORKDIR /app/ COPY --from=builder /workspace/certd-server/ /app/ +ENV LEGO_VERSION=4.19.2 +ENV LEGO_DOWNLOAD_DIR /app/tools/linux +RUN mkdir -p $LEGO_DOWNLOAD_DIR + +# 根据架构下载不同的文件 +RUN ARCH=$(uname -m) && \ + if [ "$ARCH" = "x86_64" ]; then \ + wget -O $LEGO_DOWNLOAD_DIR/lego_linux_amd64.tar.gz https://github.com/go-acme/lego/releases/download/v${LEGO_VERSION}/lego_v${LEGO_VERSION}_linux_arm64.tar.gz; \ + elif [ "$ARCH" = "aarch64" ]; then \ + wget -O $LEGO_DOWNLOAD_DIR/lego_linux_arm64.tar.gz https://github.com/go-acme/lego/releases/download/v${LEGO_VERSION}/lego_v${LEGO_VERSION}_linux_amd64.tar.gz; \ + else \ + echo "Unsupported architecture: $ARCH"; \ + fi ENV TZ=Asia/Shanghai ENV NODE_ENV=production diff --git a/start.sh b/start.sh index ad46a26b6..dd4edb467 100755 --- a/start.sh +++ b/start.sh @@ -1,6 +1,6 @@ # set -e -echo "即将删除packages下除ui之外的其他目录,按y确认" +echo "即将删除packages下除ui之外的其他目录,按y确认(如果您没有修改过源码,按y即可)" read -p "y/n: " confirm if [ $confirm != "y" ]; then echo "取消操作" From 1274f56da8066467b76aea11860e5aee97224de6 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 15:14:56 +0800 Subject: [PATCH 017/119] =?UTF-8?q?chore:=20basic=20=E4=BB=8Epipeline?= =?UTF-8?q?=E4=B8=AD=E7=A7=BB=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/basic/src/utils/index.ts | 3 +- packages/core/basic/src/utils/util.request.ts | 37 ++++++++++++++ packages/core/pipeline/src/access/api.ts | 2 +- .../core/pipeline/src/access/decorator.ts | 2 +- packages/core/pipeline/src/core/executor.ts | 2 +- packages/core/pipeline/src/core/file-store.ts | 4 +- packages/core/pipeline/src/core/handler.ts | 2 +- packages/core/pipeline/src/core/license.ts | 2 +- .../core/pipeline/src/core/run-history.ts | 2 +- packages/core/pipeline/src/core/storage.ts | 2 +- packages/core/pipeline/src/index.ts | 1 - packages/core/pipeline/src/plugin/api.ts | 4 +- .../core/pipeline/src/registry/registry.ts | 2 +- packages/core/pipeline/src/utils/index.ts | 1 - packages/libs/lib-k8s/package.json | 2 +- packages/libs/lib-k8s/src/lib/k8s.client.ts | 2 +- packages/libs/lib-server/package.json | 1 + packages/libs/lib-server/src/configuration.ts | 2 +- .../src/system/basic/service/file-service.ts | 2 +- .../src/system/basic/service/plus-service.ts | 2 +- .../plugin-cert/src/dns-provider/api.ts | 3 +- .../src/plugin/cert-plugin/acme.ts | 3 +- .../src/plugin/cert-plugin/base.ts | 3 +- .../src/plugin/cert-plugin/cert-reader.ts | 2 +- .../src/plugin/cert-plugin/convert.ts | 2 +- .../src/plugin/cert-plugin/index.ts | 4 +- .../src/plugin/cert-plugin/lego/index.ts | 51 +++++++++++++------ packages/ui/Dockerfile | 6 +-- packages/ui/certd-server/.env | 1 + packages/ui/certd-server/.gitignore | 5 +- packages/ui/certd-server/package.json | 1 + .../certd-server/src/config/config.default.ts | 4 +- packages/ui/certd-server/src/config/loader.ts | 11 ++++ .../src/plugins/plugin-host/lib/ssh.ts | 1 + packages/ui/certd-server/tools/lego/.keep | 3 ++ .../tools/linux/lego_linux_amd64.tar.gz | 3 -- .../tools/linux/lego_linux_arm64.tar.gz | 3 -- .../tools/windows/lego_windows_amd64.zip | 3 -- 38 files changed, 128 insertions(+), 58 deletions(-) delete mode 100644 packages/core/pipeline/src/utils/index.ts create mode 100644 packages/ui/certd-server/.env create mode 100644 packages/ui/certd-server/tools/lego/.keep delete mode 100644 packages/ui/certd-server/tools/linux/lego_linux_amd64.tar.gz delete mode 100644 packages/ui/certd-server/tools/linux/lego_linux_arm64.tar.gz delete mode 100644 packages/ui/certd-server/tools/windows/lego_windows_amd64.zip diff --git a/packages/core/basic/src/utils/index.ts b/packages/core/basic/src/utils/index.ts index fb8568817..7ca3aa9ef 100644 --- a/packages/core/basic/src/utils/index.ts +++ b/packages/core/basic/src/utils/index.ts @@ -8,7 +8,7 @@ export * from './util.hash.js'; export * from './util.merge.js'; export * from './util.cache.js'; import sleep from './util.sleep.js'; -import { http } from './util.request.js'; +import { http, download } from './util.request.js'; import { mergeUtils } from './util.merge.js'; import { sp } from './util.sp.js'; @@ -25,6 +25,7 @@ import * as id from './util.id.js'; export const utils = { sleep, http, + download, sp, hash: hashUtils, promises, diff --git a/packages/core/basic/src/utils/util.request.ts b/packages/core/basic/src/utils/util.request.ts index 10b8b16c2..2cd3cebe5 100644 --- a/packages/core/basic/src/utils/util.request.ts +++ b/packages/core/basic/src/utils/util.request.ts @@ -6,6 +6,8 @@ import { HttpsProxyAgent } from 'https-proxy-agent'; import nodeHttp from 'http'; import * as https from 'node:https'; import { merge } from 'lodash-es'; +import { safePromise } from './util.promise'; +import fs from 'fs'; export class HttpError extends Error { status?: number; statusText?: string; @@ -214,3 +216,38 @@ export function createAgent(opts: CreateAgentOptions = {}) { httpsAgent, }; } + +export async function download(http: HttpClient, config: HttpRequestConfig, savePath: string) { + return safePromise((resolve, reject) => { + http + .request({ + ...config, + responseType: 'stream', + }) + .then(res => { + const writer = fs.createWriteStream(savePath); + res.data.pipe(writer); + writer.on('close', () => { + console.log('文件下载成功'); + resolve(true); + }); + //error + writer.on('error', err => { + console.error('下载失败', err); + reject(err); + }); + //进度条打印 + const totalLength = res.headers['content-length']; + let currentLength = 0; + res.data.on('data', (chunk: any) => { + currentLength += chunk.length; + const percent = ((currentLength / totalLength) * 100).toFixed(2); + console.log(`下载进度:${percent}%`); + }); + }) + .catch(err => { + console.error('下载失败', err); + reject(err); + }); + }); +} diff --git a/packages/core/pipeline/src/access/api.ts b/packages/core/pipeline/src/access/api.ts index b9ada9f5e..5d7a04912 100644 --- a/packages/core/pipeline/src/access/api.ts +++ b/packages/core/pipeline/src/access/api.ts @@ -1,6 +1,6 @@ import { Registrable } from "../registry/index.js"; import { FormItemProps } from "../dt/index.js"; -import { HttpClient, ILogger, utils } from "../utils/index.js"; +import { HttpClient, ILogger, utils } from "@certd/basic"; import _ from "lodash-es"; import { AccessRequestHandleReq } from "../core"; diff --git a/packages/core/pipeline/src/access/decorator.ts b/packages/core/pipeline/src/access/decorator.ts index 445364a6b..8fca34381 100644 --- a/packages/core/pipeline/src/access/decorator.ts +++ b/packages/core/pipeline/src/access/decorator.ts @@ -3,7 +3,7 @@ import { AccessContext, AccessDefine, AccessInputDefine } from "./api.js"; import { Decorator } from "../decorator/index.js"; import _ from "lodash-es"; import { accessRegistry } from "./registry.js"; -import { http, logger, utils } from "../utils/index.js"; +import { http, logger, utils } from "@certd/basic"; // 提供一个唯一 key export const ACCESS_CLASS_KEY = "pipeline:access"; diff --git a/packages/core/pipeline/src/core/executor.ts b/packages/core/pipeline/src/core/executor.ts index b0c77d6fd..1fde56005 100644 --- a/packages/core/pipeline/src/core/executor.ts +++ b/packages/core/pipeline/src/core/executor.ts @@ -3,7 +3,7 @@ import { RunHistory, RunnableCollection } from "./run-history.js"; import { AbstractTaskPlugin, PluginDefine, pluginRegistry, TaskInstanceContext, UserInfo } from "../plugin/index.js"; import { ContextFactory, IContext } from "./context.js"; import { IStorage } from "./storage.js"; -import { createAxiosService, hashUtils, logger, utils } from "../utils/index.js"; +import { createAxiosService, hashUtils, logger, utils } from "@certd/basic"; import { Logger } from "log4js"; import { IAccessService } from "../access/index.js"; import { RegistryItem } from "../registry/index.js"; diff --git a/packages/core/pipeline/src/core/file-store.ts b/packages/core/pipeline/src/core/file-store.ts index 040752cf0..ccc619568 100644 --- a/packages/core/pipeline/src/core/file-store.ts +++ b/packages/core/pipeline/src/core/file-store.ts @@ -1,8 +1,8 @@ -import { fileUtils } from "../utils/index.js"; +import { fileUtils } from "@certd/basic"; import dayjs from "dayjs"; import path from "path"; import fs from "fs"; -import { logger } from "../utils/index.js"; +import { logger } from "@certd/basic"; export type FileStoreOptions = { rootDir?: string; diff --git a/packages/core/pipeline/src/core/handler.ts b/packages/core/pipeline/src/core/handler.ts index 83c0b17f9..7d409f5f0 100644 --- a/packages/core/pipeline/src/core/handler.ts +++ b/packages/core/pipeline/src/core/handler.ts @@ -1,4 +1,4 @@ -import { HttpClient, ILogger, utils } from "../utils/index.js"; +import { HttpClient, ILogger, utils } from "@certd/basic"; export type PluginRequestHandleReq = { typeName: string; diff --git a/packages/core/pipeline/src/core/license.ts b/packages/core/pipeline/src/core/license.ts index 7914a28e5..855f84ecc 100644 --- a/packages/core/pipeline/src/core/license.ts +++ b/packages/core/pipeline/src/core/license.ts @@ -1,4 +1,4 @@ -import { logger } from "../utils/index.js"; +import { logger } from "@certd/basic"; import { setLogger, isPlus, isComm } from "@certd/plus-core"; setLogger(logger); export * from "@certd/plus-core"; diff --git a/packages/core/pipeline/src/core/run-history.ts b/packages/core/pipeline/src/core/run-history.ts index fe27f8eaa..088fc7d75 100644 --- a/packages/core/pipeline/src/core/run-history.ts +++ b/packages/core/pipeline/src/core/run-history.ts @@ -1,6 +1,6 @@ import { HistoryResult, Pipeline, ResultType, Runnable, RunnableMap, Stage, Step, Task } from "../dt/index.js"; import _ from "lodash-es"; -import { buildLogger } from "../utils/index.js"; +import { buildLogger } from "@certd/basic"; import { Logger } from "log4js"; export type HistoryStatus = { diff --git a/packages/core/pipeline/src/core/storage.ts b/packages/core/pipeline/src/core/storage.ts index f24775baf..5dae52db7 100644 --- a/packages/core/pipeline/src/core/storage.ts +++ b/packages/core/pipeline/src/core/storage.ts @@ -1,6 +1,6 @@ import fs from "fs"; import path from "path"; -import { fileUtils } from "../utils/index.js"; +import { fileUtils } from "@certd/basic"; export interface IStorage { get(scope: string, namespace: string, version: string, key: string): Promise; diff --git a/packages/core/pipeline/src/index.ts b/packages/core/pipeline/src/index.ts index e1fa81a7c..98b000dcf 100644 --- a/packages/core/pipeline/src/index.ts +++ b/packages/core/pipeline/src/index.ts @@ -3,7 +3,6 @@ export * from "./dt/index.js"; export * from "./access/index.js"; export * from "./registry/index.js"; export * from "./plugin/index.js"; -export * from "./utils/index.js"; export * from "./context/index.js"; export * from "./decorator/index.js"; export * from "./service/index.js"; diff --git a/packages/core/pipeline/src/plugin/api.ts b/packages/core/pipeline/src/plugin/api.ts index 21f8fd9f4..b755cf9bd 100644 --- a/packages/core/pipeline/src/plugin/api.ts +++ b/packages/core/pipeline/src/plugin/api.ts @@ -5,8 +5,8 @@ import { Logger } from "log4js"; import { IAccessService } from "../access/index.js"; import { ICnameProxyService, IEmailService } from "../service/index.js"; import { CancelError, IContext, PluginRequestHandleReq, RunnableCollection } from "../core/index.js"; -import { ILogger, logger, utils } from "../utils/index.js"; -import { HttpClient } from "../utils/index.js"; +import { ILogger, logger, utils } from "@certd/basic"; +import { HttpClient } from "@certd/basic"; import dayjs from "dayjs"; import { IPluginConfigService } from "../service/config"; import { upperFirst } from "lodash-es"; diff --git a/packages/core/pipeline/src/registry/registry.ts b/packages/core/pipeline/src/registry/registry.ts index 36780c31f..cf49899a6 100644 --- a/packages/core/pipeline/src/registry/registry.ts +++ b/packages/core/pipeline/src/registry/registry.ts @@ -1,4 +1,4 @@ -import { isDev, logger } from "../utils/index.js"; +import { isDev, logger } from "@certd/basic"; export type Registrable = { name: string; diff --git a/packages/core/pipeline/src/utils/index.ts b/packages/core/pipeline/src/utils/index.ts deleted file mode 100644 index 5a595f408..000000000 --- a/packages/core/pipeline/src/utils/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "@certd/basic"; diff --git a/packages/libs/lib-k8s/package.json b/packages/libs/lib-k8s/package.json index ef5de94c7..26dcc451b 100644 --- a/packages/libs/lib-k8s/package.json +++ b/packages/libs/lib-k8s/package.json @@ -18,7 +18,7 @@ "@kubernetes/client-node": "0.21.0" }, "devDependencies": { - "@certd/pipeline": "^1.27.0", + "@certd/basic": "^1.27.0", "@rollup/plugin-commonjs": "^23.0.4", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.0.1", diff --git a/packages/libs/lib-k8s/src/lib/k8s.client.ts b/packages/libs/lib-k8s/src/lib/k8s.client.ts index 5e4e7d4a5..6eabf7447 100644 --- a/packages/libs/lib-k8s/src/lib/k8s.client.ts +++ b/packages/libs/lib-k8s/src/lib/k8s.client.ts @@ -1,6 +1,6 @@ import { CoreV1Api, KubeConfig, NetworkingV1Api, V1Ingress, V1Secret } from '@kubernetes/client-node'; import dns from 'dns'; -import { ILogger } from '@certd/pipeline'; +import { ILogger } from '@certd/basic'; import _ from 'lodash-es'; export type K8sClientOpts = { diff --git a/packages/libs/lib-server/package.json b/packages/libs/lib-server/package.json index d20f6496e..0bbe1b40d 100644 --- a/packages/libs/lib-server/package.json +++ b/packages/libs/lib-server/package.json @@ -28,6 +28,7 @@ "dependencies": { "@certd/acme-client": "^1.27.0", "@certd/basic": "^1.27.0", + "@certd/plus-core": "^1.27.0", "@certd/pipeline": "^1.27.0", "@midwayjs/cache": "~3.14.0", "@midwayjs/core": "~3.17.1", diff --git a/packages/libs/lib-server/src/configuration.ts b/packages/libs/lib-server/src/configuration.ts index f24ecf5fa..dd2bcaace 100644 --- a/packages/libs/lib-server/src/configuration.ts +++ b/packages/libs/lib-server/src/configuration.ts @@ -1,6 +1,6 @@ import type { IMidwayContainer } from '@midwayjs/core'; import { Configuration } from '@midwayjs/core'; -import { logger } from '@certd/pipeline'; +import { logger } from '@certd/basic'; @Configuration({ namespace: 'lib-server', }) diff --git a/packages/libs/lib-server/src/system/basic/service/file-service.ts b/packages/libs/lib-server/src/system/basic/service/file-service.ts index c60d30e7b..41f3cbaf9 100644 --- a/packages/libs/lib-server/src/system/basic/service/file-service.ts +++ b/packages/libs/lib-server/src/system/basic/service/file-service.ts @@ -2,7 +2,7 @@ import { Provide, Scope, ScopeEnum } from '@midwayjs/core'; import dayjs from 'dayjs'; import path from 'path'; import fs from 'fs'; -import { cache, logger, utils } from '@certd/pipeline'; +import { cache, logger, utils } from '@certd/basic'; import { NotFoundException, ParamException, PermissionException } from '../../../basic/index.js'; export type UploadFileItem = { diff --git a/packages/libs/lib-server/src/system/basic/service/plus-service.ts b/packages/libs/lib-server/src/system/basic/service/plus-service.ts index faa2e2ed1..d480ef6fc 100644 --- a/packages/libs/lib-server/src/system/basic/service/plus-service.ts +++ b/packages/libs/lib-server/src/system/basic/service/plus-service.ts @@ -1,5 +1,5 @@ import { Config, Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core'; -import { AppKey, PlusRequestService, verify } from '@certd/pipeline'; +import { AppKey, PlusRequestService, verify } from '@certd/plus-core'; import { logger } from '@certd/basic'; import { SysInstallInfo, SysLicenseInfo, SysSettingsService } from '../../settings/index.js'; diff --git a/packages/plugins/plugin-cert/src/dns-provider/api.ts b/packages/plugins/plugin-cert/src/dns-provider/api.ts index 015d4d991..3ce830543 100644 --- a/packages/plugins/plugin-cert/src/dns-provider/api.ts +++ b/packages/plugins/plugin-cert/src/dns-provider/api.ts @@ -1,4 +1,5 @@ -import { HttpClient, IAccess, ILogger, Registrable, utils } from "@certd/pipeline"; +import { HttpClient, ILogger, utils } from "@certd/basic"; +import { IAccess, Registrable } from "@certd/pipeline"; export type DnsProviderDefine = Registrable & { accessType: string; diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/acme.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/acme.ts index 64c108161..1ebc129a7 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/acme.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/acme.ts @@ -4,7 +4,8 @@ import { ClientExternalAccountBindingOptions, UrlMapping } from "@certd/acme-cli import _ from "lodash-es"; import { Challenge } from "@certd/acme-client/types/rfc8555"; import { Logger } from "log4js"; -import { IContext, utils } from "@certd/pipeline"; +import { IContext } from "@certd/pipeline"; +import { utils } from "@certd/basic"; import { IDnsProvider, parseDomain } from "../../dns-provider/index.js"; export type CnameVerifyPlan = { diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts index 57cbe9dbd..d31543655 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, HttpClient, IContext, Step, TaskInput, TaskOutput } from "@certd/pipeline"; +import { AbstractTaskPlugin, IContext, Step, TaskInput, TaskOutput } from "@certd/pipeline"; import dayjs from "dayjs"; import type { CertInfo } from "./acme.js"; import { CertReader } from "./cert-reader.js"; @@ -6,6 +6,7 @@ import JSZip from "jszip"; import { CertConverter } from "./convert.js"; import fs from "fs"; import { pick } from "lodash-es"; +import { HttpClient } from "@certd/basic"; export { CertReader }; export type { CertInfo }; diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/cert-reader.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/cert-reader.ts index af9ee4cfb..604eaadaf 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/cert-reader.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/cert-reader.ts @@ -3,7 +3,7 @@ import fs from "fs"; import os from "os"; import path from "path"; import { crypto } from "@certd/acme-client"; -import { ILogger } from "@certd/pipeline"; +import { ILogger } from "@certd/basic"; import dayjs from "dayjs"; export type CertReaderHandleContext = { diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/convert.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/convert.ts index 1861e8755..677b2a664 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/convert.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/convert.ts @@ -1,4 +1,4 @@ -import { ILogger, sp } from "@certd/pipeline"; +import { ILogger, sp } from "@certd/basic"; import type { CertInfo } from "../cert-plugin/acme.js"; import { CertReader, CertReaderHandleContext } from "../cert-plugin/cert-reader.js"; import path from "path"; diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts index 4be4a86bb..d9dd28bc8 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts @@ -1,4 +1,6 @@ -import { IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, utils } from "@certd/pipeline"; +import { IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from "@certd/pipeline"; +import { utils } from "@certd/basic"; + import type { CertInfo, CnameVerifyPlan, DomainsVerifyPlan, PrivateKeyType, SSLProvider } from "./acme.js"; import { AcmeService } from "./acme.js"; import _ from "lodash-es"; diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/lego/index.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/lego/index.ts index 5887144b2..2bbd97648 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/lego/index.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/lego/index.ts @@ -1,11 +1,10 @@ -import { IsTaskPlugin, pluginGroups, RunStrategy, sp, Step, TaskInput } from "@certd/pipeline"; +import { IsTaskPlugin, pluginGroups, RunStrategy, Step, TaskInput } from "@certd/pipeline"; import type { CertInfo } from "../acme.js"; import { CertReader } from "../cert-reader.js"; import { CertApplyBasePlugin } from "../base.js"; import fs from "fs"; import { EabAccess } from "../../../access/index.js"; import path from "path"; -import { utils } from "@certd/basic"; import JSZip from "jszip"; export { CertReader }; @@ -127,31 +126,51 @@ export class CertApplyLegoPlugin extends CertApplyBasePlugin { const saveDir = `./data/.lego/pipeline_${this.pipeline.id}/`; const savePathArgs = `--path "${saveDir}"`; const os_type = process.platform === "win32" ? "windows" : "linux"; - const legoPath = path.resolve("./tools", os_type, "lego"); + const legoDir = "./tools/lego"; + const legoPath = path.resolve(legoDir, "lego"); if (!fs.existsSync(legoPath)) { //解压缩 + const arch = process.arch; + let platform = "amd64"; + if (arch === "arm64" || arch === "arm") { + platform = "arm64"; + } + const LEGO_VERSION = process.env.LEGO_VERSION; + let legoZipFile = `${legoDir}/lego_v${LEGO_VERSION}_windows_${platform}.zip`; if (os_type === "linux") { - //判断当前是arm64 还是amd64 - const arch = process.arch; - let platform = "amd64"; - if (arch === "arm64" || arch === "arm") { - platform = "arm64"; - } - await utils.sp.spawn({ - cmd: `tar -zxvf ./tools/linux/lego_linux_${platform}.tar.gz -C ./tools/linux/`, + legoZipFile = `${legoDir}/lego_v${LEGO_VERSION}_linux_${platform}.tar.gz`; + } + if (!fs.existsSync(legoZipFile)) { + this.logger.info(`lego文件不存在:${legoZipFile},准备下载`); + const downloadUrl = `https://github.com/go-acme/lego/releases/download/v${LEGO_VERSION}/lego_v${LEGO_VERSION}_${os_type}_${platform}.tar.gz`; + await this.ctx.utils.download( + this.http, + { + url: downloadUrl, + method: "GET", + }, + legoZipFile + ); + this.logger.info("下载lego成功"); + } + + if (os_type === "linux") { + //tar是否存在 + await this.ctx.utils.sp.spawn({ + cmd: `tar -zxvf ${legoZipFile} -C ${legoDir}/`, }); - await utils.sp.spawn({ - cmd: `chmod +x ./tools/linux/*`, + await this.ctx.utils.sp.spawn({ + cmd: `chmod +x ${legoDir}/*`, }); this.logger.info("解压lego成功"); } else { const zip = new JSZip(); - const data = fs.readFileSync("./tools/windows/lego_windows_amd64.zip"); + const data = fs.readFileSync(legoZipFile); const zipData = await zip.loadAsync(data); const files = Object.keys(zipData.files); for (const file of files) { const content = await zipData.files[file].async("nodebuffer"); - fs.writeFileSync(`./tools/windows/${file}`, content); + fs.writeFileSync(legoPath, content); } this.logger.info("解压lego成功"); } @@ -166,7 +185,7 @@ export class CertApplyLegoPlugin extends CertApplyBasePlugin { } run`, ]; - await sp.spawn({ + await this.ctx.utils.sp.spawn({ cmd: cmds, logger: this.logger, env, diff --git a/packages/ui/Dockerfile b/packages/ui/Dockerfile index 337b8ca21..294d205af 100644 --- a/packages/ui/Dockerfile +++ b/packages/ui/Dockerfile @@ -17,15 +17,15 @@ WORKDIR /app/ COPY --from=builder /workspace/certd-server/ /app/ ENV LEGO_VERSION=4.19.2 -ENV LEGO_DOWNLOAD_DIR /app/tools/linux +ENV LEGO_DOWNLOAD_DIR /app/tools/lego RUN mkdir -p $LEGO_DOWNLOAD_DIR # 根据架构下载不同的文件 RUN ARCH=$(uname -m) && \ if [ "$ARCH" = "x86_64" ]; then \ - wget -O $LEGO_DOWNLOAD_DIR/lego_linux_amd64.tar.gz https://github.com/go-acme/lego/releases/download/v${LEGO_VERSION}/lego_v${LEGO_VERSION}_linux_arm64.tar.gz; \ + wget -O $LEGO_DOWNLOAD_DIR/lego_v${LEGO_VERSION}_linux_amd64.tar.gz https://github.com/go-acme/lego/releases/download/v${LEGO_VERSION}/lego_v${LEGO_VERSION}_linux_arm64.tar.gz; \ elif [ "$ARCH" = "aarch64" ]; then \ - wget -O $LEGO_DOWNLOAD_DIR/lego_linux_arm64.tar.gz https://github.com/go-acme/lego/releases/download/v${LEGO_VERSION}/lego_v${LEGO_VERSION}_linux_amd64.tar.gz; \ + wget -O $LEGO_DOWNLOAD_DIR/lego_v${LEGO_VERSION}_linux_arm64.tar.gz https://github.com/go-acme/lego/releases/download/v${LEGO_VERSION}/lego_v${LEGO_VERSION}_linux_amd64.tar.gz; \ else \ echo "Unsupported architecture: $ARCH"; \ fi diff --git a/packages/ui/certd-server/.env b/packages/ui/certd-server/.env new file mode 100644 index 000000000..a4a947dd2 --- /dev/null +++ b/packages/ui/certd-server/.env @@ -0,0 +1 @@ +LEGO_VERSION=4.19.2 diff --git a/packages/ui/certd-server/.gitignore b/packages/ui/certd-server/.gitignore index f462ff3e8..4e02485f1 100755 --- a/packages/ui/certd-server/.gitignore +++ b/packages/ui/certd-server/.gitignore @@ -19,6 +19,5 @@ run/ .clinic .env.pgpl.yaml - -tools/windows/* -!tools/windows/*.zip +tools/* +!tools/lego/.keep diff --git a/packages/ui/certd-server/package.json b/packages/ui/certd-server/package.json index 57e3306d9..b0895aa85 100644 --- a/packages/ui/certd-server/package.json +++ b/packages/ui/certd-server/package.json @@ -38,6 +38,7 @@ "@certd/plugin-cert": "^1.27.0", "@certd/plugin-plus": "^1.27.0", "@certd/plus-core": "^1.27.0", + "@certd/basic": "^1.27.0", "@huaweicloud/huaweicloud-sdk-cdn": "^3.1.120", "@huaweicloud/huaweicloud-sdk-core": "^3.1.120", "@koa/cors": "^5.0.0", diff --git a/packages/ui/certd-server/src/config/config.default.ts b/packages/ui/certd-server/src/config/config.default.ts index 167598d08..26a3435ab 100644 --- a/packages/ui/certd-server/src/config/config.default.ts +++ b/packages/ui/certd-server/src/config/config.default.ts @@ -10,7 +10,7 @@ import { UserEntity } from '../modules/sys/authority/entity/user.js'; import { PipelineEntity } from '../modules/pipeline/entity/pipeline.js'; //import { logger } from '../utils/logger'; // load .env file in process.cwd -import { mergeConfig } from './loader.js'; +import { loadDotEnv, mergeConfig } from './loader.js'; import { libServerEntities } from '@certd/lib-server'; import { commercialEntities } from '@certd/commercial-core'; import { tmpdir } from 'node:os'; @@ -123,6 +123,8 @@ const development = { contactLink: '', }, } as MidwayConfig; +loadDotEnv(); + mergeConfig(development, 'development'); mergeConfig(development, env); diff --git a/packages/ui/certd-server/src/config/loader.ts b/packages/ui/certd-server/src/config/loader.ts index 88f61465c..3d18a1139 100644 --- a/packages/ui/certd-server/src/config/loader.ts +++ b/packages/ui/certd-server/src/config/loader.ts @@ -46,3 +46,14 @@ export function mergeConfig(config: any, envType: string) { } return config; } + +export function loadDotEnv() { + const envStr = fs.readFileSync('.env').toString(); + envStr.split('\n').forEach(line => { + const [key, value] = line.split('='); + const oldValue = process.env[key]; + if (!oldValue) { + process.env[key] = value; + } + }); +} diff --git a/packages/ui/certd-server/src/plugins/plugin-host/lib/ssh.ts b/packages/ui/certd-server/src/plugins/plugin-host/lib/ssh.ts index 484d5b9b2..ab5d65dcd 100644 --- a/packages/ui/certd-server/src/plugins/plugin-host/lib/ssh.ts +++ b/packages/ui/certd-server/src/plugins/plugin-host/lib/ssh.ts @@ -86,6 +86,7 @@ export class AsyncSsh2Client { sftp.fastPut(localPath, remotePath, (err: Error) => { if (err) { reject(err); + this.logger.error('请确认路径是否包含文件名,路径本身不能是目录,路径不能有*?之类的特殊符号,要有写入权限'); return; } this.logger.info(`上传文件成功:${localPath} => ${remotePath}`); diff --git a/packages/ui/certd-server/tools/lego/.keep b/packages/ui/certd-server/tools/lego/.keep new file mode 100644 index 000000000..1afab5f77 --- /dev/null +++ b/packages/ui/certd-server/tools/lego/.keep @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 +size 2 diff --git a/packages/ui/certd-server/tools/linux/lego_linux_amd64.tar.gz b/packages/ui/certd-server/tools/linux/lego_linux_amd64.tar.gz deleted file mode 100644 index 18b1303d7..000000000 --- a/packages/ui/certd-server/tools/linux/lego_linux_amd64.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:588e41dfbc2a5ef1596953b605ef0981f95135443a1e66db3e06e1fa2c061eab -size 24746505 diff --git a/packages/ui/certd-server/tools/linux/lego_linux_arm64.tar.gz b/packages/ui/certd-server/tools/linux/lego_linux_arm64.tar.gz deleted file mode 100644 index c0bc0e981..000000000 --- a/packages/ui/certd-server/tools/linux/lego_linux_arm64.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba47935bd3618ab13f2c10ba8589156e98617ab77f4dd101956cd21e829a6316 -size 23085284 diff --git a/packages/ui/certd-server/tools/windows/lego_windows_amd64.zip b/packages/ui/certd-server/tools/windows/lego_windows_amd64.zip deleted file mode 100644 index 71dfe6bc5..000000000 --- a/packages/ui/certd-server/tools/windows/lego_windows_amd64.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9b91a1e4f32b3f5e55fa6e455b8a72069cd2983ec7a36d275f0aa4b0d82a0de6 -size 25579960 From 1b46278f866abb19b2c4251e8d14c0893f76b146 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 16:39:02 +0800 Subject: [PATCH 018/119] =?UTF-8?q?chore:=20lego=E6=94=B9=E6=88=90?= =?UTF-8?q?=E4=BB=8Egithub=E7=9B=B4=E6=8E=A5=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/run/docker-compose.yaml | 7 ++- packages/core/acme-client/src/agents.js | 10 ++++- packages/core/basic/src/utils/util.request.ts | 44 +++++++++++++------ packages/core/pipeline/src/core/executor.ts | 11 ++++- packages/core/pipeline/src/core/index.ts | 1 - packages/core/pipeline/src/core/license.ts | 16 ------- .../core/pipeline/src/core/run-history.ts | 4 +- packages/core/pipeline/src/plugin/api.ts | 4 +- .../src/plugin/cert-plugin/lego/index.ts | 25 ++++++----- packages/ui/certd-server/src/config/loader.ts | 2 +- packages/ui/certd-server/src/configuration.ts | 2 +- .../src/controller/basic/app-controller.ts | 2 +- .../src/controller/basic/file-controller.ts | 2 +- .../src/controller/basic/home-controller.ts | 2 +- .../controller/basic/settings-controller.ts | 2 +- .../controller/pipeline/handle-controller.ts | 23 +++++----- .../controller/pipeline/history-controller.ts | 2 +- .../sys/access/access-controller.ts | 2 +- .../sys/account/account-controller.ts | 2 +- .../controller/sys/plus/plus-controller.ts | 3 +- .../sys/settings/sys-settings-controller.ts | 2 +- .../certd-server/src/middleware/authority.ts | 2 +- .../src/middleware/global-exception.ts | 2 +- .../src/middleware/reset-passwd/middleware.ts | 2 +- .../src/modules/auto/auto-init-site.ts | 2 +- .../src/modules/auto/auto-register-cron.ts | 2 +- .../certd-server/src/modules/auto/auto-z.ts | 4 +- .../modules/auto/https/self-certificate.ts | 2 +- .../src/modules/auto/https/server.ts | 2 +- .../modules/basic/service/email-service.ts | 6 ++- .../cname/service/cname-record-service.ts | 4 +- .../ui/certd-server/src/modules/cron/cron.ts | 2 +- .../pipeline/service/history-service.ts | 4 +- .../pipeline/service/pipeline-service.ts | 4 +- .../modules/plugin/service/plugin-service.ts | 2 +- .../sys/authority/service/user-service.ts | 2 +- .../dns-provider/aliyun-dns-provider.ts | 4 +- .../plugins/plugin-cloudflare/dns-provider.ts | 4 +- .../src/plugins/plugin-demo/dns-provider.ts | 6 ++- .../src/plugins/plugin-doge/lib/index.ts | 2 +- .../plugins/plugin-dynadot/dns-provider.ts | 4 +- .../src/plugins/plugin-host/lib/ssh.ts | 2 +- .../dns-provider/huawei-dns-provider.ts | 4 +- .../plugins/deploy-to-cdn/index.ts | 3 +- .../plugins/plugin-jdcloud/dns-provider.ts | 3 +- .../dns-provider/dnspod-dns-provider.ts | 4 +- .../dns-provider/tencent-dns-provider.ts | 4 +- .../src/plugins/plugin-tencent/lib/index.ts | 2 +- .../plugin/deploy-to-clb/index.ts | 6 +-- .../src/plugins/plugin-west/dns-provider.ts | 5 ++- .../plugins/plugin-deploy-to-cdn.ts | 3 +- packages/ui/certd-server/src/utils/env.ts | 2 +- packages/ui/certd-server/src/utils/http.ts | 2 +- packages/ui/certd-server/src/utils/version.ts | 2 +- 54 files changed, 162 insertions(+), 110 deletions(-) delete mode 100644 packages/core/pipeline/src/core/license.ts diff --git a/docker/run/docker-compose.yaml b/docker/run/docker-compose.yaml index e73ee5840..e3eebbe85 100644 --- a/docker/run/docker-compose.yaml +++ b/docker/run/docker-compose.yaml @@ -17,9 +17,12 @@ services: # ↓↓↓↓ ---------------------------------------------------------- 如果出现getaddrinfo ENOTFOUND等错误,可以尝试修改或注释dns配置 - 223.5.5.5 - 223.6.6.6 + # ↓↓↓↓ ---------------------------------------------------------- 如果你服务器在腾讯云,可以用这个dns地址 + # - 119.29.29.29 + # - 182.254.116.116 # ↓↓↓↓ ---------------------------------------------------------- 如果你服务器部署在国外,可以用8.8.8.8替换上面的dns -# - 8.8.8.8 -# - 8.8.4.4 + # - 8.8.8.8 + # - 8.8.4.4 # extra_hosts: # ↓↓↓↓ ---------------------------------------------------------- 这里可以配置自定义hosts,外网域名可以指向本地局域网ip地址 # - "localdomain.comm:192.168.1.3" diff --git a/packages/core/acme-client/src/agents.js b/packages/core/acme-client/src/agents.js index ab220dff6..83fdb75c3 100644 --- a/packages/core/acme-client/src/agents.js +++ b/packages/core/acme-client/src/agents.js @@ -50,8 +50,14 @@ class HttpError extends Error { super(error.message); this.message = error.message; - if (this.message && this.message.indexOf('ssl3_get_record:wrong version number') >= 0) { - this.message = 'http协议错误,服务端要求http协议,请检查是否使用了https请求'; + const { message } = error; + if (message && typeof message === 'string') { + if (message.indexOf && message.indexOf('ssl3_get_record:wrong version number') >= 0) { + this.message = `${message}(http协议错误,服务端要求http协议,请检查是否使用了https请求)`; + } + else if (message.indexOf('getaddrinfo EAI_AGAIN')) { + this.message = `${message}(无法解析域名,请检查网络连接或dns配置)`; + } } this.name = error.name; diff --git a/packages/core/basic/src/utils/util.request.ts b/packages/core/basic/src/utils/util.request.ts index 2cd3cebe5..df2e0d707 100644 --- a/packages/core/basic/src/utils/util.request.ts +++ b/packages/core/basic/src/utils/util.request.ts @@ -1,12 +1,12 @@ import axios, { AxiosRequestConfig } from 'axios'; -import { logger } from './util.log.js'; +import { ILogger, logger } from './util.log.js'; import { Logger } from 'log4js'; import { HttpProxyAgent } from 'http-proxy-agent'; import { HttpsProxyAgent } from 'https-proxy-agent'; import nodeHttp from 'http'; import * as https from 'node:https'; import { merge } from 'lodash-es'; -import { safePromise } from './util.promise'; +import { safePromise } from './util.promise.js'; import fs from 'fs'; export class HttpError extends Error { status?: number; @@ -21,8 +21,13 @@ export class HttpError extends Error { } super(error.message || error.response?.statusText); - if (error?.message?.indexOf && error?.message?.indexOf('ssl3_get_record:wrong version number') >= 0) { - this.message = 'http协议错误,服务端要求http协议,请检查是否使用了https请求'; + const message = error?.message; + if (message && typeof message === 'string') { + if (message.indexOf && message.indexOf('ssl3_get_record:wrong version number') >= 0) { + this.message = `${message}(http协议错误,服务端要求http协议,请检查是否使用了https请求)`; + } else if (message.indexOf('getaddrinfo EAI_AGAIN')) { + this.message = `${message}(无法解析域名,请检查网络连接或dns配置,更换docker-compose.yaml中dns配置)`; + } } this.name = error.name; @@ -115,7 +120,12 @@ export function createAxiosService({ logger }: { logger: Logger }) { service.interceptors.response.use( (response: any) => { if (response?.config?.logRes !== false) { - logger.info(`http response : status=${response?.status},data=${JSON.stringify(response?.data)}`); + let resData = response?.data; + try { + resData = JSON.stringify(response?.data); + } catch (e) {} + + logger.info(`http response : status=${response?.status},data=${resData}`); } else { logger.info('http response status:', response?.status); } @@ -217,36 +227,42 @@ export function createAgent(opts: CreateAgentOptions = {}) { }; } -export async function download(http: HttpClient, config: HttpRequestConfig, savePath: string) { +export async function download(req: { http: HttpClient; config: HttpRequestConfig; savePath: string; logger: ILogger }) { + const { http, config, savePath, logger } = req; return safePromise((resolve, reject) => { http .request({ - ...config, + logRes: false, responseType: 'stream', + ...config, }) .then(res => { const writer = fs.createWriteStream(savePath); - res.data.pipe(writer); + res.pipe(writer); writer.on('close', () => { - console.log('文件下载成功'); + logger.info('文件下载成功'); resolve(true); }); //error writer.on('error', err => { - console.error('下载失败', err); + logger.error('下载失败', err); reject(err); }); //进度条打印 const totalLength = res.headers['content-length']; let currentLength = 0; - res.data.on('data', (chunk: any) => { + // 每5%打印一次 + const step = (totalLength / 100) * 5; + res.on('data', (chunk: any) => { currentLength += chunk.length; - const percent = ((currentLength / totalLength) * 100).toFixed(2); - console.log(`下载进度:${percent}%`); + if (currentLength % step < chunk.length) { + const percent = ((currentLength / totalLength) * 100).toFixed(2); + logger.info(`下载进度:${percent}%`); + } }); }) .catch(err => { - console.error('下载失败', err); + logger.info('下载失败', err); reject(err); }); }); diff --git a/packages/core/pipeline/src/core/executor.ts b/packages/core/pipeline/src/core/executor.ts index 1fde56005..480cb71b0 100644 --- a/packages/core/pipeline/src/core/executor.ts +++ b/packages/core/pipeline/src/core/executor.ts @@ -3,7 +3,7 @@ import { RunHistory, RunnableCollection } from "./run-history.js"; import { AbstractTaskPlugin, PluginDefine, pluginRegistry, TaskInstanceContext, UserInfo } from "../plugin/index.js"; import { ContextFactory, IContext } from "./context.js"; import { IStorage } from "./storage.js"; -import { createAxiosService, hashUtils, logger, utils } from "@certd/basic"; +import { createAxiosService, hashUtils, HttpRequestConfig, logger, utils } from "@certd/basic"; import { Logger } from "log4js"; import { IAccessService } from "../access/index.js"; import { RegistryItem } from "../registry/index.js"; @@ -290,11 +290,20 @@ export class Executor { } const http = createAxiosService({ logger: currentLogger }); + const download = async (config: HttpRequestConfig, savePath: string) => { + await utils.download({ + http, + logger: currentLogger, + config, + savePath, + }); + }; const taskCtx: TaskInstanceContext = { pipeline: this.pipeline, step, lastStatus, http, + download, logger: currentLogger, inputChanged, accessService: this.options.accessService, diff --git a/packages/core/pipeline/src/core/index.ts b/packages/core/pipeline/src/core/index.ts index a5ad2a39f..f273c8eb1 100644 --- a/packages/core/pipeline/src/core/index.ts +++ b/packages/core/pipeline/src/core/index.ts @@ -3,6 +3,5 @@ export * from "./run-history.js"; export * from "./context.js"; export * from "./storage.js"; export * from "./file-store.js"; -export * from "./license.js"; export * from "./handler.js"; export * from "./exceptions.js"; diff --git a/packages/core/pipeline/src/core/license.ts b/packages/core/pipeline/src/core/license.ts deleted file mode 100644 index 855f84ecc..000000000 --- a/packages/core/pipeline/src/core/license.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { logger } from "@certd/basic"; -import { setLogger, isPlus, isComm } from "@certd/plus-core"; -setLogger(logger); -export * from "@certd/plus-core"; - -export function checkPlus() { - if (!isPlus()) { - throw new Error("此为专业版功能,请升级到专业版"); - } -} - -export function checkComm() { - if (!isComm()) { - throw new Error("此为商业版功能,请升级到商业版"); - } -} diff --git a/packages/core/pipeline/src/core/run-history.ts b/packages/core/pipeline/src/core/run-history.ts index 088fc7d75..9a12cec0c 100644 --- a/packages/core/pipeline/src/core/run-history.ts +++ b/packages/core/pipeline/src/core/run-history.ts @@ -117,8 +117,8 @@ export class RunHistory { } logError(runnable: Runnable, e: Error) { - delete e.stack; - delete e.cause; + // delete e.stack; + // delete e.cause; const errorInfo = runnable.runnableType === "step" ? e : e.message; this._loggers[runnable.id].error(`[${runnable.runnableType}] [${runnable.title}] :`, errorInfo); } diff --git a/packages/core/pipeline/src/plugin/api.ts b/packages/core/pipeline/src/plugin/api.ts index b755cf9bd..ede5004b4 100644 --- a/packages/core/pipeline/src/plugin/api.ts +++ b/packages/core/pipeline/src/plugin/api.ts @@ -5,7 +5,7 @@ import { Logger } from "log4js"; import { IAccessService } from "../access/index.js"; import { ICnameProxyService, IEmailService } from "../service/index.js"; import { CancelError, IContext, PluginRequestHandleReq, RunnableCollection } from "../core/index.js"; -import { ILogger, logger, utils } from "@certd/basic"; +import { HttpRequestConfig, ILogger, logger, utils } from "@certd/basic"; import { HttpClient } from "@certd/basic"; import dayjs from "dayjs"; import { IPluginConfigService } from "../service/config"; @@ -85,6 +85,8 @@ export type TaskInstanceContext = { userContext: IContext; //http请求客户端 http: HttpClient; + //下载文件方法 + download: (config: HttpRequestConfig, savePath: string) => Promise; //文件存储 fileStore: FileStore; //上一次执行结果状态 diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/lego/index.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/lego/index.ts index 2bbd97648..241e70bc5 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/lego/index.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/lego/index.ts @@ -127,7 +127,7 @@ export class CertApplyLegoPlugin extends CertApplyBasePlugin { const savePathArgs = `--path "${saveDir}"`; const os_type = process.platform === "win32" ? "windows" : "linux"; const legoDir = "./tools/lego"; - const legoPath = path.resolve(legoDir, "lego"); + const legoPath = path.resolve(legoDir, os_type === "windows" ? "lego.exe" : "lego"); if (!fs.existsSync(legoPath)) { //解压缩 const arch = process.arch; @@ -136,20 +136,21 @@ export class CertApplyLegoPlugin extends CertApplyBasePlugin { platform = "arm64"; } const LEGO_VERSION = process.env.LEGO_VERSION; - let legoZipFile = `${legoDir}/lego_v${LEGO_VERSION}_windows_${platform}.zip`; + let legoZipFileName = `lego_v${LEGO_VERSION}_windows_${platform}.zip`; if (os_type === "linux") { - legoZipFile = `${legoDir}/lego_v${LEGO_VERSION}_linux_${platform}.tar.gz`; + legoZipFileName = `lego_v${LEGO_VERSION}_linux_${platform}.tar.gz`; } - if (!fs.existsSync(legoZipFile)) { - this.logger.info(`lego文件不存在:${legoZipFile},准备下载`); - const downloadUrl = `https://github.com/go-acme/lego/releases/download/v${LEGO_VERSION}/lego_v${LEGO_VERSION}_${os_type}_${platform}.tar.gz`; - await this.ctx.utils.download( - this.http, + const legoZipFilePath = `${legoDir}/${legoZipFileName}`; + if (!fs.existsSync(legoZipFilePath)) { + this.logger.info(`lego文件不存在:${legoZipFilePath},准备下载`); + const downloadUrl = `https://github.com/go-acme/lego/releases/download/v${LEGO_VERSION}/${legoZipFileName}`; + await this.ctx.download( { url: downloadUrl, method: "GET", + logRes: false, }, - legoZipFile + legoZipFilePath ); this.logger.info("下载lego成功"); } @@ -157,7 +158,7 @@ export class CertApplyLegoPlugin extends CertApplyBasePlugin { if (os_type === "linux") { //tar是否存在 await this.ctx.utils.sp.spawn({ - cmd: `tar -zxvf ${legoZipFile} -C ${legoDir}/`, + cmd: `tar -zxvf ${legoZipFilePath} -C ${legoDir}/`, }); await this.ctx.utils.sp.spawn({ cmd: `chmod +x ${legoDir}/*`, @@ -165,12 +166,12 @@ export class CertApplyLegoPlugin extends CertApplyBasePlugin { this.logger.info("解压lego成功"); } else { const zip = new JSZip(); - const data = fs.readFileSync(legoZipFile); + const data = fs.readFileSync(legoZipFilePath); const zipData = await zip.loadAsync(data); const files = Object.keys(zipData.files); for (const file of files) { const content = await zipData.files[file].async("nodebuffer"); - fs.writeFileSync(legoPath, content); + fs.writeFileSync(`${legoDir}/${file}`, content); } this.logger.info("解压lego成功"); } diff --git a/packages/ui/certd-server/src/config/loader.ts b/packages/ui/certd-server/src/config/loader.ts index 3d18a1139..784d46993 100644 --- a/packages/ui/certd-server/src/config/loader.ts +++ b/packages/ui/certd-server/src/config/loader.ts @@ -2,7 +2,7 @@ import path from 'path'; import * as _ from 'lodash-es'; import yaml from 'js-yaml'; import fs from 'fs'; -import { logger } from '@certd/pipeline'; +import { logger } from '@certd/basic'; function parseEnv(defaultConfig: any) { const config = {}; diff --git a/packages/ui/certd-server/src/configuration.ts b/packages/ui/certd-server/src/configuration.ts index 49ca8e1df..75044d360 100644 --- a/packages/ui/certd-server/src/configuration.ts +++ b/packages/ui/certd-server/src/configuration.ts @@ -12,7 +12,7 @@ import cors from '@koa/cors'; import { GlobalExceptionMiddleware } from './middleware/global-exception.js'; import { PreviewMiddleware } from './middleware/preview.js'; import { AuthorityMiddleware } from './middleware/authority.js'; -import { logger } from '@certd/pipeline'; +import { logger } from '@certd/basic'; import { ResetPasswdMiddleware } from './middleware/reset-passwd/middleware.js'; import DefaultConfig from './config/config.default.js'; import * as libServer from '@certd/lib-server'; diff --git a/packages/ui/certd-server/src/controller/basic/app-controller.ts b/packages/ui/certd-server/src/controller/basic/app-controller.ts index 9aafc0a3a..a98d61c43 100644 --- a/packages/ui/certd-server/src/controller/basic/app-controller.ts +++ b/packages/ui/certd-server/src/controller/basic/app-controller.ts @@ -1,6 +1,6 @@ import { Controller, Get, Provide } from '@midwayjs/core'; import { BaseController, Constants } from '@certd/lib-server'; -import { http, logger } from '@certd/pipeline'; +import { http, logger } from '@certd/basic'; /** */ @Provide() diff --git a/packages/ui/certd-server/src/controller/basic/file-controller.ts b/packages/ui/certd-server/src/controller/basic/file-controller.ts index 7c6519210..13835854a 100644 --- a/packages/ui/certd-server/src/controller/basic/file-controller.ts +++ b/packages/ui/certd-server/src/controller/basic/file-controller.ts @@ -2,7 +2,7 @@ import { Controller, Fields, Files, Get, Inject, Post, Provide, Query } from '@m import { BaseController, Constants, FileService, UploadFileItem, uploadTmpFileCacheKey } from '@certd/lib-server'; import send from 'koa-send'; import { nanoid } from 'nanoid'; -import { cache } from '@certd/pipeline'; +import { cache } from '@certd/basic'; import { UploadFileInfo } from '@midwayjs/upload'; /** diff --git a/packages/ui/certd-server/src/controller/basic/home-controller.ts b/packages/ui/certd-server/src/controller/basic/home-controller.ts index 013c6ba54..bbb1d84b6 100644 --- a/packages/ui/certd-server/src/controller/basic/home-controller.ts +++ b/packages/ui/certd-server/src/controller/basic/home-controller.ts @@ -1,5 +1,5 @@ import { Controller, Get, Inject, MidwayEnvironmentService, Provide } from '@midwayjs/core'; -import { logger } from '@certd/pipeline'; +import { logger } from '@certd/basic'; import { Constants } from '@certd/lib-server'; @Provide() diff --git a/packages/ui/certd-server/src/controller/basic/settings-controller.ts b/packages/ui/certd-server/src/controller/basic/settings-controller.ts index 90cdf1cf0..316b21c06 100644 --- a/packages/ui/certd-server/src/controller/basic/settings-controller.ts +++ b/packages/ui/certd-server/src/controller/basic/settings-controller.ts @@ -1,6 +1,6 @@ import { Config, Controller, Get, Inject, Provide } from '@midwayjs/core'; import { BaseController, Constants, SysHeaderMenus, SysInstallInfo, SysPublicSettings, SysSettingsService, SysSiteEnv, SysSiteInfo } from '@certd/lib-server'; -import { AppKey, getPlusInfo } from '@certd/pipeline'; +import { AppKey, getPlusInfo } from '@certd/plus-core'; /** */ diff --git a/packages/ui/certd-server/src/controller/pipeline/handle-controller.ts b/packages/ui/certd-server/src/controller/pipeline/handle-controller.ts index 819a772d7..2d7788572 100644 --- a/packages/ui/certd-server/src/controller/pipeline/handle-controller.ts +++ b/packages/ui/certd-server/src/controller/pipeline/handle-controller.ts @@ -1,21 +1,11 @@ import { ALL, Body, Controller, Inject, Post, Provide } from '@midwayjs/core'; import { Constants } from '@certd/lib-server'; -import { - AccessRequestHandleReq, - http, - ITaskPlugin, - logger, - mergeUtils, - newAccess, - pluginRegistry, - PluginRequestHandleReq, - TaskInstanceContext, - utils, -} from '@certd/pipeline'; +import { AccessRequestHandleReq, ITaskPlugin, newAccess, pluginRegistry, PluginRequestHandleReq, TaskInstanceContext } from '@certd/pipeline'; import { BaseController } from '@certd/lib-server'; import { AccessService } from '../../modules/pipeline/service/access-service.js'; import { EmailService } from '../../modules/basic/service/email-service.js'; import { AccessGetter } from '../../modules/pipeline/service/access-getter.js'; +import { http, HttpRequestConfig, logger, mergeUtils, utils } from '@certd/basic'; @Provide() @Controller('/api/pi/handle') @@ -64,12 +54,21 @@ export class HandleController extends BaseController { const accessGetter = new AccessGetter(userId, this.accessService.getById.bind(this.accessService)); + const download = async (config: HttpRequestConfig, savePath: string) => { + await utils.download({ + http, + logger, + config, + savePath, + }); + }; //@ts-ignore const taskCtx: TaskInstanceContext = { pipeline: undefined, step: undefined, lastStatus: undefined, http, + download, logger: logger, inputChanged: true, accessService: accessGetter, diff --git a/packages/ui/certd-server/src/controller/pipeline/history-controller.ts b/packages/ui/certd-server/src/controller/pipeline/history-controller.ts index f30500ee0..dde83be45 100644 --- a/packages/ui/certd-server/src/controller/pipeline/history-controller.ts +++ b/packages/ui/certd-server/src/controller/pipeline/history-controller.ts @@ -7,7 +7,7 @@ import { HistoryEntity } from '../../modules/pipeline/entity/history.js'; import { HistoryLogEntity } from '../../modules/pipeline/entity/history-log.js'; import { PipelineService } from '../../modules/pipeline/service/pipeline-service.js'; import * as fs from 'fs'; -import { logger } from '@certd/pipeline'; +import { logger } from '@certd/basic'; import { AuthService } from '../../modules/sys/authority/service/auth-service.js'; import { SysSettingsService } from '@certd/lib-server'; import { In } from 'typeorm'; diff --git a/packages/ui/certd-server/src/controller/sys/access/access-controller.ts b/packages/ui/certd-server/src/controller/sys/access/access-controller.ts index c84702512..8620a6478 100644 --- a/packages/ui/certd-server/src/controller/sys/access/access-controller.ts +++ b/packages/ui/certd-server/src/controller/sys/access/access-controller.ts @@ -1,7 +1,7 @@ import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core'; import { AccessService } from '../../../modules/pipeline/service/access-service.js'; import { AccessController } from '../../pipeline/access-controller.js'; -import { checkComm } from '@certd/pipeline'; +import { checkComm } from '@certd/plus-core'; /** * 授权 diff --git a/packages/ui/certd-server/src/controller/sys/account/account-controller.ts b/packages/ui/certd-server/src/controller/sys/account/account-controller.ts index 110b5e245..bd5a0b23f 100644 --- a/packages/ui/certd-server/src/controller/sys/account/account-controller.ts +++ b/packages/ui/certd-server/src/controller/sys/account/account-controller.ts @@ -1,6 +1,6 @@ import { ALL, Body, Controller, Inject, Post, Provide } from '@midwayjs/core'; import { BaseController, PlusService } from '@certd/lib-server'; -import { AppKey } from '@certd/pipeline'; +import { AppKey } from '@certd/plus-core'; import { SysSettingsService } from '@certd/lib-server'; import { SysInstallInfo } from '@certd/lib-server'; diff --git a/packages/ui/certd-server/src/controller/sys/plus/plus-controller.ts b/packages/ui/certd-server/src/controller/sys/plus/plus-controller.ts index ad4a61c4e..c62fbbf4c 100644 --- a/packages/ui/certd-server/src/controller/sys/plus/plus-controller.ts +++ b/packages/ui/certd-server/src/controller/sys/plus/plus-controller.ts @@ -1,6 +1,7 @@ import { ALL, Body, Controller, Inject, Post, Provide } from '@midwayjs/core'; import { BaseController, PlusService, SysInstallInfo, SysSettingsService } from '@certd/lib-server'; -import { AppKey, logger } from '@certd/pipeline'; +import { AppKey } from '@certd/plus-core'; +import { logger } from '@certd/basic'; /** */ diff --git a/packages/ui/certd-server/src/controller/sys/settings/sys-settings-controller.ts b/packages/ui/certd-server/src/controller/sys/settings/sys-settings-controller.ts index cb99d353b..28fc10b6c 100644 --- a/packages/ui/certd-server/src/controller/sys/settings/sys-settings-controller.ts +++ b/packages/ui/certd-server/src/controller/sys/settings/sys-settings-controller.ts @@ -4,7 +4,7 @@ import * as _ from 'lodash-es'; import { PipelineService } from '../../../modules/pipeline/service/pipeline-service.js'; import { UserSettingsService } from '../../../modules/mine/service/user-settings-service.js'; import { getEmailSettings } from '../../../modules/sys/settings/fix.js'; -import { http, logger } from '@certd/pipeline'; +import { http, logger } from '@certd/basic'; /** */ diff --git a/packages/ui/certd-server/src/middleware/authority.ts b/packages/ui/certd-server/src/middleware/authority.ts index a370ec9e4..850f01081 100644 --- a/packages/ui/certd-server/src/middleware/authority.ts +++ b/packages/ui/certd-server/src/middleware/authority.ts @@ -2,7 +2,7 @@ import { Init, Inject, MidwayWebRouterService, Provide, Scope, ScopeEnum } from import { IMidwayKoaContext, IWebMiddleware, NextFunction } from '@midwayjs/koa'; import jwt from 'jsonwebtoken'; import { Constants } from '@certd/lib-server'; -import { logger } from '@certd/pipeline'; +import { logger } from '@certd/basic'; import { AuthService } from '../modules/sys/authority/service/auth-service.js'; import { SysSettingsService } from '@certd/lib-server'; import { SysPrivateSettings } from '@certd/lib-server'; diff --git a/packages/ui/certd-server/src/middleware/global-exception.ts b/packages/ui/certd-server/src/middleware/global-exception.ts index 4508829e3..c36b1aa08 100644 --- a/packages/ui/certd-server/src/middleware/global-exception.ts +++ b/packages/ui/certd-server/src/middleware/global-exception.ts @@ -1,6 +1,6 @@ import { Provide } from '@midwayjs/core'; import { IWebMiddleware, IMidwayKoaContext, NextFunction } from '@midwayjs/koa'; -import { logger } from '@certd/pipeline'; +import { logger } from '@certd/basic'; import { Result } from '@certd/lib-server'; @Provide() diff --git a/packages/ui/certd-server/src/middleware/reset-passwd/middleware.ts b/packages/ui/certd-server/src/middleware/reset-passwd/middleware.ts index eba30c11e..9994de8c1 100644 --- a/packages/ui/certd-server/src/middleware/reset-passwd/middleware.ts +++ b/packages/ui/certd-server/src/middleware/reset-passwd/middleware.ts @@ -2,7 +2,7 @@ import { Autoload, Config, Init, Inject, Provide, Scope, ScopeEnum } from '@midw import { IMidwayKoaContext, IWebMiddleware, NextFunction } from '@midwayjs/koa'; import { CommonException } from '@certd/lib-server'; import { UserService } from '../../modules/sys/authority/service/user-service.js'; -import { logger } from '@certd/pipeline'; +import { logger } from '@certd/basic'; /** * 重置密码模式 diff --git a/packages/ui/certd-server/src/modules/auto/auto-init-site.ts b/packages/ui/certd-server/src/modules/auto/auto-init-site.ts index 5632f2fec..cbe65a946 100644 --- a/packages/ui/certd-server/src/modules/auto/auto-init-site.ts +++ b/packages/ui/certd-server/src/modules/auto/auto-init-site.ts @@ -1,5 +1,5 @@ import { Autoload, Config, Init, Inject, Scope, ScopeEnum } from '@midwayjs/core'; -import { logger } from '@certd/pipeline'; +import { logger } from '@certd/basic'; import { UserService } from '../sys/authority/service/user-service.js'; import { PlusService, SysInstallInfo, SysPrivateSettings, SysSettingsService } from '@certd/lib-server'; import { nanoid } from 'nanoid'; diff --git a/packages/ui/certd-server/src/modules/auto/auto-register-cron.ts b/packages/ui/certd-server/src/modules/auto/auto-register-cron.ts index 51029a716..3d92001ca 100644 --- a/packages/ui/certd-server/src/modules/auto/auto-register-cron.ts +++ b/packages/ui/certd-server/src/modules/auto/auto-register-cron.ts @@ -1,6 +1,6 @@ import { Autoload, Config, Init, Inject, Scope, ScopeEnum } from '@midwayjs/core'; import { PipelineService } from '../pipeline/service/pipeline-service.js'; -import { logger } from '@certd/pipeline'; +import { logger } from '@certd/basic'; import { SysSettingsService } from '@certd/lib-server'; @Autoload() diff --git a/packages/ui/certd-server/src/modules/auto/auto-z.ts b/packages/ui/certd-server/src/modules/auto/auto-z.ts index d064211bb..f6f14578c 100644 --- a/packages/ui/certd-server/src/modules/auto/auto-z.ts +++ b/packages/ui/certd-server/src/modules/auto/auto-z.ts @@ -1,5 +1,7 @@ import { App, Autoload, Config, Init, Inject, Scope, ScopeEnum } from '@midwayjs/core'; -import { getPlusInfo, isPlus, logger } from '@certd/pipeline'; +import { getPlusInfo, isPlus } from '@certd/plus-core'; +import { logger } from '@certd/basic'; + import { SysInstallInfo, SysSettingsService } from '@certd/lib-server'; import { getVersion } from '../../utils/version.js'; import dayjs from 'dayjs'; diff --git a/packages/ui/certd-server/src/modules/auto/https/self-certificate.ts b/packages/ui/certd-server/src/modules/auto/https/self-certificate.ts index c2d93e554..490679bdd 100644 --- a/packages/ui/certd-server/src/modules/auto/https/self-certificate.ts +++ b/packages/ui/certd-server/src/modules/auto/https/self-certificate.ts @@ -1,4 +1,4 @@ -import { logger } from '@certd/pipeline'; +import { logger } from '@certd/basic'; import fs from 'fs'; // @ts-ignore import forge from 'node-forge'; diff --git a/packages/ui/certd-server/src/modules/auto/https/server.ts b/packages/ui/certd-server/src/modules/auto/https/server.ts index f654c6395..939104728 100644 --- a/packages/ui/certd-server/src/modules/auto/https/server.ts +++ b/packages/ui/certd-server/src/modules/auto/https/server.ts @@ -2,7 +2,7 @@ import https from 'node:https'; import fs from 'fs'; import { Application } from '@midwayjs/koa'; import { createSelfCertificate } from './self-certificate.js'; -import { logger } from '@certd/pipeline'; +import { logger } from '@certd/basic'; export type HttpsServerOptions = { enabled: boolean; diff --git a/packages/ui/certd-server/src/modules/basic/service/email-service.ts b/packages/ui/certd-server/src/modules/basic/service/email-service.ts index eeb9b3f68..03440a1aa 100644 --- a/packages/ui/certd-server/src/modules/basic/service/email-service.ts +++ b/packages/ui/certd-server/src/modules/basic/service/email-service.ts @@ -1,6 +1,10 @@ import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core'; import type { EmailSend } from '@certd/pipeline'; -import { IEmailService, isPlus, logger } from '@certd/pipeline'; +import { IEmailService } from '@certd/pipeline'; + +import { logger } from '@certd/basic'; +import { isPlus } from '@certd/plus-core'; + import nodemailer from 'nodemailer'; import type SMTPConnection from 'nodemailer/lib/smtp-connection'; import { UserSettingsService } from '../../mine/service/user-settings-service.js'; diff --git a/packages/ui/certd-server/src/modules/cname/service/cname-record-service.ts b/packages/ui/certd-server/src/modules/cname/service/cname-record-service.ts index e92f01758..92e0d4fdf 100644 --- a/packages/ui/certd-server/src/modules/cname/service/cname-record-service.ts +++ b/packages/ui/certd-server/src/modules/cname/service/cname-record-service.ts @@ -4,7 +4,9 @@ import { Repository } from 'typeorm'; import { BaseService, PlusService, ValidateException } from '@certd/lib-server'; import { CnameRecordEntity, CnameRecordStatusType } from '../entity/cname-record.js'; import { createDnsProvider, IDnsProvider, parseDomain } from '@certd/plugin-cert'; -import { cache, CnameProvider, http, logger, utils } from '@certd/pipeline'; +import { CnameProvider } from '@certd/pipeline'; +import { cache, http, logger, utils } from '@certd/basic'; + import { AccessService } from '../../pipeline/service/access-service.js'; import { isDev } from '../../../utils/env.js'; import { walkTxtRecord } from '@certd/acme-client'; diff --git a/packages/ui/certd-server/src/modules/cron/cron.ts b/packages/ui/certd-server/src/modules/cron/cron.ts index be2e1ffdc..681f433e5 100644 --- a/packages/ui/certd-server/src/modules/cron/cron.ts +++ b/packages/ui/certd-server/src/modules/cron/cron.ts @@ -1,5 +1,5 @@ import parser from 'cron-parser'; -import { ILogger } from '@certd/pipeline'; +import { ILogger } from '@certd/basic'; export type CronTaskReq = { /** diff --git a/packages/ui/certd-server/src/modules/pipeline/service/history-service.ts b/packages/ui/certd-server/src/modules/pipeline/service/history-service.ts index cae66c990..a774c8a53 100644 --- a/packages/ui/certd-server/src/modules/pipeline/service/history-service.ts +++ b/packages/ui/certd-server/src/modules/pipeline/service/history-service.ts @@ -6,9 +6,11 @@ import { HistoryEntity } from '../entity/history.js'; import { PipelineEntity } from '../entity/pipeline.js'; import { HistoryDetail } from '../entity/vo/history-detail.js'; import { HistoryLogService } from './history-log-service.js'; -import { FileItem, FileStore, logger, Pipeline, RunnableCollection } from '@certd/pipeline'; +import { FileItem, FileStore, Pipeline, RunnableCollection } from '@certd/pipeline'; + import dayjs from 'dayjs'; import { DbAdapter } from '../../db/index.js'; +import { logger } from '@certd/basic'; /** * 证书申请 diff --git a/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts b/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts index 874cb730b..7d73a8c0c 100644 --- a/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts +++ b/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts @@ -4,7 +4,7 @@ import { In, MoreThan, Repository } from 'typeorm'; import { BaseService, NeedVIPException, PageReq, SysPublicSettings, SysSettingsService } from '@certd/lib-server'; import { PipelineEntity } from '../entity/pipeline.js'; import { PipelineDetail } from '../entity/vo/pipeline-detail.js'; -import { Executor, isPlus, logger, Pipeline, ResultType, RunHistory, UserInfo } from '@certd/pipeline'; +import { Executor, Pipeline, ResultType, RunHistory, UserInfo } from '@certd/pipeline'; import { AccessService } from './access-service.js'; import { DbStorage } from './db-storage.js'; import { StorageService } from './storage-service.js'; @@ -21,6 +21,8 @@ import { CnameProxyService } from './cname-proxy-service.js'; import { PluginConfigGetter } from '../../plugin/service/plugin-config-getter.js'; import dayjs from 'dayjs'; import { DbAdapter } from '../../db/index.js'; +import { isPlus } from '@certd/plus-core'; +import { logger } from '@certd/basic'; const runningTasks: Map = new Map(); const freeCount = 10; 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 3c2942e35..8560e058e 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 @@ -3,7 +3,7 @@ import { BaseService, PageReq } from '@certd/lib-server'; import { PluginEntity } from '../entity/plugin.js'; import { InjectEntityModel } from '@midwayjs/typeorm'; import { Repository } from 'typeorm'; -import { isComm } from '@certd/pipeline'; +import { isComm } from '@certd/plus-core'; import { BuiltInPluginService } from '../../pipeline/service/builtin-plugin-service.js'; import { merge } from 'lodash-es'; diff --git a/packages/ui/certd-server/src/modules/sys/authority/service/user-service.ts b/packages/ui/certd-server/src/modules/sys/authority/service/user-service.ts index 59d308318..4930fb4d2 100644 --- a/packages/ui/certd-server/src/modules/sys/authority/service/user-service.ts +++ b/packages/ui/certd-server/src/modules/sys/authority/service/user-service.ts @@ -12,7 +12,7 @@ import bcrypt from 'bcryptjs'; import { RandomUtil } from '../../../../utils/random.js'; import dayjs from 'dayjs'; import { DbAdapter } from '../../../db/index.js'; -import { utils } from '@certd/pipeline'; +import { utils } from '@certd/basic'; /** * 系统用户 */ diff --git a/packages/ui/certd-server/src/plugins/plugin-aliyun/dns-provider/aliyun-dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-aliyun/dns-provider/aliyun-dns-provider.ts index 6ac4cc0b3..3942557a7 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aliyun/dns-provider/aliyun-dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aliyun/dns-provider/aliyun-dns-provider.ts @@ -1,5 +1,7 @@ import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert'; -import { Autowire, ILogger } from '@certd/pipeline'; +import { Autowire } from '@certd/pipeline'; +import { ILogger } from '@certd/basic'; + import { AliyunAccess, AliyunClient } from '@certd/plugin-plus'; @IsDnsProvider({ diff --git a/packages/ui/certd-server/src/plugins/plugin-cloudflare/dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-cloudflare/dns-provider.ts index fe67282a0..f4eedb611 100644 --- a/packages/ui/certd-server/src/plugins/plugin-cloudflare/dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-cloudflare/dns-provider.ts @@ -1,5 +1,7 @@ import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert'; -import { Autowire, HttpClient, ILogger } from '@certd/pipeline'; +import { Autowire } from '@certd/pipeline'; +import { HttpClient, ILogger } from '@certd/basic'; + import { CloudflareAccess } from './access.js'; export type CloudflareRecord = { diff --git a/packages/ui/certd-server/src/plugins/plugin-demo/dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-demo/dns-provider.ts index da9944c69..fd583ca4d 100644 --- a/packages/ui/certd-server/src/plugins/plugin-demo/dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-demo/dns-provider.ts @@ -1,7 +1,9 @@ import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert'; -import { Autowire, HttpClient, ILogger } from '@certd/pipeline'; +import { Autowire } from '@certd/pipeline'; +import { HttpClient, ILogger } from '@certd/basic'; + import { DemoAccess } from './access.js'; -import { isDev } from "../../utils/env.js"; +import { isDev } from '../../utils/env.js'; type DemoRecord = { // 这里定义Record记录的数据结构,跟对应云平台接口返回值一样即可,一般是拿到id就行,用于删除txt解析记录,清理申请痕迹 diff --git a/packages/ui/certd-server/src/plugins/plugin-doge/lib/index.ts b/packages/ui/certd-server/src/plugins/plugin-doge/lib/index.ts index 04a41beec..977553acd 100644 --- a/packages/ui/certd-server/src/plugins/plugin-doge/lib/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-doge/lib/index.ts @@ -1,7 +1,7 @@ import crypto from 'crypto'; import querystring from 'querystring'; import { DogeCloudAccess } from '../access.js'; -import { HttpClient } from '@certd/pipeline'; +import { HttpClient } from '@certd/basic'; export class DogeClient { accessKey: string; diff --git a/packages/ui/certd-server/src/plugins/plugin-dynadot/dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-dynadot/dns-provider.ts index 78975f386..9f446640e 100644 --- a/packages/ui/certd-server/src/plugins/plugin-dynadot/dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-dynadot/dns-provider.ts @@ -1,5 +1,7 @@ import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert'; -import { Autowire, ILogger } from '@certd/pipeline'; +import { Autowire } from '@certd/pipeline'; +import { ILogger } from '@certd/basic'; + import { DynadotAccess } from './access.js'; import querystring from 'querystring'; diff --git a/packages/ui/certd-server/src/plugins/plugin-host/lib/ssh.ts b/packages/ui/certd-server/src/plugins/plugin-host/lib/ssh.ts index ab5d65dcd..ecb5827e1 100644 --- a/packages/ui/certd-server/src/plugins/plugin-host/lib/ssh.ts +++ b/packages/ui/certd-server/src/plugins/plugin-host/lib/ssh.ts @@ -2,7 +2,7 @@ import ssh2, { ConnectConfig, ExecOptions } from 'ssh2'; import path from 'path'; import * as _ from 'lodash-es'; -import { ILogger } from '@certd/pipeline'; +import { ILogger } from '@certd/basic'; import { SshAccess } from '../access/index.js'; import stripAnsi from 'strip-ansi'; import { SocksClient } from 'socks'; diff --git a/packages/ui/certd-server/src/plugins/plugin-huawei/dns-provider/huawei-dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-huawei/dns-provider/huawei-dns-provider.ts index 7f9e58c87..57896c625 100644 --- a/packages/ui/certd-server/src/plugins/plugin-huawei/dns-provider/huawei-dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-huawei/dns-provider/huawei-dns-provider.ts @@ -1,6 +1,8 @@ import * as _ from 'lodash-es'; import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert'; -import { Autowire, ILogger } from '@certd/pipeline'; +import { Autowire } from '@certd/pipeline'; +import { ILogger } from '@certd/basic'; + import { HuaweiAccess } from '../access/index.js'; import { ApiRequestOptions, HuaweiYunClient } from '@certd/lib-huawei'; diff --git a/packages/ui/certd-server/src/plugins/plugin-huawei/plugins/deploy-to-cdn/index.ts b/packages/ui/certd-server/src/plugins/plugin-huawei/plugins/deploy-to-cdn/index.ts index bbc395358..132ef9f32 100644 --- a/packages/ui/certd-server/src/plugins/plugin-huawei/plugins/deploy-to-cdn/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-huawei/plugins/deploy-to-cdn/index.ts @@ -1,7 +1,8 @@ -import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, resetLogConfigure, RunStrategy, TaskInput } from '@certd/pipeline'; +import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline'; import { HuaweiAccess } from '../../access/index.js'; import { CertInfo } from '@certd/plugin-cert'; import { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from '@certd/plugin-plus'; +import { resetLogConfigure } from '@certd/basic'; @IsTaskPlugin({ name: 'HauweiDeployCertToCDN', diff --git a/packages/ui/certd-server/src/plugins/plugin-jdcloud/dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-jdcloud/dns-provider.ts index 811bf0934..c8622cf52 100644 --- a/packages/ui/certd-server/src/plugins/plugin-jdcloud/dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-jdcloud/dns-provider.ts @@ -1,5 +1,6 @@ import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert'; -import { Autowire, ILogger } from '@certd/pipeline'; +import { Autowire } from '@certd/pipeline'; +import { ILogger } from '@certd/basic'; import { JDCloudAccess } from './access.js'; function promisfy(func: any) { return (params: any, regionId: string) => { diff --git a/packages/ui/certd-server/src/plugins/plugin-tencent/dns-provider/dnspod-dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-tencent/dns-provider/dnspod-dns-provider.ts index e966cde50..0abf7abe9 100644 --- a/packages/ui/certd-server/src/plugins/plugin-tencent/dns-provider/dnspod-dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-tencent/dns-provider/dnspod-dns-provider.ts @@ -1,4 +1,6 @@ -import { Autowire, HttpClient, ILogger } from '@certd/pipeline'; +import { Autowire } from '@certd/pipeline'; +import { HttpClient, ILogger } from '@certd/basic'; + import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert'; import * as _ from 'lodash-es'; import { DnspodAccess } from '../access/index.js'; diff --git a/packages/ui/certd-server/src/plugins/plugin-tencent/dns-provider/tencent-dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-tencent/dns-provider/tencent-dns-provider.ts index f331d5eed..704635b0a 100644 --- a/packages/ui/certd-server/src/plugins/plugin-tencent/dns-provider/tencent-dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-tencent/dns-provider/tencent-dns-provider.ts @@ -1,4 +1,6 @@ -import { Autowire, HttpClient, ILogger } from '@certd/pipeline'; +import { Autowire } from '@certd/pipeline'; +import { HttpClient, ILogger } from '@certd/basic'; + import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert'; import { TencentAccess } from '@certd/plugin-plus'; diff --git a/packages/ui/certd-server/src/plugins/plugin-tencent/lib/index.ts b/packages/ui/certd-server/src/plugins/plugin-tencent/lib/index.ts index 8022ed914..2bc8395ae 100644 --- a/packages/ui/certd-server/src/plugins/plugin-tencent/lib/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-tencent/lib/index.ts @@ -1,6 +1,6 @@ import { TencentAccess } from '@certd/plugin-plus'; import { CertInfo } from '@certd/plugin-cert'; -import { ILogger } from '@certd/pipeline'; +import { ILogger } from '@certd/basic'; export class TencentSslClient { access: TencentAccess; logger: ILogger; diff --git a/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/deploy-to-clb/index.ts b/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/deploy-to-clb/index.ts index 3048866d3..565409276 100644 --- a/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/deploy-to-clb/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/deploy-to-clb/index.ts @@ -1,4 +1,4 @@ -import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, utils } from '@certd/pipeline'; +import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline'; import { TencentAccess } from '@certd/plugin-plus'; import dayjs from 'dayjs'; @@ -131,10 +131,10 @@ export class DeployCertToTencentCLB extends AbstractTaskPlugin { } try { - await utils.sleep(2000); + await this.ctx.utils.sleep(2000); let newCertId = await this.getCertIdFromProps(client); if ((lastCertId && newCertId === lastCertId) || (!lastCertId && !newCertId)) { - await utils.sleep(2000); + await this.ctx.utils.sleep(2000); newCertId = await this.getCertIdFromProps(client); } if (newCertId === lastCertId) { diff --git a/packages/ui/certd-server/src/plugins/plugin-west/dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-west/dns-provider.ts index 3a89f131a..b141b560b 100644 --- a/packages/ui/certd-server/src/plugins/plugin-west/dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-west/dns-provider.ts @@ -1,5 +1,8 @@ import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert'; -import { Autowire, HttpClient, ILogger } from '@certd/pipeline'; +import { Autowire } from '@certd/pipeline'; +import { HttpClient, ILogger } from '@certd/basic'; + + import { WestAccess } from './access.js'; type westRecord = { diff --git a/packages/ui/certd-server/src/plugins/plugin-woai/plugins/plugin-deploy-to-cdn.ts b/packages/ui/certd-server/src/plugins/plugin-woai/plugins/plugin-deploy-to-cdn.ts index 680683c3b..652b6e3eb 100644 --- a/packages/ui/certd-server/src/plugins/plugin-woai/plugins/plugin-deploy-to-cdn.ts +++ b/packages/ui/certd-server/src/plugins/plugin-woai/plugins/plugin-deploy-to-cdn.ts @@ -1,6 +1,7 @@ -import { AbstractTaskPlugin, HttpClient, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline'; +import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline'; import { CertInfo } from '@certd/plugin-cert'; import { WoaiAccess } from '../access.js'; +import { HttpClient } from '@certd/basic'; @IsTaskPlugin({ name: 'WoaiCDN', diff --git a/packages/ui/certd-server/src/utils/env.ts b/packages/ui/certd-server/src/utils/env.ts index 4757306ea..17e4b6bfd 100644 --- a/packages/ui/certd-server/src/utils/env.ts +++ b/packages/ui/certd-server/src/utils/env.ts @@ -1 +1 @@ -export { isDev } from '@certd/pipeline'; +export { isDev } from '@certd/basic'; diff --git a/packages/ui/certd-server/src/utils/http.ts b/packages/ui/certd-server/src/utils/http.ts index f25733217..73c54364d 100644 --- a/packages/ui/certd-server/src/utils/http.ts +++ b/packages/ui/certd-server/src/utils/http.ts @@ -1,4 +1,4 @@ -import { utils } from '@certd/pipeline'; +import { utils } from '@certd/basic'; export async function request(config: any): Promise { try { diff --git a/packages/ui/certd-server/src/utils/version.ts b/packages/ui/certd-server/src/utils/version.ts index 56aebb4c6..4ef3653e3 100644 --- a/packages/ui/certd-server/src/utils/version.ts +++ b/packages/ui/certd-server/src/utils/version.ts @@ -1,4 +1,4 @@ -import { logger } from '@certd/pipeline'; +import { logger } from '@certd/basic'; import fs from 'fs'; export async function getVersion() { From b6722897a0b044d330fd0b0b572d6f722bb0462d Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 17:00:28 +0800 Subject: [PATCH 019/119] =?UTF-8?q?chore:=20email=E5=B8=AE=E5=8A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vitepress/config.ts | 1 + docs/guide/use/email/images/qq-1.png | Bin 0 -> 17878 bytes docs/guide/use/email/images/qq-2.png | Bin 0 -> 71829 bytes docs/guide/use/email/index.md | 7 +++++++ 4 files changed, 8 insertions(+) create mode 100644 docs/guide/use/email/images/qq-1.png create mode 100644 docs/guide/use/email/images/qq-2.png create mode 100644 docs/guide/use/email/index.md diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 5dec81bcd..2e07d7b1d 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -99,6 +99,7 @@ export default defineConfig({ { text: "数据备份", link: "/guide/use/backup/" }, { text: "Certd本身的证书更新", link: "/guide/use/https/index.md" }, { text: "js脚本插件使用", link: "/guide/use/custom-script/index.md" }, + { text: "邮箱配置", link: "/guide/use/email/index.md" }, { text: "如何贡献代码", link: "/guide/development/index.md" }, ] }, diff --git a/docs/guide/use/email/images/qq-1.png b/docs/guide/use/email/images/qq-1.png new file mode 100644 index 0000000000000000000000000000000000000000..25e6531c8c573bac3a7a526c35b72e9ec53eab33 GIT binary patch literal 17878 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 literal 0 HcmV?d00001 diff --git a/docs/guide/use/email/images/qq-2.png b/docs/guide/use/email/images/qq-2.png new file mode 100644 index 0000000000000000000000000000000000000000..310285acec7f72b73f35f461f8af2c2a6b87d983 GIT binary patch literal 71829 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

    cTkLfwC|@u$w(5*qn4h_;NO%75}}lGgVUN= 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 literal 0 HcmV?d00001 diff --git a/docs/guide/use/email/index.md b/docs/guide/use/email/index.md new file mode 100644 index 000000000..6a228a551 --- /dev/null +++ b/docs/guide/use/email/index.md @@ -0,0 +1,7 @@ +# 邮箱配置 + + +## 腾讯企业邮箱、qq邮箱密码获取 + +![](./images/qq-1.png) +![](./images/qq-2.png) \ No newline at end of file From 009c131819912fddc57dc58f111a4d70bf85e5df Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 17:14:34 +0800 Subject: [PATCH 020/119] =?UTF-8?q?chore:=20email=E5=B8=AE=E5=8A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/guide/use/email/images/qq-0.png | Bin 0 -> 13931 bytes docs/guide/use/email/images/qq-11.png | Bin 0 -> 44967 bytes docs/guide/use/email/images/qq-3.png | Bin 0 -> 57128 bytes docs/guide/use/email/index.md | 22 +++++++++++++++++++--- 4 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 docs/guide/use/email/images/qq-0.png create mode 100644 docs/guide/use/email/images/qq-11.png create mode 100644 docs/guide/use/email/images/qq-3.png diff --git a/docs/guide/use/email/images/qq-0.png b/docs/guide/use/email/images/qq-0.png new file mode 100644 index 0000000000000000000000000000000000000000..e65e7d77e490608760a702ffd994704d2a89ca4e GIT binary patch literal 13931 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 F{{Sa6EP((3 literal 0 HcmV?d00001 diff --git a/docs/guide/use/email/images/qq-11.png b/docs/guide/use/email/images/qq-11.png new file mode 100644 index 0000000000000000000000000000000000000000..5a7d0b302c44cb0455aab9f661df3489813eb394 GIT binary patch literal 44967 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 Bp)LRb literal 0 HcmV?d00001 diff --git a/docs/guide/use/email/images/qq-3.png b/docs/guide/use/email/images/qq-3.png new file mode 100644 index 0000000000000000000000000000000000000000..236e655ab88f4f592873d0575f04eebde57ea29d GIT binary patch literal 57128 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 Date: Mon, 4 Nov 2024 18:04:08 +0800 Subject: [PATCH 021/119] chore: --- packages/ui/certd-server/.gitattributes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/certd-server/.gitattributes b/packages/ui/certd-server/.gitattributes index 000166e5e..139597f9c 100644 --- a/packages/ui/certd-server/.gitattributes +++ b/packages/ui/certd-server/.gitattributes @@ -1,2 +1,2 @@ -tools/** filter=lfs diff=lfs merge=lfs -text + From d471d2416d54745eecb67335ff9a8dbf02c2307d Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 18:09:24 +0800 Subject: [PATCH 022/119] chore: --- .../modules/cname/service/cname-provider-service.ts | 5 ++++- .../src/modules/cname/service/common-provider.ts | 10 +++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/ui/certd-server/src/modules/cname/service/cname-provider-service.ts b/packages/ui/certd-server/src/modules/cname/service/cname-provider-service.ts index feec8ef96..354bc5a1f 100644 --- a/packages/ui/certd-server/src/modules/cname/service/cname-provider-service.ts +++ b/packages/ui/certd-server/src/modules/cname/service/cname-provider-service.ts @@ -85,7 +85,10 @@ export class CnameProviderService extends BaseService { if (founds && founds.length > 0) { return founds[0]; } - return CommonProviders[0] as CnameProviderEntity; + if (CommonProviders.length > 0) { + return CommonProviders[0] as CnameProviderEntity; + } + return null; } async list(req: ListReq): Promise { diff --git a/packages/ui/certd-server/src/modules/cname/service/common-provider.ts b/packages/ui/certd-server/src/modules/cname/service/common-provider.ts index fb0f987b0..9752b9d8a 100644 --- a/packages/ui/certd-server/src/modules/cname/service/common-provider.ts +++ b/packages/ui/certd-server/src/modules/cname/service/common-provider.ts @@ -7,11 +7,11 @@ export type CnameProvider = { title: string; }; export const CommonProviders = [ - { - id: -1, - domain: 'cname.certd.com.cn', - title: '公共CNAME服务', - }, + // { + // id: -1, + // domain: 'cname.certd.com.cn', + // title: '公共CNAME服务', + // }, ]; export class CommonDnsProvider implements IDnsProvider { From 8be886daf6f6a4b8109973387890451ddc07a93c Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 21:31:59 +0800 Subject: [PATCH 023/119] chore: --- docs/guide/use/custom-script/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/guide/use/custom-script/index.md b/docs/guide/use/custom-script/index.md index a984a6d3f..6248fb8a5 100644 --- a/docs/guide/use/custom-script/index.md +++ b/docs/guide/use/custom-script/index.md @@ -6,11 +6,11 @@ ## 2. 使用示例 ```js -const certPem = this.ctx.self.cert.crt -const certKey = this.ctx.self.cert.key +const certPem = ctx.self.cert.crt +const certKey = ctx.self.cert.key //axios发起http请求上传证书 -const res = await this.ctx.http.request({ +const res = await ctx.http.request({ url:"your_cert_deploy_url", method:"post", data:{ @@ -18,7 +18,7 @@ const res = await this.ctx.http.request({ key : certKey } }) -this.ctx.logger.info("上传成功",res.data) +ctx.logger.info("上传成功",res.data) ``` From 7d601b45a21015e5d59e61bc7aa2c793fd525d1c Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 21:34:41 +0800 Subject: [PATCH 024/119] chore: --- .../src/plugins/plugin-other/plugins/plugin-script.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-script.ts b/packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-script.ts index fb6a61c0b..ff1299318 100644 --- a/packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-script.ts +++ b/packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-script.ts @@ -21,7 +21,7 @@ export type CustomScriptContext = { export class CustomScriptPlugin extends AbstractTaskPlugin { @TaskInput({ title: '脚本', - helper: '自定义js脚本', + helper: '自定义js脚本,[脚本编写帮助文档](https://certd.docmirror.cn/guide/use/custom-script/)', component: { name: 'a-textarea', vModel: 'value', From c747ffee5adcec7ba8d6be42c84e513b9c016513 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 21:35:10 +0800 Subject: [PATCH 025/119] build: prepare to build --- packages/core/basic/build.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/basic/build.md b/packages/core/basic/build.md index 2a38d7b2d..14f5bf1b5 100644 --- a/packages/core/basic/build.md +++ b/packages/core/basic/build.md @@ -1 +1 @@ -02:21 +21:35 From 1d8515bce0b3ce5ece84db53ca57cfbd0c3f4d5a Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 21:37:00 +0800 Subject: [PATCH 026/119] v1.27.1 --- CHANGELOG.md | 12 ++++++++++ lerna.json | 2 +- packages/core/acme-client/CHANGELOG.md | 4 ++++ packages/core/acme-client/package.json | 2 +- packages/core/basic/CHANGELOG.md | 6 +++++ packages/core/basic/package.json | 2 +- packages/core/pipeline/CHANGELOG.md | 6 +++++ packages/core/pipeline/package.json | 6 ++--- packages/libs/lib-huawei/CHANGELOG.md | 4 ++++ packages/libs/lib-huawei/package.json | 2 +- packages/libs/lib-iframe/CHANGELOG.md | 4 ++++ packages/libs/lib-iframe/package.json | 2 +- packages/libs/lib-jdcloud/CHANGELOG.md | 4 ++++ packages/libs/lib-jdcloud/package.json | 2 +- packages/libs/lib-k8s/CHANGELOG.md | 4 ++++ packages/libs/lib-k8s/package.json | 4 ++-- packages/libs/lib-server/CHANGELOG.md | 6 +++++ packages/libs/lib-server/package.json | 10 ++++---- packages/libs/midway-flyway-js/CHANGELOG.md | 4 ++++ packages/libs/midway-flyway-js/package.json | 2 +- packages/plugins/plugin-cert/CHANGELOG.md | 4 ++++ packages/plugins/plugin-cert/package.json | 8 +++---- packages/ui/certd-client/CHANGELOG.md | 12 ++++++++++ packages/ui/certd-client/package.json | 6 ++--- packages/ui/certd-server/CHANGELOG.md | 7 ++++++ packages/ui/certd-server/package.json | 26 ++++++++++----------- 26 files changed, 114 insertions(+), 37 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dea5716e8..ffadaf700 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) + +### Bug Fixes + +* 修复头像没有更新的bug ([9b4a31f](https://github.com/certd/certd/commit/9b4a31fa6a32b9cab2e22bd141cf96ca29120445)) + +### Performance Improvements + +* 禁止页面缓存,点击tab页签可以刷新数据 ([7ad4b55](https://github.com/certd/certd/commit/7ad4b55ee000c1dd0747832b11107f32b0ffb889)) +* 优化时间选择器,自动填写分钟和秒钟 ([396dc34](https://github.com/certd/certd/commit/396dc34a841c7d016b033736afdba8366fb2d211)) +* cname 域名映射记录可读性优化 ([b1117ed](https://github.com/certd/certd/commit/b1117ed54a3ef015752999324ff72b821ef5e4b9)) + # [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 638b4a7c1..5195ca8e9 100644 --- a/lerna.json +++ b/lerna.json @@ -9,5 +9,5 @@ } }, "npmClient": "pnpm", - "version": "1.27.0" + "version": "1.27.1" } diff --git a/packages/core/acme-client/CHANGELOG.md b/packages/core/acme-client/CHANGELOG.md index 796247b0e..c444733c9 100644 --- a/packages/core/acme-client/CHANGELOG.md +++ b/packages/core/acme-client/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.1](https://github.com/publishlab/node-acme-client/compare/v1.27.0...v1.27.1) (2024-11-04) + +**Note:** Version bump only for package @certd/acme-client + # [1.27.0](https://github.com/publishlab/node-acme-client/compare/v1.26.16...v1.27.0) (2024-10-31) **Note:** Version bump only for package @certd/acme-client diff --git a/packages/core/acme-client/package.json b/packages/core/acme-client/package.json index 51a93b73a..d68558c92 100644 --- a/packages/core/acme-client/package.json +++ b/packages/core/acme-client/package.json @@ -3,7 +3,7 @@ "description": "Simple and unopinionated ACME client", "private": false, "author": "nmorsman", - "version": "1.27.0", + "version": "1.27.1", "main": "src/index.js", "types": "types/index.d.ts", "license": "MIT", diff --git a/packages/core/basic/CHANGELOG.md b/packages/core/basic/CHANGELOG.md index 8b10f1d80..05f93d00f 100644 --- a/packages/core/basic/CHANGELOG.md +++ b/packages/core/basic/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) + +### Performance Improvements + +* cname 域名映射记录可读性优化 ([b1117ed](https://github.com/certd/certd/commit/b1117ed54a3ef015752999324ff72b821ef5e4b9)) + # [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) **Note:** Version bump only for package @certd/basic diff --git a/packages/core/basic/package.json b/packages/core/basic/package.json index 720aaba09..a5ad5be97 100644 --- a/packages/core/basic/package.json +++ b/packages/core/basic/package.json @@ -1,7 +1,7 @@ { "name": "@certd/basic", "private": false, - "version": "1.27.0", + "version": "1.27.1", "type": "module", "main": "./dist/index.js", "module": "./dist/index.js", diff --git a/packages/core/pipeline/CHANGELOG.md b/packages/core/pipeline/CHANGELOG.md index bad4d177c..98c9f6e97 100644 --- a/packages/core/pipeline/CHANGELOG.md +++ b/packages/core/pipeline/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) + +### Performance Improvements + +* 优化时间选择器,自动填写分钟和秒钟 ([396dc34](https://github.com/certd/certd/commit/396dc34a841c7d016b033736afdba8366fb2d211)) + # [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) **Note:** Version bump only for package @certd/pipeline diff --git a/packages/core/pipeline/package.json b/packages/core/pipeline/package.json index d66f7aa98..f7ad0f0d1 100644 --- a/packages/core/pipeline/package.json +++ b/packages/core/pipeline/package.json @@ -1,7 +1,7 @@ { "name": "@certd/pipeline", "private": false, - "version": "1.27.0", + "version": "1.27.1", "type": "module", "main": "./dist/index.js", "module": "./dist/index.js", @@ -16,8 +16,8 @@ "test": "mocha --loader=ts-node/esm" }, "dependencies": { - "@certd/basic": "^1.27.0", - "@certd/plus-core": "^1.27.0", + "@certd/basic": "^1.27.1", + "@certd/plus-core": "^1.27.1", "axios": "^1.7.2", "dayjs": "^1.11.7", "fix-path": "^4.0.0", diff --git a/packages/libs/lib-huawei/CHANGELOG.md b/packages/libs/lib-huawei/CHANGELOG.md index 99fbb1310..3950a4592 100644 --- a/packages/libs/lib-huawei/CHANGELOG.md +++ b/packages/libs/lib-huawei/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) + +**Note:** Version bump only for package @certd/lib-huawei + # [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) **Note:** Version bump only for package @certd/lib-huawei diff --git a/packages/libs/lib-huawei/package.json b/packages/libs/lib-huawei/package.json index 815831d12..79081f1c0 100644 --- a/packages/libs/lib-huawei/package.json +++ b/packages/libs/lib-huawei/package.json @@ -1,7 +1,7 @@ { "name": "@certd/lib-huawei", "private": false, - "version": "1.27.0", + "version": "1.27.1", "main": "./dist/bundle.js", "module": "./dist/bundle.js", "types": "./dist/d/index.d.ts", diff --git a/packages/libs/lib-iframe/CHANGELOG.md b/packages/libs/lib-iframe/CHANGELOG.md index 63acedbab..478f1f125 100644 --- a/packages/libs/lib-iframe/CHANGELOG.md +++ b/packages/libs/lib-iframe/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) + +**Note:** Version bump only for package @certd/lib-iframe + # [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) **Note:** Version bump only for package @certd/lib-iframe diff --git a/packages/libs/lib-iframe/package.json b/packages/libs/lib-iframe/package.json index b1278eebe..09f68c769 100644 --- a/packages/libs/lib-iframe/package.json +++ b/packages/libs/lib-iframe/package.json @@ -1,7 +1,7 @@ { "name": "@certd/lib-iframe", "private": false, - "version": "1.27.0", + "version": "1.27.1", "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/packages/libs/lib-jdcloud/CHANGELOG.md b/packages/libs/lib-jdcloud/CHANGELOG.md index f58ad32ae..c16b71346 100644 --- a/packages/libs/lib-jdcloud/CHANGELOG.md +++ b/packages/libs/lib-jdcloud/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) + +**Note:** Version bump only for package @certd/lib-jdcloud + # [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) **Note:** Version bump only for package @certd/lib-jdcloud diff --git a/packages/libs/lib-jdcloud/package.json b/packages/libs/lib-jdcloud/package.json index d8fe93201..c92ecfa37 100644 --- a/packages/libs/lib-jdcloud/package.json +++ b/packages/libs/lib-jdcloud/package.json @@ -1,7 +1,7 @@ { "name": "@certd/lib-jdcloud", "private": false, - "version": "1.27.0", + "version": "1.27.1", "main": "./dist/bundle.mjs", "module": "./dist/bundle.mjs", "types": "./dist/d/index.d.ts", diff --git a/packages/libs/lib-k8s/CHANGELOG.md b/packages/libs/lib-k8s/CHANGELOG.md index 1bbcc768c..cf6880554 100644 --- a/packages/libs/lib-k8s/CHANGELOG.md +++ b/packages/libs/lib-k8s/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) + +**Note:** Version bump only for package @certd/lib-k8s + # [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) **Note:** Version bump only for package @certd/lib-k8s diff --git a/packages/libs/lib-k8s/package.json b/packages/libs/lib-k8s/package.json index 26dcc451b..1bcfa2464 100644 --- a/packages/libs/lib-k8s/package.json +++ b/packages/libs/lib-k8s/package.json @@ -1,7 +1,7 @@ { "name": "@certd/lib-k8s", "private": false, - "version": "1.27.0", + "version": "1.27.1", "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -18,7 +18,7 @@ "@kubernetes/client-node": "0.21.0" }, "devDependencies": { - "@certd/basic": "^1.27.0", + "@certd/basic": "^1.27.1", "@rollup/plugin-commonjs": "^23.0.4", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.0.1", diff --git a/packages/libs/lib-server/CHANGELOG.md b/packages/libs/lib-server/CHANGELOG.md index 0eef96215..8547d8bae 100644 --- a/packages/libs/lib-server/CHANGELOG.md +++ b/packages/libs/lib-server/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) + +### Performance Improvements + +* cname 域名映射记录可读性优化 ([b1117ed](https://github.com/certd/certd/commit/b1117ed54a3ef015752999324ff72b821ef5e4b9)) + # [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) **Note:** Version bump only for package @certd/lib-server diff --git a/packages/libs/lib-server/package.json b/packages/libs/lib-server/package.json index 0bbe1b40d..c88132611 100644 --- a/packages/libs/lib-server/package.json +++ b/packages/libs/lib-server/package.json @@ -1,6 +1,6 @@ { "name": "@certd/lib-server", - "version": "1.27.0", + "version": "1.27.1", "description": "midway with flyway, sql upgrade way ", "private": false, "type": "module", @@ -26,10 +26,10 @@ ], "license": "AGPL", "dependencies": { - "@certd/acme-client": "^1.27.0", - "@certd/basic": "^1.27.0", - "@certd/plus-core": "^1.27.0", - "@certd/pipeline": "^1.27.0", + "@certd/acme-client": "^1.27.1", + "@certd/basic": "^1.27.1", + "@certd/pipeline": "^1.27.1", + "@certd/plus-core": "^1.27.1", "@midwayjs/cache": "~3.14.0", "@midwayjs/core": "~3.17.1", "@midwayjs/i18n": "~3.17.3", diff --git a/packages/libs/midway-flyway-js/CHANGELOG.md b/packages/libs/midway-flyway-js/CHANGELOG.md index 2f78b4cb4..b3c568fb9 100644 --- a/packages/libs/midway-flyway-js/CHANGELOG.md +++ b/packages/libs/midway-flyway-js/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) + +**Note:** Version bump only for package @certd/midway-flyway-js + # [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) **Note:** Version bump only for package @certd/midway-flyway-js diff --git a/packages/libs/midway-flyway-js/package.json b/packages/libs/midway-flyway-js/package.json index fe228ca57..693cf7f5a 100644 --- a/packages/libs/midway-flyway-js/package.json +++ b/packages/libs/midway-flyway-js/package.json @@ -1,6 +1,6 @@ { "name": "@certd/midway-flyway-js", - "version": "1.27.0", + "version": "1.27.1", "description": "midway with flyway, sql upgrade way ", "private": false, "type": "module", diff --git a/packages/plugins/plugin-cert/CHANGELOG.md b/packages/plugins/plugin-cert/CHANGELOG.md index 09931b08e..e7f634d7c 100644 --- a/packages/plugins/plugin-cert/CHANGELOG.md +++ b/packages/plugins/plugin-cert/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) + +**Note:** Version bump only for package @certd/plugin-cert + # [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) ### Bug Fixes diff --git a/packages/plugins/plugin-cert/package.json b/packages/plugins/plugin-cert/package.json index 9cc207365..c55da7d52 100644 --- a/packages/plugins/plugin-cert/package.json +++ b/packages/plugins/plugin-cert/package.json @@ -1,7 +1,7 @@ { "name": "@certd/plugin-cert", "private": false, - "version": "1.27.0", + "version": "1.27.1", "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -15,9 +15,9 @@ "preview": "vite preview" }, "dependencies": { - "@certd/acme-client": "^1.27.0", - "@certd/basic": "^1.27.0", - "@certd/pipeline": "^1.27.0", + "@certd/acme-client": "^1.27.1", + "@certd/basic": "^1.27.1", + "@certd/pipeline": "^1.27.1", "@google-cloud/publicca": "^1.3.0", "dayjs": "^1.11.7", "jszip": "^3.10.1", diff --git a/packages/ui/certd-client/CHANGELOG.md b/packages/ui/certd-client/CHANGELOG.md index 6ce33ac53..6c665eb0f 100644 --- a/packages/ui/certd-client/CHANGELOG.md +++ b/packages/ui/certd-client/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) + +### Bug Fixes + +* 修复头像没有更新的bug ([9b4a31f](https://github.com/certd/certd/commit/9b4a31fa6a32b9cab2e22bd141cf96ca29120445)) + +### Performance Improvements + +* 禁止页面缓存,点击tab页签可以刷新数据 ([7ad4b55](https://github.com/certd/certd/commit/7ad4b55ee000c1dd0747832b11107f32b0ffb889)) +* 优化时间选择器,自动填写分钟和秒钟 ([396dc34](https://github.com/certd/certd/commit/396dc34a841c7d016b033736afdba8366fb2d211)) +* cname 域名映射记录可读性优化 ([b1117ed](https://github.com/certd/certd/commit/b1117ed54a3ef015752999324ff72b821ef5e4b9)) + # [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) ### Bug Fixes diff --git a/packages/ui/certd-client/package.json b/packages/ui/certd-client/package.json index 270299396..6228e6ed2 100644 --- a/packages/ui/certd-client/package.json +++ b/packages/ui/certd-client/package.json @@ -1,6 +1,6 @@ { "name": "@certd/ui-client", - "version": "1.27.0", + "version": "1.27.1", "private": true, "scripts": { "dev": "vite --open", @@ -65,8 +65,8 @@ "vuedraggable": "^4.1.0" }, "devDependencies": { - "@certd/lib-iframe": "^1.27.0", - "@certd/pipeline": "^1.27.0", + "@certd/lib-iframe": "^1.27.1", + "@certd/pipeline": "^1.27.1", "@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-node-resolve": "^15.2.3", "@types/chai": "^4.3.12", diff --git a/packages/ui/certd-server/CHANGELOG.md b/packages/ui/certd-server/CHANGELOG.md index cde3262a6..744cceda5 100644 --- a/packages/ui/certd-server/CHANGELOG.md +++ b/packages/ui/certd-server/CHANGELOG.md @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) + +### Performance Improvements + +* 优化时间选择器,自动填写分钟和秒钟 ([396dc34](https://github.com/certd/certd/commit/396dc34a841c7d016b033736afdba8366fb2d211)) +* cname 域名映射记录可读性优化 ([b1117ed](https://github.com/certd/certd/commit/b1117ed54a3ef015752999324ff72b821ef5e4b9)) + # [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) ### Bug Fixes diff --git a/packages/ui/certd-server/package.json b/packages/ui/certd-server/package.json index b0895aa85..98c9cb8dd 100644 --- a/packages/ui/certd-server/package.json +++ b/packages/ui/certd-server/package.json @@ -1,6 +1,6 @@ { "name": "@certd/ui-server", - "version": "1.27.0", + "version": "1.27.1", "description": "fast-server base midway", "private": true, "type": "module", @@ -27,18 +27,18 @@ }, "dependencies": { "@alicloud/pop-core": "^1.7.10", - "@certd/acme-client": "^1.27.0", - "@certd/commercial-core": "^1.27.0", - "@certd/lib-huawei": "^1.27.0", - "@certd/lib-jdcloud": "^1.27.0", - "@certd/lib-k8s": "^1.27.0", - "@certd/lib-server": "^1.27.0", - "@certd/midway-flyway-js": "^1.27.0", - "@certd/pipeline": "^1.27.0", - "@certd/plugin-cert": "^1.27.0", - "@certd/plugin-plus": "^1.27.0", - "@certd/plus-core": "^1.27.0", - "@certd/basic": "^1.27.0", + "@certd/acme-client": "^1.27.1", + "@certd/basic": "^1.27.1", + "@certd/commercial-core": "^1.27.1", + "@certd/lib-huawei": "^1.27.1", + "@certd/lib-jdcloud": "^1.27.1", + "@certd/lib-k8s": "^1.27.1", + "@certd/lib-server": "^1.27.1", + "@certd/midway-flyway-js": "^1.27.1", + "@certd/pipeline": "^1.27.1", + "@certd/plugin-cert": "^1.27.1", + "@certd/plugin-plus": "^1.27.1", + "@certd/plus-core": "^1.27.1", "@huaweicloud/huaweicloud-sdk-cdn": "^3.1.120", "@huaweicloud/huaweicloud-sdk-core": "^3.1.120", "@koa/cors": "^5.0.0", From b8724ac8c39c97d2756c4108d867125efb4654c2 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 21:38:44 +0800 Subject: [PATCH 027/119] build: trigger build image --- build.trigger | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.trigger b/build.trigger index 0cfbf0888..4fa7af9f7 100644 --- a/build.trigger +++ b/build.trigger @@ -1 +1 @@ -2 +21:38 From dfd6857069948e53d7af493a00b3f74fe951bc3f Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 21:40:41 +0800 Subject: [PATCH 028/119] chore: --- docs/guide/use/custom-script/index.md | 1 + packages/core/acme-client/package.json | 2 +- packages/core/basic/package.json | 2 +- packages/core/pipeline/package.json | 2 +- packages/libs/lib-huawei/package.json | 2 +- packages/libs/lib-iframe/package.json | 2 +- packages/libs/lib-jdcloud/package.json | 2 +- packages/libs/lib-k8s/package.json | 2 +- packages/libs/lib-server/package.json | 2 +- packages/libs/midway-flyway-js/package.json | 2 +- packages/plugins/plugin-cert/package.json | 2 +- 11 files changed, 11 insertions(+), 10 deletions(-) diff --git a/docs/guide/use/custom-script/index.md b/docs/guide/use/custom-script/index.md index 6248fb8a5..06fe12faa 100644 --- a/docs/guide/use/custom-script/index.md +++ b/docs/guide/use/custom-script/index.md @@ -18,6 +18,7 @@ const res = await ctx.http.request({ key : certKey } }) +//不能用console.log,需要用ctx.logger 才能把日志打印在ui上 ctx.logger.info("上传成功",res.data) diff --git a/packages/core/acme-client/package.json b/packages/core/acme-client/package.json index d68558c92..ff0d66c10 100644 --- a/packages/core/acme-client/package.json +++ b/packages/core/acme-client/package.json @@ -60,5 +60,5 @@ "bugs": { "url": "https://github.com/publishlab/node-acme-client/issues" }, - "gitHead": "c643d7edc3721a6d2ac701a35ef600f6b6ff4b34" + "gitHead": "1d8515bce0b3ce5ece84db53ca57cfbd0c3f4d5a" } diff --git a/packages/core/basic/package.json b/packages/core/basic/package.json index a5ad5be97..1c8ca51c0 100644 --- a/packages/core/basic/package.json +++ b/packages/core/basic/package.json @@ -64,5 +64,5 @@ "vite": "^4.3.8", "vue-tsc": "^1.6.5" }, - "gitHead": "c643d7edc3721a6d2ac701a35ef600f6b6ff4b34" + "gitHead": "1d8515bce0b3ce5ece84db53ca57cfbd0c3f4d5a" } diff --git a/packages/core/pipeline/package.json b/packages/core/pipeline/package.json index f7ad0f0d1..e95364ca8 100644 --- a/packages/core/pipeline/package.json +++ b/packages/core/pipeline/package.json @@ -67,5 +67,5 @@ "vite": "^4.3.8", "vue-tsc": "^1.6.5" }, - "gitHead": "c643d7edc3721a6d2ac701a35ef600f6b6ff4b34" + "gitHead": "1d8515bce0b3ce5ece84db53ca57cfbd0c3f4d5a" } diff --git a/packages/libs/lib-huawei/package.json b/packages/libs/lib-huawei/package.json index 79081f1c0..b362c3292 100644 --- a/packages/libs/lib-huawei/package.json +++ b/packages/libs/lib-huawei/package.json @@ -17,5 +17,5 @@ "rimraf": "^5.0.5", "rollup": "^3.7.4" }, - "gitHead": "c643d7edc3721a6d2ac701a35ef600f6b6ff4b34" + "gitHead": "1d8515bce0b3ce5ece84db53ca57cfbd0c3f4d5a" } diff --git a/packages/libs/lib-iframe/package.json b/packages/libs/lib-iframe/package.json index 09f68c769..d43697f25 100644 --- a/packages/libs/lib-iframe/package.json +++ b/packages/libs/lib-iframe/package.json @@ -39,5 +39,5 @@ "tslib": "^2.5.2", "typescript": "^5.4.2" }, - "gitHead": "c643d7edc3721a6d2ac701a35ef600f6b6ff4b34" + "gitHead": "1d8515bce0b3ce5ece84db53ca57cfbd0c3f4d5a" } diff --git a/packages/libs/lib-jdcloud/package.json b/packages/libs/lib-jdcloud/package.json index c92ecfa37..e7d7dee0b 100644 --- a/packages/libs/lib-jdcloud/package.json +++ b/packages/libs/lib-jdcloud/package.json @@ -27,5 +27,5 @@ "rimraf": "^5.0.5", "rollup": "^3.7.4" }, - "gitHead": "c643d7edc3721a6d2ac701a35ef600f6b6ff4b34" + "gitHead": "1d8515bce0b3ce5ece84db53ca57cfbd0c3f4d5a" } diff --git a/packages/libs/lib-k8s/package.json b/packages/libs/lib-k8s/package.json index 1bcfa2464..f52a96885 100644 --- a/packages/libs/lib-k8s/package.json +++ b/packages/libs/lib-k8s/package.json @@ -40,5 +40,5 @@ "tslib": "^2.5.2", "typescript": "^5.4.2" }, - "gitHead": "c643d7edc3721a6d2ac701a35ef600f6b6ff4b34" + "gitHead": "1d8515bce0b3ce5ece84db53ca57cfbd0c3f4d5a" } diff --git a/packages/libs/lib-server/package.json b/packages/libs/lib-server/package.json index c88132611..59b31ee0e 100644 --- a/packages/libs/lib-server/package.json +++ b/packages/libs/lib-server/package.json @@ -70,5 +70,5 @@ "typeorm": "^0.3.11", "typescript": "^5.4.2" }, - "gitHead": "c643d7edc3721a6d2ac701a35ef600f6b6ff4b34" + "gitHead": "1d8515bce0b3ce5ece84db53ca57cfbd0c3f4d5a" } diff --git a/packages/libs/midway-flyway-js/package.json b/packages/libs/midway-flyway-js/package.json index 693cf7f5a..c8aed2467 100644 --- a/packages/libs/midway-flyway-js/package.json +++ b/packages/libs/midway-flyway-js/package.json @@ -56,5 +56,5 @@ "typeorm": "^0.3.11", "typescript": "^5.4.2" }, - "gitHead": "c643d7edc3721a6d2ac701a35ef600f6b6ff4b34" + "gitHead": "1d8515bce0b3ce5ece84db53ca57cfbd0c3f4d5a" } diff --git a/packages/plugins/plugin-cert/package.json b/packages/plugins/plugin-cert/package.json index c55da7d52..8b5490dc1 100644 --- a/packages/plugins/plugin-cert/package.json +++ b/packages/plugins/plugin-cert/package.json @@ -57,5 +57,5 @@ "vite": "^3.1.0", "vue-tsc": "^0.38.9" }, - "gitHead": "c643d7edc3721a6d2ac701a35ef600f6b6ff4b34" + "gitHead": "1d8515bce0b3ce5ece84db53ca57cfbd0c3f4d5a" } From 3feb3f592ca0caf55ebd33976745b9a7eab5de48 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 21:57:13 +0800 Subject: [PATCH 029/119] chore: --- packages/ui/certd-server/tools/lego/.keep | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 packages/ui/certd-server/tools/lego/.keep diff --git a/packages/ui/certd-server/tools/lego/.keep b/packages/ui/certd-server/tools/lego/.keep deleted file mode 100644 index 1afab5f77..000000000 --- a/packages/ui/certd-server/tools/lego/.keep +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 -size 2 From 82606e63c02407dc885bbc34bf740248caee34ec Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 21:58:18 +0800 Subject: [PATCH 030/119] chore: --- packages/ui/certd-server/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/certd-server/.gitignore b/packages/ui/certd-server/.gitignore index 4e02485f1..9d5597127 100755 --- a/packages/ui/certd-server/.gitignore +++ b/packages/ui/certd-server/.gitignore @@ -20,4 +20,4 @@ run/ .env.pgpl.yaml tools/* -!tools/lego/.keep +!tools/lego/readme.md From 372bc2d9d6a6a0b6e61d1b85716b3f6fa8093cb9 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 21:59:32 +0800 Subject: [PATCH 031/119] chore: --- packages/ui/certd-server/.gitignore | 2 +- packages/ui/certd-server/tools/lego/readme.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 packages/ui/certd-server/tools/lego/readme.md diff --git a/packages/ui/certd-server/.gitignore b/packages/ui/certd-server/.gitignore index 9d5597127..25237a916 100755 --- a/packages/ui/certd-server/.gitignore +++ b/packages/ui/certd-server/.gitignore @@ -19,5 +19,5 @@ run/ .clinic .env.pgpl.yaml -tools/* +tools/lego/* !tools/lego/readme.md diff --git a/packages/ui/certd-server/tools/lego/readme.md b/packages/ui/certd-server/tools/lego/readme.md new file mode 100644 index 000000000..abb5cbea7 --- /dev/null +++ b/packages/ui/certd-server/tools/lego/readme.md @@ -0,0 +1 @@ +lego workspace From f9fc83bfb0f21afb0dddd4f80c07e81f81fa20e0 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 22:09:23 +0800 Subject: [PATCH 032/119] chore: --- packages/ui/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ui/Dockerfile b/packages/ui/Dockerfile index 294d205af..ec97ed9f7 100644 --- a/packages/ui/Dockerfile +++ b/packages/ui/Dockerfile @@ -23,9 +23,9 @@ RUN mkdir -p $LEGO_DOWNLOAD_DIR # 根据架构下载不同的文件 RUN ARCH=$(uname -m) && \ if [ "$ARCH" = "x86_64" ]; then \ - wget -O $LEGO_DOWNLOAD_DIR/lego_v${LEGO_VERSION}_linux_amd64.tar.gz https://github.com/go-acme/lego/releases/download/v${LEGO_VERSION}/lego_v${LEGO_VERSION}_linux_arm64.tar.gz; \ + wget -O $LEGO_DOWNLOAD_DIR/lego_v${LEGO_VERSION}_linux_amd64.tar.gz https://github.com/go-acme/lego/releases/download/v${LEGO_VERSION}/lego_v${LEGO_VERSION}_linux_amd64.tar.gz; \ elif [ "$ARCH" = "aarch64" ]; then \ - wget -O $LEGO_DOWNLOAD_DIR/lego_v${LEGO_VERSION}_linux_arm64.tar.gz https://github.com/go-acme/lego/releases/download/v${LEGO_VERSION}/lego_v${LEGO_VERSION}_linux_amd64.tar.gz; \ + wget -O $LEGO_DOWNLOAD_DIR/lego_v${LEGO_VERSION}_linux_arm64.tar.gz https://github.com/go-acme/lego/releases/download/v${LEGO_VERSION}/lego_v${LEGO_VERSION}_linux_arm64.tar.gz; \ else \ echo "Unsupported architecture: $ARCH"; \ fi From 027c0f41e5ea5bb3eb1802b8da23509875e888b1 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 22:09:38 +0800 Subject: [PATCH 033/119] chore: --- build.trigger | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.trigger b/build.trigger index 4fa7af9f7..56a6051ca 100644 --- a/build.trigger +++ b/build.trigger @@ -1 +1 @@ -21:38 +1 \ No newline at end of file From 77c9a7e2fa61b148333e6a78866f81a902032414 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 4 Nov 2024 22:38:58 +0800 Subject: [PATCH 034/119] chore: --- docs/guide/changelogs/CHANGELOG.md | 129 +++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 130 insertions(+), 1 deletion(-) diff --git a/docs/guide/changelogs/CHANGELOG.md b/docs/guide/changelogs/CHANGELOG.md index 0c6334bcb..ffadaf700 100644 --- a/docs/guide/changelogs/CHANGELOG.md +++ b/docs/guide/changelogs/CHANGELOG.md @@ -3,6 +3,135 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) + +### Bug Fixes + +* 修复头像没有更新的bug ([9b4a31f](https://github.com/certd/certd/commit/9b4a31fa6a32b9cab2e22bd141cf96ca29120445)) + +### Performance Improvements + +* 禁止页面缓存,点击tab页签可以刷新数据 ([7ad4b55](https://github.com/certd/certd/commit/7ad4b55ee000c1dd0747832b11107f32b0ffb889)) +* 优化时间选择器,自动填写分钟和秒钟 ([396dc34](https://github.com/certd/certd/commit/396dc34a841c7d016b033736afdba8366fb2d211)) +* cname 域名映射记录可读性优化 ([b1117ed](https://github.com/certd/certd/commit/b1117ed54a3ef015752999324ff72b821ef5e4b9)) + +# [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) + +### Bug Fixes + +* 修复历史记录不能按名称查询的bug ([6113c38](https://github.com/certd/certd/commit/6113c388b7fc58b11ca19ff05cc1286d096c8d28)) +* pfx兼容windows server 2016 ([e5e468a](https://github.com/certd/certd/commit/e5e468a463f66d02f235de54b7c1e09ace5f1cb1)) + +### Features + +* 首页全新改版 ([63ec5b5](https://github.com/certd/certd/commit/63ec5b5519c760a3330569c0da6dac157302a330)) + +### Performance Improvements + +* 管理控制台数据统计 ([babd589](https://github.com/certd/certd/commit/babd5897ae013ff7c04ebfcbfac8a00d84dd627c)) +* 增加向导 ([6d9ef26](https://github.com/certd/certd/commit/6d9ef26ecab71d752c2c55d75aed4fb5f6c05a39)) +* lego 升级到 4.19.2 ([129bf53](https://github.com/certd/certd/commit/129bf53edc9bbb001fe49fbd7e239bd1d09cc128)) + +## [1.26.16](https://github.com/certd/certd/compare/v1.26.15...v1.26.16) (2024-10-30) + +### Bug Fixes + +* 修复lego No help topic for 错误 ([aaaf8d7](https://github.com/certd/certd/commit/aaaf8d7db34896cf8f2ff8f12eec1ab0cae58f0f)) + +### Performance Improvements + +* 支持白山云cdn部署 ([b1b2cd0](https://github.com/certd/certd/commit/b1b2cd088b684eda764962abd61754c26a204d1c)) +* 支持华为云cdn ([81a3fdb](https://github.com/certd/certd/commit/81a3fdbc29b71f380762008cc151493ec97458f9)) + +## [1.26.15](https://github.com/certd/certd/compare/v1.26.14...v1.26.15) (2024-10-28) + +### Bug Fixes + +* 顶部菜单变...的bug ([6dabad7](https://github.com/certd/certd/commit/6dabad76baba96be0f8af36a3fbfb9f5182aecf1)) + +### Performance Improvements + +* 默认证书更新时间设置为35天,增加腾讯云删除过期证书插件,可以避免腾讯云过期证书邮件 ([51b6fed](https://github.com/certd/certd/commit/51b6fed468eaa6f28ce4497ce303ace1a52abb96)) +* 授权加密支持解密查看 ([5575c83](https://github.com/certd/certd/commit/5575c839705f6987ad2bdcd33256b0962c6a9c6a)) +* 重置管理员密码同时启用管理员账户,避免之前禁用了,重置密码还是登录不进去 ([f92d918](https://github.com/certd/certd/commit/f92d918a1e28e29b794ad4754661ea760c18af46)) + +## [1.26.14](https://github.com/certd/certd/compare/v1.26.13...v1.26.14) (2024-10-26) + +### Bug Fixes + +* 修复阿里云部署大杀器报插件_还未注册错误的bug ([abd2dcf](https://github.com/certd/certd/commit/abd2dcf2e85a545321bae6451406d081f773b132)) +* 修复启动时自签证书无法保存的bug ([526c484](https://github.com/certd/certd/commit/526c48450bcd37b3ccded9b448f17de8140bdc6e)) + +### Performance Improvements + +* 顶部菜单自定义 ([54d136c](https://github.com/certd/certd/commit/54d136cc6ae122f7c891b7a5c7232fe5de8e5cb5)) +* 禁用readonly用户 ([d10d42e](https://github.com/certd/certd/commit/d10d42e20619bb55a50d636b8867ff33db4e3b4b)) +* 限制其他用户流水线数量 ([315e437](https://github.com/certd/certd/commit/315e43746baf01682737f82e41579237a48409af)) +* 用户管理优化头像上传 ([661293c](https://github.com/certd/certd/commit/661293c189a3abf3cdc953b5225192372f57930d)) + +## [1.26.13](https://github.com/certd/certd/compare/v1.26.12...v1.26.13) (2024-10-26) + +### Bug Fixes + +* 修复对话框全屏按钮与关闭按钮重叠的bug ([95df56c](https://github.com/certd/certd/commit/95df56cc5ca5e3eb843cd17cb7078cde47729f1e)) +* deprecated的运行时不要报错,只报警告 ([bcbefaa](https://github.com/certd/certd/commit/bcbefaaa35cf6d0eec085b3a2c5bfc7c6a8de9e1)) + +### Performance Improvements + +* 更新certd本身的证书文档说明 ([0c50ede](https://github.com/certd/certd/commit/0c50ede129337b82df54575cbd2f4c2a783a0732)) +* 支持同时监听https端口,7002 ([d5a17f9](https://github.com/certd/certd/commit/d5a17f9e6afd63fda2df0981118480f25a1fac2e)) + +## [1.26.12](https://github.com/certd/certd/compare/v1.26.11...v1.26.12) (2024-10-25) + +### Performance Improvements + +* 部署到阿里云任意云资源,阿里云部署大杀器 ([4075be7](https://github.com/certd/certd/commit/4075be7849b140acb92bd8da8a9acbf4eef85180)) +* 文件名特殊字符限制输入 ([c4164c6](https://github.com/certd/certd/commit/c4164c66e29f3ec799f98108a344806ca61e94ff)) +* 新增部署到百度云CDN插件 ([f126f9f](https://github.com/certd/certd/commit/f126f9f932d37fa01fff1accc7bdd17d349f8db5)) +* 新增部署到腾讯云CDN-v2,推荐使用 ([d782655](https://github.com/certd/certd/commit/d782655cb4dfbb74138178afbffeee76fc755115)) +* 优化cron选择器,增加下次触发时间显示 ([5b148b7](https://github.com/certd/certd/commit/5b148b7ed960ca6f7f5b733b2eadd56eeecbd4c2)) +* 支持部署到腾讯云COS ([a8a45d7](https://github.com/certd/certd/commit/a8a45d7f757820990e278533277a3deda5ba48f3)) +* 支持配置公共ZeroSSL授权 ([a90d1e6](https://github.com/certd/certd/commit/a90d1e68ee9cbc3705223457b8a86f071b150968)) + +## [1.26.11](https://github.com/certd/certd/compare/v1.26.10...v1.26.11) (2024-10-23) + +### Bug Fixes + +* 申请证书没有使用到系统设置的http代理的bug ([3db216f](https://github.com/certd/certd/commit/3db216f515ba404cb4330fdab452971b22a50f08)) +* 修复移动任务后出现空阶段的bug ([4ea3edd](https://github.com/certd/certd/commit/4ea3edd59e93ca4f5b2e43b20dd4ef33909caddb)) +* 修复google证书*.xx.com与xx.com同时申请时报错的bug ([f8b99b8](https://github.com/certd/certd/commit/f8b99b81a23e7e9fd5e05ebd5caf355c41d67a90)) +* 允许七牛云cdn插件输入.号开头的通配符域名 ([18ee87d](https://github.com/certd/certd/commit/18ee87daff6eafc2201b58e28d85aafd3cb7a5b9)) + +### Performance Improvements + +* 申请证书启用新的反代地址 ([a705182](https://github.com/certd/certd/commit/a705182b85e51157883e48f23463263793bf3c12)) +* 优化日志颜色 ([1291e98](https://github.com/certd/certd/commit/1291e98e821c5b1810aab7f0aebe3f5f5cd44a20)) +* 优化证书申请速度和成功率,反代地址优化,google基本可以稳定请求。增加请求重试。 ([41d9c3a](https://github.com/certd/certd/commit/41d9c3ac8398def541e65351cbe920d4a927182d)) +* 优化pfx密码密码输入框,让浏览器不自动填写密码 ([ffeede3](https://github.com/certd/certd/commit/ffeede38afa70c5ff6f2015516bead23d2c4df87)) + +## [1.26.10](https://github.com/certd/certd/compare/v1.26.9...v1.26.10) (2024-10-20) + +### Bug Fixes + +* 修复cname服务普通用户access访问权限问题 ([c1e3e2e](https://github.com/certd/certd/commit/c1e3e2ee1f923ee5806479dd5f178c3286a01ae0)) + +## [1.26.9](https://github.com/certd/certd/compare/v1.26.8...v1.26.9) (2024-10-19) + +### Bug Fixes + +* 修复普通用户无法校验cname配置的bug ([6285497](https://github.com/certd/certd/commit/62854978bf0bdbe749b42f8e40ab227ab31ec92f)) +* 修复切换普通用户登录时,左侧菜单没有同步更新的bug ([12116a8](https://github.com/certd/certd/commit/12116a89f43cf8b98f16d2ea6073f6b72a643215)) +* 修正邮箱设置跳转路由 ([17d8890](https://github.com/certd/certd/commit/17d88900a1f0e3af609b74597f5b1978230db32d)) + +### Performance Improvements + +* 触发证书重新申请input变化对比规则优化,减少升级版本后触发申请证书的情况 ([c46a2a9](https://github.com/certd/certd/commit/c46a2a9a399c2a9a8bb59a48b9fb6e93227cce9b)) +* 任务下所有步骤都跳过时,整个任务显示跳过 ([84fd3b2](https://github.com/certd/certd/commit/84fd3b250dd1161ea06c5582fdadece4b29c2e53)) +* 授权配置去除前后空格 ([57d8d48](https://github.com/certd/certd/commit/57d8d48046fbf51c52b041d2dec03d51fb018587)) +* 数据库备份插件,先压缩再备份 ([304ef49](https://github.com/certd/certd/commit/304ef494fd5787c996ad0dcb6edd2f517afce9e2)) +* 优化菜单 ([1f4f157](https://github.com/certd/certd/commit/1f4f15757de1015cf7563f7022599eef58cc93d7)) +* 增加文档站 https://certd.docmirror.cn ([6e2ac1c](https://github.com/certd/certd/commit/6e2ac1c089f6ddccb396f1f2738509c05333e1bb)) + ## [1.26.8](https://github.com/certd/certd/compare/v1.26.7...v1.26.8) (2024-10-15) ### Bug Fixes diff --git a/package.json b/package.json index 48e061ad1..5a65b030f 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "start": "lerna bootstrap --hoist", "i-all": "lerna link && lerna exec npm install ", "publish": "npm run prepublishOnly2 && lerna publish --force-publish=pro/plus-core --conventional-commits --create-release github && npm run afterpublishOnly && npm run commitAll", - "afterpublishOnly": "time /t >build.trigger && git add ./build.trigger && git commit -m \"build: trigger build image\" && TIMEOUT /T 10 && git push", + "afterpublishOnly": "npm run copylogs && time /t >build.trigger && git add ./build.trigger && git commit -m \"build: trigger build image\" && TIMEOUT /T 10 && git push", "transform-sql": "cd ./packages/ui/certd-server/db/ && node --experimental-json-modules transform.js", "commitAll": "git add . && git commit -m \"build: publish\" && git push && npm run commitPro", "commitPro": "cd ./packages/core/ && git add . && git commit -m \"build: publish\" && git push", From 80c500f618b169a1f64c57fe442242a4d0d9d833 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Tue, 5 Nov 2024 11:38:27 +0800 Subject: [PATCH 035/119] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E5=88=B0=E9=98=BF=E9=87=8C=E4=BA=91CDN=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E6=94=AF=E6=8C=81=E5=A4=9A=E5=9F=9F=E5=90=8D?= =?UTF-8?q?=EF=BC=8C=E6=9B=B4=E6=98=93=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/system/basic/service/plus-service.ts | 24 ++- .../plugin/deploy-to-cdn/index.ts | 146 ++++++++++++++---- 2 files changed, 135 insertions(+), 35 deletions(-) diff --git a/packages/libs/lib-server/src/system/basic/service/plus-service.ts b/packages/libs/lib-server/src/system/basic/service/plus-service.ts index d480ef6fc..2c09fc33e 100644 --- a/packages/libs/lib-server/src/system/basic/service/plus-service.ts +++ b/packages/libs/lib-server/src/system/basic/service/plus-service.ts @@ -61,14 +61,36 @@ export class PlusService { const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo); const plusRequestService = await this.getPlusRequestService(); + return await verify({ - subjectId: installInfo.siteId, + subjectId: plusRequestService.subjectId, license: licenseInfo.license, plusRequestService: plusRequestService, bindUrl: installInfo?.bindUrl, }); } + async register() { + const plusRequestService = await this.getPlusRequestService(); + const licenseInfo: SysLicenseInfo = await this.sysSettingsService.getSetting(SysLicenseInfo); + const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo); + if (!licenseInfo?.license) { + //还没有license,注册一个 + const res = await plusRequestService.requestWithoutSign({ + url: '/activation/subject/register', + data: { + appKey: AppKey, + subjectId: installInfo.siteId, + installTime: installInfo.installTime, + }, + }); + if (res.license) { + await this.updateLicense(res.license); + logger.info('站点注册成功'); + } + } + } + async bindUrl(subjectId: string, url: string) { const plusRequestService = await this.getPlusRequestService(); return await plusRequestService.request({ diff --git a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-cdn/index.ts b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-cdn/index.ts index d1821c531..8ea4f304d 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-cdn/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-cdn/index.ts @@ -1,6 +1,7 @@ import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline'; -import dayjs from 'dayjs'; -import { AliyunAccess, AliyunClient } from "@certd/plugin-plus"; +import { AliyunAccess, AliyunClient, AliyunSslClient, createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from '@certd/plugin-plus'; +import { optionsUtils } from '@certd/basic/dist/utils/util.options.js'; + @IsTaskPlugin({ name: 'DeployCertToAliyunCDN', title: '部署证书至阿里云CDN', @@ -15,29 +16,35 @@ import { AliyunAccess, AliyunClient } from "@certd/plugin-plus"; }) export class DeployCertToAliyunCDN extends AbstractTaskPlugin { @TaskInput({ - title: 'CDN加速域名', - helper: '你在阿里云上配置的CDN加速域名,比如:certd.docmirror.cn', + title: '证书服务接入点', + helper: '不会选就按默认', + value: 'cas.aliyuncs.com', + component: { + name: 'a-select', + options: [ + { value: 'cas.aliyuncs.com', label: '中国大陆' }, + { value: 'cas.ap-southeast-1.aliyuncs.com', label: '新加坡' }, + { value: 'cas.eu-central-1.aliyuncs.com', label: '德国(法兰克福)' }, + ], + }, required: true, }) - domainName!: string; - - @TaskInput({ - title: '证书名称', - helper: '上传后将以此名称作为前缀备注', - }) - certName!: string; + endpoint!: string; @TaskInput({ title: '域名证书', helper: '请选择前置任务输出的域名证书', component: { name: 'output-selector', - from: ['CertApply', 'CertApplyLego'], + from: ['CertApply', 'CertApplyLego', 'uploadCertToAliyun'], }, required: true, }) cert!: string; + @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } })) + certDomains!: string[]; + @TaskInput({ title: 'Access授权', helper: '阿里云授权AccessKeyId、AccessKeySecret', @@ -49,47 +56,84 @@ export class DeployCertToAliyunCDN extends AbstractTaskPlugin { }) accessId!: string; + @TaskInput( + createRemoteSelectInputDefine({ + title: 'CDN加速域名', + helper: '你在阿里云上配置的CDN加速域名,比如:certd.docmirror.cn', + typeName: 'DeployCertToAliyunCDN', + action: DeployCertToAliyunCDN.prototype.onGetDomainList.name, + watches: ['certDomains', 'accessId'], + required: true, + }) + ) + domainName!: string | string[]; + + @TaskInput({ + title: '证书名称', + helper: '上传后将以此名称作为前缀备注', + }) + certName!: string; + async onInstance() {} async execute(): Promise { this.logger.info('开始部署证书到阿里云cdn'); - const access = (await this.accessService.getById(this.accessId)) as AliyunAccess; + const access = await this.accessService.getById(this.accessId); + const sslClient = new AliyunSslClient({ + access, + logger: this.logger, + endpoint: this.endpoint || 'cas.aliyuncs.com', + }); + + let certId: any = this.cert; + if (typeof this.cert === 'object') { + certId = await sslClient.uploadCert({ + name: this.appendTimeSuffix('certd'), + cert: this.cert, + }); + } + const client = await this.getClient(access); - const params = await this.buildParams(); - await this.doRequest(client, params); + + if (typeof this.domainName === 'string') { + this.domainName = [this.domainName]; + } + for (const domain of this.domainName) { + await this.SetCdnDomainSSLCertificate(client, { + CertId: certId, + DomainName: domain, + }); + } + this.logger.info('部署完成'); } async getClient(access: AliyunAccess) { - const client = new AliyunClient({logger:this.logger}) + const client = new AliyunClient({ logger: this.logger }); await client.init({ accessKeyId: access.accessKeyId, accessKeySecret: access.accessKeySecret, endpoint: 'https://cdn.aliyuncs.com', apiVersion: '2018-05-10', - }) - return client + }); + return client; } - async buildParams() { - const CertName = (this.certName ?? 'certd') + '-' + dayjs().format('YYYYMMDDHHmmss'); - const cert: any = this.cert; - return { - DomainName: this.domainName, - SSLProtocol: 'on', - CertName: CertName, - CertType: 'upload', - SSLPub: cert.crt, - SSLPri: cert.key, - }; - } - - async doRequest(client: any, params: any) { + async SetCdnDomainSSLCertificate(client: any, params: { CertId: number; DomainName: string }) { const requestOption = { method: 'POST', + formatParams: false, }; - const ret: any = await client.request('SetCdnDomainSSLCertificate', params, requestOption); + + const ret: any = await client.request( + 'SetCdnDomainSSLCertificate', + { + SSLProtocol: 'on', + ...params, + }, + requestOption + ); this.checkRet(ret); - this.logger.info('设置cdn证书成功:', ret.RequestId); + this.logger.info(`设置CDN: ${params.DomainName} 证书成功:`, ret.RequestId); } checkRet(ret: any) { @@ -97,5 +141,39 @@ export class DeployCertToAliyunCDN extends AbstractTaskPlugin { throw new Error('执行失败:' + ret.Message); } } + + async onGetDomainList(data: any) { + if (!this.accessId) { + throw new Error('请选择Access授权'); + } + const access = await this.accessService.getById(this.accessId); + + const client = await this.getClient(access); + + const params = { + // 'DomainName': 'aaa', + PageSize: 500, + }; + + const requestOption = { + method: 'POST', + formatParams: false, + }; + + const res = await client.request('DescribeUserDomains', params, requestOption); + this.checkRet(res); + const pageData = res?.Domains?.PageData; + if (!pageData || pageData.length === 0) { + throw new Error('找不到CDN域名,您可以手动输入'); + } + const options = pageData.map((item: any) => { + return { + value: item.DomainName, + label: item.DomainName, + domain: item.DomainName, + }; + }); + return optionsUtils.buildGroupOptions(options, this.certDomains); + } } new DeployCertToAliyunCDN(); From 80f8fd49f1b984186724a37460264f2601a898b4 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Wed, 6 Nov 2024 01:17:36 +0800 Subject: [PATCH 036/119] =?UTF-8?q?chore:=20=E6=95=B4=E7=90=86=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/acme-client/package.json | 2 +- packages/core/basic/package.json | 30 +- packages/core/basic/src/utils/util.request.ts | 2 +- packages/core/basic/tsconfig.json | 3 +- packages/core/pipeline/package.json | 28 +- packages/core/pipeline/src/core/executor.ts | 5 +- .../core/pipeline/src/core/run-history.ts | 5 +- packages/core/pipeline/src/plugin/api.ts | 3 +- packages/core/pipeline/tsconfig.json | 1 - packages/libs/lib-huawei/package.json | 4 + packages/libs/lib-huawei/tsconfig.json | 1 - packages/libs/lib-iframe/package.json | 14 +- packages/libs/lib-jdcloud/.gitignore | 28 - packages/libs/lib-jdcloud/.npmignore | 3 - packages/libs/lib-jdcloud/.prettierrc | 3 - packages/libs/lib-jdcloud/CHANGELOG.md | 143 - packages/libs/lib-jdcloud/LICENSE | 661 ---- packages/libs/lib-jdcloud/README.md | 16 - .../libs/lib-jdcloud/fix-esm-import-paths.js | 96 - packages/libs/lib-jdcloud/package.json | 31 - packages/libs/lib-jdcloud/rollup.config.js | 40 - packages/libs/lib-jdcloud/src/global.js | 2 - packages/libs/lib-jdcloud/src/index.js | 1 - packages/libs/lib-jdcloud/src/jdcloud.js | 1 - packages/libs/lib-jdcloud/src/lib/browser.js | 4 - .../lib-jdcloud/src/lib/browser_loader.js | 13 - packages/libs/lib-jdcloud/src/lib/common.js | 6 - packages/libs/lib-jdcloud/src/lib/config.js | 78 - packages/libs/lib-jdcloud/src/lib/core.js | 12 - .../libs/lib-jdcloud/src/lib/credentials.js | 21 - packages/libs/lib-jdcloud/src/lib/jc.js | 3 - .../libs/lib-jdcloud/src/lib/node_loader.js | 12 - packages/libs/lib-jdcloud/src/lib/request.js | 137 - packages/libs/lib-jdcloud/src/lib/service.js | 231 -- .../src/lib/signers/request_signer.js | 13 - .../libs/lib-jdcloud/src/lib/signers/v2.js | 162 - .../src/lib/signers/v2_credentials.js | 80 - packages/libs/lib-jdcloud/src/lib/util.js | 219 -- .../repo/domainservice/v2/domainservice.js | 3267 ----------------- packages/libs/lib-jdcloud/tsconfig.json | 41 - packages/libs/lib-k8s/package.json | 18 +- packages/libs/lib-server/package.json | 23 +- packages/libs/lib-server/src/configuration.ts | 2 +- .../src/system/basic/service/plus-service.ts | 21 +- packages/libs/midway-flyway-js/package.json | 23 +- .../plugin-cert/fix-esm-import-paths.js | 96 - packages/plugins/plugin-cert/package.json | 23 +- packages/plugins/plugin-cert/rollup.config.js | 43 - .../src/plugin/cert-plugin/acme.ts | 7 +- packages/plugins/plugin-cert/vite.config.ts | 56 - packages/ui/certd-client/package.json | 9 +- .../src/store/modules/settings.ts | 8 +- .../src/views/sys/account/index.vue | 6 +- packages/ui/certd-server/.env.devnew.yaml | 27 + .../lib-jdcloud => ui/certd-server}/.eslintrc | 0 .../{.eslintrc.json => .eslintrc11.json} | 0 .../{.prettierrc => .pre1ttierrc} | 0 .../{.prettierrc.cjs => .pret1tierrc.cjs} | 0 packages/ui/certd-server/package.json | 11 +- .../modules/cname/service/common-provider.ts | 13 +- packages/ui/certd-server/src/plugins/index.ts | 1 - .../src/plugins/plugin-dynadot/access.ts | 28 - .../plugins/plugin-dynadot/dns-provider.ts | 96 - .../src/plugins/plugin-dynadot/index.ts | 3 - .../plugins/plugin-dynadot/plugins/index.ts | 0 .../src/plugins/plugin-jdcloud/access.ts | 39 - .../plugins/plugin-jdcloud/dns-provider.ts | 125 - .../src/plugins/plugin-jdcloud/index.ts | 3 - .../plugins/plugin-jdcloud/plugins/index.ts | 0 packages/ui/certd-server/tsconfig.json | 6 +- 70 files changed, 119 insertions(+), 5990 deletions(-) delete mode 100644 packages/libs/lib-jdcloud/.gitignore delete mode 100644 packages/libs/lib-jdcloud/.npmignore delete mode 100644 packages/libs/lib-jdcloud/.prettierrc delete mode 100644 packages/libs/lib-jdcloud/CHANGELOG.md delete mode 100644 packages/libs/lib-jdcloud/LICENSE delete mode 100644 packages/libs/lib-jdcloud/README.md delete mode 100644 packages/libs/lib-jdcloud/fix-esm-import-paths.js delete mode 100644 packages/libs/lib-jdcloud/package.json delete mode 100644 packages/libs/lib-jdcloud/rollup.config.js delete mode 100644 packages/libs/lib-jdcloud/src/global.js delete mode 100644 packages/libs/lib-jdcloud/src/index.js delete mode 100644 packages/libs/lib-jdcloud/src/jdcloud.js delete mode 100644 packages/libs/lib-jdcloud/src/lib/browser.js delete mode 100644 packages/libs/lib-jdcloud/src/lib/browser_loader.js delete mode 100644 packages/libs/lib-jdcloud/src/lib/common.js delete mode 100644 packages/libs/lib-jdcloud/src/lib/config.js delete mode 100644 packages/libs/lib-jdcloud/src/lib/core.js delete mode 100644 packages/libs/lib-jdcloud/src/lib/credentials.js delete mode 100644 packages/libs/lib-jdcloud/src/lib/jc.js delete mode 100644 packages/libs/lib-jdcloud/src/lib/node_loader.js delete mode 100644 packages/libs/lib-jdcloud/src/lib/request.js delete mode 100644 packages/libs/lib-jdcloud/src/lib/service.js delete mode 100644 packages/libs/lib-jdcloud/src/lib/signers/request_signer.js delete mode 100644 packages/libs/lib-jdcloud/src/lib/signers/v2.js delete mode 100644 packages/libs/lib-jdcloud/src/lib/signers/v2_credentials.js delete mode 100644 packages/libs/lib-jdcloud/src/lib/util.js delete mode 100644 packages/libs/lib-jdcloud/src/repo/domainservice/v2/domainservice.js delete mode 100644 packages/libs/lib-jdcloud/tsconfig.json delete mode 100644 packages/plugins/plugin-cert/fix-esm-import-paths.js delete mode 100644 packages/plugins/plugin-cert/rollup.config.js delete mode 100644 packages/plugins/plugin-cert/vite.config.ts create mode 100644 packages/ui/certd-server/.env.devnew.yaml rename packages/{libs/lib-jdcloud => ui/certd-server}/.eslintrc (100%) rename packages/ui/certd-server/{.eslintrc.json => .eslintrc11.json} (100%) rename packages/ui/certd-server/{.prettierrc => .pre1ttierrc} (100%) rename packages/ui/certd-server/{.prettierrc.cjs => .pret1tierrc.cjs} (100%) delete mode 100644 packages/ui/certd-server/src/plugins/plugin-dynadot/access.ts delete mode 100644 packages/ui/certd-server/src/plugins/plugin-dynadot/dns-provider.ts delete mode 100644 packages/ui/certd-server/src/plugins/plugin-dynadot/index.ts delete mode 100644 packages/ui/certd-server/src/plugins/plugin-dynadot/plugins/index.ts delete mode 100644 packages/ui/certd-server/src/plugins/plugin-jdcloud/access.ts delete mode 100644 packages/ui/certd-server/src/plugins/plugin-jdcloud/dns-provider.ts delete mode 100644 packages/ui/certd-server/src/plugins/plugin-jdcloud/index.ts delete mode 100644 packages/ui/certd-server/src/plugins/plugin-jdcloud/plugins/index.ts diff --git a/packages/core/acme-client/package.json b/packages/core/acme-client/package.json index ff0d66c10..3c733619e 100644 --- a/packages/core/acme-client/package.json +++ b/packages/core/acme-client/package.json @@ -36,7 +36,7 @@ "nock": "^13.5.4", "tsd": "^0.31.1", "typescript": "^5.4.2", - "uuid": "^8.3.2" + "prettier": "^2.8.8" }, "scripts": { "build-docs": "jsdoc2md src/client.js > docs/client.md && jsdoc2md src/crypto/index.js > docs/crypto.md && jsdoc2md src/crypto/forge.js > docs/forge.md", diff --git a/packages/core/basic/package.json b/packages/core/basic/package.json index 1c8ca51c0..958bde40b 100644 --- a/packages/core/basic/package.json +++ b/packages/core/basic/package.json @@ -17,52 +17,32 @@ "dependencies": { "axios": "^1.7.2", "dayjs": "^1.11.7", - "fix-path": "^4.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.5", + "iconv-lite": "^0.6.3", "lodash-es": "^4.17.21", + "log4js": "^6.9.1", "lru-cache": "^10.0.0", "nanoid": "^5.0.7", "node-forge": "^1.3.1", - "nodemailer": "^6.9.3", - "proxy-agent": "^6.4.0", - "qs": "^6.11.2" + "nodemailer": "^6.9.3" + }, "devDependencies": { - "@rollup/plugin-commonjs": "^23.0.4", - "@rollup/plugin-json": "^6.0.0", - "@rollup/plugin-node-resolve": "^15.0.1", - "@rollup/plugin-terser": "^0.4.3", - "@rollup/plugin-typescript": "^11.0.0", "@types/chai": "^4.3.10", "@types/lodash-es": "^4.17.12", "@types/mocha": "^10.0.1", "@types/node-forge": "^1.3.2", - "@types/uuid": "^9.0.2", "@typescript-eslint/eslint-plugin": "^5.59.7", "@typescript-eslint/parser": "^5.59.7", "chai": "4.3.10", - "dayjs": "^1.11.7", "eslint": "^8.41.0", "eslint-config-prettier": "^8.8.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^4.2.1", - "iconv-lite": "^0.6.3", - "log4js": "^6.9.1", - "mocha": "^10.2.0", "prettier": "^2.8.8", - "reflect-metadata": "^0.1.13", "rimraf": "^5.0.5", - "rollup": "^3.7.4", - "rollup-plugin-typescript2": "^0.34.1", - "rollup-plugin-visualizer": "^5.8.2", - "ts-node": "^10.9.1", - "tsc-esm-fix": "^3.0.0", - "tslib": "^2.5.2", "typescript": "^5.4.2", - "vite": "^4.3.8", - "vue-tsc": "^1.6.5" + "tslib": "^2.8.1" }, "gitHead": "1d8515bce0b3ce5ece84db53ca57cfbd0c3f4d5a" } diff --git a/packages/core/basic/src/utils/util.request.ts b/packages/core/basic/src/utils/util.request.ts index df2e0d707..e66f0ac16 100644 --- a/packages/core/basic/src/utils/util.request.ts +++ b/packages/core/basic/src/utils/util.request.ts @@ -25,7 +25,7 @@ export class HttpError extends Error { if (message && typeof message === 'string') { if (message.indexOf && message.indexOf('ssl3_get_record:wrong version number') >= 0) { this.message = `${message}(http协议错误,服务端要求http协议,请检查是否使用了https请求)`; - } else if (message.indexOf('getaddrinfo EAI_AGAIN')) { + } else if (message.indexOf('getaddrinfo EAI_AGAIN') >= 0) { this.message = `${message}(无法解析域名,请检查网络连接或dns配置,更换docker-compose.yaml中dns配置)`; } } diff --git a/packages/core/basic/tsconfig.json b/packages/core/basic/tsconfig.json index 42bad159e..b071f23ad 100644 --- a/packages/core/basic/tsconfig.json +++ b/packages/core/basic/tsconfig.json @@ -15,12 +15,12 @@ "pretty": true, "declaration": true, "forceConsistentCasingInFileNames": true, - "typeRoots": [ "./typings", "./node_modules/@types"], "outDir": "dist", "rootDir": "src", "composite": true, "useDefineForClassFields": true, "strict": true, + "typeRoots": [ "./typings", "./node_modules/@types"], // "sourceMap": true, "resolveJsonModule": true, "isolatedModules": false, @@ -28,7 +28,6 @@ }, "include": [ "src/**/*.ts", - "src/**/*.d.ts", "src/**/*.json" ], "exclude": [ diff --git a/packages/core/pipeline/package.json b/packages/core/pipeline/package.json index e95364ca8..dfca1dd63 100644 --- a/packages/core/pipeline/package.json +++ b/packages/core/pipeline/package.json @@ -18,18 +18,9 @@ "dependencies": { "@certd/basic": "^1.27.1", "@certd/plus-core": "^1.27.1", - "axios": "^1.7.2", "dayjs": "^1.11.7", - "fix-path": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", "lodash-es": "^4.17.21", - "lru-cache": "^10.0.0", - "nanoid": "^5.0.7", - "node-forge": "^1.3.1", - "nodemailer": "^6.9.3", - "proxy-agent": "^6.4.0", - "qs": "^6.11.2" + "reflect-metadata": "^0.1.13" }, "devDependencies": { "@rollup/plugin-commonjs": "^23.0.4", @@ -40,32 +31,17 @@ "@types/chai": "^4.3.10", "@types/lodash-es": "^4.17.12", "@types/mocha": "^10.0.1", - "@types/node-forge": "^1.3.2", - "@types/uuid": "^9.0.2", "@typescript-eslint/eslint-plugin": "^5.59.7", "@typescript-eslint/parser": "^5.59.7", "chai": "4.3.10", - "dayjs": "^1.11.7", "eslint": "^8.41.0", "eslint-config-prettier": "^8.8.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^4.2.1", - "iconv-lite": "^0.6.3", - "log4js": "^6.9.1", "mocha": "^10.2.0", "prettier": "^2.8.8", - "reflect-metadata": "^0.1.13", "rimraf": "^5.0.5", - "rollup": "^3.7.4", - "rollup-plugin-typescript2": "^0.34.1", - "rollup-plugin-visualizer": "^5.8.2", - "ts-node": "^10.9.1", - "tsc-esm-fix": "^3.0.0", - "tslib": "^2.5.2", "typescript": "^5.4.2", - "vite": "^4.3.8", - "vue-tsc": "^1.6.5" + "tslib": "^2.8.1" }, "gitHead": "1d8515bce0b3ce5ece84db53ca57cfbd0c3f4d5a" } diff --git a/packages/core/pipeline/src/core/executor.ts b/packages/core/pipeline/src/core/executor.ts index 480cb71b0..7a64ad852 100644 --- a/packages/core/pipeline/src/core/executor.ts +++ b/packages/core/pipeline/src/core/executor.ts @@ -3,8 +3,7 @@ import { RunHistory, RunnableCollection } from "./run-history.js"; import { AbstractTaskPlugin, PluginDefine, pluginRegistry, TaskInstanceContext, UserInfo } from "../plugin/index.js"; import { ContextFactory, IContext } from "./context.js"; import { IStorage } from "./storage.js"; -import { createAxiosService, hashUtils, HttpRequestConfig, logger, utils } from "@certd/basic"; -import { Logger } from "log4js"; +import { createAxiosService, hashUtils, HttpRequestConfig, ILogger, logger, utils } from "@certd/basic"; import { IAccessService } from "../access/index.js"; import { RegistryItem } from "../registry/index.js"; import { Decorator } from "../decorator/index.js"; @@ -28,7 +27,7 @@ export class Executor { pipeline: Pipeline; runtime!: RunHistory; contextFactory: ContextFactory; - logger: Logger; + logger: ILogger; pipelineContext!: IContext; currentStatusMap!: RunnableCollection; lastStatusMap!: RunnableCollection; diff --git a/packages/core/pipeline/src/core/run-history.ts b/packages/core/pipeline/src/core/run-history.ts index 9a12cec0c..e64b559f8 100644 --- a/packages/core/pipeline/src/core/run-history.ts +++ b/packages/core/pipeline/src/core/run-history.ts @@ -1,7 +1,6 @@ import { HistoryResult, Pipeline, ResultType, Runnable, RunnableMap, Stage, Step, Task } from "../dt/index.js"; import _ from "lodash-es"; -import { buildLogger } from "@certd/basic"; -import { Logger } from "log4js"; +import { buildLogger, ILogger } from "@certd/basic"; export type HistoryStatus = { result: HistoryResult; @@ -25,7 +24,7 @@ export class RunHistory { [runnableId: string]: string[]; } = {}; _loggers: { - [runnableId: string]: Logger; + [runnableId: string]: ILogger; } = {}; trigger!: RunTrigger; diff --git a/packages/core/pipeline/src/plugin/api.ts b/packages/core/pipeline/src/plugin/api.ts index ede5004b4..1a2349b7b 100644 --- a/packages/core/pipeline/src/plugin/api.ts +++ b/packages/core/pipeline/src/plugin/api.ts @@ -1,7 +1,6 @@ import { Registrable } from "../registry/index.js"; import { FileItem, FormItemProps, Pipeline, Runnable, Step } from "../dt/index.js"; import { FileStore } from "../core/file-store.js"; -import { Logger } from "log4js"; import { IAccessService } from "../access/index.js"; import { ICnameProxyService, IEmailService } from "../service/index.js"; import { CancelError, IContext, PluginRequestHandleReq, RunnableCollection } from "../core/index.js"; @@ -68,7 +67,7 @@ export type TaskInstanceContext = { //步骤定义 step: Step; //日志 - logger: Logger; + logger: ILogger; //当前步骤输入参数跟上一次执行比较是否有变化 inputChanged: boolean; //授权获取服务 diff --git a/packages/core/pipeline/tsconfig.json b/packages/core/pipeline/tsconfig.json index 42bad159e..f046bda74 100644 --- a/packages/core/pipeline/tsconfig.json +++ b/packages/core/pipeline/tsconfig.json @@ -15,7 +15,6 @@ "pretty": true, "declaration": true, "forceConsistentCasingInFileNames": true, - "typeRoots": [ "./typings", "./node_modules/@types"], "outDir": "dist", "rootDir": "src", "composite": true, diff --git a/packages/libs/lib-huawei/package.json b/packages/libs/lib-huawei/package.json index b362c3292..afe995f64 100644 --- a/packages/libs/lib-huawei/package.json +++ b/packages/libs/lib-huawei/package.json @@ -17,5 +17,9 @@ "rimraf": "^5.0.5", "rollup": "^3.7.4" }, + "devDependencies": { + "tslib": "^2.8.1", + "prettier": "^2.8.8" + }, "gitHead": "1d8515bce0b3ce5ece84db53ca57cfbd0c3f4d5a" } diff --git a/packages/libs/lib-huawei/tsconfig.json b/packages/libs/lib-huawei/tsconfig.json index 112a33778..07f551a98 100644 --- a/packages/libs/lib-huawei/tsconfig.json +++ b/packages/libs/lib-huawei/tsconfig.json @@ -7,7 +7,6 @@ "esModuleInterop": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, - "inlineSourceMap":true, "noImplicitThis": true, "noUnusedLocals": true, "stripInternal": true, diff --git a/packages/libs/lib-iframe/package.json b/packages/libs/lib-iframe/package.json index d43697f25..a9c0b7608 100644 --- a/packages/libs/lib-iframe/package.json +++ b/packages/libs/lib-iframe/package.json @@ -18,26 +18,16 @@ "nanoid": "^4.0.0" }, "devDependencies": { - "@rollup/plugin-commonjs": "^23.0.4", - "@rollup/plugin-json": "^6.0.0", - "@rollup/plugin-node-resolve": "^15.0.1", - "@rollup/plugin-terser": "^0.4.3", - "@rollup/plugin-typescript": "^11.0.0", "@types/chai": "^4.3.3", "@typescript-eslint/eslint-plugin": "^5.38.1", "@typescript-eslint/parser": "^5.38.1", "eslint": "^8.24.0", "eslint-config-prettier": "^8.5.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^4.2.1", "prettier": "^2.8.8", "rimraf": "^5.0.5", - "rollup": "^3.7.4", - "rollup-plugin-visualizer": "^5.8.2", - "ts-node": "^10.9.1", - "tslib": "^2.5.2", - "typescript": "^5.4.2" + "typescript": "^5.4.2", + "tslib": "^2.8.1" }, "gitHead": "1d8515bce0b3ce5ece84db53ca57cfbd0c3f4d5a" } diff --git a/packages/libs/lib-jdcloud/.gitignore b/packages/libs/lib-jdcloud/.gitignore deleted file mode 100644 index b59eedaab..000000000 --- a/packages/libs/lib-jdcloud/.gitignore +++ /dev/null @@ -1,28 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? - -test/user.secret.ts - -.rollup.cache diff --git a/packages/libs/lib-jdcloud/.npmignore b/packages/libs/lib-jdcloud/.npmignore deleted file mode 100644 index ec6e82b7e..000000000 --- a/packages/libs/lib-jdcloud/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -src -.rollup.cache diff --git a/packages/libs/lib-jdcloud/.prettierrc b/packages/libs/lib-jdcloud/.prettierrc deleted file mode 100644 index 1d96ee86b..000000000 --- a/packages/libs/lib-jdcloud/.prettierrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "printWidth": 160 -} \ No newline at end of file diff --git a/packages/libs/lib-jdcloud/CHANGELOG.md b/packages/libs/lib-jdcloud/CHANGELOG.md deleted file mode 100644 index c16b71346..000000000 --- a/packages/libs/lib-jdcloud/CHANGELOG.md +++ /dev/null @@ -1,143 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04) - -**Note:** Version bump only for package @certd/lib-jdcloud - -# [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.16](https://github.com/certd/certd/compare/v1.26.15...v1.26.16) (2024-10-30) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.15](https://github.com/certd/certd/compare/v1.26.14...v1.26.15) (2024-10-28) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.14](https://github.com/certd/certd/compare/v1.26.13...v1.26.14) (2024-10-26) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.13](https://github.com/certd/certd/compare/v1.26.12...v1.26.13) (2024-10-26) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.12](https://github.com/certd/certd/compare/v1.26.11...v1.26.12) (2024-10-25) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.11](https://github.com/certd/certd/compare/v1.26.10...v1.26.11) (2024-10-23) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.10](https://github.com/certd/certd/compare/v1.26.9...v1.26.10) (2024-10-20) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.9](https://github.com/certd/certd/compare/v1.26.8...v1.26.9) (2024-10-19) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.8](https://github.com/certd/certd/compare/v1.26.7...v1.26.8) (2024-10-15) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.7](https://github.com/certd/certd/compare/v1.26.6...v1.26.7) (2024-10-14) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.6](https://github.com/certd/certd/compare/v1.26.5...v1.26.6) (2024-10-14) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.5](https://github.com/certd/certd/compare/v1.26.4...v1.26.5) (2024-10-14) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.4](https://github.com/certd/certd/compare/v1.26.3...v1.26.4) (2024-10-14) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10) - -**Note:** Version bump only for package @certd/lib-jdcloud - -# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24) - -**Note:** Version bump only for package @certd/lib-jdcloud - -# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24) - -**Note:** Version bump only for package @certd/lib-jdcloud - -## [1.24.3](https://github.com/certd/certd/compare/v1.24.2...v1.24.3) (2024-09-06) - -**Note:** Version bump only for package @certd/lib-huawei - -## [1.24.2](https://github.com/certd/certd/compare/v1.24.1...v1.24.2) (2024-09-06) - -**Note:** Version bump only for package @certd/lib-huawei - -## [1.24.1](https://github.com/certd/certd/compare/v1.24.0...v1.24.1) (2024-09-02) - -**Note:** Version bump only for package @certd/lib-huawei - -## [1.22.1](https://github.com/certd/certd/compare/v1.22.0...v1.22.1) (2024-07-20) - -**Note:** Version bump only for package @certd/lib-huawei - -# [1.22.0](https://github.com/certd/certd/compare/v1.21.2...v1.22.0) (2024-07-19) - -### Features - -* 升级midway,支持esm ([485e603](https://github.com/certd/certd/commit/485e603b5165c28bc08694997726eaf2a585ebe7)) -* 支持postgresql ([3b19bfb](https://github.com/certd/certd/commit/3b19bfb4291e89064b3b407a80dae092d54747d5)) diff --git a/packages/libs/lib-jdcloud/LICENSE b/packages/libs/lib-jdcloud/LICENSE deleted file mode 100644 index 0ad25db4b..000000000 --- a/packages/libs/lib-jdcloud/LICENSE +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. diff --git a/packages/libs/lib-jdcloud/README.md b/packages/libs/lib-jdcloud/README.md deleted file mode 100644 index 30b15e215..000000000 --- a/packages/libs/lib-jdcloud/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Vue 3 + TypeScript + Vite - -This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` diff --git a/packages/ui/certd-client/src/views/certd/pipeline/index.vue b/packages/ui/certd-client/src/views/certd/pipeline/index.vue index 341ddf6a1..df0da548b 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/index.vue +++ b/packages/ui/certd-client/src/views/certd/pipeline/index.vue @@ -14,13 +14,13 @@