From 0d8913ea2f56fdebbcc9bb207eae59e8ddbb8cad Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Fri, 29 Nov 2024 11:57:41 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E6=94=AF=E6=8C=81=E5=A8=81=E8=81=94?= =?UTF-8?q?=E9=80=9A=E8=AF=81=E4=B9=A6=E9=83=A8=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/plugins/plugin-qnap/index.ts | 1 + .../src/plugins/plugin-qnap/plugins/index.ts | 1 + .../plugin-qnap/plugins/plugin-qnap.ts | 85 +++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 packages/ui/certd-server/src/plugins/plugin-qnap/index.ts create mode 100644 packages/ui/certd-server/src/plugins/plugin-qnap/plugins/index.ts create mode 100644 packages/ui/certd-server/src/plugins/plugin-qnap/plugins/plugin-qnap.ts diff --git a/packages/ui/certd-server/src/plugins/plugin-qnap/index.ts b/packages/ui/certd-server/src/plugins/plugin-qnap/index.ts new file mode 100644 index 00000000..4ab82c2d --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-qnap/index.ts @@ -0,0 +1 @@ +export * from './plugins/index.js'; diff --git a/packages/ui/certd-server/src/plugins/plugin-qnap/plugins/index.ts b/packages/ui/certd-server/src/plugins/plugin-qnap/plugins/index.ts new file mode 100644 index 00000000..e8176e73 --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-qnap/plugins/index.ts @@ -0,0 +1 @@ +export * from './plugin-qnap.js'; diff --git a/packages/ui/certd-server/src/plugins/plugin-qnap/plugins/plugin-qnap.ts b/packages/ui/certd-server/src/plugins/plugin-qnap/plugins/plugin-qnap.ts new file mode 100644 index 00000000..a4a2cea6 --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-qnap/plugins/plugin-qnap.ts @@ -0,0 +1,85 @@ +import { IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline'; +import { CertInfo } from '@certd/plugin-cert'; +import { AbstractPlusTaskPlugin } from '@certd/plugin-plus'; +import { SshAccess, SshClient } from '../../plugin-host/index.js'; +import { tmpdir } from 'node:os'; +import fs from 'fs'; + +@IsTaskPlugin({ + name: 'QnapDeploy', + title: '部署证书到威联通', + icon: 'simple-icons:qnap', + group: pluginGroups.panel.key, + desc: '部署证书到qnap', + default: { + strategy: { + runStrategy: RunStrategy.SkipWhenSucceed, + }, + }, + needPlus: true, +}) +export class QnapDeploy extends AbstractPlusTaskPlugin { + //证书选择,此项必须要有 + @TaskInput({ + title: '域名证书', + helper: '请选择前置任务输出的域名证书', + component: { + name: 'output-selector', + from: ['CertApply', 'CertApplyLego'], + }, + required: true, + }) + cert!: CertInfo; + + //授权选择框 + @TaskInput({ + title: 'ssh登录授权', + helper: 'ssh登录授权', + component: { + name: 'access-selector', + type: 'ssh', + }, + required: true, + }) + accessId!: string; + + async onInstance() {} + async execute(): Promise { + const { cert, accessId } = this; + + if (!accessId) { + throw new Error('主机登录授权配置不能为空'); + } + + const connectConf = await this.ctx.accessService.getById(accessId); + const sshClient = new SshClient(this.logger); + //合并证书 + const newCert = cert.key + '\n' + cert.crt; + const tmpCertPath = tmpdir() + '/certd/cert.pem'; + fs.writeFileSync(tmpCertPath, newCert); + const targetPath = '/etc/stunnel/stunnel.pem'; + this.logger.info(`准备上传证书到服务器:${targetPath}`); + + const transports: any = []; + transports.push({ + localPath: tmpCertPath, + remotePath: targetPath, + }); + this.logger.info('开始上传文件到服务器'); + await sshClient.uploadFiles({ + connectConf, + transports, + mkdirs: true, + }); + this.logger.info('上传文件到服务器成功'); + //重启服务 + const restartCmd = '/bin/bash /etc/init.d/stunnel.sh restart'; + this.logger.info('重启stunnel服务'); + await sshClient.exec({ + connectConf, + script: [restartCmd], + }); + this.logger.info('执行成功'); + } +} +new QnapDeploy();