perf(technitium): 添加Technitium DNS Server插件支持

- 新增Technitium DNS Server插件,包含DNS提供商和授权配置
- 实现DNS记录创建、删除和域名列表获取功能
- 添加默认DNS传播等待时间配置
- 优化用户取消操作时的错误处理
- 为图标选择组件添加过滤功能
- 更新DNS提供商开发文档
This commit is contained in:
xiaojunnuo
2026-04-17 19:22:10 +08:00
parent 23b4658672
commit edeb817c39
14 changed files with 7863 additions and 13 deletions
@@ -0,0 +1,94 @@
import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert';
import { TechnitiumAccess } from "./access.js"
type TechnitiumRecord = {
// 记录创建时返回的数据结构
zone: {
name: string;
type: string;
internal: boolean;
dnssecStatus: string;
disabled: boolean;
};
addedRecord: {
disabled: boolean;
name: string;
type: string;
ttl: number;
rData: {
text: string;
};
dnssecStatus: string;
lastUsedOn: string;
};
};
// 注册Technitium DNS Server的DNS提供商
@IsDnsProvider({
name: 'technitium',
title: 'Technitium DNS Server',
desc: 'Technitium DNS Server 自建DNS服务器',
icon: 'clarity:server-line',
accessType: 'technitium',
order: 10,
})
export class TechnitiumDnsProvider extends AbstractDnsProvider<TechnitiumRecord> {
access!: TechnitiumAccess;
async onInstance() {
this.access = this.ctx.access as TechnitiumAccess;
this.logger.debug('access', this.access);
}
/**
* 创建DNS解析记录,用于验证域名所有权
*/
async createRecord(options: CreateRecordOptions): Promise<TechnitiumRecord> {
const { fullRecord, value, type, domain } = options;
this.logger.info('添加域名解析:', fullRecord, value, type, domain);
// 构建API URL
const apiUrl = `${this.access.apiUrl}/api/zones/records/add`;
// 构建查询参数
const params = new URLSearchParams({
domain: fullRecord,
type: type,
text: value,
});
// 调用Technitium API创建TXT记录
const response = await this.access.doRequest({ url: apiUrl, method: 'post', params: params });
this.logger.info('创建域名解析成功:', fullRecord, value);
return response as TechnitiumRecord;
}
/**
* 删除DNS解析记录,清理申请痕迹
*/
async removeRecord(options: RemoveRecordOptions<TechnitiumRecord>): Promise<void> {
const { fullRecord, value, domain } = options.recordReq;
const record = options.recordRes;
this.logger.info('删除域名解析:', domain, fullRecord, value, record);
// 构建API URL
const apiUrl = `${this.access.apiUrl}/api/zones/records/delete`;
// 构建查询参数
const params = new URLSearchParams({
domain: fullRecord,
type: 'TXT',
text: value,
});
// 调用Technitium API删除TXT记录
await this.access.doRequest({ url: apiUrl, method: 'post', params: params });
this.logger.info('删除域名解析成功:', fullRecord, value);
}
}
// 实例化这个provider,将其自动注册到系统中
new TechnitiumDnsProvider();