mirror of https://github.com/certd/certd
perf: 抽取api
parent
f07ce6f47d
commit
5312c11472
|
@ -5,3 +5,4 @@ out
|
||||||
gen
|
gen
|
||||||
node_modules/
|
node_modules/
|
||||||
/test/*.private.*
|
/test/*.private.*
|
||||||
|
/*.log
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"extends": "standard",
|
||||||
|
"env": {
|
||||||
|
"mocha": true
|
||||||
|
},
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"files": ["*.test.js", "*.spec.js"],
|
||||||
|
"rules": {
|
||||||
|
"no-unused-expressions": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,28 @@
|
||||||
|
{
|
||||||
|
"name": "@certd/api",
|
||||||
|
"version": "0.1.2",
|
||||||
|
"description": "",
|
||||||
|
"main": "./src/index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"type": "module",
|
||||||
|
"author": "Greper",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"axios": "^0.21.1",
|
||||||
|
"dayjs": "^1.9.7",
|
||||||
|
"lodash-es": "^4.17.20",
|
||||||
|
"log4js": "^6.3.0",
|
||||||
|
"qs": "^6.9.4"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"chai": "^4.2.0",
|
||||||
|
"eslint": "^7.15.0",
|
||||||
|
"eslint-config-standard": "^16.0.2",
|
||||||
|
"eslint-plugin-import": "^2.22.1",
|
||||||
|
"eslint-plugin-node": "^11.1.0",
|
||||||
|
"eslint-plugin-promise": "^4.2.1",
|
||||||
|
"mocha": "^8.2.1"
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,10 @@
|
||||||
import _ from 'lodash'
|
import _ from 'lodash-es'
|
||||||
export class DnsProvider {
|
import logger from '../utils/util.log.js'
|
||||||
|
export class AbstractDnsProvider {
|
||||||
|
constructor () {
|
||||||
|
this.logger = logger
|
||||||
|
}
|
||||||
|
|
||||||
async createRecord ({ fullRecord, type, value }) {
|
async createRecord ({ fullRecord, type, value }) {
|
||||||
throw new Error('请实现 createRecord 方法')
|
throw new Error('请实现 createRecord 方法')
|
||||||
}
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
export { AbstractDnsProvider } from './dns-provider/index.js'
|
||||||
|
export { Store } from './store/store.js'
|
||||||
|
export { util } from './utils/index.js'
|
||||||
|
export { AbstractPlugin } from './plugin/index.js'
|
|
@ -0,0 +1,7 @@
|
||||||
|
import logger from './util.log.js'
|
||||||
|
import path from './util.path.js'
|
||||||
|
import { request } from './util.request.js'
|
||||||
|
import sleep from './util.sleep.js'
|
||||||
|
export const util = {
|
||||||
|
logger, path, request, sleep
|
||||||
|
}
|
|
@ -10,16 +10,12 @@
|
||||||
"author": "Greper",
|
"author": "Greper",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@alicloud/pop-core": "^1.7.10",
|
"@certd/api": "^0.1.2",
|
||||||
|
"@certd/providers": "^0.1.2",
|
||||||
"@certd/acme-client": "^0.1.1",
|
"@certd/acme-client": "^0.1.1",
|
||||||
"@types/node": "^14.14.13",
|
|
||||||
"axios": "^0.21.1",
|
|
||||||
"dayjs": "^1.9.7",
|
"dayjs": "^1.9.7",
|
||||||
"lodash": "^4.17.20",
|
|
||||||
"log4js": "^6.3.0",
|
|
||||||
"node-forge": "^0.10.0",
|
"node-forge": "^0.10.0",
|
||||||
"qs": "^6.9.4",
|
"lodash-es": "^4.17.20"
|
||||||
"tencentcloud-sdk-nodejs": "^4.0.44"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"chai": "^4.2.0",
|
"chai": "^4.2.0",
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import log from './utils/util.log.js'
|
|
||||||
import acme from '@certd/acme-client'
|
import acme from '@certd/acme-client'
|
||||||
import _ from 'lodash'
|
import _ from 'lodash-es'
|
||||||
|
import { util } from '@certd/api'
|
||||||
|
const logger = util.logger
|
||||||
export class AcmeService {
|
export class AcmeService {
|
||||||
constructor (store) {
|
constructor (store) {
|
||||||
this.store = store
|
this.store = store
|
||||||
|
@ -57,27 +58,27 @@ export class AcmeService {
|
||||||
}
|
}
|
||||||
|
|
||||||
async challengeCreateFn (authz, challenge, keyAuthorization, dnsProvider) {
|
async challengeCreateFn (authz, challenge, keyAuthorization, dnsProvider) {
|
||||||
log.info('Triggered challengeCreateFn()')
|
logger.info('Triggered challengeCreateFn()')
|
||||||
|
|
||||||
/* http-01 */
|
/* http-01 */
|
||||||
if (challenge.type === 'http-01') {
|
if (challenge.type === 'http-01') {
|
||||||
const filePath = `/var/www/html/.well-known/acme-challenge/${challenge.token}`
|
const filePath = `/var/www/html/.well-known/acme-challenge/${challenge.token}`
|
||||||
const fileContents = keyAuthorization
|
const fileContents = keyAuthorization
|
||||||
|
|
||||||
log.info(`Creating challenge response for ${authz.identifier.value} at path: ${filePath}`)
|
logger.info(`Creating challenge response for ${authz.identifier.value} at path: ${filePath}`)
|
||||||
|
|
||||||
/* Replace this */
|
/* Replace this */
|
||||||
log.info(`Would write "${fileContents}" to path "${filePath}"`)
|
logger.info(`Would write "${fileContents}" to path "${filePath}"`)
|
||||||
// await fs.writeFileAsync(filePath, fileContents);
|
// await fs.writeFileAsync(filePath, fileContents);
|
||||||
} else if (challenge.type === 'dns-01') {
|
} else if (challenge.type === 'dns-01') {
|
||||||
/* dns-01 */
|
/* dns-01 */
|
||||||
const dnsRecord = `_acme-challenge.${authz.identifier.value}`
|
const dnsRecord = `_acme-challenge.${authz.identifier.value}`
|
||||||
const recordValue = keyAuthorization
|
const recordValue = keyAuthorization
|
||||||
|
|
||||||
log.info(`Creating TXT record for ${authz.identifier.value}: ${dnsRecord}`)
|
logger.info(`Creating TXT record for ${authz.identifier.value}: ${dnsRecord}`)
|
||||||
|
|
||||||
/* Replace this */
|
/* Replace this */
|
||||||
log.info(`Would create TXT record "${dnsRecord}" with value "${recordValue}"`)
|
logger.info(`Would create TXT record "${dnsRecord}" with value "${recordValue}"`)
|
||||||
|
|
||||||
return await dnsProvider.createRecord({
|
return await dnsProvider.createRecord({
|
||||||
fullRecord: dnsRecord,
|
fullRecord: dnsRecord,
|
||||||
|
@ -99,25 +100,25 @@ export class AcmeService {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
async challengeRemoveFn (authz, challenge, keyAuthorization, recordItem, dnsProvider) {
|
async challengeRemoveFn (authz, challenge, keyAuthorization, recordItem, dnsProvider) {
|
||||||
log.info('Triggered challengeRemoveFn()')
|
logger.info('Triggered challengeRemoveFn()')
|
||||||
|
|
||||||
/* http-01 */
|
/* http-01 */
|
||||||
if (challenge.type === 'http-01') {
|
if (challenge.type === 'http-01') {
|
||||||
const filePath = `/var/www/html/.well-known/acme-challenge/${challenge.token}`
|
const filePath = `/var/www/html/.well-known/acme-challenge/${challenge.token}`
|
||||||
|
|
||||||
log.info(`Removing challenge response for ${authz.identifier.value} at path: ${filePath}`)
|
logger.info(`Removing challenge response for ${authz.identifier.value} at path: ${filePath}`)
|
||||||
|
|
||||||
/* Replace this */
|
/* Replace this */
|
||||||
log.info(`Would remove file on path "${filePath}"`)
|
logger.info(`Would remove file on path "${filePath}"`)
|
||||||
// await fs.unlinkAsync(filePath);
|
// await fs.unlinkAsync(filePath);
|
||||||
} else if (challenge.type === 'dns-01') {
|
} else if (challenge.type === 'dns-01') {
|
||||||
const dnsRecord = `_acme-challenge.${authz.identifier.value}`
|
const dnsRecord = `_acme-challenge.${authz.identifier.value}`
|
||||||
const recordValue = keyAuthorization
|
const recordValue = keyAuthorization
|
||||||
|
|
||||||
log.info(`Removing TXT record for ${authz.identifier.value}: ${dnsRecord}`)
|
logger.info(`Removing TXT record for ${authz.identifier.value}: ${dnsRecord}`)
|
||||||
|
|
||||||
/* Replace this */
|
/* Replace this */
|
||||||
log.info(`Would remove TXT record "${dnsRecord}" with value "${recordValue}"`)
|
logger.info(`Would remove TXT record "${dnsRecord}" with value "${recordValue}"`)
|
||||||
await dnsProvider.removeRecord({
|
await dnsProvider.removeRecord({
|
||||||
fullRecord: dnsRecord,
|
fullRecord: dnsRecord,
|
||||||
type: 'TXT',
|
type: 'TXT',
|
||||||
|
@ -170,13 +171,13 @@ export class AcmeService {
|
||||||
accountUrl = client.getAccountUrl()
|
accountUrl = client.getAccountUrl()
|
||||||
this.setAccountUrl(email, accountUrl)
|
this.setAccountUrl(email, accountUrl)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log.warn('保存accountUrl出错', e)
|
logger.warn('保存accountUrl出错', e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Done */
|
/* Done */
|
||||||
log.debug(`CSR:\n${csr.toString()}`)
|
logger.debug(`CSR:\n${csr.toString()}`)
|
||||||
log.debug(`Certificate:\n${crt.toString()}`)
|
logger.debug(`Certificate:\n${crt.toString()}`)
|
||||||
log.info('证书申请成功')
|
logger.info('证书申请成功')
|
||||||
return { key, crt, csr }
|
return { key, crt, csr }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
import logger from './utils/util.log.js'
|
import { util, Store } from '@certd/api'
|
||||||
import { AcmeService } from './acme.js'
|
import { AcmeService } from './acme.js'
|
||||||
import { FileStore } from './store/impl/file-store.js'
|
import { FileStore } from './store/file-store.js'
|
||||||
import { Store } from './store/store.js'
|
|
||||||
import { CertStore } from './store/cert-store.js'
|
import { CertStore } from './store/cert-store.js'
|
||||||
import { DnsProviderFactory } from './dns-provider/dns-provider-factory.js'
|
import { DnsProviderFactory } from '@certd/providers'
|
||||||
import dayjs from 'dayjs'
|
import dayjs from 'dayjs'
|
||||||
import forge from 'node-forge'
|
import forge from 'node-forge'
|
||||||
|
const logger = util.logger
|
||||||
export class Certd {
|
export class Certd {
|
||||||
constructor (options) {
|
constructor (options) {
|
||||||
this.options = options
|
this.options = options
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
import { Store } from '../store.js'
|
import { Store, util } from '@certd/api'
|
||||||
import util from '../../utils/util.js'
|
|
||||||
import path from 'path'
|
import path from 'path'
|
||||||
import fs from 'fs'
|
import fs from 'fs'
|
||||||
import logger from '../../utils/util.log.js'
|
const logger = util.logger
|
||||||
|
|
||||||
export class FileStore extends Store {
|
export class FileStore extends Store {
|
||||||
constructor (opts) {
|
constructor (opts) {
|
||||||
super()
|
super()
|
|
@ -0,0 +1,18 @@
|
||||||
|
import pkg from 'chai'
|
||||||
|
import { createOptions } from '../../../../test/options.js'
|
||||||
|
import { Certd } from '../../src/index.js'
|
||||||
|
const { expect } = pkg
|
||||||
|
describe('AliyunDnsProvider', function () {
|
||||||
|
it('#申请证书-aliyun', async function () {
|
||||||
|
this.timeout(300000)
|
||||||
|
const options = createOptions()
|
||||||
|
options.args = { forceCert: true, test: false }
|
||||||
|
const certd = new Certd(options)
|
||||||
|
const cert = await certd.certApply()
|
||||||
|
expect(cert).ok
|
||||||
|
expect(cert.crt).ok
|
||||||
|
expect(cert.key).ok
|
||||||
|
expect(cert.detail).ok
|
||||||
|
expect(cert.expires).ok
|
||||||
|
})
|
||||||
|
})
|
|
@ -0,0 +1,20 @@
|
||||||
|
import pkg from 'chai'
|
||||||
|
import { Certd } from '../../src/index.js'
|
||||||
|
import { createOptions } from '../../../../test/options.js'
|
||||||
|
const { expect } = pkg
|
||||||
|
describe('DnspodDnsProvider', function () {
|
||||||
|
it('#申请证书', async function () {
|
||||||
|
this.timeout(300000)
|
||||||
|
const options = createOptions()
|
||||||
|
options.cert.domains = ['*.certd.xyz', '*.test.certd.xyz', '*.base.certd.xyz', 'certd.xyz']
|
||||||
|
options.cert.dnsProvider = 'dnspod'
|
||||||
|
options.args = { forceCert: true }
|
||||||
|
const certd = new Certd(options)
|
||||||
|
const cert = await certd.certApply()
|
||||||
|
expect(cert).ok
|
||||||
|
expect(cert.crt).ok
|
||||||
|
expect(cert.key).ok
|
||||||
|
expect(cert.detail).ok
|
||||||
|
expect(cert.expires).ok
|
||||||
|
})
|
||||||
|
})
|
|
@ -33,7 +33,6 @@ jrunq0tNHR/EKG0ITPLf+6P7MxbmpYNnq918766l0tKsW8oo8ZSGEwKU2LMaSiAa
|
||||||
hasyl/2gMnYXjtKOjDcnR8oLpbrOg0qpVbynmJin1HP835oHPPAZ1gLsqYTTizNz
|
hasyl/2gMnYXjtKOjDcnR8oLpbrOg0qpVbynmJin1HP835oHPPAZ1gLsqYTTizNz
|
||||||
AHxTaXliTVvS83dogw==
|
AHxTaXliTVvS83dogw==
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
MIIEqzCCApOgAwIBAgIRAIvhKg5ZRO08VGQx8JdhT+UwDQYJKoZIhvcNAQELBQAw
|
MIIEqzCCApOgAwIBAgIRAIvhKg5ZRO08VGQx8JdhT+UwDQYJKoZIhvcNAQELBQAw
|
||||||
GjEYMBYGA1UEAwwPRmFrZSBMRSBSb290IFgxMB4XDTE2MDUyMzIyMDc1OVoXDTM2
|
GjEYMBYGA1UEAwwPRmFrZSBMRSBSb290IFgxMB4XDTE2MDUyMzIyMDc1OVoXDTM2
|
||||||
|
|
|
@ -13,10 +13,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/certd": "^0.1.2",
|
"@certd/certd": "^0.1.2",
|
||||||
"@certd/plugins": "^0.1.2",
|
"@certd/plugins": "^0.1.2",
|
||||||
"@types/node": "^14.14.13",
|
"lodash-es": "^4.17.20"
|
||||||
"dayjs": "^1.9.8",
|
|
||||||
"lodash": "^4.17.20",
|
|
||||||
"log4js": "^6.3.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@rollup/plugin-commonjs": "^17.0.0",
|
"@rollup/plugin-commonjs": "^17.0.0",
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import { Certd } from '@certd/certd'
|
import { Certd } from '@certd/certd'
|
||||||
import DefaultPlugins from '@certd/plugins'
|
import DefaultPlugins from '@certd/plugins'
|
||||||
import logger from './util.log.js'
|
import { util } from '@certd/api'
|
||||||
import _ from 'lodash'
|
import _ from 'lodash-es'
|
||||||
import dayjs from 'dayjs'
|
import dayjs from 'dayjs'
|
||||||
import { Trace } from './trace.js'
|
import { Trace } from './trace.js'
|
||||||
|
const logger = util.logger
|
||||||
export class Executor {
|
export class Executor {
|
||||||
constructor (args = {}) {
|
constructor (args = {}) {
|
||||||
const { plugins } = args
|
const { plugins } = args
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import logger from './util.log.js'
|
import { util } from '@certd/api'
|
||||||
import _ from 'lodash'
|
import _ from 'lodash-es'
|
||||||
|
const logger = util.logger
|
||||||
export class Trace {
|
export class Trace {
|
||||||
constructor (context) {
|
constructor (context) {
|
||||||
this.context = context
|
this.context = context
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
import log4js from 'log4js'
|
|
||||||
log4js.configure({
|
|
||||||
appenders: { std: { type: 'stdout' } },
|
|
||||||
categories: { default: { appenders: ['std'], level: 'info' } }
|
|
||||||
})
|
|
||||||
const logger = log4js.getLogger('certd')
|
|
||||||
export default logger
|
|
||||||
|
|
||||||
// import debug from 'debug'
|
|
||||||
// debug.enable('info,debug,error,warn')
|
|
||||||
// export default {
|
|
||||||
// debug: debug('debug'),
|
|
||||||
// info: debug('info'),
|
|
||||||
// error: debug('error'),
|
|
||||||
// warn: debug('warn')
|
|
||||||
// }
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 48fa8732775f0d72e1f361e993900a393d65c898
|
Subproject commit ea59051a9fab203b0ed102c779dadad0364eba8d
|
|
@ -11,10 +11,8 @@
|
||||||
"@alicloud/pop-core": "^1.7.10",
|
"@alicloud/pop-core": "^1.7.10",
|
||||||
"@certd/certd": "^0.1.1",
|
"@certd/certd": "^0.1.1",
|
||||||
"@types/node": "^14.14.13",
|
"@types/node": "^14.14.13",
|
||||||
"dayjs": "^1.9.7",
|
|
||||||
"kubernetes-client": "^9.0.0",
|
"kubernetes-client": "^9.0.0",
|
||||||
"lodash": "^4.17.20",
|
"lodash-es": "^4.17.20",
|
||||||
"log4js": "^6.3.0",
|
|
||||||
"ssh2": "^0.8.9",
|
"ssh2": "^0.8.9",
|
||||||
"tencentcloud-sdk-nodejs": "^4.0.44"
|
"tencentcloud-sdk-nodejs": "^4.0.44"
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { AbstractPlugin } from '../abstract-plugin/index.js'
|
import { AbstractPlugin } from '@certd/api'
|
||||||
|
|
||||||
export class AbstractAliyunPlugin extends AbstractPlugin {
|
export class AbstractAliyunPlugin extends AbstractPlugin {
|
||||||
checkRet (ret) {
|
checkRet (ret) {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { AbstractPlugin } from '../abstract-plugin/index.js'
|
import { AbstractPlugin } from '@certd/api'
|
||||||
|
|
||||||
export class AbstractHostPlugin extends AbstractPlugin {
|
export class AbstractHostPlugin extends AbstractPlugin {
|
||||||
checkRet (ret) {
|
checkRet (ret) {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { AbstractPlugin } from '../abstract-plugin/index.js'
|
import { AbstractPlugin } from '@certd/api'
|
||||||
|
|
||||||
export class AbstractTencentPlugin extends AbstractPlugin {
|
export class AbstractTencentPlugin extends AbstractPlugin {
|
||||||
checkRet (ret) {
|
checkRet (ret) {
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import kubernetesClient from 'kubernetes-client'
|
import kubernetesClient from 'kubernetes-client'
|
||||||
import logger from './util.log.js'
|
import { util } from '@certd/api0'
|
||||||
import Request from 'kubernetes-client/backends/request/index.js'
|
import Request from 'kubernetes-client/backends/request/index.js'
|
||||||
const { KubeConfig, Client } = kubernetesClient
|
const { KubeConfig, Client } = kubernetesClient
|
||||||
|
const logger = util.logger
|
||||||
export class K8sClient {
|
export class K8sClient {
|
||||||
constructor (kubeConfigStr) {
|
constructor (kubeConfigStr) {
|
||||||
const kubeconfig = new KubeConfig()
|
const kubeconfig = new KubeConfig()
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
import log4js from 'log4js'
|
|
||||||
log4js.configure({
|
|
||||||
appenders: { std: { type: 'stdout' } },
|
|
||||||
categories: { default: { appenders: ['std'], level: 'info' } }
|
|
||||||
})
|
|
||||||
const logger = log4js.getLogger('certd')
|
|
||||||
export default logger
|
|
|
@ -1,7 +0,0 @@
|
||||||
export default function (timeout) {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
setTimeout(() => {
|
|
||||||
resolve()
|
|
||||||
}, timeout)
|
|
||||||
})
|
|
||||||
}
|
|
|
@ -1,4 +1,4 @@
|
||||||
import _ from 'lodash'
|
import _ from 'lodash-es'
|
||||||
import optionsPrivate from '../../../test/options.private.mjs'
|
import optionsPrivate from '../../../test/options.private.mjs'
|
||||||
const defaultOptions = {
|
const defaultOptions = {
|
||||||
version: '1.0.0',
|
version: '1.0.0',
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"extends": "standard",
|
||||||
|
"env": {
|
||||||
|
"mocha": true
|
||||||
|
},
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"files": ["*.test.js", "*.spec.js"],
|
||||||
|
"rules": {
|
||||||
|
"no-unused-expressions": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
"name": "@certd/providers",
|
||||||
|
"version": "0.1.2",
|
||||||
|
"description": "",
|
||||||
|
"main": "./src/index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"type": "module",
|
||||||
|
"author": "Greper",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@certd/api": "^0.1.2"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"chai": "^4.2.0",
|
||||||
|
"eslint": "^7.15.0",
|
||||||
|
"eslint-config-standard": "^16.0.2",
|
||||||
|
"eslint-plugin-import": "^2.22.1",
|
||||||
|
"eslint-plugin-node": "^11.1.0",
|
||||||
|
"eslint-plugin-promise": "^4.2.1",
|
||||||
|
"mocha": "^8.2.1"
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,8 +1,7 @@
|
||||||
import { DnsProvider } from '../dns-provider.js'
|
import { AbstractDnsProvider, util } from '@certd/api'
|
||||||
import _ from 'lodash'
|
import _ from 'lodash-es'
|
||||||
import log from '../../utils/util.log.js'
|
const request = util.request
|
||||||
import { request } from '../../utils/util.request.js'
|
export default class DnspodDnsProvider extends AbstractDnsProvider {
|
||||||
export default class DnspodDnsProvider extends DnsProvider {
|
|
||||||
constructor (dnsProviderConfig) {
|
constructor (dnsProviderConfig) {
|
||||||
super()
|
super()
|
||||||
if (!dnsProviderConfig.id || !dnsProviderConfig.token) {
|
if (!dnsProviderConfig.id || !dnsProviderConfig.token) {
|
||||||
|
@ -35,12 +34,12 @@ export default class DnspodDnsProvider extends DnsProvider {
|
||||||
const ret = await this.doRequest({
|
const ret = await this.doRequest({
|
||||||
url: 'https://dnsapi.cn/Domain.List'
|
url: 'https://dnsapi.cn/Domain.List'
|
||||||
})
|
})
|
||||||
log.debug('dnspod 域名列表:', ret.domains)
|
this.logger.debug('dnspod 域名列表:', ret.domains)
|
||||||
return ret.domains
|
return ret.domains
|
||||||
}
|
}
|
||||||
|
|
||||||
async createRecord ({ fullRecord, type, value }) {
|
async createRecord ({ fullRecord, type, value }) {
|
||||||
log.info('添加域名解析:', fullRecord, value)
|
this.logger.info('添加域名解析:', fullRecord, value)
|
||||||
const domainItem = await this.matchDomain(fullRecord, 'name')
|
const domainItem = await this.matchDomain(fullRecord, 'name')
|
||||||
const domain = domainItem.name
|
const domain = domainItem.name
|
||||||
const rr = fullRecord.replace('.' + domain, '')
|
const rr = fullRecord.replace('.' + domain, '')
|
||||||
|
@ -56,7 +55,7 @@ export default class DnspodDnsProvider extends DnsProvider {
|
||||||
mx: 1
|
mx: 1
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
log.info('添加域名解析成功:', fullRecord, value, JSON.stringify(ret.record))
|
this.logger.info('添加域名解析成功:', fullRecord, value, JSON.stringify(ret.record))
|
||||||
return ret.record
|
return ret.record
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,7 +69,7 @@ export default class DnspodDnsProvider extends DnsProvider {
|
||||||
record_id: record.id
|
record_id: record.id
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
log.info('删除域名解析成功:', fullRecord, value)
|
this.logger.info('删除域名解析成功:', fullRecord, value)
|
||||||
return ret.RecordId
|
return ret.RecordId
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
export { DnsProviderFactory } from './dns-provider/dns-provider-factory'
|
|
@ -31,17 +31,4 @@ describe('AliyunDnsProvider', function () {
|
||||||
console.log('recordId', recordId)
|
console.log('recordId', recordId)
|
||||||
expect(recordId != null).ok
|
expect(recordId != null).ok
|
||||||
})
|
})
|
||||||
|
|
||||||
it('#申请证书-aliyun', async function () {
|
|
||||||
this.timeout(300000)
|
|
||||||
const options = createOptions()
|
|
||||||
options.args = { forceCert: true, test: false }
|
|
||||||
const certd = new Certd(options)
|
|
||||||
const cert = await certd.certApply()
|
|
||||||
expect(cert).ok
|
|
||||||
expect(cert.crt).ok
|
|
||||||
expect(cert.key).ok
|
|
||||||
expect(cert.detail).ok
|
|
||||||
expect(cert.expires).ok
|
|
||||||
})
|
|
||||||
})
|
})
|
|
@ -21,19 +21,4 @@ describe('DnspodDnsProvider', function () {
|
||||||
|
|
||||||
await dnsProvider.removeRecord({ fullRecord: '___certd___.__test__.certd.xyz', type: 'TXT', value: 'aaaa', record })
|
await dnsProvider.removeRecord({ fullRecord: '___certd___.__test__.certd.xyz', type: 'TXT', value: 'aaaa', record })
|
||||||
})
|
})
|
||||||
|
|
||||||
it('#申请证书', async function () {
|
|
||||||
this.timeout(300000)
|
|
||||||
const options = createOptions()
|
|
||||||
options.cert.domains = ['*.certd.xyz', '*.test.certd.xyz', '*.base.certd.xyz']
|
|
||||||
options.cert.dnsProvider = 'dnspod'
|
|
||||||
options.args = { forceCert: true }
|
|
||||||
const certd = new Certd(options)
|
|
||||||
const cert = await certd.certApply()
|
|
||||||
expect(cert).ok
|
|
||||||
expect(cert.crt).ok
|
|
||||||
expect(cert.key).ok
|
|
||||||
expect(cert.detail).ok
|
|
||||||
expect(cert.expires).ok
|
|
||||||
})
|
|
||||||
})
|
})
|
Loading…
Reference in New Issue