From 42c7ec2f75947e2b8298d6605d4dbcd441aacd51 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sun, 15 Feb 2026 18:43:53 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E7=BE=A4=E6=99=96=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=88=B7=E6=96=B0=E7=99=BB=E5=BD=95=E6=9C=89=E6=95=88=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/plugin-plus/synology/access.ts | 17 ++++ .../plugin-plus/synology/plugins/index.ts | 1 + .../plugins/plugin-deploy-to-panel.ts | 2 +- .../synology/plugins/plugin-keep-alive.ts | 81 +++++++++++++++++++ 4 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 packages/ui/certd-server/src/plugins/plugin-plus/synology/plugins/plugin-keep-alive.ts diff --git a/packages/ui/certd-server/src/plugins/plugin-plus/synology/access.ts b/packages/ui/certd-server/src/plugins/plugin-plus/synology/access.ts index 7992ff91a..0f4398086 100644 --- a/packages/ui/certd-server/src/plugins/plugin-plus/synology/access.ts +++ b/packages/ui/certd-server/src/plugins/plugin-plus/synology/access.ts @@ -124,6 +124,23 @@ export class SynologyAccess extends BaseAccess { }) timeout = 120; + @AccessInput({ + title: "测试", + component: { + name: "api-test", + action: "onTestRequest", + }, + helper: "点击测试接口看是否正常", + }) + testRequest = true; + + async onTestRequest() { + const client = new SynologyClient(this as any, this.ctx.http, this.ctx.logger, this.skipSslVerify); + await client.doLogin(); + await client.getCertList(); + return "ok"; + } + onLoginWithOPTCode(data: { otpCode: string }) { const ctx = this.ctx; const client = new SynologyClient(this as any, ctx.http, ctx.logger, this.skipSslVerify); diff --git a/packages/ui/certd-server/src/plugins/plugin-plus/synology/plugins/index.ts b/packages/ui/certd-server/src/plugins/plugin-plus/synology/plugins/index.ts index 860db409f..a115f1df0 100644 --- a/packages/ui/certd-server/src/plugins/plugin-plus/synology/plugins/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-plus/synology/plugins/index.ts @@ -1 +1,2 @@ export * from "./plugin-deploy-to-panel.js"; +export * from "./plugin-keep-alive.js"; diff --git a/packages/ui/certd-server/src/plugins/plugin-plus/synology/plugins/plugin-deploy-to-panel.ts b/packages/ui/certd-server/src/plugins/plugin-plus/synology/plugins/plugin-deploy-to-panel.ts index 6921aa2ef..3df14e4c0 100644 --- a/packages/ui/certd-server/src/plugins/plugin-plus/synology/plugins/plugin-deploy-to-panel.ts +++ b/packages/ui/certd-server/src/plugins/plugin-plus/synology/plugins/plugin-deploy-to-panel.ts @@ -46,7 +46,7 @@ export class SynologyDeployToPanel extends AbstractPlusTaskPlugin { //授权选择框 @TaskInput({ title: "群晖授权", - helper: "群晖登录授权,请确保账户是管理员用户组", + helper: "群晖登录授权,请确保账户是管理员用户组\n群晖OTP授权有效期只有30天,您还需要添加“群晖-刷新OTP登录有效期”任务做登录有效期保活", component: { name: "access-selector", type: "synology", diff --git a/packages/ui/certd-server/src/plugins/plugin-plus/synology/plugins/plugin-keep-alive.ts b/packages/ui/certd-server/src/plugins/plugin-plus/synology/plugins/plugin-keep-alive.ts new file mode 100644 index 000000000..edb81b549 --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-plus/synology/plugins/plugin-keep-alive.ts @@ -0,0 +1,81 @@ +import { IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, TaskOutput } from "@certd/pipeline"; +import { AbstractPlusTaskPlugin } from "@certd/plugin-plus"; +import dayjs from "dayjs"; +@IsTaskPlugin({ + name: "SynologyKeepAlive", + title: "群晖-刷新OTP登录有效期", + icon: "simple-icons:synology", + group: pluginGroups.panel.key, + desc: "群晖登录状态可能30天失效,需要在失效之前登录一次,刷新有效期,您可以将其放在“部署到群晖面板”任务之后", + showRunStrategy: false, + default: { + strategy: { + runStrategy: RunStrategy.AlwaysRun, + }, + }, + needPlus: true, +}) +export class SynologyKeepAlivePlugin extends AbstractPlusTaskPlugin { + + + @TaskInput({ + title: "群晖授权", + helper: "群晖登录授权,请确保账户是管理员用户组", + component: { + name: "access-selector", + type: "synology", + }, + required: true, + }) + accessId!: string; + + + //授权选择框 + @TaskInput({ + title: "间隔天数", + helper: "多少天刷新一次,建议15天以内", + component: { + name: "number-input", + type: "number", + min: 1, + max: 30, + }, + required: true, + }) + intervalDays!: number; + + @TaskOutput({ + title: "上次刷新时间", + type :"SynologyLastRefreshTime" + }) + lastRefreshTime!: number; + + async onInstance() {} + async execute(): Promise { + this.logger.info("开始刷新群晖登录有效期"); + const now = dayjs() + const status = this.getLastStatus(); + if (status) { + let lastRefreshTime = this.getLastOutput("lastRefreshTime"); + lastRefreshTime = lastRefreshTime || 0; + this.lastRefreshTime = lastRefreshTime; + const lastTime = dayjs(lastRefreshTime); + const diffDays = now.diff(lastTime, "day"); + if (diffDays < this.intervalDays) { + this.logger.info(`距离上次刷新有效期${diffDays.toFixed(0)}天(${this.intervalDays}天),无需刷新`); + this.logger.info(`下一次刷新时间${lastTime.add(this.intervalDays, "day").format("YYYY-MM-DD")}`); + return; + } + } + + // const access: SynologyAccess = await this.getAccess(this.accessId); + // const client = new SynologyClient(access as any, this.ctx.http, this.ctx.logger, access.skipSslVerify); + // await client.doLogin(); + // await client.getCertList(); + this.lastRefreshTime = now.unix(); + this.logger.info("刷新群晖登录有效期成功"); + } + + +} +new SynologyKeepAlivePlugin();