From c46a2a9a399c2a9a8bb59a48b9fb6e93227cce9b Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Wed, 16 Oct 2024 12:20:42 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E8=A7=A6=E5=8F=91=E8=AF=81=E4=B9=A6?= =?UTF-8?q?=E9=87=8D=E6=96=B0=E7=94=B3=E8=AF=B7input=E5=8F=98=E5=8C=96?= =?UTF-8?q?=E5=AF=B9=E6=AF=94=E8=A7=84=E5=88=99=E4=BC=98=E5=8C=96=EF=BC=8C?= =?UTF-8?q?=E5=87=8F=E5=B0=91=E5=8D=87=E7=BA=A7=E7=89=88=E6=9C=AC=E5=90=8E?= =?UTF-8?q?=E8=A7=A6=E5=8F=91=E7=94=B3=E8=AF=B7=E8=AF=81=E4=B9=A6=E7=9A=84?= =?UTF-8?q?=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/pipeline/src/core/run-history.ts | 3 ++ packages/core/pipeline/src/dt/pipeline.ts | 1 - .../src/plugin/cert-plugin/base.ts | 32 +++++++++++++++++-- .../src/views/certd/cname/record/crud.tsx | 7 ++-- .../src/views/certd/pipeline/cert-view.vue | 2 +- .../src/views/certd/pipeline/crud.tsx | 2 +- .../views/certd/pipeline/pipeline/index.vue | 2 +- packages/ui/certd-server/package.json | 1 + .../src/plugins/plugin-host/lib/ssh.ts | 4 +-- .../plugin-other/plugins/plugin-db-backup.ts | 21 +++++++++--- 10 files changed, 57 insertions(+), 18 deletions(-) diff --git a/packages/core/pipeline/src/core/run-history.ts b/packages/core/pipeline/src/core/run-history.ts index b4a69e7a..84bf9759 100644 --- a/packages/core/pipeline/src/core/run-history.ts +++ b/packages/core/pipeline/src/core/run-history.ts @@ -181,6 +181,9 @@ export class RunnableCollection { if (runnable?.status) { runnable.status.status = ResultType.none; runnable.status.result = ResultType.none; + runnable.status.inputHash = ""; + // @ts-ignore + runnable.input = {}; } } diff --git a/packages/core/pipeline/src/dt/pipeline.ts b/packages/core/pipeline/src/dt/pipeline.ts index f436d30a..691c14b6 100644 --- a/packages/core/pipeline/src/dt/pipeline.ts +++ b/packages/core/pipeline/src/dt/pipeline.ts @@ -121,7 +121,6 @@ export type HistoryResultGroup = { }; }; export type HistoryResult = { - // input: any; inputHash?: string; output: any; files?: FileItem[]; 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 bfbcf3cf..80cfe15c 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts @@ -5,6 +5,7 @@ import { CertReader } from "./cert-reader.js"; import JSZip from "jszip"; import { CertConverter } from "./convert.js"; import fs from "fs"; +import { pick } from "lodash-es"; export { CertReader }; export type { CertInfo }; @@ -203,10 +204,35 @@ export abstract class CertApplyBasePlugin extends AbstractTaskPlugin { return null; } - const inputChanged = this.ctx.inputChanged; + let inputChanged = this.ctx.inputChanged; if (inputChanged) { - this.logger.info("输入参数变更,准备申请新证书"); - return null; + this.logger.info("input hash 有变更,检查是否需要重新申请证书"); + //判断域名有没有变更 + /** + * "renewDays": 20, + * "certApplyPlugin": "CertApply", + * "sslProvider": "letsencrypt", + * "privateKeyType": "rsa_2048_pkcs1", + * "dnsProviderType": "aliyun", + * "domains": [ + * "*.handsfree.work" + * ], + * "email": "xiaojunnuo@qq.com", + * "dnsProviderAccess": 3, + * "useProxy": false, + * "skipLocalVerify": false, + * "successNotify": true, + * "pfxPassword": "123456" + */ + const checkInputChanges = ["domains", "sslProvider", "privateKeyType", "dnsProviderType", "dnsProviderAccess", "pfxPassword"]; + const oldInput = JSON.stringify(pick(this.lastStatus?.input, checkInputChanges)); + const thisInput = JSON.stringify(pick(this, checkInputChanges)); + inputChanged = oldInput !== thisInput; + + if (inputChanged) { + this.logger.info("输入参数变更,准备申请新证书"); + return null; + } } let oldCert: CertReader | undefined = undefined; 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 0052d7a2..f2f78c63 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,6 @@ 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 { DoVerify } from "./api"; export default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet { const router = useRouter(); @@ -125,9 +124,9 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat }), form: { component: { - onDictChange: ({ form, dict }) => { + onDictChange: ({ form, dict }: any) => { if (!form.cnameProviderId) { - const item = dict.data.find((item) => item.isDefault); + const item = dict.data.find((item: any) => item.isDefault); if (item) { form.cnameProviderId = item.id; } @@ -180,7 +179,7 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat message.success("验证成功"); row.status = "valid"; } - } catch (e) { + } catch (e: any) { console.error(e); message.error(e.message); } finally { diff --git a/packages/ui/certd-client/src/views/certd/pipeline/cert-view.vue b/packages/ui/certd-client/src/views/certd/pipeline/cert-view.vue index 518ffa16..96b3981b 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/cert-view.vue +++ b/packages/ui/certd-client/src/views/certd/pipeline/cert-view.vue @@ -8,7 +8,7 @@
{{ item.name }}({{ item.fileName }})
- 复制 + 复制
diff --git a/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx b/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx index 5578b23a..7b006f4c 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx @@ -155,7 +155,7 @@ export default function ({ crudExpose, context: { certdFormRef } }: CreateCrudOp const viewCert = async (row: any) => { const cert = await api.GetCert(row.id); if (!cert) { - notification.error({ message: "还没有产生证书,请先运行流水线" }); + notification.error({ message: "请先运行一次流水线" }); return; } diff --git a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/index.vue b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/index.vue index 585e769b..3f5ec18c 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/index.vue +++ b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/index.vue @@ -101,7 +101,7 @@ diff --git a/packages/ui/certd-server/package.json b/packages/ui/certd-server/package.json index 2a981bc1..447d29aa 100644 --- a/packages/ui/certd-server/package.json +++ b/packages/ui/certd-server/package.json @@ -64,6 +64,7 @@ "iconv-lite": "^0.6.3", "js-yaml": "^4.1.0", "jsonwebtoken": "^9.0.0", + "jszip": "^3.10.1", "koa-send": "^5.0.1", "kubernetes-client": "^9.0.0", "lodash-es": "^4.17.21", 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 f8230f82..484d5b9b 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 @@ -102,7 +102,7 @@ export class AsyncSsh2Client { let iconv: any = await import('iconv-lite'); iconv = iconv.default; return new Promise((resolve, reject) => { - this.logger.info(`执行命令:[${this.connConf.host}][exec]: ` + script); + this.logger.info(`执行命令:[${this.connConf.host}][exec]: \n` + script); this.conn.exec(script, (err: Error, stream: any) => { if (err) { reject(err); @@ -274,7 +274,7 @@ export class SshClient { let { script } = options; const { connectConf } = options; - this.logger.info('命令:', script); + // this.logger.info('命令:', script); return await this._call({ connectConf, callable: async (conn: AsyncSsh2Client) => { diff --git a/packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-db-backup.ts b/packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-db-backup.ts index d6ac9ae1..b7fc72cf 100644 --- a/packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-db-backup.ts +++ b/packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-db-backup.ts @@ -4,6 +4,8 @@ import path from 'path'; import dayjs from 'dayjs'; import { SshAccess, SshClient } from '../../plugin-host/index.js'; import { AbstractPlusTaskPlugin } from '@certd/plugin-plus'; +import JSZip from 'jszip'; +import * as os from 'node:os'; const defaultBackupDir = 'certd_backup'; const defaultFilePrefix = 'db-backup'; @@ -100,16 +102,25 @@ export class DBBackupPlugin extends AbstractPlusTaskPlugin { return; } - this.logger.info('当前备份方式:', this.backupMode); + //本地压缩 + const zip = new JSZip(); + zip.file(dbPath); + const content = await zip.generateAsync({ type: 'nodebuffer' }); + const dbZipFilename = `${this.filePrefix}.${dayjs().format('YYYYMMDD.HHmmss')}.sqlite.zip`; + const dbZipPath = path.resolve(os.tmpdir(), dbZipFilename); + await fs.promises.writeFile(dbZipPath, content); + this.logger.info(`数据库文件压缩完成:${dbZipPath}`); + + this.logger.info('开始备份,当前备份方式:', this.backupMode); const backupDir = this.backupDir || defaultBackupDir; - const backupFile = `${backupDir}/${this.filePrefix}.${dayjs().format('YYYYMMDD.HHmmss')}.sqlite`; + const backupFilePath = `${backupDir}/${dbZipFilename}`; if (this.backupMode === 'local') { - await this.localBackup(dbPath, backupDir, backupFile); + await this.localBackup(dbPath, backupDir, backupFilePath); } else if (this.backupMode === 'ssh') { - await this.sshBackup(dbPath, backupDir, backupFile); + await this.sshBackup(dbPath, backupDir, backupFilePath); } else if (this.backupMode === 'oss') { - await this.ossBackup(dbPath, backupDir, backupFile); + await this.ossBackup(dbPath, backupDir, backupFilePath); } else { throw new Error(`不支持的备份方式:${this.backupMode}`); }