diff --git a/packages/core/api/src/dns-provider/abstract-dns-provider.js b/packages/core/api/src/dns-provider/abstract-dns-provider.js index 211e4a1f..40b4181b 100644 --- a/packages/core/api/src/dns-provider/abstract-dns-provider.js +++ b/packages/core/api/src/dns-provider/abstract-dns-provider.js @@ -35,9 +35,13 @@ export class AbstractDnsProvider { } getAccessProvider (accessProvider, accessProviders = this.accessProviders) { + let access = accessProvider if (typeof accessProvider === 'string' && accessProviders) { - accessProvider = accessProviders[accessProvider] + access = accessProviders[accessProvider] } - return accessProvider + if (access == null) { + throw new Error(`accessProvider :${accessProvider}不存在`) + } + return access } } diff --git a/packages/core/executor/src/index.js b/packages/core/executor/src/index.js index 7cd54505..90f03e81 100644 --- a/packages/core/executor/src/index.js +++ b/packages/core/executor/src/index.js @@ -27,7 +27,7 @@ export class Executor { options = _.merge(createDefaultOptions(), options) return await this.doRun(options) } catch (e) { - logger.error('任务执行出错:' + e.message, e) + logger.error('任务执行出错', e) throw e } } diff --git a/packages/plugins/plugin-host/src/plugins/ssh.js b/packages/plugins/plugin-host/src/plugins/ssh.js index 9601675c..78d18361 100644 --- a/packages/plugins/plugin-host/src/plugins/ssh.js +++ b/packages/plugins/plugin-host/src/plugins/ssh.js @@ -15,7 +15,7 @@ export class SshClient { } * @param transports */ - uploadFiles ({ connectConf, transports }) { + uploadFiles ({ connectConf, transports, sudo = false }) { const conn = new ssh2.Client() return new Promise((resolve, reject) => { @@ -29,7 +29,8 @@ export class SshClient { try { for (const transport of transports) { logger.info('上传文件:', JSON.stringify(transport)) - await this.exec({ connectConf, script: 'mkdir -p ' + path.dirname(transport.remotePath) }) + sudo = sudo ? 'sudo' : '' + await this.exec({ connectConf, script: `${sudo} mkdir -p ${path.dirname(transport.remotePath)} ` }) await this.fastPut({ sftp, ...transport }) } resolve() @@ -47,6 +48,7 @@ export class SshClient { if (_.isArray(script)) { script = script.join('\n') } + console.log('执行命令:', script) return new Promise((resolve, reject) => { this.connect({ connectConf, @@ -58,11 +60,12 @@ export class SshClient { } let data = null stream.on('close', (code, signal) => { - console.log(`[${connectConf.host}][close]:code:${code}, signal:${signal} `) - + console.log(`[${connectConf.host}][close]:code:${code}`) + data = data ? data.toString() : null if (code === 0) { - data = data ? data.toString() : null resolve(data) + } else { + reject(new Error(data)) } conn.end() }).on('data', (ret) => { @@ -70,8 +73,7 @@ export class SshClient { data = ret }).stderr.on('data', (err) => { console.log(`[${connectConf.host}][error]: ` + err) - reject(new Error(err.toString())) - stream.close() + data = err }) }) } diff --git a/packages/plugins/plugin-host/src/plugins/upload-to-host/index.js b/packages/plugins/plugin-host/src/plugins/upload-to-host/index.js index 381c99fd..ae2a57c0 100644 --- a/packages/plugins/plugin-host/src/plugins/upload-to-host/index.js +++ b/packages/plugins/plugin-host/src/plugins/upload-to-host/index.js @@ -27,6 +27,9 @@ export class UploadCertToHost extends AbstractHostPlugin { filter: 'ssh' }, required: true + }, + sudo: { + label: '是否sudo' } }, output: { @@ -45,7 +48,6 @@ export class UploadCertToHost extends AbstractHostPlugin { async execute ({ cert, props, context }) { const { crtPath, keyPath, accessProvider } = props const connectConf = this.getAccessProvider(accessProvider) - console.log('connectConf', connectConf) const sshClient = new SshClient() await sshClient.uploadFiles({ connectConf, diff --git a/packages/plugins/plugin-host/test/plugins/host-shell-execute.test.js b/packages/plugins/plugin-host/test/plugins/host-shell-execute.test.js index 15609e6b..0bd37e53 100644 --- a/packages/plugins/plugin-host/test/plugins/host-shell-execute.test.js +++ b/packages/plugins/plugin-host/test/plugins/host-shell-execute.test.js @@ -22,7 +22,18 @@ describe('HostShellExecute', function () { const ret = await plugin.doExecute(uploadOpts) expect(ret).ok console.log('-----' + JSON.stringify(ret)) + }) - await plugin.doRollback(uploadOpts) + it('#execute-hk-restart-docker', async function () { + this.timeout(10000) + const options = createOptions() + const plugin = new HostShellExecute(options) + const uploadOpts = { + props: { script: ['cd /home/ubuntu/deloy/nginx-proxy\nsudo docker-compose build\nsudo docker-compose up -d\n'], accessProvider: 'aliyun-ssh-hk' }, + context: {} + } + const ret = await plugin.doExecute(uploadOpts) + expect(ret).ok + console.log('-----' + JSON.stringify(ret)) }) }) diff --git a/packages/plugins/plugin-host/test/plugins/upload-to-host.test.js b/packages/plugins/plugin-host/test/plugins/upload-to-host.test.js index 40efd368..dde5c95c 100644 --- a/packages/plugins/plugin-host/test/plugins/upload-to-host.test.js +++ b/packages/plugins/plugin-host/test/plugins/upload-to-host.test.js @@ -24,4 +24,25 @@ describe('PluginUploadToHost', function () { await plugin.doRollback(uploadOpts) }) + + it('#execute-to-ubantu', async function () { + this.timeout(10000) + const options = createOptions() + options.args = { test: false } + options.cert.email = 'xiaojunnuo@qq.com' + options.cert.domains = ['*.docmirror.cn'] + const plugin = new UploadCertToHost(options) + const certd = new Certd(options) + const cert = await certd.readCurrentCert() + const context = {} + const uploadOpts = { + cert, + props: { crtPath: '/home/ubuntu/deloy/nginx-proxy/ssl/test.crt', keyPath: '/home/ubuntu/deloy/nginx-proxy/ssl/test.key', accessProvider: 'aliyun-ssh-hk' }, + context + } + await plugin.doExecute(uploadOpts) + console.log('context:', context) + + await plugin.doRollback(uploadOpts) + }) }) diff --git a/packages/ui/certd-server/service/exports-service.js b/packages/ui/certd-server/service/exports-service.js index 5d778de5..c7abc9a4 100644 --- a/packages/ui/certd-server/service/exports-service.js +++ b/packages/ui/certd-server/service/exports-service.js @@ -33,6 +33,9 @@ export default { const templatePkg = require('../templates/certd-run/package.json') templatePkg.dependencies['@certd/executor'] = '^' + currentVersion + templatePkg.dependencies['@certd/plugin-aliyun'] = '^' + currentVersion + templatePkg.dependencies['@certd/plugin-host'] = '^' + currentVersion + templatePkg.dependencies['@certd/plugin-tencent'] = '^' + currentVersion const pkgFilePath = path.join(targetProjectDir, 'package.json') fs.writeJsonSync(pkgFilePath, templatePkg) diff --git a/packages/ui/certd-server/templates/certd-run/index.js b/packages/ui/certd-server/templates/certd-run/index.js index ea11b0a6..73e94cda 100644 --- a/packages/ui/certd-server/templates/certd-run/index.js +++ b/packages/ui/certd-server/templates/certd-run/index.js @@ -2,11 +2,17 @@ import { Executor } from '@certd/executor' import PluginAliyun from '@certd/plugin-aliyun' import PluginTencent from '@certd/plugin-tencent' import PluginHost from '@certd/plugin-host' -import options from './options.json' // 安装默认插件和授权提供者 PluginAliyun.install() PluginTencent.install() PluginHost.install() + +// import options +import { createRequire } from 'module' +const require = createRequire(import.meta.url) +const options =require('./options.json') + +//开始执行 const executor = new Executor() -executor.run(options) +await executor.run(options)