fix(add): DNS 记录已存在时自动更新而非报错 (close #15)

This commit is contained in:
晴天
2026-03-02 11:43:15 +08:00
parent 94e65b9211
commit 963537ef40
2 changed files with 56 additions and 3 deletions
+19 -3
View File
@@ -73,14 +73,30 @@ var addCmd = &cobra.Command{
return err
}
// 创建 CNAME
// 检查 DNS 记录是否已存在
target := cfg.Tunnel.ID + ".cfargotunnel.com"
fmt.Printf("正在创建 DNS 记录 %s → %s\n", addDomain, target)
recordID, err := client.CreateCNAME(ctx, zone.ID, addDomain, target)
existingRecordID, err := client.FindDNSRecord(ctx, zone.ID, addDomain)
if err != nil {
return err
}
var recordID string
if existingRecordID != "" {
// 记录已存在,更新
fmt.Printf("DNS 记录已存在,正在更新 %s → %s\n", addDomain, target)
if err := client.UpdateCNAME(ctx, zone.ID, existingRecordID, addDomain, target); err != nil {
return err
}
recordID = existingRecordID
} else {
// 记录不存在,创建
fmt.Printf("正在创建 DNS 记录 %s → %s\n", addDomain, target)
recordID, err = client.CreateCNAME(ctx, zone.ID, addDomain, target)
if err != nil {
return err
}
}
// 构建路由配置
route := config.RouteConfig{
Name: name,
+37
View File
@@ -36,3 +36,40 @@ func (c *Client) DeleteDNSRecord(ctx context.Context, zoneID, recordID string) e
}
return nil
}
// FindDNSRecord 查找指定域名的 DNS 记录
func (c *Client) FindDNSRecord(ctx context.Context, zoneID, name string) (string, error) {
records, err := c.api.DNS.Records.List(ctx, dns.RecordListParams{
ZoneID: cf.F(zoneID),
Name: cf.F(dns.RecordListParamsName{
Exact: cf.F(name),
}),
})
if err != nil {
return "", fmt.Errorf("查询 DNS 记录失败: %w", err)
}
for _, r := range records.Result {
if r.Name == name {
return r.ID, nil
}
}
return "", nil // 未找到
}
// UpdateCNAME 更新 CNAME 记录
func (c *Client) UpdateCNAME(ctx context.Context, zoneID, recordID, name, target string) error {
_, err := c.api.DNS.Records.Update(ctx, recordID, dns.RecordUpdateParams{
ZoneID: cf.F(zoneID),
Body: dns.CNAMERecordParam{
Name: cf.F(name),
Content: cf.F(target),
Type: cf.F(dns.CNAMERecordTypeCNAME),
TTL: cf.F(dns.TTL(1)),
Proxied: cf.F(true),
},
})
if err != nil {
return fmt.Errorf("更新 CNAME 记录失败: %w", err)
}
return nil
}