mirror of https://github.com/certd/certd
parent
a954ab7ede
commit
81fac736f9
|
@ -1,5 +1,5 @@
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
import ssh2, { ConnectConfig } from 'ssh2';
|
import ssh2, { ConnectConfig, ExecOptions } from 'ssh2';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import * as _ from 'lodash-es';
|
import * as _ from 'lodash-es';
|
||||||
import { ILogger } from '@certd/pipeline';
|
import { ILogger } from '@certd/pipeline';
|
||||||
|
@ -269,7 +269,7 @@ export class SshClient {
|
||||||
* Set-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\cmd.exe"
|
* Set-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\cmd.exe"
|
||||||
* @param options
|
* @param options
|
||||||
*/
|
*/
|
||||||
async exec(options: { connectConf: SshAccess; script: string | Array<string> }) {
|
async exec(options: { connectConf: SshAccess; script: string | Array<string>; env?: any }): Promise<string[]> {
|
||||||
let { script } = options;
|
let { script } = options;
|
||||||
const { connectConf } = options;
|
const { connectConf } = options;
|
||||||
|
|
||||||
|
@ -278,14 +278,32 @@ export class SshClient {
|
||||||
connectConf,
|
connectConf,
|
||||||
callable: async (conn: AsyncSsh2Client) => {
|
callable: async (conn: AsyncSsh2Client) => {
|
||||||
let isWinCmd = false;
|
let isWinCmd = false;
|
||||||
|
const isLinux = !connectConf.windows;
|
||||||
|
const envScripts = [];
|
||||||
if (connectConf.windows) {
|
if (connectConf.windows) {
|
||||||
isWinCmd = await this.isCmd(conn);
|
isWinCmd = await this.isCmd(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (options.env) {
|
||||||
|
for (const key in options.env) {
|
||||||
|
if (isLinux) {
|
||||||
|
envScripts.push(`export ${key}=${options.env[key]}`);
|
||||||
|
} else if (isWinCmd) {
|
||||||
|
//win cmd
|
||||||
|
envScripts.push(`set ${key}=${options.env[key]}`);
|
||||||
|
} else {
|
||||||
|
//powershell
|
||||||
|
envScripts.push(`$env:${key}="${options.env[key]}"`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (isWinCmd) {
|
if (isWinCmd) {
|
||||||
//组合成&&的形式
|
//组合成&&的形式
|
||||||
if (typeof script === 'string') {
|
if (typeof script === 'string') {
|
||||||
script = script.split('\n');
|
script = script.split('\n');
|
||||||
}
|
}
|
||||||
|
script = envScripts.concat(script);
|
||||||
script = script as Array<string>;
|
script = script as Array<string>;
|
||||||
script = script.join(' && ');
|
script = script.join(' && ');
|
||||||
} else {
|
} else {
|
||||||
|
@ -293,6 +311,9 @@ export class SshClient {
|
||||||
script = script as Array<string>;
|
script = script as Array<string>;
|
||||||
script = script.join('\n');
|
script = script.join('\n');
|
||||||
}
|
}
|
||||||
|
if (envScripts.length > 0) {
|
||||||
|
script = envScripts.join('\n') + '\n' + script;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
await conn.exec(script);
|
await conn.exec(script);
|
||||||
},
|
},
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { SshClient } from '../../lib/ssh.js';
|
||||||
import { CertInfo, CertReader, CertReaderHandleContext } from '@certd/plugin-cert';
|
import { CertInfo, CertReader, CertReaderHandleContext } from '@certd/plugin-cert';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import { SshAccess } from '../../access/index.js';
|
import { SshAccess } from '../../access/index.js';
|
||||||
|
import dayjs from 'dayjs';
|
||||||
|
|
||||||
@IsTaskPlugin({
|
@IsTaskPlugin({
|
||||||
name: 'uploadCertToHost',
|
name: 'uploadCertToHost',
|
||||||
|
@ -106,6 +107,18 @@ export class UploadCertToHostPlugin extends AbstractTaskPlugin {
|
||||||
})
|
})
|
||||||
script!: string;
|
script!: string;
|
||||||
|
|
||||||
|
@TaskInput({
|
||||||
|
title: '注入环境变量',
|
||||||
|
value: false,
|
||||||
|
component: {
|
||||||
|
name: 'a-switch',
|
||||||
|
vModel: 'checked',
|
||||||
|
},
|
||||||
|
helper: '是否将证书域名、路径等信息注入脚本执行环境变量中,具体的变量名称,可以运行后从日志中查看',
|
||||||
|
required: false,
|
||||||
|
})
|
||||||
|
injectEnv!: string;
|
||||||
|
|
||||||
@TaskOutput({
|
@TaskOutput({
|
||||||
title: '证书保存路径',
|
title: '证书保存路径',
|
||||||
})
|
})
|
||||||
|
@ -233,10 +246,28 @@ export class UploadCertToHostPlugin extends AbstractTaskPlugin {
|
||||||
const connectConf: SshAccess = await this.accessService.getById(accessId);
|
const connectConf: SshAccess = await this.accessService.getById(accessId);
|
||||||
const sshClient = new SshClient(this.logger);
|
const sshClient = new SshClient(this.logger);
|
||||||
this.logger.info('执行脚本命令');
|
this.logger.info('执行脚本命令');
|
||||||
|
|
||||||
|
//环境变量
|
||||||
|
const env = {};
|
||||||
|
if (this.injectEnv) {
|
||||||
|
const domains = certReader.getAllDomains();
|
||||||
|
for (let i = 0; i < domains.length; i++) {
|
||||||
|
env[`CERT_DOMAIN_${i}`] = domains[i];
|
||||||
|
}
|
||||||
|
env['CERT_EXPIRES'] = dayjs(certReader.getCrtDetail().expires).unix();
|
||||||
|
|
||||||
|
env['HOST_CRT_PATH'] = this.hostCrtPath || '';
|
||||||
|
env['HOST_KEY_PATH'] = this.hostKeyPath || '';
|
||||||
|
env['HOST_IC_PATH'] = this.hostIcPath || '';
|
||||||
|
env['HOST_PFX_PATH'] = this.hostPfxPath || '';
|
||||||
|
env['HOST_DER_PATH'] = this.hostDerPath || '';
|
||||||
|
}
|
||||||
|
|
||||||
const scripts = this.script.split('\n');
|
const scripts = this.script.split('\n');
|
||||||
await sshClient.exec({
|
await sshClient.exec({
|
||||||
connectConf,
|
connectConf,
|
||||||
script: scripts,
|
script: scripts,
|
||||||
|
env,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue