Files
certd/packages/plugins/plugin-tencent/src/dns-provider/dnspod-dns-provider.ts
T

118 lines
3.2 KiB
TypeScript
Raw Normal View History

2023-01-11 20:39:48 +08:00
import { Autowire, HttpClient, ILogger } from "@certd/pipeline";
import { CreateRecordOptions, IDnsProvider, IsDnsProvider, RemoveRecordOptions } from "@certd/plugin-cert";
2022-11-07 23:31:20 +08:00
import _ from "lodash";
import { DnspodAccess } from "../access";
@IsDnsProvider({
name: "dnspod",
title: "dnspod(腾讯云)",
desc: "腾讯云的域名解析接口已迁移到dnspod",
accessType: "dnspod",
})
2022-12-27 12:32:09 +08:00
export class DnspodDnsProvider implements IDnsProvider {
2023-01-11 20:39:48 +08:00
@Autowire()
2022-12-27 12:32:09 +08:00
http!: HttpClient;
2023-01-11 20:39:48 +08:00
@Autowire()
2022-12-27 12:32:09 +08:00
access!: DnspodAccess;
2023-01-11 20:39:48 +08:00
@Autowire()
2022-12-27 12:32:09 +08:00
logger!: ILogger;
2022-11-07 23:31:20 +08:00
loginToken: any;
2022-12-27 12:32:09 +08:00
endpoint = "";
2023-05-09 10:16:49 +08:00
async onInstance() {
2022-11-07 23:31:20 +08:00
const access: DnspodAccess = this.access as DnspodAccess;
this.loginToken = access.id + "," + access.token;
this.endpoint = access.endpoint || "https://dnsapi.cn";
2022-11-07 23:31:20 +08:00
}
async doRequest(options: any, successCodes: string[] = []) {
const config: any = {
// @ts-ignore
method: "post",
formData: {
login_token: this.loginToken,
format: "json",
lang: "cn",
error_on_empty: "no",
},
timeout: 5000,
};
_.merge(config, options);
const ret: any = await this.http.request(config);
if (!ret || !ret.status) {
const code = ret.status.code;
if (code !== "1" || !successCodes.includes(code)) {
throw new Error("请求失败:" + ret.status.message + ",api=" + config.url);
}
}
return ret;
}
async getDomainList() {
const ret = await this.doRequest({
url: this.access.endpoint + "/Domain.List",
2022-11-07 23:31:20 +08:00
});
this.logger.debug("dnspod 域名列表:", ret.domains);
return ret.domains;
}
async createRecord(options: CreateRecordOptions): Promise<any> {
const { fullRecord, value, type } = options;
this.logger.info("添加域名解析:", fullRecord, value);
const domainItem = await this.matchDomain(fullRecord);
const domain = domainItem.name;
const rr = fullRecord.replace("." + domain, "");
const ret = await this.doRequest(
{
url: this.access.endpoint + "/Record.Create",
2022-11-07 23:31:20 +08:00
formData: {
domain,
sub_domain: rr,
record_type: type,
record_line: "默认",
value: value,
mx: 1,
},
},
["104"]
); // 104错误码为记录已存在,无需再次添加
this.logger.info("添加域名解析成功:", fullRecord, value, JSON.stringify(ret.record));
return ret.record;
}
async removeRecord(options: RemoveRecordOptions) {
const { fullRecord, value, record } = options;
const domain = await this.matchDomain(fullRecord);
const ret = await this.doRequest({
url: this.access.endpoint + "/Record.Remove",
2022-11-07 23:31:20 +08:00
formData: {
domain,
record_id: record.id,
},
});
this.logger.info("删除域名解析成功:", fullRecord, value);
return ret.RecordId;
}
async matchDomain(dnsRecord: any) {
const list = await this.getDomainList();
let domain = null;
for (const item of list) {
2023-10-09 16:50:02 +08:00
if (_.endsWith(dnsRecord, "." + item.name)) {
2022-11-07 23:31:20 +08:00
domain = item;
break;
}
}
if (!domain) {
throw new Error("找不到域名,请检查域名是否正确:" + dnsRecord);
}
return domain;
}
}
2023-05-09 09:56:31 +08:00
new DnspodDnsProvider();