From 4ea966aedfc829cd5c8027128d115fe5e48e0b9d Mon Sep 17 00:00:00 2001 From: Cromefire_ Date: Sat, 20 Feb 2021 14:28:00 +0100 Subject: [PATCH 1/2] Added more resilient polling --- main.go | 18 +++++++++--------- pkg/cloudflare/updater.go | 19 ++++++++++++++++++- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/main.go b/main.go index d02e06f..bfaafd9 100644 --- a/main.go +++ b/main.go @@ -188,9 +188,9 @@ func startPollServer(out chan<- *net.IP, localIp *net.IP) { if err != nil { log.WithError(err).Warn("Failed to poll WAN IPv4 from router") } else { + out <- &ipv4 if !lastV4.Equal(ipv4) { log.WithField("ipv4", ipv4).Info("New WAN IPv4 found") - out <- &ipv4 lastV4 = ipv4 } @@ -214,18 +214,18 @@ func startPollServer(out chan<- *net.IP, localIp *net.IP) { if err != nil { log.WithError(err).Warn("Failed to poll IPv6 Prefix from router") } else { - if !lastV6.Equal(prefix.IP) { + constructedIp := make(net.IP, net.IPv6len) + copy(constructedIp, prefix.IP) - constructedIp := make(net.IP, net.IPv6len) - copy(constructedIp, prefix.IP) + for i := 0; i < net.IPv6len; i++ { + constructedIp[i] = constructedIp[i] + (*localIp)[i] + } - for i := 0; i < net.IPv6len; i++ { - constructedIp[i] = constructedIp[i] + (*localIp)[i] - } + log.WithField("prefix", prefix).WithField("ipv6", constructedIp).Info("New IPv6 Prefix found") - log.WithField("prefix", prefix).WithField("ipv6", constructedIp).Info("New IPv6 Prefix found") + out <- &constructedIp - out <- &constructedIp + if !lastV6.Equal(prefix.IP) { lastV6 = prefix.IP } } diff --git a/pkg/cloudflare/updater.go b/pkg/cloudflare/updater.go index f9b5a9c..d9b673b 100644 --- a/pkg/cloudflare/updater.go +++ b/pkg/cloudflare/updater.go @@ -25,6 +25,9 @@ type Updater struct { api *cf.API In chan *net.IP + + lastIpv4 *net.IP + lastIpv6 *net.IP } func NewUpdater() *Updater { @@ -129,6 +132,15 @@ func (u *Updater) spawnWorker() { for { select { case ip := <-u.In: + if ip.To4() == nil { + if u.lastIpv6 != nil && u.lastIpv6.Equal(*ip) { + continue + } + } else { + if u.lastIpv4 != nil && u.lastIpv4.Equal(*ip) { + continue + } + } log.WithField("ip", ip).Info("Received update request") for _, action := range u.actions { @@ -192,7 +204,7 @@ func (u *Updater) spawnWorker() { // cloudflare-go might revert them to default values. err := u.api.UpdateDNSRecord(action.CfZoneId, record.ID, cf.DNSRecord{ Content: ip.String(), - TTL: record.TTL, + TTL: record.TTL, Proxied: record.Proxied, }) @@ -203,6 +215,11 @@ func (u *Updater) spawnWorker() { } } + if ip.To4() == nil { + u.lastIpv6 = ip + } else { + u.lastIpv4 = ip + } } } } From 0eaa74fb18e3beebaf42b77f0ebd50282a8c5b42 Mon Sep 17 00:00:00 2001 From: Cromefire_ Date: Sat, 20 Feb 2021 14:36:14 +0100 Subject: [PATCH 2/2] Skip redundant cloudflare updates --- pkg/cloudflare/updater.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/cloudflare/updater.go b/pkg/cloudflare/updater.go index d9b673b..e305f53 100644 --- a/pkg/cloudflare/updater.go +++ b/pkg/cloudflare/updater.go @@ -200,6 +200,10 @@ func (u *Updater) spawnWorker() { for _, record := range records { alog.WithField("record-id", record.ID).Info("Updating DNS record") + if record.Content == ip.String() { + continue + } + // Ensure we submit all required fields even if they did not change,otherwise // cloudflare-go might revert them to default values. err := u.api.UpdateDNSRecord(action.CfZoneId, record.ID, cf.DNSRecord{