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 { accessProviderRegistry } from '@certd/api'
import { AliyunAccessProvider } from './providers/aliyun.js'
import { DnspodAccessProvider } from './providers/dnspod.js'
import { TencentAccessProvider } from './providers/tencent.js'
import { accessProviderRegistry } from '@certd/api'
import { SSHAccessProvider } from './providers/ssh.js'
export const DefaultAccessProviders = {
AliyunAccessProvider,
DnspodAccessProvider,
TencentAccessProvider,
SSHAccessProvider
}
export default {
install () {

View File

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

View File

@ -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

@ -23,8 +23,4 @@ export class TencentAccessProvider {
}
}
}
constructor () {
}
}

View File

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

View File

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

View File

@ -13,10 +13,10 @@ export class UploadCertToHost extends AbstractHostPlugin {
label: '上传证书到主机',
input: {
crtPath: {
label: '证书路径'
label: '证书保存路径'
},
keyPath: {
label: '私钥路径'
label: '私钥保存路径'
},
accessProvider: {
label: '主机登录配置',
@ -24,7 +24,7 @@ export class UploadCertToHost extends AbstractHostPlugin {
desc: 'access授权',
component: {
name: 'access-provider-selector',
filter: 'host'
filter: 'ssh'
},
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 { 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'
export const DefaultPlugins = {
@ -17,7 +21,9 @@ export const DefaultPlugins = {
UploadCertToTencent,
DeployCertToTencentTKEIngress,
DeployCertToTencentCDN,
DeployCertToTencentCLB
DeployCertToTencentCLB,
UploadCertToHost,
HostShellExecute
}
export default {
install () {

View File

@ -1,4 +1,3 @@
import dayjs from 'dayjs'
import tencentcloud from 'tencentcloud-sdk-nodejs'
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"
}
},
"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": {
"version": "5.19.0",
"resolved": "https://registry.npm.taobao.org/webpack/download/webpack-5.19.0.tgz",
@ -5281,7 +5302,7 @@
},
"clone-response": {
"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=",
"requires": {
"mimic-response": "^1.0.0"
@ -6394,7 +6415,7 @@
},
"decompress-response": {
"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=",
"requires": {
"mimic-response": "^1.0.0"
@ -6895,7 +6916,7 @@
},
"duplexer3": {
"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="
},
"duplexify": {
@ -7094,7 +7115,7 @@
},
"es6-promisify": {
"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=",
"requires": {
"es6-promise": "^4.0.3"
@ -10173,7 +10194,7 @@
},
"json-buffer": {
"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="
},
"json-parse-better-errors": {
@ -10206,7 +10227,7 @@
},
"json-stream": {
"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="
},
"json-stringify-safe": {
@ -10231,7 +10252,7 @@
},
"jsonfile": {
"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=",
"requires": {
"graceful-fs": "^4.1.6"
@ -14563,7 +14584,7 @@
},
"prepend-http": {
"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="
},
"prettier": {
@ -14907,7 +14928,7 @@
},
"rechoir": {
"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=",
"requires": {
"resolve": "^1.1.6"
@ -15186,7 +15207,7 @@
},
"responselike": {
"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=",
"requires": {
"lowercase-keys": "^1.0.0"
@ -16131,7 +16152,7 @@
},
"streamsearch": {
"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="
},
"string-argv": {
@ -17057,7 +17078,7 @@
},
"url-parse-lax": {
"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=",
"requires": {
"prepend-http": "^2.0.0"
@ -17238,21 +17259,6 @@
"@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": {
"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",
@ -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": {
"version": "4.0.3",
"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) {
//
formData.key = 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
}
export default {
name: 'provider-manager',
name: 'access-provider-manager',
props: {
value: {},
filter: {}

View File

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

View File

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

View File

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

View File

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