mirror of https://github.com/certd/certd
				
				
				
			perf: 抽取api
							parent
							
								
									f07ce6f47d
								
							
						
					
					
						commit
						5312c11472
					
				| 
						 | 
				
			
			@ -5,3 +5,4 @@ out
 | 
			
		|||
gen
 | 
			
		||||
node_modules/
 | 
			
		||||
/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'
 | 
			
		||||
export class DnsProvider {
 | 
			
		||||
import _ from 'lodash-es'
 | 
			
		||||
import logger from '../utils/util.log.js'
 | 
			
		||||
export class AbstractDnsProvider {
 | 
			
		||||
  constructor () {
 | 
			
		||||
    this.logger = logger
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async createRecord ({ fullRecord, type, value }) {
 | 
			
		||||
    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",
 | 
			
		||||
  "license": "MIT",
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@alicloud/pop-core": "^1.7.10",
 | 
			
		||||
    "@certd/api": "^0.1.2",
 | 
			
		||||
    "@certd/providers": "^0.1.2",
 | 
			
		||||
    "@certd/acme-client": "^0.1.1",
 | 
			
		||||
    "@types/node": "^14.14.13",
 | 
			
		||||
    "axios": "^0.21.1",
 | 
			
		||||
    "dayjs": "^1.9.7",
 | 
			
		||||
    "lodash": "^4.17.20",
 | 
			
		||||
    "log4js": "^6.3.0",
 | 
			
		||||
    "node-forge": "^0.10.0",
 | 
			
		||||
    "qs": "^6.9.4",
 | 
			
		||||
    "tencentcloud-sdk-nodejs": "^4.0.44"
 | 
			
		||||
    "lodash-es": "^4.17.20"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "chai": "^4.2.0",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
import log from './utils/util.log.js'
 | 
			
		||||
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 {
 | 
			
		||||
  constructor (store) {
 | 
			
		||||
    this.store = store
 | 
			
		||||
| 
						 | 
				
			
			@ -57,27 +58,27 @@ export class AcmeService {
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  async challengeCreateFn (authz, challenge, keyAuthorization, dnsProvider) {
 | 
			
		||||
    log.info('Triggered challengeCreateFn()')
 | 
			
		||||
    logger.info('Triggered challengeCreateFn()')
 | 
			
		||||
 | 
			
		||||
    /* http-01 */
 | 
			
		||||
    if (challenge.type === 'http-01') {
 | 
			
		||||
      const filePath = `/var/www/html/.well-known/acme-challenge/${challenge.token}`
 | 
			
		||||
      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 */
 | 
			
		||||
      log.info(`Would write "${fileContents}" to path "${filePath}"`)
 | 
			
		||||
      logger.info(`Would write "${fileContents}" to path "${filePath}"`)
 | 
			
		||||
      // await fs.writeFileAsync(filePath, fileContents);
 | 
			
		||||
    } else if (challenge.type === 'dns-01') {
 | 
			
		||||
      /* dns-01 */
 | 
			
		||||
      const dnsRecord = `_acme-challenge.${authz.identifier.value}`
 | 
			
		||||
      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 */
 | 
			
		||||
      log.info(`Would create TXT record "${dnsRecord}" with value "${recordValue}"`)
 | 
			
		||||
      logger.info(`Would create TXT record "${dnsRecord}" with value "${recordValue}"`)
 | 
			
		||||
 | 
			
		||||
      return await dnsProvider.createRecord({
 | 
			
		||||
        fullRecord: dnsRecord,
 | 
			
		||||
| 
						 | 
				
			
			@ -99,25 +100,25 @@ export class AcmeService {
 | 
			
		|||
   */
 | 
			
		||||
 | 
			
		||||
  async challengeRemoveFn (authz, challenge, keyAuthorization, recordItem, dnsProvider) {
 | 
			
		||||
    log.info('Triggered challengeRemoveFn()')
 | 
			
		||||
    logger.info('Triggered challengeRemoveFn()')
 | 
			
		||||
 | 
			
		||||
    /* http-01 */
 | 
			
		||||
    if (challenge.type === 'http-01') {
 | 
			
		||||
      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 */
 | 
			
		||||
      log.info(`Would remove file on path "${filePath}"`)
 | 
			
		||||
      logger.info(`Would remove file on path "${filePath}"`)
 | 
			
		||||
      // await fs.unlinkAsync(filePath);
 | 
			
		||||
    } else if (challenge.type === 'dns-01') {
 | 
			
		||||
      const dnsRecord = `_acme-challenge.${authz.identifier.value}`
 | 
			
		||||
      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 */
 | 
			
		||||
      log.info(`Would remove TXT record "${dnsRecord}" with value "${recordValue}"`)
 | 
			
		||||
      logger.info(`Would remove TXT record "${dnsRecord}" with value "${recordValue}"`)
 | 
			
		||||
      await dnsProvider.removeRecord({
 | 
			
		||||
        fullRecord: dnsRecord,
 | 
			
		||||
        type: 'TXT',
 | 
			
		||||
| 
						 | 
				
			
			@ -170,13 +171,13 @@ export class AcmeService {
 | 
			
		|||
        accountUrl = client.getAccountUrl()
 | 
			
		||||
        this.setAccountUrl(email, accountUrl)
 | 
			
		||||
      } catch (e) {
 | 
			
		||||
        log.warn('保存accountUrl出错', e)
 | 
			
		||||
        logger.warn('保存accountUrl出错', e)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    /* Done */
 | 
			
		||||
    log.debug(`CSR:\n${csr.toString()}`)
 | 
			
		||||
    log.debug(`Certificate:\n${crt.toString()}`)
 | 
			
		||||
    log.info('证书申请成功')
 | 
			
		||||
    logger.debug(`CSR:\n${csr.toString()}`)
 | 
			
		||||
    logger.debug(`Certificate:\n${crt.toString()}`)
 | 
			
		||||
    logger.info('证书申请成功')
 | 
			
		||||
    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 { FileStore } from './store/impl/file-store.js'
 | 
			
		||||
import { Store } from './store/store.js'
 | 
			
		||||
import { FileStore } from './store/file-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 forge from 'node-forge'
 | 
			
		||||
 | 
			
		||||
const logger = util.logger
 | 
			
		||||
export class Certd {
 | 
			
		||||
  constructor (options) {
 | 
			
		||||
    this.options = options
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,7 @@
 | 
			
		|||
import { Store } from '../store.js'
 | 
			
		||||
import util from '../../utils/util.js'
 | 
			
		||||
import { Store, util } from '@certd/api'
 | 
			
		||||
import path from 'path'
 | 
			
		||||
import fs from 'fs'
 | 
			
		||||
import logger from '../../utils/util.log.js'
 | 
			
		||||
 | 
			
		||||
const logger = util.logger
 | 
			
		||||
export class FileStore extends Store {
 | 
			
		||||
  constructor (opts) {
 | 
			
		||||
    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
 | 
			
		||||
AHxTaXliTVvS83dogw==
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIEqzCCApOgAwIBAgIRAIvhKg5ZRO08VGQx8JdhT+UwDQYJKoZIhvcNAQELBQAw
 | 
			
		||||
GjEYMBYGA1UEAwwPRmFrZSBMRSBSb290IFgxMB4XDTE2MDUyMzIyMDc1OVoXDTM2
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,10 +13,7 @@
 | 
			
		|||
  "dependencies": {
 | 
			
		||||
    "@certd/certd": "^0.1.2",
 | 
			
		||||
    "@certd/plugins": "^0.1.2",
 | 
			
		||||
    "@types/node": "^14.14.13",
 | 
			
		||||
    "dayjs": "^1.9.8",
 | 
			
		||||
    "lodash": "^4.17.20",
 | 
			
		||||
    "log4js": "^6.3.0"
 | 
			
		||||
    "lodash-es": "^4.17.20"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@rollup/plugin-commonjs": "^17.0.0",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,10 @@
 | 
			
		|||
import { Certd } from '@certd/certd'
 | 
			
		||||
import DefaultPlugins from '@certd/plugins'
 | 
			
		||||
import logger from './util.log.js'
 | 
			
		||||
import _ from 'lodash'
 | 
			
		||||
import { util } from '@certd/api'
 | 
			
		||||
import _ from 'lodash-es'
 | 
			
		||||
import dayjs from 'dayjs'
 | 
			
		||||
import { Trace } from './trace.js'
 | 
			
		||||
const logger = util.logger
 | 
			
		||||
export class Executor {
 | 
			
		||||
  constructor (args = {}) {
 | 
			
		||||
    const { plugins } = args
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
import logger from './util.log.js'
 | 
			
		||||
import _ from 'lodash'
 | 
			
		||||
import { util } from '@certd/api'
 | 
			
		||||
import _ from 'lodash-es'
 | 
			
		||||
const logger = util.logger
 | 
			
		||||
export class Trace {
 | 
			
		||||
  constructor (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",
 | 
			
		||||
    "@certd/certd": "^0.1.1",
 | 
			
		||||
    "@types/node": "^14.14.13",
 | 
			
		||||
    "dayjs": "^1.9.7",
 | 
			
		||||
    "kubernetes-client": "^9.0.0",
 | 
			
		||||
    "lodash": "^4.17.20",
 | 
			
		||||
    "log4js": "^6.3.0",
 | 
			
		||||
    "lodash-es": "^4.17.20",
 | 
			
		||||
    "ssh2": "^0.8.9",
 | 
			
		||||
    "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 {
 | 
			
		||||
  checkRet (ret) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
import { AbstractPlugin } from '../abstract-plugin/index.js'
 | 
			
		||||
import { AbstractPlugin } from '@certd/api'
 | 
			
		||||
 | 
			
		||||
export class AbstractHostPlugin extends AbstractPlugin {
 | 
			
		||||
  checkRet (ret) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
import { AbstractPlugin } from '../abstract-plugin/index.js'
 | 
			
		||||
import { AbstractPlugin } from '@certd/api'
 | 
			
		||||
 | 
			
		||||
export class AbstractTencentPlugin extends AbstractPlugin {
 | 
			
		||||
  checkRet (ret) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,8 @@
 | 
			
		|||
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'
 | 
			
		||||
const { KubeConfig, Client } = kubernetesClient
 | 
			
		||||
const logger = util.logger
 | 
			
		||||
export class K8sClient {
 | 
			
		||||
  constructor (kubeConfigStr) {
 | 
			
		||||
    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'
 | 
			
		||||
const defaultOptions = {
 | 
			
		||||
  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 _ from 'lodash'
 | 
			
		||||
import log from '../../utils/util.log.js'
 | 
			
		||||
import { request } from '../../utils/util.request.js'
 | 
			
		||||
export default class DnspodDnsProvider extends DnsProvider {
 | 
			
		||||
import { AbstractDnsProvider, util } from '@certd/api'
 | 
			
		||||
import _ from 'lodash-es'
 | 
			
		||||
const request = util.request
 | 
			
		||||
export default class DnspodDnsProvider extends AbstractDnsProvider {
 | 
			
		||||
  constructor (dnsProviderConfig) {
 | 
			
		||||
    super()
 | 
			
		||||
    if (!dnsProviderConfig.id || !dnsProviderConfig.token) {
 | 
			
		||||
| 
						 | 
				
			
			@ -35,12 +34,12 @@ export default class DnspodDnsProvider extends DnsProvider {
 | 
			
		|||
    const ret = await this.doRequest({
 | 
			
		||||
      url: 'https://dnsapi.cn/Domain.List'
 | 
			
		||||
    })
 | 
			
		||||
    log.debug('dnspod 域名列表:', ret.domains)
 | 
			
		||||
    this.logger.debug('dnspod 域名列表:', ret.domains)
 | 
			
		||||
    return ret.domains
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async createRecord ({ fullRecord, type, value }) {
 | 
			
		||||
    log.info('添加域名解析:', fullRecord, value)
 | 
			
		||||
    this.logger.info('添加域名解析:', fullRecord, value)
 | 
			
		||||
    const domainItem = await this.matchDomain(fullRecord, 'name')
 | 
			
		||||
    const domain = domainItem.name
 | 
			
		||||
    const rr = fullRecord.replace('.' + domain, '')
 | 
			
		||||
| 
						 | 
				
			
			@ -56,7 +55,7 @@ export default class DnspodDnsProvider extends DnsProvider {
 | 
			
		|||
        mx: 1
 | 
			
		||||
      }
 | 
			
		||||
    })
 | 
			
		||||
    log.info('添加域名解析成功:', fullRecord, value, JSON.stringify(ret.record))
 | 
			
		||||
    this.logger.info('添加域名解析成功:', fullRecord, value, JSON.stringify(ret.record))
 | 
			
		||||
    return ret.record
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -70,7 +69,7 @@ export default class DnspodDnsProvider extends DnsProvider {
 | 
			
		|||
        record_id: record.id
 | 
			
		||||
      }
 | 
			
		||||
    })
 | 
			
		||||
    log.info('删除域名解析成功:', fullRecord, value)
 | 
			
		||||
    this.logger.info('删除域名解析成功:', fullRecord, value)
 | 
			
		||||
    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)
 | 
			
		||||
    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 })
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  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