refactor: host

master
xiaojunnuo 2021-02-07 23:17:44 +08:00
parent 2a07442a85
commit cfb1034450
17 changed files with 400 additions and 385 deletions

View File

@ -1,13 +1,16 @@
import _ from 'lodash-es' import _ from 'lodash-es'
import { accessProviderRegistry } from '@certd/api'
import { AliyunAccessProvider } from './providers/aliyun.js' import { AliyunAccessProvider } from './providers/aliyun.js'
import { DnspodAccessProvider } from './providers/dnspod.js' import { DnspodAccessProvider } from './providers/dnspod.js'
import { TencentAccessProvider } from './providers/tencent.js' import { TencentAccessProvider } from './providers/tencent.js'
import { accessProviderRegistry } from '@certd/api' import { SSHAccessProvider } from './providers/ssh.js'
export const DefaultAccessProviders = { export const DefaultAccessProviders = {
AliyunAccessProvider, AliyunAccessProvider,
DnspodAccessProvider, DnspodAccessProvider,
TencentAccessProvider, TencentAccessProvider,
SSHAccessProvider
} }
export default { export default {
install () { install () {

View File

@ -1,5 +1,4 @@
import _ from 'lodash-es' export class AliyunAccessProvider {
export class AliyunAccessProvider{
static define () { static define () {
return { return {
name: 'aliyun', name: 'aliyun',
@ -28,7 +27,4 @@ export class AliyunAccessProvider{
} }
} }
} }
constructor () {
}
} }

View File

@ -1,4 +1,4 @@
export class DnspodAccessProvider { export class DnspodAccessProvider {
static define () { static define () {
return { return {
name: 'dnspod', name: 'dnspod',
@ -23,8 +23,4 @@ export class DnspodAccessProvider {
} }
} }
} }
constructor () {
}
} }

View File

@ -0,0 +1,26 @@
export class SSHAccessProvider {
static define () {
return {
name: 'ssh',
label: '主机',
desc: '',
input: {
host: { required: true },
port: {
label: '端口',
type: Number,
default: '22',
required: true
},
username: {
default: 'root',
required: true
},
password: { desc: '登录密码' },
publicKey: {
desc: '密钥,密码或此项必填一项'
}
}
}
}
}

View File

@ -1,4 +1,4 @@
export class TencentAccessProvider { export class TencentAccessProvider {
static define () { static define () {
return { return {
name: 'tencent', name: 'tencent',
@ -6,7 +6,7 @@ export class TencentAccessProvider {
input: { input: {
secretId: { secretId: {
type: String, type: String,
label:'secretId', label: 'secretId',
component: { component: {
placeholder: 'secretId', placeholder: 'secretId',
rules: [{ required: true, message: '该项必填' }] rules: [{ required: true, message: '该项必填' }]
@ -23,8 +23,4 @@ export class TencentAccessProvider {
} }
} }
} }
constructor () {
}
} }

View File

@ -13,7 +13,10 @@ export class HostShellExecute extends AbstractHostPlugin {
label: '执行远程主机脚本命令', label: '执行远程主机脚本命令',
input: { input: {
script: { script: {
label: 'shell脚本命令' label: 'shell脚本命令',
component: {
name: 'a-textarea'
}
}, },
accessProvider: { accessProvider: {
label: '主机登录配置', label: '主机登录配置',
@ -21,7 +24,7 @@ export class HostShellExecute extends AbstractHostPlugin {
desc: '登录', desc: '登录',
component: { component: {
name: 'access-provider-selector', name: 'access-provider-selector',
filter: 'host' filter: 'ssh'
}, },
required: true required: true
} }

View File

@ -1,6 +1,7 @@
import ssh2 from 'ssh2' import ssh2 from 'ssh2'
import logger from '../utils/util.log.js'
import path from 'path' import path from 'path'
import { util } from '@certd/api'
const logger = util.logger
export class SshClient { export class SshClient {
/** /**
* *

View File

@ -13,10 +13,10 @@ export class UploadCertToHost extends AbstractHostPlugin {
label: '上传证书到主机', label: '上传证书到主机',
input: { input: {
crtPath: { crtPath: {
label: '证书路径' label: '证书保存路径'
}, },
keyPath: { keyPath: {
label: '私钥路径' label: '私钥保存路径'
}, },
accessProvider: { accessProvider: {
label: '主机登录配置', label: '主机登录配置',
@ -24,7 +24,7 @@ export class UploadCertToHost extends AbstractHostPlugin {
desc: 'access授权', desc: 'access授权',
component: { component: {
name: 'access-provider-selector', name: 'access-provider-selector',
filter: 'host' filter: 'ssh'
}, },
required: true required: true
} }

View File

@ -9,6 +9,10 @@ import { DeployCertToTencentCDN } from './tencent/deploy-to-cdn/index.js'
import { DeployCertToTencentCLB } from './tencent/deploy-to-clb/index.js' import { DeployCertToTencentCLB } from './tencent/deploy-to-clb/index.js'
import { DeployCertToTencentTKEIngress } from './tencent/deploy-to-tke-ingress/index.js' import { DeployCertToTencentTKEIngress } from './tencent/deploy-to-tke-ingress/index.js'
import { UploadCertToHost } from './host/upload-to-host/index.js'
import { HostShellExecute } from './host/host-shell-execute/index.js'
import { pluginRegistry } from '@certd/api' import { pluginRegistry } from '@certd/api'
export const DefaultPlugins = { export const DefaultPlugins = {
@ -17,7 +21,9 @@ export const DefaultPlugins = {
UploadCertToTencent, UploadCertToTencent,
DeployCertToTencentTKEIngress, DeployCertToTencentTKEIngress,
DeployCertToTencentCDN, DeployCertToTencentCDN,
DeployCertToTencentCLB DeployCertToTencentCLB,
UploadCertToHost,
HostShellExecute
} }
export default { export default {
install () { install () {

View File

@ -1,4 +1,3 @@
import dayjs from 'dayjs'
import tencentcloud from 'tencentcloud-sdk-nodejs' import tencentcloud from 'tencentcloud-sdk-nodejs'
import { AbstractTencentPlugin } from '../abstract-tencent.js' import { AbstractTencentPlugin } from '../abstract-tencent.js'

File diff suppressed because it is too large Load Diff

View File

@ -3115,6 +3115,27 @@
"webpack-sources": "^1.4.3" "webpack-sources": "^1.4.3"
} }
}, },
"vue-loader-v15": {
"version": "npm:vue-loader@15.9.6",
"resolved": "https://registry.npm.taobao.org/vue-loader/download/vue-loader-15.9.6.tgz?cache=0&sync_timestamp=1608188009078&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-loader%2Fdownload%2Fvue-loader-15.9.6.tgz",
"integrity": "sha1-9Lua4gw6g3CvPs8JuBJtOP/ba4s=",
"dev": true,
"requires": {
"@vue/component-compiler-utils": "^3.1.0",
"hash-sum": "^1.0.2",
"loader-utils": "^1.1.0",
"vue-hot-reload-api": "^2.3.0",
"vue-style-loader": "^4.1.0"
},
"dependencies": {
"hash-sum": {
"version": "1.0.2",
"resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz",
"integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
"dev": true
}
}
},
"webpack": { "webpack": {
"version": "5.19.0", "version": "5.19.0",
"resolved": "https://registry.npm.taobao.org/webpack/download/webpack-5.19.0.tgz", "resolved": "https://registry.npm.taobao.org/webpack/download/webpack-5.19.0.tgz",
@ -5281,7 +5302,7 @@
}, },
"clone-response": { "clone-response": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", "resolved": "https://registry.npm.taobao.org/clone-response/download/clone-response-1.0.2.tgz",
"integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
"requires": { "requires": {
"mimic-response": "^1.0.0" "mimic-response": "^1.0.0"
@ -6394,7 +6415,7 @@
}, },
"decompress-response": { "decompress-response": {
"version": "3.3.0", "version": "3.3.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "resolved": "https://registry.npm.taobao.org/decompress-response/download/decompress-response-3.3.0.tgz",
"integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
"requires": { "requires": {
"mimic-response": "^1.0.0" "mimic-response": "^1.0.0"
@ -6895,7 +6916,7 @@
}, },
"duplexer3": { "duplexer3": {
"version": "0.1.4", "version": "0.1.4",
"resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", "resolved": "https://registry.npm.taobao.org/duplexer3/download/duplexer3-0.1.4.tgz",
"integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
}, },
"duplexify": { "duplexify": {
@ -7094,7 +7115,7 @@
}, },
"es6-promisify": { "es6-promisify": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "resolved": "https://registry.npm.taobao.org/es6-promisify/download/es6-promisify-5.0.0.tgz",
"integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
"requires": { "requires": {
"es6-promise": "^4.0.3" "es6-promise": "^4.0.3"
@ -10173,7 +10194,7 @@
}, },
"json-buffer": { "json-buffer": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", "resolved": "https://registry.npm.taobao.org/json-buffer/download/json-buffer-3.0.0.tgz",
"integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
}, },
"json-parse-better-errors": { "json-parse-better-errors": {
@ -10206,7 +10227,7 @@
}, },
"json-stream": { "json-stream": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-stream/-/json-stream-1.0.0.tgz", "resolved": "https://registry.npm.taobao.org/json-stream/download/json-stream-1.0.0.tgz",
"integrity": "sha1-GjhU4o0rvuqzHMfd9oPS3cVlJwg=" "integrity": "sha1-GjhU4o0rvuqzHMfd9oPS3cVlJwg="
}, },
"json-stringify-safe": { "json-stringify-safe": {
@ -10231,7 +10252,7 @@
}, },
"jsonfile": { "jsonfile": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "resolved": "https://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz?cache=0&sync_timestamp=1604161797011&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsonfile%2Fdownload%2Fjsonfile-4.0.0.tgz",
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
"requires": { "requires": {
"graceful-fs": "^4.1.6" "graceful-fs": "^4.1.6"
@ -14563,7 +14584,7 @@
}, },
"prepend-http": { "prepend-http": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", "resolved": "https://registry.npm.taobao.org/prepend-http/download/prepend-http-2.0.0.tgz",
"integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
}, },
"prettier": { "prettier": {
@ -14907,7 +14928,7 @@
}, },
"rechoir": { "rechoir": {
"version": "0.6.2", "version": "0.6.2",
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "resolved": "https://registry.npm.taobao.org/rechoir/download/rechoir-0.6.2.tgz",
"integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
"requires": { "requires": {
"resolve": "^1.1.6" "resolve": "^1.1.6"
@ -15186,7 +15207,7 @@
}, },
"responselike": { "responselike": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", "resolved": "https://registry.npm.taobao.org/responselike/download/responselike-1.0.2.tgz",
"integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
"requires": { "requires": {
"lowercase-keys": "^1.0.0" "lowercase-keys": "^1.0.0"
@ -16131,7 +16152,7 @@
}, },
"streamsearch": { "streamsearch": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", "resolved": "https://registry.npm.taobao.org/streamsearch/download/streamsearch-0.1.2.tgz",
"integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
}, },
"string-argv": { "string-argv": {
@ -17057,7 +17078,7 @@
}, },
"url-parse-lax": { "url-parse-lax": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", "resolved": "https://registry.npm.taobao.org/url-parse-lax/download/url-parse-lax-3.0.0.tgz",
"integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
"requires": { "requires": {
"prepend-http": "^2.0.0" "prepend-http": "^2.0.0"
@ -17238,21 +17259,6 @@
"@vue/devtools-api": "^6.0.0-beta.3" "@vue/devtools-api": "^6.0.0-beta.3"
} }
}, },
"vue-json-editor": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/vue-json-editor/-/vue-json-editor-1.4.3.tgz",
"integrity": "sha512-st9HdXBgCnyEmmfWrZQiKzp4KuYXzmYVUNDn5h6Fa18MrrGS1amnyUFyv7hQFsNBDW27B7BKkdGOqszYT1srAg==",
"requires": {
"vue": "^2.2.6"
},
"dependencies": {
"vue": {
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz",
"integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg=="
}
}
},
"vue-loader": { "vue-loader": {
"version": "16.1.2", "version": "16.1.2",
"resolved": "https://registry.npm.taobao.org/vue-loader/download/vue-loader-16.1.2.tgz?cache=0&sync_timestamp=1608188009078&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-loader%2Fdownload%2Fvue-loader-16.1.2.tgz", "resolved": "https://registry.npm.taobao.org/vue-loader/download/vue-loader-16.1.2.tgz?cache=0&sync_timestamp=1608188009078&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-loader%2Fdownload%2Fvue-loader-16.1.2.tgz",
@ -17326,27 +17332,6 @@
} }
} }
}, },
"vue-loader-v15": {
"version": "npm:vue-loader@15.9.6",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.6.tgz",
"integrity": "sha512-j0cqiLzwbeImIC6nVIby2o/ABAWhlppyL/m5oJ67R5MloP0hj/DtFgb0Zmq3J9CG7AJ+AXIvHVnJAPBvrLyuDg==",
"dev": true,
"requires": {
"@vue/component-compiler-utils": "^3.1.0",
"hash-sum": "^1.0.2",
"loader-utils": "^1.1.0",
"vue-hot-reload-api": "^2.3.0",
"vue-style-loader": "^4.1.0"
},
"dependencies": {
"hash-sum": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
"integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
"dev": true
}
}
},
"vue-router": { "vue-router": {
"version": "4.0.3", "version": "4.0.3",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.3.tgz", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.3.tgz",

View File

@ -154,8 +154,17 @@ function useEdit (props, context, onEditSave) {
} }
if (editIndex.value == null) { if (editIndex.value == null) {
//
formData.key = currentProvider.value.name formData.key = currentProvider.value.name
formData.name = currentProvider.value.label || currentProvider.value.name formData.name = currentProvider.value.label || currentProvider.value.name
//
for (const key in currentProvider.value.input) {
const input = currentProvider.value.input[key]
if (input.default != null) {
formData[key] = input.default
}
}
} }
} }
@ -201,7 +210,7 @@ function generateNewKey (list) {
return keyPrefix + index return keyPrefix + index
} }
export default { export default {
name: 'provider-manager', name: 'access-provider-manager',
props: { props: {
value: {}, value: {},
filter: {} filter: {}

View File

@ -1,7 +1,6 @@
import DContainer from './d-container' import DContainer from './d-container'
import ComponentRender from './component-render' import ComponentRender from './component-render'
import AccessProviderSelector from './access-provider-selector/access-provider-selector' import AccessProviderSelector from './access-provider-selector/access-provider-selector'
import vueJsonEditor from 'vue-json-editor'
const list = [ const list = [
DContainer, DContainer,
@ -13,7 +12,5 @@ export default {
for (const item of list) { for (const item of list) {
app.component(item.name, item) app.component(item.name, item)
} }
app.component(vueJsonEditor.name, vueJsonEditor)
} }
} }

View File

@ -44,9 +44,9 @@ export default {
setup () { setup () {
const formData = reactive({ const formData = reactive({
cert: { cert: {
domains: ['*.docmirror.cn'], domains: [],
email: 'xiaojunnuo@qq.com', email: '',
dnsProvider: 'aliyun' dnsProvider: { type: undefined }
} }
}) })
const router = useRouter() const router = useRouter()

View File

@ -85,7 +85,7 @@
</a-drawer> </a-drawer>
</template> </template>
<script> <script>
import { reactive, toRaw, ref, watch } from 'vue' import { reactive, ref, watch } from 'vue'
import { useForm } from '@ant-design-vue/use' import { useForm } from '@ant-design-vue/use'
import dnsProviderApi from '@/api/api.dns-providers' import dnsProviderApi from '@/api/api.dns-providers'
import _ from 'lodash-es' import _ from 'lodash-es'
@ -177,11 +177,8 @@ export default {
const onSubmit = async e => { const onSubmit = async e => {
e.preventDefault() e.preventDefault()
try { try {
const res = await validate() await validate()
console.log('validation', res, toRaw(formData))
context.emit('update:cert', formData) context.emit('update:cert', formData)
console.log('1111')
drawer.close() drawer.close()
} catch (err) { } catch (err) {
console.error('表单校验错误', err) console.error('表单校验错误', err)
@ -208,6 +205,7 @@ export default {
const onCreate = async () => { const onCreate = async () => {
const list = await dnsProviderApi.list() const list = await dnsProviderApi.list()
dnsProviderDefineList.value = list dnsProviderDefineList.value = list
onCurrentDnsProviderChanged(formData?.dnsProvider?.type)
} }
const onCurrentDnsProviderChanged = (type) => { const onCurrentDnsProviderChanged = (type) => {
if (type == null) { if (type == null) {

View File

@ -258,7 +258,7 @@ export default {
organizationUnit: 'IT Department' organizationUnit: 'IT Department'
} }
}, },
accessProviders: [{ key: 'aliyun', type: 'aliyun', name: 'aliyun' }], accessProviders: [],
deploy: [] deploy: []
} }
_.merge(optionsDefault, optionParams) _.merge(optionsDefault, optionParams)