mirror of
https://github.com/qingchencloud/cftunnel.git
synced 2026-08-28 18:20:34 +08:00
fix(add): DNS 记录已存在时自动更新而非报错 (close #15)
This commit is contained in:
+19
-3
@@ -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,
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user