2024-05-27 18:38:41 +08:00
|
|
|
import _ from 'lodash';
|
|
|
|
|
import {
|
|
|
|
|
CreateRecordOptions,
|
|
|
|
|
IDnsProvider,
|
|
|
|
|
IsDnsProvider,
|
|
|
|
|
RemoveRecordOptions,
|
|
|
|
|
} from '@certd/plugin-cert';
|
|
|
|
|
import { Autowire, ILogger } from '@certd/pipeline';
|
|
|
|
|
import { DemoAccess } from './access';
|
2024-03-22 00:50:02 +08:00
|
|
|
|
|
|
|
|
// TODO 这里注册一个dnsProvider
|
|
|
|
|
@IsDnsProvider({
|
2024-06-11 01:55:29 +08:00
|
|
|
name: 'demo',
|
2024-05-27 18:38:41 +08:00
|
|
|
title: 'Dns提供商Demo',
|
2024-06-11 01:55:29 +08:00
|
|
|
desc: 'dns provider示例',
|
|
|
|
|
accessType: 'demo', //这里是对应的access name
|
2024-03-22 00:50:02 +08:00
|
|
|
})
|
|
|
|
|
export class DemoDnsProvider implements IDnsProvider {
|
|
|
|
|
@Autowire()
|
|
|
|
|
access!: DemoAccess;
|
|
|
|
|
@Autowire()
|
|
|
|
|
logger!: ILogger;
|
|
|
|
|
|
|
|
|
|
async onInstance() {
|
|
|
|
|
const access: any = this.access;
|
2024-05-27 18:38:41 +08:00
|
|
|
this.logger.debug('access', access);
|
2024-03-22 00:50:02 +08:00
|
|
|
//初始化的操作
|
|
|
|
|
//...
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-27 18:38:41 +08:00
|
|
|
async getDomainList(): Promise<any[]> {
|
2024-03-22 00:50:02 +08:00
|
|
|
// TODO 这里你要实现一个获取域名列表的方法
|
2024-05-27 18:38:41 +08:00
|
|
|
const access = this.access;
|
|
|
|
|
this.logger.debug('access', access);
|
|
|
|
|
return [];
|
2024-03-22 00:50:02 +08:00
|
|
|
}
|
|
|
|
|
|
2024-05-27 18:38:41 +08:00
|
|
|
async matchDomain(dnsRecord: string): Promise<any> {
|
2024-03-22 00:50:02 +08:00
|
|
|
const domainList = await this.getDomainList();
|
|
|
|
|
let domainRecord = null;
|
|
|
|
|
for (const item of domainList) {
|
|
|
|
|
//TODO 根据域名去匹配账户中是否有该域名, 这里不一定是item.name 具体要看你要实现的平台的接口而定
|
2024-05-27 18:38:41 +08:00
|
|
|
if (_.endsWith(dnsRecord + '.', item.name)) {
|
2024-03-22 00:50:02 +08:00
|
|
|
domainRecord = item;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!domainRecord) {
|
2024-05-27 18:38:41 +08:00
|
|
|
this.logger.info('账户中域名列表:', domainList);
|
|
|
|
|
this.logger.error('找不到域名,请确认账户中是否真的有此域名');
|
|
|
|
|
throw new Error('can not find Domain:' + dnsRecord);
|
2024-03-22 00:50:02 +08:00
|
|
|
}
|
|
|
|
|
return domainRecord;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async createRecord(options: CreateRecordOptions): Promise<any> {
|
|
|
|
|
const { fullRecord, value, type } = options;
|
2024-05-27 18:38:41 +08:00
|
|
|
this.logger.info('添加域名解析:', fullRecord, value, type);
|
2024-03-22 00:50:02 +08:00
|
|
|
//先确定账户中是否有该域名
|
|
|
|
|
const domainRecord = await this.matchDomain(fullRecord);
|
2024-05-27 18:38:41 +08:00
|
|
|
this.logger.debug('matchDomain:', domainRecord);
|
2024-03-22 00:50:02 +08:00
|
|
|
//TODO 然后调用接口,创建txt类型的dns解析记录
|
|
|
|
|
// .. 这里调用对应平台的后台接口
|
2024-05-27 18:38:41 +08:00
|
|
|
const access = this.access;
|
|
|
|
|
this.logger.debug('access', access);
|
2024-03-22 00:50:02 +08:00
|
|
|
}
|
|
|
|
|
async removeRecord(options: RemoveRecordOptions): Promise<any> {
|
|
|
|
|
const { fullRecord, value, record } = options;
|
2024-05-27 18:38:41 +08:00
|
|
|
this.logger.info('删除域名解析:', fullRecord, value, record);
|
2024-03-22 00:50:02 +08:00
|
|
|
//TODO 这里调用删除txt dns解析记录接口
|
2024-05-27 18:38:41 +08:00
|
|
|
const access = this.access;
|
|
|
|
|
this.logger.debug('access', access);
|
|
|
|
|
this.logger.info('删除域名解析成功:', fullRecord, value);
|
2024-03-22 00:50:02 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//TODO 实例化这个provider,将其自动注册到系统中
|
|
|
|
|
new DemoDnsProvider();
|