Skip to content

Commit 27c02b6

Browse files
committed
Update.
1 parent fa4a0d5 commit 27c02b6

File tree

3 files changed

+91
-22
lines changed

3 files changed

+91
-22
lines changed

pkg/ddns/ddns.go

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,35 @@ func InitDNSServers(s string) {
5050

5151
func (provider *Provider) UpdateDomain(ctx context.Context) {
5252
provider.ctx = ctx
53+
54+
// 验证必要的配置
55+
if len(provider.DDNSProfile.Domains) == 0 {
56+
log.Printf("DDNS配置错误: 没有配置域名")
57+
return
58+
}
59+
60+
if provider.IPAddrs == nil {
61+
log.Printf("DDNS配置错误: IP地址为空")
62+
return
63+
}
64+
5365
for _, domain := range provider.DDNSProfile.Domains {
54-
for retries := 0; retries < int(provider.DDNSProfile.MaxRetries); retries++ {
66+
maxRetries := int(provider.DDNSProfile.MaxRetries)
67+
if maxRetries == 0 {
68+
maxRetries = 3 // 默认重试3次
69+
}
70+
71+
for retries := 0; retries < maxRetries; retries++ {
5572
provider.domain = domain
56-
log.Printf("NG>> 正在尝试更新域名(%s)DDNS(%d/%d)", provider.domain, retries+1, provider.DDNSProfile.MaxRetries)
73+
log.Printf("正在尝试更新域名(%s)DDNS(%d/%d)", provider.domain, retries+1, maxRetries)
5774
if err := provider.updateDomain(); err != nil {
58-
log.Printf("NG>> 尝试更新域名(%s)DDNS失败: %v", provider.domain, err)
75+
log.Printf("尝试更新域名(%s)DDNS失败: %v", provider.domain, err)
76+
if retries < maxRetries-1 {
77+
// 等待一段时间后重试
78+
time.Sleep(time.Duration(retries+1) * 5 * time.Second)
79+
}
5980
} else {
60-
log.Printf("NG>> 尝试更新域名(%s)DDNS成功", provider.domain)
81+
log.Printf("更新域名(%s)DDNS成功", provider.domain)
6182
break
6283
}
6384
}
@@ -102,8 +123,15 @@ func (provider *Provider) addDomainRecord() error {
102123

103124
// 检查IP是否实际发生了变化
104125
if currentIP != "" && currentIP == provider.ipAddr {
105-
log.Printf("域名 %s 的 %s 记录IP未发生变化 (%s),跳过更新", provider.domain, provider.recordType, currentIP)
106-
return nil // IP没有变化,不需要更新
126+
// IP没有变化,不需要更新(减少日志输出)
127+
return nil
128+
}
129+
130+
// 记录IP变化信息
131+
if currentIP != "" {
132+
log.Printf("域名 %s 的 %s 记录IP发生变化: %s -> %s", provider.domain, provider.recordType, currentIP, provider.ipAddr)
133+
} else {
134+
log.Printf("域名 %s 设置 %s 记录IP: %s", provider.domain, provider.recordType, provider.ipAddr)
107135
}
108136

109137
_, err = provider.Setter.SetRecords(provider.ctx, provider.zone,

service/rpc/server.go

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -765,23 +765,42 @@ func (s *ServerHandler) ReportSystemInfo(c context.Context, r *pb.Host) (*pb.Rec
765765
defer singleton.ServerLock.RUnlock()
766766

767767
// 检查并更新DDNS
768-
if singleton.ServerList[clientID].EnableDDNS && host.IP != "" &&
769-
(singleton.ServerList[clientID].Host == nil || singleton.ServerList[clientID].Host.IP != host.IP) {
770-
ipv4, ipv6, _ := utils.SplitIPAddr(host.IP)
771-
providers, err := singleton.GetDDNSProvidersFromProfilesWithServer(
772-
singleton.ServerList[clientID].DDNSProfiles,
773-
&ddns.IP{Ipv4Addr: ipv4, Ipv6Addr: ipv6},
774-
singleton.ServerList[clientID].Name,
775-
clientID,
776-
)
777-
if err == nil {
778-
for _, provider := range providers {
779-
go func(provider *ddns.Provider) {
780-
provider.UpdateDomain(context.Background())
781-
}(provider)
782-
}
768+
server := singleton.ServerList[clientID]
769+
if server.EnableDDNS {
770+
if host.IP == "" {
771+
log.Printf("服务器 %s (ID:%d) DDNS已启用但IP为空,跳过更新", server.Name, clientID)
772+
} else if len(server.DDNSProfiles) == 0 {
773+
log.Printf("服务器 %s (ID:%d) DDNS已启用但未配置DDNS配置文件", server.Name, clientID)
774+
} else if server.Host != nil && server.Host.IP == host.IP {
775+
// IP 没有变化,跳过更新(但不记录日志,避免频繁输出)
783776
} else {
784-
log.Printf("获取DDNS配置时发生错误: %v", err)
777+
// IP 发生变化或首次设置,触发 DDNS 更新
778+
ipv4, ipv6, _ := utils.SplitIPAddr(host.IP)
779+
providers, err := singleton.GetDDNSProvidersFromProfilesWithServer(
780+
server.DDNSProfiles,
781+
&ddns.IP{Ipv4Addr: ipv4, Ipv6Addr: ipv6},
782+
server.Name,
783+
clientID,
784+
)
785+
if err == nil {
786+
log.Printf("服务器 %s (ID:%d) IP变化 (%s -> %s),触发DDNS更新,配置数量: %d",
787+
server.Name, clientID,
788+
func() string {
789+
if server.Host != nil {
790+
return server.Host.IP
791+
} else {
792+
return "无"
793+
}
794+
}(),
795+
host.IP, len(providers))
796+
for _, provider := range providers {
797+
go func(provider *ddns.Provider) {
798+
provider.UpdateDomain(context.Background())
799+
}(provider)
800+
}
801+
} else {
802+
log.Printf("服务器 %s (ID:%d) 获取DDNS配置时发生错误: %v", server.Name, clientID, err)
803+
}
785804
}
786805
}
787806

service/singleton/ddns.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package singleton
33
import (
44
"fmt"
55
"log"
6+
"strings"
67
"sync"
78
"time"
89

@@ -23,8 +24,16 @@ var (
2324
)
2425

2526
func initDDNS() {
27+
log.Printf("初始化DDNS配置...")
2628
OnDDNSUpdate()
2729
OnNameserverUpdate()
30+
31+
// 验证DDNS配置加载情况
32+
ddnsCacheLock.RLock()
33+
configCount := len(ddnsCache)
34+
ddnsCacheLock.RUnlock()
35+
36+
log.Printf("DDNS初始化完成,加载了 %d 个配置", configCount)
2837
}
2938

3039
func OnDDNSUpdate() {
@@ -55,6 +64,10 @@ func OnDDNSUpdate() {
5564
defer ddnsCacheLock.Unlock()
5665
ddnsCache = make(map[uint64]*model.DDNSProfile)
5766
for i := 0; i < len(ddns); i++ {
67+
// 确保 BadgerDB 模式下 Domains 字段正确解析
68+
if ddns[i].DomainsRaw != "" && len(ddns[i].Domains) == 0 {
69+
ddns[i].Domains = strings.Split(ddns[i].DomainsRaw, ",")
70+
}
5871
ddnsCache[ddns[i].ID] = ddns[i]
5972
}
6073
}
@@ -68,6 +81,11 @@ func GetDDNSProvidersFromProfiles(profileId []uint64, ip *ddns2.IP) ([]*ddns2.Pr
6881
ddnsCacheLock.RLock()
6982
for _, id := range profileId {
7083
if profile, ok := ddnsCache[id]; ok {
84+
// 验证 DDNS 配置的完整性
85+
if len(profile.Domains) == 0 {
86+
log.Printf("警告: DDNS配置 ID %d 没有配置域名", id)
87+
continue
88+
}
7189
profiles = append(profiles, profile)
7290
} else {
7391
ddnsCacheLock.RUnlock()
@@ -76,6 +94,10 @@ func GetDDNSProvidersFromProfiles(profileId []uint64, ip *ddns2.IP) ([]*ddns2.Pr
7694
}
7795
ddnsCacheLock.RUnlock()
7896

97+
if len(profiles) == 0 {
98+
return nil, fmt.Errorf("没有有效的DDNS配置")
99+
}
100+
79101
providers := make([]*ddns2.Provider, 0, len(profiles))
80102
for _, profile := range profiles {
81103
provider := &ddns2.Provider{DDNSProfile: profile, IPAddrs: ip}

0 commit comments

Comments
 (0)