Files
certd/packages/ui/certd-server/src/plugins/plugin-jdcloud/dns-provider.ts
T

98 lines
2.9 KiB
TypeScript
Raw Normal View History

2025-04-02 23:13:55 +08:00
import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from "@certd/plugin-cert";
import { JDCloudAccess } from "./access.js";
@IsDnsProvider({
name: "jdcloud",
title: "京东云",
desc: "京东云DNS解析提供商",
accessType: "jdcloud",
2025-08-25 16:19:37 +08:00
icon: "svg:icon-jdcloud",
order:3,
2025-04-02 23:13:55 +08:00
})
export class JDCloudDnsProvider extends AbstractDnsProvider {
access!: JDCloudAccess;
async onInstance() {
2025-04-28 21:55:23 +08:00
this.access = this.ctx.access as JDCloudAccess
2025-04-02 23:13:55 +08:00
}
async createRecord(options: CreateRecordOptions): Promise<any> {
const { fullRecord, hostRecord, value, type, domain } = options;
this.logger.info("添加域名解析:", fullRecord, value, domain);
const service = await this.getJDDomainService();
const domainRes = await service.describeDomains({
domainName: domain,
pageNumber: 1,
pageSize: 10
})
if (!domainRes.result?.dataList?.length) {
throw new Error(`域名${domain}在此京东云账号中不存在`)
}
const domainId = domainRes.result.dataList[0].id
this.logger.info("域名ID", domainId)
/**
* hostRecord String True 主机记录
* hostValue String True 解析记录的值
* jcloudRes Boolean False 是否是京东云资源
* mxPriority Integer False 优先级,只存在于MX, SRV解析记录类型
* port Integer False 端口,只存在于SRV解析记录类型
* ttl Integer True 解析记录的生存时间,单位:秒
* type String True 解析的类型,请参考解析记录类型详解
* weight Integer False 解析记录的权重,目前支持权重的有:A/AAAA/CNAME/JNAMEA/AAAA权重范围:0-100、CNAME/JNAME权重范围:1-100。
* viewValue Integer True 解析线路的ID,请调用describeViewTree接口获取基础解
*/
try{
const res = await service.createResourceRecord({
domainId: domainId,
req:{
hostRecord: hostRecord,
hostValue: value,
type: type,
ttl: 100,
}
})
return {
recordId: res.result.dataList[0].id,
domainId: domainId
};
}catch (e) {
this.logger.error(e)
throw e
}
}
async removeRecord(options: RemoveRecordOptions<any>): Promise<any> {
const record = options.recordRes;
const service = await this.getJDDomainService();
await service.deleteResourceRecord({
domainId: record.domainId,
resourceRecordId: record.recordId
})
}
private async getJDDomainService() {
const {JDDomainService} = await import("@certd/jdcloud")
const service = new JDDomainService({
credentials: {
accessKeyId: this.access.accessKeyId,
secretAccessKey: this.access.secretAccessKey
},
regionId: "cn-north-1" //地域信息,某个api调用可以单独传参regionId,如果不传则会使用此配置中的regionId
});
return service;
}
}
new JDCloudDnsProvider();