mirror of
https://github.com/Buriburizaem0n/nezha_domains.git
synced 2026-11-05 00:50:21 +00:00
Update ddns.go
This commit is contained in:
1 parent
02fe54bb80
commit
19d959c60d
1 file changed
+10
-69
+10
-69
@@ -8,7 +8,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/libdns/he"
|
|
||||||
"github.com/libdns/libdns"
|
"github.com/libdns/libdns"
|
||||||
"github.com/miekg/dns"
|
"github.com/miekg/dns"
|
||||||
|
|
||||||
@@ -115,83 +114,25 @@ func (provider *Provider) addDomainRecord(ctx context.Context, prefix, zone, rec
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// deleteDomainRecord 用于安全删除指定类型的解析记录
|
|
||||||
func (provider *Provider) deleteDomainRecord(ctx context.Context, prefix, zone, recType string) error {
|
func (provider *Provider) deleteDomainRecord(ctx context.Context, prefix, zone, recType string) error {
|
||||||
targetRecType := strings.ToUpper(recType)
|
|
||||||
|
|
||||||
// 针对 HE 服务商使用标准的 libdns.RR
|
|
||||||
if _, ok := provider.Setter.(*he.Provider); ok {
|
|
||||||
deleter, okDeleter := provider.Setter.(libdns.RecordDeleter)
|
|
||||||
if !okDeleter {
|
|
||||||
return fmt.Errorf("he provider does not implement RecordDeleter")
|
|
||||||
}
|
|
||||||
_, err := deleter.DeleteRecords(ctx, zone, []libdns.Record{
|
|
||||||
libdns.RR{
|
|
||||||
Name: prefix,
|
|
||||||
Type: targetRecType,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 检查接口
|
|
||||||
getter, okGetter := provider.Setter.(libdns.RecordGetter)
|
|
||||||
deleter, okDeleter := provider.Setter.(libdns.RecordDeleter)
|
deleter, okDeleter := provider.Setter.(libdns.RecordDeleter)
|
||||||
|
if !okDeleter {
|
||||||
if !okGetter || !okDeleter {
|
log.Printf("NEZHA>> DNS provider does not support RecordDeleter, safely skipping deletion for %s", recType)
|
||||||
log.Printf("NEZHA>> DNS provider does not support record getting or deletion, safely skipping deletion for %s", recType)
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanName := func(name string) string {
|
targetRecType := strings.ToUpper(recType)
|
||||||
return strings.ToLower(strings.TrimSuffix(name, "."))
|
_, err := deleter.DeleteRecords(ctx, zone, []libdns.Record{
|
||||||
}
|
libdns.RR{
|
||||||
cleanPrefix := cleanName(prefix)
|
Name: prefix,
|
||||||
|
Type: targetRecType,
|
||||||
// 获取 DNS 记录(针对标准提供商,如 Cloudflare)
|
},
|
||||||
allRecords, err := getter.GetRecords(ctx, zone)
|
})
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to get DNS records: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanZone := cleanName(zone)
|
|
||||||
var targetRecords []libdns.Record
|
|
||||||
for _, rec := range allRecords {
|
|
||||||
rr := rec.RR()
|
|
||||||
if strings.ToUpper(rr.Type) != targetRecType {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
relName := libdns.RelativeName(rr.Name, zone)
|
|
||||||
cleanRel := cleanName(relName)
|
|
||||||
cleanRRName := cleanName(rr.Name)
|
|
||||||
|
|
||||||
isApex := cleanRel == "" || cleanRel == "@" || cleanRRName == cleanZone
|
|
||||||
|
|
||||||
var matchedName bool
|
|
||||||
if cleanPrefix == "" {
|
|
||||||
matchedName = isApex
|
|
||||||
} else {
|
|
||||||
matchedName = cleanRel == cleanPrefix || cleanRRName == cleanPrefix
|
|
||||||
}
|
|
||||||
|
|
||||||
if matchedName {
|
|
||||||
targetRecords = append(targetRecords, rec)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 若未找到对应记录(例如已经成功删除),则直接返回成功
|
|
||||||
if len(targetRecords) == 0 {
|
|
||||||
log.Printf("NEZHA>> No matching %s record found for deletion under zone %s, already clean", recType, zone)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = deleter.DeleteRecords(ctx, zone, targetRecords)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("deleter.DeleteRecords failed: %w", err)
|
return fmt.Errorf("deleter.DeleteRecords failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("NEZHA>> Successfully deleted %d matching %s record(s) for %s.%s", len(targetRecords), recType, prefix, zone)
|
log.Printf("NEZHA>> Successfully deleted %s record for %s.%s", recType, prefix, zone)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user